diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index cca39fb9ec4a..fc4c70ac538a 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -552,6 +552,24 @@ type OptimisticModifiedExpenseReportAction = Pick< | 'delegateAccountID' > & {reportID?: string}; +type OptimisticMoneyRequestEntities = { + iouReport: Report; + type: ValueOf; + amount: number; + currency: string; + comment: string; + payeeEmail: string; + participants: Participant[]; + transactionID: string; + paymentType?: PaymentMethodType; + isSettlingUp?: boolean; + isSendMoneyFlow?: boolean; + isOwnPolicyExpenseChat?: boolean; + isPersonalTrackingExpense?: boolean; + existingTransactionThreadReportID?: string; + linkedTrackedExpenseReportAction?: ReportAction; +}; + type OptimisticTaskReport = SetRequired< Pick< Report, @@ -6944,23 +6962,23 @@ function buildTransactionThread( * 4. Transaction Thread linked to the IOU action via `parentReportActionID` * 5. CREATED action for the Transaction Thread */ -function buildOptimisticMoneyRequestEntities( - iouReport: Report, - type: ValueOf, - amount: number, - currency: string, - comment: string, - payeeEmail: string, - participants: Participant[], - transactionID: string, - paymentType?: PaymentMethodType, +function buildOptimisticMoneyRequestEntities({ + iouReport, + type, + amount, + currency, + comment, + payeeEmail, + participants, + transactionID, + paymentType, isSettlingUp = false, isSendMoneyFlow = false, isOwnPolicyExpenseChat = false, - isPersonalTrackingExpense?: boolean, - existingTransactionThreadReportID?: string, - linkedTrackedExpenseReportAction?: ReportAction, -): [OptimisticCreatedReportAction, OptimisticCreatedReportAction, OptimisticIOUReportAction, OptimisticChatReport, OptimisticCreatedReportAction | null] { + isPersonalTrackingExpense, + existingTransactionThreadReportID, + linkedTrackedExpenseReportAction, +}: OptimisticMoneyRequestEntities): [OptimisticCreatedReportAction, OptimisticCreatedReportAction, OptimisticIOUReportAction, OptimisticChatReport, OptimisticCreatedReportAction | null] { const createdActionForChat = buildOptimisticCreatedReportAction(payeeEmail); // The `CREATED` action must be optimistically generated before the IOU action so that it won't appear after the IOU action in the chat. diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 29af8d20a820..343e25e27ba0 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -2693,20 +2693,16 @@ function getSendInvoiceInformation( optimisticInvoiceReport.parentReportActionID = reportPreviewAction.reportActionID; chatReport.lastVisibleActionCreated = reportPreviewAction.created; const [optimisticCreatedActionForChat, optimisticCreatedActionForIOUReport, iouAction, optimisticTransactionThread, optimisticCreatedActionForTransactionThread] = - buildOptimisticMoneyRequestEntities( - optimisticInvoiceReport, - CONST.IOU.REPORT_ACTION_TYPE.CREATE, + buildOptimisticMoneyRequestEntities({ + iouReport: optimisticInvoiceReport, + type: CONST.IOU.REPORT_ACTION_TYPE.CREATE, amount, currency, - trimmedComment, - receiver.login ?? '', - [receiver], - optimisticTransaction.transactionID, - undefined, - false, - false, - false, - ); + comment: trimmedComment, + payeeEmail: receiver.login ?? '', + participants: [receiver], + transactionID: optimisticTransaction.transactionID, + }); // STEP 6: Build Onyx Data const [optimisticData, successData, failureData] = buildOnyxDataForInvoice({ @@ -2860,23 +2856,20 @@ function getMoneyRequestInformation(moneyRequestInformation: MoneyRequestInforma // 5. REPORT_PREVIEW action for the chatReport // Note: The CREATED action for the IOU report must be optimistically generated before the IOU action so there's no chance that it appears after the IOU action in the chat const [optimisticCreatedActionForChat, optimisticCreatedActionForIOUReport, iouAction, optimisticTransactionThread, optimisticCreatedActionForTransactionThread] = - buildOptimisticMoneyRequestEntities( + buildOptimisticMoneyRequestEntities({ iouReport, - CONST.IOU.REPORT_ACTION_TYPE.CREATE, + type: CONST.IOU.REPORT_ACTION_TYPE.CREATE, amount, currency, comment, payeeEmail, - [participant], - optimisticTransaction.transactionID, - isSelectedManagerMcTest(participant.login) ? CONST.IOU.PAYMENT_TYPE.ELSEWHERE : undefined, - false, - false, - false, - undefined, - linkedTrackedExpenseReportAction?.childReportID, + participants: [participant], + transactionID: optimisticTransaction.transactionID, + paymentType: isSelectedManagerMcTest(participant.login) ? CONST.IOU.PAYMENT_TYPE.ELSEWHERE : undefined, + + existingTransactionThreadReportID: linkedTrackedExpenseReportAction?.childReportID, linkedTrackedExpenseReportAction, - ); + }); let reportPreviewAction = shouldCreateNewMoneyRequestReport ? null : getReportPreviewAction(chatReport.reportID, iouReport.reportID); @@ -3102,20 +3095,16 @@ function getPerDiemExpenseInformation(perDiemExpenseInformation: PerDiemExpenseI // 5. REPORT_PREVIEW action for the chatReport // Note: The CREATED action for the IOU report must be optimistically generated before the IOU action so there's no chance that it appears after the IOU action in the chat const [optimisticCreatedActionForChat, optimisticCreatedActionForIOUReport, iouAction, optimisticTransactionThread, optimisticCreatedActionForTransactionThread] = - buildOptimisticMoneyRequestEntities( + buildOptimisticMoneyRequestEntities({ iouReport, - CONST.IOU.REPORT_ACTION_TYPE.CREATE, + type: CONST.IOU.REPORT_ACTION_TYPE.CREATE, amount, currency, comment, payeeEmail, - [participant], - optimisticTransaction.transactionID, - undefined, - false, - false, - false, - ); + participants: [participant], + transactionID: optimisticTransaction.transactionID, + }); let reportPreviewAction = shouldCreateNewMoneyRequestReport ? null : getReportPreviewAction(chatReport.reportID, iouReport.reportID); @@ -3334,23 +3323,19 @@ function getTrackExpenseInformation(params: GetTrackExpenseInformationParams): T // 2. IOU action for the iouReport (if tracking in the Expense chat), otherwise – for chatReport // 3. The transaction thread, which requires the iouAction, and CREATED action for the transaction thread // 4. REPORT_PREVIEW action for the chatReport (if tracking in the Expense chat) - const [, optimisticCreatedActionForIOUReport, iouAction, optimisticTransactionThread, optimisticCreatedActionForTransactionThread] = buildOptimisticMoneyRequestEntities( - shouldUseMoneyReport && iouReport ? iouReport : chatReport, - CONST.IOU.REPORT_ACTION_TYPE.TRACK, + const [, optimisticCreatedActionForIOUReport, iouAction, optimisticTransactionThread, optimisticCreatedActionForTransactionThread] = buildOptimisticMoneyRequestEntities({ + iouReport: shouldUseMoneyReport && iouReport ? iouReport : chatReport, + type: CONST.IOU.REPORT_ACTION_TYPE.TRACK, amount, currency, comment, payeeEmail, - [participant], - optimisticTransaction.transactionID, - undefined, - false, - false, - false, - !shouldUseMoneyReport, - linkedTrackedExpenseReportAction?.childReportID, + participants: [participant], + transactionID: optimisticTransaction.transactionID, + isPersonalTrackingExpense: !shouldUseMoneyReport, + existingTransactionThreadReportID: linkedTrackedExpenseReportAction?.childReportID, linkedTrackedExpenseReportAction, - ); + }); let reportPreviewAction: OnyxInputValue> = null; if (shouldUseMoneyReport && iouReport) { @@ -5511,16 +5496,16 @@ function createSplitsAndOnyxData({ // 4. Transaction Thread and the CREATED action for it // 5. REPORT_PREVIEW action for the chatReport const [oneOnOneCreatedActionForChat, oneOnOneCreatedActionForIOU, oneOnOneIOUAction, optimisticTransactionThread, optimisticCreatedActionForTransactionThread] = - buildOptimisticMoneyRequestEntities( - oneOnOneIOUReport, - CONST.IOU.REPORT_ACTION_TYPE.CREATE, - splitAmount, + buildOptimisticMoneyRequestEntities({ + iouReport: oneOnOneIOUReport, + type: CONST.IOU.REPORT_ACTION_TYPE.CREATE, + amount: splitAmount, currency, comment, - currentUserEmailForIOUSplit, - [participant], - oneOnOneTransaction.transactionID, - ); + payeeEmail: currentUserEmailForIOUSplit, + participants: [participant], + transactionID: oneOnOneTransaction.transactionID, + }); // Add optimistic personal details for new participants const oneOnOnePersonalDetailListAction: OnyxTypes.PersonalDetailsList = shouldCreateOptimisticPersonalDetails @@ -6289,17 +6274,16 @@ function completeSplitBill( }); const [oneOnOneCreatedActionForChat, oneOnOneCreatedActionForIOU, oneOnOneIOUAction, optimisticTransactionThread, optimisticCreatedActionForTransactionThread] = - buildOptimisticMoneyRequestEntities( - oneOnOneIOUReport, - CONST.IOU.REPORT_ACTION_TYPE.CREATE, - splitAmount, - currency ?? '', - parsedComment, - currentUserEmailForIOUSplit, - [participant], - oneOnOneTransaction.transactionID, - undefined, - ); + buildOptimisticMoneyRequestEntities({ + iouReport: oneOnOneIOUReport, + type: CONST.IOU.REPORT_ACTION_TYPE.CREATE, + amount: splitAmount, + currency: currency ?? '', + comment: parsedComment, + payeeEmail: currentUserEmailForIOUSplit, + participants: [participant], + transactionID: oneOnOneTransaction.transactionID, + }); let oneOnOneReportPreviewAction = getReportPreviewAction(oneOnOneChatReport?.reportID, oneOnOneIOUReport?.reportID); if (oneOnOneReportPreviewAction) { @@ -7384,19 +7368,18 @@ function getSendMoneyParams( }; const [optimisticCreatedActionForChat, optimisticCreatedActionForIOUReport, optimisticIOUReportAction, optimisticTransactionThread, optimisticCreatedActionForTransactionThread] = - buildOptimisticMoneyRequestEntities( - optimisticIOUReport, - CONST.IOU.REPORT_ACTION_TYPE.PAY, + buildOptimisticMoneyRequestEntities({ + iouReport: optimisticIOUReport, + type: CONST.IOU.REPORT_ACTION_TYPE.PAY, amount, currency, comment, - recipientEmail, - [recipient], - optimisticTransaction.transactionID, - paymentMethodType, - false, - true, - ); + payeeEmail: recipientEmail, + participants: [recipient], + transactionID: optimisticTransaction.transactionID, + paymentType: paymentMethodType, + isSendMoneyFlow: true, + }); const reportPreviewAction = buildOptimisticReportPreview(chatReport, optimisticIOUReport);