Skip to content
Closed
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
12 changes: 6 additions & 6 deletions config/eslint/eslint.seatbelt.tsv
Original file line number Diff line number Diff line change
Expand Up @@ -1210,14 +1210,14 @@
"../../src/pages/TransactionDuplicate/Confirmation.tsx" "react-hooks/refs" 12
"../../src/pages/TransactionDuplicate/DuplicateTransactionItem.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2
"../../src/pages/TransactionDuplicate/Review.tsx" "no-restricted-imports" 1
"../../src/pages/TransactionMerge/ConfirmationPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1
"../../src/pages/TransactionMerge/ConfirmationPage.tsx" "no-restricted-imports" 1
"../../src/pages/TransactionMerge/DetailsReviewPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1
"../../src/pages/TransactionMerge/DetailsReviewPage.tsx" "no-restricted-imports" 1
"../../src/pages/TransactionMerge/DynamicConfirmationPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1
"../../src/pages/TransactionMerge/DynamicConfirmationPage.tsx" "no-restricted-imports" 1
"../../src/pages/TransactionMerge/DynamicDetailsReviewPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1
"../../src/pages/TransactionMerge/DynamicDetailsReviewPage.tsx" "no-restricted-imports" 1
"../../src/pages/TransactionMerge/MergeTransactionItem.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1
"../../src/pages/TransactionMerge/MergeTransactionsListContent.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1
"../../src/pages/TransactionMerge/ReceiptReviewPage.tsx" "no-restricted-imports" 1
"../../src/pages/TransactionMerge/TransactionMergeReceipts.tsx" "no-restricted-imports" 1
"../../src/pages/TransactionMerge/DynamicReceiptReviewPage.tsx" "no-restricted-imports" 1
"../../src/pages/TransactionMerge/DynamicTransactionMergeReceipts.tsx" "no-restricted-imports" 1
"../../src/pages/Travel/DynamicDomainPermissionInfoPage.tsx" "no-restricted-imports" 1
"../../src/pages/Travel/DynamicDomainSelectorPage.tsx" "no-restricted-imports" 1
"../../src/pages/Travel/DynamicPublicDomainErrorPage.tsx" "no-restricted-imports" 1
Expand Down
76 changes: 44 additions & 32 deletions src/ROUTES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1117,6 +1117,50 @@ const DYNAMIC_ROUTES = {
path: 'initial-list-value',
entryScreens: [SCREENS.WORKSPACE.REPORT_FIELDS_CREATE],
},
MERGE_TRANSACTION_LIST: {
path: 'merge/:transactionID',
entryScreens: [SCREENS.REPORT, SCREENS.RIGHT_MODAL.SEARCH_REPORT, SCREENS.RIGHT_MODAL.EXPENSE_REPORT, SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT, SCREENS.SEARCH.ROOT],
getRoute: (transactionID: string) => `merge/${transactionID}` as const,
},
MERGE_TRANSACTION_RECEIPT: {
path: 'merge/:transactionID/receipt',
entryScreens: [
SCREENS.MERGE_TRANSACTION.DYNAMIC_LIST_PAGE,
SCREENS.REPORT,
SCREENS.RIGHT_MODAL.SEARCH_REPORT,
SCREENS.RIGHT_MODAL.EXPENSE_REPORT,
SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT,
SCREENS.SEARCH.ROOT,
],
getRoute: (transactionID: string) => `merge/${transactionID}/receipt` as const,
},
MERGE_TRANSACTION_DETAILS: {
path: 'merge/:transactionID/details',
entryScreens: [
SCREENS.MERGE_TRANSACTION.DYNAMIC_LIST_PAGE,
SCREENS.MERGE_TRANSACTION.DYNAMIC_RECEIPT_PAGE,
SCREENS.REPORT,
SCREENS.RIGHT_MODAL.SEARCH_REPORT,
SCREENS.RIGHT_MODAL.EXPENSE_REPORT,
SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT,
SCREENS.SEARCH.ROOT,
],
getRoute: (transactionID: string) => `merge/${transactionID}/details` as const,
},
MERGE_TRANSACTION_CONFIRMATION: {
path: 'merge/:transactionID/confirmation',
entryScreens: [
SCREENS.MERGE_TRANSACTION.DYNAMIC_LIST_PAGE,
SCREENS.MERGE_TRANSACTION.DYNAMIC_RECEIPT_PAGE,
SCREENS.MERGE_TRANSACTION.DYNAMIC_DETAILS_PAGE,
SCREENS.REPORT,
SCREENS.RIGHT_MODAL.SEARCH_REPORT,
SCREENS.RIGHT_MODAL.EXPENSE_REPORT,
SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT,
SCREENS.SEARCH.ROOT,
],
getRoute: (transactionID: string) => `merge/${transactionID}/confirmation` as const,
},
} as const satisfies DynamicRoutes;

