Skip to content
Draft
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
40 changes: 16 additions & 24 deletions src/ROUTES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -369,6 +369,22 @@ const DYNAMIC_ROUTES = {
entryScreens: [SCREENS.REPORT, SCREENS.RIGHT_MODAL.SEARCH_REPORT, SCREENS.RIGHT_MODAL.EXPENSE_REPORT, SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT],
getRoute: (reportID: string, reportActionID: string) => `flag/${reportID}/${reportActionID}`,
},
TRANSACTION_DUPLICATE_REVIEW_DESCRIPTION: {
path: 'duplicates/review/description',
entryScreens: [SCREENS.REPORT, SCREENS.RIGHT_MODAL.SEARCH_REPORT, SCREENS.RIGHT_MODAL.EXPENSE_REPORT, SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT],
},
TRANSACTION_DUPLICATE_REVIEW_REIMBURSABLE: {
path: 'duplicates/review/reimbursable',
entryScreens: [SCREENS.REPORT, SCREENS.RIGHT_MODAL.SEARCH_REPORT, SCREENS.RIGHT_MODAL.EXPENSE_REPORT, SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT],
},
TRANSACTION_DUPLICATE_REVIEW_BILLABLE: {
path: 'duplicates/review/billable',
entryScreens: [SCREENS.REPORT, SCREENS.RIGHT_MODAL.SEARCH_REPORT, SCREENS.RIGHT_MODAL.EXPENSE_REPORT, SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT],
},
TRANSACTION_DUPLICATE_CONFIRMATION: {
path: 'duplicates/confirm',
entryScreens: [SCREENS.REPORT, SCREENS.RIGHT_MODAL.SEARCH_REPORT, SCREENS.RIGHT_MODAL.EXPENSE_REPORT, SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT],
},
} as const satisfies DynamicRoutes;

