From cbdc5304a71b21f278ecbb8c24c0f438a6e32541 Mon Sep 17 00:00:00 2001 From: daledah Date: Thu, 12 Sep 2024 14:29:22 +0700 Subject: [PATCH 1/7] fix: Error when selecting distance rate that no longer has tax rate --- src/libs/actions/TaxRate.ts | 48 +++++++++++++++++++ .../PolicyDistanceRateDetailsPage.tsx | 2 +- 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/libs/actions/TaxRate.ts b/src/libs/actions/TaxRate.ts index 514b73915633..c8a2962d7dc4 100644 --- a/src/libs/actions/TaxRate.ts +++ b/src/libs/actions/TaxRate.ts @@ -286,6 +286,10 @@ function deletePolicyTaxes(policyID: string, taxesToDelete: string[]) { const policyTaxRates = policy?.taxRates?.taxes; const foreignTaxDefault = policy?.taxRates?.foreignTaxDefault; const firstTaxID = Object.keys(policyTaxRates ?? {}).sort((a, b) => a.localeCompare(b))[0]; + const customUnits = policy?.customUnits ?? {}; + const ratesToUpdate = Object.values(customUnits?.[Object.keys(customUnits)[0]]?.rates).filter( + (rate) => !!rate.attributes?.taxRateExternalID && taxesToDelete.includes(rate.attributes?.taxRateExternalID), + ); if (!policyTaxRates) { console.debug('Policy or tax rates not found'); @@ -294,6 +298,35 @@ function deletePolicyTaxes(policyID: string, taxesToDelete: string[]) { const isForeignTaxRemoved = foreignTaxDefault && taxesToDelete.includes(foreignTaxDefault); + const optimisticRates: Record = {}; + const successRates: Record = {}; + const failureRates: Record = {}; + + ratesToUpdate.forEach((rate) => { + const rateID = rate.customUnitRateID ?? ''; + optimisticRates[rateID] = { + ...rate, + attributes: { + ...rate?.attributes, + taxRateExternalID: undefined, + taxClaimablePercentage: undefined, + }, + pendingFields: { + taxRateExternalID: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, + taxClaimablePercentage: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, + }, + }; + successRates[rateID] = {...rate, pendingFields: {taxRateExternalID: null}}; + failureRates[rateID] = { + ...rate, + pendingFields: {taxRateExternalID: null, taxClaimablePercentage: null}, + errorFields: { + taxRateExternalID: ErrorUtils.getMicroSecondOnyxErrorWithTranslationKey('common.genericErrorMessage'), + taxClaimablePercentage: ErrorUtils.getMicroSecondOnyxErrorWithTranslationKey('common.genericErrorMessage'), + }, + }; + }); + const onyxData: OnyxData = { optimisticData: [ { @@ -308,6 +341,11 @@ function deletePolicyTaxes(policyID: string, taxesToDelete: string[]) { return acc; }, {}), }, + customUnits: policy.customUnits && { + [Object.keys(policy.customUnits)[0]]: { + rates: optimisticRates, + }, + }, }, }, ], @@ -323,6 +361,11 @@ function deletePolicyTaxes(policyID: string, taxesToDelete: string[]) { return acc; }, {}), }, + customUnits: policy.customUnits && { + [Object.keys(policy.customUnits)[0]]: { + rates: successRates, + }, + }, }, }, ], @@ -341,6 +384,11 @@ function deletePolicyTaxes(policyID: string, taxesToDelete: string[]) { return acc; }, {}), }, + customUnits: policy.customUnits && { + [Object.keys(policy.customUnits)[0]]: { + rates: failureRates, + }, + }, }, }, ], diff --git a/src/pages/workspace/distanceRates/PolicyDistanceRateDetailsPage.tsx b/src/pages/workspace/distanceRates/PolicyDistanceRateDetailsPage.tsx index c4d033351b37..982e4799d781 100644 --- a/src/pages/workspace/distanceRates/PolicyDistanceRateDetailsPage.tsx +++ b/src/pages/workspace/distanceRates/PolicyDistanceRateDetailsPage.tsx @@ -155,7 +155,7 @@ function PolicyDistanceRateDetailsPage({policy, route}: PolicyDistanceRateDetail )} - {isDistanceTrackTaxEnabled && isPolicyTrackTaxEnabled && ( + {isDistanceTrackTaxEnabled && !!taxRate && isPolicyTrackTaxEnabled && ( Date: Thu, 12 Sep 2024 14:59:11 +0700 Subject: [PATCH 2/7] fix: undefined --- src/libs/actions/TaxRate.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/actions/TaxRate.ts b/src/libs/actions/TaxRate.ts index c8a2962d7dc4..c9073bd4a668 100644 --- a/src/libs/actions/TaxRate.ts +++ b/src/libs/actions/TaxRate.ts @@ -287,7 +287,7 @@ function deletePolicyTaxes(policyID: string, taxesToDelete: string[]) { const foreignTaxDefault = policy?.taxRates?.foreignTaxDefault; const firstTaxID = Object.keys(policyTaxRates ?? {}).sort((a, b) => a.localeCompare(b))[0]; const customUnits = policy?.customUnits ?? {}; - const ratesToUpdate = Object.values(customUnits?.[Object.keys(customUnits)[0]]?.rates).filter( + const ratesToUpdate = Object.values(customUnits?.[Object.keys(customUnits)[0]]?.rates ?? {}).filter( (rate) => !!rate.attributes?.taxRateExternalID && taxesToDelete.includes(rate.attributes?.taxRateExternalID), ); From af0bbb283d1ef35d5a9aa73888b77da4f86da908 Mon Sep 17 00:00:00 2001 From: daledah Date: Wed, 18 Sep 2024 12:07:26 +0700 Subject: [PATCH 3/7] fix: change undefined to null in onyx data --- src/libs/actions/TaxRate.ts | 4 ++-- src/types/onyx/Policy.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libs/actions/TaxRate.ts b/src/libs/actions/TaxRate.ts index c9073bd4a668..bbc63b60367b 100644 --- a/src/libs/actions/TaxRate.ts +++ b/src/libs/actions/TaxRate.ts @@ -308,8 +308,8 @@ function deletePolicyTaxes(policyID: string, taxesToDelete: string[]) { ...rate, attributes: { ...rate?.attributes, - taxRateExternalID: undefined, - taxClaimablePercentage: undefined, + taxRateExternalID: null, + taxClaimablePercentage: null, }, pendingFields: { taxRateExternalID: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, diff --git a/src/types/onyx/Policy.ts b/src/types/onyx/Policy.ts index f2604d723f05..c1c5e78126a0 100644 --- a/src/types/onyx/Policy.ts +++ b/src/types/onyx/Policy.ts @@ -11,10 +11,10 @@ type Unit = 'mi' | 'km'; /** Tax rate attributes of the policy distance rate */ type TaxRateAttributes = { /** Percentage of the tax that can be reclaimable */ - taxClaimablePercentage?: number; + taxClaimablePercentage?: number | null; /** External ID associated to this tax rate */ - taxRateExternalID?: string; + taxRateExternalID?: string | null; }; /** Model of policy distance rate */ From 6c5127e5fbd264f8dc9f10623ca2a72f2b2d7e17 Mon Sep 17 00:00:00 2001 From: daledah Date: Thu, 19 Sep 2024 14:19:12 +0700 Subject: [PATCH 4/7] fix: add missing key, refactor withOnyx --- src/libs/actions/TaxRate.ts | 2 +- .../PolicyDistanceRateDetailsPage.tsx | 20 +++++-------------- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/src/libs/actions/TaxRate.ts b/src/libs/actions/TaxRate.ts index bbc63b60367b..439e5131508f 100644 --- a/src/libs/actions/TaxRate.ts +++ b/src/libs/actions/TaxRate.ts @@ -316,7 +316,7 @@ function deletePolicyTaxes(policyID: string, taxesToDelete: string[]) { taxClaimablePercentage: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, }, }; - successRates[rateID] = {...rate, pendingFields: {taxRateExternalID: null}}; + successRates[rateID] = {...rate, pendingFields: {taxRateExternalID: null, taxClaimablePercentage: null}}; failureRates[rateID] = { ...rate, pendingFields: {taxRateExternalID: null, taxClaimablePercentage: null}, diff --git a/src/pages/workspace/distanceRates/PolicyDistanceRateDetailsPage.tsx b/src/pages/workspace/distanceRates/PolicyDistanceRateDetailsPage.tsx index 982e4799d781..0b7d925f2ee2 100644 --- a/src/pages/workspace/distanceRates/PolicyDistanceRateDetailsPage.tsx +++ b/src/pages/workspace/distanceRates/PolicyDistanceRateDetailsPage.tsx @@ -1,8 +1,7 @@ import type {StackScreenProps} from '@react-navigation/stack'; import React, {useState} from 'react'; import {View} from 'react-native'; -import {withOnyx} from 'react-native-onyx'; -import type {OnyxEntry} from 'react-native-onyx'; +import {useOnyx} from 'react-native-onyx'; import ConfirmModal from '@components/ConfirmModal'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import * as Expensicons from '@components/Icon/Expensicons'; @@ -26,22 +25,17 @@ import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import type SCREENS from '@src/SCREENS'; -import type * as OnyxTypes from '@src/types/onyx'; import type {Rate, TaxRateAttributes} from '@src/types/onyx/Policy'; -type PolicyDistanceRateDetailsPageOnyxProps = { - /** Policy details */ - policy: OnyxEntry; -}; +type PolicyDistanceRateDetailsPageProps = StackScreenProps; -type PolicyDistanceRateDetailsPageProps = PolicyDistanceRateDetailsPageOnyxProps & StackScreenProps; - -function PolicyDistanceRateDetailsPage({policy, route}: PolicyDistanceRateDetailsPageProps) { +function PolicyDistanceRateDetailsPage({route}: PolicyDistanceRateDetailsPageProps) { const styles = useThemeStyles(); const {translate} = useLocalize(); const [isWarningModalVisible, setIsWarningModalVisible] = useState(false); const [isDeleteModalVisible, setIsDeleteModalVisible] = useState(false); const policyID = route.params.policyID; + const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${route.params.policyID}`); const rateID = route.params.rateID; const customUnits = policy?.customUnits ?? {}; const customUnit = customUnits[Object.keys(customUnits)[0]]; @@ -209,8 +203,4 @@ function PolicyDistanceRateDetailsPage({policy, route}: PolicyDistanceRateDetail PolicyDistanceRateDetailsPage.displayName = 'PolicyDistanceRateDetailsPage'; -export default withOnyx({ - policy: { - key: ({route}) => `${ONYXKEYS.COLLECTION.POLICY}${route.params.policyID}`, - }, -})(PolicyDistanceRateDetailsPage); +export default PolicyDistanceRateDetailsPage; From a456b625745e23313b777d32bb37c18f9d12c49b Mon Sep 17 00:00:00 2001 From: daledah Date: Thu, 19 Sep 2024 23:47:28 +0700 Subject: [PATCH 5/7] refactor: onyx keys, types --- src/libs/actions/TaxRate.ts | 6 +++--- src/types/onyx/Policy.ts | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/libs/actions/TaxRate.ts b/src/libs/actions/TaxRate.ts index 439e5131508f..bf0087d26738 100644 --- a/src/libs/actions/TaxRate.ts +++ b/src/libs/actions/TaxRate.ts @@ -1,4 +1,4 @@ -import type {OnyxCollection} from 'react-native-onyx'; +import type {NullishDeep, OnyxCollection} from 'react-native-onyx'; import Onyx from 'react-native-onyx'; import type {FormOnyxValues} from '@components/Form/types'; import * as API from '@libs/API'; @@ -298,7 +298,7 @@ function deletePolicyTaxes(policyID: string, taxesToDelete: string[]) { const isForeignTaxRemoved = foreignTaxDefault && taxesToDelete.includes(foreignTaxDefault); - const optimisticRates: Record = {}; + const optimisticRates: Record> = {}; const successRates: Record = {}; const failureRates: Record = {}; @@ -318,7 +318,7 @@ function deletePolicyTaxes(policyID: string, taxesToDelete: string[]) { }; successRates[rateID] = {...rate, pendingFields: {taxRateExternalID: null, taxClaimablePercentage: null}}; failureRates[rateID] = { - ...rate, + attributes: {...rate?.attributes}, pendingFields: {taxRateExternalID: null, taxClaimablePercentage: null}, errorFields: { taxRateExternalID: ErrorUtils.getMicroSecondOnyxErrorWithTranslationKey('common.genericErrorMessage'), diff --git a/src/types/onyx/Policy.ts b/src/types/onyx/Policy.ts index 26095aec818b..95a9907526e4 100644 --- a/src/types/onyx/Policy.ts +++ b/src/types/onyx/Policy.ts @@ -11,10 +11,10 @@ type Unit = 'mi' | 'km'; /** Tax rate attributes of the policy distance rate */ type TaxRateAttributes = { /** Percentage of the tax that can be reclaimable */ - taxClaimablePercentage?: number | null; + taxClaimablePercentage?: number; /** External ID associated to this tax rate */ - taxRateExternalID?: string | null; + taxRateExternalID?: string; }; /** Model of policy distance rate */ From 4d94b1113a3bdea0bb2f7b3f901574c5cb7acf74 Mon Sep 17 00:00:00 2001 From: daledah Date: Fri, 20 Sep 2024 16:34:55 +0700 Subject: [PATCH 6/7] fix: clean onyx data --- src/libs/actions/TaxRate.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/libs/actions/TaxRate.ts b/src/libs/actions/TaxRate.ts index bf0087d26738..81f3dbbb3ab4 100644 --- a/src/libs/actions/TaxRate.ts +++ b/src/libs/actions/TaxRate.ts @@ -305,9 +305,7 @@ function deletePolicyTaxes(policyID: string, taxesToDelete: string[]) { ratesToUpdate.forEach((rate) => { const rateID = rate.customUnitRateID ?? ''; optimisticRates[rateID] = { - ...rate, attributes: { - ...rate?.attributes, taxRateExternalID: null, taxClaimablePercentage: null, }, @@ -316,7 +314,7 @@ function deletePolicyTaxes(policyID: string, taxesToDelete: string[]) { taxClaimablePercentage: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, }, }; - successRates[rateID] = {...rate, pendingFields: {taxRateExternalID: null, taxClaimablePercentage: null}}; + successRates[rateID] = {pendingFields: {taxRateExternalID: null, taxClaimablePercentage: null}}; failureRates[rateID] = { attributes: {...rate?.attributes}, pendingFields: {taxRateExternalID: null, taxClaimablePercentage: null}, From af3f047a6660480880218f9a627f57d0d436cdc1 Mon Sep 17 00:00:00 2001 From: daledah Date: Fri, 4 Oct 2024 01:19:12 +0700 Subject: [PATCH 7/7] fix: lint --- src/libs/actions/TaxRate.ts | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/libs/actions/TaxRate.ts b/src/libs/actions/TaxRate.ts index d3b2fdfc9e4e..0061497be073 100644 --- a/src/libs/actions/TaxRate.ts +++ b/src/libs/actions/TaxRate.ts @@ -289,7 +289,8 @@ function deletePolicyTaxes(policyID: string, taxesToDelete: string[]) { .sort((a, b) => a.localeCompare(b)) .at(0); const customUnits = policy?.customUnits ?? {}; - const ratesToUpdate = Object.values(customUnits?.[Object.keys(customUnits)[0]]?.rates ?? {}).filter( + const customUnitID = Object.keys(customUnits).at(0) ?? '-1'; + const ratesToUpdate = Object.values(customUnits?.[customUnitID]?.rates ?? {}).filter( (rate) => !!rate.attributes?.taxRateExternalID && taxesToDelete.includes(rate.attributes?.taxRateExternalID), ); @@ -341,8 +342,8 @@ function deletePolicyTaxes(policyID: string, taxesToDelete: string[]) { return acc; }, {}), }, - customUnits: policy.customUnits && { - [Object.keys(policy.customUnits)[0]]: { + customUnits: customUnits && { + [customUnitID]: { rates: optimisticRates, }, }, @@ -361,8 +362,8 @@ function deletePolicyTaxes(policyID: string, taxesToDelete: string[]) { return acc; }, {}), }, - customUnits: policy.customUnits && { - [Object.keys(policy.customUnits)[0]]: { + customUnits: customUnits && { + [customUnitID]: { rates: successRates, }, }, @@ -384,8 +385,8 @@ function deletePolicyTaxes(policyID: string, taxesToDelete: string[]) { return acc; }, {}), }, - customUnits: policy.customUnits && { - [Object.keys(policy.customUnits)[0]]: { + customUnits: customUnits && { + [customUnitID]: { rates: failureRates, }, },