const ROUTES = {
Expand Down Expand Up @@ -3565,38 +3609,6 @@ const ROUTES = {

getRoute: (threadReportID: string, backTo?: string) => getUrlWithBackToParam(`r/${threadReportID}/duplicates/confirm` as const, backTo),
},
MERGE_TRANSACTION_LIST_PAGE: {
route: 'merge/:transactionID',

getRoute: (transactionID: string, backTo: string, isOnSearch = false) => {
const url = getUrlWithBackToParam(`merge/${transactionID}` as const, backTo);
return isOnSearch ? (`${url}&isOnSearch=true` as const) : url;
},
},
MERGE_TRANSACTION_RECEIPT_PAGE: {
route: 'merge/:transactionID/receipt',

getRoute: (transactionID: string, backTo: string, isOnSearch = false) => {
const url = getUrlWithBackToParam(`merge/${transactionID}/receipt` as const, backTo);
return isOnSearch ? (`${url}&isOnSearch=true` as const) : url;
},
},
MERGE_TRANSACTION_DETAILS_PAGE: {
route: 'merge/:transactionID/details',

getRoute: (transactionID: string, backTo: string, isOnSearch = false) => {
const url = getUrlWithBackToParam(`merge/${transactionID}/details` as const, backTo);
return isOnSearch ? (`${url}&isOnSearch=true` as const) : url;
},
},
MERGE_TRANSACTION_CONFIRMATION_PAGE: {
route: 'merge/:transactionID/confirmation',

getRoute: (transactionID: string, backTo: string, isOnSearch = false) => {
const url = getUrlWithBackToParam(`merge/${transactionID}/confirmation` as const, backTo);
return isOnSearch ? (`${url}&isOnSearch=true` as const) : url;
},
},
POLICY_ACCOUNTING_XERO_SETUP: {
route: 'workspaces/:policyID/accounting/xero/setup',
getRoute: (policyID: string) => `workspaces/${policyID}/accounting/xero/setup` as const,
Expand Down
8 changes: 4 additions & 4 deletions src/SCREENS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -393,10 +393,10 @@ const SCREENS = {
},

MERGE_TRANSACTION: {
LIST_PAGE: 'Merge_Transaction_List_Page',
RECEIPT_PAGE: 'Merge_Transaction_Receipt_Page',
DETAILS_PAGE: 'Merge_Transaction_Details_Page',
CONFIRMATION_PAGE: 'Merge_Transaction_Confirmation_Page',
DYNAMIC_LIST_PAGE: 'Dynamic_Merge_Transaction_List_Page',
DYNAMIC_RECEIPT_PAGE: 'Dynamic_Merge_Transaction_Receipt_Page',
DYNAMIC_DETAILS_PAGE: 'Dynamic_Merge_Transaction_Details_Page',
DYNAMIC_CONFIRMATION_PAGE: 'Dynamic_Merge_Transaction_Confirmation_Page',
},

IOU_SEND: {
Expand Down
3 changes: 1 addition & 2 deletions src/components/MoneyRequestHeaderSecondaryActions.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -381,8 +381,7 @@ function MoneyRequestHeaderSecondaryActions({reportID, onBackButtonPress}: Money
if (!transaction) {
return;
}
const isOnSearch = route.name.toLowerCase().startsWith('search');
setupMergeTransactionDataAndNavigate(transaction.transactionID, [transaction], localeCompare, getCurrencyDecimals, [], false, isOnSearch);
setupMergeTransactionDataAndNavigate(transaction.transactionID, [transaction], localeCompare, getCurrencyDecimals, [], false);
},
},
[CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.DUPLICATE]: {
Expand Down
2 changes: 1 addition & 1 deletion src/hooks/useSearchBulkActions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2024,7 +2024,7 @@ function useSearchBulkActions({queryJSON}: UseSearchBulkActionsParams) {
text: translate('common.merge'),
icon: expensifyIcons.ArrowCollapse,
value: CONST.SEARCH.BULK_ACTION_TYPES.MERGE,
onSelected: () => setupMergeTransactionDataAndNavigate(transactionID, searchedTransactions, localeCompare, getCurrencyDecimals, reports, false, true),
onSelected: () => setupMergeTransactionDataAndNavigate(transactionID, searchedTransactions, localeCompare, getCurrencyDecimals, reports, false),
});
}
}
Expand Down
1 change: 0 additions & 1 deletion src/hooks/useSelectedTransactionsActions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -470,7 +470,6 @@ function useSelectedTransactionsActions({
getCurrencyDecimals,
[],
false,
isOnSearch,
selectedTransactionsList.length > 1 ? [policy, policy] : undefined,
),
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1178,10 +1178,10 @@ const TransactionDuplicateStackNavigator = createModalStackNavigator<Transaction
});