const ROUTES = {
Expand Down Expand Up @@ -3407,30 +3423,6 @@ const ROUTES = {
// eslint-disable-next-line no-restricted-syntax -- Legacy route generation
getRoute: (threadReportID: string, backTo?: string) => getUrlWithBackToParam(`r/${threadReportID}/duplicates/review/tax-code` as const, backTo),
},
TRANSACTION_DUPLICATE_REVIEW_DESCRIPTION_PAGE: {
route: 'r/:threadReportID/duplicates/review/description',

// eslint-disable-next-line no-restricted-syntax -- Legacy route generation
getRoute: (threadReportID: string, backTo?: string) => getUrlWithBackToParam(`r/${threadReportID}/duplicates/review/description` as const, backTo),
},
TRANSACTION_DUPLICATE_REVIEW_REIMBURSABLE_PAGE: {
route: 'r/:threadReportID/duplicates/review/reimbursable',

// eslint-disable-next-line no-restricted-syntax -- Legacy route generation
getRoute: (threadReportID: string, backTo?: string) => getUrlWithBackToParam(`r/${threadReportID}/duplicates/review/reimbursable` as const, backTo),
},
TRANSACTION_DUPLICATE_REVIEW_BILLABLE_PAGE: {
route: 'r/:threadReportID/duplicates/review/billable',

// eslint-disable-next-line no-restricted-syntax -- Legacy route generation
getRoute: (threadReportID: string, backTo?: string) => getUrlWithBackToParam(`r/${threadReportID}/duplicates/review/billable` as const, backTo),
},
TRANSACTION_DUPLICATE_CONFIRMATION_PAGE: {
route: 'r/:threadReportID/duplicates/confirm',

// eslint-disable-next-line no-restricted-syntax -- Legacy route generation
getRoute: (threadReportID: string, backTo?: string) => getUrlWithBackToParam(`r/${threadReportID}/duplicates/confirm` as const, backTo),
},
MERGE_TRANSACTION_LIST_PAGE: {
route: 'merge/:transactionID',

Expand Down
8 changes: 4 additions & 4 deletions src/SCREENS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -406,11 +406,11 @@ const SCREENS = {
MERCHANT: 'Transaction_Duplicate_Merchant',
CATEGORY: 'Transaction_Duplicate_Category',
TAG: 'Transaction_Duplicate_Tag',
DESCRIPTION: 'Transaction_Duplicate_Description',
DYNAMIC_REVIEW_DESCRIPTION: 'Dynamic_Transaction_Duplicate_Review_Description',
TAX_CODE: 'Transaction_Duplicate_Tax_Code',
REIMBURSABLE: 'Transaction_Duplicate_Reimbursable',
BILLABLE: 'Transaction_Duplicate_Billable',
CONFIRMATION: 'Transaction_Duplicate_Confirmation',
DYNAMIC_REVIEW_REIMBURSABLE: 'Dynamic_Transaction_Duplicate_Review_Reimbursable',
DYNAMIC_REVIEW_BILLABLE: 'Dynamic_Transaction_Duplicate_Review_Billable',
DYNAMIC_CONFIRMATION: 'Dynamic_Transaction_Duplicate_Confirmation',
},

MERGE_TRANSACTION: {
Expand Down
18 changes: 10 additions & 8 deletions src/hooks/useReviewDuplicatesNavigation.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import {useEffect, useMemo, useState} from 'react';
import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute';
import Navigation from '@libs/Navigation/Navigation';
import CONST from '@src/CONST';
import ROUTES from '@src/ROUTES';
import ROUTES, {DYNAMIC_ROUTES} from '@src/ROUTES';
import type {Route} from '@src/ROUTES';

type StepName = 'description' | 'merchant' | 'category' | 'billable' | 'tag' | 'taxCode' | 'reimbursable' | 'confirmation';
Expand All @@ -11,6 +12,7 @@ function useReviewDuplicatesNavigation(stepNames: string[], currentScreenName: S
const [prevScreen, setPrevScreen] = useState<StepName>();
const [currentScreenIndex, setCurrentScreenIndex] = useState(0);
const intersection = useMemo(() => CONST.REVIEW_DUPLICATES_ORDER.filter((element) => stepNames.includes(element)), [stepNames]);
const duplicateFlowBasePath = useMemo(() => ROUTES.REPORT_WITH_ID.getRoute(threadReportID), [threadReportID]);
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.

You can remove the useMemo here. React compiler handles this memoization automatically


useEffect(() => {
if (currentScreenName === 'confirmation') {
Expand All @@ -37,16 +39,16 @@ function useReviewDuplicatesNavigation(stepNames: string[], currentScreenName: S
Navigation.goBack(ROUTES.TRANSACTION_DUPLICATE_REVIEW_TAG_PAGE.getRoute(threadReportID, backTo));
break;
case 'description':
Navigation.goBack(ROUTES.TRANSACTION_DUPLICATE_REVIEW_DESCRIPTION_PAGE.getRoute(threadReportID, backTo));
Navigation.goBack(createDynamicRoute(DYNAMIC_ROUTES.TRANSACTION_DUPLICATE_REVIEW_DESCRIPTION.path, duplicateFlowBasePath));
break;
case 'taxCode':
Navigation.goBack(ROUTES.TRANSACTION_DUPLICATE_REVIEW_TAX_CODE_PAGE.getRoute(threadReportID, backTo));
break;
case 'reimbursable':
Navigation.goBack(ROUTES.TRANSACTION_DUPLICATE_REVIEW_REIMBURSABLE_PAGE.getRoute(threadReportID, backTo));
Navigation.goBack(createDynamicRoute(DYNAMIC_ROUTES.TRANSACTION_DUPLICATE_REVIEW_REIMBURSABLE.path, duplicateFlowBasePath));
break;
case 'billable':
Navigation.goBack(ROUTES.TRANSACTION_DUPLICATE_REVIEW_BILLABLE_PAGE.getRoute(threadReportID, backTo));
Navigation.goBack(createDynamicRoute(DYNAMIC_ROUTES.TRANSACTION_DUPLICATE_REVIEW_BILLABLE.path, duplicateFlowBasePath));
break;
default:
if (backTo) {
Expand All @@ -70,19 +72,19 @@ function useReviewDuplicatesNavigation(stepNames: string[], currentScreenName: S
Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_TAG_PAGE.getRoute(threadReportID, backTo));
break;
case 'description':
Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_DESCRIPTION_PAGE.getRoute(threadReportID, backTo));
Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.TRANSACTION_DUPLICATE_REVIEW_DESCRIPTION.path, duplicateFlowBasePath));
break;
case 'taxCode':
Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_TAX_CODE_PAGE.getRoute(threadReportID, backTo));
break;
case 'reimbursable':
Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_REIMBURSABLE_PAGE.getRoute(threadReportID, backTo));
Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.TRANSACTION_DUPLICATE_REVIEW_REIMBURSABLE.path, duplicateFlowBasePath));
break;
case 'billable':
Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_REVIEW_BILLABLE_PAGE.getRoute(threadReportID, backTo));
Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.TRANSACTION_DUPLICATE_REVIEW_BILLABLE.path, duplicateFlowBasePath));
break;
default:
Navigation.navigate(ROUTES.TRANSACTION_DUPLICATE_CONFIRMATION_PAGE.getRoute(threadReportID, backTo));
Navigation.navigate(createDynamicRoute(DYNAMIC_ROUTES.TRANSACTION_DUPLICATE_CONFIRMATION.path, duplicateFlowBasePath));
break;
}
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1016,11 +1016,11 @@ const TransactionDuplicateStackNavigator = createModalStackNavigator<Transaction
[SCREENS.TRANSACTION_DUPLICATE.MERCHANT]: () => require<ReactComponentModule>('../../../../pages/TransactionDuplicate/ReviewMerchant').default,
[SCREENS.TRANSACTION_DUPLICATE.CATEGORY]: () => require<ReactComponentModule>('../../../../pages/TransactionDuplicate/ReviewCategory').default,
[SCREENS.TRANSACTION_DUPLICATE.TAG]: () => require<ReactComponentModule>('../../../../pages/TransactionDuplicate/ReviewTag').default,
[SCREENS.TRANSACTION_DUPLICATE.DESCRIPTION]: () => require<ReactComponentModule>('../../../../pages/TransactionDuplicate/ReviewDescription').default,
[SCREENS.TRANSACTION_DUPLICATE.DYNAMIC_REVIEW_DESCRIPTION]: () => require<ReactComponentModule>('../../../../pages/TransactionDuplicate/ReviewDescription').default,
[SCREENS.TRANSACTION_DUPLICATE.TAX_CODE]: () => require<ReactComponentModule>('../../../../pages/TransactionDuplicate/ReviewTaxCode').default,
[SCREENS.TRANSACTION_DUPLICATE.BILLABLE]: () => require<ReactComponentModule>('../../../../pages/TransactionDuplicate/ReviewBillable').default,
[SCREENS.TRANSACTION_DUPLICATE.REIMBURSABLE]: () => require<ReactComponentModule>('../../../../pages/TransactionDuplicate/ReviewReimbursable').default,
[SCREENS.TRANSACTION_DUPLICATE.CONFIRMATION]: () => require<ReactComponentModule>('../../../../pages/TransactionDuplicate/Confirmation').default,
[SCREENS.TRANSACTION_DUPLICATE.DYNAMIC_REVIEW_BILLABLE]: () => require<ReactComponentModule>('../../../../pages/TransactionDuplicate/ReviewBillable').default,
[SCREENS.TRANSACTION_DUPLICATE.DYNAMIC_REVIEW_REIMBURSABLE]: () => require<ReactComponentModule>('../../../../pages/TransactionDuplicate/ReviewReimbursable').default,
[SCREENS.TRANSACTION_DUPLICATE.DYNAMIC_CONFIRMATION]: () => require<ReactComponentModule>('../../../../pages/TransactionDuplicate/Confirmation').default,
});

