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
18 changes: 8 additions & 10 deletions src/ROUTES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,14 @@ const DYNAMIC_ROUTES = {
path: 'per-diem-destination-edit',
entryScreens: [SCREENS.MONEY_REQUEST.STEP_CONFIRMATION],
},
MONEY_REQUEST_STEP_TIME: {
path: 'per-diem-time',
entryScreens: [SCREENS.MONEY_REQUEST.DYNAMIC_STEP_DESTINATION, SCREENS.MONEY_REQUEST.CREATE],
},
MONEY_REQUEST_STEP_TIME_EDIT: {
path: 'per-diem-time-edit',
entryScreens: [SCREENS.MONEY_REQUEST.STEP_CONFIRMATION],
},
PROFILE: {
path: 'a/:accountID',
entryScreens: ['*'],
Expand Down Expand Up @@ -2310,21 +2318,11 @@ const ROUTES = {
return getUrlWithBackToParam(`${action as string}/${iouType as string}/vendor/${transactionID}/${reportID}${reportActionID ? `/${reportActionID}` : ''}`, backTo);
},
},
MONEY_REQUEST_STEP_TIME: {
route: ':action/:iouType/time/:transactionID/:reportID/:backToReport?',
getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backToReport?: string, backTo = '') =>
getUrlWithBackToParam(`${action as string}/${iouType as string}/time/${transactionID}/${reportID}${backToReport ? `/${backToReport}` : ''}`, backTo),
},
MONEY_REQUEST_STEP_SUBRATE: {
route: ':action/:iouType/subrate/:transactionID/:reportID/:backToReport?/:pageIndex',
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_TIME_EDIT: {
route: ':action/:iouType/time/:transactionID/:reportID/edit',
getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backTo = '') =>
getUrlWithBackToParam(`${action as string}/${iouType as string}/time/${transactionID}/${reportID}/edit`, backTo),
},
MONEY_REQUEST_STEP_SUBRATE_EDIT: {
route: ':action/:iouType/subrate/:transactionID/:reportID/edit/:pageIndex',
getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, pageIndex = 0, 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 = {
DYNAMIC_STEP_ATTENDEES: 'Dynamic_Money_Request_Attendee',
DYNAMIC_STEP_ACCOUNTANT: 'Dynamic_Money_Request_Accountant',
DYNAMIC_STEP_DESTINATION: 'Dynamic_Money_Request_Destination',
STEP_TIME: 'Money_Request_Time',
DYNAMIC_STEP_TIME: 'Dynamic_Money_Request_Time',
STEP_SUBRATE: 'Money_Request_SubRate',
DYNAMIC_STEP_DESTINATION_EDIT: 'Dynamic_Money_Request_Destination_Edit',
STEP_TIME_EDIT: 'Money_Request_Time_Edit',
DYNAMIC_STEP_TIME_EDIT: 'Dynamic_Money_Request_Time_Edit',
STEP_SUBRATE_EDIT: 'Money_Request_SubRate_Edit',
DYNAMIC_STEP_REPORT: 'Dynamic_Money_Request_Report',
DYNAMIC_EDIT_REPORT: 'Dynamic_Money_Request_Edit_Report',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ function PerDiemFields({perDiemCustomUnit, transaction, isReadOnly, didConfirm,
if (!transactionID) {
return;
}
Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_TIME_EDIT.getRoute(action, iouType, transactionID, reportID));
Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.MONEY_REQUEST_STEP_TIME_EDIT.path));
}}
disabled={didConfirm}
interactive={!isReadOnly}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -204,10 +204,10 @@ const MoneyRequestModalStackNavigator = createModalStackNavigator<MoneyRequestNa
[SCREENS.MONEY_REQUEST.DYNAMIC_STEP_ACCOUNTANT]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/DynamicIOURequestStepAccountant').default,
[SCREENS.MONEY_REQUEST.DYNAMIC_STEP_UPGRADE]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/DynamicIOURequestStepUpgrade').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.DYNAMIC_STEP_TIME]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/DynamicIOURequestStepTime').default,
[SCREENS.MONEY_REQUEST.STEP_SUBRATE]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/IOURequestStepSubrate').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.DYNAMIC_STEP_TIME_EDIT]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/DynamicIOURequestStepTime').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,
[SCREENS.MONEY_REQUEST.SPLIT_EXPENSE]: () => require<ReactComponentModule>('../../../../pages/iou/SplitExpensePage').default,
Expand Down
5 changes: 5 additions & 0 deletions src/libs/Navigation/linkingConfig/OldRoutes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@ const oldRoutes: Record<string, string> = {
// 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',
// Per diem time step migrated to dynamic routes (#83850). Edit variant redirects to the confirmation-based suffix;
// the wizard variant to the destination-based suffix. Query is not preserved (trailing wildcard would swallow it) -
// acceptable because callers no longer append `?backTo=`.
'/*/*/time/*/*/edit': '/$1/$2/confirmation/$3/$4/per-diem-time-edit',
'/*/*/time/*/*': '/$1/$2/destination/$3/$4/per-diem-time',

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve legacy time URLs with backToReport

The removed static time route accepted an optional backToReport path segment, so existing links like /create/submit/time/<transactionID>/<reportID>/<backToReport> no longer match this redirect because the pattern ends after the reportID. Those legacy URLs now fall through after MONEY_REQUEST_STEP_TIME was removed from the linking config instead of opening the migrated dynamic time step; add a more specific redirect that carries the extra segment into the new start/destination/time path.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@suneox Could you check the Codex comments? 😉

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

/*/*/time/*/* does not end at the reportID. In getMatchingNewRoute a trailing * compiles to (.*) (multi-segment) while non-trailing wildcards compile to ([^/]+) (exactly one segment). So the last wildcard swallows <reportID>/<backToReport> and $4 carries both segments into the new path.

'/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 @@ -1798,10 +1798,10 @@ const config: LinkingOptions<RootNavigatorParamList>['config'] = {
[SCREENS.MONEY_REQUEST.DYNAMIC_STEP_ACCOUNTANT]: DYNAMIC_ROUTES.MONEY_REQUEST_ACCOUNTANT.path,
[SCREENS.MONEY_REQUEST.DYNAMIC_STEP_UPGRADE]: DYNAMIC_ROUTES.MONEY_REQUEST_UPGRADE.path,
[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.DYNAMIC_STEP_TIME]: DYNAMIC_ROUTES.MONEY_REQUEST_STEP_TIME.path,
[SCREENS.MONEY_REQUEST.STEP_SUBRATE]: ROUTES.MONEY_REQUEST_STEP_SUBRATE.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.DYNAMIC_STEP_TIME_EDIT]: DYNAMIC_ROUTES.MONEY_REQUEST_STEP_TIME_EDIT.path,
[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,
[SCREENS.MONEY_REQUEST.STEP_HOURS]: ROUTES.MONEY_REQUEST_STEP_HOURS.route,
Expand Down
8 changes: 2 additions & 6 deletions src/libs/Navigation/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2319,14 +2319,12 @@ type MoneyRequestNavigatorParamList = {
reportID: string;
backToReport?: string;
};
[SCREENS.MONEY_REQUEST.STEP_TIME]: {
[SCREENS.MONEY_REQUEST.DYNAMIC_STEP_TIME]: {
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_SUBRATE]: {
iouType: Exclude<IOUType, typeof CONST.IOU.TYPE.REQUEST | typeof CONST.IOU.TYPE.SEND>;
Expand All @@ -2345,14 +2343,12 @@ type MoneyRequestNavigatorParamList = {
reportID: string;
backToReport?: string;
};
[SCREENS.MONEY_REQUEST.STEP_TIME_EDIT]: {
[SCREENS.MONEY_REQUEST.DYNAMIC_STEP_TIME_EDIT]: {
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_SUBRATE_EDIT]: {
iouType: Exclude<IOUType, typeof CONST.IOU.TYPE.REQUEST | typeof CONST.IOU.TYPE.SEND>;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,16 @@ function DynamicIOURequestStepDestination({
if (isEditPage) {
navigateBack();
} else {
Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_TIME.getRoute(action, targetIouType, transactionID, targetReport?.reportID ?? reportID, backToReport));
// Time is a dynamic route: build it on the start base when the destination is shown inline on the start page
// (single per-diem policy) and on the destination base otherwise, so Time's back returns to the right step.
// Only the shape of this base reaches the stack - the base route already exists and keeps its own params.
const timeBase = openedFromStartPage
? ROUTES.MONEY_REQUEST_CREATE.getRoute(action, targetIouType, transactionID, targetReport?.reportID ?? reportID, backToReport)
: createDynamicRoute(
DYNAMIC_ROUTES.MONEY_REQUEST_STEP_DESTINATION.path,
ROUTES.MONEY_REQUEST_CREATE.getRoute(action, targetIouType, transactionID, targetReport?.reportID ?? reportID, backToReport),
);
Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.MONEY_REQUEST_STEP_TIME.path, timeBase));
}
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import FullScreenLoadingIndicator from '@components/FullscreenLoadingIndicator';
import TimeModalPicker from '@components/TimeModalPicker';

import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
import useDynamicBackPath from '@hooks/useDynamicBackPath';
import useLocalize from '@hooks/useLocalize';
import useOnyx from '@hooks/useOnyx';
import usePolicyForTransaction from '@hooks/usePolicyForTransaction';
Expand Down Expand Up @@ -40,7 +41,7 @@ import StepScreenWrapper from './StepScreenWrapper';
import withFullTransactionOrNotFound from './withFullTransactionOrNotFound';
import withWritableReportOrNotFound from './withWritableReportOrNotFound';

type IOURequestStepTimeProps = WithWritableReportOrNotFoundProps<typeof SCREENS.MONEY_REQUEST.STEP_TIME | typeof SCREENS.MONEY_REQUEST.STEP_TIME_EDIT> & {
type DynamicIOURequestStepTimeProps = WithWritableReportOrNotFoundProps<typeof SCREENS.MONEY_REQUEST.DYNAMIC_STEP_TIME | typeof SCREENS.MONEY_REQUEST.DYNAMIC_STEP_TIME_EDIT> & {
/** Holds data related to Money Request view state, rather than the underlying Money Request data. */
transaction: OnyxEntry<OnyxTypes.Transaction>;

Expand All @@ -51,17 +52,18 @@ type IOURequestStepTimeProps = WithWritableReportOrNotFoundProps<typeof SCREENS.
report: OnyxEntry<Report>;
};