const MergeTransactionStackNavigator = createModalStackNavigator<MergeTransactionNavigatorParamList>({
[SCREENS.MERGE_TRANSACTION.LIST_PAGE]: () => require<ReactComponentModule>('../../../../pages/TransactionMerge/MergeTransactionsListPage').default,
[SCREENS.MERGE_TRANSACTION.RECEIPT_PAGE]: () => require<ReactComponentModule>('../../../../pages/TransactionMerge/ReceiptReviewPage').default,
[SCREENS.MERGE_TRANSACTION.DETAILS_PAGE]: () => require<ReactComponentModule>('../../../../pages/TransactionMerge/DetailsReviewPage').default,
[SCREENS.MERGE_TRANSACTION.CONFIRMATION_PAGE]: () => require<ReactComponentModule>('../../../../pages/TransactionMerge/ConfirmationPage').default,
[SCREENS.MERGE_TRANSACTION.DYNAMIC_LIST_PAGE]: () => require<ReactComponentModule>('../../../../pages/TransactionMerge/DynamicMergeTransactionsListPage').default,
[SCREENS.MERGE_TRANSACTION.DYNAMIC_RECEIPT_PAGE]: () => require<ReactComponentModule>('../../../../pages/TransactionMerge/DynamicReceiptReviewPage').default,
[SCREENS.MERGE_TRANSACTION.DYNAMIC_DETAILS_PAGE]: () => require<ReactComponentModule>('../../../../pages/TransactionMerge/DynamicDetailsReviewPage').default,
[SCREENS.MERGE_TRANSACTION.DYNAMIC_CONFIRMATION_PAGE]: () => require<ReactComponentModule>('../../../../pages/TransactionMerge/DynamicConfirmationPage').default,
});

