Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
e8db74a
migrate MONEY_REQUEST_STEP_CATEGORY
huult Jul 31, 2026
e4cbe56
Merge branch '83858-migrate-money-request-part-2-v3' into 83858-migra…
huult Jul 31, 2026
9b92745
update oldRoutes
huult Jul 31, 2026
867bccd
Merge branch '83858-migrate-money-request-part-2-v3' into 83858-migra…
huult Jul 31, 2026
988d1c5
Merge branch '83858-migrate-money-request-part-2-v3' into 83858-migra…
huult Aug 2, 2026
92d60d5
Merge remote-tracking branch 'upstream/main' into 83858-migrate-categ…
huult Aug 3, 2026
8182103
Merge branch '83858-migrate-money-request-part-2-v3' into 83858-migra…
huult Aug 3, 2026
616f395
Merge branch '83858-migrate-money-request-part-2-v3' into 83858-migra…
huult Aug 4, 2026
e402bf6
Merge branch '83858-migrate-money-request-part-2-v3' into 83858-migra…
huult Aug 4, 2026
2cc589d
Merge remote-tracking branch 'upstream/main' into 83858-migrate-categ…
huult Aug 4, 2026
f52bdf8
Merge remote-tracking branch 'upstream/main' into 83858-migrate-categ…
huult Aug 5, 2026
1903257
Merge remote-tracking branch 'upstream/main' into 83858-migrate-categ…
huult Aug 7, 2026
bb5773b
update import
huult Aug 7, 2026
55375c1
Merge remote-tracking branch 'upstream/main' into 83858-migrate-categ…
huult Aug 7, 2026
75b9bdf
Merge remote-tracking branch 'upstream/main' into 83858-migrate-categ…
huult Aug 10, 2026
0e0e13e
update oldRoutes
huult Aug 10, 2026
820f4de
Merge remote-tracking branch 'upstream/main' into 83858-migrate-categ…
huult Aug 11, 2026
846347d
Merge remote-tracking branch 'upstream/main' into 83858-migrate-categ…
huult Aug 12, 2026
d260102
Merge remote-tracking branch 'upstream/main' into 83858-migrate-categ…
huult Aug 12, 2026
58e7e10
update entry screens
huult Aug 12, 2026
f4c6e2f
update base path
huult Aug 12, 2026
22e8c10
update unit test
huult Aug 12, 2026
ef594bd
Merge remote-tracking branch 'upstream/main' into 83858-migrate-categ…
huult Aug 13, 2026
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
1 change: 1 addition & 0 deletions config/eslint/eslint.seatbelt.tsv
Original file line number Diff line number Diff line change
Expand Up @@ -1157,6 +1157,7 @@
"../../src/pages/iou/request/step/IOURequestEditReportCommon.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 1
"../../src/pages/iou/request/step/IOURequestEditReportCommon.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1
"../../src/pages/iou/request/step/IOURequestStepAmount.tsx" "react-hooks/set-state-in-effect" 1
"../../src/pages/iou/request/step/DynamicIOURequestStepCategory.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/IOURequestStepDistance.tsx" "react-hooks/set-state-in-effect" 1
Expand Down
44 changes: 24 additions & 20 deletions src/ROUTES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1529,6 +1529,30 @@ const DYNAMIC_ROUTES = {
getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string | undefined) => getUrlWithParams('taxAmount', {action, iouType, transactionID, reportID}),
queryParams: ['action', 'iouType', 'transactionID', 'reportID'],
},
MONEY_REQUEST_STEP_CATEGORY: {
path: 'category',
entryScreens: [
SCREENS.MONEY_REQUEST.STEP_CONFIRMATION,
SCREENS.MONEY_REQUEST.CREATE,
SCREENS.MONEY_REQUEST.STEP_PARTICIPANTS,
SCREENS.MONEY_REQUEST.SPLIT_EXPENSE_EDIT,
SCREENS.REPORT,
SCREENS.REPORT_DETAILS.DYNAMIC_ROOT,
SCREENS.RIGHT_MODAL.SEARCH_REPORT,
SCREENS.RIGHT_MODAL.EXPENSE_REPORT,
SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT,
SCREENS.SHARE.SUBMIT_DETAILS,
],
getRoute: (params: {action: IOUAction; iouType: IOUType; transactionID: string; reportID: string | undefined; reportActionID?: string}) => {
const {action, iouType, transactionID, reportID, reportActionID} = params;
return getUrlWithParams('category', {action, iouType, transactionID, reportID, reportActionID});
},
queryParams: ['action', 'iouType', 'transactionID', 'reportID', 'reportActionID'],
},
MONEY_REQUEST_STEP_CATEGORY_CREATE: {
path: 'add-category',
entryScreens: [SCREENS.MONEY_REQUEST.DYNAMIC_STEP_CATEGORY],
},
MONEY_REQUEST_ATTENDEE: {
path: 'attendees',
entryScreens: [
Expand Down Expand Up @@ -2263,26 +2287,6 @@ const ROUTES = {
return getUrlWithBackToParam(`${action as string}/${iouType as string}/amount/${transactionID}/${reportID}/${reportActionID ? `${reportActionID}/` : ''}${pageIndex}`, backTo);
},
},
MONEY_REQUEST_STEP_CATEGORY_CREATE: {
route: ':action/:iouType/category/new/:transactionID/:reportID/:reportActionID?',
getRoute: (action: IOUAction, iouType: IOUType, transactionID: string | undefined, reportID: string | undefined, reportActionID?: string, backTo = '') => {
if (!transactionID || !reportID) {
Log.warn('Invalid transactionID or reportID is used to build the MONEY_REQUEST_STEP_CATEGORY_CREATE route');
}

return getUrlWithBackToParam(`${action as string}/${iouType as string}/category/new/${transactionID}/${reportID}${reportActionID ? `/${reportActionID}` : ''}`, backTo);
},
},
MONEY_REQUEST_STEP_CATEGORY: {
route: ':action/:iouType/category/:transactionID/:reportID/:reportActionID?',
getRoute: (action: IOUAction, iouType: IOUType, transactionID: string | undefined, reportID: string | undefined, backTo = '', reportActionID?: string) => {
if (!transactionID || !reportID) {
Log.warn('Invalid transactionID or reportID is used to build the MONEY_REQUEST_STEP_CATEGORY route');
}

return getUrlWithBackToParam(`${action as string}/${iouType as string}/category/${transactionID}/${reportID}${reportActionID ? `/${reportActionID}` : ''}`, backTo);
},
},
MONEY_REQUEST_ACCOUNTANT: {
route: ':action/:iouType/accountant/:transactionID/:reportID',
getRoute: (action: IOUAction, iouType: IOUType, transactionID: string | undefined, reportID: string | undefined, backTo = '') => {
Expand Down
4 changes: 2 additions & 2 deletions src/SCREENS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -331,8 +331,8 @@ const SCREENS = {
START: 'Money_Request_Start',
STEP_UPGRADE: 'Money_Request_Step_Upgrade',
STEP_AMOUNT: 'Money_Request_Step_Amount',
STEP_CATEGORY: 'Money_Request_Step_Category',
STEP_CATEGORY_CREATE: 'Money_Request_Step_Category_Create',
DYNAMIC_STEP_CATEGORY: 'Dynamic_Money_Request_Step_Category',
DYNAMIC_STEP_CATEGORY_CREATE: 'Dynamic_Money_Request_Step_Category_Create',
STEP_DATE: 'Money_Request_Step_Date',
STEP_DESCRIPTION: 'Money_Request_Step_Description',
STEP_DISTANCE: 'Money_Request_Step_Distance',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@ import useLocalize from '@hooks/useLocalize';
import useThemeStyles from '@hooks/useThemeStyles';

import {getDecodedLeafCategoryName} from '@libs/CategoryUtils';
import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute';
import Navigation from '@libs/Navigation/Navigation';

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

import type {OnyxEntry} from 'react-native-onyx';
Expand Down Expand Up @@ -89,18 +90,18 @@ function CategoryField({
iouType,
transactionID,
reportID,
backTo: ROUTES.MONEY_REQUEST_STEP_CATEGORY.getRoute(action, iouType, transactionID, reportID, Navigation.getActiveRoute(), reportActionID),
backTo: createDynamicRoute(DYNAMIC_ROUTES.MONEY_REQUEST_STEP_CATEGORY.getRoute({action, iouType, transactionID, reportID, reportActionID})),
upgradePath: CONST.UPGRADE_PATHS.CATEGORIES,
}),
);
} else if (!policy && shouldSelectPolicy) {
Navigation.navigate(
ROUTES.SET_DEFAULT_WORKSPACE.getRoute(
ROUTES.MONEY_REQUEST_STEP_CATEGORY.getRoute(action, iouType, transactionID, reportID, Navigation.getActiveRoute(), reportActionID),
createDynamicRoute(DYNAMIC_ROUTES.MONEY_REQUEST_STEP_CATEGORY.getRoute({action, iouType, transactionID, reportID, reportActionID})),
),
);
} else {
Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CATEGORY.getRoute(action, iouType, transactionID, reportID, Navigation.getActiveRoute(), reportActionID));
Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.MONEY_REQUEST_STEP_CATEGORY.getRoute({action, iouType, transactionID, reportID, reportActionID})));
}
}}
style={[styles.moneyRequestMenuItem]}
Expand Down
39 changes: 21 additions & 18 deletions src/components/ReportActionItem/MoneyRequestView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -1350,35 +1350,38 @@ function MoneyRequestView({
transactionID: transaction.transactionID,
reportID: transactionThreadReport?.reportID,
upgradePath: CONST.UPGRADE_PATHS.CATEGORIES,
backTo: ROUTES.MONEY_REQUEST_STEP_CATEGORY.getRoute(
CONST.IOU.ACTION.EDIT,
iouType,
transaction.transactionID,
transactionThreadReport?.reportID,
Navigation.getActiveRoute(),
backTo: createDynamicRoute(
DYNAMIC_ROUTES.MONEY_REQUEST_STEP_CATEGORY.getRoute({
action: CONST.IOU.ACTION.EDIT,
iouType,
transactionID: transaction.transactionID,
reportID: transactionThreadReport?.reportID,
}),
),
}),
);
} else if (!policy && shouldSelectPolicy) {
Navigation.navigate(
ROUTES.SET_DEFAULT_WORKSPACE.getRoute(
ROUTES.MONEY_REQUEST_STEP_CATEGORY.getRoute(
CONST.IOU.ACTION.EDIT,
iouType,
transaction.transactionID,
transactionThreadReport?.reportID,
Navigation.getActiveRoute(),
createDynamicRoute(
DYNAMIC_ROUTES.MONEY_REQUEST_STEP_CATEGORY.getRoute({
action: CONST.IOU.ACTION.EDIT,
iouType,
transactionID: transaction.transactionID,
reportID: transactionThreadReport?.reportID,
}),
),
),
);
} else {
Navigation.navigate(
ROUTES.MONEY_REQUEST_STEP_CATEGORY.getRoute(
CONST.IOU.ACTION.EDIT,
iouType,
transaction.transactionID,
transactionThreadReport?.reportID,
Navigation.getActiveRoute(),
createDynamicRoute(
DYNAMIC_ROUTES.MONEY_REQUEST_STEP_CATEGORY.getRoute({
action: CONST.IOU.ACTION.EDIT,
iouType,
transactionID: transaction.transactionID,
reportID: transactionThreadReport?.reportID,
}),
),
);
}
Expand Down
14 changes: 11 additions & 3 deletions src/hooks/useParticipantSubmission.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import {READ_COMMANDS} from '@libs/API/types';
import DistanceRequestUtils from '@libs/DistanceRequestUtils';
import HttpUtils from '@libs/HttpUtils';
import {isParticipantP2P} from '@libs/IOUUtils';
import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute';
import Navigation from '@libs/Navigation/Navigation';
import {isGroupPolicy} from '@libs/PolicyUtils';
import {findSelfDMReportID, generateReportID, getReportOrDraftReport, isInvoiceRoomWithID} from '@libs/ReportUtils';
Expand All @@ -23,7 +24,7 @@ import {createDraftWorkspace, generateDefaultWorkspaceName} from '@userActions/P
import CONST from '@src/CONST';
import type {IOUAction, IOUType} from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import ROUTES from '@src/ROUTES';
import ROUTES, {DYNAMIC_ROUTES} from '@src/ROUTES';
import {lastWorkspaceNumberSelector} from '@src/selectors/Policy';
import type {Policy, Transaction} from '@src/types/onyx';
import type {Participant} from '@src/types/onyx/IOU';
Expand Down Expand Up @@ -402,7 +403,11 @@ function useParticipantSubmission({
}
Navigation.setNavigationActionToMicrotaskQueue(() => {
if (isCategorizing) {
Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CATEGORY.getRoute(action, CONST.IOU.TYPE.SUBMIT, initialTransactionID, expenseChatReportID));
Navigation.navigate(
createDynamicRoute(
DYNAMIC_ROUTES.MONEY_REQUEST_STEP_CATEGORY.getRoute({action, iouType: CONST.IOU.TYPE.SUBMIT, transactionID: initialTransactionID, reportID: expenseChatReportID}),
),
);
} else {
Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(action, CONST.IOU.TYPE.SUBMIT, initialTransactionID, expenseChatReportID, undefined, true));
}
Expand All @@ -421,7 +426,10 @@ function useParticipantSubmission({
);

const route = isCategorizing
? ROUTES.MONEY_REQUEST_STEP_CATEGORY.getRoute(action, iouType, initialTransactionID, selectedReportID.current || reportID, iouConfirmationPageRoute)
? createDynamicRoute(
DYNAMIC_ROUTES.MONEY_REQUEST_STEP_CATEGORY.getRoute({action, iouType, transactionID: initialTransactionID, reportID: selectedReportID.current || reportID}),
iouConfirmationPageRoute,
)
: iouConfirmationPageRoute;

KeyboardUtils.dismissKeyboardAndExecute(() => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -181,8 +181,8 @@ const MoneyRequestModalStackNavigator = createModalStackNavigator<MoneyRequestNa
[SCREENS.MONEY_REQUEST.STEP_AMOUNT]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/IOURequestStepAmount').default,
[SCREENS.MONEY_REQUEST.DYNAMIC_STEP_TAX_AMOUNT]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/DynamicIOURequestStepTaxAmountPage').default,
[SCREENS.MONEY_REQUEST.DYNAMIC_STEP_TAX_RATE]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/DynamicIOURequestStepTaxRatePage').default,
[SCREENS.MONEY_REQUEST.STEP_CATEGORY]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/IOURequestStepCategory').default,
[SCREENS.MONEY_REQUEST.STEP_CATEGORY_CREATE]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/IOURequestStepCategoryCreate').default,
[SCREENS.MONEY_REQUEST.DYNAMIC_STEP_CATEGORY]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/DynamicIOURequestStepCategory').default,
[SCREENS.MONEY_REQUEST.DYNAMIC_STEP_CATEGORY_CREATE]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/DynamicIOURequestStepCategoryCreate').default,
[SCREENS.MONEY_REQUEST.STEP_VENDOR]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/IOURequestStepVendor').default,
[SCREENS.MONEY_REQUEST.STEP_DATE]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/IOURequestStepDate').default,
[SCREENS.MONEY_REQUEST.STEP_DESCRIPTION]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/IOURequestStepDescription').default,
Expand Down
6 changes: 4 additions & 2 deletions src/libs/Navigation/linkingConfig/OldRoutes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -141,9 +141,11 @@ const oldRoutes: Record<string, string> = {
'/settings/wallet/enable-payments/terms*': '/settings/wallet/enable-payments/fees-and-terms/terms$1',
'/missing-personal-details/*': '/settings/wallet/missing-personal-details/$1',
'/workspaces/*/workflows/approvals/expenses-from': '/workspaces/$1/workflows/approvals/new/expenses-from',
'/*/*/category/new/*/*/*': '/r/$4/category/add-category?action=$1&iouType=$2&transactionID=$3&reportID=$4&reportActionID=$5',
'/*/*/category/new/*/*': '/r/$4/category/add-category?action=$1&iouType=$2&transactionID=$3&reportID=$4',
'/*/*/category/*/*/*': '/r/$4/category?action=$1&iouType=$2&transactionID=$3&reportID=$4&reportActionID=$5',
'/*/*/category/*/*': '/r/$4/category?action=$1&iouType=$2&transactionID=$3&reportID=$4',
'/*/*/report/*/edit*': '/r/$3/expense-report-edit?action=$1&iouType=$2&reportID=$3',
// Optional reportActionID segment must be matched by a more-specific pattern BEFORE the broad one,
// otherwise the broad pattern's trailing `*` swallows "<reportID>/<reportActionID>" together.
'/*/*/report/*/*/*': '/r/$4/expense-report?action=$1&iouType=$2&transactionID=$3&reportID=$4&reportActionID=$5',
'/*/*/report/*/*': '/r/$4/expense-report?action=$1&iouType=$2&transactionID=$3&reportID=$4',
'/*/*/tag/*/*/*/*': '/r/$5/expense-tag?action=$1&iouType=$2&orderWeight=$3&transactionID=$4&reportID=$5&reportActionID=$6',
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 @@ -1771,8 +1771,8 @@ const config: LinkingOptions<RootNavigatorParamList>['config'] = {
[SCREENS.MONEY_REQUEST.DYNAMIC_STEP_REPORT]: DYNAMIC_ROUTES.MONEY_REQUEST_STEP_REPORT.path,
[SCREENS.MONEY_REQUEST.DYNAMIC_STEP_COMPANY_INFO]: DYNAMIC_ROUTES.MONEY_REQUEST_STEP_COMPANY_INFO.path,
[SCREENS.MONEY_REQUEST.STEP_AMOUNT]: ROUTES.MONEY_REQUEST_STEP_AMOUNT.route,
[SCREENS.MONEY_REQUEST.STEP_CATEGORY]: ROUTES.MONEY_REQUEST_STEP_CATEGORY.route,
[SCREENS.MONEY_REQUEST.STEP_CATEGORY_CREATE]: ROUTES.MONEY_REQUEST_STEP_CATEGORY_CREATE.route,
[SCREENS.MONEY_REQUEST.DYNAMIC_STEP_CATEGORY]: DYNAMIC_ROUTES.MONEY_REQUEST_STEP_CATEGORY.path,
[SCREENS.MONEY_REQUEST.DYNAMIC_STEP_CATEGORY_CREATE]: DYNAMIC_ROUTES.MONEY_REQUEST_STEP_CATEGORY_CREATE.path,
[SCREENS.MONEY_REQUEST.STEP_VENDOR]: ROUTES.MONEY_REQUEST_STEP_VENDOR.route,
[SCREENS.MONEY_REQUEST.STEP_CONFIRMATION]: ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.route,
[SCREENS.MONEY_REQUEST.STEP_DATE]: ROUTES.MONEY_REQUEST_STEP_DATE.route,
Expand Down
10 changes: 3 additions & 7 deletions src/libs/Navigation/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2086,14 +2086,12 @@ type MoneyRequestNavigatorParamList = {
backTo: Routes;
reportActionID: string;
};
[SCREENS.MONEY_REQUEST.STEP_CATEGORY]: {
[SCREENS.MONEY_REQUEST.DYNAMIC_STEP_CATEGORY]: {
action: IOUAction;
iouType: Exclude<IOUType, typeof CONST.IOU.TYPE.REQUEST | typeof CONST.IOU.TYPE.SEND>;
transactionID: string;
reportActionID: string;
reportActionID?: 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;
};
[SCREENS.MONEY_REQUEST.STEP_VENDOR]: {
action: IOUAction;
Expand All @@ -2102,14 +2100,12 @@ type MoneyRequestNavigatorParamList = {
reportActionID?: string;
reportID: string;
};
[SCREENS.MONEY_REQUEST.STEP_CATEGORY_CREATE]: {
[SCREENS.MONEY_REQUEST.DYNAMIC_STEP_CATEGORY_CREATE]: {
action: IOUAction;
iouType: Exclude<IOUType, typeof CONST.IOU.TYPE.REQUEST | typeof CONST.IOU.TYPE.SEND>;
transactionID: string;
reportID: string;
reportActionID?: string;
// eslint-disable-next-line no-restricted-syntax -- backTo is needed to track where editing was initiated from (search/view or r/:reportID)
backTo?: Routes;
};
[SCREENS.MONEY_REQUEST.DYNAMIC_STEP_TAX_AMOUNT]: {
action: IOUAction;
Expand Down
Loading
Loading