From 2b551dc03625c7f864b2f6df0de9f8c09d90ca7a Mon Sep 17 00:00:00 2001 From: huutech <20178761+huult@users.noreply.github.com> Date: Sat, 25 Jul 2026 15:58:33 +0700 Subject: [PATCH 1/5] migrate DYNAMIC_WORKSPACE_CONFIRMATION --- src/ROUTES.ts | 11 +++++------ src/SCREENS.ts | 2 +- .../ModalStackNavigators/index.tsx | 2 +- .../Navigation/linkingConfig/OldRoutes.ts | 1 + src/libs/Navigation/linkingConfig/config.ts | 2 +- src/libs/Navigation/types.ts | 5 +---- src/libs/Permissions.ts | 2 +- src/pages/Travel/DynamicTravelUpgrade.tsx | 5 +++-- ...micWorkspaceConfirmationForTravelPage.tsx} | 19 +++++++------------ 9 files changed, 21 insertions(+), 28 deletions(-) rename src/pages/Travel/{WorkspaceConfirmationForTravelPage.tsx => DynamicWorkspaceConfirmationForTravelPage.tsx} (76%) diff --git a/src/ROUTES.ts b/src/ROUTES.ts index d686f31266b3..b7001effa966 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -257,7 +257,7 @@ const DYNAMIC_ROUTES = { SCREENS.WORKSPACE_CONFIRMATION.DYNAMIC_ROOT, SCREENS.WORKSPACE_CONFIRMATION.OWNER_SELECTOR, SCREENS.WORKSPACE_DUPLICATE.ROOT, - SCREENS.TRAVEL.WORKSPACE_CONFIRMATION, + SCREENS.TRAVEL.DYNAMIC_WORKSPACE_CONFIRMATION, SCREENS.MONEY_REQUEST.STEP_UPGRADE, SCREENS.REPORT_DETAILS.DYNAMIC_ROOT, ], @@ -1026,6 +1026,10 @@ const DYNAMIC_ROUTES = { path: 'travel-upgrade', entryScreens: [SCREENS.TRAVEL.MY_TRIPS, SCREENS.WORKSPACE.TRAVEL, SCREENS.SEARCH.ROOT], }, + TRAVEL_WORKSPACE_CONFIRMATION: { + path: 'workspace-confirmation', + entryScreens: [SCREENS.TRAVEL.DYNAMIC_UPGRADE], + }, REPORT_CHANGE_APPROVER: { path: 'change-approver', entryScreens: [SCREENS.REPORT, SCREENS.RIGHT_MODAL.SEARCH_REPORT, SCREENS.RIGHT_MODAL.EXPENSE_REPORT, SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT], @@ -3453,11 +3457,6 @@ const ROUTES = { return getUrlWithBackToParam(`r/${reportID}/trip/${transactionID}/${pnr}/${sequenceIndex}`, backTo); }, }, - TRAVEL_WORKSPACE_CONFIRMATION: { - route: 'travel/upgrade/workspace/confirmation', - - getRoute: (backTo?: string) => getUrlWithBackToParam(`travel/upgrade/workspace/confirmation`, backTo), - }, TRAVEL_WORKSPACE_ADDRESS: { route: 'travel/:domain/workspace-address', diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 07dbf5e740dd..fdabba1cda8c 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -37,7 +37,7 @@ const SCREENS = { TRIP_DETAILS: 'Travel_TripDetails', DYNAMIC_DOMAIN_SELECTOR: 'Dynamic_Travel_DomainSelector', DYNAMIC_PUBLIC_DOMAIN_ERROR: 'Dynamic_Travel_PublicDomainError', - WORKSPACE_CONFIRMATION: 'Travel_WorkspaceConfirmation', + DYNAMIC_WORKSPACE_CONFIRMATION: 'Dynamic_Travel_WorkspaceConfirmation', WORKSPACE_ADDRESS: 'Travel_WorkspaceAddress', LEGAL_ENTITY_TAX_ID: 'Travel_LegalEntityTaxID', TRAVEL_DOT_LINK_WEB_VIEW: 'Travel_DotLinkWebView', diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index 90020a74cc94..dc3ba26cd230 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -240,7 +240,7 @@ const TravelModalStackNavigator = createModalStackNavigator require('../../../../pages/Travel/DynamicDomainSelectorPage').default, [SCREENS.TRAVEL.DYNAMIC_DOMAIN_PERMISSION_INFO]: () => require('../../../../pages/Travel/DynamicDomainPermissionInfoPage').default, [SCREENS.TRAVEL.DYNAMIC_PUBLIC_DOMAIN_ERROR]: () => require('../../../../pages/Travel/DynamicPublicDomainErrorPage').default, - [SCREENS.TRAVEL.WORKSPACE_CONFIRMATION]: () => require('../../../../pages/Travel/WorkspaceConfirmationForTravelPage').default, + [SCREENS.TRAVEL.DYNAMIC_WORKSPACE_CONFIRMATION]: () => require('../../../../pages/Travel/DynamicWorkspaceConfirmationForTravelPage').default, [SCREENS.TRAVEL.WORKSPACE_ADDRESS]: () => require('../../../../pages/Travel/WorkspaceAddressForTravelPage').default, [SCREENS.TRAVEL.LEGAL_ENTITY_TAX_ID]: () => require('../../../../pages/Travel/TravelLegalEntityTaxIDPage').default, [SCREENS.TRAVEL.VERIFY_ACCOUNT]: () => require('../../../../pages/Travel/VerifyAccountPage').default, diff --git a/src/libs/Navigation/linkingConfig/OldRoutes.ts b/src/libs/Navigation/linkingConfig/OldRoutes.ts index 10c055f9510b..3e4f741bd352 100644 --- a/src/libs/Navigation/linkingConfig/OldRoutes.ts +++ b/src/libs/Navigation/linkingConfig/OldRoutes.ts @@ -54,6 +54,7 @@ const oldRoutes: Record = { '/workspaces/$1/accounting/quickbooks-online/advanced/quickbooks-online-autosync/quickbooks-online-accounting-method', '/workspaces/*/connections/quickbooks-online/advanced/autosync': '/workspaces/$1/accounting/quickbooks-online/advanced/quickbooks-online-autosync', '/travel/upgrade': '/travel/travel-upgrade', + '/travel/upgrade/workspace/confirmation': '/travel/travel-upgrade/workspace-confirmation', '/workspaces/*/accounting/quickbooks-desktop/export/company-card-expense-account': '/workspaces/$1/accounting/quickbooks-desktop/export/qbd-company-card-expense-account', '/workspaces/*/accounting/quickbooks-desktop/export/company-card-expense-account-select': '/workspaces/$1/accounting/quickbooks-desktop/export/qbd-company-card-expense-account-select', '/workspaces/*/accounting/quickbooks-desktop/export/company-card-expense-account/account-select': diff --git a/src/libs/Navigation/linkingConfig/config.ts b/src/libs/Navigation/linkingConfig/config.ts index 6790017942a1..12f3fdf1541a 100644 --- a/src/libs/Navigation/linkingConfig/config.ts +++ b/src/libs/Navigation/linkingConfig/config.ts @@ -1946,7 +1946,7 @@ const config: LinkingOptions['config'] = { [SCREENS.TRAVEL.DYNAMIC_DOMAIN_SELECTOR]: DYNAMIC_ROUTES.TRAVEL_DOMAIN_SELECTOR.path, [SCREENS.TRAVEL.DYNAMIC_DOMAIN_PERMISSION_INFO]: DYNAMIC_ROUTES.TRAVEL_DOMAIN_PERMISSION_INFO.path, [SCREENS.TRAVEL.DYNAMIC_PUBLIC_DOMAIN_ERROR]: DYNAMIC_ROUTES.TRAVEL_PUBLIC_DOMAIN_ERROR.path, - [SCREENS.TRAVEL.WORKSPACE_CONFIRMATION]: ROUTES.TRAVEL_WORKSPACE_CONFIRMATION.route, + [SCREENS.TRAVEL.DYNAMIC_WORKSPACE_CONFIRMATION]: DYNAMIC_ROUTES.TRAVEL_WORKSPACE_CONFIRMATION.path, [SCREENS.TRAVEL.WORKSPACE_ADDRESS]: ROUTES.TRAVEL_WORKSPACE_ADDRESS.route, [SCREENS.TRAVEL.LEGAL_ENTITY_TAX_ID]: ROUTES.TRAVEL_LEGAL_ENTITY_TAX_ID.route, [SCREENS.TRAVEL.VERIFY_ACCOUNT]: ROUTES.TRAVEL_VERIFY_ACCOUNT.route, diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 0cbaa1994b82..38ee7714fe12 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -2739,10 +2739,7 @@ type TravelNavigatorParamList = { domain: string; policyID?: string; }; - [SCREENS.TRAVEL.WORKSPACE_CONFIRMATION]: { - // 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.TRAVEL.DYNAMIC_WORKSPACE_CONFIRMATION]: undefined; [SCREENS.TRAVEL.WORKSPACE_ADDRESS]: { domain: 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 diff --git a/src/libs/Permissions.ts b/src/libs/Permissions.ts index 66cc2e2cd991..f664626c1bcf 100644 --- a/src/libs/Permissions.ts +++ b/src/libs/Permissions.ts @@ -6,7 +6,7 @@ import type {OnyxEntry} from 'react-native-onyx'; // eslint-disable-next-line rulesdir/no-beta-handler function canUseAllBetas(betas: OnyxEntry): boolean { - return !!betas?.includes(CONST.BETAS.ALL); + return true; } /** diff --git a/src/pages/Travel/DynamicTravelUpgrade.tsx b/src/pages/Travel/DynamicTravelUpgrade.tsx index 5837b88eaf90..6887cf8601cf 100644 --- a/src/pages/Travel/DynamicTravelUpgrade.tsx +++ b/src/pages/Travel/DynamicTravelUpgrade.tsx @@ -9,6 +9,7 @@ import useNetwork from '@hooks/useNetwork'; 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 {getActivePolicies, isPaidGroupPolicy} from '@libs/PolicyUtils'; @@ -17,7 +18,7 @@ import UpgradeIntro from '@pages/workspace/upgrade/UpgradeIntro'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import ROUTES, {DYNAMIC_ROUTES} from '@src/ROUTES'; +import {DYNAMIC_ROUTES} from '@src/ROUTES'; import React from 'react'; @@ -34,7 +35,7 @@ function DynamicTravelUpgrade() { const isUpgraded = groupPaidPolicies.length > 0; const openWorkspaceConfirmation = () => { - Navigation.navigate(ROUTES.TRAVEL_WORKSPACE_CONFIRMATION.getRoute(Navigation.getActiveRoute())); + Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.TRAVEL_WORKSPACE_CONFIRMATION.path)); }; return ( diff --git a/src/pages/Travel/WorkspaceConfirmationForTravelPage.tsx b/src/pages/Travel/DynamicWorkspaceConfirmationForTravelPage.tsx similarity index 76% rename from src/pages/Travel/WorkspaceConfirmationForTravelPage.tsx rename to src/pages/Travel/DynamicWorkspaceConfirmationForTravelPage.tsx index 6be402a0fc7c..6c829885dfd0 100644 --- a/src/pages/Travel/WorkspaceConfirmationForTravelPage.tsx +++ b/src/pages/Travel/DynamicWorkspaceConfirmationForTravelPage.tsx @@ -4,27 +4,21 @@ import type {WorkspaceConfirmationSubmitFunctionParams} from '@components/Worksp import useActivePolicy from '@hooks/useActivePolicy'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; +import useDynamicBackPath from '@hooks/useDynamicBackPath'; import useHasActiveAdminPolicies from '@hooks/useHasActiveAdminPolicies'; import useOnyx from '@hooks/useOnyx'; import {createDraftWorkspace, createWorkspace} from '@libs/actions/Policy/Policy'; -import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute'; import Navigation from '@libs/Navigation/Navigation'; -import type {TravelNavigatorParamList} from '@libs/Navigation/types'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import ROUTES, {DYNAMIC_ROUTES} from '@src/ROUTES'; -import type SCREENS from '@src/SCREENS'; - -import type {StackScreenProps} from '@react-navigation/stack'; +import {DYNAMIC_ROUTES} from '@src/ROUTES'; import {hasSeenTourSelector} from '@selectors/Onboarding'; import React from 'react'; -type WorkspaceConfirmationForTravelPageProps = StackScreenProps; - -function WorkspaceConfirmationForTravelPage({route}: WorkspaceConfirmationForTravelPageProps) { +function DynamicWorkspaceConfirmationForTravelPage() { const [introSelected] = useOnyx(ONYXKEYS.NVP_INTRO_SELECTED); const [betas] = useOnyx(ONYXKEYS.BETAS); const [isSelfTourViewed] = useOnyx(ONYXKEYS.NVP_ONBOARDING, {selector: hasSeenTourSelector}); @@ -32,9 +26,10 @@ function WorkspaceConfirmationForTravelPage({route}: WorkspaceConfirmationForTra const activePolicy = useActivePolicy(); const currentUserPersonalDetails = useCurrentUserPersonalDetails(); const hasActiveAdminPolicies = useHasActiveAdminPolicies(); + const backPath = useDynamicBackPath(DYNAMIC_ROUTES.TRAVEL_WORKSPACE_CONFIRMATION.path); const goBack = () => { - Navigation.goBack(route.params?.backTo ?? createDynamicRoute(DYNAMIC_ROUTES.TRAVEL_UPGRADE.path, ROUTES.TRAVEL_MY_TRIPS.route)); + Navigation.goBack(backPath); }; const onSubmit = (params: WorkspaceConfirmationSubmitFunctionParams) => { @@ -67,7 +62,7 @@ function WorkspaceConfirmationForTravelPage({route}: WorkspaceConfirmationForTra return ( Date: Sat, 25 Jul 2026 16:14:39 +0700 Subject: [PATCH 2/5] migrate DYNAMIC_WORKSPACE_ADDRESS --- src/ROUTES.ts | 14 +++++++------- src/SCREENS.ts | 2 +- src/components/BookTravelButton.tsx | 4 ++-- .../AppNavigator/ModalStackNavigators/index.tsx | 4 ++-- src/libs/Navigation/linkingConfig/OldRoutes.ts | 1 + src/libs/Navigation/linkingConfig/config.ts | 2 +- src/libs/Navigation/types.ts | 4 +--- src/pages/Travel/DynamicDomainSelectorPage.tsx | 5 +++-- ... => DynamicWorkspaceAddressForTravelPage.tsx} | 16 +++++++++------- 9 files changed, 27 insertions(+), 25 deletions(-) rename src/pages/Travel/{WorkspaceAddressForTravelPage.tsx => DynamicWorkspaceAddressForTravelPage.tsx} (78%) diff --git a/src/ROUTES.ts b/src/ROUTES.ts index b7001effa966..1994028760c8 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -544,7 +544,7 @@ const DYNAMIC_ROUTES = { SCREENS.WORKSPACE.DYNAMIC_WORKSPACE_OVERVIEW_ADDRESS, SCREENS.SETTINGS.WALLET.CARDS_DIGITAL_DETAILS_UPDATE_ADDRESS, SCREENS.DOMAIN_CARD.DOMAIN_CARD_UPDATE_ADDRESS, - SCREENS.TRAVEL.WORKSPACE_ADDRESS, + SCREENS.TRAVEL.DYNAMIC_WORKSPACE_ADDRESS, SCREENS.SETTINGS.ADD_US_BANK_ACCOUNT, ], getRoute: (country = '') => `country?country=${country}`, @@ -1007,7 +1007,7 @@ const DYNAMIC_ROUTES = { SCREENS.WORKSPACE.TRAVEL, SCREENS.SEARCH.ROOT, SCREENS.TRAVEL.DYNAMIC_DOMAIN_SELECTOR, - SCREENS.TRAVEL.WORKSPACE_ADDRESS, + SCREENS.TRAVEL.DYNAMIC_WORKSPACE_ADDRESS, SCREENS.TRAVEL.LEGAL_ENTITY_TAX_ID, SCREENS.TRAVEL.VERIFY_ACCOUNT, ], @@ -1026,6 +1026,11 @@ const DYNAMIC_ROUTES = { path: 'travel-upgrade', entryScreens: [SCREENS.TRAVEL.MY_TRIPS, SCREENS.WORKSPACE.TRAVEL, SCREENS.SEARCH.ROOT], }, + TRAVEL_WORKSPACE_ADDRESS: { + path: 'workspace-address/:domain/:policyID?', + entryScreens: [SCREENS.TRAVEL.MY_TRIPS, SCREENS.WORKSPACE.TRAVEL, SCREENS.SEARCH.ROOT, SCREENS.TRAVEL.DYNAMIC_DOMAIN_SELECTOR], + getRoute: (domain: string, policyID?: string) => `workspace-address/${encodeURIComponent(domain)}${policyID ? `/${policyID}` : ''}` as const, + }, TRAVEL_WORKSPACE_CONFIRMATION: { path: 'workspace-confirmation', entryScreens: [SCREENS.TRAVEL.DYNAMIC_UPGRADE], @@ -3457,11 +3462,6 @@ const ROUTES = { return getUrlWithBackToParam(`r/${reportID}/trip/${transactionID}/${pnr}/${sequenceIndex}`, backTo); }, }, - TRAVEL_WORKSPACE_ADDRESS: { - route: 'travel/:domain/workspace-address', - - getRoute: (domain: string, policyID?: string, backTo?: string) => getUrlWithBackToParam(`travel/${domain}/workspace-address?${policyID ? `policyID=${policyID}` : ''}`, backTo), - }, TRAVEL_LEGAL_ENTITY_TAX_ID: { route: 'travel/:domain/legal-entity-tax-id', diff --git a/src/SCREENS.ts b/src/SCREENS.ts index fdabba1cda8c..1ad64c9521af 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -38,7 +38,7 @@ const SCREENS = { DYNAMIC_DOMAIN_SELECTOR: 'Dynamic_Travel_DomainSelector', DYNAMIC_PUBLIC_DOMAIN_ERROR: 'Dynamic_Travel_PublicDomainError', DYNAMIC_WORKSPACE_CONFIRMATION: 'Dynamic_Travel_WorkspaceConfirmation', - WORKSPACE_ADDRESS: 'Travel_WorkspaceAddress', + DYNAMIC_WORKSPACE_ADDRESS: 'Dynamic_Travel_WorkspaceAddress', LEGAL_ENTITY_TAX_ID: 'Travel_LegalEntityTaxID', TRAVEL_DOT_LINK_WEB_VIEW: 'Travel_DotLinkWebView', VERIFY_ACCOUNT: 'Travel_VerifyAccount', diff --git a/src/components/BookTravelButton.tsx b/src/components/BookTravelButton.tsx index 612f9b45e43b..e6fd7a502b6a 100644 --- a/src/components/BookTravelButton.tsx +++ b/src/components/BookTravelButton.tsx @@ -208,7 +208,7 @@ function BookTravelButton({ if (!isUserValidated) { // Determine where to redirect after OTP validation const nextStep = isEmptyObject(policy?.address) - ? ROUTES.TRAVEL_WORKSPACE_ADDRESS.getRoute(domain, activePolicyID, Navigation.getActiveRoute()) + ? createDynamicRoute(DYNAMIC_ROUTES.TRAVEL_WORKSPACE_ADDRESS.getRoute(domain, activePolicyID)) : getTravelAcceptTermsRoute(domain, activePolicyID, policy); setTravelProvisioningNextStep(nextStep); Navigation.navigate(ROUTES.TRAVEL_VERIFY_ACCOUNT.getRoute(domain, activePolicyID, Navigation.getActiveRoute())); @@ -216,7 +216,7 @@ function BookTravelButton({ } if (isEmptyObject(policy?.address)) { // Spotnana requires an address anytime an entity is created for a policy - Navigation.navigate(ROUTES.TRAVEL_WORKSPACE_ADDRESS.getRoute(domain, activePolicyID, Navigation.getActiveRoute())); + Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.TRAVEL_WORKSPACE_ADDRESS.getRoute(domain, activePolicyID))); } else { navigateToAcceptTerms(getTravelAcceptTermsRoute(domain, activePolicyID, policy), domain, !!isUserValidated, activePolicyID ?? undefined); } diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index dc3ba26cd230..37efbf5f2a75 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -94,7 +94,7 @@ const OPTIONS_PER_SCREEN: Partial [SCREENS.TRAVEL.VERIFY_ACCOUNT]: { animationTypeForReplace: 'push', }, - [SCREENS.TRAVEL.WORKSPACE_ADDRESS]: { + [SCREENS.TRAVEL.DYNAMIC_WORKSPACE_ADDRESS]: { animationTypeForReplace: 'push', }, [SCREENS.MULTIFACTOR_AUTHENTICATION.REVOKE]: { @@ -241,7 +241,7 @@ const TravelModalStackNavigator = createModalStackNavigator require('../../../../pages/Travel/DynamicDomainPermissionInfoPage').default, [SCREENS.TRAVEL.DYNAMIC_PUBLIC_DOMAIN_ERROR]: () => require('../../../../pages/Travel/DynamicPublicDomainErrorPage').default, [SCREENS.TRAVEL.DYNAMIC_WORKSPACE_CONFIRMATION]: () => require('../../../../pages/Travel/DynamicWorkspaceConfirmationForTravelPage').default, - [SCREENS.TRAVEL.WORKSPACE_ADDRESS]: () => require('../../../../pages/Travel/WorkspaceAddressForTravelPage').default, + [SCREENS.TRAVEL.DYNAMIC_WORKSPACE_ADDRESS]: () => require('../../../../pages/Travel/DynamicWorkspaceAddressForTravelPage').default, [SCREENS.TRAVEL.LEGAL_ENTITY_TAX_ID]: () => require('../../../../pages/Travel/TravelLegalEntityTaxIDPage').default, [SCREENS.TRAVEL.VERIFY_ACCOUNT]: () => require('../../../../pages/Travel/VerifyAccountPage').default, }); diff --git a/src/libs/Navigation/linkingConfig/OldRoutes.ts b/src/libs/Navigation/linkingConfig/OldRoutes.ts index 3e4f741bd352..f80cd3b4ae13 100644 --- a/src/libs/Navigation/linkingConfig/OldRoutes.ts +++ b/src/libs/Navigation/linkingConfig/OldRoutes.ts @@ -55,6 +55,7 @@ const oldRoutes: Record = { '/workspaces/*/connections/quickbooks-online/advanced/autosync': '/workspaces/$1/accounting/quickbooks-online/advanced/quickbooks-online-autosync', '/travel/upgrade': '/travel/travel-upgrade', '/travel/upgrade/workspace/confirmation': '/travel/travel-upgrade/workspace-confirmation', + '/travel/*/workspace-address': '/travel/workspace-address/$1', '/workspaces/*/accounting/quickbooks-desktop/export/company-card-expense-account': '/workspaces/$1/accounting/quickbooks-desktop/export/qbd-company-card-expense-account', '/workspaces/*/accounting/quickbooks-desktop/export/company-card-expense-account-select': '/workspaces/$1/accounting/quickbooks-desktop/export/qbd-company-card-expense-account-select', '/workspaces/*/accounting/quickbooks-desktop/export/company-card-expense-account/account-select': diff --git a/src/libs/Navigation/linkingConfig/config.ts b/src/libs/Navigation/linkingConfig/config.ts index 12f3fdf1541a..5c14c19bf2f7 100644 --- a/src/libs/Navigation/linkingConfig/config.ts +++ b/src/libs/Navigation/linkingConfig/config.ts @@ -1947,7 +1947,7 @@ const config: LinkingOptions['config'] = { [SCREENS.TRAVEL.DYNAMIC_DOMAIN_PERMISSION_INFO]: DYNAMIC_ROUTES.TRAVEL_DOMAIN_PERMISSION_INFO.path, [SCREENS.TRAVEL.DYNAMIC_PUBLIC_DOMAIN_ERROR]: DYNAMIC_ROUTES.TRAVEL_PUBLIC_DOMAIN_ERROR.path, [SCREENS.TRAVEL.DYNAMIC_WORKSPACE_CONFIRMATION]: DYNAMIC_ROUTES.TRAVEL_WORKSPACE_CONFIRMATION.path, - [SCREENS.TRAVEL.WORKSPACE_ADDRESS]: ROUTES.TRAVEL_WORKSPACE_ADDRESS.route, + [SCREENS.TRAVEL.DYNAMIC_WORKSPACE_ADDRESS]: DYNAMIC_ROUTES.TRAVEL_WORKSPACE_ADDRESS.path, [SCREENS.TRAVEL.LEGAL_ENTITY_TAX_ID]: ROUTES.TRAVEL_LEGAL_ENTITY_TAX_ID.route, [SCREENS.TRAVEL.VERIFY_ACCOUNT]: ROUTES.TRAVEL_VERIFY_ACCOUNT.route, }, diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 38ee7714fe12..69f205f6a377 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -2740,10 +2740,8 @@ type TravelNavigatorParamList = { policyID?: string; }; [SCREENS.TRAVEL.DYNAMIC_WORKSPACE_CONFIRMATION]: undefined; - [SCREENS.TRAVEL.WORKSPACE_ADDRESS]: { + [SCREENS.TRAVEL.DYNAMIC_WORKSPACE_ADDRESS]: { domain: 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; policyID?: string; }; [SCREENS.TRAVEL.LEGAL_ENTITY_TAX_ID]: { diff --git a/src/pages/Travel/DynamicDomainSelectorPage.tsx b/src/pages/Travel/DynamicDomainSelectorPage.tsx index 522defcd9461..297f63f687a1 100644 --- a/src/pages/Travel/DynamicDomainSelectorPage.tsx +++ b/src/pages/Travel/DynamicDomainSelectorPage.tsx @@ -14,6 +14,7 @@ import useThemeStyles from '@hooks/useThemeStyles'; import {cleanupTravelProvisioningSession, setTravelProvisioningNextStep} from '@libs/actions/Travel'; import getTravelAcceptTermsRoute from '@libs/getTravelAcceptTermsRoute'; +import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute'; import Navigation from '@libs/Navigation/Navigation'; import type {TravelNavigatorParamList} from '@libs/Navigation/types'; import {getAdminsPrivateEmailDomains, getMostFrequentEmailDomain} from '@libs/PolicyUtils'; @@ -71,7 +72,7 @@ function DynamicDomainSelectorPage({route}: DomainSelectorPageProps) { if (!isUserValidated) { // Determine where to redirect after OTP validation const nextStep = isEmptyObject(policy?.address) - ? ROUTES.TRAVEL_WORKSPACE_ADDRESS.getRoute(domain, policyID, Navigation.getActiveRoute()) + ? createDynamicRoute(DYNAMIC_ROUTES.TRAVEL_WORKSPACE_ADDRESS.getRoute(domain, policyID)) : getTravelAcceptTermsRoute(domain, policyID, policy); setTravelProvisioningNextStep(nextStep); Navigation.navigate(ROUTES.TRAVEL_VERIFY_ACCOUNT.getRoute(domain, policyID)); @@ -79,7 +80,7 @@ function DynamicDomainSelectorPage({route}: DomainSelectorPageProps) { } if (isEmptyObject(policy?.address)) { // Spotnana requires an address anytime an entity is created for a policy - Navigation.navigate(ROUTES.TRAVEL_WORKSPACE_ADDRESS.getRoute(domain, policyID, Navigation.getActiveRoute())); + Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.TRAVEL_WORKSPACE_ADDRESS.getRoute(domain, policyID))); } else { cleanupTravelProvisioningSession(); Navigation.navigate(getTravelAcceptTermsRoute(domain, policyID, policy)); diff --git a/src/pages/Travel/WorkspaceAddressForTravelPage.tsx b/src/pages/Travel/DynamicWorkspaceAddressForTravelPage.tsx similarity index 78% rename from src/pages/Travel/WorkspaceAddressForTravelPage.tsx rename to src/pages/Travel/DynamicWorkspaceAddressForTravelPage.tsx index f5c9b819ef1e..94c6da73a03e 100644 --- a/src/pages/Travel/WorkspaceAddressForTravelPage.tsx +++ b/src/pages/Travel/DynamicWorkspaceAddressForTravelPage.tsx @@ -1,5 +1,6 @@ import type {FormOnyxValues} from '@components/Form/types'; +import useDynamicBackPath from '@hooks/useDynamicBackPath'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; import usePolicy from '@hooks/usePolicy'; @@ -17,19 +18,21 @@ import {updateAddress} from '@userActions/Policy/Policy'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import ROUTES from '@src/ROUTES'; +import type {Route} from '@src/ROUTES'; +import ROUTES, {DYNAMIC_ROUTES} from '@src/ROUTES'; import type SCREENS from '@src/SCREENS'; import {isUserValidatedSelector} from '@selectors/Account'; import React from 'react'; -type WorkspaceAddressForTravelPageProps = PlatformStackScreenProps; +type DynamicWorkspaceAddressForTravelPageProps = PlatformStackScreenProps; -function WorkspaceAddressForTravelPage({route}: WorkspaceAddressForTravelPageProps) { +function DynamicWorkspaceAddressForTravelPage({route}: DynamicWorkspaceAddressForTravelPageProps) { const {translate} = useLocalize(); const {policyID} = route.params; const policy = usePolicy(policyID); const [isUserValidated] = useOnyx(ONYXKEYS.ACCOUNT, {selector: isUserValidatedSelector}); + const backPath = useDynamicBackPath(DYNAMIC_ROUTES.TRAVEL_WORKSPACE_ADDRESS.path); const updatePolicyAddress = (values: FormOnyxValues) => { if (!policy) { @@ -39,8 +42,7 @@ function WorkspaceAddressForTravelPage({route}: WorkspaceAddressForTravelPagePro // Always validate OTP first before allowing address submission if (!isUserValidated) { // After OTP validation, redirect back to this address page - const currentRoute = ROUTES.TRAVEL_WORKSPACE_ADDRESS.getRoute(route.params.domain, policyID, route.params.backTo); - setTravelProvisioningNextStep(currentRoute); + setTravelProvisioningNextStep(Navigation.getActiveRoute() as Route); Navigation.navigate(ROUTES.TRAVEL_VERIFY_ACCOUNT.getRoute(route.params.domain, policyID)); return; } @@ -62,10 +64,10 @@ function WorkspaceAddressForTravelPage({route}: WorkspaceAddressForTravelPagePro isLoadingApp={false} updateAddress={updatePolicyAddress} title={translate('common.companyAddress')} - backTo={route.params.backTo} + backTo={backPath} /> ); } -export default WorkspaceAddressForTravelPage; +export default DynamicWorkspaceAddressForTravelPage; From 13df9aa7e31dade06f0748d079326a3ddf6ac038 Mon Sep 17 00:00:00 2001 From: huutech <20178761+huult@users.noreply.github.com> Date: Sat, 25 Jul 2026 16:23:45 +0700 Subject: [PATCH 3/5] migrate DYNAMIC_VERIFY_ACCOUNT --- src/ROUTES.ts | 13 +++++++------ src/SCREENS.ts | 2 +- src/components/BookTravelButton.tsx | 8 ++++---- .../AppNavigator/ModalStackNavigators/index.tsx | 4 ++-- src/libs/Navigation/linkingConfig/config.ts | 2 +- src/libs/Navigation/types.ts | 4 +--- src/pages/Travel/DynamicDomainSelectorPage.tsx | 4 ++-- ...untPage.tsx => DynamicVerifyAccountPage.tsx} | 17 ++++++++++------- .../DynamicWorkspaceAddressForTravelPage.tsx | 5 +++-- 9 files changed, 31 insertions(+), 28 deletions(-) rename src/pages/Travel/{VerifyAccountPage.tsx => DynamicVerifyAccountPage.tsx} (76%) diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 1994028760c8..f470c878c6bc 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -1009,7 +1009,7 @@ const DYNAMIC_ROUTES = { SCREENS.TRAVEL.DYNAMIC_DOMAIN_SELECTOR, SCREENS.TRAVEL.DYNAMIC_WORKSPACE_ADDRESS, SCREENS.TRAVEL.LEGAL_ENTITY_TAX_ID, - SCREENS.TRAVEL.VERIFY_ACCOUNT, + SCREENS.TRAVEL.DYNAMIC_VERIFY_ACCOUNT, ], getRoute: (domain: string, policyID?: string) => `terms/${domain}/accept${policyID ? `/${policyID}` : ''}`, }, @@ -1031,6 +1031,12 @@ const DYNAMIC_ROUTES = { entryScreens: [SCREENS.TRAVEL.MY_TRIPS, SCREENS.WORKSPACE.TRAVEL, SCREENS.SEARCH.ROOT, SCREENS.TRAVEL.DYNAMIC_DOMAIN_SELECTOR], getRoute: (domain: string, policyID?: string) => `workspace-address/${encodeURIComponent(domain)}${policyID ? `/${policyID}` : ''}` as const, }, + TRAVEL_VERIFY_ACCOUNT: { + path: 'verify-account/:policyID?', + entryScreens: [SCREENS.TRAVEL.MY_TRIPS, SCREENS.WORKSPACE.TRAVEL, SCREENS.SEARCH.ROOT, SCREENS.TRAVEL.DYNAMIC_WORKSPACE_ADDRESS, SCREENS.TRAVEL.DYNAMIC_DOMAIN_SELECTOR], + getRoute: (domain?: string, policyID?: string) => getUrlWithParams(policyID ? `verify-account/${policyID}` : 'verify-account', {domain}), + queryParams: ['domain'], + }, TRAVEL_WORKSPACE_CONFIRMATION: { path: 'workspace-confirmation', entryScreens: [SCREENS.TRAVEL.DYNAMIC_UPGRADE], @@ -3467,11 +3473,6 @@ const ROUTES = { getRoute: (domain: string, policyID?: string) => `travel/${domain}/legal-entity-tax-id${policyID ? `?policyID=${policyID}` : ''}` as const, }, - TRAVEL_VERIFY_ACCOUNT: { - route: `travel/${VERIFY_ACCOUNT}`, - - getRoute: (domain?: string, policyID?: string, backTo?: string) => getUrlWithBackToParam(getUrlWithParams(`travel/${VERIFY_ACCOUNT}`, {domain, policyID}), backTo), - }, ONBOARDING_ROOT: { route: 'onboarding', diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 1ad64c9521af..b58556efa87b 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -41,7 +41,7 @@ const SCREENS = { DYNAMIC_WORKSPACE_ADDRESS: 'Dynamic_Travel_WorkspaceAddress', LEGAL_ENTITY_TAX_ID: 'Travel_LegalEntityTaxID', TRAVEL_DOT_LINK_WEB_VIEW: 'Travel_DotLinkWebView', - VERIFY_ACCOUNT: 'Travel_VerifyAccount', + DYNAMIC_VERIFY_ACCOUNT: 'Dynamic_Travel_VerifyAccount', MISSING_PERSONAL_DETAILS_CONFIRM_MAGIC_CODE: 'Travel_MissingPersonalDetails_ConfirmMagicCode', }, SEARCH: { diff --git a/src/components/BookTravelButton.tsx b/src/components/BookTravelButton.tsx index e6fd7a502b6a..481e2f9b5ed8 100644 --- a/src/components/BookTravelButton.tsx +++ b/src/components/BookTravelButton.tsx @@ -61,7 +61,7 @@ const navigateToAcceptTerms = (acceptTermsRoute: Route, domain: string, isUserVa Navigation.navigate(acceptTermsRoute); return; } - Navigation.navigate(ROUTES.TRAVEL_VERIFY_ACCOUNT.getRoute(domain, policyID, Navigation.getActiveRoute())); + Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.TRAVEL_VERIFY_ACCOUNT.getRoute(domain, policyID))); }; const hasPolicyIDInActiveRoute = () => getSearchParamFromPath(Navigation.getActiveRoute(), CONST.SEARCH.SYNTAX_FILTER_KEYS.POLICY_ID) !== null; @@ -172,13 +172,13 @@ function BookTravelButton({ // Send the default so the Travel-access check runs against the workspace owner's domain, not the acting admin's. if (!isUserValidated) { setTravelProvisioningNextStep(getTravelAcceptTermsRoute(CONST.TRAVEL.DEFAULT_DOMAIN, activePolicyID, policy)); - Navigation.navigate(ROUTES.TRAVEL_VERIFY_ACCOUNT.getRoute(CONST.TRAVEL.DEFAULT_DOMAIN, activePolicyID, Navigation.getActiveRoute())); + Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.TRAVEL_VERIFY_ACCOUNT.getRoute(CONST.TRAVEL.DEFAULT_DOMAIN, activePolicyID))); return; } navigateToAcceptTerms(getTravelAcceptTermsRoute(CONST.TRAVEL.DEFAULT_DOMAIN, activePolicyID, policy), CONST.TRAVEL.DEFAULT_DOMAIN, true, activePolicyID ?? undefined); } else if (!isBetaEnabled(CONST.BETAS.IS_TRAVEL_VERIFIED)) { if (!isUserValidated) { - Navigation.navigate(ROUTES.TRAVEL_VERIFY_ACCOUNT.getRoute(undefined, activePolicyID, Navigation.getActiveRoute())); + Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.TRAVEL_VERIFY_ACCOUNT.getRoute(undefined, activePolicyID))); return; } if (shouldShowVerifyAccountModal) { @@ -211,7 +211,7 @@ function BookTravelButton({ ? createDynamicRoute(DYNAMIC_ROUTES.TRAVEL_WORKSPACE_ADDRESS.getRoute(domain, activePolicyID)) : getTravelAcceptTermsRoute(domain, activePolicyID, policy); setTravelProvisioningNextStep(nextStep); - Navigation.navigate(ROUTES.TRAVEL_VERIFY_ACCOUNT.getRoute(domain, activePolicyID, Navigation.getActiveRoute())); + Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.TRAVEL_VERIFY_ACCOUNT.getRoute(domain, activePolicyID))); return; } if (isEmptyObject(policy?.address)) { diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index 37efbf5f2a75..7840fec2be75 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -91,7 +91,7 @@ const OPTIONS_PER_SCREEN: Partial [SCREENS.SEARCH.TRANSACTIONS_CHANGE_REPORT_SEARCH_RHP]: { animation: Animations.NONE, }, - [SCREENS.TRAVEL.VERIFY_ACCOUNT]: { + [SCREENS.TRAVEL.DYNAMIC_VERIFY_ACCOUNT]: { animationTypeForReplace: 'push', }, [SCREENS.TRAVEL.DYNAMIC_WORKSPACE_ADDRESS]: { @@ -243,7 +243,7 @@ const TravelModalStackNavigator = createModalStackNavigator require('../../../../pages/Travel/DynamicWorkspaceConfirmationForTravelPage').default, [SCREENS.TRAVEL.DYNAMIC_WORKSPACE_ADDRESS]: () => require('../../../../pages/Travel/DynamicWorkspaceAddressForTravelPage').default, [SCREENS.TRAVEL.LEGAL_ENTITY_TAX_ID]: () => require('../../../../pages/Travel/TravelLegalEntityTaxIDPage').default, - [SCREENS.TRAVEL.VERIFY_ACCOUNT]: () => require('../../../../pages/Travel/VerifyAccountPage').default, + [SCREENS.TRAVEL.DYNAMIC_VERIFY_ACCOUNT]: () => require('../../../../pages/Travel/DynamicVerifyAccountPage').default, }); const SplitDetailsModalStackNavigator = createModalStackNavigator({ diff --git a/src/libs/Navigation/linkingConfig/config.ts b/src/libs/Navigation/linkingConfig/config.ts index 5c14c19bf2f7..be5b4a72893b 100644 --- a/src/libs/Navigation/linkingConfig/config.ts +++ b/src/libs/Navigation/linkingConfig/config.ts @@ -1949,7 +1949,7 @@ const config: LinkingOptions['config'] = { [SCREENS.TRAVEL.DYNAMIC_WORKSPACE_CONFIRMATION]: DYNAMIC_ROUTES.TRAVEL_WORKSPACE_CONFIRMATION.path, [SCREENS.TRAVEL.DYNAMIC_WORKSPACE_ADDRESS]: DYNAMIC_ROUTES.TRAVEL_WORKSPACE_ADDRESS.path, [SCREENS.TRAVEL.LEGAL_ENTITY_TAX_ID]: ROUTES.TRAVEL_LEGAL_ENTITY_TAX_ID.route, - [SCREENS.TRAVEL.VERIFY_ACCOUNT]: ROUTES.TRAVEL_VERIFY_ACCOUNT.route, + [SCREENS.TRAVEL.DYNAMIC_VERIFY_ACCOUNT]: DYNAMIC_ROUTES.TRAVEL_VERIFY_ACCOUNT.path, }, }, [SCREENS.RIGHT_MODAL.SEARCH_COLUMNS]: { diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 69f205f6a377..8fd978ef9eca 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -2755,11 +2755,9 @@ type TravelNavigatorParamList = { [SCREENS.TRAVEL.DYNAMIC_DOMAIN_SELECTOR]: { policyID?: string; }; - [SCREENS.TRAVEL.VERIFY_ACCOUNT]: { + [SCREENS.TRAVEL.DYNAMIC_VERIFY_ACCOUNT]: { domain?: string; 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; }; }; diff --git a/src/pages/Travel/DynamicDomainSelectorPage.tsx b/src/pages/Travel/DynamicDomainSelectorPage.tsx index 297f63f687a1..f8b7a46c0479 100644 --- a/src/pages/Travel/DynamicDomainSelectorPage.tsx +++ b/src/pages/Travel/DynamicDomainSelectorPage.tsx @@ -23,7 +23,7 @@ import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import ROUTES, {DYNAMIC_ROUTES} from '@src/ROUTES'; +import {DYNAMIC_ROUTES} from '@src/ROUTES'; import type SCREENS from '@src/SCREENS'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; @@ -75,7 +75,7 @@ function DynamicDomainSelectorPage({route}: DomainSelectorPageProps) { ? createDynamicRoute(DYNAMIC_ROUTES.TRAVEL_WORKSPACE_ADDRESS.getRoute(domain, policyID)) : getTravelAcceptTermsRoute(domain, policyID, policy); setTravelProvisioningNextStep(nextStep); - Navigation.navigate(ROUTES.TRAVEL_VERIFY_ACCOUNT.getRoute(domain, policyID)); + Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.TRAVEL_VERIFY_ACCOUNT.getRoute(domain, policyID))); return; } if (isEmptyObject(policy?.address)) { diff --git a/src/pages/Travel/VerifyAccountPage.tsx b/src/pages/Travel/DynamicVerifyAccountPage.tsx similarity index 76% rename from src/pages/Travel/VerifyAccountPage.tsx rename to src/pages/Travel/DynamicVerifyAccountPage.tsx index 599662999e96..5b3fd39a16e0 100644 --- a/src/pages/Travel/VerifyAccountPage.tsx +++ b/src/pages/Travel/DynamicVerifyAccountPage.tsx @@ -1,3 +1,4 @@ +import useDynamicBackPath from '@hooks/useDynamicBackPath'; import useOnyx from '@hooks/useOnyx'; import usePermissions from '@hooks/usePermissions'; import usePolicy from '@hooks/usePolicy'; @@ -11,16 +12,18 @@ import VerifyAccountPageBase from '@pages/settings/VerifyAccountPageBase'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; +import {DYNAMIC_ROUTES} from '@src/ROUTES'; import type SCREENS from '@src/SCREENS'; import type {StackScreenProps} from '@react-navigation/stack'; import React, {useCallback, useEffect} from 'react'; -type VerifyAccountPageProps = StackScreenProps; +type DynamicVerifyAccountPageProps = StackScreenProps; -function VerifyAccountPage({route}: VerifyAccountPageProps) { - const {domain, backTo, policyID} = route.params; +function DynamicVerifyAccountPage({route}: DynamicVerifyAccountPageProps) { + const {domain, policyID} = route.params; + const backPath = useDynamicBackPath(DYNAMIC_ROUTES.TRAVEL_VERIFY_ACCOUNT.path); const [travelProvisioning] = useOnyx(ONYXKEYS.TRAVEL_PROVISIONING); const policy = usePolicy(policyID); const {isBetaEnabled} = usePermissions(); @@ -42,12 +45,12 @@ function VerifyAccountPage({route}: VerifyAccountPageProps) { }, []); const handleClose = useCallback(() => { - Navigation.goBack(backTo); - }, [backTo]); + Navigation.goBack(backPath); + }, [backPath]); return ( Date: Sat, 25 Jul 2026 16:57:38 +0700 Subject: [PATCH 4/5] migrate TRAVEL_TRIP_SUMMARY --- src/ROUTES.ts | 22 ++++++++++--------- src/SCREENS.ts | 2 +- .../ReportActionItem/MoneyRequestView.tsx | 2 +- .../ModalStackNavigators/index.tsx | 2 +- src/libs/Navigation/linkingConfig/config.ts | 2 +- src/libs/Navigation/types.ts | 4 +--- ...aryPage.tsx => DynamicTripSummaryPage.tsx} | 13 +++++++---- 7 files changed, 26 insertions(+), 21 deletions(-) rename src/pages/Travel/{TripSummaryPage.tsx => DynamicTripSummaryPage.tsx} (82%) diff --git a/src/ROUTES.ts b/src/ROUTES.ts index f470c878c6bc..861b77f49ad6 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -1037,6 +1037,18 @@ const DYNAMIC_ROUTES = { getRoute: (domain?: string, policyID?: string) => getUrlWithParams(policyID ? `verify-account/${policyID}` : 'verify-account', {domain}), queryParams: ['domain'], }, + TRAVEL_TRIP_SUMMARY: { + path: 'trip/:transactionID', + entryScreens: [SCREENS.REPORT, SCREENS.RIGHT_MODAL.SEARCH_REPORT, SCREENS.RIGHT_MODAL.EXPENSE_REPORT, SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT], + getRoute: (reportID: string | undefined, transactionID: string | undefined) => { + if (!reportID || !transactionID) { + Log.warn('Invalid reportID or transactionID is used to build the TRAVEL_TRIP_SUMMARY route'); + } + + return getUrlWithParams(`trip/${transactionID}`, {reportID}); + }, + queryParams: ['reportID'], + }, TRAVEL_WORKSPACE_CONFIRMATION: { path: 'workspace-confirmation', entryScreens: [SCREENS.TRAVEL.DYNAMIC_UPGRADE], @@ -3448,16 +3460,6 @@ const ROUTES = { }, }, TRACK_TRAINING_MODAL: 'track-training', - TRAVEL_TRIP_SUMMARY: { - route: 'r/:reportID/trip/:transactionID', - getRoute: (reportID: string | undefined, transactionID: string | undefined, backTo?: string) => { - if (!reportID || !transactionID) { - Log.warn('Invalid reportID or transactionID is used to build the TRAVEL_TRIP_SUMMARY route'); - } - - return getUrlWithBackToParam(`r/${reportID}/trip/${transactionID}`, backTo); - }, - }, TRAVEL_TRIP_DETAILS: { route: 'r/:reportID/trip/:transactionID/:pnr/:sequenceIndex', getRoute: (reportID: string | undefined, transactionID: string | undefined, pnr: string | undefined, sequenceIndex: number, backTo?: string) => { diff --git a/src/SCREENS.ts b/src/SCREENS.ts index b58556efa87b..318264cea2df 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -33,7 +33,7 @@ const SCREENS = { DYNAMIC_TCS: 'Dynamic_Travel_TCS', DYNAMIC_UPGRADE: 'Dynamic_Travel_Upgrade', DYNAMIC_DOMAIN_PERMISSION_INFO: 'Dynamic_Travel_DomainPermissionInfo', - TRIP_SUMMARY: 'Travel_TripSummary', + DYNAMIC_TRIP_SUMMARY: 'Dynamic_Travel_TripSummary', TRIP_DETAILS: 'Travel_TripDetails', DYNAMIC_DOMAIN_SELECTOR: 'Dynamic_Travel_DomainSelector', DYNAMIC_PUBLIC_DOMAIN_ERROR: 'Dynamic_Travel_PublicDomainError', diff --git a/src/components/ReportActionItem/MoneyRequestView.tsx b/src/components/ReportActionItem/MoneyRequestView.tsx index ea759e6ab96c..7ee1131ed0e3 100644 --- a/src/components/ReportActionItem/MoneyRequestView.tsx +++ b/src/components/ReportActionItem/MoneyRequestView.tsx @@ -1640,7 +1640,7 @@ function MoneyRequestView({ onPress={() => { const reservations = transaction?.receipt?.reservationList?.length ?? 0; if (reservations > 1) { - Navigation.navigate(ROUTES.TRAVEL_TRIP_SUMMARY.getRoute(transactionThreadReport?.reportID, transaction.transactionID, getReportRHPActiveRoute())); + Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.TRAVEL_TRIP_SUMMARY.getRoute(transactionThreadReport?.reportID, transaction.transactionID))); } Navigation.navigate(ROUTES.TRAVEL_TRIP_DETAILS.getRoute(transactionThreadReport?.reportID, transaction.transactionID, '0', 0, getReportRHPActiveRoute())); }} diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index 7840fec2be75..d0e3c70e96fb 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -235,7 +235,7 @@ const TravelModalStackNavigator = createModalStackNavigator require('../../../../pages/Travel/TravelDotLinkWebview').default, [SCREENS.TRAVEL.DYNAMIC_TCS]: () => require('../../../../pages/Travel/DynamicTravelTerms').default, [SCREENS.TRAVEL.DYNAMIC_UPGRADE]: () => require('../../../../pages/Travel/DynamicTravelUpgrade').default, - [SCREENS.TRAVEL.TRIP_SUMMARY]: () => require('../../../../pages/Travel/TripSummaryPage').default, + [SCREENS.TRAVEL.DYNAMIC_TRIP_SUMMARY]: () => require('../../../../pages/Travel/DynamicTripSummaryPage').default, [SCREENS.TRAVEL.TRIP_DETAILS]: () => require('../../../../pages/Travel/TripDetailsPage').default, [SCREENS.TRAVEL.DYNAMIC_DOMAIN_SELECTOR]: () => require('../../../../pages/Travel/DynamicDomainSelectorPage').default, [SCREENS.TRAVEL.DYNAMIC_DOMAIN_PERMISSION_INFO]: () => require('../../../../pages/Travel/DynamicDomainPermissionInfoPage').default, diff --git a/src/libs/Navigation/linkingConfig/config.ts b/src/libs/Navigation/linkingConfig/config.ts index be5b4a72893b..3c8a675888ea 100644 --- a/src/libs/Navigation/linkingConfig/config.ts +++ b/src/libs/Navigation/linkingConfig/config.ts @@ -1936,7 +1936,7 @@ const config: LinkingOptions['config'] = { [SCREENS.TRAVEL.TRAVEL_DOT_LINK_WEB_VIEW]: ROUTES.TRAVEL_DOT_LINK_WEB_VIEW.route, [SCREENS.TRAVEL.DYNAMIC_UPGRADE]: DYNAMIC_ROUTES.TRAVEL_UPGRADE.path, [SCREENS.TRAVEL.DYNAMIC_TCS]: DYNAMIC_ROUTES.TRAVEL_TCS.path, - [SCREENS.TRAVEL.TRIP_SUMMARY]: ROUTES.TRAVEL_TRIP_SUMMARY.route, + [SCREENS.TRAVEL.DYNAMIC_TRIP_SUMMARY]: DYNAMIC_ROUTES.TRAVEL_TRIP_SUMMARY.path, [SCREENS.TRAVEL.TRIP_DETAILS]: { path: ROUTES.TRAVEL_TRIP_DETAILS.route, parse: { diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 8fd978ef9eca..29889eaaa6de 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -2717,11 +2717,9 @@ type TravelNavigatorParamList = { isTestAccount?: string; redirectUrl?: string; }; - [SCREENS.TRAVEL.TRIP_SUMMARY]: { + [SCREENS.TRAVEL.DYNAMIC_TRIP_SUMMARY]: { reportID: string; transactionID: 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?: string; }; [SCREENS.TRAVEL.TRIP_DETAILS]: { reportID: string; diff --git a/src/pages/Travel/TripSummaryPage.tsx b/src/pages/Travel/DynamicTripSummaryPage.tsx similarity index 82% rename from src/pages/Travel/TripSummaryPage.tsx rename to src/pages/Travel/DynamicTripSummaryPage.tsx index eee9d2b0cdb3..aa80d2b01452 100644 --- a/src/pages/Travel/TripSummaryPage.tsx +++ b/src/pages/Travel/DynamicTripSummaryPage.tsx @@ -5,25 +5,29 @@ import {ReservationView} from '@components/ReportActionItem/TripDetailsView'; import ScreenWrapper from '@components/ScreenWrapper'; import ScrollView from '@components/ScrollView'; +import useDynamicBackPath from '@hooks/useDynamicBackPath'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID'; +import Navigation from '@libs/Navigation/Navigation'; import type {TravelNavigatorParamList} from '@libs/Navigation/types'; import CONFIG from '@src/CONFIG'; import * as TripReservationUtils from '@src/libs/TripReservationUtils'; import ONYXKEYS from '@src/ONYXKEYS'; +import {DYNAMIC_ROUTES} from '@src/ROUTES'; import type SCREENS from '@src/SCREENS'; import type {StackScreenProps} from '@react-navigation/stack'; import React from 'react'; -type TripSummaryPageProps = StackScreenProps; +type DynamicTripSummaryPageProps = StackScreenProps; -function TripSummaryPage({route}: TripSummaryPageProps) { +function DynamicTripSummaryPage({route}: DynamicTripSummaryPageProps) { const {translate} = useLocalize(); + const backPath = useDynamicBackPath(DYNAMIC_ROUTES.TRAVEL_TRIP_SUMMARY.path); const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${route.params.reportID}`); const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${getNonEmptyStringOnyxID(route.params.transactionID)}`); @@ -34,7 +38,7 @@ function TripSummaryPage({route}: TripSummaryPageProps) { includeSafeAreaPaddingBottom={false} shouldEnablePickerAvoiding={false} shouldEnableMaxHeight - testID="TripSummaryPage" + testID="DynamicTripSummaryPage" shouldShowOfflineIndicatorInWideScreen > Navigation.goBack(backPath)} /> {reservationsData.map(({reservation, transactionID, sequenceIndex, isCancelled}) => { @@ -65,4 +70,4 @@ function TripSummaryPage({route}: TripSummaryPageProps) { ); } -export default TripSummaryPage; +export default DynamicTripSummaryPage; From db170b1a010703d35b24a00010acde9e63977f0f Mon Sep 17 00:00:00 2001 From: huutech <20178761+huult@users.noreply.github.com> Date: Sat, 25 Jul 2026 17:04:21 +0700 Subject: [PATCH 5/5] migrate TRAVEL_TRIP_DETAILS --- src/ROUTES.ts | 32 +++++++++++++------ src/SCREENS.ts | 2 +- .../ReportActionItem/MoneyRequestView.tsx | 2 +- .../ReportActionItem/TripDetailsView.tsx | 7 ++-- .../ModalStackNavigators/index.tsx | 2 +- src/libs/Navigation/linkingConfig/config.ts | 7 +--- src/libs/Navigation/types.ts | 6 ++-- ...ilsPage.tsx => DynamicTripDetailsPage.tsx} | 15 ++++++--- .../UpcomingTravelItem.tsx | 5 +-- 9 files changed, 44 insertions(+), 34 deletions(-) rename src/pages/Travel/{TripDetailsPage.tsx => DynamicTripDetailsPage.tsx} (92%) diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 861b77f49ad6..97f595802b9e 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -1037,6 +1037,28 @@ const DYNAMIC_ROUTES = { getRoute: (domain?: string, policyID?: string) => getUrlWithParams(policyID ? `verify-account/${policyID}` : 'verify-account', {domain}), queryParams: ['domain'], }, + TRAVEL_TRIP_DETAILS: { + path: 'trip/:transactionID/:pnr/:sequenceIndex', + entryScreens: [ + SCREENS.REPORT, + SCREENS.RIGHT_MODAL.SEARCH_REPORT, + SCREENS.RIGHT_MODAL.EXPENSE_REPORT, + SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT, + SCREENS.HOME, + SCREENS.TRAVEL.DYNAMIC_TRIP_SUMMARY, + ], + getRoute: (reportID: string | undefined, transactionID: string | undefined, pnr: string | undefined, sequenceIndex: number) => { + if (!reportID || !transactionID || !pnr) { + Log.warn('Invalid reportID, transactionID or pnr is used to build the TRAVEL_TRIP_DETAILS route'); + } + + // `reportID` is carried as a distinct query param (`detailsReportID`) rather than `reportID` so it never + // collides with the `reportID` query param already used by DYNAMIC_ROUTES.TRAVEL_TRIP_SUMMARY when this + // route is layered on top of it (multi-reservation flow pushes TRIP_SUMMARY then TRIP_DETAILS). + return getUrlWithParams(`trip/${transactionID}/${pnr}/${sequenceIndex}`, {detailsReportID: reportID}); + }, + queryParams: ['detailsReportID'], + }, TRAVEL_TRIP_SUMMARY: { path: 'trip/:transactionID', entryScreens: [SCREENS.REPORT, SCREENS.RIGHT_MODAL.SEARCH_REPORT, SCREENS.RIGHT_MODAL.EXPENSE_REPORT, SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT], @@ -3460,16 +3482,6 @@ const ROUTES = { }, }, TRACK_TRAINING_MODAL: 'track-training', - TRAVEL_TRIP_DETAILS: { - route: 'r/:reportID/trip/:transactionID/:pnr/:sequenceIndex', - getRoute: (reportID: string | undefined, transactionID: string | undefined, pnr: string | undefined, sequenceIndex: number, backTo?: string) => { - if (!reportID || !transactionID || !pnr) { - Log.warn('Invalid reportID, transactionID or pnr is used to build the TRAVEL_TRIP_DETAILS route'); - } - - return getUrlWithBackToParam(`r/${reportID}/trip/${transactionID}/${pnr}/${sequenceIndex}`, backTo); - }, - }, TRAVEL_LEGAL_ENTITY_TAX_ID: { route: 'travel/:domain/legal-entity-tax-id', diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 318264cea2df..29dfe1881203 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -34,7 +34,7 @@ const SCREENS = { DYNAMIC_UPGRADE: 'Dynamic_Travel_Upgrade', DYNAMIC_DOMAIN_PERMISSION_INFO: 'Dynamic_Travel_DomainPermissionInfo', DYNAMIC_TRIP_SUMMARY: 'Dynamic_Travel_TripSummary', - TRIP_DETAILS: 'Travel_TripDetails', + DYNAMIC_TRIP_DETAILS: 'Dynamic_Travel_TripDetails', DYNAMIC_DOMAIN_SELECTOR: 'Dynamic_Travel_DomainSelector', DYNAMIC_PUBLIC_DOMAIN_ERROR: 'Dynamic_Travel_PublicDomainError', DYNAMIC_WORKSPACE_CONFIRMATION: 'Dynamic_Travel_WorkspaceConfirmation', diff --git a/src/components/ReportActionItem/MoneyRequestView.tsx b/src/components/ReportActionItem/MoneyRequestView.tsx index 7ee1131ed0e3..d16b480b2911 100644 --- a/src/components/ReportActionItem/MoneyRequestView.tsx +++ b/src/components/ReportActionItem/MoneyRequestView.tsx @@ -1642,7 +1642,7 @@ function MoneyRequestView({ if (reservations > 1) { Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.TRAVEL_TRIP_SUMMARY.getRoute(transactionThreadReport?.reportID, transaction.transactionID))); } - Navigation.navigate(ROUTES.TRAVEL_TRIP_DETAILS.getRoute(transactionThreadReport?.reportID, transaction.transactionID, '0', 0, getReportRHPActiveRoute())); + Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.TRAVEL_TRIP_DETAILS.getRoute(transactionThreadReport?.reportID, transaction.transactionID, '0', 0))); }} /> )} diff --git a/src/components/ReportActionItem/TripDetailsView.tsx b/src/components/ReportActionItem/TripDetailsView.tsx index 4054eaeeaed5..a4274df9dbe7 100644 --- a/src/components/ReportActionItem/TripDetailsView.tsx +++ b/src/components/ReportActionItem/TripDetailsView.tsx @@ -14,6 +14,7 @@ import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import DateUtils from '@libs/DateUtils'; +import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute'; import Navigation from '@libs/Navigation/Navigation'; import StringUtils from '@libs/StringUtils'; @@ -22,7 +23,7 @@ import variables from '@styles/variables'; import CONST from '@src/CONST'; import type {ReservationData} from '@src/libs/TripReservationUtils'; import {formatCancelledDescription, formatTransitLocationLabel, getPNRReservationDataFromTripReport, getTripReservationCode, getTripReservationIcon} from '@src/libs/TripReservationUtils'; -import ROUTES from '@src/ROUTES'; +import {DYNAMIC_ROUTES} from '@src/ROUTES'; import type {Report} from '@src/types/onyx'; import type {Reservation} from '@src/types/onyx/Transaction'; import type Transaction from '@src/types/onyx/Transaction'; @@ -171,9 +172,7 @@ function ReservationView({reservation, transactionID, tripRoomReportID, sequence iconStyles={[StyleUtils.getTripReservationIconContainer(false), styles.mr3, shouldCenterIcon && styles.alignSelfCenter]} secondaryIconFill={theme.icon} onPress={() => - Navigation.navigate( - ROUTES.TRAVEL_TRIP_DETAILS.getRoute(tripRoomReportID, transactionID, String(reservation.reservationID), sequenceIndex, Navigation.getReportRHPActiveRoute()), - ) + Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.TRAVEL_TRIP_DETAILS.getRoute(tripRoomReportID, transactionID, String(reservation.reservationID), sequenceIndex))) } /> ); diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index d0e3c70e96fb..e5d487f2e9ac 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -236,7 +236,7 @@ const TravelModalStackNavigator = createModalStackNavigator require('../../../../pages/Travel/DynamicTravelTerms').default, [SCREENS.TRAVEL.DYNAMIC_UPGRADE]: () => require('../../../../pages/Travel/DynamicTravelUpgrade').default, [SCREENS.TRAVEL.DYNAMIC_TRIP_SUMMARY]: () => require('../../../../pages/Travel/DynamicTripSummaryPage').default, - [SCREENS.TRAVEL.TRIP_DETAILS]: () => require('../../../../pages/Travel/TripDetailsPage').default, + [SCREENS.TRAVEL.DYNAMIC_TRIP_DETAILS]: () => require('../../../../pages/Travel/DynamicTripDetailsPage').default, [SCREENS.TRAVEL.DYNAMIC_DOMAIN_SELECTOR]: () => require('../../../../pages/Travel/DynamicDomainSelectorPage').default, [SCREENS.TRAVEL.DYNAMIC_DOMAIN_PERMISSION_INFO]: () => require('../../../../pages/Travel/DynamicDomainPermissionInfoPage').default, [SCREENS.TRAVEL.DYNAMIC_PUBLIC_DOMAIN_ERROR]: () => require('../../../../pages/Travel/DynamicPublicDomainErrorPage').default, diff --git a/src/libs/Navigation/linkingConfig/config.ts b/src/libs/Navigation/linkingConfig/config.ts index 3c8a675888ea..10ad063a5aa3 100644 --- a/src/libs/Navigation/linkingConfig/config.ts +++ b/src/libs/Navigation/linkingConfig/config.ts @@ -1937,12 +1937,7 @@ const config: LinkingOptions['config'] = { [SCREENS.TRAVEL.DYNAMIC_UPGRADE]: DYNAMIC_ROUTES.TRAVEL_UPGRADE.path, [SCREENS.TRAVEL.DYNAMIC_TCS]: DYNAMIC_ROUTES.TRAVEL_TCS.path, [SCREENS.TRAVEL.DYNAMIC_TRIP_SUMMARY]: DYNAMIC_ROUTES.TRAVEL_TRIP_SUMMARY.path, - [SCREENS.TRAVEL.TRIP_DETAILS]: { - path: ROUTES.TRAVEL_TRIP_DETAILS.route, - parse: { - reservationIndex: (reservationIndex: string) => parseInt(reservationIndex, 10), - }, - }, + [SCREENS.TRAVEL.DYNAMIC_TRIP_DETAILS]: DYNAMIC_ROUTES.TRAVEL_TRIP_DETAILS.path, [SCREENS.TRAVEL.DYNAMIC_DOMAIN_SELECTOR]: DYNAMIC_ROUTES.TRAVEL_DOMAIN_SELECTOR.path, [SCREENS.TRAVEL.DYNAMIC_DOMAIN_PERMISSION_INFO]: DYNAMIC_ROUTES.TRAVEL_DOMAIN_PERMISSION_INFO.path, [SCREENS.TRAVEL.DYNAMIC_PUBLIC_DOMAIN_ERROR]: DYNAMIC_ROUTES.TRAVEL_PUBLIC_DOMAIN_ERROR.path, diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 29889eaaa6de..0fad989d2a00 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -2721,13 +2721,11 @@ type TravelNavigatorParamList = { reportID: string; transactionID: string; }; - [SCREENS.TRAVEL.TRIP_DETAILS]: { - reportID: string; + [SCREENS.TRAVEL.DYNAMIC_TRIP_DETAILS]: { + detailsReportID: string; transactionID: string; sequenceIndex: number; pnr: 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?: string; }; [SCREENS.TRAVEL.DYNAMIC_TCS]: { domain?: string; diff --git a/src/pages/Travel/TripDetailsPage.tsx b/src/pages/Travel/DynamicTripDetailsPage.tsx similarity index 92% rename from src/pages/Travel/TripDetailsPage.tsx rename to src/pages/Travel/DynamicTripDetailsPage.tsx index 79f8cad6f470..7ccd2d79ad84 100644 --- a/src/pages/Travel/TripDetailsPage.tsx +++ b/src/pages/Travel/DynamicTripDetailsPage.tsx @@ -4,6 +4,7 @@ import MenuItem from '@components/MenuItem'; import ScreenWrapper from '@components/ScreenWrapper'; import ScrollView from '@components/ScrollView'; +import useDynamicBackPath from '@hooks/useDynamicBackPath'; import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; @@ -14,6 +15,7 @@ import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID'; +import Navigation from '@libs/Navigation/Navigation'; import type {TravelNavigatorParamList} from '@libs/Navigation/types'; import {getTripIDFromTransactionParentReportID} from '@libs/ReportUtils'; import {formatCancelledDescription, getReservationDetailsFromSequence, getReservationsFromTripReport} from '@libs/TripReservationUtils'; @@ -23,6 +25,7 @@ import {openTravelDotLink} from '@userActions/Link'; import CONFIG from '@src/CONFIG'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; +import {DYNAMIC_ROUTES} from '@src/ROUTES'; import type SCREENS from '@src/SCREENS'; import type {PersonalDetailsList} from '@src/types/onyx'; import type {Reservation} from '@src/types/onyx/Transaction'; @@ -41,9 +44,9 @@ function pickTravelerPersonalDetails(personalDetails: OnyxEntry personalDetail?.login === reservation?.travelerPersonalInfo?.email); } -type TripDetailsPageProps = StackScreenProps; +type DynamicTripDetailsPageProps = StackScreenProps; -function TripDetailsPage({route}: TripDetailsPageProps) { +function DynamicTripDetailsPage({route}: DynamicTripDetailsPageProps) { const icons = useMemoizedLazyExpensifyIcons([ 'NewWindow', 'Plane', @@ -69,7 +72,8 @@ function TripDetailsPage({route}: TripDetailsPageProps) { const [isModifyTripLoading, setIsModifyTripLoading] = useState(false); const [isTripSupportLoading, setIsTripSupportLoading] = useState(false); - const {transactionID, sequenceIndex, pnr, reportID} = route.params; + const {transactionID, sequenceIndex, pnr, detailsReportID: reportID} = route.params; + const backPath = useDynamicBackPath(DYNAMIC_ROUTES.TRAVEL_TRIP_DETAILS.path); const [activePolicyID] = useOnyx(ONYXKEYS.NVP_ACTIVE_POLICY_ID); const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${getNonEmptyStringOnyxID(transactionID)}`); @@ -90,7 +94,7 @@ function TripDetailsPage({route}: TripDetailsPageProps) { includeSafeAreaPaddingBottom shouldEnablePickerAvoiding={false} shouldEnableMaxHeight - testID="TripDetailsPage" + testID="DynamicTripDetailsPage" shouldShowOfflineIndicatorInWideScreen > Navigation.goBack(backPath)} icon={reservationIcon} iconHeight={20} iconWidth={20} @@ -171,4 +176,4 @@ function TripDetailsPage({route}: TripDetailsPageProps) { ); } -export default TripDetailsPage; +export default DynamicTripDetailsPage; diff --git a/src/pages/home/UpcomingTravelSection/UpcomingTravelItem.tsx b/src/pages/home/UpcomingTravelSection/UpcomingTravelItem.tsx index 6c65c8724bb7..45c58e048c30 100644 --- a/src/pages/home/UpcomingTravelSection/UpcomingTravelItem.tsx +++ b/src/pages/home/UpcomingTravelSection/UpcomingTravelItem.tsx @@ -8,13 +8,14 @@ import useStyleUtils from '@hooks/useStyleUtils'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; +import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute'; import Navigation from '@libs/Navigation/Navigation'; import {formatCancelledDescription, getTripReservationIcon} from '@libs/TripReservationUtils'; import variables from '@styles/variables'; import CONST from '@src/CONST'; -import ROUTES from '@src/ROUTES'; +import {DYNAMIC_ROUTES} from '@src/ROUTES'; import type {Reservation} from '@src/types/onyx/Transaction'; import {differenceInCalendarDays} from 'date-fns'; @@ -107,7 +108,7 @@ function UpcomingTravelItem({reservation: upcomingReservation}: UpcomingTravelIt const subtitle = typeId ? `${relativeTime} ${CONST.DOT_SEPARATOR} ${typeId}` : relativeTime; const handlePress = () => { - Navigation.navigate(ROUTES.TRAVEL_TRIP_DETAILS.getRoute(reportID, transactionID, reservation.reservationID, sequenceIndex)); + Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.TRAVEL_TRIP_DETAILS.getRoute(reportID, transactionID, reservation.reservationID, sequenceIndex))); }; return (