diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index a6c1449c6b73..f3edd2381a64 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -686,6 +686,7 @@ type BaseOptimisticMoneyRequestEntities = { existingTransactionThreadReportID?: string; linkedTrackedExpenseReportAction?: ReportAction; optimisticCreatedReportActionID?: string; + optimisticIOUCreatedReportActionID?: string; reportActionID?: string; }; @@ -8392,6 +8393,7 @@ function buildOptimisticMoneyRequestEntities({ existingTransactionThreadReportID, linkedTrackedExpenseReportAction, optimisticCreatedReportActionID, + optimisticIOUCreatedReportActionID, shouldGenerateTransactionThreadReport = true, reportActionID, }: OptimisticMoneyRequestEntities): [ @@ -8405,7 +8407,11 @@ function buildOptimisticMoneyRequestEntities({ // The `CREATED` action must be optimistically generated before the IOU action so that it won't appear after the IOU action in the chat. const iouActionCreationTime = DateUtils.getDBTime(); - const createdActionForIOUReport = buildOptimisticCreatedReportAction(payeeEmail, DateUtils.subtractMillisecondsFromDateTime(iouActionCreationTime, 1)); + const createdActionForIOUReport = buildOptimisticCreatedReportAction( + payeeEmail, + DateUtils.subtractMillisecondsFromDateTime(iouActionCreationTime, 1), + optimisticIOUCreatedReportActionID, + ); const iouAction = buildOptimisticIOUReportAction({ type, diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 6aa23f334884..253e213e4934 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -493,6 +493,7 @@ type RequestMoneyInformation = { optimisticChatReportID?: string; optimisticCreatedReportActionID?: string; optimisticIOUReportID?: string; + optimisticIOUCreatedReportActionID?: string; optimisticReportPreviewActionID?: string; shouldGenerateTransactionThreadReport: boolean; }; @@ -511,6 +512,7 @@ type MoneyRequestInformationParams = { optimisticChatReportID?: string; optimisticCreatedReportActionID?: string; optimisticIOUReportID?: string; + optimisticIOUCreatedReportActionID?: string; optimisticReportPreviewActionID?: string; shouldGenerateTransactionThreadReport?: boolean; isSplitExpense?: boolean; @@ -3405,6 +3407,7 @@ function getMoneyRequestInformation(moneyRequestInformation: MoneyRequestInforma optimisticChatReportID, optimisticCreatedReportActionID, optimisticIOUReportID, + optimisticIOUCreatedReportActionID, optimisticReportPreviewActionID, shouldGenerateTransactionThreadReport = true, isSplitExpense, @@ -3582,6 +3585,7 @@ function getMoneyRequestInformation(moneyRequestInformation: MoneyRequestInforma transactionID: optimisticTransaction.transactionID, paymentType: isSelectedManagerMcTest(participant.login) || transactionParams.receipt?.isTestDriveReceipt ? CONST.IOU.PAYMENT_TYPE.ELSEWHERE : undefined, existingTransactionThreadReportID: linkedTrackedExpenseReportAction?.childReportID, + optimisticIOUCreatedReportActionID, optimisticCreatedReportActionID, linkedTrackedExpenseReportAction, shouldGenerateTransactionThreadReport, @@ -5871,6 +5875,7 @@ function requestMoney(requestMoneyInformation: RequestMoneyInformation) { optimisticChatReportID, optimisticCreatedReportActionID, optimisticIOUReportID, + optimisticIOUCreatedReportActionID, optimisticReportPreviewActionID, shouldGenerateTransactionThreadReport, } = requestMoneyInformation; @@ -5956,6 +5961,7 @@ function requestMoney(requestMoneyInformation: RequestMoneyInformation) { optimisticChatReportID, optimisticCreatedReportActionID, optimisticIOUReportID, + optimisticIOUCreatedReportActionID, optimisticReportPreviewActionID, shouldGenerateTransactionThreadReport, action, diff --git a/src/pages/iou/request/step/IOURequestStepConfirmation.tsx b/src/pages/iou/request/step/IOURequestStepConfirmation.tsx index 52d42dc92911..182821cb8f43 100644 --- a/src/pages/iou/request/step/IOURequestStepConfirmation.tsx +++ b/src/pages/iou/request/step/IOURequestStepConfirmation.tsx @@ -486,6 +486,7 @@ function IOURequestStepConfirmation({ const optimisticChatReportID = generateReportID(); const optimisticCreatedReportActionID = rand64(); const optimisticIOUReportID = generateReportID(); + const optimisticIOUCreatedReportActionID = rand64(); const optimisticReportPreviewActionID = rand64(); transactions.forEach((item, index) => { @@ -504,6 +505,7 @@ function IOURequestStepConfirmation({ optimisticChatReportID, optimisticCreatedReportActionID, optimisticIOUReportID, + optimisticIOUCreatedReportActionID, optimisticReportPreviewActionID, participantParams: { payeeEmail: currentUserPersonalDetails.login, diff --git a/tests/actions/IOUTest.ts b/tests/actions/IOUTest.ts index 43d6f82ed3a8..88f25721e8f3 100644 --- a/tests/actions/IOUTest.ts +++ b/tests/actions/IOUTest.ts @@ -71,6 +71,7 @@ import { getSortedReportActions, isActionableTrackExpense, isActionOfType, + isCreatedAction, isMoneyRequestAction, } from '@libs/ReportActionsUtils'; import type {OptimisticChatReport} from '@libs/ReportUtils'; @@ -2062,6 +2063,64 @@ describe('actions/IOU', () => { expect(newNonReimbursableTotal).toBe(-100); }); + + it('should create CREATED action with the passed optimistic ID', async () => { + const optimisticIOUCreatedReportActionID = rand64(); + const optimisticIOUReportID = rand64(); + const chatReportID = '123'; + requestMoney({ + report: {reportID: chatReportID}, + participantParams: { + payeeEmail: RORY_EMAIL, + payeeAccountID: RORY_ACCOUNT_ID, + participant: {login: CARLOS_EMAIL, accountID: CARLOS_ACCOUNT_ID}, + }, + transactionParams: { + amount: 1, + attendees: [], + currency: CONST.CURRENCY.USD, + created: '', + merchant: '', + }, + shouldGenerateTransactionThreadReport: true, + optimisticIOUCreatedReportActionID, + optimisticIOUReportID, + }); + requestMoney({ + report: {reportID: chatReportID}, + participantParams: { + payeeEmail: RORY_EMAIL, + payeeAccountID: RORY_ACCOUNT_ID, + participant: {login: CARLOS_EMAIL, accountID: CARLOS_ACCOUNT_ID}, + }, + transactionParams: { + amount: 1, + attendees: [], + currency: CONST.CURRENCY.USD, + created: '', + merchant: '', + }, + shouldGenerateTransactionThreadReport: true, + optimisticIOUCreatedReportActionID, + optimisticIOUReportID, + }); + + await waitForBatchedUpdates(); + + const iouReportActions = await new Promise>((resolve) => { + const connection = Onyx.connectWithoutView({ + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${optimisticIOUReportID}`, + callback: (reportActions) => { + resolve(reportActions); + Onyx.disconnect(connection); + }, + }); + }); + const createdActions = Object.values(iouReportActions ?? {}).find( + (reportAction) => isCreatedAction(reportAction) && reportAction.reportActionID === optimisticIOUCreatedReportActionID, + ); + expect(createdActions).not.toBeUndefined(); + }); }); describe('createDistanceRequest', () => {