Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 53 additions & 39 deletions src/ROUTES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
],
Expand Down Expand Up @@ -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}`,
Expand Down Expand Up @@ -1007,9 +1007,9 @@ 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,
SCREENS.TRAVEL.DYNAMIC_VERIFY_ACCOUNT,
],
getRoute: (domain: string, policyID?: string) => `terms/${domain}/accept${policyID ? `/${policyID}` : ''}`,
},
Expand All @@ -1026,6 +1026,55 @@ 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_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_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],
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],
},
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],
Expand Down Expand Up @@ -3433,46 +3482,11 @@ 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) => {
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_WORKSPACE_CONFIRMATION: {
route: 'travel/upgrade/workspace/confirmation',

getRoute: (backTo?: string) => getUrlWithBackToParam(`travel/upgrade/workspace/confirmation`, 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',

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',

Expand Down
10 changes: 5 additions & 5 deletions src/SCREENS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,15 +33,15 @@ const SCREENS = {
DYNAMIC_TCS: 'Dynamic_Travel_TCS',
DYNAMIC_UPGRADE: 'Dynamic_Travel_Upgrade',
DYNAMIC_DOMAIN_PERMISSION_INFO: 'Dynamic_Travel_DomainPermissionInfo',
TRIP_SUMMARY: 'Travel_TripSummary',
TRIP_DETAILS: 'Travel_TripDetails',
DYNAMIC_TRIP_SUMMARY: 'Dynamic_Travel_TripSummary',
DYNAMIC_TRIP_DETAILS: 'Dynamic_Travel_TripDetails',
DYNAMIC_DOMAIN_SELECTOR: 'Dynamic_Travel_DomainSelector',
DYNAMIC_PUBLIC_DOMAIN_ERROR: 'Dynamic_Travel_PublicDomainError',
WORKSPACE_CONFIRMATION: 'Travel_WorkspaceConfirmation',
WORKSPACE_ADDRESS: 'Travel_WorkspaceAddress',
DYNAMIC_WORKSPACE_CONFIRMATION: 'Dynamic_Travel_WorkspaceConfirmation',
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: {
Expand Down
12 changes: 6 additions & 6 deletions src/components/BookTravelButton.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -208,15 +208,15 @@ 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()));
Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.TRAVEL_VERIFY_ACCOUNT.getRoute(domain, activePolicyID)));
return;
}
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);
}
Expand Down
4 changes: 2 additions & 2 deletions src/components/ReportActionItem/MoneyRequestView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -1640,9 +1640,9 @@ 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()));
Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.TRAVEL_TRIP_DETAILS.getRoute(transactionThreadReport?.reportID, transaction.transactionID, '0', 0)));
}}
/>
)}
Expand Down
7 changes: 3 additions & 4 deletions src/components/ReportActionItem/TripDetailsView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand All @@ -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';
Expand Down Expand Up @@ -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)))
}
/>
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,10 +91,10 @@ const OPTIONS_PER_SCREEN: Partial<Record<Screen, PlatformStackNavigationOptions>
[SCREENS.SEARCH.TRANSACTIONS_CHANGE_REPORT_SEARCH_RHP]: {
animation: Animations.NONE,
},
[SCREENS.TRAVEL.VERIFY_ACCOUNT]: {
[SCREENS.TRAVEL.DYNAMIC_VERIFY_ACCOUNT]: {
animationTypeForReplace: 'push',
},
[SCREENS.TRAVEL.WORKSPACE_ADDRESS]: {
[SCREENS.TRAVEL.DYNAMIC_WORKSPACE_ADDRESS]: {
animationTypeForReplace: 'push',
},
[SCREENS.MULTIFACTOR_AUTHENTICATION.REVOKE]: {
Expand Down Expand Up @@ -235,15 +235,15 @@ const TravelModalStackNavigator = createModalStackNavigator<TravelNavigatorParam
[SCREENS.TRAVEL.TRAVEL_DOT_LINK_WEB_VIEW]: () => require<ReactComponentModule>('../../../../pages/Travel/TravelDotLinkWebview').default,
[SCREENS.TRAVEL.DYNAMIC_TCS]: () => require<ReactComponentModule>('../../../../pages/Travel/DynamicTravelTerms').default,
[SCREENS.TRAVEL.DYNAMIC_UPGRADE]: () => require<ReactComponentModule>('../../../../pages/Travel/DynamicTravelUpgrade').default,
[SCREENS.TRAVEL.TRIP_SUMMARY]: () => require<ReactComponentModule>('../../../../pages/Travel/TripSummaryPage').default,
[SCREENS.TRAVEL.TRIP_DETAILS]: () => require<ReactComponentModule>('../../../../pages/Travel/TripDetailsPage').default,
[SCREENS.TRAVEL.DYNAMIC_TRIP_SUMMARY]: () => require<ReactComponentModule>('../../../../pages/Travel/DynamicTripSummaryPage').default,
[SCREENS.TRAVEL.DYNAMIC_TRIP_DETAILS]: () => require<ReactComponentModule>('../../../../pages/Travel/DynamicTripDetailsPage').default,
[SCREENS.TRAVEL.DYNAMIC_DOMAIN_SELECTOR]: () => require<ReactComponentModule>('../../../../pages/Travel/DynamicDomainSelectorPage').default,
[SCREENS.TRAVEL.DYNAMIC_DOMAIN_PERMISSION_INFO]: () => require<ReactComponentModule>('../../../../pages/Travel/DynamicDomainPermissionInfoPage').default,
[SCREENS.TRAVEL.DYNAMIC_PUBLIC_DOMAIN_ERROR]: () => require<ReactComponentModule>('../../../../pages/Travel/DynamicPublicDomainErrorPage').default,
[SCREENS.TRAVEL.WORKSPACE_CONFIRMATION]: () => require<ReactComponentModule>('../../../../pages/Travel/WorkspaceConfirmationForTravelPage').default,
[SCREENS.TRAVEL.WORKSPACE_ADDRESS]: () => require<ReactComponentModule>('../../../../pages/Travel/WorkspaceAddressForTravelPage').default,
[SCREENS.TRAVEL.DYNAMIC_WORKSPACE_CONFIRMATION]: () => require<ReactComponentModule>('../../../../pages/Travel/DynamicWorkspaceConfirmationForTravelPage').default,
[SCREENS.TRAVEL.DYNAMIC_WORKSPACE_ADDRESS]: () => require<ReactComponentModule>('../../../../pages/Travel/DynamicWorkspaceAddressForTravelPage').default,
[SCREENS.TRAVEL.LEGAL_ENTITY_TAX_ID]: () => require<ReactComponentModule>('../../../../pages/Travel/TravelLegalEntityTaxIDPage').default,
[SCREENS.TRAVEL.VERIFY_ACCOUNT]: () => require<ReactComponentModule>('../../../../pages/Travel/VerifyAccountPage').default,
[SCREENS.TRAVEL.DYNAMIC_VERIFY_ACCOUNT]: () => require<ReactComponentModule>('../../../../pages/Travel/DynamicVerifyAccountPage').default,
});

const SplitDetailsModalStackNavigator = createModalStackNavigator<SplitDetailsNavigatorParamList>({
Expand Down
2 changes: 2 additions & 0 deletions src/libs/Navigation/linkingConfig/OldRoutes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ const oldRoutes: Record<string, string> = {
'/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',
'/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':
Expand Down
Loading
Loading