diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 717ccc1bbe6d..f9e59ed19812 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -251,6 +251,10 @@ const DYNAMIC_ROUTES = { getRoute: (country = '') => `country?country=${country}`, queryParams: ['country'], }, + SETTINGS_CATEGORY_EDIT: { + path: 'category-edit', + entryScreens: [SCREENS.SETTINGS_CATEGORIES.SETTINGS_CATEGORY_SETTINGS], + }, NOTIFICATION_PREFERENCES: { path: 'notification-preferences', entryScreens: [SCREENS.REPORT_SETTINGS.ROOT, SCREENS.PROFILE_ROOT], @@ -1495,12 +1499,6 @@ const ROUTES = { // eslint-disable-next-line no-restricted-syntax -- Legacy route generation getRoute: (policyID: string, backTo = '') => getUrlWithBackToParam(`settings/${policyID}/categories/new`, backTo), }, - SETTINGS_CATEGORY_EDIT: { - route: 'settings/:policyID/category/:categoryName/edit', - - // eslint-disable-next-line no-restricted-syntax -- Legacy route generation - getRoute: (policyID: string, categoryName: string, backTo = '') => getUrlWithBackToParam(`settings/${policyID}/category/${encodeURIComponent(categoryName)}/edit`, backTo), - }, SETTINGS_CATEGORIES_IMPORT: { route: 'settings/:policyID/categories/import', diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 83801778f079..60ada96c78c5 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -427,7 +427,7 @@ const SCREENS = { SETTINGS_CATEGORY_SETTINGS: 'Settings_Category_Settings', SETTINGS_CATEGORIES_SETTINGS: 'Settings_Categories_Settings', SETTINGS_CATEGORY_CREATE: 'Settings_Category_Create', - SETTINGS_CATEGORY_EDIT: 'Settings_Category_Edit', + DYNAMIC_SETTINGS_CATEGORY_EDIT: 'Dynamic_Settings_Category_Edit', SETTINGS_CATEGORIES_ROOT: 'Settings_Categories', SETTINGS_CATEGORIES_IMPORT: 'Settings_Categories_Import', SETTINGS_CATEGORIES_IMPORTED: 'Settings_Categories_Imported', diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index f5dcf67b4aa2..4ee22fbbb87e 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -314,7 +314,7 @@ const ChronosScheduleOOOModalStackNavigator = createModalStackNavigator require('../../../../pages/workspace/categories/WorkspaceCategoriesSettingsPage').default, [SCREENS.SETTINGS_CATEGORIES.SETTINGS_CATEGORY_CREATE]: () => require('../../../../pages/workspace/categories/CreateCategoryPage').default, - [SCREENS.SETTINGS_CATEGORIES.SETTINGS_CATEGORY_EDIT]: () => require('../../../../pages/workspace/categories/EditCategoryPage').default, + [SCREENS.SETTINGS_CATEGORIES.DYNAMIC_SETTINGS_CATEGORY_EDIT]: () => require('../../../../pages/workspace/categories/EditCategoryPage').default, [SCREENS.SETTINGS_CATEGORIES.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, diff --git a/src/libs/Navigation/linkingConfig/OldRoutes.ts b/src/libs/Navigation/linkingConfig/OldRoutes.ts index b234737e4058..f5defb53967d 100644 --- a/src/libs/Navigation/linkingConfig/OldRoutes.ts +++ b/src/libs/Navigation/linkingConfig/OldRoutes.ts @@ -1,5 +1,6 @@ const oldRoutes: Record = { /* eslint-disable @typescript-eslint/naming-convention */ + '/settings/*/category/*/edit': '/settings/$1/category/$2/category-edit', '/settings/workspaces/*': '/workspaces/$1', '/settings/workspaces': '/workspaces', '/r/*/settings/name': '/r/$1/details/settings/name', diff --git a/src/libs/Navigation/linkingConfig/config.ts b/src/libs/Navigation/linkingConfig/config.ts index 1e1d3a40665f..03ed3f30a693 100644 --- a/src/libs/Navigation/linkingConfig/config.ts +++ b/src/libs/Navigation/linkingConfig/config.ts @@ -1471,9 +1471,7 @@ const config: LinkingOptions['config'] = { [SCREENS.SETTINGS_CATEGORIES.SETTINGS_CATEGORY_CREATE]: { path: ROUTES.SETTINGS_CATEGORY_CREATE.route, }, - [SCREENS.SETTINGS_CATEGORIES.SETTINGS_CATEGORY_EDIT]: { - path: ROUTES.SETTINGS_CATEGORY_EDIT.route, - }, + [SCREENS.SETTINGS_CATEGORIES.DYNAMIC_SETTINGS_CATEGORY_EDIT]: DYNAMIC_ROUTES.SETTINGS_CATEGORY_EDIT.path, [SCREENS.SETTINGS_CATEGORIES.SETTINGS_CATEGORIES_IMPORT]: { path: ROUTES.SETTINGS_CATEGORIES_IMPORT.route, }, diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 4de218abacf6..40db2b242e4c 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -339,11 +339,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_CATEGORIES.SETTINGS_CATEGORY_EDIT]: { + [SCREENS.SETTINGS_CATEGORIES.DYNAMIC_SETTINGS_CATEGORY_EDIT]: { 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.CATEGORY_PAYROLL_CODE]: { policyID: string; diff --git a/src/pages/workspace/categories/CategorySettingsPage.tsx b/src/pages/workspace/categories/CategorySettingsPage.tsx index 7e285afdfd2b..dca51464d5eb 100644 --- a/src/pages/workspace/categories/CategorySettingsPage.tsx +++ b/src/pages/workspace/categories/CategorySettingsPage.tsx @@ -30,6 +30,7 @@ import { getDecodedCategoryName, } from '@libs/CategoryUtils'; import {getLatestErrorMessageField} from '@libs/ErrorUtils'; +import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute'; import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import {isDisablingOrDeletingLastEnabledCategory} from '@libs/OptionsListUtils'; @@ -41,7 +42,7 @@ import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper'; import {clearCategoryErrors, deleteWorkspaceCategories, setWorkspaceCategoryEnabled} from '@userActions/Policy/Category'; 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'; type CategorySettingsPageProps = @@ -222,9 +223,7 @@ function CategorySettingsPage({ ); const navigateToEditCategory = () => { - Navigation.navigate( - isQuickSettingsFlow ? ROUTES.SETTINGS_CATEGORY_EDIT.getRoute(policyID, policyCategory.name, backTo) : ROUTES.WORKSPACE_CATEGORY_EDIT.getRoute(policyID, policyCategory.name), - ); + Navigation.navigate(isQuickSettingsFlow ? createDynamicRoute(DYNAMIC_ROUTES.SETTINGS_CATEGORY_EDIT.path) : ROUTES.WORKSPACE_CATEGORY_EDIT.getRoute(policyID, policyCategory.name)); }; const deleteCategory = () => { diff --git a/src/pages/workspace/categories/EditCategoryPage.tsx b/src/pages/workspace/categories/EditCategoryPage.tsx index 87ed21e723e1..76e36302e7b1 100644 --- a/src/pages/workspace/categories/EditCategoryPage.tsx +++ b/src/pages/workspace/categories/EditCategoryPage.tsx @@ -2,6 +2,7 @@ import React, {useCallback} from 'react'; import type {FormInputErrors, FormOnyxValues} from '@components/Form/types'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import ScreenWrapper from '@components/ScreenWrapper'; +import useDynamicBackPath from '@hooks/useDynamicBackPath'; import useLocalize from '@hooks/useLocalize'; import usePolicyData from '@hooks/usePolicyData'; import useThemeStyles from '@hooks/useThemeStyles'; @@ -12,21 +13,22 @@ import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper'; import {renamePolicyCategory} from '@userActions/Policy/Category'; import CONST from '@src/CONST'; import type ONYXKEYS from '@src/ONYXKEYS'; -import ROUTES from '@src/ROUTES'; +import ROUTES, {DYNAMIC_ROUTES} from '@src/ROUTES'; import SCREENS from '@src/SCREENS'; import CategoryForm from './CategoryForm'; type EditCategoryPageProps = | PlatformStackScreenProps - | PlatformStackScreenProps; + | PlatformStackScreenProps; function EditCategoryPage({route}: EditCategoryPageProps) { - const {backTo, policyID, categoryName: currentCategoryName} = route.params; + const {policyID, categoryName: currentCategoryName} = route.params; const policyData = usePolicyData(policyID); const {categories: policyCategories} = policyData; const styles = useThemeStyles(); const {translate} = useLocalize(); - const isQuickSettingsFlow = route.name === SCREENS.SETTINGS_CATEGORIES.SETTINGS_CATEGORY_EDIT; + const isQuickSettingsFlow = route.name === SCREENS.SETTINGS_CATEGORIES.DYNAMIC_SETTINGS_CATEGORY_EDIT; + const backPath = useDynamicBackPath(DYNAMIC_ROUTES.SETTINGS_CATEGORY_EDIT.path); const validate = useCallback( (values: FormOnyxValues) => { @@ -56,15 +58,10 @@ function EditCategoryPage({route}: EditCategoryPageProps) { // Ensure Onyx.update is executed before navigation to prevent UI blinking issues, affecting the category name and rate. Navigation.setNavigationActionToMicrotaskQueue(() => { - Navigation.goBack( - isQuickSettingsFlow - ? ROUTES.SETTINGS_CATEGORY_SETTINGS.getRoute(policyID, currentCategoryName, backTo) - : ROUTES.WORKSPACE_CATEGORY_SETTINGS.getRoute(policyID, currentCategoryName), - {compareParams: false}, - ); + Navigation.goBack(isQuickSettingsFlow ? backPath : ROUTES.WORKSPACE_CATEGORY_SETTINGS.getRoute(policyID, currentCategoryName), {compareParams: false}); }); }, - [isQuickSettingsFlow, currentCategoryName, policyData, policyID, backTo], + [currentCategoryName, policyData, isQuickSettingsFlow, backPath, policyID], ); return ( @@ -82,11 +79,7 @@ function EditCategoryPage({route}: EditCategoryPageProps) { - Navigation.goBack( - isQuickSettingsFlow - ? ROUTES.SETTINGS_CATEGORY_SETTINGS.getRoute(route.params.policyID, route.params.categoryName, backTo) - : ROUTES.WORKSPACE_CATEGORY_SETTINGS.getRoute(route.params.policyID, route.params.categoryName), - ) + Navigation.goBack(isQuickSettingsFlow ? backPath : ROUTES.WORKSPACE_CATEGORY_SETTINGS.getRoute(route.params.policyID, route.params.categoryName)) } /> { ); }); + it('redirects old settings category edit path to the new dynamic suffix shape', () => { + expect(getMatchingNewRoute('/settings/abc/category/Meals/edit')).toBe('/settings/abc/category/Meals/category-edit'); + }); + + it('preserves query params when redirecting old settings category edit path', () => { + expect(getMatchingNewRoute('/settings/abc/category/Meals/edit?backTo=/home')).toBe('/settings/abc/category/Meals/category-edit?backTo=/home'); + }); + it('redirects old flag comment path to report-based dynamic route', () => { expect(getMatchingNewRoute('/flag/123/456')).toBe('/r/123/flag/123/456'); });