diff --git a/src/ROUTES.ts b/src/ROUTES.ts index f585920b058f..cf895b813f9e 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -503,13 +503,37 @@ const DYNAMIC_ROUTES = { }, SETTINGS_TAG_APPROVER: { path: 'tag-approver', - entryScreens: [SCREENS.SETTINGS_TAGS.SETTINGS_TAG_SETTINGS], + entryScreens: [SCREENS.SETTINGS_TAGS.DYNAMIC_SETTINGS_TAG_SETTINGS], }, SETTINGS_TAG_LIST_VIEW: { path: 'tag-list/:orderWeight', entryScreens: [SCREENS.SETTINGS_TAGS.SETTINGS_TAGS_ROOT], getRoute: (orderWeight: number) => `tag-list/${orderWeight}`, }, + SETTINGS_TAG_SETTINGS: { + path: 'tag-settings/:orderWeight/:tagName', + entryScreens: [SCREENS.SETTINGS_TAGS.SETTINGS_TAGS_ROOT, SCREENS.SETTINGS_TAGS.DYNAMIC_SETTINGS_TAG_LIST_VIEW], + getRoute: (orderWeight: number, tagName: string) => `tag-settings/${orderWeight}/${encodeURIComponent(tagName)}`, + }, + SETTINGS_TAGS_EDIT: { + path: 'edit/:orderWeight', + entryScreens: [SCREENS.SETTINGS_TAGS.SETTINGS_TAGS_ROOT, SCREENS.SETTINGS_TAGS.SETTINGS_TAGS_SETTINGS, SCREENS.SETTINGS_TAGS.DYNAMIC_SETTINGS_TAG_LIST_VIEW], + getRoute: (orderWeight: number) => `edit/${orderWeight}`, + }, + SETTINGS_TAG_EDIT: { + path: 'tag-edit/:orderWeight/:tagName', + entryScreens: [SCREENS.SETTINGS_TAGS.DYNAMIC_SETTINGS_TAG_SETTINGS], + getRoute: (orderWeight: number, tagName: string) => `tag-edit/${orderWeight}/${encodeURIComponent(tagName)}`, + }, + SETTINGS_TAG_GL_CODE: { + path: 'gl-code/:orderWeight/:tagName', + entryScreens: [SCREENS.SETTINGS_TAGS.DYNAMIC_SETTINGS_TAG_SETTINGS], + getRoute: (orderWeight: number, tagName: string) => `gl-code/${orderWeight}/${encodeURIComponent(tagName)}`, + }, + SETTINGS_TAG_CREATE: { + path: 'tag-new', + entryScreens: [SCREENS.SETTINGS_TAGS.SETTINGS_TAGS_ROOT], + }, DETAILS_CONSTANT_PICKER: { path: 'constant-picker', entryScreens: [SCREENS.DEBUG.REPORT, SCREENS.DEBUG.REPORT_ACTION, SCREENS.DEBUG.TRANSACTION, SCREENS.DEBUG.TRANSACTION_VIOLATION], @@ -1672,31 +1696,6 @@ const ROUTES = { getRoute: (policyID: string, backTo = '') => getUrlWithBackToParam(`settings/${policyID}/tags/settings` as const, backTo), }, - SETTINGS_TAGS_EDIT: { - route: 'settings/:policyID/tags/:orderWeight/edit', - - getRoute: (policyID: string, orderWeight: number, backTo = '') => getUrlWithBackToParam(`settings/${policyID}/tags/${orderWeight}/edit` as const, backTo), - }, - SETTINGS_TAG_CREATE: { - route: 'settings/:policyID/tags/new', - - getRoute: (policyID: string, backTo = '') => getUrlWithBackToParam(`settings/${policyID}/tags/new` as const, backTo), - }, - SETTINGS_TAG_EDIT: { - route: 'settings/:policyID/tag/:orderWeight/:tagName/edit', - getRoute: (policyID: string, orderWeight: number, tagName: string, backTo = '') => - getUrlWithBackToParam(`settings/${policyID}/tag/${orderWeight}/${encodeURIComponent(tagName)}/edit` as const, backTo), - }, - SETTINGS_TAG_SETTINGS: { - route: 'settings/:policyID/tag/:orderWeight/:tagName', - getRoute: (policyID: string, orderWeight: number, tagName: string, backTo = '') => - getUrlWithBackToParam(`settings/${policyID}/tag/${orderWeight}/${encodeURIComponent(tagName)}` as const, backTo), - }, - SETTINGS_TAG_GL_CODE: { - route: 'settings/:policyID/tag/:orderWeight/:tagName/gl-code', - getRoute: (policyID: string, orderWeight: number, tagName: string, backTo = '') => - getUrlWithBackToParam(`settings/${policyID}/tag/${orderWeight}/${encodeURIComponent(tagName)}/gl-code` as const, backTo), - }, SETTINGS_TAGS_IMPORT: { route: 'settings/:policyID/tags/import', diff --git a/src/SCREENS.ts b/src/SCREENS.ts index c69f1d43e5e2..2c072eb369d5 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -473,13 +473,13 @@ const SCREENS = { SETTINGS_TAGS: { SETTINGS_TAGS_ROOT: 'Settings_Tags', SETTINGS_TAGS_SETTINGS: 'Settings_Tags_Settings', - SETTINGS_TAGS_EDIT: 'Settings_Tags_Edit', - SETTINGS_TAG_CREATE: 'Settings_Tag_Create', - SETTINGS_TAG_EDIT: 'Settings_Tag_Edit', - SETTINGS_TAG_SETTINGS: 'Settings_Tag_Settings', + DYNAMIC_SETTINGS_TAGS_EDIT: 'Dynamic_Settings_Tags_Edit', + DYNAMIC_SETTINGS_TAG_CREATE: 'Dynamic_Settings_Tag_Create', + DYNAMIC_SETTINGS_TAG_EDIT: 'Dynamic_Settings_Tag_Edit', + DYNAMIC_SETTINGS_TAG_GL_CODE: 'Dynamic_Settings_Tag_GL_Code', + DYNAMIC_SETTINGS_TAG_SETTINGS: 'Dynamic_Settings_Tag_Settings', DYNAMIC_SETTINGS_TAG_APPROVER: 'Dynamic_Settings_Tag_Approver', DYNAMIC_SETTINGS_TAG_LIST_VIEW: 'Dynamic_Settings_Tag_List_View', - SETTINGS_TAG_GL_CODE: 'Settings_Tag_GL_Code', SETTINGS_TAGS_IMPORT: 'Settings_Tags_Import', SETTINGS_TAGS_IMPORTED: 'Settings_Tags_Imported', }, diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index 21723ba7ae0b..05f45a563aa6 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -335,16 +335,16 @@ const CategoriesModalStackNavigator = createModalStackNavigator({ const TagsModalStackNavigator = createModalStackNavigator({ [SCREENS.SETTINGS_TAGS.SETTINGS_TAGS_SETTINGS]: () => require('../../../../pages/workspace/tags/WorkspaceTagsSettingsPage').default, - [SCREENS.SETTINGS_TAGS.SETTINGS_TAGS_EDIT]: () => require('../../../../pages/workspace/tags/WorkspaceEditTagsPage').default, + [SCREENS.SETTINGS_TAGS.DYNAMIC_SETTINGS_TAGS_EDIT]: () => require('../../../../pages/workspace/tags/WorkspaceEditTagsPage').default, [SCREENS.SETTINGS_TAGS.SETTINGS_TAGS_IMPORT]: () => require('../../../../pages/workspace/tags/ImportTagsPage').default, [SCREENS.WORKSPACE.TAGS_IMPORT_OPTIONS]: () => require('../../../../pages/workspace/tags/ImportTagsOptionsPage').default, [SCREENS.SETTINGS_TAGS.SETTINGS_TAGS_IMPORTED]: () => require('../../../../pages/workspace/tags/ImportedTagsPage').default, - [SCREENS.SETTINGS_TAGS.SETTINGS_TAG_SETTINGS]: () => require('../../../../pages/workspace/tags/TagSettingsPage').default, + [SCREENS.SETTINGS_TAGS.DYNAMIC_SETTINGS_TAG_SETTINGS]: () => require('../../../../pages/workspace/tags/TagSettingsPage').default, [SCREENS.SETTINGS_TAGS.DYNAMIC_SETTINGS_TAG_LIST_VIEW]: () => require('../../../../pages/workspace/tags/WorkspaceViewTagsPage').default, - [SCREENS.SETTINGS_TAGS.SETTINGS_TAG_CREATE]: () => require('../../../../pages/workspace/tags/WorkspaceCreateTagPage').default, - [SCREENS.SETTINGS_TAGS.SETTINGS_TAG_EDIT]: () => require('../../../../pages/workspace/tags/EditTagPage').default, + [SCREENS.SETTINGS_TAGS.DYNAMIC_SETTINGS_TAG_CREATE]: () => require('../../../../pages/workspace/tags/WorkspaceCreateTagPage').default, + [SCREENS.SETTINGS_TAGS.DYNAMIC_SETTINGS_TAG_EDIT]: () => require('../../../../pages/workspace/tags/EditTagPage').default, + [SCREENS.SETTINGS_TAGS.DYNAMIC_SETTINGS_TAG_GL_CODE]: () => require('../../../../pages/workspace/tags/TagGLCodePage').default, [SCREENS.SETTINGS_TAGS.DYNAMIC_SETTINGS_TAG_APPROVER]: () => require('../../../../pages/workspace/tags/TagApproverPage').default, - [SCREENS.SETTINGS_TAGS.SETTINGS_TAG_GL_CODE]: () => require('../../../../pages/workspace/tags/TagGLCodePage').default, }); const ExpensifyCardModalStackNavigator = createModalStackNavigator({ diff --git a/src/libs/Navigation/linkingConfig/config.ts b/src/libs/Navigation/linkingConfig/config.ts index 26fa32fffb62..bc1c4943a7f3 100644 --- a/src/libs/Navigation/linkingConfig/config.ts +++ b/src/libs/Navigation/linkingConfig/config.ts @@ -1536,35 +1536,13 @@ const config: LinkingOptions['config'] = { [SCREENS.SETTINGS_TAGS.SETTINGS_TAGS_SETTINGS]: { path: ROUTES.SETTINGS_TAGS_SETTINGS.route, }, - [SCREENS.SETTINGS_TAGS.SETTINGS_TAGS_EDIT]: { - path: ROUTES.SETTINGS_TAGS_EDIT.route, - parse: { - orderWeight: Number, - }, - }, - [SCREENS.SETTINGS_TAGS.SETTINGS_TAG_CREATE]: { - path: ROUTES.SETTINGS_TAG_CREATE.route, - }, - [SCREENS.SETTINGS_TAGS.SETTINGS_TAG_EDIT]: { - path: ROUTES.SETTINGS_TAG_EDIT.route, - parse: { - orderWeight: Number, - }, - }, - [SCREENS.SETTINGS_TAGS.SETTINGS_TAG_SETTINGS]: { - path: ROUTES.SETTINGS_TAG_SETTINGS.route, - parse: { - orderWeight: Number, - }, - }, + [SCREENS.SETTINGS_TAGS.DYNAMIC_SETTINGS_TAGS_EDIT]: DYNAMIC_ROUTES.SETTINGS_TAGS_EDIT.path, + [SCREENS.SETTINGS_TAGS.DYNAMIC_SETTINGS_TAG_CREATE]: DYNAMIC_ROUTES.SETTINGS_TAG_CREATE.path, + [SCREENS.SETTINGS_TAGS.DYNAMIC_SETTINGS_TAG_EDIT]: DYNAMIC_ROUTES.SETTINGS_TAG_EDIT.path, + [SCREENS.SETTINGS_TAGS.DYNAMIC_SETTINGS_TAG_GL_CODE]: DYNAMIC_ROUTES.SETTINGS_TAG_GL_CODE.path, + [SCREENS.SETTINGS_TAGS.DYNAMIC_SETTINGS_TAG_SETTINGS]: DYNAMIC_ROUTES.SETTINGS_TAG_SETTINGS.path, [SCREENS.SETTINGS_TAGS.DYNAMIC_SETTINGS_TAG_APPROVER]: DYNAMIC_ROUTES.SETTINGS_TAG_APPROVER.path, [SCREENS.SETTINGS_TAGS.DYNAMIC_SETTINGS_TAG_LIST_VIEW]: DYNAMIC_ROUTES.SETTINGS_TAG_LIST_VIEW.path, - [SCREENS.SETTINGS_TAGS.SETTINGS_TAG_GL_CODE]: { - path: ROUTES.SETTINGS_TAG_GL_CODE.route, - parse: { - orderWeight: Number, - }, - }, [SCREENS.SETTINGS_TAGS.SETTINGS_TAGS_IMPORT]: { path: ROUTES.SETTINGS_TAGS_IMPORT.route, }, diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index d8012d8938d5..a8eb09b30de5 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -466,10 +466,8 @@ type SettingsNavigatorParamList = { // eslint-disable-next-line no-restricted-syntax -- `backTo` usages in this file are legacy. Do not add new `backTo` params to screens. See contributingGuides/NAVIGATION.md backTo?: Routes; }; - [SCREENS.SETTINGS_TAGS.SETTINGS_TAG_CREATE]: { + [SCREENS.SETTINGS_TAGS.DYNAMIC_SETTINGS_TAG_CREATE]: { policyID: string; - // eslint-disable-next-line no-restricted-syntax -- `backTo` usages in this file are legacy. Do not add new `backTo` params to screens. See contributingGuides/NAVIGATION.md - backTo?: Routes; }; [SCREENS.WORKSPACE.DISTANCE_RATE_DETAILS]: { policyID: string; @@ -544,12 +542,10 @@ type SettingsNavigatorParamList = { backTo?: Routes; parentTagsFilter?: string; }; - [SCREENS.SETTINGS_TAGS.SETTINGS_TAG_SETTINGS]: { + [SCREENS.SETTINGS_TAGS.DYNAMIC_SETTINGS_TAG_SETTINGS]: { policyID: string; orderWeight: number; tagName: string; - // eslint-disable-next-line no-restricted-syntax -- `backTo` usages in this file are legacy. Do not add new `backTo` params to screens. See contributingGuides/NAVIGATION.md - backTo?: Routes; parentTagsFilter?: string; }; [SCREENS.WORKSPACE.TAG_LIST_VIEW]: { @@ -568,11 +564,9 @@ type SettingsNavigatorParamList = { // eslint-disable-next-line no-restricted-syntax -- `backTo` usages in this file are legacy. Do not add new `backTo` params to screens. See contributingGuides/NAVIGATION.md backTo?: Routes; }; - [SCREENS.SETTINGS_TAGS.SETTINGS_TAGS_EDIT]: { + [SCREENS.SETTINGS_TAGS.DYNAMIC_SETTINGS_TAGS_EDIT]: { policyID: string; orderWeight: number; - // eslint-disable-next-line no-restricted-syntax -- `backTo` usages in this file are legacy. Do not add new `backTo` params to screens. See contributingGuides/NAVIGATION.md - backTo?: Routes; }; [SCREENS.WORKSPACE.TAG_EDIT]: { policyID: string; @@ -581,12 +575,15 @@ type SettingsNavigatorParamList = { // eslint-disable-next-line no-restricted-syntax -- `backTo` usages in this file are legacy. Do not add new `backTo` params to screens. See contributingGuides/NAVIGATION.md backTo?: Routes; }; - [SCREENS.SETTINGS_TAGS.SETTINGS_TAG_EDIT]: { + [SCREENS.SETTINGS_TAGS.DYNAMIC_SETTINGS_TAG_EDIT]: { + policyID: string; + orderWeight: number; + tagName: string; + }; + [SCREENS.SETTINGS_TAGS.DYNAMIC_SETTINGS_TAG_GL_CODE]: { policyID: string; orderWeight: number; tagName: string; - // eslint-disable-next-line no-restricted-syntax -- `backTo` usages in this file are legacy. Do not add new `backTo` params to screens. See contributingGuides/NAVIGATION.md - backTo?: Routes; }; [SCREENS.WORKSPACE.TAG_APPROVER]: { policyID: string; @@ -607,13 +604,6 @@ type SettingsNavigatorParamList = { // eslint-disable-next-line no-restricted-syntax -- `backTo` usages in this file are legacy. Do not add new `backTo` params to screens. See contributingGuides/NAVIGATION.md backTo?: Routes; }; - [SCREENS.SETTINGS_TAGS.SETTINGS_TAG_GL_CODE]: { - policyID: string; - orderWeight: number; - tagName: string; - // eslint-disable-next-line no-restricted-syntax -- `backTo` usages in this file are legacy. Do not add new `backTo` params to screens. See contributingGuides/NAVIGATION.md - backTo?: Routes; - }; [SCREENS.SETTINGS.SUBSCRIPTION.SIZE]: { canChangeSize: 0 | 1; subPage: string; diff --git a/src/pages/workspace/tags/EditTagPage.tsx b/src/pages/workspace/tags/EditTagPage.tsx index e85799870d22..4a394ab2bbcb 100644 --- a/src/pages/workspace/tags/EditTagPage.tsx +++ b/src/pages/workspace/tags/EditTagPage.tsx @@ -7,6 +7,7 @@ import HeaderWithBackButton from '@components/HeaderWithBackButton'; import ScreenWrapper from '@components/ScreenWrapper'; import TextInput from '@components/TextInput'; import useAutoFocusInput from '@hooks/useAutoFocusInput'; +import useDynamicBackPath from '@hooks/useDynamicBackPath'; import useLocalize from '@hooks/useLocalize'; import usePolicyData from '@hooks/usePolicyData'; import useThemeStyles from '@hooks/useThemeStyles'; @@ -19,30 +20,32 @@ import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper'; import {renamePolicyTag} from '@userActions/Policy/Tag'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import ROUTES from '@src/ROUTES'; +import ROUTES, {DYNAMIC_ROUTES} from '@src/ROUTES'; import SCREENS from '@src/SCREENS'; import INPUT_IDS from '@src/types/form/WorkspaceTagForm'; type EditTagPageProps = | PlatformStackScreenProps - | PlatformStackScreenProps; + | PlatformStackScreenProps; function EditTagPage({route}: EditTagPageProps) { - const {backTo, policyID} = route.params; + const {policyID} = route.params; + const orderWeight = Number(route.params.orderWeight); const policyData = usePolicyData(policyID); const {tags: policyTags} = policyData; const styles = useThemeStyles(); const {translate} = useLocalize(); const {inputCallbackRef} = useAutoFocusInput(); const currentTagName = getCleanedTagName(route.params.tagName); - const isQuickSettingsFlow = route.name === SCREENS.SETTINGS_TAGS.SETTINGS_TAG_EDIT; + const isDynamicFlow = route.name === SCREENS.SETTINGS_TAGS.DYNAMIC_SETTINGS_TAG_EDIT; + const backPath = useDynamicBackPath(DYNAMIC_ROUTES.SETTINGS_TAG_EDIT.path); const validate = useCallback( (values: FormOnyxValues) => { const errors: FormInputErrors = {}; const tagName = values.tagName.trim(); const escapedTagName = escapeTagName(values.tagName.trim()); - const {tags} = getTagListByOrderWeight(policyTags, route.params.orderWeight); + const {tags} = getTagListByOrderWeight(policyTags, orderWeight); if (!isRequiredFulfilled(tagName)) { errors.tagName = translate('workspace.tags.tagRequiredError'); } else if (escapedTagName === '0') { @@ -56,7 +59,7 @@ function EditTagPage({route}: EditTagPageProps) { return errors; }, - [policyTags, route.params.orderWeight, currentTagName, translate], + [policyTags, orderWeight, currentTagName, translate], ); const editTag = useCallback( @@ -64,16 +67,12 @@ function EditTagPage({route}: EditTagPageProps) { const tagName = values.tagName.trim(); // Do not call the API if the edited tag name is the same as the current tag name if (currentTagName !== tagName) { - renamePolicyTag(policyData, {oldName: route.params.tagName, newName: values.tagName.trim()}, route.params.orderWeight); + renamePolicyTag(policyData, {oldName: route.params.tagName, newName: values.tagName.trim()}, orderWeight); } Keyboard.dismiss(); - Navigation.goBack( - isQuickSettingsFlow - ? ROUTES.SETTINGS_TAG_SETTINGS.getRoute(policyID, route.params.orderWeight, route.params.tagName, backTo) - : ROUTES.WORKSPACE_TAG_SETTINGS.getRoute(policyID, route.params.orderWeight, route.params.tagName), - ); + Navigation.goBack(isDynamicFlow ? backPath : ROUTES.WORKSPACE_TAG_SETTINGS.getRoute(policyID, orderWeight, route.params.tagName)); }, - [policyData, currentTagName, policyID, route.params.tagName, route.params.orderWeight, isQuickSettingsFlow, backTo], + [policyData, currentTagName, policyID, route.params.tagName, orderWeight, isDynamicFlow, backPath], ); return ( @@ -90,13 +89,7 @@ function EditTagPage({route}: EditTagPageProps) { > - Navigation.goBack( - isQuickSettingsFlow - ? ROUTES.SETTINGS_TAG_SETTINGS.getRoute(route?.params?.policyID, route.params.orderWeight, route.params.tagName, backTo) - : ROUTES.WORKSPACE_TAG_SETTINGS.getRoute(route?.params?.policyID, route.params.orderWeight, route.params.tagName), - ) - } + onBackButtonPress={() => Navigation.goBack(isDynamicFlow ? backPath : ROUTES.WORKSPACE_TAG_SETTINGS.getRoute(route?.params?.policyID, orderWeight, route.params.tagName))} /> - | PlatformStackScreenProps; + | PlatformStackScreenProps; function TagGLCodePage({route}: EditTagGLCodePageProps) { const styles = useThemeStyles(); @@ -32,20 +33,18 @@ function TagGLCodePage({route}: EditTagGLCodePageProps) { const {inputCallbackRef} = useAutoFocusInput(); const policyID = route.params.policyID; const policy = usePolicy(policyID); - const backTo = route.params.backTo; const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`); const tagName = route.params.tagName; - const orderWeight = route.params.orderWeight; + const orderWeight = Number(route.params.orderWeight); const {tags} = getTagListByOrderWeight(policyTags, orderWeight); const glCode = tags?.[route.params.tagName]?.['GL Code']; - const isQuickSettingsFlow = route.name === SCREENS.SETTINGS_TAGS.SETTINGS_TAG_GL_CODE; + const isDynamicFlow = route.name === SCREENS.SETTINGS_TAGS.DYNAMIC_SETTINGS_TAG_GL_CODE; + const backPath = useDynamicBackPath(DYNAMIC_ROUTES.SETTINGS_TAG_GL_CODE.path); const goBack = useCallback(() => { - Navigation.goBack( - isQuickSettingsFlow ? ROUTES.SETTINGS_TAG_SETTINGS.getRoute(policyID, orderWeight, tagName, backTo) : ROUTES.WORKSPACE_TAG_SETTINGS.getRoute(policyID, orderWeight, tagName), - ); - }, [orderWeight, policyID, tagName, isQuickSettingsFlow, backTo]); + Navigation.goBack(isDynamicFlow ? backPath : ROUTES.WORKSPACE_TAG_SETTINGS.getRoute(policyID, orderWeight, tagName)); + }, [orderWeight, policyID, tagName, isDynamicFlow, backPath]); const validate = useCallback( (values: FormOnyxValues) => { diff --git a/src/pages/workspace/tags/TagSettingsPage.tsx b/src/pages/workspace/tags/TagSettingsPage.tsx index a31a2c4d39c7..38284cf50665 100644 --- a/src/pages/workspace/tags/TagSettingsPage.tsx +++ b/src/pages/workspace/tags/TagSettingsPage.tsx @@ -10,6 +10,7 @@ import ScrollView from '@components/ScrollView'; import Switch from '@components/Switch'; import Text from '@components/Text'; import useConfirmModal from '@hooks/useConfirmModal'; +import useDynamicBackPath from '@hooks/useDynamicBackPath'; import useEnvironment from '@hooks/useEnvironment'; import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset'; import useLocalize from '@hooks/useLocalize'; @@ -41,10 +42,11 @@ import SCREENS from '@src/SCREENS'; type TagSettingsPageProps = | PlatformStackScreenProps - | PlatformStackScreenProps; + | PlatformStackScreenProps; function TagSettingsPage({route, navigation}: TagSettingsPageProps) { - const {orderWeight, policyID, tagName, backTo, parentTagsFilter} = route.params; + const {policyID, tagName, parentTagsFilter} = route.params; + const orderWeight = Number(route.params.orderWeight); const styles = useThemeStyles(); const {translate, formatPhoneNumber} = useLocalize(); const {showConfirmModal} = useConfirmModal(); @@ -54,7 +56,8 @@ function TagSettingsPage({route, navigation}: TagSettingsPageProps) { const {environmentURL} = useEnvironment(); const hasAccountingConnections = hasAccountingConnectionsPolicyUtils(policy); const expensifyIcons = useMemoizedLazyExpensifyIcons(['Lock', 'Trashcan']); - const isQuickSettingsFlow = route.name === SCREENS.SETTINGS_TAGS.SETTINGS_TAG_SETTINGS; + const isQuickSettingsFlow = route.name === SCREENS.SETTINGS_TAGS.DYNAMIC_SETTINGS_TAG_SETTINGS; + const backPath = useDynamicBackPath(DYNAMIC_ROUTES.SETTINGS_TAG_SETTINGS.path); const tagApprover = getTagApproverRule(policy, route.params?.tagName)?.approver ?? ''; const approver = getPersonalDetailByEmail(tagApprover); const approverText = formatPhoneNumber(approver?.displayName ?? tagApprover); @@ -92,7 +95,7 @@ function TagSettingsPage({route, navigation}: TagSettingsPageProps) { const navigateToEditTag = () => { Navigation.navigate( isQuickSettingsFlow - ? ROUTES.SETTINGS_TAG_EDIT.getRoute(policyID, orderWeight, currentPolicyTag.name, backTo) + ? createDynamicRoute(DYNAMIC_ROUTES.SETTINGS_TAG_EDIT.getRoute(orderWeight, currentPolicyTag.name)) : ROUTES.WORKSPACE_TAG_EDIT.getRoute(policyID, orderWeight, currentPolicyTag.name), ); }; @@ -104,7 +107,7 @@ function TagSettingsPage({route, navigation}: TagSettingsPageProps) { policyID, CONST.UPGRADE_FEATURE_INTRO_MAPPING.glCodes.alias, isQuickSettingsFlow - ? ROUTES.SETTINGS_TAG_GL_CODE.getRoute(policyID, orderWeight, tagName, backTo) + ? createDynamicRoute(DYNAMIC_ROUTES.SETTINGS_TAG_GL_CODE.getRoute(orderWeight, tagName)) : ROUTES.WORKSPACE_TAG_GL_CODE.getRoute(policyID, orderWeight, tagName), ), ); @@ -112,7 +115,7 @@ function TagSettingsPage({route, navigation}: TagSettingsPageProps) { } Navigation.navigate( isQuickSettingsFlow - ? ROUTES.SETTINGS_TAG_GL_CODE.getRoute(policyID, orderWeight, currentPolicyTag.name, backTo) + ? createDynamicRoute(DYNAMIC_ROUTES.SETTINGS_TAG_GL_CODE.getRoute(orderWeight, currentPolicyTag.name)) : ROUTES.WORKSPACE_TAG_GL_CODE.getRoute(policyID, orderWeight, currentPolicyTag.name), ); }; @@ -144,7 +147,7 @@ function TagSettingsPage({route, navigation}: TagSettingsPageProps) { Navigation.goBack(isQuickSettingsFlow ? ROUTES.SETTINGS_TAGS_ROOT.getRoute(policyID, backTo) : undefined)} + onBackButtonPress={() => Navigation.goBack(isQuickSettingsFlow ? backPath : undefined)} /> @@ -242,7 +245,7 @@ function TagSettingsPage({route, navigation}: TagSettingsPageProps) { return; } deletePolicyTags(policyData, [currentPolicyTag.name]); - Navigation.goBack(isQuickSettingsFlow ? ROUTES.SETTINGS_TAGS_ROOT.getRoute(policyID, backTo) : undefined); + Navigation.goBack(isQuickSettingsFlow ? backPath : undefined); } }} /> diff --git a/src/pages/workspace/tags/WorkspaceCreateTagPage.tsx b/src/pages/workspace/tags/WorkspaceCreateTagPage.tsx index 100b1c42d5c1..e3d6b8f3ae0c 100644 --- a/src/pages/workspace/tags/WorkspaceCreateTagPage.tsx +++ b/src/pages/workspace/tags/WorkspaceCreateTagPage.tsx @@ -8,6 +8,7 @@ import ScreenWrapper from '@components/ScreenWrapper'; import TextInput from '@components/TextInput'; import useAutoFocusInput from '@hooks/useAutoFocusInput'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; +import useDynamicBackPath from '@hooks/useDynamicBackPath'; import useLocalize from '@hooks/useLocalize'; import useOnboardingTaskInformation from '@hooks/useOnboardingTaskInformation'; import usePolicyData from '@hooks/usePolicyData'; @@ -22,22 +23,23 @@ import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper'; import {createPolicyTag} from '@userActions/Policy/Tag'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import ROUTES from '@src/ROUTES'; +import {DYNAMIC_ROUTES} from '@src/ROUTES'; import SCREENS from '@src/SCREENS'; import INPUT_IDS from '@src/types/form/WorkspaceTagForm'; type WorkspaceCreateTagPageProps = | PlatformStackScreenProps - | PlatformStackScreenProps; + | PlatformStackScreenProps; function WorkspaceCreateTagPage({route}: WorkspaceCreateTagPageProps) { - const {policyID, backTo} = route.params; + const {policyID} = route.params; const policyData = usePolicyData(policyID); const {tags: policyTagLists, categories: policyCategories} = policyData; const styles = useThemeStyles(); const {translate} = useLocalize(); const {inputCallbackRef} = useAutoFocusInput(); - const isQuickSettingsFlow = route.name === SCREENS.SETTINGS_TAGS.SETTINGS_TAG_CREATE; + const isDynamicFlow = route.name === SCREENS.SETTINGS_TAGS.DYNAMIC_SETTINGS_TAG_CREATE; + const backPath = useDynamicBackPath(DYNAMIC_ROUTES.SETTINGS_TAG_CREATE.path); const policyHasCustomCategories = hasCustomCategories(policyCategories); @@ -96,7 +98,7 @@ function WorkspaceCreateTagPage({route}: WorkspaceCreateTagPageProps) { policyHasCustomCategories, }); Keyboard.dismiss(); - Navigation.goBack(isQuickSettingsFlow ? ROUTES.SETTINGS_TAGS_ROOT.getRoute(policyID, backTo) : undefined); + Navigation.goBack(isDynamicFlow ? backPath : undefined); }; return ( @@ -113,7 +115,7 @@ function WorkspaceCreateTagPage({route}: WorkspaceCreateTagPageProps) { > Navigation.goBack(isQuickSettingsFlow ? ROUTES.SETTINGS_TAGS_ROOT.getRoute(policyID, backTo) : undefined)} + onBackButtonPress={() => Navigation.goBack(isDynamicFlow ? backPath : undefined)} /> - | PlatformStackScreenProps; +type WorkspaceEditTagsPageProps = PlatformStackScreenProps; function WorkspaceEditTagsPage({route}: WorkspaceEditTagsPageProps) { const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${route?.params?.policyID}`); const styles = useThemeStyles(); const {translate} = useLocalize(); - const tagListName = getTagListName(policyTags, route.params.orderWeight); + const orderWeight = Number(route.params.orderWeight); + const tagListName = getTagListName(policyTags, orderWeight); const {inputCallbackRef} = useAutoFocusInput(); - const backTo = route.params.backTo; - const isQuickSettingsFlow = route.name === SCREENS.SETTINGS_TAGS.SETTINGS_TAGS_EDIT; + const isQuickSettingsFlow = route.name === SCREENS.SETTINGS_TAGS.DYNAMIC_SETTINGS_TAGS_EDIT; + const backPath = useDynamicBackPath(DYNAMIC_ROUTES.SETTINGS_TAGS_EDIT.path); const isMultiLevelTagsEnabled = isMultiLevelTags(policyTags); const validateTagName = (values: FormOnyxValues) => { @@ -44,7 +44,7 @@ function WorkspaceEditTagsPage({route}: WorkspaceEditTagsPageProps) { if (values[INPUT_IDS.POLICY_TAGS_NAME]?.trim() === '0') { errors[INPUT_IDS.POLICY_TAGS_NAME] = translate('workspace.tags.invalidTagNameError'); } - if (policyTags && Object.values(policyTags).find((tag) => tag.orderWeight !== route.params.orderWeight && tag.name === values[INPUT_IDS.POLICY_TAGS_NAME])) { + if (policyTags && Object.values(policyTags).find((tag) => tag.orderWeight !== orderWeight && tag.name === values[INPUT_IDS.POLICY_TAGS_NAME])) { errors[INPUT_IDS.POLICY_TAGS_NAME] = translate('workspace.tags.existingTagError'); } return errors; @@ -52,19 +52,17 @@ function WorkspaceEditTagsPage({route}: WorkspaceEditTagsPageProps) { const goBackToTagsSettings = () => { if (isQuickSettingsFlow) { - Navigation.goBack(backTo); + Navigation.goBack(backPath); return; } Navigation.goBack( - isMultiLevelTagsEnabled - ? ROUTES.WORKSPACE_TAG_LIST_VIEW.getRoute(route?.params?.policyID, route.params.orderWeight) - : ROUTES.WORKSPACE_TAGS_SETTINGS.getRoute(route?.params?.policyID), + isMultiLevelTagsEnabled ? ROUTES.WORKSPACE_TAG_LIST_VIEW.getRoute(route?.params?.policyID, orderWeight) : ROUTES.WORKSPACE_TAGS_SETTINGS.getRoute(route?.params?.policyID), ); }; const updateTagListName = (values: FormOnyxValues) => { if (values[INPUT_IDS.POLICY_TAGS_NAME] !== tagListName) { - renamePolicyTagList(route.params.policyID, {oldName: tagListName, newName: values[INPUT_IDS.POLICY_TAGS_NAME]}, policyTags, route.params.orderWeight); + renamePolicyTagList(route.params.policyID, {oldName: tagListName, newName: values[INPUT_IDS.POLICY_TAGS_NAME]}, policyTags, orderWeight); } goBackToTagsSettings(); }; diff --git a/src/pages/workspace/tags/WorkspaceTagsPage.tsx b/src/pages/workspace/tags/WorkspaceTagsPage.tsx index 097485632c76..9bae93be8571 100644 --- a/src/pages/workspace/tags/WorkspaceTagsPage.tsx +++ b/src/pages/workspace/tags/WorkspaceTagsPage.tsx @@ -477,7 +477,7 @@ function WorkspaceTagsPage({route}: WorkspaceTagsPageProps) { }, [isQuickSettingsFlow, policyID, backTo]); const navigateToCreateTagPage = () => { - Navigation.navigate(isQuickSettingsFlow ? ROUTES.SETTINGS_TAG_CREATE.getRoute(policyID, backTo) : ROUTES.WORKSPACE_TAG_CREATE.getRoute(policyID)); + Navigation.navigate(isQuickSettingsFlow ? createDynamicRoute(DYNAMIC_ROUTES.SETTINGS_TAG_CREATE.path) : ROUTES.WORKSPACE_TAG_CREATE.getRoute(policyID)); }; const navigateToTagSettings = (tag: TagListItem) => { @@ -492,7 +492,9 @@ function WorkspaceTagsPage({route}: WorkspaceTagsPageProps) { : ROUTES.WORKSPACE_TAG_LIST_VIEW.getRoute(policyID, tag.orderWeight), ); } else { - Navigation.navigate(isQuickSettingsFlow ? ROUTES.SETTINGS_TAG_SETTINGS.getRoute(policyID, 0, tag.value, backTo) : ROUTES.WORKSPACE_TAG_SETTINGS.getRoute(policyID, 0, tag.value)); + Navigation.navigate( + isQuickSettingsFlow ? createDynamicRoute(DYNAMIC_ROUTES.SETTINGS_TAG_SETTINGS.getRoute(0, tag.value)) : ROUTES.WORKSPACE_TAG_SETTINGS.getRoute(policyID, 0, tag.value), + ); } }; diff --git a/src/pages/workspace/tags/WorkspaceTagsSettingsPage.tsx b/src/pages/workspace/tags/WorkspaceTagsSettingsPage.tsx index 175a36fa3659..db7fe2986d18 100644 --- a/src/pages/workspace/tags/WorkspaceTagsSettingsPage.tsx +++ b/src/pages/workspace/tags/WorkspaceTagsSettingsPage.tsx @@ -14,6 +14,7 @@ import usePolicyData from '@hooks/usePolicyData'; import useThemeStyles from '@hooks/useThemeStyles'; import {disableWorkspaceBillableExpenses, setPolicyBillableMode} from '@libs/actions/Policy/Policy'; import {clearPolicyTagListErrors, setPolicyRequiresTag} from '@libs/actions/Policy/Tag'; +import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute'; import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import {hasEnabledOptions as hasEnabledOptionsUtil} from '@libs/OptionsListUtils'; @@ -21,7 +22,7 @@ import {getTagLists as getTagListsUtil, isMultiLevelTags as isMultiLevelTagsUtil import type {SettingsNavigatorParamList} from '@navigation/types'; import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper'; import CONST from '@src/CONST'; -import ROUTES from '@src/ROUTES'; +import ROUTES, {DYNAMIC_ROUTES} from '@src/ROUTES'; import SCREENS from '@src/SCREENS'; import type {Policy} from '@src/types/onyx'; @@ -83,7 +84,7 @@ function WorkspaceTagsSettingsPage({route}: WorkspaceTagsSettingsPageProps) { onPress={() => { Navigation.navigate( isQuickSettingsFlow - ? ROUTES.SETTINGS_TAGS_EDIT.getRoute(policyID, policyTagLists.at(0)?.orderWeight ?? 0, backTo) + ? createDynamicRoute(DYNAMIC_ROUTES.SETTINGS_TAGS_EDIT.getRoute(policyTagLists.at(0)?.orderWeight ?? 0)) : ROUTES.WORKSPACE_EDIT_TAGS.getRoute(policyID, policyTagLists.at(0)?.orderWeight ?? 0), ); }} diff --git a/src/pages/workspace/tags/WorkspaceViewTagsPage.tsx b/src/pages/workspace/tags/WorkspaceViewTagsPage.tsx index 64f239aded07..7fe0e23979d3 100644 --- a/src/pages/workspace/tags/WorkspaceViewTagsPage.tsx +++ b/src/pages/workspace/tags/WorkspaceViewTagsPage.tsx @@ -39,6 +39,7 @@ import { setWorkspaceTagEnabled, } from '@libs/actions/Policy/Tag'; import {canUseTouchScreen} from '@libs/DeviceCapabilities'; +import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute'; import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import {isDisablingOrDeletingLastEnabledTag, isMakingLastRequiredTagListOptional} from '@libs/OptionsListUtils'; @@ -62,7 +63,6 @@ type WorkspaceViewTagsProps = function WorkspaceViewTagsPage({route}: WorkspaceViewTagsProps) { const {policyID, orderWeight: orderWeightParam} = route.params; - const backTo = 'backTo' in route.params ? route.params.backTo : undefined; const orderWeight = Number(orderWeightParam); // We need to use isSmallScreenWidth instead of shouldUseNarrowLayout for the small screen selection mode @@ -217,7 +217,7 @@ function WorkspaceViewTagsPage({route}: WorkspaceViewTagsProps) { const navigateToTagSettings = (tag: TagListItem) => { Navigation.navigate( isQuickSettingsFlow - ? ROUTES.SETTINGS_TAG_SETTINGS.getRoute(policyID, orderWeight, tag.value, backTo) + ? createDynamicRoute(DYNAMIC_ROUTES.SETTINGS_TAG_SETTINGS.getRoute(orderWeight, tag.value)) : ROUTES.WORKSPACE_TAG_SETTINGS.getRoute(policyID, orderWeight, tag.value, tag?.rules?.parentTagsFilter ?? undefined), ); }; @@ -341,7 +341,7 @@ function WorkspaceViewTagsPage({route}: WorkspaceViewTagsProps) { const navigateToEditTag = () => { Navigation.navigate( isQuickSettingsFlow - ? ROUTES.SETTINGS_TAGS_EDIT.getRoute(route.params.policyID, currentPolicyTag?.orderWeight ?? 0, backTo) + ? createDynamicRoute(DYNAMIC_ROUTES.SETTINGS_TAGS_EDIT.getRoute(currentPolicyTag?.orderWeight ?? 0)) : ROUTES.WORKSPACE_EDIT_TAGS.getRoute(route.params.policyID, currentPolicyTag?.orderWeight ?? 0, Navigation.getActiveRoute()), ); };