From ab45b6ad095d96ae2e1a925a25bba5a2a79dc1be Mon Sep 17 00:00:00 2001 From: GCyganek Date: Thu, 15 Jan 2026 12:15:15 +0100 Subject: [PATCH 1/6] Clear data upon expense submission - GPS --- src/libs/TransactionUtils/index.ts | 11 ++++++++ src/libs/actions/IOU/index.ts | 44 +++++++++++++++++++++++++++--- 2 files changed, 51 insertions(+), 4 deletions(-) diff --git a/src/libs/TransactionUtils/index.ts b/src/libs/TransactionUtils/index.ts index d7a040d75ac42..1799b06b35bca 100644 --- a/src/libs/TransactionUtils/index.ts +++ b/src/libs/TransactionUtils/index.ts @@ -182,6 +182,16 @@ function isMapDistanceRequest(transaction: OnyxEntry): boolean { return hasDistanceCustomUnit(transaction); } +function isGPSDistanceRequest(transaction: OnyxEntry): boolean { + // This is used during the expense creation flow before the transaction has been saved to the server + if (lodashHas(transaction, 'iouRequestType')) { + return transaction?.iouRequestType === CONST.IOU.REQUEST_TYPE.DISTANCE_GPS; + } + + // This is the case for transaction objects once they have been saved to the server + return hasDistanceCustomUnit(transaction); +} + function isManualDistanceRequest(transaction: OnyxEntry, isUpdatedMergeTransaction = false): boolean { // This is used during the expense creation flow before the transaction has been saved to the server if (lodashHas(transaction, 'iouRequestType') && !isUpdatedMergeTransaction) { @@ -2576,6 +2586,7 @@ export { getValidDuplicateTransactionIDs, isDistanceRequest, isMapDistanceRequest, + isGPSDistanceRequest, isManualDistanceRequest, isOdometerDistanceRequest, isFetchingWaypointsFromServer, diff --git a/src/libs/actions/IOU/index.ts b/src/libs/actions/IOU/index.ts index f9b6227fb453e..399653291ce29 100644 --- a/src/libs/actions/IOU/index.ts +++ b/src/libs/actions/IOU/index.ts @@ -11,6 +11,7 @@ import type {SetRequired, ValueOf} from 'type-fest'; import ReceiptGeneric from '@assets/images/receipt-generic.png'; import type {PaymentMethod} from '@components/KYCWall/types'; import type {SearchContextProps, SearchQueryJSON} from '@components/Search/types'; +import {resetGPSDraftDetails} from '@libs/actions/GPSDraftDetails'; import * as API from '@libs/API'; import type { AddReportApproverParams, @@ -219,6 +220,7 @@ import { isDistanceRequest as isDistanceRequestTransactionUtils, isDuplicate, isFetchingWaypointsFromServer, + isGPSDistanceRequest as isGPSDistanceRequestTransactionUtils, isManualDistanceRequest as isManualDistanceRequestTransactionUtils, isMapDistanceRequest, isOdometerDistanceRequest as isOdometerDistanceRequestTransactionUtils, @@ -954,6 +956,12 @@ Onyx.connect({ callback: (val) => (recentWaypoints = val ?? []), }); +let firstCreatedGpsExpenseDateNewDot: OnyxEntry; +Onyx.connect({ + key: ONYXKEYS.NVP_FIRST_CREATED_GPS_EXPENSE_DATE_NEW_DOT, + callback: (val) => (firstCreatedGpsExpenseDateNewDot = val), +}); + function getAllPersonalDetails(): OnyxTypes.PersonalDetailsList { return allPersonalDetails; } @@ -6471,7 +6479,9 @@ function trackExpense(params: CreateTrackExpenseParams) { value: recentServerValidatedWaypoints, }); - if (isMapDistanceRequest(transaction) || isManualDistanceRequestTransactionUtils(transaction) || isOdometerDistanceRequestTransactionUtils(transaction)) { + const isGPSDistanceRequest = isGPSDistanceRequestTransactionUtils(transaction); + + if (isMapDistanceRequest(transaction) || isManualDistanceRequestTransactionUtils(transaction) || isOdometerDistanceRequestTransactionUtils(transaction) || isGPSDistanceRequest) { // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830 onyxData?.optimisticData?.push({ onyxMethod: Onyx.METHOD.SET, @@ -6480,6 +6490,14 @@ function trackExpense(params: CreateTrackExpenseParams) { }); } + if (isGPSDistanceRequest && !firstCreatedGpsExpenseDateNewDot) { + onyxData?.optimisticData?.push({ + onyxMethod: Onyx.METHOD.SET, + key: ONYXKEYS.NVP_FIRST_CREATED_GPS_EXPENSE_DATE_NEW_DOT, + value: DateUtils.getDBTime(), + }); + } + const mileageRate = isCustomUnitRateIDForP2P(transaction) ? undefined : customUnitRateID; if (shouldPlaySound) { playSound(SOUNDS.DONE); @@ -6631,7 +6649,12 @@ function trackExpense(params: CreateTrackExpenseParams) { if (shouldHandleNavigation) { // eslint-disable-next-line @typescript-eslint/no-deprecated - InteractionManager.runAfterInteractions(() => removeDraftTransactions()); + InteractionManager.runAfterInteractions(() => { + removeDraftTransactions(); + if (isGPSDistanceRequest) { + resetGPSDraftDetails(); + } + }); if (!params.isRetry) { dismissModalAndOpenReportInInboxTab(activeReportID); @@ -8278,7 +8301,14 @@ function createDistanceRequest(distanceRequestInformation: CreateDistanceRequest onyxData = moneyRequestOnyxData; - if (transaction.iouRequestType === CONST.IOU.REQUEST_TYPE.DISTANCE_MAP || isManualDistanceRequest || transaction.iouRequestType === CONST.IOU.REQUEST_TYPE.DISTANCE_ODOMETER) { + const isGPSDistanceRequest = isGPSDistanceRequestTransactionUtils(transaction); + + if ( + transaction.iouRequestType === CONST.IOU.REQUEST_TYPE.DISTANCE_MAP || + isGPSDistanceRequest || + isManualDistanceRequest || + transaction.iouRequestType === CONST.IOU.REQUEST_TYPE.DISTANCE_ODOMETER + ) { // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830 onyxData?.optimisticData?.push({ onyxMethod: Onyx.METHOD.SET, @@ -8328,7 +8358,13 @@ function createDistanceRequest(distanceRequestInformation: CreateDistanceRequest API.write(WRITE_COMMANDS.CREATE_DISTANCE_REQUEST, parameters, onyxData); // eslint-disable-next-line @typescript-eslint/no-deprecated - InteractionManager.runAfterInteractions(() => removeDraftTransaction(CONST.IOU.OPTIMISTIC_TRANSACTION_ID)); + InteractionManager.runAfterInteractions(() => { + removeDraftTransaction(CONST.IOU.OPTIMISTIC_TRANSACTION_ID); + if (isGPSDistanceRequest) { + resetGPSDraftDetails(); + } + }); + const activeReportID = isMoneyRequestReport && report?.reportID ? report.reportID : parameters.chatReportID; dismissModalAndOpenReportInInboxTab(backToReport ?? activeReportID); From 9074f414a09025eff817ff8df121941407556b84 Mon Sep 17 00:00:00 2001 From: GCyganek Date: Thu, 15 Jan 2026 12:23:27 +0100 Subject: [PATCH 2/6] Move isGPSDistanceRequest const higher --- src/libs/actions/IOU/index.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/libs/actions/IOU/index.ts b/src/libs/actions/IOU/index.ts index 399653291ce29..576beb8e14879 100644 --- a/src/libs/actions/IOU/index.ts +++ b/src/libs/actions/IOU/index.ts @@ -8173,6 +8173,7 @@ function createDistanceRequest(distanceRequestInformation: CreateDistanceRequest // If the report is an iou or expense report, we should get the linked chat report to be passed to the getMoneyRequestInformation function const isMoneyRequestReport = isMoneyRequestReportReportUtils(report); + const isGPSDistanceRequest = isGPSDistanceRequestTransactionUtils(transaction); const currentChatReport = isMoneyRequestReport ? getReportOrDraftReport(report?.chatReportID) : report; const moneyRequestReportID = isMoneyRequestReport ? report?.reportID : ''; const isManualDistanceRequest = isEmptyObject(validWaypoints); @@ -8301,8 +8302,6 @@ function createDistanceRequest(distanceRequestInformation: CreateDistanceRequest onyxData = moneyRequestOnyxData; - const isGPSDistanceRequest = isGPSDistanceRequestTransactionUtils(transaction); - if ( transaction.iouRequestType === CONST.IOU.REQUEST_TYPE.DISTANCE_MAP || isGPSDistanceRequest || From 8ce29098d74c6e2c45ee43fb55ae51a138dcc95e Mon Sep 17 00:00:00 2001 From: GCyganek Date: Mon, 26 Jan 2026 15:47:01 +0100 Subject: [PATCH 3/6] Erase gpsDraftDetails via optimisticData --- src/libs/TransactionUtils/index.ts | 10 -------- src/libs/actions/IOU/index.ts | 40 +++++++++++++++++++----------- 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/src/libs/TransactionUtils/index.ts b/src/libs/TransactionUtils/index.ts index 4371b4d105417..3c447b0145364 100644 --- a/src/libs/TransactionUtils/index.ts +++ b/src/libs/TransactionUtils/index.ts @@ -209,16 +209,6 @@ function isGPSDistanceRequest(transaction: OnyxEntry): boolean { return hasGPSWaypoints(transaction); } -function isGPSDistanceRequest(transaction: OnyxEntry): boolean { - // This is used during the expense creation flow before the transaction has been saved to the server - if (lodashHas(transaction, 'iouRequestType')) { - return transaction?.iouRequestType === CONST.IOU.REQUEST_TYPE.DISTANCE_GPS; - } - - // This is the case for transaction objects once they have been saved to the server - return hasDistanceCustomUnit(transaction); -} - function isManualDistanceRequest(transaction: OnyxEntry, isUpdatedMergeTransaction = false): boolean { // This is used during the expense creation flow before the transaction has been saved to the server if (lodashHas(transaction, 'iouRequestType') && !isUpdatedMergeTransaction) { diff --git a/src/libs/actions/IOU/index.ts b/src/libs/actions/IOU/index.ts index 4e8ed5188d051..709868e53d272 100644 --- a/src/libs/actions/IOU/index.ts +++ b/src/libs/actions/IOU/index.ts @@ -942,12 +942,6 @@ Onyx.connect({ callback: (val) => (recentWaypoints = val ?? []), }); -let firstCreatedGpsExpenseDateNewDot: OnyxEntry; -Onyx.connect({ - key: ONYXKEYS.NVP_FIRST_CREATED_GPS_EXPENSE_DATE_NEW_DOT, - callback: (val) => (firstCreatedGpsExpenseDateNewDot = val), -}); - function getAllPersonalDetails(): OnyxTypes.PersonalDetailsList { return allPersonalDetails; } @@ -6359,7 +6353,9 @@ function requestMoney(requestMoneyInformation: RequestMoneyInformation): {iouRep if (shouldHandleNavigation) { // eslint-disable-next-line @typescript-eslint/no-deprecated - InteractionManager.runAfterInteractions(() => removeDraftTransactions()); + InteractionManager.runAfterInteractions(() => { + removeDraftTransactions(); + }); if (!requestMoneyInformation.isRetry) { dismissModalAndOpenReportInInboxTab(backToReport ?? activeReportID); } @@ -6669,6 +6665,15 @@ function trackExpense(params: CreateTrackExpenseParams) { }); } + if (isGPSDistanceRequest) { + // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830 + onyxData?.optimisticData?.push({ + onyxMethod: Onyx.METHOD.SET, + key: ONYXKEYS.GPS_DRAFT_DETAILS, + value: null, + }); + } + const mileageRate = isCustomUnitRateIDForP2P(transaction) ? undefined : customUnitRateID; if (shouldPlaySound) { playSound(SOUNDS.DONE); @@ -6824,9 +6829,7 @@ function trackExpense(params: CreateTrackExpenseParams) { if (shouldHandleNavigation) { // eslint-disable-next-line @typescript-eslint/no-deprecated - InteractionManager.runAfterInteractions(() => { - removeDraftTransactions(); - }); + InteractionManager.runAfterInteractions(() => removeDraftTransactions()); if (!params.isRetry) { dismissModalAndOpenReportInInboxTab(activeReportID); @@ -7606,9 +7609,11 @@ function createDistanceRequest(distanceRequestInformation: CreateDistanceRequest onyxData = moneyRequestOnyxData; + const isGPSDistanceRequest = transaction.iouRequestType === CONST.IOU.REQUEST_TYPE.DISTANCE_GPS; + if ( transaction.iouRequestType === CONST.IOU.REQUEST_TYPE.DISTANCE_MAP || - transaction.iouRequestType === CONST.IOU.REQUEST_TYPE.DISTANCE_GPS || + isGPSDistanceRequest || isManualDistanceRequest || transaction.iouRequestType === CONST.IOU.REQUEST_TYPE.DISTANCE_ODOMETER ) { @@ -7620,6 +7625,15 @@ function createDistanceRequest(distanceRequestInformation: CreateDistanceRequest }); } + if (isGPSDistanceRequest) { + // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830 + onyxData?.optimisticData?.push({ + onyxMethod: Onyx.METHOD.SET, + key: ONYXKEYS.GPS_DRAFT_DETAILS, + value: null, + }); + } + parameters = { comment, iouReportID: iouReport.reportID, @@ -7663,9 +7677,7 @@ function createDistanceRequest(distanceRequestInformation: CreateDistanceRequest API.write(WRITE_COMMANDS.CREATE_DISTANCE_REQUEST, parameters, onyxData); // eslint-disable-next-line @typescript-eslint/no-deprecated - InteractionManager.runAfterInteractions(() => { - removeDraftTransaction(CONST.IOU.OPTIMISTIC_TRANSACTION_ID); - }); + InteractionManager.runAfterInteractions(() => removeDraftTransaction(CONST.IOU.OPTIMISTIC_TRANSACTION_ID)); const activeReportID = isMoneyRequestReport && report?.reportID ? report.reportID : parameters.chatReportID; From 47b581c0c5297ea3589e40c52cb885dd349da459 Mon Sep 17 00:00:00 2001 From: GCyganek Date: Mon, 26 Jan 2026 15:53:39 +0100 Subject: [PATCH 4/6] Unused @ts-expect-error directive --- src/libs/actions/IOU/index.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/libs/actions/IOU/index.ts b/src/libs/actions/IOU/index.ts index 709868e53d272..80ddf17fe30f8 100644 --- a/src/libs/actions/IOU/index.ts +++ b/src/libs/actions/IOU/index.ts @@ -6666,7 +6666,6 @@ function trackExpense(params: CreateTrackExpenseParams) { } if (isGPSDistanceRequest) { - // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830 onyxData?.optimisticData?.push({ onyxMethod: Onyx.METHOD.SET, key: ONYXKEYS.GPS_DRAFT_DETAILS, @@ -7626,7 +7625,6 @@ function createDistanceRequest(distanceRequestInformation: CreateDistanceRequest } if (isGPSDistanceRequest) { - // @ts-expect-error - will be solved in https://github.com/Expensify/App/issues/73830 onyxData?.optimisticData?.push({ onyxMethod: Onyx.METHOD.SET, key: ONYXKEYS.GPS_DRAFT_DETAILS, From 44188f9d35f29a66a8baec5b918529369325d481 Mon Sep 17 00:00:00 2001 From: GCyganek Date: Mon, 26 Jan 2026 17:10:06 +0100 Subject: [PATCH 5/6] Revert unnecessary changes --- src/libs/actions/IOU/index.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/libs/actions/IOU/index.ts b/src/libs/actions/IOU/index.ts index 80ddf17fe30f8..0e9f9e95e99c1 100644 --- a/src/libs/actions/IOU/index.ts +++ b/src/libs/actions/IOU/index.ts @@ -6353,9 +6353,7 @@ function requestMoney(requestMoneyInformation: RequestMoneyInformation): {iouRep if (shouldHandleNavigation) { // eslint-disable-next-line @typescript-eslint/no-deprecated - InteractionManager.runAfterInteractions(() => { - removeDraftTransactions(); - }); + InteractionManager.runAfterInteractions(() => removeDraftTransactions()); if (!requestMoneyInformation.isRetry) { dismissModalAndOpenReportInInboxTab(backToReport ?? activeReportID); } @@ -7676,7 +7674,6 @@ function createDistanceRequest(distanceRequestInformation: CreateDistanceRequest API.write(WRITE_COMMANDS.CREATE_DISTANCE_REQUEST, parameters, onyxData); // eslint-disable-next-line @typescript-eslint/no-deprecated InteractionManager.runAfterInteractions(() => removeDraftTransaction(CONST.IOU.OPTIMISTIC_TRANSACTION_ID)); - const activeReportID = isMoneyRequestReport && report?.reportID ? report.reportID : parameters.chatReportID; if (shouldHandleNavigation) { From 4227cd5efd1b84c83ab46e387f69124477ded4b1 Mon Sep 17 00:00:00 2001 From: GCyganek Date: Tue, 27 Jan 2026 15:37:56 +0100 Subject: [PATCH 6/6] move reset in trackExpense to default switch case --- src/libs/actions/IOU/index.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/libs/actions/IOU/index.ts b/src/libs/actions/IOU/index.ts index 0e9f9e95e99c1..15054a37a3215 100644 --- a/src/libs/actions/IOU/index.ts +++ b/src/libs/actions/IOU/index.ts @@ -6663,14 +6663,6 @@ function trackExpense(params: CreateTrackExpenseParams) { }); } - if (isGPSDistanceRequest) { - onyxData?.optimisticData?.push({ - onyxMethod: Onyx.METHOD.SET, - key: ONYXKEYS.GPS_DRAFT_DETAILS, - value: null, - }); - } - const mileageRate = isCustomUnitRateIDForP2P(transaction) ? undefined : customUnitRateID; if (shouldPlaySound) { playSound(SOUNDS.DONE); @@ -6779,6 +6771,14 @@ function trackExpense(params: CreateTrackExpenseParams) { break; } default: { + if (isGPSDistanceRequest) { + onyxData?.optimisticData?.push({ + onyxMethod: Onyx.METHOD.SET, + key: ONYXKEYS.GPS_DRAFT_DETAILS, + value: null, + }); + } + const parameters: TrackExpenseParams = { amount, attendees: attendees ? JSON.stringify(attendees) : undefined,