const MergeTransactionStackNavigator = createModalStackNavigator<MergeTransactionNavigatorParamList>({
Expand Down
20 changes: 4 additions & 16 deletions src/libs/Navigation/linkingConfig/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1811,26 +1811,14 @@ const config: LinkingOptions<RootNavigatorParamList>['config'] = {
path: ROUTES.TRANSACTION_DUPLICATE_REVIEW_TAG_PAGE.route,
exact: true,
},
[SCREENS.TRANSACTION_DUPLICATE.DESCRIPTION]: {
path: ROUTES.TRANSACTION_DUPLICATE_REVIEW_DESCRIPTION_PAGE.route,
exact: true,
},
[SCREENS.TRANSACTION_DUPLICATE.DYNAMIC_REVIEW_DESCRIPTION]: DYNAMIC_ROUTES.TRANSACTION_DUPLICATE_REVIEW_DESCRIPTION.path,
[SCREENS.TRANSACTION_DUPLICATE.TAX_CODE]: {
path: ROUTES.TRANSACTION_DUPLICATE_REVIEW_TAX_CODE_PAGE.route,
exact: true,
},
[SCREENS.TRANSACTION_DUPLICATE.REIMBURSABLE]: {
path: ROUTES.TRANSACTION_DUPLICATE_REVIEW_REIMBURSABLE_PAGE.route,
exact: true,
},
[SCREENS.TRANSACTION_DUPLICATE.BILLABLE]: {
path: ROUTES.TRANSACTION_DUPLICATE_REVIEW_BILLABLE_PAGE.route,
exact: true,
},
[SCREENS.TRANSACTION_DUPLICATE.CONFIRMATION]: {
path: ROUTES.TRANSACTION_DUPLICATE_CONFIRMATION_PAGE.route,
exact: true,
},
[SCREENS.TRANSACTION_DUPLICATE.DYNAMIC_REVIEW_REIMBURSABLE]: DYNAMIC_ROUTES.TRANSACTION_DUPLICATE_REVIEW_REIMBURSABLE.path,
[SCREENS.TRANSACTION_DUPLICATE.DYNAMIC_REVIEW_BILLABLE]: DYNAMIC_ROUTES.TRANSACTION_DUPLICATE_REVIEW_BILLABLE.path,
[SCREENS.TRANSACTION_DUPLICATE.DYNAMIC_CONFIRMATION]: DYNAMIC_ROUTES.TRANSACTION_DUPLICATE_CONFIRMATION.path,
},
},
[SCREENS.RIGHT_MODAL.MERGE_TRANSACTION]: {
Expand Down
25 changes: 13 additions & 12 deletions src/libs/Navigation/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2409,25 +2409,26 @@ type TransactionDuplicateNavigatorParamList = {
// 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.TRANSACTION_DUPLICATE.DESCRIPTION]: {
threadReportID: 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.TRANSACTION_DUPLICATE.DYNAMIC_REVIEW_DESCRIPTION]: {
threadReportID?: string;
reportID?: string;
};
[SCREENS.TRANSACTION_DUPLICATE.TAX_CODE]: {
threadReportID: 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.TRANSACTION_DUPLICATE.BILLABLE]: {
threadReportID: 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.TRANSACTION_DUPLICATE.DYNAMIC_REVIEW_BILLABLE]: {
threadReportID?: string;
reportID?: string;
};
[SCREENS.TRANSACTION_DUPLICATE.REIMBURSABLE]: {
threadReportID: 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.TRANSACTION_DUPLICATE.DYNAMIC_REVIEW_REIMBURSABLE]: {
threadReportID?: string;
reportID?: string;
};
[SCREENS.TRANSACTION_DUPLICATE.DYNAMIC_CONFIRMATION]: {
threadReportID?: string;
reportID?: string;
};
};

