diff --git a/src/components/ReportActionItem/TransactionPreview/index.tsx b/src/components/ReportActionItem/TransactionPreview/index.tsx index d1a9caa4c728..5974efdbd1dc 100644 --- a/src/components/ReportActionItem/TransactionPreview/index.tsx +++ b/src/components/ReportActionItem/TransactionPreview/index.tsx @@ -21,7 +21,12 @@ import TransactionPreviewContent from './TransactionPreviewContent'; import type {TransactionPreviewProps} from './types'; const getOriginalTransactionIfBillIsSplit = (transaction: OnyxEntry) => { - const {originalTransactionID, source} = transaction?.comment ?? {}; + const {originalTransactionID, source, splits} = transaction?.comment ?? {}; + + // If splits property is defined in the transaction, it is actually an original transaction + if (splits && splits.length > 0) { + return {isSplit: true, originalTransaction: transaction}; + } if (!originalTransactionID || source !== CONST.IOU.TYPE.SPLIT) { return {isSplit: false, originalTransaction: transaction}; @@ -40,7 +45,7 @@ function TransactionPreview(props: TransactionPreviewProps) { const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${route.params?.threadReportID}`, {canBeMissing: true}); const isMoneyRequestAction = isMoneyRequestActionReportActionsUtils(action); const transactionID = transactionIDFromProps ?? (isMoneyRequestAction ? getOriginalMessage(action)?.IOUTransactionID : null); - const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, {canBeMissing: true}); + const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, {canBeMissing: false}); const violations = useTransactionViolations(transaction?.transactionID); const [walletTerms] = useOnyx(ONYXKEYS.WALLET_TERMS, {canBeMissing: true}); const [session] = useOnyx(ONYXKEYS.SESSION, {canBeMissing: true}); diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index fc71c151475e..4be573ba5274 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -515,6 +515,11 @@ function getCombinedReportActions( return getSortedReportActions(filteredReportActions, true); } +const iouRequestTypes: Array> = [CONST.IOU.REPORT_ACTION_TYPE.CREATE, CONST.IOU.REPORT_ACTION_TYPE.SPLIT, CONST.IOU.REPORT_ACTION_TYPE.TRACK]; + +// Get all IOU report actions for the report. +const iouRequestTypesSet = new Set>([...iouRequestTypes, CONST.IOU.REPORT_ACTION_TYPE.PAY]); + /** * Finds most recent IOU request action ID. */ @@ -522,11 +527,6 @@ function getMostRecentIOURequestActionID(reportActions: ReportAction[] | null): if (!Array.isArray(reportActions)) { return null; } - const iouRequestTypes: Array> = [ - CONST.IOU.REPORT_ACTION_TYPE.CREATE, - CONST.IOU.REPORT_ACTION_TYPE.SPLIT, - CONST.IOU.REPORT_ACTION_TYPE.TRACK, - ]; const iouRequestActions = reportActions?.filter((action) => { if (!isActionOfType(action, CONST.REPORT.ACTIONS.TYPE.IOU)) { @@ -1160,6 +1160,11 @@ function isSplitBillAction(reportAction: OnyxInputOrEntry): report return isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.IOU) && getOriginalMessage(reportAction)?.type === CONST.IOU.REPORT_ACTION_TYPE.SPLIT; } +function isIOURequestReportAction(reportAction: OnyxInputOrEntry): boolean { + const type = isMoneyRequestAction(reportAction) && getOriginalMessage(reportAction)?.type; + return !!type && iouRequestTypes.includes(type); +} + function isTrackExpenseAction(reportAction: OnyxEntry): reportAction is ReportAction { return isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.IOU) && getOriginalMessage(reportAction)?.type === CONST.IOU.REPORT_ACTION_TYPE.TRACK; } @@ -1193,14 +1198,6 @@ function isTagModificationAction(actionName: string): boolean { ); } -// Get all IOU report actions for the report. -const iouRequestTypes = new Set>([ - CONST.IOU.REPORT_ACTION_TYPE.CREATE, - CONST.IOU.REPORT_ACTION_TYPE.SPLIT, - CONST.IOU.REPORT_ACTION_TYPE.PAY, - CONST.IOU.REPORT_ACTION_TYPE.TRACK, -]); - /** * Gets the reportID for the transaction thread associated with a report by iterating over the reportActions and identifying the IOU report actions. * Returns a reportID if there is exactly one transaction thread for the report, and null otherwise. @@ -1232,7 +1229,7 @@ function getOneTransactionThreadReportID( const actionType = originalMessage?.type; if ( actionType && - iouRequestTypes.has(actionType) && + iouRequestTypesSet.has(actionType) && action.childReportID && // Include deleted IOU reportActions if: // - they have an assocaited IOU transaction ID or @@ -2418,6 +2415,7 @@ export { isResolvedConciergeCategoryOptions, isAddCommentAction, isApprovedOrSubmittedReportAction, + isIOURequestReportAction, isChronosOOOListAction, isClosedAction, isConsecutiveActionMadeByPreviousActor, diff --git a/src/pages/home/report/PureReportActionItem.tsx b/src/pages/home/report/PureReportActionItem.tsx index 13f555a86761..098ce26cd019 100644 --- a/src/pages/home/report/PureReportActionItem.tsx +++ b/src/pages/home/report/PureReportActionItem.tsx @@ -95,6 +95,7 @@ import { isCreatedTaskReportAction, isDeletedAction, isDeletedParentAction as isDeletedParentActionUtils, + isIOURequestReportAction, isMessageDeleted, isMoneyRequestAction, isPendingRemove, @@ -111,6 +112,7 @@ import { isWhisperActionTargetedToOthers, useNewTableReportViewActionRenderConditionals, } from '@libs/ReportActionsUtils'; +import type {MissingPaymentMethod} from '@libs/ReportUtils'; import { canWriteInReport, chatIncludesConcierge, @@ -138,7 +140,6 @@ import { isTaskReport, shouldDisplayThreadReplies as shouldDisplayThreadRepliesUtils, } from '@libs/ReportUtils'; -import type {MissingPaymentMethod} from '@libs/ReportUtils'; import SelectionScraper from '@libs/SelectionScraper'; import shouldRenderAddPaymentCard from '@libs/shouldRenderAppPaymentCard'; import {ReactionListContext} from '@pages/home/ReportScreenContext'; @@ -150,8 +151,8 @@ import {addComment, expandURLPreview} from '@userActions/Report'; import type {IgnoreDirection} from '@userActions/ReportActions'; import {isAnonymousUser, signOutAndRedirectToSignIn} from '@userActions/Session'; import {isBlockedFromConcierge} from '@userActions/User'; -import CONST from '@src/CONST'; import type {IOUAction} from '@src/CONST'; +import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; import type * as OnyxTypes from '@src/types/onyx'; import type {Errors} from '@src/types/onyx/OnyxCommon'; @@ -771,22 +772,19 @@ function PureReportActionItem({ */ const renderItemContent = (hovered = false, isWhisper = false, hasErrors = false): React.JSX.Element => { let children; + const moneyRequestOriginalMessage = isMoneyRequestAction(action) ? getOriginalMessage(action) : undefined; + const moneyRequestActionType = moneyRequestOriginalMessage?.type; // Show the MoneyRequestPreview for when expense is present - if ( - isMoneyRequestAction(action) && - getOriginalMessage(action) && - // For the pay flow, we only want to show MoneyRequestAction when sending money. When paying, we display a regular system message - (getOriginalMessage(action)?.type === CONST.IOU.REPORT_ACTION_TYPE.CREATE || - getOriginalMessage(action)?.type === CONST.IOU.REPORT_ACTION_TYPE.SPLIT || - getOriginalMessage(action)?.type === CONST.IOU.REPORT_ACTION_TYPE.TRACK) - ) { + if (isIOURequestReportAction(action)) { + const isSplitInGroupChat = moneyRequestActionType === CONST.IOU.REPORT_ACTION_TYPE.SPLIT && report?.chatType === CONST.REPORT.CHAT_TYPE.GROUP; + const chatReportID = moneyRequestOriginalMessage?.IOUReportID ? report?.chatReportID : reportID; // There is no single iouReport for bill splits, so only 1:1 requests require an iouReportID - const iouReportID = getOriginalMessage(action)?.IOUReportID?.toString(); + const iouReportID = moneyRequestOriginalMessage?.IOUReportID?.toString(); children = ( {}} + onPreviewPressed={() => { + if (isSplitInGroupChat) { + Navigation.navigate(ROUTES.SPLIT_BILL_DETAILS.getRoute(chatReportID, action.reportActionID, Navigation.getReportRHPActiveRoute())); + return; + } + + if (!action.childReportID) { + return; + } + + Navigation.navigate(ROUTES.REPORT_WITH_ID.getRoute(action.childReportID)); + }} isTrackExpense={isTrackExpenseActionReportActionsUtils(action)} />