Skip to content
Merged
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
2 changes: 1 addition & 1 deletion config/eslint/eslint.seatbelt.tsv
Original file line number Diff line number Diff line change
Expand Up @@ -1243,7 +1243,7 @@
"../../src/pages/iou/request/step/IOURequestStepCategory.tsx" "no-restricted-imports" 1
"../../src/pages/iou/request/step/IOURequestStepConfirmation.tsx" "@typescript-eslint/no-unsafe-type-assertion" 3
"../../src/pages/iou/request/step/IOURequestStepConfirmation.tsx" "react-hooks/preserve-manual-memoization" 1
"../../src/pages/iou/request/step/IOURequestStepDestination.tsx" "no-restricted-imports" 1
"../../src/pages/iou/request/step/DynamicIOURequestStepDestination.tsx" "no-restricted-imports" 1
"../../src/pages/iou/request/step/IOURequestStepDistance.tsx" "react-hooks/set-state-in-effect" 1
"../../src/pages/iou/request/step/IOURequestStepDistanceGPS/BackgroundLocationPermissionsFlow/index.android.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 3
"../../src/pages/iou/request/step/IOURequestStepDistanceGPS/BackgroundLocationPermissionsFlow/index.ios.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 2
Expand Down
18 changes: 8 additions & 10 deletions src/ROUTES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,14 @@ const DYNAMIC_ROUTES = {
],
getRoute: (cardID: string) => `missing-personal-details/${cardID}/confirm-magic-code` as const,
},
MONEY_REQUEST_STEP_DESTINATION: {
path: 'per-diem-destination',
entryScreens: [SCREENS.MONEY_REQUEST.CREATE],
},
MONEY_REQUEST_STEP_DESTINATION_EDIT: {
path: 'per-diem-destination-edit',
entryScreens: [SCREENS.MONEY_REQUEST.STEP_CONFIRMATION],
},
PROFILE: {
path: 'a/:accountID',
entryScreens: ['*'],
Expand Down Expand Up @@ -1998,11 +2006,6 @@ const ROUTES = {
return getUrlWithBackToParam(`${action as string}/${iouType as string}/vendor/${transactionID}/${reportID}${reportActionID ? `/${reportActionID}` : ''}`, backTo);
},
},
MONEY_REQUEST_STEP_DESTINATION: {
route: ':action/:iouType/destination/:transactionID/:reportID/:backToReport?',
getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backToReport?: string, backTo = '') =>
getUrlWithBackToParam(`${action as string}/${iouType as string}/destination/${transactionID}/${reportID}${backToReport ? `/${backToReport}` : ''}`, backTo),
},
MONEY_REQUEST_STEP_TIME: {
route: ':action/:iouType/time/:transactionID/:reportID/:backToReport?',
getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backToReport?: string, backTo = '') =>
Expand All @@ -2013,11 +2016,6 @@ const ROUTES = {
getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backToReport?: string, backTo = '') =>
getUrlWithBackToParam(`${action as string}/${iouType as string}/subrate/${transactionID}/${reportID}${backToReport ? `/${backToReport}` : ''}/0`, backTo),
},
MONEY_REQUEST_STEP_DESTINATION_EDIT: {
route: ':action/:iouType/destination/:transactionID/:reportID/edit',
getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backTo = '') =>
getUrlWithBackToParam(`${action as string}/${iouType as string}/destination/${transactionID}/${reportID}/edit`, backTo),
},
MONEY_REQUEST_STEP_TIME_EDIT: {
route: ':action/:iouType/time/:transactionID/:reportID/edit',
getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backTo = '') =>
Expand Down
4 changes: 2 additions & 2 deletions src/SCREENS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -355,10 +355,10 @@ const SCREENS = {
STATE_SELECTOR: 'Money_Request_State_Selector',
DYNAMIC_STEP_ATTENDEES: 'Dynamic_Money_Request_Attendee',
STEP_ACCOUNTANT: 'Money_Request_Accountant',
STEP_DESTINATION: 'Money_Request_Destination',
DYNAMIC_STEP_DESTINATION: 'Dynamic_Money_Request_Destination',
STEP_TIME: 'Money_Request_Time',
STEP_SUBRATE: 'Money_Request_SubRate',
STEP_DESTINATION_EDIT: 'Money_Request_Destination_Edit',
DYNAMIC_STEP_DESTINATION_EDIT: 'Dynamic_Money_Request_Destination_Edit',
STEP_TIME_EDIT: 'Money_Request_Time_Edit',
STEP_SUBRATE_EDIT: 'Money_Request_SubRate_Edit',
STEP_REPORT: 'Money_Request_Report',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@ import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
import useLocalize from '@hooks/useLocalize';
import useThemeStyles from '@hooks/useThemeStyles';

import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute';
import Navigation from '@libs/Navigation/Navigation';
import {getDestinationForDisplay, getSubratesFields, getSubratesForDisplay, getTimeDifferenceIntervals, getTimeForDisplay} from '@libs/PerDiemRequestUtils';

import CONST from '@src/CONST';
import type {IOUAction, IOUType} from '@src/CONST';
import ROUTES from '@src/ROUTES';
import ROUTES, {DYNAMIC_ROUTES} from '@src/ROUTES';
import type * as OnyxTypes from '@src/types/onyx';
import type {CustomUnit} from '@src/types/onyx/Policy';

Expand Down Expand Up @@ -108,7 +109,7 @@ function PerDiemFields({perDiemCustomUnit, transaction, isReadOnly, didConfirm,
if (!transactionID) {
return;
}
Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_DESTINATION_EDIT.getRoute(action, iouType, transactionID, reportID, Navigation.getActiveRoute()));
Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.MONEY_REQUEST_STEP_DESTINATION_EDIT.path));
}}
disabled={didConfirm}
interactive={!isReadOnly}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -207,10 +207,10 @@ const MoneyRequestModalStackNavigator = createModalStackNavigator<MoneyRequestNa
[SCREENS.MONEY_REQUEST.DYNAMIC_STEP_ATTENDEES]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/DynamicIOURequestStepAttendees').default,
[SCREENS.MONEY_REQUEST.STEP_ACCOUNTANT]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/IOURequestStepAccountant').default,
[SCREENS.MONEY_REQUEST.STEP_UPGRADE]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/IOURequestStepUpgrade').default,
[SCREENS.MONEY_REQUEST.STEP_DESTINATION]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/IOURequestStepDestination').default,
[SCREENS.MONEY_REQUEST.DYNAMIC_STEP_DESTINATION]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/DynamicIOURequestStepDestination').default,
[SCREENS.MONEY_REQUEST.STEP_TIME]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/IOURequestStepTime').default,
[SCREENS.MONEY_REQUEST.STEP_SUBRATE]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/IOURequestStepSubrate').default,
[SCREENS.MONEY_REQUEST.STEP_DESTINATION_EDIT]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/IOURequestStepDestination').default,
[SCREENS.MONEY_REQUEST.DYNAMIC_STEP_DESTINATION_EDIT]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/DynamicIOURequestStepDestination').default,
[SCREENS.MONEY_REQUEST.STEP_TIME_EDIT]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/IOURequestStepTime').default,
[SCREENS.MONEY_REQUEST.STEP_SUBRATE_EDIT]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/IOURequestStepSubrate').default,
[SCREENS.MONEY_REQUEST.RECEIPT_VIEW]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/IOURequestStepScan/ReceiptView').default,
Expand Down
7 changes: 7 additions & 0 deletions src/libs/Navigation/linkingConfig/OldRoutes.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
const oldRoutes: Record<string, string> = {
/* eslint-disable @typescript-eslint/naming-convention */
// Per diem destination step migrated to dynamic routes (#83850). Dynamic suffixes are namespaced `per-diem-*` because
// dynamic route paths must be globally unique across DYNAMIC_ROUTES (react-navigation flattens them and a bare
// `destination` collides with Sage Intacct's existing `destination` suffix). Edit variant redirects to the
// confirmation-based suffix; the wizard variant to the start-based suffix. Query is not preserved (trailing wildcard
// would swallow it) - acceptable because callers no longer append `?backTo=`.
'/*/*/destination/*/*/edit': '/$1/$2/confirmation/$3/$4/per-diem-destination-edit',
'/*/*/destination/*/*': '/$1/$2/start/$3/$4/per-diem-destination',
'/settings/*/category/*/edit': '/settings/$1/categories/category-settings/$2/category-edit',
'/settings/*/category/*': '/settings/$1/categories/category-settings/$2',
'/settings/*/tags/*/edit': '/settings/$1/tags/settings-tags-edit/$2',
Expand Down
4 changes: 2 additions & 2 deletions src/libs/Navigation/linkingConfig/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1785,10 +1785,10 @@ const config: LinkingOptions<RootNavigatorParamList>['config'] = {
[SCREENS.MONEY_REQUEST.DYNAMIC_STEP_ATTENDEES]: DYNAMIC_ROUTES.MONEY_REQUEST_ATTENDEE.path,
[SCREENS.MONEY_REQUEST.STEP_ACCOUNTANT]: ROUTES.MONEY_REQUEST_ACCOUNTANT.route,
[SCREENS.MONEY_REQUEST.STEP_UPGRADE]: ROUTES.MONEY_REQUEST_UPGRADE.route,
[SCREENS.MONEY_REQUEST.STEP_DESTINATION]: ROUTES.MONEY_REQUEST_STEP_DESTINATION.route,
[SCREENS.MONEY_REQUEST.DYNAMIC_STEP_DESTINATION]: DYNAMIC_ROUTES.MONEY_REQUEST_STEP_DESTINATION.path,
[SCREENS.MONEY_REQUEST.STEP_TIME]: ROUTES.MONEY_REQUEST_STEP_TIME.route,
[SCREENS.MONEY_REQUEST.STEP_SUBRATE]: ROUTES.MONEY_REQUEST_STEP_SUBRATE.route,
[SCREENS.MONEY_REQUEST.STEP_DESTINATION_EDIT]: ROUTES.MONEY_REQUEST_STEP_DESTINATION_EDIT.route,
[SCREENS.MONEY_REQUEST.DYNAMIC_STEP_DESTINATION_EDIT]: DYNAMIC_ROUTES.MONEY_REQUEST_STEP_DESTINATION_EDIT.path,
[SCREENS.MONEY_REQUEST.STEP_TIME_EDIT]: ROUTES.MONEY_REQUEST_STEP_TIME_EDIT.route,
[SCREENS.MONEY_REQUEST.STEP_SUBRATE_EDIT]: ROUTES.MONEY_REQUEST_STEP_SUBRATE_EDIT.route,
[SCREENS.MONEY_REQUEST.STEP_TIME_RATE]: ROUTES.MONEY_REQUEST_STEP_TIME_RATE.route,
Expand Down
9 changes: 3 additions & 6 deletions src/libs/Navigation/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2260,14 +2260,12 @@ type MoneyRequestNavigatorParamList = {
upgradePath?: ValueOf<typeof CONST.UPGRADE_PATHS>;
shouldSubmitExpense?: boolean;
};
[SCREENS.MONEY_REQUEST.STEP_DESTINATION]: {
[SCREENS.MONEY_REQUEST.DYNAMIC_STEP_DESTINATION]: {
action: IOUAction;
iouType: Exclude<IOUType, typeof CONST.IOU.TYPE.REQUEST | typeof CONST.IOU.TYPE.SEND>;
transactionID: string;
reportID: string;
backToReport?: 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 | undefined;
};
[SCREENS.MONEY_REQUEST.STEP_TIME]: {
action: IOUAction;
Expand All @@ -2288,13 +2286,12 @@ type MoneyRequestNavigatorParamList = {
pageIndex: string;
transactionID: string;
};
[SCREENS.MONEY_REQUEST.STEP_DESTINATION_EDIT]: {
[SCREENS.MONEY_REQUEST.DYNAMIC_STEP_DESTINATION_EDIT]: {
action: IOUAction;
iouType: Exclude<IOUType, typeof CONST.IOU.TYPE.REQUEST | typeof CONST.IOU.TYPE.SEND>;
transactionID: string;
reportID: 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 | undefined;
backToReport?: string;
};
[SCREENS.MONEY_REQUEST.STEP_TIME_EDIT]: {
action: IOUAction;
Expand Down
4 changes: 2 additions & 2 deletions src/pages/iou/request/IOURequestStartPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,9 @@ import {View} from 'react-native';

import type {WithWritableReportOrNotFoundProps} from './step/withWritableReportOrNotFound';

import DynamicIOURequestStepDestination from './step/DynamicIOURequestStepDestination';
import {IOURequestStepAmountWithTransactionOnly} from './step/IOURequestStepAmount';
import IOURequestStepConfirmation from './step/IOURequestStepConfirmation';
import IOURequestStepDestination from './step/IOURequestStepDestination';
import IOURequestStepDistance from './step/IOURequestStepDistance';
import IOURequestStepHours from './step/IOURequestStepHours';
import IOURequestStepPerDiemWorkspace from './step/IOURequestStepPerDiemWorkspace';
Expand Down Expand Up @@ -330,7 +330,7 @@ function IOURequestStartPage({
navigation={navigation}
/>
) : (
<IOURequestStepDestination
<DynamicIOURequestStepDestination
openedFromStartPage
ref={perDiemInputRef}
explicitPolicyID={moreThanOnePerDiemExist ? undefined : policiesWithPerDiemEnabledAndHasRates.at(0)?.id}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import WorkspaceEmptyStateSection from '@components/WorkspaceEmptyStateSection';

import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
import useDefaultExpensePolicy from '@hooks/useDefaultExpensePolicy';
import useDynamicBackPath from '@hooks/useDynamicBackPath';
import {useMemoizedLazyIllustrations} from '@hooks/useLazyAsset';
import useLocalize from '@hooks/useLocalize';
import useNetwork from '@hooks/useNetwork';
Expand Down Expand Up @@ -40,8 +41,8 @@ import {clearSubrates} from '@userActions/IOU/PerDiem';

import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import ROUTES from '@src/ROUTES';
import type SCREENS from '@src/SCREENS';
import ROUTES, {DYNAMIC_ROUTES} from '@src/ROUTES';
import SCREENS from '@src/SCREENS';
import type {Report} from '@src/types/onyx';
import {isEmptyObject} from '@src/types/utils/EmptyObject';
import isLoadingOnyxValue from '@src/types/utils/isLoadingOnyxValue';
Expand All @@ -63,23 +64,30 @@ type IOURequestStepDestinationRef = {
focus?: () => void;
};

type IOURequestStepDestinationProps = WithWritableReportOrNotFoundProps<typeof SCREENS.MONEY_REQUEST.STEP_DESTINATION | typeof SCREENS.MONEY_REQUEST.CREATE> &
WithFullTransactionOrNotFoundProps<typeof SCREENS.MONEY_REQUEST.STEP_DESTINATION | typeof SCREENS.MONEY_REQUEST.CREATE> & {
type DynamicIOURequestStepDestinationProps = WithWritableReportOrNotFoundProps<
typeof SCREENS.MONEY_REQUEST.DYNAMIC_STEP_DESTINATION | typeof SCREENS.MONEY_REQUEST.DYNAMIC_STEP_DESTINATION_EDIT | typeof SCREENS.MONEY_REQUEST.CREATE
> &
WithFullTransactionOrNotFoundProps<
typeof SCREENS.MONEY_REQUEST.DYNAMIC_STEP_DESTINATION | typeof SCREENS.MONEY_REQUEST.DYNAMIC_STEP_DESTINATION_EDIT | typeof SCREENS.MONEY_REQUEST.CREATE
> & {
openedFromStartPage?: boolean;
explicitPolicyID?: string;
ref: ForwardedRef<IOURequestStepDestinationRef>;
};

function IOURequestStepDestination({
function DynamicIOURequestStepDestination({
report,
route: {
params: {transactionID, backTo, action, iouType, reportID, backToReport},
params: {transactionID, action, iouType, reportID, backToReport},
name,
},
transaction,
openedFromStartPage = false,
explicitPolicyID,
ref,
}: IOURequestStepDestinationProps) {
}: DynamicIOURequestStepDestinationProps) {
const isEditPage = name === SCREENS.MONEY_REQUEST.DYNAMIC_STEP_DESTINATION_EDIT;
const backPath = useDynamicBackPath(isEditPage ? DYNAMIC_ROUTES.MONEY_REQUEST_STEP_DESTINATION_EDIT.path : DYNAMIC_ROUTES.MONEY_REQUEST_STEP_DESTINATION.path);
const [allPolicies] = useOnyx(ONYXKEYS.COLLECTION.POLICY);
const [userBillingGracePeriodEnds] = useOnyx(ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_USER_BILLING_GRACE_PERIOD_END);
const [ownerBillingGracePeriodEnd] = useOnyx(ONYXKEYS.NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_END);
Expand Down Expand Up @@ -120,7 +128,7 @@ function IOURequestStepDestination({
};

const navigateBack = () => {
Navigation.goBack(backTo);
Navigation.goBack(backPath);
};

const updateDestination = (destination: ListItem & {currency: string}) => {
Expand Down Expand Up @@ -155,7 +163,7 @@ function IOURequestStepDestination({
clearSubrates(transactionID);
}

if (backTo) {
if (isEditPage) {
navigateBack();
} else {
Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_TIME.getRoute(action, targetIouType, transactionID, targetReport?.reportID ?? reportID, backToReport));
Expand Down Expand Up @@ -215,11 +223,11 @@ function IOURequestStepDestination({
shouldShowOfflineIndicator={false}
>
<StepScreenWrapper
headerTitle={backTo ? translate('common.destination') : tabTitles[iouType]}
headerTitle={isEditPage ? translate('common.destination') : tabTitles[iouType]}
onBackButtonPress={navigateBack}
shouldShowWrapper={!openedFromStartPage}
shouldShowNotFoundPage={shouldShowNotFoundPage}
testID="IOURequestStepDestination"
testID="DynamicIOURequestStepDestination"
>
{isLoading && (
<ActivityIndicator
Expand Down Expand Up @@ -268,7 +276,7 @@ function IOURequestStepDestination({
);
}

const IOURequestStepDestinationWithFullTransactionOrNotFound = withFullTransactionOrNotFound(IOURequestStepDestination);
const DynamicIOURequestStepDestinationWithFullTransactionOrNotFound = withFullTransactionOrNotFound(DynamicIOURequestStepDestination);

const IOURequestStepDestinationWithWritableReportOrNotFound = withWritableReportOrNotFound(IOURequestStepDestinationWithFullTransactionOrNotFound);
export default IOURequestStepDestinationWithWritableReportOrNotFound;
const DynamicIOURequestStepDestinationWithWritableReportOrNotFound = withWritableReportOrNotFound(DynamicIOURequestStepDestinationWithFullTransactionOrNotFound);
export default DynamicIOURequestStepDestinationWithWritableReportOrNotFound;
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import useOnyx from '@hooks/useOnyx';
import usePersonalPolicy from '@hooks/usePersonalPolicy';

import {getInitialPerDiemTargetReport} from '@libs/IOUUtils';
import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute';
import Navigation from '@libs/Navigation/Navigation';
import {getActivePoliciesWithExpenseChatAndPerDiemEnabled, getPerDiemCustomUnit} from '@libs/PolicyUtils';
import {findSelfDMReportID, getPolicyExpenseChat} from '@libs/ReportUtils';
Expand All @@ -13,7 +14,7 @@ import {setTransactionReport} from '@userActions/Transaction';

import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import ROUTES from '@src/ROUTES';
import ROUTES, {DYNAMIC_ROUTES} from '@src/ROUTES';
import type SCREENS from '@src/SCREENS';

import React from 'react';
Expand Down Expand Up @@ -74,7 +75,9 @@ function IOURequestStepPerDiemWorkspace({route, navigation, transaction}: IOUReq
}
setCustomUnitID(transactionID, perDiemUnit?.customUnitID ?? CONST.CUSTOM_UNITS.FAKE_P2P_ID);
setMoneyRequestCategory(transactionID, perDiemUnit?.defaultCategory ?? '', undefined);
Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_DESTINATION.getRoute(action, targetIouType, transactionID, targetReport.reportID));
Navigation.navigate(
createDynamicRoute(DYNAMIC_ROUTES.MONEY_REQUEST_STEP_DESTINATION.path, ROUTES.MONEY_REQUEST_CREATE.getRoute(action, targetIouType, transactionID, targetReport.reportID)),
);
}}
/>
);
Expand Down
Loading
Loading