diff --git a/src/components/MoneyRequestConfirmationList.tsx b/src/components/MoneyRequestConfirmationList.tsx index fcb415fc193f..42a5557ef431 100755 --- a/src/components/MoneyRequestConfirmationList.tsx +++ b/src/components/MoneyRequestConfirmationList.tsx @@ -1275,7 +1275,7 @@ export default withOnyx `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, - selector: (policy: OnyxEntry) => DistanceRequestUtils.getMileageRates(policy), + selector: DistanceRequestUtils.getMileageRates, }, policy: { key: ({policyID}) => `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, diff --git a/src/components/ReportActionItem/MoneyRequestView.tsx b/src/components/ReportActionItem/MoneyRequestView.tsx index 497e7fa3ff13..68b573f9a9ec 100644 --- a/src/components/ReportActionItem/MoneyRequestView.tsx +++ b/src/components/ReportActionItem/MoneyRequestView.tsx @@ -585,7 +585,7 @@ export default withOnyx `${ONYXKEYS.COLLECTION.POLICY}${report.policyID}`, - selector: (policy: OnyxEntry) => DistanceRequestUtils.getMileageRates(policy, true), + selector: DistanceRequestUtils.getMileageRates, }, })( withOnyx({ diff --git a/src/libs/DistanceRequestUtils.ts b/src/libs/DistanceRequestUtils.ts index ed4a6a73c9b9..0ebcc4869974 100644 --- a/src/libs/DistanceRequestUtils.ts +++ b/src/libs/DistanceRequestUtils.ts @@ -8,7 +8,6 @@ import type {LastSelectedDistanceRates, Report} from '@src/types/onyx'; import type {Unit} from '@src/types/onyx/Policy'; import type Policy from '@src/types/onyx/Policy'; import type {EmptyObject} from '@src/types/utils/EmptyObject'; -import {isEmptyObject} from '@src/types/utils/EmptyObject'; import * as CurrencyUtils from './CurrencyUtils'; import * as PolicyUtils from './PolicyUtils'; import * as ReportUtils from './ReportUtils'; @@ -39,35 +38,6 @@ Onyx.connect({ const METERS_TO_KM = 0.001; // 1 kilometer is 1000 meters const METERS_TO_MILES = 0.000621371; // There are approximately 0.000621371 miles in a meter -function getMileageRates(policy: OnyxEntry, includeDisabledRates = false): Record { - const mileageRates: Record = {}; - - if (!policy || !policy?.customUnits) { - return mileageRates; - } - - const distanceUnit = PolicyUtils.getCustomUnit(policy); - if (!distanceUnit?.rates) { - return mileageRates; - } - - Object.entries(distanceUnit.rates).forEach(([rateID, rate]) => { - if (!includeDisabledRates && !rate.enabled) { - return; - } - - mileageRates[rateID] = { - rate: rate.rate, - currency: rate.currency, - unit: distanceUnit.attributes.unit, - name: rate.name, - customUnitRateID: rate.customUnitRateID, - }; - }); - - return mileageRates; -} - /** * Retrieves the default mileage rate based on a given policy. * @@ -79,7 +49,7 @@ function getMileageRates(policy: OnyxEntry, includeDisabledRates = false * @returns [unit] - The unit of measurement for the distance. */ function getDefaultMileageRate(policy: OnyxEntry | EmptyObject): MileageRate | null { - if (isEmptyObject(policy) || !policy?.customUnits) { + if (!policy?.customUnits) { return null; } @@ -87,9 +57,8 @@ function getDefaultMileageRate(policy: OnyxEntry | EmptyObject): Mileage if (!distanceUnit?.rates) { return null; } - const mileageRates = getMileageRates(policy); - const distanceRate = Object.values(mileageRates).find((rate) => rate.name === CONST.CUSTOM_UNITS.DEFAULT_RATE) ?? Object.values(mileageRates)[0]; + const distanceRate = Object.values(distanceUnit.rates).find((rate) => rate.name === CONST.CUSTOM_UNITS.DEFAULT_RATE) ?? Object.values(distanceUnit.rates)[0]; return { customUnitRateID: distanceRate.customUnitRateID, @@ -210,6 +179,38 @@ function getDistanceMerchant( return `${distanceInUnits} @ ${ratePerUnit}`; } +/** + * Retrieves the mileage rates for given policy. + * + * @param policy - The policy from which to extract the mileage rates. + * + * @returns An array of mileage rates or an empty array if not found. + */ +function getMileageRates(policy: OnyxEntry): Record { + const mileageRates: Record = {}; + + if (!policy || !policy?.customUnits) { + return mileageRates; + } + + const distanceUnit = PolicyUtils.getCustomUnit(policy); + if (!distanceUnit?.rates) { + return mileageRates; + } + + Object.entries(distanceUnit.rates).forEach(([rateID, rate]) => { + mileageRates[rateID] = { + rate: rate.rate, + currency: rate.currency, + unit: distanceUnit.attributes.unit, + name: rate.name, + customUnitRateID: rate.customUnitRateID, + }; + }); + + return mileageRates; +} + /** * Retrieves the rate and unit for a P2P distance expense for a given currency. * @@ -255,17 +256,11 @@ function getCustomUnitRateID(reportID: string) { const report = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${reportID}`] ?? null; const parentReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${report?.parentReportID}`] ?? null; const policy = PolicyUtils.getPolicy(report?.policyID ?? parentReport?.policyID ?? ''); + let customUnitRateID: string = CONST.CUSTOM_UNITS.FAKE_P2P_ID; if (ReportUtils.isPolicyExpenseChat(report) || ReportUtils.isPolicyExpenseChat(parentReport)) { - const distanceUnit = Object.values(policy?.customUnits ?? {}).find((unit) => unit.name === CONST.CUSTOM_UNITS.NAME_DISTANCE); - const lastSelectedDistanceRateID = lastSelectedDistanceRates?.[policy?.id ?? ''] ?? ''; - const lastSelectedDistanceRate = distanceUnit?.rates[lastSelectedDistanceRateID] ?? {}; - if (lastSelectedDistanceRate.enabled && lastSelectedDistanceRateID) { - customUnitRateID = lastSelectedDistanceRateID; - } else { - customUnitRateID = getDefaultMileageRate(policy)?.customUnitRateID ?? ''; - } + customUnitRateID = lastSelectedDistanceRates?.[policy?.id ?? ''] ?? getDefaultMileageRate(policy)?.customUnitRateID ?? ''; } return customUnitRateID; diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 1bd4de43acfb..5d7960d23c64 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -2392,7 +2392,7 @@ function calculateAmountForUpdatedWaypoint( let updatedMerchant = Localize.translateLocal('iou.fieldPending'); if (!isEmptyObject(transactionChanges?.routes)) { const customUnitRateID = TransactionUtils.getRateID(transaction) ?? ''; - const mileageRates = DistanceRequestUtils.getMileageRates(policy, true); + const mileageRates = DistanceRequestUtils.getMileageRates(policy); const policyCurrency = policy?.outputCurrency ?? PolicyUtils.getPersonalPolicy()?.outputCurrency ?? CONST.CURRENCY.USD; const mileageRate = TransactionUtils.isCustomUnitRateIDForP2P(transaction) ? DistanceRequestUtils.getRateForP2P(policyCurrency) diff --git a/src/pages/iou/request/step/IOURequestStepDistanceRate.tsx b/src/pages/iou/request/step/IOURequestStepDistanceRate.tsx index f8879a3f4250..23e45207a5ee 100644 --- a/src/pages/iou/request/step/IOURequestStepDistanceRate.tsx +++ b/src/pages/iou/request/step/IOURequestStepDistanceRate.tsx @@ -117,7 +117,7 @@ const IOURequestStepDistanceRateWithOnyx = withOnyx `${ONYXKEYS.COLLECTION.POLICY}${report?.policyID ?? '0'}`, - selector: (policy: OnyxEntry) => DistanceRequestUtils.getMileageRates(policy), + selector: DistanceRequestUtils.getMileageRates, }, })(IOURequestStepDistanceRate);