From c440531b3ecaf115b34a69db30bf01463ab922f8 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Mon, 10 Jun 2024 15:51:52 +0700 Subject: [PATCH 01/10] fix: Track tax switch does not appear grayed out when enabled/disabled offline --- src/libs/actions/Policy/Policy.ts | 7 +++++-- .../distanceRates/PolicyDistanceRatesSettingsPage.tsx | 6 +++++- src/types/onyx/Policy.ts | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/libs/actions/Policy/Policy.ts b/src/libs/actions/Policy/Policy.ts index 0e168f973078..1dfed42ccde5 100644 --- a/src/libs/actions/Policy/Policy.ts +++ b/src/libs/actions/Policy/Policy.ts @@ -2791,7 +2791,7 @@ function enableDistanceRequestTax(policyID: string, customUnitName: string, cust }, }, pendingFields: { - customUnits: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, + taxEnabled: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, }, }, }, @@ -2802,7 +2802,7 @@ function enableDistanceRequestTax(policyID: string, customUnitName: string, cust key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, value: { pendingFields: { - customUnits: null, + taxEnabled: null, }, }, }, @@ -2815,6 +2815,9 @@ function enableDistanceRequestTax(policyID: string, customUnitName: string, cust customUnits: { [customUnitID]: { attributes: policy.customUnits ? policy.customUnits[customUnitID].attributes : null, + errorFields: { + taxEnabled: ErrorUtils.getMicroSecondOnyxError('common.genericErrorMessage'), + }, }, }, }, diff --git a/src/pages/workspace/distanceRates/PolicyDistanceRatesSettingsPage.tsx b/src/pages/workspace/distanceRates/PolicyDistanceRatesSettingsPage.tsx index 9080685d3080..f6a713df334c 100644 --- a/src/pages/workspace/distanceRates/PolicyDistanceRatesSettingsPage.tsx +++ b/src/pages/workspace/distanceRates/PolicyDistanceRatesSettingsPage.tsx @@ -122,7 +122,11 @@ function PolicyDistanceRatesSettingsPage({policy, policyCategories, route}: Poli /> )} - + {translate('workspace.distanceRates.trackTax')} diff --git a/src/types/onyx/Policy.ts b/src/types/onyx/Policy.ts index ad8575a81829..3b873807f454 100644 --- a/src/types/onyx/Policy.ts +++ b/src/types/onyx/Policy.ts @@ -904,7 +904,7 @@ type Policy = OnyxCommon.OnyxValueWithOfflineFeedback< /** Object containing all policy information necessary to connect with Spontana */ travelSettings?: WorkspaceTravelSettings; } & Partial, - 'generalSettings' | 'addWorkspaceRoom' | keyof ACHAccount + 'generalSettings' | 'addWorkspaceRoom' | keyof ACHAccount | keyof Attributes >; /** Stages of policy connection sync */ From da9699a4a6a7e2093cfed51c0a60e3576f8a09a7 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Mon, 10 Jun 2024 16:04:37 +0700 Subject: [PATCH 02/10] fix: move pending fields to custom units --- src/libs/actions/Policy/Policy.ts | 14 ++++--- .../PolicyDistanceRatesSettingsPage.tsx | 2 +- src/types/onyx/Policy.ts | 39 ++++++++++--------- 3 files changed, 31 insertions(+), 24 deletions(-) diff --git a/src/libs/actions/Policy/Policy.ts b/src/libs/actions/Policy/Policy.ts index 1dfed42ccde5..57a356a217b2 100644 --- a/src/libs/actions/Policy/Policy.ts +++ b/src/libs/actions/Policy/Policy.ts @@ -2788,11 +2788,11 @@ function enableDistanceRequestTax(policyID: string, customUnitName: string, cust customUnits: { [customUnitID]: { attributes, + pendingFields: { + taxEnabled: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, + }, }, }, - pendingFields: { - taxEnabled: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, - }, }, }, ], @@ -2801,8 +2801,12 @@ function enableDistanceRequestTax(policyID: string, customUnitName: string, cust onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, value: { - pendingFields: { - taxEnabled: null, + customUnits: { + [customUnitID]: { + pendingFields: { + taxEnabled: null, + }, + }, }, }, }, diff --git a/src/pages/workspace/distanceRates/PolicyDistanceRatesSettingsPage.tsx b/src/pages/workspace/distanceRates/PolicyDistanceRatesSettingsPage.tsx index f6a713df334c..988ecc5e480c 100644 --- a/src/pages/workspace/distanceRates/PolicyDistanceRatesSettingsPage.tsx +++ b/src/pages/workspace/distanceRates/PolicyDistanceRatesSettingsPage.tsx @@ -125,7 +125,7 @@ function PolicyDistanceRatesSettingsPage({policy, policyCategories, route}: Poli diff --git a/src/types/onyx/Policy.ts b/src/types/onyx/Policy.ts index 3b873807f454..e0cdda9ffa5b 100644 --- a/src/types/onyx/Policy.ts +++ b/src/types/onyx/Policy.ts @@ -57,31 +57,34 @@ type Attributes = { }; /** Policy custom unit */ -type CustomUnit = OnyxCommon.OnyxValueWithOfflineFeedback<{ - /** Custom unit name */ - name: string; +type CustomUnit = OnyxCommon.OnyxValueWithOfflineFeedback< + { + /** Custom unit name */ + name: string; - /** ID that identifies this custom unit */ - customUnitID: string; + /** ID that identifies this custom unit */ + customUnitID: string; - /** Contains custom attributes like unit, for this custom unit */ - attributes: Attributes; + /** Contains custom attributes like unit, for this custom unit */ + attributes: Attributes; - /** Distance rates using this custom unit */ - rates: Record; + /** Distance rates using this custom unit */ + rates: Record; - /** The default category in which this custom unit is used */ - defaultCategory?: string; + /** The default category in which this custom unit is used */ + defaultCategory?: string; - /** Whether this custom unit is enabled */ - enabled?: boolean; + /** Whether this custom unit is enabled */ + enabled?: boolean; - /** Error messages to show in UI */ - errors?: OnyxCommon.Errors; + /** Error messages to show in UI */ + errors?: OnyxCommon.Errors; - /** Form fields that triggered errors */ - errorFields?: OnyxCommon.ErrorFields; -}>; + /** Form fields that triggered errors */ + errorFields?: OnyxCommon.ErrorFields; + }, + keyof Attributes +>; /** Policy company address data */ type CompanyAddress = { From 8ba10d89452c4d6ee9d63df399bf795105dbaa37 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Fri, 28 Jun 2024 12:08:35 +0700 Subject: [PATCH 03/10] fix: typescript --- src/libs/actions/Policy/Policy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/actions/Policy/Policy.ts b/src/libs/actions/Policy/Policy.ts index 39461529f1f2..4e72044482ef 100644 --- a/src/libs/actions/Policy/Policy.ts +++ b/src/libs/actions/Policy/Policy.ts @@ -2750,7 +2750,7 @@ function enableDistanceRequestTax(policyID: string, customUnitName: string, cust value: { customUnits: { [customUnitID]: { - attributes: policy.customUnits ? policy.customUnits[customUnitID].attributes : null, + attributes: policy?.customUnits ? policy?.customUnits[customUnitID].attributes : null, errorFields: { taxEnabled: ErrorUtils.getMicroSecondOnyxErrorWithTranslationKey('common.genericErrorMessage'), }, From 0da09747b30202a4c7f2e24ad65ef11332e09013 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Fri, 28 Jun 2024 14:52:57 +0700 Subject: [PATCH 04/10] fix crash app --- .../workspace/distanceRates/PolicyDistanceRatesSettingsPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/workspace/distanceRates/PolicyDistanceRatesSettingsPage.tsx b/src/pages/workspace/distanceRates/PolicyDistanceRatesSettingsPage.tsx index 988ecc5e480c..81b86ddc9192 100644 --- a/src/pages/workspace/distanceRates/PolicyDistanceRatesSettingsPage.tsx +++ b/src/pages/workspace/distanceRates/PolicyDistanceRatesSettingsPage.tsx @@ -77,7 +77,7 @@ function PolicyDistanceRatesSettingsPage({policy, policyCategories, route}: Poli const onToggleTrackTax = (isOn: boolean) => { const attributes = {...customUnits[customUnitID].attributes, taxEnabled: isOn}; - Policy.enableDistanceRequestTax(policyID, customUnit.name, customUnitID, attributes); + Policy.enableDistanceRequestTax(policyID, customUnit?.name, customUnitID, attributes); }; return ( Date: Wed, 10 Jul 2024 22:59:55 +0700 Subject: [PATCH 05/10] fix: add offline page when isOffline and don't have data --- .../PolicyDistanceRatesSettingsPage.tsx | 140 +++++++++--------- 1 file changed, 74 insertions(+), 66 deletions(-) diff --git a/src/pages/workspace/distanceRates/PolicyDistanceRatesSettingsPage.tsx b/src/pages/workspace/distanceRates/PolicyDistanceRatesSettingsPage.tsx index b45191c6cb26..32a9b3a61fc7 100644 --- a/src/pages/workspace/distanceRates/PolicyDistanceRatesSettingsPage.tsx +++ b/src/pages/workspace/distanceRates/PolicyDistanceRatesSettingsPage.tsx @@ -3,6 +3,7 @@ import React from 'react'; import {View} from 'react-native'; import type {OnyxEntry} from 'react-native-onyx'; import {withOnyx} from 'react-native-onyx'; +import FullPageOfflineBlockingView from '@components/BlockingViews/FullPageOfflineBlockingView'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; import ScreenWrapper from '@components/ScreenWrapper'; @@ -13,6 +14,7 @@ import Text from '@components/Text'; import TextLink from '@components/TextLink'; import type {UnitItemType} from '@components/UnitPicker'; import useLocalize from '@hooks/useLocalize'; +import useNetwork from '@hooks/useNetwork'; import useThemeStyles from '@hooks/useThemeStyles'; import * as ErrorUtils from '@libs/ErrorUtils'; import Navigation from '@libs/Navigation/Navigation'; @@ -42,6 +44,7 @@ type PolicyDistanceRatesSettingsPageOnyxProps = { type PolicyDistanceRatesSettingsPageProps = PolicyDistanceRatesSettingsPageOnyxProps & StackScreenProps; function PolicyDistanceRatesSettingsPage({policy, policyCategories, route}: PolicyDistanceRatesSettingsPageProps) { + const {isOffline} = useNetwork(); const styles = useThemeStyles(); const {translate} = useLocalize(); const policyID = route.params.policyID; @@ -79,6 +82,76 @@ function PolicyDistanceRatesSettingsPage({policy, policyCategories, route}: Poli const attributes = {...customUnits[customUnitID].attributes, taxEnabled: isOn}; Policy.enableDistanceRequestTax(policyID, customUnit?.name, customUnitID, attributes); }; + + const getDistanceRatesSetting = () => ( + + + clearErrorFields('attributes')} + > + + + {policy?.areCategoriesEnabled && OptionsListUtils.hasEnabledOptions(policyCategories ?? {}) && ( + clearErrorFields('defaultCategory')} + > + + + )} + + + + {translate('workspace.distanceRates.trackTax')} + + + + {!isPolicyTrackTaxEnabled && ( + + + {translate('workspace.distanceRates.taxFeatureNotEnabledMessage')} + { + Navigation.dismissModal(); + Navigation.goBack(ROUTES.WORKSPACE_MORE_FEATURES.getRoute(policyID)); + }} + > + {translate('workspace.common.moreFeatures')} + + {translate('workspace.distanceRates.changePromptMessage')} + + + )} + + + + ); + return ( - - - clearErrorFields('attributes')} - > - - - {policy?.areCategoriesEnabled && OptionsListUtils.hasEnabledOptions(policyCategories ?? {}) && ( - clearErrorFields('defaultCategory')} - > - - - )} - - - - {translate('workspace.distanceRates.trackTax')} - - - - {!isPolicyTrackTaxEnabled && ( - - - {translate('workspace.distanceRates.taxFeatureNotEnabledMessage')} - { - Navigation.dismissModal(); - Navigation.goBack(ROUTES.WORKSPACE_MORE_FEATURES.getRoute(policyID)); - }} - > - {translate('workspace.common.moreFeatures')} - - {translate('workspace.distanceRates.changePromptMessage')} - - - )} - - - + {!customUnit && isOffline ? {getDistanceRatesSetting()} : getDistanceRatesSetting()} ); From 5c0150c84ff2f593e1b2ebe74737a1e46f63eab1 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Wed, 17 Jul 2024 13:47:15 +0700 Subject: [PATCH 06/10] clean code --- .../PolicyDistanceRatesSettingsPage.tsx | 142 +++++++++--------- 1 file changed, 70 insertions(+), 72 deletions(-) diff --git a/src/pages/workspace/distanceRates/PolicyDistanceRatesSettingsPage.tsx b/src/pages/workspace/distanceRates/PolicyDistanceRatesSettingsPage.tsx index 32a9b3a61fc7..48f52f4a5e99 100644 --- a/src/pages/workspace/distanceRates/PolicyDistanceRatesSettingsPage.tsx +++ b/src/pages/workspace/distanceRates/PolicyDistanceRatesSettingsPage.tsx @@ -14,7 +14,6 @@ import Text from '@components/Text'; import TextLink from '@components/TextLink'; import type {UnitItemType} from '@components/UnitPicker'; import useLocalize from '@hooks/useLocalize'; -import useNetwork from '@hooks/useNetwork'; import useThemeStyles from '@hooks/useThemeStyles'; import * as ErrorUtils from '@libs/ErrorUtils'; import Navigation from '@libs/Navigation/Navigation'; @@ -44,7 +43,6 @@ type PolicyDistanceRatesSettingsPageOnyxProps = { type PolicyDistanceRatesSettingsPageProps = PolicyDistanceRatesSettingsPageOnyxProps & StackScreenProps; function PolicyDistanceRatesSettingsPage({policy, policyCategories, route}: PolicyDistanceRatesSettingsPageProps) { - const {isOffline} = useNetwork(); const styles = useThemeStyles(); const {translate} = useLocalize(); const policyID = route.params.policyID; @@ -58,6 +56,8 @@ function PolicyDistanceRatesSettingsPage({policy, policyCategories, route}: Poli const defaultUnit = customUnits[customUnitID]?.attributes.unit; const errorFields = customUnits[customUnitID]?.errorFields; + const FullPageBlockingView = !customUnit ? FullPageOfflineBlockingView : View; + const setNewUnit = (unit: UnitItemType) => { const attributes = {...customUnits[customUnitID].attributes, unit: unit.value}; DistanceRate.setPolicyDistanceRatesUnit(policyID, customUnit, {...customUnit, attributes}); @@ -83,75 +83,6 @@ function PolicyDistanceRatesSettingsPage({policy, policyCategories, route}: Poli Policy.enableDistanceRequestTax(policyID, customUnit?.name, customUnitID, attributes); }; - const getDistanceRatesSetting = () => ( - - - clearErrorFields('attributes')} - > - - - {policy?.areCategoriesEnabled && OptionsListUtils.hasEnabledOptions(policyCategories ?? {}) && ( - clearErrorFields('defaultCategory')} - > - - - )} - - - - {translate('workspace.distanceRates.trackTax')} - - - - {!isPolicyTrackTaxEnabled && ( - - - {translate('workspace.distanceRates.taxFeatureNotEnabledMessage')} - { - Navigation.dismissModal(); - Navigation.goBack(ROUTES.WORKSPACE_MORE_FEATURES.getRoute(policyID)); - }} - > - {translate('workspace.common.moreFeatures')} - - {translate('workspace.distanceRates.changePromptMessage')} - - - )} - - - - ); - return ( - {!customUnit && isOffline ? {getDistanceRatesSetting()} : getDistanceRatesSetting()} + + + + clearErrorFields('attributes')} + > + + + {policy?.areCategoriesEnabled && OptionsListUtils.hasEnabledOptions(policyCategories ?? {}) && ( + clearErrorFields('defaultCategory')} + > + + + )} + + + + {translate('workspace.distanceRates.trackTax')} + + + + {!isPolicyTrackTaxEnabled && ( + + + {translate('workspace.distanceRates.taxFeatureNotEnabledMessage')} + { + Navigation.dismissModal(); + Navigation.goBack(ROUTES.WORKSPACE_MORE_FEATURES.getRoute(policyID)); + }} + > + {translate('workspace.common.moreFeatures')} + + {translate('workspace.distanceRates.changePromptMessage')} + + + )} + + + + ); From 17949c55d4b349c93a250c07a837f6bfc74edba1 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Fri, 19 Jul 2024 11:14:00 +0700 Subject: [PATCH 07/10] fix crash app bug --- src/pages/workspace/distanceRates/UnitSelector/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/workspace/distanceRates/UnitSelector/index.tsx b/src/pages/workspace/distanceRates/UnitSelector/index.tsx index 166d0df786a1..a65a3c9f153f 100644 --- a/src/pages/workspace/distanceRates/UnitSelector/index.tsx +++ b/src/pages/workspace/distanceRates/UnitSelector/index.tsx @@ -41,7 +41,7 @@ function UnitSelector({defaultValue, wrapperStyle, label, setNewUnit}: UnitSelec hidePickerModal(); }; - const title = Str.recapitalize(translate(getUnitTranslationKey(defaultValue))); + const title = defaultValue ? Str.recapitalize(translate(getUnitTranslationKey(defaultValue))) : ''; return ( From 021273f983008597967a98e2576562142d19766d Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Wed, 24 Jul 2024 14:59:09 +0700 Subject: [PATCH 08/10] fix: crash app --- .../PolicyDistanceRatesSettingsPage.tsx | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/pages/workspace/distanceRates/PolicyDistanceRatesSettingsPage.tsx b/src/pages/workspace/distanceRates/PolicyDistanceRatesSettingsPage.tsx index 48f52f4a5e99..04411cb15c1f 100644 --- a/src/pages/workspace/distanceRates/PolicyDistanceRatesSettingsPage.tsx +++ b/src/pages/workspace/distanceRates/PolicyDistanceRatesSettingsPage.tsx @@ -53,7 +53,7 @@ function PolicyDistanceRatesSettingsPage({policy, policyCategories, route}: Poli const isPolicyTrackTaxEnabled = !!policy?.tax?.trackingEnabled; const defaultCategory = customUnits[customUnitID]?.defaultCategory; - const defaultUnit = customUnits[customUnitID]?.attributes.unit; + const defaultUnit = customUnits[customUnitID]?.attributes?.unit; const errorFields = customUnits[customUnitID]?.errorFields; const FullPageBlockingView = !customUnit ? FullPageOfflineBlockingView : View; @@ -98,19 +98,21 @@ function PolicyDistanceRatesSettingsPage({policy, policyCategories, route}: Poli - clearErrorFields('attributes')} - > - - + {defaultUnit && ( + clearErrorFields('attributes')} + > + + + )} {policy?.areCategoriesEnabled && OptionsListUtils.hasEnabledOptions(policyCategories ?? {}) && ( Date: Fri, 9 Aug 2024 23:31:43 +0700 Subject: [PATCH 09/10] add full page blocking view --- .../distanceRates/CreateDistanceRatePage.tsx | 46 +++++++++++-------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/src/pages/workspace/distanceRates/CreateDistanceRatePage.tsx b/src/pages/workspace/distanceRates/CreateDistanceRatePage.tsx index f86a5a1dbb73..b2dca63ecd34 100644 --- a/src/pages/workspace/distanceRates/CreateDistanceRatePage.tsx +++ b/src/pages/workspace/distanceRates/CreateDistanceRatePage.tsx @@ -1,8 +1,10 @@ import type {StackScreenProps} from '@react-navigation/stack'; import React, {useCallback} from 'react'; +import {View} from 'react-native'; import type {OnyxEntry} from 'react-native-onyx'; import {withOnyx} from 'react-native-onyx'; import AmountForm from '@components/AmountForm'; +import FullPageOfflineBlockingView from '@components/BlockingViews/FullPageOfflineBlockingView'; import FormProvider from '@components/Form/FormProvider'; import InputWrapperWithRef from '@components/Form/InputWrapper'; import type {FormOnyxValues} from '@components/Form/types'; @@ -40,6 +42,8 @@ function CreateDistanceRatePage({policy, route}: CreateDistanceRatePageProps) { const customUnitRateID = generateCustomUnitID(); const {inputCallbackRef} = useAutoFocusInput(); + const FullPageBlockingView = !customUnitID ? FullPageOfflineBlockingView : View; + const validate = useCallback( (values: FormOnyxValues) => validateRateValue(values, currency, toLocaleDigit), [currency, toLocaleDigit], @@ -71,26 +75,28 @@ function CreateDistanceRatePage({policy, route}: CreateDistanceRatePageProps) { shouldEnableMaxHeight > - - - + + + + + ); From f9775a20faaba369058671dfa8f4f0e67b3c327f Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Tue, 13 Aug 2024 15:19:47 +0700 Subject: [PATCH 10/10] make default value as optional --- src/components/UnitPicker.tsx | 2 +- .../workspace/distanceRates/UnitSelector/UnitSelectorModal.tsx | 2 +- src/pages/workspace/distanceRates/UnitSelector/index.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/UnitPicker.tsx b/src/components/UnitPicker.tsx index 02f056e04dad..19ee25c98529 100644 --- a/src/components/UnitPicker.tsx +++ b/src/components/UnitPicker.tsx @@ -15,7 +15,7 @@ type UnitItemType = { }; type UnitPickerProps = { - defaultValue: Unit; + defaultValue?: Unit; onOptionSelected: (unit: UnitItemType) => void; }; diff --git a/src/pages/workspace/distanceRates/UnitSelector/UnitSelectorModal.tsx b/src/pages/workspace/distanceRates/UnitSelector/UnitSelectorModal.tsx index 5a9f5e7c6ea1..34eb21ce19c4 100644 --- a/src/pages/workspace/distanceRates/UnitSelector/UnitSelectorModal.tsx +++ b/src/pages/workspace/distanceRates/UnitSelector/UnitSelectorModal.tsx @@ -13,7 +13,7 @@ type UnitSelectorModalProps = { isVisible: boolean; /** Selected unit */ - currentUnit: Unit; + currentUnit?: Unit; /** Function to call when the user selects a unit */ onUnitSelected: (value: UnitItemType) => void; diff --git a/src/pages/workspace/distanceRates/UnitSelector/index.tsx b/src/pages/workspace/distanceRates/UnitSelector/index.tsx index a65a3c9f153f..883ef0a5e593 100644 --- a/src/pages/workspace/distanceRates/UnitSelector/index.tsx +++ b/src/pages/workspace/distanceRates/UnitSelector/index.tsx @@ -14,7 +14,7 @@ type UnitSelectorProps = { setNewUnit: (value: UnitItemType) => void; /** Currently selected unit */ - defaultValue: Unit; + defaultValue?: Unit; /** Label to display on field */ label: string;