From a8dd2481078bf34f5118961ca3fd967b98a9a1b4 Mon Sep 17 00:00:00 2001 From: Michal Muzyk Date: Wed, 27 Mar 2024 12:12:32 +0100 Subject: [PATCH] fix: update distance rates when changing currency offline --- src/libs/actions/Policy.ts | 66 ++++++++++++------- .../PolicyDistanceRateDetailsPage.tsx | 2 +- .../distanceRates/PolicyDistanceRatesPage.tsx | 2 +- 3 files changed, 43 insertions(+), 27 deletions(-) diff --git a/src/libs/actions/Policy.ts b/src/libs/actions/Policy.ts index 45fc139b6742..ce72301d82c9 100644 --- a/src/libs/actions/Policy.ts +++ b/src/libs/actions/Policy.ts @@ -1499,13 +1499,35 @@ function clearAvatarErrors(policyID: string) { */ function updateGeneralSettings(policyID: string, name: string, currency: string) { const policy = allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`]; + const distanceUnit = Object.values(policy?.customUnits ?? {}).find((unit) => unit.name === CONST.CUSTOM_UNITS.NAME_DISTANCE); + const customUnitID = distanceUnit?.customUnitID; - if (!policy) { + if (!policy || !customUnitID) { return; } - const distanceUnit = Object.values(policy?.customUnits ?? {}).find((unit) => unit.name === CONST.CUSTOM_UNITS.NAME_DISTANCE); - const distanceRate = Object.values(distanceUnit?.rates ?? {}).find((rate) => rate.name === CONST.CUSTOM_UNITS.DEFAULT_RATE); + const currentRates = distanceUnit?.rates ?? {}; + const optimisticRates: Record = {}; + const finallyRates: Record = {}; + const failureRates: Record = {}; + + for (const rateID of Object.keys(currentRates)) { + optimisticRates[rateID] = { + ...currentRates[rateID], + pendingFields: {currency: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE}, + currency, + }; + finallyRates[rateID] = { + ...currentRates[rateID], + pendingFields: {currency: null}, + currency, + }; + failureRates[rateID] = { + ...currentRates[rateID], + pendingFields: {currency: null}, + errorFields: {currency: ErrorUtils.getMicroSecondOnyxError('common.genericErrorMessage')}, + }; + } const optimisticData: OnyxUpdate[] = [ { @@ -1526,21 +1548,12 @@ function updateGeneralSettings(policyID: string, name: string, currency: string) }, name, outputCurrency: currency, - ...(distanceUnit?.customUnitID && distanceRate?.customUnitRateID - ? { - customUnits: { - [distanceUnit?.customUnitID]: { - ...distanceUnit, - rates: { - [distanceRate?.customUnitRateID]: { - ...distanceRate, - currency, - }, - }, - }, - }, - } - : {}), + customUnits: { + [customUnitID]: { + ...distanceUnit, + rates: optimisticRates, + }, + }, }, }, ]; @@ -1552,6 +1565,11 @@ function updateGeneralSettings(policyID: string, name: string, currency: string) pendingFields: { generalSettings: null, }, + customUnits: { + [customUnitID]: { + rates: finallyRates, + }, + }, }, }, ]; @@ -1564,13 +1582,11 @@ function updateGeneralSettings(policyID: string, name: string, currency: string) errorFields: { generalSettings: ErrorUtils.getMicroSecondOnyxError('workspace.editor.genericFailureMessage'), }, - ...(distanceUnit?.customUnitID - ? { - customUnits: { - [distanceUnit.customUnitID]: distanceUnit, - }, - } - : {}), + customUnits: { + [customUnitID]: { + rates: failureRates, + }, + }, }, }, ]; diff --git a/src/pages/workspace/distanceRates/PolicyDistanceRateDetailsPage.tsx b/src/pages/workspace/distanceRates/PolicyDistanceRateDetailsPage.tsx index 965096ffa529..a1716405da8b 100644 --- a/src/pages/workspace/distanceRates/PolicyDistanceRateDetailsPage.tsx +++ b/src/pages/workspace/distanceRates/PolicyDistanceRateDetailsPage.tsx @@ -129,7 +129,7 @@ function PolicyDistanceRateDetailsPage({policy, route}: PolicyDistanceRateDetail clearErrorFields('rate')} > diff --git a/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx b/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx index a70f3959ceb2..5f1ced2adbe8 100644 --- a/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx +++ b/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx @@ -100,7 +100,7 @@ function PolicyDistanceRatesPage({policy, route}: PolicyDistanceRatesPageProps) keyForList: value.customUnitRateID ?? '', isSelected: selectedDistanceRates.find((rate) => rate.customUnitRateID === value.customUnitRateID) !== undefined, isDisabled: value.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE, - pendingAction: value.pendingAction ?? value.pendingFields?.rate ?? value.pendingFields?.enabled, + pendingAction: value.pendingAction ?? value.pendingFields?.rate ?? value.pendingFields?.enabled ?? value.pendingFields?.currency, errors: value.errors ?? undefined, rightElement: (