Skip to content

Commit 2265ed6

Browse files
Migrate UnitSelectorModal to nav RHP
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1 parent eaaffe3 commit 2265ed6

10 files changed

Lines changed: 84 additions & 141 deletions

File tree

src/ROUTES.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2874,6 +2874,10 @@ const ROUTES = {
28742874
route: 'workspaces/:policyID/distance-rates/settings',
28752875
getRoute: (policyID: string) => `workspaces/${policyID}/distance-rates/settings` as const,
28762876
},
2877+
WORKSPACE_DISTANCE_RATES_UNIT: {
2878+
route: 'workspaces/:policyID/distance-rates/settings/unit',
2879+
getRoute: (policyID: string) => `workspaces/${policyID}/distance-rates/settings/unit` as const,
2880+
},
28772881
WORKSPACE_DISTANCE_RATE_DETAILS: {
28782882
route: 'workspaces/:policyID/distance-rates/:rateID',
28792883
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
@@ -849,6 +849,7 @@ const SCREENS = {
849849
CREATE_DISTANCE_RATE: 'Create_Distance_Rate',
850850
CREATE_DISTANCE_RATE_UPGRADE: 'Create_Distance_Rate_Upgrade',
851851
DISTANCE_RATES_SETTINGS: 'Distance_Rates_Settings',
852+
DISTANCE_RATES_UNIT: 'Distance_Rates_Unit',
852853
DISTANCE_RATE_DETAILS: 'Distance_Rate_Details',
853854
DISTANCE_RATE_EDIT: 'Distance_Rate_Edit',
854855
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
@@ -572,6 +572,7 @@ const SettingsModalStackNavigator = createModalStackNavigator<SettingsNavigatorP
572572
[SCREENS.WORKSPACE.CREATE_DISTANCE_RATE]: () => require<ReactComponentModule>('../../../../pages/workspace/distanceRates/CreateDistanceRatePage').default,
573573
[SCREENS.WORKSPACE.CREATE_DISTANCE_RATE_UPGRADE]: () => require<ReactComponentModule>('../../../../pages/workspace/distanceRates/CreateDistanceRatePage').default,
574574
[SCREENS.WORKSPACE.DISTANCE_RATES_SETTINGS]: () => require<ReactComponentModule>('../../../../pages/workspace/distanceRates/PolicyDistanceRatesSettingsPage').default,
575+
[SCREENS.WORKSPACE.DISTANCE_RATES_UNIT]: () => require<ReactComponentModule>('../../../../pages/workspace/distanceRates/PolicyDistanceRateUnitPage').default,
575576
[SCREENS.WORKSPACE.DISTANCE_RATE_DETAILS]: () => require<ReactComponentModule>('../../../../pages/workspace/distanceRates/PolicyDistanceRateDetailsPage').default,
576577
[SCREENS.WORKSPACE.DISTANCE_RATE_EDIT]: () => require<ReactComponentModule>('../../../../pages/workspace/distanceRates/PolicyDistanceRateEditPage').default,
577578
[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
@@ -224,6 +224,7 @@ const WORKSPACE_TO_RHP: Partial<Record<keyof WorkspaceSplitNavigatorParamList, s
224224
],
225225
[SCREENS.WORKSPACE.DISTANCE_RATES]: [
226226
SCREENS.WORKSPACE.DISTANCE_RATES_SETTINGS,
227+
SCREENS.WORKSPACE.DISTANCE_RATES_UNIT,
227228
SCREENS.WORKSPACE.DISTANCE_RATE_EDIT,
228229
SCREENS.WORKSPACE.DISTANCE_RATE_NAME_EDIT,
229230
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
@@ -1072,6 +1072,9 @@ const config: LinkingOptions<RootNavigatorParamList>['config'] = {
10721072
[SCREENS.WORKSPACE.DISTANCE_RATES_SETTINGS]: {
10731073
path: ROUTES.WORKSPACE_DISTANCE_RATES_SETTINGS.route,
10741074
},
1075+
[SCREENS.WORKSPACE.DISTANCE_RATES_UNIT]: {
1076+
path: ROUTES.WORKSPACE_DISTANCE_RATES_UNIT.route,
1077+
},
10751078
[SCREENS.WORKSPACE.DISTANCE_RATE_DETAILS]: {
10761079
path: ROUTES.WORKSPACE_DISTANCE_RATE_DETAILS.route,
10771080
},

src/libs/Navigation/types.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -705,6 +705,9 @@ type SettingsNavigatorParamList = {
705705
[SCREENS.WORKSPACE.DISTANCE_RATES_SETTINGS]: {
706706
policyID: string;
707707
};
708+
[SCREENS.WORKSPACE.DISTANCE_RATES_UNIT]: {
709+
policyID: string;
710+
};
708711
[SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_ONLINE_IMPORT]: {
709712
policyID: string;
710713
};
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import React from 'react';
2+
import HeaderWithBackButton from '@components/HeaderWithBackButton';
3+
import ScreenWrapper from '@components/ScreenWrapper';
4+
import type {UnitItemType} from '@components/UnitPicker';
5+
import UnitPicker from '@components/UnitPicker';
6+
import useLocalize from '@hooks/useLocalize';
7+
import useOnyx from '@hooks/useOnyx';
8+
import useThemeStyles from '@hooks/useThemeStyles';
9+
import Navigation from '@libs/Navigation/Navigation';
10+
import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
11+
import {getDistanceRateCustomUnit} from '@libs/PolicyUtils';
12+
import type {SettingsNavigatorParamList} from '@navigation/types';
13+
import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper';
14+
import {setPolicyDistanceRatesUnit} from '@userActions/Policy/DistanceRate';
15+
import CONST from '@src/CONST';
16+
import ONYXKEYS from '@src/ONYXKEYS';
17+
import type SCREENS from '@src/SCREENS';
18+
19+
type PolicyDistanceRateUnitPageProps = PlatformStackScreenProps<SettingsNavigatorParamList, typeof SCREENS.WORKSPACE.DISTANCE_RATES_UNIT>;
20+
21+
function PolicyDistanceRateUnitPage({route}: PolicyDistanceRateUnitPageProps) {
22+
const policyID = route.params.policyID;
23+
const styles = useThemeStyles();
24+
const {translate} = useLocalize();
25+
const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`);
26+
const customUnit = getDistanceRateCustomUnit(policy);
27+
28+
const onUnitSelected = (unit: UnitItemType) => {
29+
if (!customUnit) {
30+
return;
31+
}
32+
const attributes = {...customUnit.attributes, unit: unit.value};
33+
setPolicyDistanceRatesUnit(policyID, customUnit, {...customUnit, attributes});
34+
Navigation.goBack();
35+
};
36+
37+
return (
38+
<AccessOrNotFoundWrapper
39+
accessVariants={[CONST.POLICY.ACCESS_VARIANTS.ADMIN, CONST.POLICY.ACCESS_VARIANTS.PAID]}
40+
policyID={policyID}
41+
featureName={CONST.POLICY.MORE_FEATURES.ARE_DISTANCE_RATES_ENABLED}
42+
>
43+
<ScreenWrapper
44+
style={[styles.pb0]}
45+
includePaddingTop={false}
46+
enableEdgeToEdgeBottomSafeAreaPadding
47+
testID={PolicyDistanceRateUnitPage.displayName}
48+
>
49+
<HeaderWithBackButton title={translate('workspace.distanceRates.unit')} />
50+
<UnitPicker
51+
defaultValue={customUnit?.attributes?.unit}
52+
onOptionSelected={onUnitSelected}
53+
/>
54+
</ScreenWrapper>
55+
</AccessOrNotFoundWrapper>
56+
);
57+
}
58+
59+
PolicyDistanceRateUnitPage.displayName = 'PolicyDistanceRateUnitPage';
60+
61+
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)