diff --git a/src/components/ReportActionItem/MoneyRequestView.tsx b/src/components/ReportActionItem/MoneyRequestView.tsx index ca50e93e536f..1c3a9336714f 100644 --- a/src/components/ReportActionItem/MoneyRequestView.tsx +++ b/src/components/ReportActionItem/MoneyRequestView.tsx @@ -390,7 +390,7 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals const shouldShowReceiptAudit = isReceiptAllowed && (shouldShowReceiptEmptyState || hasReceipt); const errors = { - ...(transaction?.errorFields?.route ?? transaction?.errors), + ...(transaction?.errorFields?.route ?? transaction?.errorFields?.waypoints ?? transaction?.errors), ...parentReportAction?.errors, }; diff --git a/src/components/ReportActionItem/ReportActionItemImage.tsx b/src/components/ReportActionItem/ReportActionItemImage.tsx index 668338440f73..ca54d759fb69 100644 --- a/src/components/ReportActionItem/ReportActionItemImage.tsx +++ b/src/components/ReportActionItem/ReportActionItemImage.tsx @@ -84,7 +84,7 @@ function ReportActionItemImage({ const {translate} = useLocalize(); const isDistanceRequest = !!transaction && TransactionUtils.isDistanceRequest(transaction); const hasPendingWaypoints = transaction && TransactionUtils.isFetchingWaypointsFromServer(transaction); - const hasErrors = !isEmptyObject(transaction?.errors) || !isEmptyObject(transaction?.errorFields); + const hasErrors = !isEmptyObject(transaction?.errors) || !isEmptyObject(transaction?.errorFields?.route) || !isEmptyObject(transaction?.errorFields?.waypoints); const showMapAsImage = isDistanceRequest && (hasErrors || hasPendingWaypoints); if (showMapAsImage) { diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 90719ffeed55..662ad4fc0592 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -3161,6 +3161,7 @@ type UpdateMoneyRequestDistanceParams = { policy?: OnyxEntry; policyTagList?: OnyxEntry; policyCategories?: OnyxEntry; + transactionBackup: OnyxEntry; }; /** Updates the waypoints of a distance expense */ @@ -3172,6 +3173,7 @@ function updateMoneyRequestDistance({ policy = {} as OnyxTypes.Policy, policyTagList = {}, policyCategories = {}, + transactionBackup, }: UpdateMoneyRequestDistanceParams) { const transactionChanges: TransactionChanges = { waypoints: sanitizeRecentWaypoints(waypoints), @@ -3195,6 +3197,35 @@ function updateMoneyRequestDistance({ value: recentServerValidatedWaypoints, }); + if (transactionBackup) { + const transaction = allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]; + // We need to have all the keys of the original waypoint in the failure data for onyx merge to properly reset + // waypoints keys that do not exist in the waypoint of the reverting failure data. + const allWaypointKeys = [...new Set([...Object.keys(transactionBackup.comment?.waypoints ?? {}), ...Object.keys(transaction?.comment?.waypoints ?? {})])]; + const onyxWaypoints = allWaypointKeys.reduce((acc: NullishDeep, key) => { + acc[key] = transactionBackup.comment?.waypoints?.[key] ? {...transactionBackup.comment?.waypoints?.[key]} : null; + return acc; + }, {}); + const allModifiedWaypointsKeys = [...new Set([...Object.keys(waypoints ?? {}), ...Object.keys(transaction?.modifiedWaypoints ?? {})])]; + const onyxModifiedWaypoints = allModifiedWaypointsKeys.reduce((acc: NullishDeep, key) => { + acc[key] = transactionBackup.modifiedWaypoints?.[key] ? {...transactionBackup.modifiedWaypoints?.[key]} : null; + return acc; + }, {}); + onyxData?.failureData?.push({ + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, + value: { + comment: { + waypoints: onyxWaypoints, + customUnit: { + quantity: transactionBackup?.comment?.customUnit?.quantity, + }, + }, + modifiedWaypoints: onyxModifiedWaypoints, + }, + }); + } + API.write(WRITE_COMMANDS.UPDATE_MONEY_REQUEST_DISTANCE, params, onyxData); } diff --git a/src/libs/actions/Transaction.ts b/src/libs/actions/Transaction.ts index 3cb6e3dc44ba..c8a007458242 100644 --- a/src/libs/actions/Transaction.ts +++ b/src/libs/actions/Transaction.ts @@ -458,7 +458,7 @@ function abandonReviewDuplicateTransactions() { } function clearError(transactionID: string) { - Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, {errors: null, errorFields: {route: null}}); + Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, {errors: null, errorFields: {route: null, waypoints: null, routes: null}}); } function markAsCash(transactionID: string, transactionThreadReportID: string) { diff --git a/src/pages/iou/request/step/IOURequestStepDistance.tsx b/src/pages/iou/request/step/IOURequestStepDistance.tsx index efe5d293036b..dd02df8f4177 100644 --- a/src/pages/iou/request/step/IOURequestStepDistance.tsx +++ b/src/pages/iou/request/step/IOURequestStepDistance.tsx @@ -465,6 +465,7 @@ function IOURequestStepDistance({ waypoints, ...(hasRouteChanged ? {routes: transaction?.routes} : {}), policy, + transactionBackup, }); navigateBack(); return; diff --git a/src/types/onyx/Transaction.ts b/src/types/onyx/Transaction.ts index 547e41463c70..2aa31904a35a 100644 --- a/src/types/onyx/Transaction.ts +++ b/src/types/onyx/Transaction.ts @@ -338,7 +338,7 @@ type Transaction = OnyxCommon.OnyxValueWithOfflineFeedback< errors?: OnyxCommon.Errors | ReceiptErrors; /** Server side errors keyed by microtime */ - errorFields?: OnyxCommon.ErrorFields<'route'>; + errorFields?: OnyxCommon.ErrorFields<'route'> & OnyxCommon.ErrorFields<'routes'> & OnyxCommon.ErrorFields<'waypoints'>; /** The name of the file used for a receipt (formerly receiptFilename) */ filename?: string;