From bd1c53d6e22abc4938c80143e97006720a6fc515 Mon Sep 17 00:00:00 2001 From: Jaime Liz Date: Wed, 3 Apr 2024 19:00:57 -0500 Subject: [PATCH 1/2] test: add a failing test --- tests/actions/IOUTest.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tests/actions/IOUTest.ts b/tests/actions/IOUTest.ts index 2ce72a58aead..51c09966810c 100644 --- a/tests/actions/IOUTest.ts +++ b/tests/actions/IOUTest.ts @@ -246,6 +246,7 @@ describe('actions/IOU', () => { it('updates existing chat report if there is one', () => { const amount = 10000; const comment = 'Giv money plz'; + const created = DateUtils.getDBTime(); let chatReport: OnyxTypes.Report = { reportID: '1234', type: CONST.REPORT.TYPE.CHAT, @@ -254,7 +255,7 @@ describe('actions/IOU', () => { const createdAction: OnyxTypes.ReportAction = { reportActionID: NumberUtils.rand64(), actionName: CONST.REPORT.ACTIONS.TYPE.CREATED, - created: DateUtils.getDBTime(), + created, }; let iouReportID: string | undefined; let iouAction: OnyxEntry; @@ -270,7 +271,7 @@ describe('actions/IOU', () => { }), ) .then(() => { - IOU.requestMoney(chatReport, amount, CONST.CURRENCY.USD, '', '', RORY_EMAIL, RORY_ACCOUNT_ID, {login: CARLOS_EMAIL, accountID: CARLOS_ACCOUNT_ID}, comment, {}); + IOU.requestMoney(chatReport, amount, CONST.CURRENCY.USD, created, '', RORY_EMAIL, RORY_ACCOUNT_ID, {login: CARLOS_EMAIL, accountID: CARLOS_ACCOUNT_ID}, comment, {}); return waitForBatchedUpdates(); }) .then( @@ -318,6 +319,10 @@ describe('actions/IOU', () => { // The CREATED action should not be created after the IOU action expect(Date.parse(iouCreatedAction?.created ?? '')).toBeLessThan(Date.parse(iouAction?.created ?? '')); + // The iouAction created time should be same as lastVisibleActionCreated + // To prevent the "New message" from showing up in the report list + expect(iouAction?.created).toBe(chatReport.lastVisibleActionCreated); + // The IOUReportID should be correct expect(iouAction?.originalMessage?.IOUReportID).toBe(iouReportID); From 3dc5330f3a5e624c8810a4d4d0b3da48d18f67e4 Mon Sep 17 00:00:00 2001 From: Jaime Liz Date: Wed, 3 Apr 2024 19:14:27 -0500 Subject: [PATCH 2/2] refactor: use original time in optimistic iou report creation --- src/libs/ReportUtils.ts | 19 ++++++++++++++----- src/libs/actions/IOU.ts | 1 + 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 98577e73766a..e7df21a82355 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -3193,9 +3193,18 @@ function buildOptimisticTaskCommentReportAction(taskReportID: string, taskTitle: * @param chatReportID - Report ID of the chat where the IOU is. * @param currency - IOU currency. * @param isSendingMoney - If we send money the IOU should be created as settled + * @param created - The creation time for IOU action */ -function buildOptimisticIOUReport(payeeAccountID: number, payerAccountID: number, total: number, chatReportID: string, currency: string, isSendingMoney = false): OptimisticIOUReport { +function buildOptimisticIOUReport( + payeeAccountID: number, + payerAccountID: number, + total: number, + chatReportID: string, + currency: string, + isSendingMoney = false, + created: string = DateUtils.getDBTime(), +): OptimisticIOUReport { const formattedTotal = CurrencyUtils.convertToDisplayString(total, currency); const personalDetails = getPersonalDetailsForAccountID(payerAccountID); const payerEmail = 'login' in personalDetails ? personalDetails.login : ''; @@ -3221,7 +3230,7 @@ function buildOptimisticIOUReport(payeeAccountID: number, payerAccountID: number reportName: `${payerEmail} owes ${formattedTotal}`, notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.HIDDEN, parentReportID: chatReportID, - lastVisibleActionCreated: DateUtils.getDBTime(), + lastVisibleActionCreated: created, }; } @@ -3586,7 +3595,7 @@ function buildOptimisticReportPreview(chatReport: OnyxEntry, iouReport: const hasReceipt = TransactionUtils.hasReceipt(transaction); const isReceiptBeingScanned = hasReceipt && TransactionUtils.isReceiptBeingScanned(transaction); const message = getReportPreviewMessage(iouReport); - const created = DateUtils.getDBTime(); + const created = iouReport.lastVisibleActionCreated ?? DateUtils.getDBTime(); return { reportActionID: NumberUtils.rand64(), reportID: chatReport?.reportID, @@ -4234,10 +4243,10 @@ function buildOptimisticMoneyRequestEntities( receipt: Receipt = {}, isOwnPolicyExpenseChat = false, ): [OptimisticCreatedReportAction, OptimisticCreatedReportAction, OptimisticIOUReportAction, OptimisticChatReport, OptimisticCreatedReportAction] { - const createdActionForChat = buildOptimisticCreatedReportAction(payeeEmail); + const createdActionForChat = buildOptimisticCreatedReportAction(payeeEmail, iouReport.lastVisibleActionCreated); // 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 iouActionCreationTime = iouReport.lastVisibleActionCreated ?? DateUtils.getDBTime(); const createdActionForIOUReport = buildOptimisticCreatedReportAction(payeeEmail, DateUtils.subtractMillisecondsFromDateTime(iouActionCreationTime, 1)); const iouAction = buildOptimisticIOUReportAction( type, diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 5c92cd87a2bc..eabcfbb64520 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -523,6 +523,7 @@ function buildOnyxDataForMoneyRequest( key: `${ONYXKEYS.COLLECTION.REPORT}${chatReport.reportID}`, value: { ...chatReport, + lastVisibleActionCreated: iouReport.lastVisibleActionCreated, lastReadTime: DateUtils.getDBTime(), lastMessageTranslationKey: '', iouReportID: iouReport.reportID,