From 725efbccfb5345806a7ef2127e640bf22549e980 Mon Sep 17 00:00:00 2001 From: huutech <20178761+huult@users.noreply.github.com> Date: Mon, 15 Jun 2026 22:27:00 +0700 Subject: [PATCH 1/4] migrate SETTINGS_CATEGORY_SETTINGS --- src/ROUTES.ts | 26 +++++++++---------- src/SCREENS.ts | 2 +- .../ModalStackNavigators/index.tsx | 2 +- .../RELATIONS/WORKSPACE_TO_RHP.ts | 2 +- src/libs/Navigation/linkingConfig/config.ts | 4 +-- src/libs/Navigation/types.ts | 4 +-- .../categories/CategoryGLCodePage.tsx | 16 ++++++++++-- .../categories/CategoryPayrollCodePage.tsx | 16 ++++++++++-- .../categories/CategorySettingsPage.tsx | 10 ++++--- .../categories/WorkspaceCategoriesPage.tsx | 4 +-- 10 files changed, 54 insertions(+), 32 deletions(-) diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 72a37c58917f..2ad05dfd45d1 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -468,9 +468,14 @@ const DYNAMIC_ROUTES = { getRoute: (country = '') => `country?country=${country}`, queryParams: ['country'], }, + SETTINGS_CATEGORY_SETTINGS: { + path: 'category-settings/:categoryName', + entryScreens: [SCREENS.SETTINGS_CATEGORIES.SETTINGS_CATEGORIES_ROOT], + getRoute: (categoryName: string) => `category-settings/${encodeURIComponent(categoryName)}` as const, + }, SETTINGS_CATEGORY_EDIT: { path: 'category-edit', - entryScreens: [SCREENS.SETTINGS_CATEGORIES.SETTINGS_CATEGORY_SETTINGS], + entryScreens: [SCREENS.SETTINGS_CATEGORIES.DYNAMIC_SETTINGS_CATEGORY_SETTINGS], }, SETTINGS_CATEGORIES_SETTINGS: { path: 'manage-settings', @@ -499,31 +504,31 @@ const DYNAMIC_ROUTES = { }, WORKSPACE_CATEGORY_DEFAULT_TAX_RATE: { path: 'tax-rate', - entryScreens: [SCREENS.WORKSPACE.DYNAMIC_CATEGORY_SETTINGS, SCREENS.SETTINGS_CATEGORIES.SETTINGS_CATEGORY_SETTINGS], + entryScreens: [SCREENS.WORKSPACE.DYNAMIC_CATEGORY_SETTINGS, SCREENS.SETTINGS_CATEGORIES.DYNAMIC_SETTINGS_CATEGORY_SETTINGS], }, WORKSPACE_CATEGORY_FLAG_AMOUNTS_OVER: { path: 'flag-amounts', - entryScreens: [SCREENS.WORKSPACE.DYNAMIC_CATEGORY_SETTINGS, SCREENS.SETTINGS_CATEGORIES.SETTINGS_CATEGORY_SETTINGS], + entryScreens: [SCREENS.WORKSPACE.DYNAMIC_CATEGORY_SETTINGS, SCREENS.SETTINGS_CATEGORIES.DYNAMIC_SETTINGS_CATEGORY_SETTINGS], }, WORKSPACE_CATEGORY_DESCRIPTION_HINT: { path: 'description-hint', - entryScreens: [SCREENS.WORKSPACE.DYNAMIC_CATEGORY_SETTINGS, SCREENS.SETTINGS_CATEGORIES.SETTINGS_CATEGORY_SETTINGS], + entryScreens: [SCREENS.WORKSPACE.DYNAMIC_CATEGORY_SETTINGS, SCREENS.SETTINGS_CATEGORIES.DYNAMIC_SETTINGS_CATEGORY_SETTINGS], }, WORKSPACE_CATEGORY_REQUIRED_FIELDS: { path: 'required-fields', - entryScreens: [SCREENS.WORKSPACE.DYNAMIC_CATEGORY_SETTINGS, SCREENS.SETTINGS_CATEGORIES.SETTINGS_CATEGORY_SETTINGS], + entryScreens: [SCREENS.WORKSPACE.DYNAMIC_CATEGORY_SETTINGS, SCREENS.SETTINGS_CATEGORIES.DYNAMIC_SETTINGS_CATEGORY_SETTINGS], }, WORKSPACE_CATEGORY_APPROVER: { path: 'approver', - entryScreens: [SCREENS.WORKSPACE.DYNAMIC_CATEGORY_SETTINGS, SCREENS.SETTINGS_CATEGORIES.SETTINGS_CATEGORY_SETTINGS], + entryScreens: [SCREENS.WORKSPACE.DYNAMIC_CATEGORY_SETTINGS, SCREENS.SETTINGS_CATEGORIES.DYNAMIC_SETTINGS_CATEGORY_SETTINGS], }, WORKSPACE_CATEGORY_REQUIRE_RECEIPTS_OVER: { path: 'require-receipts-over', - entryScreens: [SCREENS.WORKSPACE.DYNAMIC_CATEGORY_SETTINGS, SCREENS.SETTINGS_CATEGORIES.SETTINGS_CATEGORY_SETTINGS], + entryScreens: [SCREENS.WORKSPACE.DYNAMIC_CATEGORY_SETTINGS, SCREENS.SETTINGS_CATEGORIES.DYNAMIC_SETTINGS_CATEGORY_SETTINGS], }, WORKSPACE_CATEGORY_REQUIRE_ITEMIZED_RECEIPTS_OVER: { path: 'require-itemized-receipts-over', - entryScreens: [SCREENS.WORKSPACE.DYNAMIC_CATEGORY_SETTINGS, SCREENS.SETTINGS_CATEGORIES.SETTINGS_CATEGORY_SETTINGS], + entryScreens: [SCREENS.WORKSPACE.DYNAMIC_CATEGORY_SETTINGS, SCREENS.SETTINGS_CATEGORIES.DYNAMIC_SETTINGS_CATEGORY_SETTINGS], }, NOTIFICATION_PREFERENCES: { path: 'notification-preferences', @@ -1826,11 +1831,6 @@ const ROUTES = { getRoute: (policyID: string, backTo = '') => getUrlWithBackToParam(`settings/${policyID}/categories`, backTo), }, - SETTINGS_CATEGORY_SETTINGS: { - route: 'settings/:policyID/category/:categoryName', - - getRoute: (policyID: string, categoryName: string, backTo = '') => getUrlWithBackToParam(`settings/${policyID}/category/${encodeURIComponent(categoryName)}`, backTo), - }, SETTINGS_CATEGORIES_IMPORT: { route: 'settings/:policyID/categories/import', diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 3a32c8547650..2b2fdd441429 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -450,7 +450,7 @@ const SCREENS = { }, SETTINGS_CATEGORIES: { - SETTINGS_CATEGORY_SETTINGS: 'Settings_Category_Settings', + DYNAMIC_SETTINGS_CATEGORY_SETTINGS: 'Dynamic_Settings_Category_Settings', DYNAMIC_SETTINGS_CATEGORIES_SETTINGS: 'Dynamic_Settings_Categories_Settings', DYNAMIC_SETTINGS_CATEGORY_CREATE: 'Dynamic_Settings_Category_Create', DYNAMIC_SETTINGS_CATEGORY_EDIT: 'Dynamic_Settings_Category_Edit', diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index ff959e64f60e..bc7bee55399b 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -324,7 +324,7 @@ const CategoriesModalStackNavigator = createModalStackNavigator({ require('../../../../pages/workspace/categories/DynamicWorkspaceCategoriesSettingsPage').default, [SCREENS.SETTINGS_CATEGORIES.DYNAMIC_SETTINGS_CATEGORY_CREATE]: () => require('../../../../pages/workspace/categories/DynamicCreateCategoryPage').default, [SCREENS.SETTINGS_CATEGORIES.DYNAMIC_SETTINGS_CATEGORY_EDIT]: () => require('../../../../pages/workspace/categories/DynamicEditCategoryPage').default, - [SCREENS.SETTINGS_CATEGORIES.SETTINGS_CATEGORY_SETTINGS]: () => require('../../../../pages/workspace/categories/CategorySettingsPage').default, + [SCREENS.SETTINGS_CATEGORIES.DYNAMIC_SETTINGS_CATEGORY_SETTINGS]: () => require('../../../../pages/workspace/categories/CategorySettingsPage').default, [SCREENS.SETTINGS_CATEGORIES.SETTINGS_CATEGORIES_IMPORT]: () => require('../../../../pages/workspace/categories/ImportCategoriesPage').default, [SCREENS.SETTINGS_CATEGORIES.SETTINGS_CATEGORIES_IMPORTED]: () => require('../../../../pages/workspace/categories/ImportedCategoriesPage').default, [SCREENS.SETTINGS_CATEGORIES.SETTINGS_CATEGORY_PAYROLL_CODE]: () => require('../../../../pages/workspace/categories/CategoryPayrollCodePage').default, diff --git a/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts b/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts index 5aa9797d0078..b58502fd4411 100755 --- a/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts +++ b/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts @@ -261,7 +261,7 @@ const WORKSPACE_TO_RHP: Partial['config'] = { }, [SCREENS.RIGHT_MODAL.SETTINGS_CATEGORIES]: { screens: { - [SCREENS.SETTINGS_CATEGORIES.SETTINGS_CATEGORY_SETTINGS]: { - path: ROUTES.SETTINGS_CATEGORY_SETTINGS.route, - }, + [SCREENS.SETTINGS_CATEGORIES.DYNAMIC_SETTINGS_CATEGORY_SETTINGS]: DYNAMIC_ROUTES.SETTINGS_CATEGORY_SETTINGS.path, [SCREENS.SETTINGS_CATEGORIES.DYNAMIC_SETTINGS_CATEGORIES_SETTINGS]: DYNAMIC_ROUTES.SETTINGS_CATEGORIES_SETTINGS.path, [SCREENS.SETTINGS_CATEGORIES.DYNAMIC_SETTINGS_CATEGORY_CREATE]: DYNAMIC_ROUTES.SETTINGS_CATEGORY_CREATE.path, [SCREENS.SETTINGS_CATEGORIES.DYNAMIC_SETTINGS_CATEGORY_EDIT]: DYNAMIC_ROUTES.SETTINGS_CATEGORY_EDIT.path, diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 10b2f0e0ec8e..b1e70e4b4a40 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -413,11 +413,9 @@ type SettingsNavigatorParamList = { policyID: string; categoryName: string; }; - [SCREENS.SETTINGS_CATEGORIES.SETTINGS_CATEGORY_SETTINGS]: { + [SCREENS.SETTINGS_CATEGORIES.DYNAMIC_SETTINGS_CATEGORY_SETTINGS]: { policyID: string; categoryName: 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.DYNAMIC_CATEGORY_REQUIRED_FIELDS]: { policyID: string; diff --git a/src/pages/workspace/categories/CategoryGLCodePage.tsx b/src/pages/workspace/categories/CategoryGLCodePage.tsx index dce6d5e01b61..8f0b6165f040 100644 --- a/src/pages/workspace/categories/CategoryGLCodePage.tsx +++ b/src/pages/workspace/categories/CategoryGLCodePage.tsx @@ -10,6 +10,7 @@ import useDynamicBackPath from '@hooks/useDynamicBackPath'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; import useThemeStyles from '@hooks/useThemeStyles'; +import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute'; import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import type {SettingsNavigatorParamList} from '@navigation/types'; @@ -58,7 +59,11 @@ function CategoryGLCodePage({route}: EditCategoryPageProps) { if (newGLCode !== glCode) { setPolicyCategoryGLCode(policyID, categoryName, newGLCode, policyCategories); } - Navigation.goBack(isQuickSettingsFlow ? ROUTES.SETTINGS_CATEGORY_SETTINGS.getRoute(policyID, categoryName, backTo) : workspaceBackPath); + Navigation.goBack( + isQuickSettingsFlow + ? createDynamicRoute(DYNAMIC_ROUTES.SETTINGS_CATEGORY_SETTINGS.getRoute(categoryName), ROUTES.SETTINGS_CATEGORIES_ROOT.getRoute(policyID, backTo)) + : workspaceBackPath, + ); }, [glCode, isQuickSettingsFlow, policyID, categoryName, backTo, policyCategories, workspaceBackPath], ); @@ -78,7 +83,14 @@ function CategoryGLCodePage({route}: EditCategoryPageProps) { - Navigation.goBack(isQuickSettingsFlow ? ROUTES.SETTINGS_CATEGORY_SETTINGS.getRoute(route.params.policyID, route.params.categoryName, backTo) : workspaceBackPath) + Navigation.goBack( + isQuickSettingsFlow + ? createDynamicRoute( + DYNAMIC_ROUTES.SETTINGS_CATEGORY_SETTINGS.getRoute(route.params.categoryName), + ROUTES.SETTINGS_CATEGORIES_ROOT.getRoute(route.params.policyID, backTo), + ) + : workspaceBackPath, + ) } /> - Navigation.goBack(isQuickSettingsFlow ? ROUTES.SETTINGS_CATEGORY_SETTINGS.getRoute(route.params.policyID, categoryName, backTo) : workspaceBackPath) + Navigation.goBack( + isQuickSettingsFlow + ? createDynamicRoute( + DYNAMIC_ROUTES.SETTINGS_CATEGORY_SETTINGS.getRoute(categoryName), + ROUTES.SETTINGS_CATEGORIES_ROOT.getRoute(route.params.policyID, backTo), + ) + : workspaceBackPath, + ) } /> - | PlatformStackScreenProps; + | PlatformStackScreenProps; function CategorySettingsPage({route: {params, name}, navigation}: CategorySettingsPageProps) { const {policyID, categoryName} = params; - const backTo = 'backTo' in params ? params.backTo : undefined; + const backTo = 'backTo' in params && typeof params.backTo === 'string' ? params.backTo : undefined; const styles = useThemeStyles(); const {translate, formatPhoneNumber} = useLocalize(); const {convertToDisplayString} = useCurrencyListActions(); @@ -70,7 +71,8 @@ function CategorySettingsPage({route: {params, name}, navigation}: CategorySetti const decodedCategoryName = getDecodedCategoryName(policyCategory?.name ?? ''); const shouldPreventDisableOrDelete = isDisablingOrDeletingLastEnabledCategory(policy, policyData.categories, [policyCategory]); - const isQuickSettingsFlow = name === SCREENS.SETTINGS_CATEGORIES.SETTINGS_CATEGORY_SETTINGS; + const isQuickSettingsFlow = name === SCREENS.SETTINGS_CATEGORIES.DYNAMIC_SETTINGS_CATEGORY_SETTINGS; + const settingsBackPath = useDynamicBackPath(DYNAMIC_ROUTES.SETTINGS_CATEGORY_SETTINGS.path); const { taskReport: setupCategoryTaskReport, taskParentReport: setupCategoryTaskParentReport, @@ -92,7 +94,7 @@ function CategorySettingsPage({route: {params, name}, navigation}: CategorySetti const policyHasTags = hasTags(policyTags); const navigateBack = () => { - Navigation.goBack(isQuickSettingsFlow ? ROUTES.SETTINGS_CATEGORIES_ROOT.getRoute(policyID, backTo) : undefined); + Navigation.goBack(isQuickSettingsFlow ? settingsBackPath : undefined); }; const isFocused = useIsFocused(); diff --git a/src/pages/workspace/categories/WorkspaceCategoriesPage.tsx b/src/pages/workspace/categories/WorkspaceCategoriesPage.tsx index c0a611a302f3..b60b71cd8720 100644 --- a/src/pages/workspace/categories/WorkspaceCategoriesPage.tsx +++ b/src/pages/workspace/categories/WorkspaceCategoriesPage.tsx @@ -216,12 +216,12 @@ function WorkspaceCategoriesPage({route}: WorkspaceCategoriesPageProps) { const navigateToCategory = useCallback( (category: PolicyCategories[string]) => { const path = isQuickSettingsFlow - ? ROUTES.SETTINGS_CATEGORY_SETTINGS.getRoute(policyId, category.name, backTo) + ? createDynamicRoute(DYNAMIC_ROUTES.SETTINGS_CATEGORY_SETTINGS.getRoute(category.name)) : createDynamicRoute(DYNAMIC_ROUTES.WORKSPACE_CATEGORY_SETTINGS.getRoute(category.name)); Navigation.navigate(path); }, - [backTo, isQuickSettingsFlow, policyId], + [isQuickSettingsFlow], ); const handleCategoryToggle = useCallback( From 7143630d7ab2c75d2ea7cb2f3fd418e2b882a1a5 Mon Sep 17 00:00:00 2001 From: huutech <20178761+huult@users.noreply.github.com> Date: Tue, 16 Jun 2026 10:51:05 +0700 Subject: [PATCH 2/4] migrate WORKSPACE_TAGS_SETTINGS --- src/ROUTES.ts | 8 ++++---- src/SCREENS.ts | 2 +- .../AppNavigator/ModalStackNavigators/index.tsx | 2 +- .../linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts | 2 +- src/libs/Navigation/linkingConfig/config.ts | 4 +--- src/libs/Navigation/types.ts | 4 +--- src/pages/workspace/tags/WorkspaceEditTagsPage.tsx | 5 ++++- src/pages/workspace/tags/WorkspaceTagsPage.tsx | 2 +- src/pages/workspace/tags/WorkspaceTagsSettingsPage.tsx | 4 ++-- 9 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 2ad05dfd45d1..3d521e0a6aa9 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -560,6 +560,10 @@ const DYNAMIC_ROUTES = { path: 'categories-settings', entryScreens: [SCREENS.WORKSPACE.CATEGORIES], }, + WORKSPACE_TAGS_SETTINGS: { + path: 'tags-settings', + entryScreens: [SCREENS.WORKSPACE.TAGS], + }, WORKSPACE_CATEGORY_CREATE: { path: 'category-new', entryScreens: [SCREENS.WORKSPACE.CATEGORIES], @@ -2565,10 +2569,6 @@ const ROUTES = { route: 'workspaces/:policyID/tags/new', getRoute: (policyID: string) => `workspaces/${policyID}/tags/new` as const, }, - WORKSPACE_TAGS_SETTINGS: { - route: 'workspaces/:policyID/tags/settings', - getRoute: (policyID: string) => `workspaces/${policyID}/tags/settings` as const, - }, WORKSPACE_EDIT_TAGS: { route: 'workspaces/:policyID/tags/:orderWeight/edit', diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 2b2fdd441429..7bcd65a64f8b 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -782,7 +782,7 @@ const SCREENS = { INVITE_MESSAGE_APPROVER: 'Workspace_Invite_Message_Approver', CATEGORIES: 'Workspace_Categories', TAGS: 'Workspace_Tags', - TAGS_SETTINGS: 'Tags_Settings', + DYNAMIC_TAGS_SETTINGS: 'Dynamic_Tags_Settings', TAGS_EDIT: 'Tags_Edit', TAGS_IMPORT: 'Tags_Import', TAGS_IMPORT_MULTI_LEVEL_SETTINGS: 'Tags_Import_Multi_Level_Settings', diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index bc7bee55399b..5e054a9cd95d 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -634,7 +634,7 @@ const SettingsModalStackNavigator = createModalStackNavigator require('../../../../pages/workspace/tags/ImportMultiLevelTagsSettingsPage').default, [SCREENS.WORKSPACE.TAGS_IMPORTED]: () => require('../../../../pages/workspace/tags/ImportedTagsPage').default, [SCREENS.WORKSPACE.TAGS_IMPORTED_MULTI_LEVEL]: () => require('../../../../pages/workspace/tags/ImportedMultiLevelTagsPage').default, - [SCREENS.WORKSPACE.TAGS_SETTINGS]: () => require('../../../../pages/workspace/tags/WorkspaceTagsSettingsPage').default, + [SCREENS.WORKSPACE.DYNAMIC_TAGS_SETTINGS]: () => require('../../../../pages/workspace/tags/WorkspaceTagsSettingsPage').default, [SCREENS.WORKSPACE.TAG_SETTINGS]: () => require('../../../../pages/workspace/tags/TagSettingsPage').default, [SCREENS.WORKSPACE.TAG_LIST_VIEW]: () => require('../../../../pages/workspace/tags/WorkspaceViewTagsPage').default, [SCREENS.WORKSPACE.TAGS_EDIT]: () => require('../../../../pages/workspace/tags/WorkspaceEditTagsPage').default, diff --git a/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts b/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts index b58502fd4411..e6043dca6426 100755 --- a/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts +++ b/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts @@ -219,7 +219,7 @@ const WORKSPACE_TO_RHP: Partial['config'] = { path: ROUTES.WORKSPACE_PAY_AND_DOWNGRADE.route, }, [SCREENS.WORKSPACE.DYNAMIC_CATEGORIES_SETTINGS]: DYNAMIC_ROUTES.WORKSPACE_CATEGORIES_SETTINGS.path, + [SCREENS.WORKSPACE.DYNAMIC_TAGS_SETTINGS]: DYNAMIC_ROUTES.WORKSPACE_TAGS_SETTINGS.path, [SCREENS.WORKSPACE.DYNAMIC_CATEGORIES_IMPORT]: DYNAMIC_ROUTES.WORKSPACE_CATEGORIES_IMPORT.path, [SCREENS.WORKSPACE.DYNAMIC_CATEGORIES_IMPORTED]: DYNAMIC_ROUTES.WORKSPACE_CATEGORIES_IMPORTED.path, [SCREENS.WORKSPACE.DYNAMIC_SPEND_CATEGORY_SELECTOR]: DYNAMIC_ROUTES.SPEND_CATEGORY_SELECTOR.path, @@ -1103,9 +1104,6 @@ const config: LinkingOptions['config'] = { [SCREENS.WORKSPACE.DISTANCE_RATE_END_DATE_EDIT]: { path: ROUTES.WORKSPACE_DISTANCE_RATE_END_DATE_EDIT.route, }, - [SCREENS.WORKSPACE.TAGS_SETTINGS]: { - path: ROUTES.WORKSPACE_TAGS_SETTINGS.route, - }, [SCREENS.WORKSPACE.TAGS_EDIT]: { path: ROUTES.WORKSPACE_EDIT_TAGS.route, parse: { diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index b1e70e4b4a40..89eaa38e6802 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -502,10 +502,8 @@ type SettingsNavigatorParamList = { policyID: string; rateID: string; }; - [SCREENS.WORKSPACE.TAGS_SETTINGS]: { + [SCREENS.WORKSPACE.DYNAMIC_TAGS_SETTINGS]: { 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.SETTINGS_TAGS.SETTINGS_TAGS_SETTINGS]: { policyID: string; diff --git a/src/pages/workspace/tags/WorkspaceEditTagsPage.tsx b/src/pages/workspace/tags/WorkspaceEditTagsPage.tsx index 636e142a3b33..3d5867ee680b 100644 --- a/src/pages/workspace/tags/WorkspaceEditTagsPage.tsx +++ b/src/pages/workspace/tags/WorkspaceEditTagsPage.tsx @@ -11,6 +11,7 @@ import useDynamicBackPath from '@hooks/useDynamicBackPath'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; import useThemeStyles from '@hooks/useThemeStyles'; +import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute'; import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import {getCleanedTagName, getTagListName, isMultiLevelTags} from '@libs/PolicyUtils'; @@ -56,7 +57,9 @@ function WorkspaceEditTagsPage({route}: WorkspaceEditTagsPageProps) { return; } Navigation.goBack( - isMultiLevelTagsEnabled ? ROUTES.WORKSPACE_TAG_LIST_VIEW.getRoute(route?.params?.policyID, orderWeight) : ROUTES.WORKSPACE_TAGS_SETTINGS.getRoute(route?.params?.policyID), + isMultiLevelTagsEnabled + ? ROUTES.WORKSPACE_TAG_LIST_VIEW.getRoute(route?.params?.policyID, orderWeight) + : createDynamicRoute(DYNAMIC_ROUTES.WORKSPACE_TAGS_SETTINGS.path, ROUTES.WORKSPACE_TAGS.getRoute(route?.params?.policyID)), ); }; diff --git a/src/pages/workspace/tags/WorkspaceTagsPage.tsx b/src/pages/workspace/tags/WorkspaceTagsPage.tsx index 6c92327e259f..1b6dafeed345 100644 --- a/src/pages/workspace/tags/WorkspaceTagsPage.tsx +++ b/src/pages/workspace/tags/WorkspaceTagsPage.tsx @@ -505,7 +505,7 @@ function WorkspaceTagsPage({route}: WorkspaceTagsPageProps) { }; const navigateToTagsSettings = useCallback(() => { - Navigation.navigate(isQuickSettingsFlow ? ROUTES.SETTINGS_TAGS_SETTINGS.getRoute(policyID, backTo) : ROUTES.WORKSPACE_TAGS_SETTINGS.getRoute(policyID)); + Navigation.navigate(isQuickSettingsFlow ? ROUTES.SETTINGS_TAGS_SETTINGS.getRoute(policyID, backTo) : createDynamicRoute(DYNAMIC_ROUTES.WORKSPACE_TAGS_SETTINGS.path)); }, [isQuickSettingsFlow, policyID, backTo]); const navigateToCreateTagPage = () => { diff --git a/src/pages/workspace/tags/WorkspaceTagsSettingsPage.tsx b/src/pages/workspace/tags/WorkspaceTagsSettingsPage.tsx index db7fe2986d18..24f458775939 100644 --- a/src/pages/workspace/tags/WorkspaceTagsSettingsPage.tsx +++ b/src/pages/workspace/tags/WorkspaceTagsSettingsPage.tsx @@ -27,7 +27,7 @@ import SCREENS from '@src/SCREENS'; import type {Policy} from '@src/types/onyx'; type WorkspaceTagsSettingsPageProps = - | PlatformStackScreenProps + | PlatformStackScreenProps | PlatformStackScreenProps; /** @@ -52,7 +52,7 @@ function toggleBillableExpenses(policy: OnyxEntry) { function WorkspaceTagsSettingsPage({route}: WorkspaceTagsSettingsPageProps) { const policyID = route.params.policyID; - const backTo = route.params.backTo; + const backTo = 'backTo' in route.params ? route.params.backTo : undefined; const styles = useThemeStyles(); const policyData = usePolicyData(policyID); const {tags: policyTags} = policyData; From 9e433a13e9c3ccaabcab9aec585df5c11a40b400 Mon Sep 17 00:00:00 2001 From: huutech <20178761+huult@users.noreply.github.com> Date: Tue, 16 Jun 2026 10:57:44 +0700 Subject: [PATCH 3/4] migrate WORKSPACE_TAG_CREATE --- src/ROUTES.ts | 8 ++++---- src/SCREENS.ts | 2 +- .../AppNavigator/ModalStackNavigators/index.tsx | 2 +- .../linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts | 2 +- src/libs/Navigation/linkingConfig/config.ts | 4 +--- src/libs/Navigation/types.ts | 4 +--- src/pages/workspace/tags/WorkspaceCreateTagPage.tsx | 2 +- src/pages/workspace/tags/WorkspaceTagsPage.tsx | 2 +- 8 files changed, 11 insertions(+), 15 deletions(-) diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 3d521e0a6aa9..4402809d4295 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -568,6 +568,10 @@ const DYNAMIC_ROUTES = { path: 'category-new', entryScreens: [SCREENS.WORKSPACE.CATEGORIES], }, + WORKSPACE_TAG_CREATE: { + path: 'tag-create', + entryScreens: [SCREENS.WORKSPACE.TAGS], + }, SPEND_CATEGORY_SELECTOR: { path: 'spend-category-selector/:groupID', entryScreens: [SCREENS.WORKSPACE.DYNAMIC_CATEGORIES_SETTINGS, SCREENS.SETTINGS_CATEGORIES.DYNAMIC_SETTINGS_CATEGORIES_SETTINGS], @@ -2565,10 +2569,6 @@ const ROUTES = { return `workspaces/${policyID}/tags` as const; }, }, - WORKSPACE_TAG_CREATE: { - route: 'workspaces/:policyID/tags/new', - getRoute: (policyID: string) => `workspaces/${policyID}/tags/new` as const, - }, WORKSPACE_EDIT_TAGS: { route: 'workspaces/:policyID/tags/:orderWeight/edit', diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 7bcd65a64f8b..17248a8429e9 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -809,7 +809,7 @@ const SCREENS = { TAXES_SETTINGS_FOREIGN_CURRENCY_DEFAULT: 'Workspace_Taxes_Settings_ForeignCurrency', TAX_CREATE: 'Workspace_Tax_Create', TAX_CREATE_VALUE: 'Workspace_Tax_Create_Value', - TAG_CREATE: 'Tag_Create', + DYNAMIC_TAG_CREATE: 'Dynamic_Tag_Create', TAG_SETTINGS: 'Tag_Settings', TAG_APPROVER: 'Tag_Approver', TAG_LIST_VIEW: 'Tag_List_View', diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index 5e054a9cd95d..e7a0f2ad2fd2 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -638,7 +638,7 @@ const SettingsModalStackNavigator = createModalStackNavigator require('../../../../pages/workspace/tags/TagSettingsPage').default, [SCREENS.WORKSPACE.TAG_LIST_VIEW]: () => require('../../../../pages/workspace/tags/WorkspaceViewTagsPage').default, [SCREENS.WORKSPACE.TAGS_EDIT]: () => require('../../../../pages/workspace/tags/WorkspaceEditTagsPage').default, - [SCREENS.WORKSPACE.TAG_CREATE]: () => require('../../../../pages/workspace/tags/WorkspaceCreateTagPage').default, + [SCREENS.WORKSPACE.DYNAMIC_TAG_CREATE]: () => require('../../../../pages/workspace/tags/WorkspaceCreateTagPage').default, [SCREENS.WORKSPACE.TAG_EDIT]: () => require('../../../../pages/workspace/tags/EditTagPage').default, [SCREENS.WORKSPACE.TAG_APPROVER]: () => require('../../../../pages/workspace/tags/TagApproverPage').default, [SCREENS.WORKSPACE.TAG_GL_CODE]: () => require('../../../../pages/workspace/tags/TagGLCodePage').default, diff --git a/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts b/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts index e6043dca6426..4d9185c4d999 100755 --- a/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts +++ b/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts @@ -221,7 +221,7 @@ const WORKSPACE_TO_RHP: Partial['config'] = { }, [SCREENS.WORKSPACE.DYNAMIC_CATEGORIES_SETTINGS]: DYNAMIC_ROUTES.WORKSPACE_CATEGORIES_SETTINGS.path, [SCREENS.WORKSPACE.DYNAMIC_TAGS_SETTINGS]: DYNAMIC_ROUTES.WORKSPACE_TAGS_SETTINGS.path, + [SCREENS.WORKSPACE.DYNAMIC_TAG_CREATE]: DYNAMIC_ROUTES.WORKSPACE_TAG_CREATE.path, [SCREENS.WORKSPACE.DYNAMIC_CATEGORIES_IMPORT]: DYNAMIC_ROUTES.WORKSPACE_CATEGORIES_IMPORT.path, [SCREENS.WORKSPACE.DYNAMIC_CATEGORIES_IMPORTED]: DYNAMIC_ROUTES.WORKSPACE_CATEGORIES_IMPORTED.path, [SCREENS.WORKSPACE.DYNAMIC_SPEND_CATEGORY_SELECTOR]: DYNAMIC_ROUTES.SPEND_CATEGORY_SELECTOR.path, @@ -1125,9 +1126,6 @@ const config: LinkingOptions['config'] = { [SCREENS.WORKSPACE.TAGS_IMPORTED_MULTI_LEVEL]: { path: ROUTES.WORKSPACE_TAGS_IMPORTED_MULTI_LEVEL.route, }, - [SCREENS.WORKSPACE.TAG_CREATE]: { - path: ROUTES.WORKSPACE_TAG_CREATE.route, - }, [SCREENS.WORKSPACE.TAG_EDIT]: { path: ROUTES.WORKSPACE_TAG_EDIT.route, parse: { diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 89eaa38e6802..f0fcc79235b7 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.WORKSPACE.TAG_CREATE]: { + [SCREENS.WORKSPACE.DYNAMIC_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.SETTINGS_TAGS.DYNAMIC_SETTINGS_TAG_CREATE]: { policyID: string; diff --git a/src/pages/workspace/tags/WorkspaceCreateTagPage.tsx b/src/pages/workspace/tags/WorkspaceCreateTagPage.tsx index e3d6b8f3ae0c..845150b55dec 100644 --- a/src/pages/workspace/tags/WorkspaceCreateTagPage.tsx +++ b/src/pages/workspace/tags/WorkspaceCreateTagPage.tsx @@ -28,7 +28,7 @@ import SCREENS from '@src/SCREENS'; import INPUT_IDS from '@src/types/form/WorkspaceTagForm'; type WorkspaceCreateTagPageProps = - | PlatformStackScreenProps + | PlatformStackScreenProps | PlatformStackScreenProps; function WorkspaceCreateTagPage({route}: WorkspaceCreateTagPageProps) { diff --git a/src/pages/workspace/tags/WorkspaceTagsPage.tsx b/src/pages/workspace/tags/WorkspaceTagsPage.tsx index 1b6dafeed345..70acce7d2baa 100644 --- a/src/pages/workspace/tags/WorkspaceTagsPage.tsx +++ b/src/pages/workspace/tags/WorkspaceTagsPage.tsx @@ -509,7 +509,7 @@ function WorkspaceTagsPage({route}: WorkspaceTagsPageProps) { }, [isQuickSettingsFlow, policyID, backTo]); const navigateToCreateTagPage = () => { - Navigation.navigate(isQuickSettingsFlow ? createDynamicRoute(DYNAMIC_ROUTES.SETTINGS_TAG_CREATE.path) : ROUTES.WORKSPACE_TAG_CREATE.getRoute(policyID)); + Navigation.navigate(isQuickSettingsFlow ? createDynamicRoute(DYNAMIC_ROUTES.SETTINGS_TAG_CREATE.path) : createDynamicRoute(DYNAMIC_ROUTES.WORKSPACE_TAG_CREATE.path)); }; const navigateToTagSettings = (tag: TagListItem) => { From d3ce1cf035eef27745b285f6f9c678e0f7a36824 Mon Sep 17 00:00:00 2001 From: huutech <20178761+huult@users.noreply.github.com> Date: Tue, 16 Jun 2026 11:24:12 +0700 Subject: [PATCH 4/4] update old routes --- src/libs/Navigation/linkingConfig/OldRoutes.ts | 2 ++ tests/navigation/getMatchingNewRouteTest.ts | 15 +++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/libs/Navigation/linkingConfig/OldRoutes.ts b/src/libs/Navigation/linkingConfig/OldRoutes.ts index c2f6fae87a33..f3e1c8289eb0 100644 --- a/src/libs/Navigation/linkingConfig/OldRoutes.ts +++ b/src/libs/Navigation/linkingConfig/OldRoutes.ts @@ -27,6 +27,8 @@ const oldRoutes: Record = { '/workspaces/*/overview/address': '/workspaces/$1/overview/workspace-address', '/workspaces/*/categories/settings': '/workspaces/$1/categories/categories-settings', '/workspaces/*/categories/new': '/workspaces/$1/categories/category-new', + '/workspaces/*/tags/settings': '/workspaces/$1/tags/tags-settings', + '/workspaces/*/tags/new': '/workspaces/$1/tags/tag-create', '/settings/*/categories/settings': '/settings/$1/categories/manage-settings', '/settings/*/categories/new': '/settings/$1/categories/category-create', '/workspaces/*/accounting/*/card-reconciliation/account': '/workspaces/$1/accounting/$2/card-reconciliation/account-reconciliation-settings', diff --git a/tests/navigation/getMatchingNewRouteTest.ts b/tests/navigation/getMatchingNewRouteTest.ts index a5f1c2323df7..5514ed8735b4 100644 --- a/tests/navigation/getMatchingNewRouteTest.ts +++ b/tests/navigation/getMatchingNewRouteTest.ts @@ -148,6 +148,21 @@ describe('getBestMatchingPath', () => { expect(getMatchingNewRoute('/settings/p123/tag/10/Meals?parentTagsFilter=Food')).toBe('/settings/p123/tags/tag-settings/10/Meals?parentTagsFilter=Food'); }); + it('redirects old workspace tag routes to the new dynamic suffix shape', () => { + expect(getMatchingNewRoute('/workspaces/p123/tags/settings')).toBe('/workspaces/p123/tags/tags-settings'); + expect(getMatchingNewRoute('/workspaces/p123/tags/new')).toBe('/workspaces/p123/tags/tag-create'); + }); + + it('preserves query params when redirecting old workspace tag routes', () => { + expect(getMatchingNewRoute('/workspaces/p123/tags/settings?backTo=/home')).toBe('/workspaces/p123/tags/tags-settings?backTo=/home'); + expect(getMatchingNewRoute('/workspaces/p123/tags/new?backTo=/home')).toBe('/workspaces/p123/tags/tag-create?backTo=/home'); + }); + + it('does not redirect the new workspace tag dynamic routes', () => { + expect(getMatchingNewRoute('/workspaces/p123/tags/tags-settings')).toBe(undefined); + expect(getMatchingNewRoute('/workspaces/p123/tags/tag-create')).toBe(undefined); + }); + it('redirects old flag comment path to report-based dynamic route', () => { expect(getMatchingNewRoute('/flag/123/456')).toBe('/r/123/flag/123/456'); });