From 4a6472b630c2ccf032e71878a4ed97fa2cf870b7 Mon Sep 17 00:00:00 2001 From: GCyganek Date: Wed, 11 Feb 2026 10:28:16 +0100 Subject: [PATCH 1/3] Revert "Merge pull request #82023 from software-mansion-labs/revert-81017-fix/distance-conversion-different-distance-unit" This reverts commit 48538a594437c9c781d0a50d1811900881ed7df5, reversing changes made to 0eeac00bb07090b6e540d14dbeb99443305838c0. --- .../MoneyRequestConfirmationList.tsx | 22 ++------- src/libs/GPSDraftDetailsUtils.ts | 2 +- src/libs/actions/IOU/MoneyRequest.ts | 5 +- src/libs/actions/IOU/index.ts | 47 ++++++++++++++++--- .../step/IOURequestStepDestination.tsx | 2 +- .../step/IOURequestStepDistanceManual.tsx | 20 ++++++-- .../step/IOURequestStepDistanceOdometer.tsx | 4 +- .../step/IOURequestStepParticipants.tsx | 20 ++++++-- .../iou/request/step/IOURequestStepReport.tsx | 2 +- .../request/step/IOURequestStepUpgrade.tsx | 2 +- 10 files changed, 86 insertions(+), 40 deletions(-) diff --git a/src/components/MoneyRequestConfirmationList.tsx b/src/components/MoneyRequestConfirmationList.tsx index 326ae2420098e..95b99af276ca0 100755 --- a/src/components/MoneyRequestConfirmationList.tsx +++ b/src/components/MoneyRequestConfirmationList.tsx @@ -21,7 +21,6 @@ import { setCustomUnitRateID, setMoneyRequestAmount, setMoneyRequestCategory, - setMoneyRequestDistance, setMoneyRequestMerchant, setMoneyRequestPendingFields, setMoneyRequestTag, @@ -33,7 +32,6 @@ import {getIsMissingAttendeesViolation} from '@libs/AttendeeUtils'; import {isCategoryDescriptionRequired} from '@libs/CategoryUtils'; import {convertToBackendAmount, convertToDisplayString, convertToDisplayStringWithoutCurrency} from '@libs/CurrencyUtils'; import DistanceRequestUtils from '@libs/DistanceRequestUtils'; -import {calculateGPSDistance} from '@libs/GPSDraftDetailsUtils'; import {calculateAmount, insertTagIntoTransactionTagsString, isMovingTransactionFromTrackExpense as isMovingTransactionFromTrackExpenseUtil} from '@libs/IOUUtils'; import Log from '@libs/Log'; import {validateAmount} from '@libs/MoneyRequestUtils'; @@ -343,8 +341,8 @@ function MoneyRequestConfirmationList({ return; } - setCustomUnitRateID(transactionID, lastSelectedRate); - }, [customUnitRateID, transactionID, lastSelectedRate, isDistanceRequest, isPolicyExpenseChat, isMovingTransactionFromTrackExpense]); + setCustomUnitRateID(transactionID, lastSelectedRate, transaction, policy); + }, [customUnitRateID, transactionID, lastSelectedRate, isDistanceRequest, isPolicyExpenseChat, isMovingTransactionFromTrackExpense, transaction, policy]); const mileageRate = DistanceRequestUtils.getRate({transaction, policy, policyDraft}); const rate = mileageRate.rate; @@ -391,19 +389,6 @@ function MoneyRequestConfirmationList({ const distanceRequestAmount = DistanceRequestUtils.getDistanceRequestAmount(distance, unit ?? CONST.CUSTOM_UNITS.DISTANCE_UNIT_MILES, rate ?? 0); - // Update GPS distance whenever the current distance unit differs from the one that was used - // to calculate the distance stored in transaction.comment.customUnit.quantity - const gpsDistance = transaction?.comment?.customUnit?.quantity; - const gpsDistanceWithCurrentDistanceUnit = calculateGPSDistance(distance, unit); - const shouldUpdateGpsDistance = isGPSDistanceRequest && gpsDistance !== gpsDistanceWithCurrentDistanceUnit; - useEffect(() => { - if (!shouldUpdateGpsDistance || !transactionID || isReadOnly) { - return; - } - - setMoneyRequestDistance(transactionID, gpsDistanceWithCurrentDistanceUnit, true); - }, [shouldUpdateGpsDistance, transactionID, isReadOnly, gpsDistanceWithCurrentDistanceUnit]); - let amountToBeUsed = iouAmount; if (shouldCalculateDistanceAmount) { @@ -510,7 +495,7 @@ function MoneyRequestConfirmationList({ // If there is a distance rate in the policy that matches the rate and unit of the currently selected mileage rate, select it automatically const matchingRate = Object.values(policyRates).find((policyRate) => policyRate.rate === mileageRate.rate && policyRate.unit === mileageRate.unit); if (matchingRate?.customUnitRateID) { - setCustomUnitRateID(transactionID, matchingRate.customUnitRateID); + setCustomUnitRateID(transactionID, matchingRate.customUnitRateID, transaction, policy); return; } @@ -527,6 +512,7 @@ function MoneyRequestConfirmationList({ isMovingTransactionFromTrackExpense, setFormError, clearFormErrors, + transaction, ]); const routeError = Object.values(transaction?.errorFields?.route ?? {}).at(0); diff --git a/src/libs/GPSDraftDetailsUtils.ts b/src/libs/GPSDraftDetailsUtils.ts index 89c95eae53ca8..ff82b47624704 100644 --- a/src/libs/GPSDraftDetailsUtils.ts +++ b/src/libs/GPSDraftDetailsUtils.ts @@ -62,7 +62,7 @@ function getGPSCoordinates(gpsDraftDetails: GpsDraftDetails | undefined): string } function calculateGPSDistance(distanceInMeters: number, unit: Unit): number { - return roundToTwoDecimalPlaces(DistanceRequestUtils.convertDistanceUnit(distanceInMeters, unit)); + return DistanceRequestUtils.convertDistanceUnit(distanceInMeters, unit); } function getGPSConvertedDistance(gpsDraftDetails: GpsDraftDetails | undefined, unit: Unit): number { diff --git a/src/libs/actions/IOU/MoneyRequest.ts b/src/libs/actions/IOU/MoneyRequest.ts index 3f354839775de..7d560d7d2c506 100644 --- a/src/libs/actions/IOU/MoneyRequest.ts +++ b/src/libs/actions/IOU/MoneyRequest.ts @@ -660,7 +660,10 @@ function handleMoneyRequestStepDistanceNavigation({ lastSelectedDistanceRates, }); setTransactionReport(transactionID, {reportID: transactionReportID}, true); - setCustomUnitRateID(transactionID, rateID); + // Do not pass transaction and policy so it only updates customUnitRateID without changing distance and distance unit + // as it is set for Manual requests before this function is called and transaction may have + // obsolete customUnit values + setCustomUnitRateID(transactionID, rateID, undefined, undefined); setMoneyRequestParticipantsFromReport(transactionID, targetReport, currentUserAccountID).then(() => { Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, iouTypeTrackOrSubmit, transactionID, targetReport?.reportID)); }); diff --git a/src/libs/actions/IOU/index.ts b/src/libs/actions/IOU/index.ts index ac8c7b0c48edc..5944a8bf5e53d 100644 --- a/src/libs/actions/IOU/index.ts +++ b/src/libs/actions/IOU/index.ts @@ -67,6 +67,7 @@ import Navigation, {navigationRef} from '@libs/Navigation/Navigation'; import {isOffline} from '@libs/Network/NetworkStore'; // eslint-disable-next-line @typescript-eslint/no-deprecated import {buildNextStepNew, buildOptimisticNextStep} from '@libs/NextStepUtils'; +import {roundToTwoDecimalPlaces} from '@libs/NumberUtils'; import * as NumberUtils from '@libs/NumberUtils'; import {getManagerMcTestParticipant, getPersonalDetailsForAccountIDs} from '@libs/OptionsListUtils'; import Parser from '@libs/Parser'; @@ -1508,15 +1509,48 @@ function setMoneyRequestReceipt(transactionID: string, source: string, filename: } /** - * Set custom unit rateID for the transaction draft + * Set custom unit rateID for the transaction draft, also updates quantity and distanceUnit + * if passed transaction previously had it to make sure that transaction does not have inconsistent + * states (for example distanceUnit not matching distance unit of the new customUnitRateID) */ -function setCustomUnitRateID(transactionID: string, customUnitRateID: string | undefined) { +function setCustomUnitRateID(transactionID: string, customUnitRateID: string | undefined, transaction: OnyxEntry, policy: OnyxEntry) { const isFakeP2PRate = customUnitRateID === CONST.CUSTOM_UNITS.FAKE_P2P_ID; + + let newDistanceUnit: Unit | undefined; + let newQuantity: number | undefined; + + if (customUnitRateID && transaction) { + const distanceRate = isFakeP2PRate + ? DistanceRequestUtils.getRate({transaction, useTransactionDistanceUnit: false, policy}) + : DistanceRequestUtils.getRateByCustomUnitRateID({policy, customUnitRateID}); + + const transactionDistanceUnit = transaction.comment?.customUnit?.distanceUnit; + const transactionQuantity = transaction.comment?.customUnit?.quantity; + + const shouldUpdateDistanceUnit = !!transactionDistanceUnit && !!distanceRate?.unit; + const shouldUpdateQuantity = transactionQuantity !== null && transactionQuantity !== undefined; + + if (shouldUpdateDistanceUnit) { + newDistanceUnit = distanceRate.unit; + } + if (shouldUpdateQuantity && !!distanceRate?.unit) { + const newQuantityInMeters = getDistanceInMeters(transaction, transactionDistanceUnit); + + // getDistanceInMeters returns 0 only if there was not enough input to get the correct + // distance in meters or if the current transaction distance is 0 + if (newQuantityInMeters !== 0) { + newQuantity = DistanceRequestUtils.convertDistanceUnit(newQuantityInMeters, distanceRate.unit); + } + } + } + Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`, { comment: { customUnit: { customUnitRateID, ...(!isFakeP2PRate && {defaultP2PRate: null}), + distanceUnit: newDistanceUnit, + quantity: newQuantity, }, }, }); @@ -1664,8 +1698,8 @@ function addSubrate(transaction: OnyxEntry, currentIndex: Onyx.set(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction?.transactionID}`, newTransaction); } -function setMoneyRequestDistance(transactionID: string, distanceAsFloat: number, isDraft: boolean) { - Onyx.merge(`${isDraft ? ONYXKEYS.COLLECTION.TRANSACTION_DRAFT : ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, {comment: {customUnit: {quantity: distanceAsFloat}}}); +function setMoneyRequestDistance(transactionID: string, distanceAsFloat: number, isDraft: boolean, distanceUnit: Unit) { + Onyx.merge(`${isDraft ? ONYXKEYS.COLLECTION.TRANSACTION_DRAFT : ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, {comment: {customUnit: {quantity: distanceAsFloat, distanceUnit}}}); } /** @@ -1727,6 +1761,7 @@ function setMoneyRequestDistanceRate(transactionID: string, customUnitRateID: st if (distanceRate?.unit && distanceRate?.unit !== transaction?.comment?.customUnit?.distanceUnit) { newDistance = DistanceRequestUtils.convertDistanceUnit(getDistanceInMeters(transaction, transaction?.comment?.customUnit?.distanceUnit), distanceRate.unit); } + Onyx.merge(`${isDraft ? ONYXKEYS.COLLECTION.TRANSACTION_DRAFT : ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, { comment: { customUnit: { @@ -7149,7 +7184,7 @@ function trackExpense(params: CreateTrackExpenseParams) { attendees: attendees ? JSON.stringify(attendees) : undefined, currency, comment, - distance, + distance: distance !== undefined ? roundToTwoDecimalPlaces(distance) : undefined, created, merchant, iouReportID: iouReport?.reportID, @@ -7994,7 +8029,7 @@ function createDistanceRequest(distanceRequestInformation: CreateDistanceRequest createdIOUReportActionID, reportPreviewReportActionID: reportPreviewAction.reportActionID, waypoints: JSON.stringify(sanitizedWaypoints), - distance, + distance: distance !== undefined ? roundToTwoDecimalPlaces(distance) : undefined, receipt, odometerStart, odometerEnd, diff --git a/src/pages/iou/request/step/IOURequestStepDestination.tsx b/src/pages/iou/request/step/IOURequestStepDestination.tsx index a4d8b6ffbcd1d..2f36a92369868 100644 --- a/src/pages/iou/request/step/IOURequestStepDestination.tsx +++ b/src/pages/iou/request/step/IOURequestStepDestination.tsx @@ -106,7 +106,7 @@ function IOURequestStepDestination({ setCustomUnitID(transactionID, customUnit.customUnitID); setMoneyRequestCategory(transactionID, customUnit?.defaultCategory ?? '', undefined); } - setCustomUnitRateID(transactionID, destination.keyForList ?? ''); + setCustomUnitRateID(transactionID, destination.keyForList ?? '', transaction, policy); setMoneyRequestCurrency(transactionID, destination.currency); clearSubrates(transactionID); } diff --git a/src/pages/iou/request/step/IOURequestStepDistanceManual.tsx b/src/pages/iou/request/step/IOURequestStepDistanceManual.tsx index 4e50319582819..b7d64600610d1 100644 --- a/src/pages/iou/request/step/IOURequestStepDistanceManual.tsx +++ b/src/pages/iou/request/step/IOURequestStepDistanceManual.tsx @@ -31,7 +31,7 @@ import Navigation from '@libs/Navigation/Navigation'; import {roundToTwoDecimalPlaces} from '@libs/NumberUtils'; import {isArchivedReport, isPolicyExpenseChat as isPolicyExpenseChatUtils} from '@libs/ReportUtils'; import shouldUseDefaultExpensePolicyUtil from '@libs/shouldUseDefaultExpensePolicy'; -import {getRateID} from '@libs/TransactionUtils'; +import {getDistanceInMeters, getRateID} from '@libs/TransactionUtils'; import variables from '@styles/variables'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; @@ -106,9 +106,18 @@ function IOURequestStepDistanceManual({ const shouldUseDefaultExpensePolicy = useMemo(() => shouldUseDefaultExpensePolicyUtil(iouType, defaultExpensePolicy), [iouType, defaultExpensePolicy]); - const customUnitRateID = getRateID(transaction); - const unit = DistanceRequestUtils.getRate({transaction, policy: shouldUseDefaultExpensePolicy ? defaultExpensePolicy : policy}).unit; - const distance = typeof transaction?.comment?.customUnit?.quantity === 'number' ? roundToTwoDecimalPlaces(transaction.comment.customUnit.quantity) : undefined; + const customUnitRateID = getRateID(currentTransaction); + // to make sure the correct distance amount and unit will be shown we use distance unit + // from defaultExpensePolicy or current report's policy instead of from transaction and + // then we use transaction data (distanceUnit and quantity) for conversions + const unit = DistanceRequestUtils.getRate({ + transaction: currentTransaction, + policy: shouldUseDefaultExpensePolicy ? defaultExpensePolicy : policy, + useTransactionDistanceUnit: false, + }).unit; + const distanceInMeters = getDistanceInMeters(currentTransaction, currentTransaction?.comment?.customUnit?.distanceUnit ? currentTransaction.comment.customUnit.distanceUnit : unit); + const distance = + typeof currentTransaction?.comment?.customUnit?.quantity === 'number' ? roundToTwoDecimalPlaces(DistanceRequestUtils.convertDistanceUnit(distanceInMeters, unit)) : undefined; const isASAPSubmitBetaEnabled = isBetaEnabled(CONST.BETAS.ASAP_SUBMIT); useEffect(() => { @@ -155,7 +164,7 @@ function IOURequestStepDistanceManual({ const navigateToNextPage = useCallback( (amount: string) => { const distanceAsFloat = roundToTwoDecimalPlaces(parseFloat(amount)); - setMoneyRequestDistance(transactionID, distanceAsFloat, isTransactionDraft); + setMoneyRequestDistance(transactionID, distanceAsFloat, isTransactionDraft, unit); if (action === CONST.IOU.ACTION.EDIT) { // In the split flow, when editing we use SPLIT_TRANSACTION_DRAFT to save draft value @@ -258,6 +267,7 @@ function IOURequestStepDistanceManual({ policyCategories, parentReportNextStep, recentWaypoints, + unit, selfDMReport, betas, ], diff --git a/src/pages/iou/request/step/IOURequestStepDistanceOdometer.tsx b/src/pages/iou/request/step/IOURequestStepDistanceOdometer.tsx index f93de87fdcc25..2b417c1e57f08 100644 --- a/src/pages/iou/request/step/IOURequestStepDistanceOdometer.tsx +++ b/src/pages/iou/request/step/IOURequestStepDistanceOdometer.tsx @@ -367,7 +367,7 @@ function IOURequestStepDistanceOdometer({ const calculatedDistance = roundToTwoDecimalPlaces(distance); // Store total distance in transaction.comment.customUnit.quantity - setMoneyRequestDistance(transactionID, calculatedDistance, isTransactionDraft); + setMoneyRequestDistance(transactionID, calculatedDistance, isTransactionDraft, unit); if (isEditing) { // In the split flow, when editing we use SPLIT_TRANSACTION_DRAFT to save draft value @@ -535,7 +535,7 @@ function IOURequestStepDistanceOdometer({ lastSelectedDistanceRates, }); setTransactionReport(transactionID, {reportID: transactionReportID}, true); - setCustomUnitRateID(transactionID, rateID); + setCustomUnitRateID(transactionID, rateID, transaction, policy); setMoneyRequestParticipantsFromReport(transactionID, activePolicyExpenseChat, currentUserPersonalDetails.accountID).then(() => { Navigation.navigate( ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute( diff --git a/src/pages/iou/request/step/IOURequestStepParticipants.tsx b/src/pages/iou/request/step/IOURequestStepParticipants.tsx index 96155d7c21f25..ce37450f75c4e 100644 --- a/src/pages/iou/request/step/IOURequestStepParticipants.tsx +++ b/src/pages/iou/request/step/IOURequestStepParticipants.tsx @@ -193,7 +193,7 @@ function IOURequestStepParticipants({ const rateID = CONST.CUSTOM_UNITS.FAKE_P2P_ID; for (const transaction of transactions) { - setCustomUnitRateID(transaction.transactionID, rateID); + setCustomUnitRateID(transaction.transactionID, rateID, transaction, activePolicy); const shouldSetParticipantAutoAssignment = iouType === CONST.IOU.TYPE.CREATE; setMoneyRequestParticipantsFromReport( transaction.transactionID, @@ -217,7 +217,19 @@ function IOURequestStepParticipants({ } }); }); - }, [selfDMReportID, transactions, action, initialTransactionID, waitForKeyboardDismiss, iouType, selfDMReport, currentUserPersonalDetails.accountID, isActivePolicyRequest, backTo]); + }, [ + selfDMReportID, + transactions, + action, + initialTransactionID, + waitForKeyboardDismiss, + iouType, + selfDMReport, + currentUserPersonalDetails.accountID, + isActivePolicyRequest, + backTo, + activePolicy, + ]); const addParticipant = useCallback( (val: Participant[]) => { @@ -255,11 +267,11 @@ function IOURequestStepParticipants({ if (transactions.length > 0) { for (const transaction of transactions) { - setCustomUnitRateID(transaction.transactionID, rateID); + setCustomUnitRateID(transaction.transactionID, rateID, transaction, policy); } } else { // Fallback to using initialTransactionID directly - setCustomUnitRateID(initialTransactionID, rateID); + setCustomUnitRateID(initialTransactionID, rateID, undefined, policy); } } diff --git a/src/pages/iou/request/step/IOURequestStepReport.tsx b/src/pages/iou/request/step/IOURequestStepReport.tsx index 26fa92cca3e61..7ea899b114ac4 100644 --- a/src/pages/iou/request/step/IOURequestStepReport.tsx +++ b/src/pages/iou/request/step/IOURequestStepReport.tsx @@ -128,7 +128,7 @@ function IOURequestStepReport({route, transaction}: IOURequestStepReportProps) { // Clear subrates, and update customUnitID if policy changed for per diem transactions if (policyChanged && isPerDiemTransaction) { setCustomUnitID(transaction.transactionID, newCustomUnitID ?? CONST.CUSTOM_UNITS.FAKE_P2P_ID); - setCustomUnitRateID(transaction.transactionID, undefined); + setCustomUnitRateID(transaction.transactionID, undefined, transaction, newPolicy); clearSubrates(transaction.transactionID); } diff --git a/src/pages/iou/request/step/IOURequestStepUpgrade.tsx b/src/pages/iou/request/step/IOURequestStepUpgrade.tsx index a19e7033d8723..e112d4cbd131d 100644 --- a/src/pages/iou/request/step/IOURequestStepUpgrade.tsx +++ b/src/pages/iou/request/step/IOURequestStepUpgrade.tsx @@ -96,7 +96,7 @@ function IOURequestStepUpgrade({ } setTransactionReport(transactionID, {reportID: expenseReportID}, true); // Let the confirmation step decide the distance rate because policy data is not fully available at this step - setCustomUnitRateID(transactionID, '-1'); + setCustomUnitRateID(transactionID, '-1', undefined, undefined); Navigation.setParams({reportID: expenseReportID}); navigateWithMicrotask(ROUTES.WORKSPACE_CREATE_DISTANCE_RATE_UPGRADE.getRoute(policyID, transactionID, expenseReportID)); From e48c0172e8a47c1796463babaf396560234e0f16 Mon Sep 17 00:00:00 2001 From: GCyganek Date: Wed, 11 Feb 2026 10:29:30 +0100 Subject: [PATCH 2/3] Fix distance and rate revert to old unit after reopening distance expense --- .../iou/request/step/IOURequestStepDistanceManual.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/pages/iou/request/step/IOURequestStepDistanceManual.tsx b/src/pages/iou/request/step/IOURequestStepDistanceManual.tsx index b7d64600610d1..8979a3f3c416d 100644 --- a/src/pages/iou/request/step/IOURequestStepDistanceManual.tsx +++ b/src/pages/iou/request/step/IOURequestStepDistanceManual.tsx @@ -174,7 +174,14 @@ function IOURequestStepDistanceManual({ return; } - if (distance !== distanceAsFloat) { + const transactionDistanceUnit = transaction?.comment?.customUnit?.distanceUnit; + + const isDistanceChanged = distance !== distanceAsFloat; + const isDistanceUnitChanged = transactionDistanceUnit && transactionDistanceUnit !== unit; + + const shouldUpdateTransaction = isDistanceChanged || isDistanceUnitChanged; + + if (shouldUpdateTransaction) { updateMoneyRequestDistance({ transactionID: transaction?.transactionID, transactionThreadReport: report, From bc5e8cc0018515ac91a21eef360e8f4da4534a27 Mon Sep 17 00:00:00 2001 From: GCyganek Date: Wed, 11 Feb 2026 16:24:31 +0100 Subject: [PATCH 3/3] Fix Distance and Rate unit on confirm page and created expense are different --- .../MoneyRequestConfirmationList.tsx | 31 ++++++++++--------- src/libs/actions/IOU/index.ts | 10 +++--- .../request/step/IOURequestStepUpgrade.tsx | 12 ++++++- 3 files changed, 33 insertions(+), 20 deletions(-) diff --git a/src/components/MoneyRequestConfirmationList.tsx b/src/components/MoneyRequestConfirmationList.tsx index 95b99af276ca0..0ac005eebac6b 100755 --- a/src/components/MoneyRequestConfirmationList.tsx +++ b/src/components/MoneyRequestConfirmationList.tsx @@ -329,21 +329,6 @@ function MoneyRequestConfirmationList({ const defaultRate = defaultMileageRate?.customUnitRateID; const lastSelectedRate = policy?.id ? (lastSelectedDistanceRates?.[policy.id] ?? defaultRate) : defaultRate; - useEffect(() => { - if ( - !['-1', CONST.CUSTOM_UNITS.FAKE_P2P_ID].includes(customUnitRateID) || - !isDistanceRequest || - !isPolicyExpenseChat || - !transactionID || - !lastSelectedRate || - isMovingTransactionFromTrackExpense - ) { - return; - } - - setCustomUnitRateID(transactionID, lastSelectedRate, transaction, policy); - }, [customUnitRateID, transactionID, lastSelectedRate, isDistanceRequest, isPolicyExpenseChat, isMovingTransactionFromTrackExpense, transaction, policy]); - const mileageRate = DistanceRequestUtils.getRate({transaction, policy, policyDraft}); const rate = mileageRate.rate; const prevRate = usePrevious(rate); @@ -679,6 +664,22 @@ function MoneyRequestConfirmationList({ const payeePersonalDetails = useMemo(() => payeePersonalDetailsProp ?? currentUserPersonalDetails, [payeePersonalDetailsProp, currentUserPersonalDetails]); const shouldShowReadOnlySplits = useMemo(() => isPolicyExpenseChat || isReadOnly || isScanRequest, [isPolicyExpenseChat, isReadOnly, isScanRequest]); + useEffect(() => { + if ( + !['-1', CONST.CUSTOM_UNITS.FAKE_P2P_ID].includes(customUnitRateID) || + !isDistanceRequest || + !isPolicyExpenseChat || + !transactionID || + !lastSelectedRate || + isMovingTransactionFromTrackExpense || + !selectedParticipants.some((participant) => participant.policyID === policy?.id) + ) { + return; + } + + setCustomUnitRateID(transactionID, lastSelectedRate, transaction, policy); + }, [customUnitRateID, transactionID, lastSelectedRate, isDistanceRequest, isPolicyExpenseChat, isMovingTransactionFromTrackExpense, transaction, policy, selectedParticipants]); + const splitParticipants = useMemo(() => { if (!isTypeSplit) { return []; diff --git a/src/libs/actions/IOU/index.ts b/src/libs/actions/IOU/index.ts index 5944a8bf5e53d..a6cc5df620f19 100644 --- a/src/libs/actions/IOU/index.ts +++ b/src/libs/actions/IOU/index.ts @@ -252,6 +252,7 @@ import type {Accountant, Attendee, Participant, Split} from '@src/types/onyx/IOU import type {ErrorFields, Errors, PendingAction, PendingFields} from '@src/types/onyx/OnyxCommon'; import type {PaymentMethodType} from '@src/types/onyx/OriginalMessage'; import type {CurrentUserPersonalDetails} from '@src/types/onyx/PersonalDetails'; +import type {Unit} from '@src/types/onyx/Policy'; import type {QuickActionName} from '@src/types/onyx/QuickAction'; import type RecentlyUsedTags from '@src/types/onyx/RecentlyUsedTags'; import type {ReportNextStep} from '@src/types/onyx/Report'; @@ -1755,11 +1756,12 @@ function setMoneyRequestDistanceRate(transactionID: string, customUnitRateID: st Onyx.merge(ONYXKEYS.NVP_LAST_SELECTED_DISTANCE_RATES, {[policy.id]: customUnitRateID}); } - const distanceRate = DistanceRequestUtils.getRateByCustomUnitRateID({policy, customUnitRateID}); + const newDistanceUnit = getDistanceRateCustomUnit(policy)?.attributes?.unit; const transaction = isDraft ? allTransactionDrafts[`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`] : allTransactions[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]; + let newDistance; - if (distanceRate?.unit && distanceRate?.unit !== transaction?.comment?.customUnit?.distanceUnit) { - newDistance = DistanceRequestUtils.convertDistanceUnit(getDistanceInMeters(transaction, transaction?.comment?.customUnit?.distanceUnit), distanceRate.unit); + if (newDistanceUnit && newDistanceUnit !== transaction?.comment?.customUnit?.distanceUnit) { + newDistance = DistanceRequestUtils.convertDistanceUnit(getDistanceInMeters(transaction, transaction?.comment?.customUnit?.distanceUnit), newDistanceUnit); } Onyx.merge(`${isDraft ? ONYXKEYS.COLLECTION.TRANSACTION_DRAFT : ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, { @@ -1767,7 +1769,7 @@ function setMoneyRequestDistanceRate(transactionID: string, customUnitRateID: st customUnit: { customUnitRateID, ...(!!policy && {defaultP2PRate: null}), - ...(distanceRate && {distanceUnit: distanceRate.unit}), + ...(newDistanceUnit && {distanceUnit: newDistanceUnit}), ...(newDistance && {quantity: newDistance}), }, }, diff --git a/src/pages/iou/request/step/IOURequestStepUpgrade.tsx b/src/pages/iou/request/step/IOURequestStepUpgrade.tsx index e112d4cbd131d..99f5e6c597dae 100644 --- a/src/pages/iou/request/step/IOURequestStepUpgrade.tsx +++ b/src/pages/iou/request/step/IOURequestStepUpgrade.tsx @@ -87,13 +87,20 @@ function IOURequestStepUpgrade({ }, ]); } - Navigation.goBack(); switch (upgradePath) { case CONST.UPGRADE_PATHS.DISTANCE_RATES: { if (!policyID || !reportID) { + Navigation.goBack(); return; } + + // In case we get here from /:action/track/... route we need to navigate to + // /:action/submit/... when shouldSubmitExpense === true as transaction is not selfDM anymore + const backToRoute = shouldSubmitExpense ? ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(action, CONST.IOU.TYPE.SUBMIT, transactionID, reportID) : undefined; + + Navigation.goBack(backToRoute); + setTransactionReport(transactionID, {reportID: expenseReportID}, true); // Let the confirmation step decide the distance rate because policy data is not fully available at this step setCustomUnitRateID(transactionID, '-1', undefined, undefined); @@ -103,14 +110,17 @@ function IOURequestStepUpgrade({ break; } case CONST.UPGRADE_PATHS.REPORTS: + Navigation.goBack(); navigateWithMicrotask(ROUTES.MONEY_REQUEST_STEP_REPORT.getRoute(action, CONST.IOU.TYPE.SUBMIT, transactionID, reportID)); break; case CONST.UPGRADE_PATHS.CATEGORIES: + Navigation.goBack(); navigateWithMicrotask(backTo ?? ROUTES.MONEY_REQUEST_STEP_CATEGORY.getRoute(action, CONST.IOU.TYPE.SUBMIT, transactionID, reportID)); break; default: + Navigation.goBack(); } };