const SearchReportActionsModalStackNavigator = createModalStackNavigator<SearchReportActionsParamList>({
Expand Down
8 changes: 4 additions & 4 deletions src/libs/Navigation/linkingConfig/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1876,10 +1876,10 @@ const config: LinkingOptions<RootNavigatorParamList>['config'] = {
},
[SCREENS.RIGHT_MODAL.MERGE_TRANSACTION]: {
screens: {
[SCREENS.MERGE_TRANSACTION.LIST_PAGE]: ROUTES.MERGE_TRANSACTION_LIST_PAGE.route,
[SCREENS.MERGE_TRANSACTION.RECEIPT_PAGE]: ROUTES.MERGE_TRANSACTION_RECEIPT_PAGE.route,
[SCREENS.MERGE_TRANSACTION.DETAILS_PAGE]: ROUTES.MERGE_TRANSACTION_DETAILS_PAGE.route,
[SCREENS.MERGE_TRANSACTION.CONFIRMATION_PAGE]: ROUTES.MERGE_TRANSACTION_CONFIRMATION_PAGE.route,
[SCREENS.MERGE_TRANSACTION.DYNAMIC_LIST_PAGE]: DYNAMIC_ROUTES.MERGE_TRANSACTION_LIST.path,
[SCREENS.MERGE_TRANSACTION.DYNAMIC_RECEIPT_PAGE]: DYNAMIC_ROUTES.MERGE_TRANSACTION_RECEIPT.path,
[SCREENS.MERGE_TRANSACTION.DYNAMIC_DETAILS_PAGE]: DYNAMIC_ROUTES.MERGE_TRANSACTION_DETAILS.path,
[SCREENS.MERGE_TRANSACTION.DYNAMIC_CONFIRMATION_PAGE]: DYNAMIC_ROUTES.MERGE_TRANSACTION_CONFIRMATION.path,
},
},
[SCREENS.RIGHT_MODAL.SPLIT_DETAILS]: {
Expand Down
20 changes: 4 additions & 16 deletions src/libs/Navigation/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2590,29 +2590,17 @@ type TransactionDuplicateNavigatorParamList = {
};

type MergeTransactionNavigatorParamList = {
[SCREENS.MERGE_TRANSACTION.LIST_PAGE]: {
[SCREENS.MERGE_TRANSACTION.DYNAMIC_LIST_PAGE]: {
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?: Routes;
isOnSearch?: boolean;
};
[SCREENS.MERGE_TRANSACTION.RECEIPT_PAGE]: {
[SCREENS.MERGE_TRANSACTION.DYNAMIC_RECEIPT_PAGE]: {
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?: Routes;
isOnSearch?: boolean;
};
[SCREENS.MERGE_TRANSACTION.DETAILS_PAGE]: {
[SCREENS.MERGE_TRANSACTION.DYNAMIC_DETAILS_PAGE]: {
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?: Routes;
isOnSearch?: boolean;
};
[SCREENS.MERGE_TRANSACTION.CONFIRMATION_PAGE]: {
[SCREENS.MERGE_TRANSACTION.DYNAMIC_CONFIRMATION_PAGE]: {
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?: Routes;
isOnSearch?: boolean;
};
};

Expand Down
14 changes: 8 additions & 6 deletions src/libs/actions/MergeTransaction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import {
shouldNavigateToReceiptReview,
} from '@libs/MergeTransactionUtils';
import type {MergeFieldKey, MergeTransactionUpdateValues} from '@libs/MergeTransactionUtils';
import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute';
import Navigation from '@libs/Navigation/Navigation';
import {isPaidGroupPolicy, isPolicyAdmin} from '@libs/PolicyUtils';
import {getIOUActionForReportID, getReportAction, getTrackExpenseActionableWhisper} from '@libs/ReportActionsUtils';
Expand All @@ -30,7 +31,8 @@ import {
import CONST from '@src/CONST';
import {isDistanceRequest, isTransactionPendingDelete} from '@src/libs/TransactionUtils';
import ONYXKEYS from '@src/ONYXKEYS';
import ROUTES from '@src/ROUTES';
import {DYNAMIC_ROUTES} from '@src/ROUTES';
import type {Route} from '@src/ROUTES';
import type {
CardList,
MergeTransaction,
Expand Down Expand Up @@ -76,8 +78,8 @@ function setupMergeTransactionDataAndNavigate(
getCurrencyDecimals: CurrencyListActionsContextType['getCurrencyDecimals'],
searchReports?: Report[],
isSelectingSourceTransaction?: boolean,
isOnSearch?: boolean,
policies?: Array<OnyxEntry<Policy>>,
basePath?: Route,
) {
if (!transactions.length || transactions.length > 2) {
return;
Expand All @@ -87,7 +89,7 @@ function setupMergeTransactionDataAndNavigate(
const transaction = transactions.at(0);
if (transaction) {
setupMergeTransactionData(navigationTransactionID, {targetTransactionID: transaction.transactionID});
Navigation.navigate(ROUTES.MERGE_TRANSACTION_LIST_PAGE.getRoute(transaction.transactionID, Navigation.getActiveRoute(), isOnSearch));
Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.MERGE_TRANSACTION_LIST.getRoute(transaction.transactionID)));
return;
}
}
Expand All @@ -110,7 +112,7 @@ function setupMergeTransactionDataAndNavigate(
}
if (shouldNavigateToReceiptReview([targetTransaction, sourceTransaction])) {
// Navigate to the receipt review page if both transactions have a receipt
Navigation.navigate(ROUTES.MERGE_TRANSACTION_RECEIPT_PAGE.getRoute(navigationTransactionID, Navigation.getActiveRoute(), isOnSearch));
Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.MERGE_TRANSACTION_RECEIPT.getRoute(navigationTransactionID), basePath));
} else {
const receipt = targetTransaction.receipt?.receiptID ? targetTransaction.receipt : sourceTransaction.receipt;
if (receipt) {
Expand All @@ -130,11 +132,11 @@ function setupMergeTransactionDataAndNavigate(
if (!conflictFields.length) {
// If there are no conflict fields, we should set mergeable data and navigate to the confirmation page
setMergeTransactionKey(navigationTransactionID, mergeableData);
Navigation.navigate(ROUTES.MERGE_TRANSACTION_CONFIRMATION_PAGE.getRoute(navigationTransactionID, Navigation.getActiveRoute(), isOnSearch));
Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.MERGE_TRANSACTION_CONFIRMATION.getRoute(navigationTransactionID), basePath));
return;
}

Navigation.navigate(ROUTES.MERGE_TRANSACTION_DETAILS_PAGE.getRoute(navigationTransactionID, Navigation.getActiveRoute(), isOnSearch));
Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.MERGE_TRANSACTION_DETAILS.getRoute(navigationTransactionID), basePath));
}
}

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

import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
import useDelegateAccountID from '@hooks/useDelegateAccountID';
import useDynamicBackPath from '@hooks/useDynamicBackPath';
import useLocalize from '@hooks/useLocalize';
import useMergeTransactions from '@hooks/useMergeTransactions';
import useOnyx from '@hooks/useOnyx';
Expand All @@ -29,7 +30,7 @@ import type {SkeletonSpanReasonAttributes} from '@libs/telemetry/useSkeletonSpan

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 {personalDetailsLoginSelector} from '@src/selectors/PersonalDetails';
import type {Transaction} from '@src/types/onyx';
Expand All @@ -41,14 +42,15 @@ import {isTrackIntentUserSelector} from '@selectors/Onboarding';
import React, {useState} from 'react';
import {View} from 'react-native';

type ConfirmationPageProps = PlatformStackScreenProps<MergeTransactionNavigatorParamList, typeof SCREENS.MERGE_TRANSACTION.CONFIRMATION_PAGE>;
type DynamicConfirmationPageProps = PlatformStackScreenProps<MergeTransactionNavigatorParamList, typeof SCREENS.MERGE_TRANSACTION.DYNAMIC_CONFIRMATION_PAGE>;

function ConfirmationPage({route}: ConfirmationPageProps) {
function DynamicConfirmationPage({route}: DynamicConfirmationPageProps) {
const {translate} = useLocalize();
const styles = useThemeStyles();
const [isMergingExpenses, setIsMergingExpenses] = useState(false);

const {transactionID, isOnSearch, backTo} = route.params;
const {transactionID} = route.params;
const backTo = useDynamicBackPath(DYNAMIC_ROUTES.MERGE_TRANSACTION_CONFIRMATION.path);
const [mergeTransaction, mergeTransactionMetadata] = useOnyx(`${ONYXKEYS.COLLECTION.MERGE_TRANSACTION}${getNonEmptyStringOnyxID(transactionID)}`);
const {targetTransaction, sourceTransaction, targetTransactionReport, targetTransactionPolicy} = useMergeTransactions({mergeTransaction});
const [allTransactionViolations] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS);
Expand Down Expand Up @@ -113,7 +115,7 @@ function ConfirmationPage({route}: ConfirmationPageProps) {
const searchReportIDToOpen = targetTransactionThreadReportID ?? reportIDToDismiss;

// If we're in search (or the topmost route is search), dismiss the modal and open the expense in the RHP
if ((isOnSearch || isSearchTopmostFullScreenRoute()) && searchReportIDToOpen) {
if (isSearchTopmostFullScreenRoute() && searchReportIDToOpen) {
Navigation.dismissModal();
Navigation.setNavigationActionToMicrotaskQueue(() => {
Navigation.navigate(ROUTES.SEARCH_REPORT.getRoute({reportID: searchReportIDToOpen}));
Expand All @@ -131,15 +133,15 @@ function ConfirmationPage({route}: ConfirmationPageProps) {

if (isLoadingOnyxValue(mergeTransactionMetadata)) {
const reasonAttributes: SkeletonSpanReasonAttributes = {
context: 'TransactionMerge.ConfirmationPage',
context: 'TransactionMerge.DynamicConfirmationPage',
isLoadingMergeTransaction: isLoadingOnyxValue(mergeTransactionMetadata),
};
return <FullScreenLoadingIndicator reasonAttributes={reasonAttributes} />;
}

return (
<ScreenWrapper
testID="ConfirmationPage"
testID="DynamicConfirmationPage"
shouldEnableMaxHeight
includeSafeAreaPaddingBottom
>
Expand Down Expand Up @@ -176,4 +178,4 @@ function ConfirmationPage({route}: ConfirmationPageProps) {
);
}

export default ConfirmationPage;
export default DynamicConfirmationPage;
Loading
Loading