Expand Down
11 changes: 6 additions & 5 deletions src/libs/TransactionPreviewUtils.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import truncate from 'lodash/truncate';
import type {OnyxEntry} from 'react-native-onyx';
import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute';
import CONST 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 {isEmptyObject} from '@src/types/utils/EmptyObject';
import {setReviewDuplicatesKey} from './actions/Transaction';
Expand Down Expand Up @@ -105,19 +106,19 @@ const getReviewNavigationRoute = (
return ROUTES.TRANSACTION_DUPLICATE_REVIEW_TAG_PAGE.getRoute(threadReportID, backTo);
}
if (comparisonResult.change.description) {
return ROUTES.TRANSACTION_DUPLICATE_REVIEW_DESCRIPTION_PAGE.getRoute(threadReportID, backTo);
return createDynamicRoute(DYNAMIC_ROUTES.TRANSACTION_DUPLICATE_REVIEW_DESCRIPTION.path, ROUTES.REPORT_WITH_ID.getRoute(threadReportID));
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.

You can just calculate ROUTES.REPORT_WITH_ID.getRoute(threadReportID) here once and reuse it 😄

}
if (comparisonResult.change.taxCode) {
return ROUTES.TRANSACTION_DUPLICATE_REVIEW_TAX_CODE_PAGE.getRoute(threadReportID, backTo);
}
if (comparisonResult.change.billable) {
return ROUTES.TRANSACTION_DUPLICATE_REVIEW_BILLABLE_PAGE.getRoute(threadReportID, backTo);
return createDynamicRoute(DYNAMIC_ROUTES.TRANSACTION_DUPLICATE_REVIEW_BILLABLE.path, ROUTES.REPORT_WITH_ID.getRoute(threadReportID));
}
if (comparisonResult.change.reimbursable) {
return ROUTES.TRANSACTION_DUPLICATE_REVIEW_REIMBURSABLE_PAGE.getRoute(threadReportID, backTo);
return createDynamicRoute(DYNAMIC_ROUTES.TRANSACTION_DUPLICATE_REVIEW_REIMBURSABLE.path, ROUTES.REPORT_WITH_ID.getRoute(threadReportID));
}

