From 30b62f19ceca909d9b8debd2eff94953adb302e4 Mon Sep 17 00:00:00 2001 From: Marc Glasser Date: Mon, 8 Dec 2025 13:52:33 -1000 Subject: [PATCH] =?UTF-8?q?Revert=20"Fix=20duplicate-review=20confirmation?= =?UTF-8?q?=20redirecting=20to=20=E2=80=9CIt=E2=80=99s=20not=20here?= =?UTF-8?q?=E2=80=9D"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TransactionDuplicate/Confirmation.tsx | 25 +-- .../TransactionDuplicateConfirmationTest.ts | 150 ------------------ 2 files changed, 7 insertions(+), 168 deletions(-) delete mode 100644 tests/unit/TransactionDuplicateConfirmationTest.ts diff --git a/src/pages/TransactionDuplicate/Confirmation.tsx b/src/pages/TransactionDuplicate/Confirmation.tsx index 7bb48ff9c77c..ec99d56ae95d 100644 --- a/src/pages/TransactionDuplicate/Confirmation.tsx +++ b/src/pages/TransactionDuplicate/Confirmation.tsx @@ -31,7 +31,6 @@ import {generateReportID} from '@src/libs/ReportUtils'; import * as TransactionUtils from '@src/libs/TransactionUtils'; import {getTransactionID} from '@src/libs/TransactionUtils'; import ONYXKEYS from '@src/ONYXKEYS'; -import ROUTES from '@src/ROUTES'; import type SCREENS from '@src/SCREENS'; import type {Transaction} from '@src/types/onyx'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; @@ -41,12 +40,11 @@ function Confirmation() { const styles = useThemeStyles(); const {translate} = useLocalize(); const route = useRoute>(); - const {threadReportID, backTo} = route.params; const currentUserPersonalDetails = useCurrentUserPersonalDetails(); const [reviewDuplicates, reviewDuplicatesResult] = useOnyx(ONYXKEYS.REVIEW_DUPLICATES, {canBeMissing: true}); const [duplicatedTransaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${getNonEmptyStringOnyxID(reviewDuplicates?.transactionID)}`, {canBeMissing: true}); const newTransaction = useMemo(() => TransactionUtils.buildNewTransactionAfterReviewingDuplicates(reviewDuplicates, duplicatedTransaction), [duplicatedTransaction, reviewDuplicates]); - const transactionID = TransactionUtils.getTransactionID(threadReportID); + const transactionID = TransactionUtils.getTransactionID(route.params.threadReportID); const [allReports] = useOnyx(ONYXKEYS.COLLECTION.REPORT, {canBeMissing: false}); const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${getNonEmptyStringOnyxID(transactionID)}`, {canBeMissing: true}); const [transactionViolations] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${getNonEmptyStringOnyxID(transactionID)}`, { @@ -60,8 +58,8 @@ function Confirmation() { const reviewDuplicatesReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${reviewDuplicates?.reportID}`]; const [policyCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${getNonEmptyStringOnyxID(reviewDuplicatesReport?.policyID)}`, {canBeMissing: true}); const compareResult = TransactionUtils.compareDuplicateTransactionFields(transaction, allDuplicates, reviewDuplicatesReport, undefined, policyCategories); - const {goBack} = useReviewDuplicatesNavigation(Object.keys(compareResult.change ?? {}), 'confirmation', threadReportID, backTo); - const [report, reportResult] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${threadReportID}`, {canBeMissing: true}); + const {goBack} = useReviewDuplicatesNavigation(Object.keys(compareResult.change ?? {}), 'confirmation', route.params.threadReportID, route.params.backTo); + const [report, reportResult] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${route.params.threadReportID}`, {canBeMissing: true}); const [iouReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${newTransaction?.reportID}`, {canBeMissing: true}); const [reportActions] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${newTransaction?.reportID}`, {canBeMissing: true}); const reportAction = Object.values(reportActions ?? {}).find( @@ -76,28 +74,19 @@ function Confirmation() { ); const isReportOwner = iouReport?.ownerAccountID === currentUserPersonalDetails?.accountID; - const closeReviewDuplicates = useCallback(() => { - if (reviewDuplicates?.reportID) { - Navigation.setNavigationActionToMicrotaskQueue(() => { - Navigation.navigate(ROUTES.SEARCH_MONEY_REQUEST_REPORT.getRoute({reportID: reviewDuplicates.reportID}), {forceReplace: true}); - }); - } - Navigation.dismissModal(); - }, [reviewDuplicates?.reportID]); - const mergeDuplicates = useCallback(() => { const transactionThreadReportID = reportAction?.childReportID ?? generateReportID(); if (!reportAction?.childReportID) { transactionsMergeParams.transactionThreadReportID = transactionThreadReportID; } - closeReviewDuplicates(); IOU.mergeDuplicates(transactionsMergeParams); - }, [reportAction?.childReportID, transactionsMergeParams, closeReviewDuplicates]); + Navigation.dismissModal(); + }, [reportAction?.childReportID, transactionsMergeParams]); const resolveDuplicates = useCallback(() => { - closeReviewDuplicates(); IOU.resolveDuplicates(transactionsMergeParams); - }, [transactionsMergeParams, closeReviewDuplicates]); + Navigation.dismissModal(); + }, [transactionsMergeParams]); const contextValue = useMemo( () => ({ diff --git a/tests/unit/TransactionDuplicateConfirmationTest.ts b/tests/unit/TransactionDuplicateConfirmationTest.ts deleted file mode 100644 index 8e3cb5695fcd..000000000000 --- a/tests/unit/TransactionDuplicateConfirmationTest.ts +++ /dev/null @@ -1,150 +0,0 @@ -import Onyx from 'react-native-onyx'; -import Navigation from '@libs/Navigation/Navigation'; -import ONYXKEYS from '@src/ONYXKEYS'; -import ROUTES from '@src/ROUTES'; -import waitForBatchedUpdates from '../utils/waitForBatchedUpdates'; - -jest.mock('@libs/Navigation/Navigation', () => ({ - navigate: jest.fn(), - dismissModal: jest.fn(), - setNavigationActionToMicrotaskQueue: jest.fn((callback: () => void) => { - callback(); - }), -})); - -const mockedNavigation = Navigation as jest.Mocked; - -describe('TransactionDuplicate Confirmation Navigation', () => { - beforeAll(() => { - Onyx.init({keys: ONYXKEYS}); - }); - - beforeEach(async () => { - jest.clearAllMocks(); - await Onyx.clear(); - }); - - describe('closeReviewDuplicates behavior', () => { - it('should navigate to SEARCH_MONEY_REQUEST_REPORT when reportID exists before dismissing modal', async () => { - const reportID = 'testReportID123'; - - const closeReviewDuplicates = (reviewDuplicatesReportID: string | undefined) => { - if (reviewDuplicatesReportID) { - Navigation.setNavigationActionToMicrotaskQueue(() => { - Navigation.navigate(ROUTES.SEARCH_MONEY_REQUEST_REPORT.getRoute({reportID: reviewDuplicatesReportID}), {forceReplace: true}); - }); - } - Navigation.dismissModal(); - }; - - closeReviewDuplicates(reportID); - await waitForBatchedUpdates(); - - expect(mockedNavigation.setNavigationActionToMicrotaskQueue).toHaveBeenCalledTimes(1); - expect(mockedNavigation.navigate).toHaveBeenCalledWith(ROUTES.SEARCH_MONEY_REQUEST_REPORT.getRoute({reportID}), {forceReplace: true}); - expect(mockedNavigation.dismissModal).toHaveBeenCalledTimes(1); - }); - - it('should only dismiss modal when reportID is undefined', async () => { - const closeReviewDuplicates = (reviewDuplicatesReportID: string | undefined) => { - if (reviewDuplicatesReportID) { - Navigation.setNavigationActionToMicrotaskQueue(() => { - Navigation.navigate(ROUTES.SEARCH_MONEY_REQUEST_REPORT.getRoute({reportID: reviewDuplicatesReportID}), {forceReplace: true}); - }); - } - Navigation.dismissModal(); - }; - - closeReviewDuplicates(undefined); - await waitForBatchedUpdates(); - - expect(mockedNavigation.setNavigationActionToMicrotaskQueue).not.toHaveBeenCalled(); - expect(mockedNavigation.navigate).not.toHaveBeenCalled(); - expect(mockedNavigation.dismissModal).toHaveBeenCalledTimes(1); - }); - - it('should only dismiss modal when reportID is empty string', async () => { - const closeReviewDuplicates = (reviewDuplicatesReportID: string | undefined) => { - if (reviewDuplicatesReportID) { - Navigation.setNavigationActionToMicrotaskQueue(() => { - Navigation.navigate(ROUTES.SEARCH_MONEY_REQUEST_REPORT.getRoute({reportID: reviewDuplicatesReportID}), {forceReplace: true}); - }); - } - Navigation.dismissModal(); - }; - - closeReviewDuplicates(''); - await waitForBatchedUpdates(); - - expect(mockedNavigation.setNavigationActionToMicrotaskQueue).not.toHaveBeenCalled(); - expect(mockedNavigation.navigate).not.toHaveBeenCalled(); - expect(mockedNavigation.dismissModal).toHaveBeenCalledTimes(1); - }); - }); - - describe('mergeDuplicates navigation flow', () => { - it('should close review duplicates before calling IOU.mergeDuplicates', async () => { - const reportID = 'testReportID456'; - const callOrder: string[] = []; - - const closeReviewDuplicates = (reviewDuplicatesReportID: string | undefined) => { - callOrder.push('closeReviewDuplicates'); - if (reviewDuplicatesReportID) { - Navigation.setNavigationActionToMicrotaskQueue(() => { - Navigation.navigate(ROUTES.SEARCH_MONEY_REQUEST_REPORT.getRoute({reportID: reviewDuplicatesReportID}), {forceReplace: true}); - }); - } - Navigation.dismissModal(); - }; - - const mockMergeDuplicates = jest.fn(() => { - callOrder.push('mergeDuplicates'); - }); - - const mergeDuplicates = () => { - closeReviewDuplicates(reportID); - mockMergeDuplicates(); - }; - - mergeDuplicates(); - await waitForBatchedUpdates(); - - expect(callOrder).toEqual(['closeReviewDuplicates', 'mergeDuplicates']); - expect(mockedNavigation.navigate).toHaveBeenCalledWith(ROUTES.SEARCH_MONEY_REQUEST_REPORT.getRoute({reportID}), {forceReplace: true}); - expect(mockedNavigation.dismissModal).toHaveBeenCalledTimes(1); - }); - }); - - describe('resolveDuplicates navigation flow', () => { - it('should close review duplicates before calling IOU.resolveDuplicates', async () => { - const reportID = 'testReportID789'; - const callOrder: string[] = []; - - const closeReviewDuplicates = (reviewDuplicatesReportID: string | undefined) => { - callOrder.push('closeReviewDuplicates'); - if (reviewDuplicatesReportID) { - Navigation.setNavigationActionToMicrotaskQueue(() => { - Navigation.navigate(ROUTES.SEARCH_MONEY_REQUEST_REPORT.getRoute({reportID: reviewDuplicatesReportID}), {forceReplace: true}); - }); - } - Navigation.dismissModal(); - }; - - const mockResolveDuplicates = jest.fn(() => { - callOrder.push('resolveDuplicates'); - }); - - const resolveDuplicates = () => { - closeReviewDuplicates(reportID); - mockResolveDuplicates(); - }; - - resolveDuplicates(); - await waitForBatchedUpdates(); - - expect(callOrder).toEqual(['closeReviewDuplicates', 'resolveDuplicates']); - expect(mockedNavigation.navigate).toHaveBeenCalledWith(ROUTES.SEARCH_MONEY_REQUEST_REPORT.getRoute({reportID}), {forceReplace: true}); - expect(mockedNavigation.dismissModal).toHaveBeenCalledTimes(1); - }); - }); -});