function IOURequestStepTime({
function DynamicIOURequestStepTime({
route: {
params: {action, iouType, reportID, transactionID, backTo, backToReport},
params: {action, iouType, reportID, transactionID, backToReport},
name,
},
transaction,
isLoadingTransaction,
report,
}: IOURequestStepTimeProps) {
}: DynamicIOURequestStepTimeProps) {
const styles = useThemeStyles();
const [allPolicies] = useOnyx(ONYXKEYS.COLLECTION.POLICY);
const {login: currentUserLogin} = useCurrentUserPersonalDetails();
const iouPolicyID = getIOURequestPolicyID(transaction, report);
const {policy} = usePolicyForTransaction({
transaction,
Expand All @@ -75,27 +77,25 @@ function IOURequestStepTime({
const currentDateAttributes = transaction?.comment?.customUnit?.attributes?.dates;
const currentStartDate = currentDateAttributes?.start ? DateUtils.extractDate(currentDateAttributes.start) : undefined;
const currentEndDate = currentDateAttributes?.end ? DateUtils.extractDate(currentDateAttributes.end) : undefined;
const isEditPage = name === SCREENS.MONEY_REQUEST.STEP_TIME_EDIT;
const isEditPage = name === SCREENS.MONEY_REQUEST.DYNAMIC_STEP_TIME_EDIT;

const shouldShowNotFound = !isValidMoneyRequestType(iouType) || isEmptyObject(policy) || (isEditPage && isEmptyObject(transaction?.comment?.customUnit));
const {login: currentUserLogin} = useCurrentUserPersonalDetails();

// The `per-diem-time-edit` suffix sits on the confirmation base, so stripping it yields that route's own path.
const editBackPath = useDynamicBackPath(DYNAMIC_ROUTES.MONEY_REQUEST_STEP_TIME_EDIT.path);
const policiesWithPerDiemEnabled = useMemo(() => getActivePoliciesWithExpenseChatAndPerDiemEnabled(allPolicies, currentUserLogin), [allPolicies, currentUserLogin]);
const hasMoreThanOnePolicyWithPerDiemEnabled = policiesWithPerDiemEnabled.length > 1;

const navigateBack = () => {
if (isEditPage) {
Navigation.goBack(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(action, iouType, transactionID, reportID));
return;
}

if (backTo) {
Navigation.goBack(backTo);
Navigation.goBack(editBackPath);
return;
}

if (transaction?.isFromGlobalCreate || iouType === CONST.IOU.TYPE.TRACK) {
// We want to navigate to destination step only when the first step was the workspace selector.
// If there is only one policy with per diem enabled, we want to navigate back to the start step because there is no separate destination step in that flow.
// We want to navigate to the destination step only when the first step was the workspace selector.
// The destination step is rebuilt from this route's own params instead of the current URL: dynamic suffixes
// carry no `:reportID`, so a URL-derived back path can miss the destination route in the stack (#97558).
if (hasMoreThanOnePolicyWithPerDiemEnabled) {
Navigation.goBack(
createDynamicRoute(DYNAMIC_ROUTES.MONEY_REQUEST_STEP_DESTINATION.path, ROUTES.MONEY_REQUEST_CREATE.getRoute(action, iouType, transactionID, reportID, backToReport)),
Expand All @@ -105,9 +105,10 @@ function IOURequestStepTime({

// If there is only one per diem policy, we can't override the reportID that is already on the stack to make sure we go back to the right screen.
Navigation.goBack();
return;
}

Navigation.goBack(ROUTES.MONEY_REQUEST_CREATE_TAB_PER_DIEM.getRoute(action, iouType, transactionID, reportID));
Navigation.goBack(ROUTES.MONEY_REQUEST_CREATE_TAB_PER_DIEM.getRoute(action, iouType, transactionID, reportID, backToReport));
};

const validate = (value: FormOnyxValues<typeof ONYXKEYS.FORMS.MONEY_REQUEST_TIME_FORM>) => {
Expand Down Expand Up @@ -164,11 +165,11 @@ function IOURequestStepTime({

return (
<StepScreenWrapper
headerTitle={backTo ? translate('iou.time') : tabTitles[iouType]}
headerTitle={isEditPage ? translate('iou.time') : tabTitles[iouType]}
onBackButtonPress={navigateBack}
shouldShowNotFoundPage={shouldShowNotFound}
shouldShowWrapper
testID="IOURequestStepTime"
testID="DynamicIOURequestStepTime"
includeSafeAreaPaddingBottom
>
<FormProvider
Expand Down Expand Up @@ -214,8 +215,8 @@ function IOURequestStepTime({
);
}

const IOURequestStepTimeWithFullTransactionOrNotFound = withFullTransactionOrNotFound(IOURequestStepTime);
const DynamicIOURequestStepTimeWithFullTransactionOrNotFound = withFullTransactionOrNotFound(DynamicIOURequestStepTime);

const IOURequestStepTimeWithWritableReportOrNotFound = withWritableReportOrNotFound(IOURequestStepTimeWithFullTransactionOrNotFound);
const DynamicIOURequestStepTimeWithWritableReportOrNotFound = withWritableReportOrNotFound(DynamicIOURequestStepTimeWithFullTransactionOrNotFound);

export default IOURequestStepTimeWithWritableReportOrNotFound;
export default DynamicIOURequestStepTimeWithWritableReportOrNotFound;
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,11 @@ function IOURequestStepPerDiemWorkspace({route, navigation, transaction}: IOUReq
}
setCustomUnitID(transactionID, perDiemUnit?.customUnitID ?? CONST.CUSTOM_UNITS.FAKE_P2P_ID);
setMoneyRequestCategory(transactionID, perDiemUnit?.defaultCategory ?? '', undefined, getCurrencyDecimals);

// Point the start route this selector lives on at the selected target before opening the destination step. The
// destination and time steps are dynamic suffixes on this route's path and carry no params of their own, so the
// whole per diem URL is generated from the params below and must match the target the flow now points at.
navigation.setParams({reportID: targetReport.reportID, iouType: targetIouType});
Navigation.navigate(
createDynamicRoute(DYNAMIC_ROUTES.MONEY_REQUEST_STEP_DESTINATION.path, ROUTES.MONEY_REQUEST_CREATE.getRoute(action, targetIouType, transactionID, targetReport.reportID)),
);
Expand Down
10 changes: 8 additions & 2 deletions src/pages/iou/request/step/IOURequestStepSubrate.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import usePolicyForTransaction from '@hooks/usePolicyForTransaction';
import useThemeStyles from '@hooks/useThemeStyles';

import {addErrorMessage} from '@libs/ErrorUtils';
import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute';
import Navigation from '@libs/Navigation/Navigation';
import TransitionTracker from '@libs/Navigation/TransitionTracker';
import {getPerDiemCustomUnit} from '@libs/PolicyUtils';
Expand All @@ -27,7 +28,7 @@ import {addSubrate, removeSubrate, updateSubrate} from '@userActions/IOU/PerDiem
import CONST from '@src/CONST';
import type {TranslationPaths} from '@src/languages/types';
import ONYXKEYS from '@src/ONYXKEYS';
import ROUTES from '@src/ROUTES';
import ROUTES, {DYNAMIC_ROUTES} from '@src/ROUTES';
import type SCREENS from '@src/SCREENS';
import type * as OnyxTypes from '@src/types/onyx';
import type {Subrate} from '@src/types/onyx/Policy';
Expand Down Expand Up @@ -127,7 +128,12 @@ function IOURequestStepSubrate({
Navigation.goBack(backTo);
return;
}
Navigation.goBack(ROUTES.MONEY_REQUEST_STEP_TIME.getRoute(action, iouType, transactionID, reportID, backToReport));
Navigation.goBack(
createDynamicRoute(
DYNAMIC_ROUTES.MONEY_REQUEST_STEP_TIME.path,
createDynamicRoute(DYNAMIC_ROUTES.MONEY_REQUEST_STEP_DESTINATION.path, ROUTES.MONEY_REQUEST_CREATE.getRoute(action, iouType, transactionID, reportID, backToReport)),
),
);
};

const validate = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.MONEY_REQUEST_SUBRATE_FORM>): Partial<Record<string, TranslationPaths>> => {
Expand Down
Loading
Loading