return ROUTES.TRANSACTION_DUPLICATE_CONFIRMATION_PAGE.getRoute(threadReportID, backTo);
return createDynamicRoute(DYNAMIC_ROUTES.TRANSACTION_DUPLICATE_CONFIRMATION.path, ROUTES.REPORT_WITH_ID.getRoute(threadReportID));
};

type TranslationPathOrText = {
Expand Down
7 changes: 4 additions & 3 deletions src/pages/TransactionDuplicate/Confirmation.tsx
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.

Could you please add the words 'Dynamic' and 'Page' to the filenames of the components associated with the migrated routes? This will help make it perfectly clear that these are dynamic pages (for example: DynamicConfirmationPage, DynamicReviewBillablePage, DynamicReviewDescriptionPage, DynamicReviewReimbursablePage)

Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,13 @@ import isLoadingOnyxValue from '@src/types/utils/isLoadingOnyxValue';
function Confirmation() {
const styles = useThemeStyles();
const {translate} = useLocalize();
const route = useRoute<PlatformStackRouteProp<TransactionDuplicateNavigatorParamList, typeof SCREENS.TRANSACTION_DUPLICATE.REVIEW>>();
const route = useRoute<PlatformStackRouteProp<TransactionDuplicateNavigatorParamList, typeof SCREENS.TRANSACTION_DUPLICATE.DYNAMIC_CONFIRMATION>>();
const threadReportID = route.params.threadReportID ?? route.params.reportID;
const currentUserPersonalDetails = useCurrentUserPersonalDetails();
const [reviewDuplicates, reviewDuplicatesResult] = useOnyx(ONYXKEYS.REVIEW_DUPLICATES);
const [duplicatedTransaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${getNonEmptyStringOnyxID(reviewDuplicates?.transactionID)}`);
const newTransaction = useMemo(() => TransactionUtils.buildNewTransactionAfterReviewingDuplicates(reviewDuplicates, duplicatedTransaction), [duplicatedTransaction, reviewDuplicates]);
const [report, reportResult] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${route.params.threadReportID}`);
const [report, reportResult] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${threadReportID}`);
const transactionID = TransactionUtils.getTransactionID(report);
const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${getNonEmptyStringOnyxID(transactionID)}`);
const [transactionViolations] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${getNonEmptyStringOnyxID(transactionID)}`);
Expand All @@ -59,7 +60,7 @@ function Confirmation() {
const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`);
const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${getNonEmptyStringOnyxID(reviewDuplicatesReport?.policyID)}`);
const compareResult = TransactionUtils.compareDuplicateTransactionFields(policyTags ?? {}, transaction, allDuplicates, reviewDuplicatesReport, undefined, policy, policyCategories);
const {goBack} = useReviewDuplicatesNavigation(Object.keys(compareResult.change ?? {}), 'confirmation', route.params.threadReportID, route.params.backTo);
const {goBack} = useReviewDuplicatesNavigation(Object.keys(compareResult.change ?? {}), 'confirmation', threadReportID ?? '');
const [iouReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${newTransaction?.reportID}`);
const [reportActions] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${newTransaction?.reportID}`);
const reportAction = Object.values(reportActions ?? {}).find(
Expand Down
Loading
Loading