Skip to content

Commit fd6ba76

Browse files
authored
Merge pull request Expensify#90984 from yusufdeveloper2903/@yusufdeveloper2903/migrate-unit-selector-modal
Migrate Unit selector to navigator-driven RHP (Expensify#90467)
2 parents 54e5655 + 8296901 commit fd6ba76

10 files changed

Lines changed: 92 additions & 141 deletions

File tree

src/ROUTES.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2901,6 +2901,10 @@ const ROUTES = {
29012901
route: 'workspaces/:policyID/distance-rates/settings',
29022902
getRoute: (policyID: string) => `workspaces/${policyID}/distance-rates/settings` as const,
29032903
},
2904+
WORKSPACE_DISTANCE_RATES_UNIT: {
2905+
route: 'workspaces/:policyID/distance-rates/settings/unit',
2906+
getRoute: (policyID: string) => `workspaces/${policyID}/distance-rates/settings/unit` as const,
2907+
},
29042908
WORKSPACE_DISTANCE_RATE_DETAILS: {
29052909
route: 'workspaces/:policyID/distance-rates/:rateID',
29062910
getRoute: (policyID: string, rateID: string) => `workspaces/${policyID}/distance-rates/${rateID}` as const,

src/SCREENS.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -854,6 +854,7 @@ const SCREENS = {
854854
CREATE_DISTANCE_RATE: 'Create_Distance_Rate',
855855
CREATE_DISTANCE_RATE_UPGRADE: 'Create_Distance_Rate_Upgrade',
856856
DISTANCE_RATES_SETTINGS: 'Distance_Rates_Settings',
857+
DISTANCE_RATES_UNIT: 'Distance_Rates_Unit',
857858
DISTANCE_RATE_DETAILS: 'Distance_Rate_Details',
858859
DISTANCE_RATE_EDIT: 'Distance_Rate_Edit',
859860
DISTANCE_RATE_NAME_EDIT: 'Distance_Rate_Name_Edit',

src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -619,6 +619,7 @@ const SettingsModalStackNavigator = createModalStackNavigator<SettingsNavigatorP
619619
[SCREENS.WORKSPACE.CREATE_DISTANCE_RATE]: () => require<ReactComponentModule>('../../../../pages/workspace/distanceRates/CreateDistanceRatePage').default,
620620
[SCREENS.WORKSPACE.CREATE_DISTANCE_RATE_UPGRADE]: () => require<ReactComponentModule>('../../../../pages/workspace/distanceRates/CreateDistanceRatePage').default,
621621
[SCREENS.WORKSPACE.DISTANCE_RATES_SETTINGS]: () => require<ReactComponentModule>('../../../../pages/workspace/distanceRates/PolicyDistanceRatesSettingsPage').default,
622+
[SCREENS.WORKSPACE.DISTANCE_RATES_UNIT]: () => require<ReactComponentModule>('../../../../pages/workspace/distanceRates/PolicyDistanceRateUnitPage').default,
622623
[SCREENS.WORKSPACE.DISTANCE_RATE_DETAILS]: () => require<ReactComponentModule>('../../../../pages/workspace/distanceRates/PolicyDistanceRateDetailsPage').default,
623624
[SCREENS.WORKSPACE.DISTANCE_RATE_EDIT]: () => require<ReactComponentModule>('../../../../pages/workspace/distanceRates/PolicyDistanceRateEditPage').default,
624625
[SCREENS.WORKSPACE.DISTANCE_RATE_NAME_EDIT]: () => require<ReactComponentModule>('../../../../pages/workspace/distanceRates/PolicyDistanceRateNameEditPage').default,

src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,7 @@ const WORKSPACE_TO_RHP: Partial<Record<keyof WorkspaceSplitNavigatorParamList, s
249249
],
250250
[SCREENS.WORKSPACE.DISTANCE_RATES]: [
251251
SCREENS.WORKSPACE.DISTANCE_RATES_SETTINGS,
252+
SCREENS.WORKSPACE.DISTANCE_RATES_UNIT,
252253
SCREENS.WORKSPACE.DISTANCE_RATE_EDIT,
253254
SCREENS.WORKSPACE.DISTANCE_RATE_NAME_EDIT,
254255
SCREENS.WORKSPACE.DISTANCE_RATE_TAX_RECLAIMABLE_ON_EDIT,

src/libs/Navigation/linkingConfig/config.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1076,6 +1076,9 @@ const config: LinkingOptions<RootNavigatorParamList>['config'] = {
10761076
[SCREENS.WORKSPACE.DISTANCE_RATES_SETTINGS]: {
10771077
path: ROUTES.WORKSPACE_DISTANCE_RATES_SETTINGS.route,
10781078
},
1079+
[SCREENS.WORKSPACE.DISTANCE_RATES_UNIT]: {
1080+
path: ROUTES.WORKSPACE_DISTANCE_RATES_UNIT.route,
1081+
},
10791082
[SCREENS.WORKSPACE.DISTANCE_RATE_DETAILS]: {
10801083
path: ROUTES.WORKSPACE_DISTANCE_RATE_DETAILS.route,
10811084
},

src/libs/Navigation/types.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -698,6 +698,9 @@ type SettingsNavigatorParamList = {
698698
[SCREENS.WORKSPACE.DISTANCE_RATES_SETTINGS]: {
699699
policyID: string;
700700
};
701+
[SCREENS.WORKSPACE.DISTANCE_RATES_UNIT]: {
702+
policyID: string;
703+
};
701704
[SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_ONLINE_IMPORT]: {
702705
policyID: string;
703706
};
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import React from 'react';
2+
import {View} from 'react-native';
3+
import FullPageOfflineBlockingView from '@components/BlockingViews/FullPageOfflineBlockingView';
4+
import HeaderWithBackButton from '@components/HeaderWithBackButton';
5+
import ScreenWrapper from '@components/ScreenWrapper';
6+
import type {UnitItemType} from '@components/UnitPicker';
7+
import UnitPicker from '@components/UnitPicker';
8+
import useLocalize from '@hooks/useLocalize';
9+
import useOnyx from '@hooks/useOnyx';
10+
import useThemeStyles from '@hooks/useThemeStyles';
11+
import Navigation from '@libs/Navigation/Navigation';
12+
import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
13+
import {getDistanceRateCustomUnit} from '@libs/PolicyUtils';
14+
import type {SettingsNavigatorParamList} from '@navigation/types';
15+
import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper';
16+
import {setPolicyDistanceRatesUnit} from '@userActions/Policy/DistanceRate';
17+
import CONST from '@src/CONST';
18+
import ONYXKEYS from '@src/ONYXKEYS';
19+
import ROUTES from '@src/ROUTES';
20+
import type SCREENS from '@src/SCREENS';
21+
22+
type PolicyDistanceRateUnitPageProps = PlatformStackScreenProps<SettingsNavigatorParamList, typeof SCREENS.WORKSPACE.DISTANCE_RATES_UNIT>;
23+
24+
function PolicyDistanceRateUnitPage({route}: PolicyDistanceRateUnitPageProps) {
25+
const policyID = route.params.policyID;
26+
const styles = useThemeStyles();
27+
const {translate} = useLocalize();
28+
const [customUnit] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {selector: (policy) => getDistanceRateCustomUnit(policy)});
29+
30+
const FullPageBlockingView = !customUnit ? FullPageOfflineBlockingView : View;
31+
32+
const onUnitSelected = (unit: UnitItemType) => {
33+
if (!customUnit) {
34+
return;
35+
}
36+
const attributes = {...customUnit.attributes, unit: unit.value};
37+
setPolicyDistanceRatesUnit(policyID, customUnit, {...customUnit, attributes});
38+
Navigation.goBack(ROUTES.WORKSPACE_DISTANCE_RATES_SETTINGS.getRoute(policyID));
39+
};
40+
41+
return (
42+
<AccessOrNotFoundWrapper
43+
accessVariants={[CONST.POLICY.ACCESS_VARIANTS.ADMIN, CONST.POLICY.ACCESS_VARIANTS.PAID]}
44+
policyID={policyID}
45+
featureName={CONST.POLICY.MORE_FEATURES.ARE_DISTANCE_RATES_ENABLED}
46+
>
47+
<ScreenWrapper
48+
style={styles.pb0}
49+
enableEdgeToEdgeBottomSafeAreaPadding
50+
testID="PolicyDistanceRateUnitPage"
51+
>
52+
<HeaderWithBackButton
53+
title={translate('workspace.distanceRates.unit')}
54+
onBackButtonPress={() => Navigation.goBack(ROUTES.WORKSPACE_DISTANCE_RATES_SETTINGS.getRoute(policyID))}
55+
/>
56+
<FullPageBlockingView style={customUnit ? styles.flexGrow1 : []}>
57+
{!!customUnit && (
58+
<UnitPicker
59+
defaultValue={customUnit.attributes?.unit}
60+
onOptionSelected={onUnitSelected}
61+
/>
62+
)}
63+
</FullPageBlockingView>
64+
</ScreenWrapper>
65+
</AccessOrNotFoundWrapper>
66+
);
67+
}
68+
69+
export default PolicyDistanceRateUnitPage;

src/pages/workspace/distanceRates/PolicyDistanceRatesSettingsPage.tsx

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
1+
import {Str} from 'expensify-common';
12
import React from 'react';
23
import {View} from 'react-native';
34
import FullPageOfflineBlockingView from '@components/BlockingViews/FullPageOfflineBlockingView';
45
import CustomUnitDefaultCategorySelector from '@components/CustomUnitDefaultCategorySelector';
56
import HeaderWithBackButton from '@components/HeaderWithBackButton';
7+
import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription';
68
import OfflineWithFeedback from '@components/OfflineWithFeedback';
79
import RenderHTML from '@components/RenderHTML';
810
import ScreenWrapper from '@components/ScreenWrapper';
911
import ScrollView from '@components/ScrollView';
1012
import Switch from '@components/Switch';
1113
import Text from '@components/Text';
12-
import type {UnitItemType} from '@components/UnitPicker';
1314
import useLocalize from '@hooks/useLocalize';
1415
import useOnyx from '@hooks/useOnyx';
1516
import useThemeStyles from '@hooks/useThemeStyles';
@@ -18,16 +19,16 @@ import Navigation from '@libs/Navigation/Navigation';
1819
import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
1920
import {hasEnabledOptions} from '@libs/OptionsListUtils';
2021
import {getDistanceRateCustomUnit} from '@libs/PolicyUtils';
22+
import {getUnitTranslationKey} from '@libs/WorkspacesSettingsUtils';
2123
import type {SettingsNavigatorParamList} from '@navigation/types';
2224
import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper';
23-
import {clearPolicyDistanceRatesErrorFields, setPolicyDistanceRatesUnit} from '@userActions/Policy/DistanceRate';
25+
import {clearPolicyDistanceRatesErrorFields} from '@userActions/Policy/DistanceRate';
2426
import {enableDistanceRequestTax} from '@userActions/Policy/Policy';
2527
import CONST from '@src/CONST';
2628
import ONYXKEYS from '@src/ONYXKEYS';
2729
import ROUTES from '@src/ROUTES';
2830
import type SCREENS from '@src/SCREENS';
2931
import type {CustomUnit} from '@src/types/onyx/Policy';
30-
import UnitSelector from './UnitSelector';
3132

3233
type PolicyDistanceRatesSettingsPageProps = PlatformStackScreenProps<SettingsNavigatorParamList, typeof SCREENS.WORKSPACE.DISTANCE_RATES_SETTINGS>;
3334

@@ -48,14 +49,6 @@ function PolicyDistanceRatesSettingsPage({route}: PolicyDistanceRatesSettingsPag
4849

4950
const FullPageBlockingView = !customUnit ? FullPageOfflineBlockingView : View;
5051

51-
const setNewUnit = (unit: UnitItemType) => {
52-
if (!customUnit) {
53-
return;
54-
}
55-
const attributes = {...customUnit?.attributes, unit: unit.value};
56-
setPolicyDistanceRatesUnit(policyID, customUnit, {...customUnit, attributes});
57-
};
58-
5952
const clearErrorFields = (fieldName: keyof CustomUnit) => {
6053
if (!customUnit?.customUnitID) {
6154
return;
@@ -98,11 +91,13 @@ function PolicyDistanceRatesSettingsPage({route}: PolicyDistanceRatesSettingsPag
9891
errorRowStyles={styles.mh5}
9992
onClose={() => clearErrorFields('attributes')}
10093
>
101-
<UnitSelector
102-
label={translate('workspace.distanceRates.unit')}
103-
defaultValue={defaultUnit}
94+
<MenuItemWithTopDescription
95+
shouldShowRightIcon
96+
title={defaultUnit ? Str.recapitalize(translate(getUnitTranslationKey(defaultUnit))) : ''}
97+
description={translate('workspace.distanceRates.unit')}
98+
onPress={() => Navigation.navigate(ROUTES.WORKSPACE_DISTANCE_RATES_UNIT.getRoute(policyID))}
10499
wrapperStyle={[styles.ph5, styles.mt3]}
105-
setNewUnit={setNewUnit}
100+
sentryLabel={CONST.SENTRY_LABEL.WORKSPACE.DISTANCE_RATES.UNIT_SELECTOR}
106101
/>
107102
</OfflineWithFeedback>
108103
)}

src/pages/workspace/distanceRates/UnitSelector/UnitSelectorModal.tsx

Lines changed: 0 additions & 58 deletions
This file was deleted.

src/pages/workspace/distanceRates/UnitSelector/index.tsx

Lines changed: 0 additions & 68 deletions
This file was deleted.

0 commit comments

Comments
 (0)