diff --git a/src/libs/Navigation/AppNavigator/Navigators/RightModalNavigator.tsx b/src/libs/Navigation/AppNavigator/Navigators/RightModalNavigator.tsx index 44355cbbe955..646552c44055 100644 --- a/src/libs/Navigation/AppNavigator/Navigators/RightModalNavigator.tsx +++ b/src/libs/Navigation/AppNavigator/Navigators/RightModalNavigator.tsx @@ -1,7 +1,7 @@ import type {StackCardInterpolationProps, StackScreenProps} from '@react-navigation/stack'; import {createStackNavigator} from '@react-navigation/stack'; import React, {useMemo, useRef} from 'react'; -import {View} from 'react-native'; +import {InteractionManager, View} from 'react-native'; import NoDropZone from '@components/DragAndDrop/NoDropZone'; import useStyleUtils from '@hooks/useStyleUtils'; import useThemeStyles from '@hooks/useThemeStyles'; @@ -62,7 +62,11 @@ function RightModalNavigator({navigation, route}: RightModalNavigatorProps) { ) { return; } - abandonReviewDuplicateTransactions(); + // Delay clearing review duplicate data till the RHP is completely closed + // to avoid not found showing briefly in confirmation page when RHP is closing + InteractionManager.runAfterInteractions(() => { + abandonReviewDuplicateTransactions(); + }); }, }} id={NAVIGATORS.RIGHT_MODAL_NAVIGATOR} diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 62e259b8f05c..6d8775e00ffb 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -5607,6 +5607,11 @@ function canAccessReport(report: OnyxEntry, policies: OnyxCollection): boolean { + return !!report?.errorFields?.notFound; +} + /** * Check if the report is the parent report of the currently viewed report or at least one child report has report action */ @@ -7565,6 +7570,7 @@ export { buildParticipantsFromAccountIDs, buildTransactionThread, canAccessReport, + isReportNotFound, canAddTransaction, canDeleteTransaction, canBeAutoReimbursed, diff --git a/src/pages/TransactionDuplicate/Confirmation.tsx b/src/pages/TransactionDuplicate/Confirmation.tsx index 3c9b911a1cf5..96b32006675e 100644 --- a/src/pages/TransactionDuplicate/Confirmation.tsx +++ b/src/pages/TransactionDuplicate/Confirmation.tsx @@ -7,6 +7,7 @@ import {useOnyx} from 'react-native-onyx'; import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView'; import Button from '@components/Button'; import FixedFooter from '@components/FixedFooter'; +import FullScreenLoadingIndicator from '@components/FullscreenLoadingIndicator'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import MoneyRequestView from '@components/ReportActionItem/MoneyRequestView'; import ScreenWrapper from '@components/ScreenWrapper'; @@ -20,19 +21,22 @@ import type {TransactionDuplicateNavigatorParamList} from '@libs/Navigation/type import variables from '@styles/variables'; import * as IOU from '@src/libs/actions/IOU'; import * as ReportActionsUtils from '@src/libs/ReportActionsUtils'; +import * as ReportUtils from '@src/libs/ReportUtils'; import * as TransactionUtils 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'; +import isLoadingOnyxValue from '@src/types/utils/isLoadingOnyxValue'; function Confirmation() { const styles = useThemeStyles(); const {translate} = useLocalize(); const route = useRoute>(); - const [reviewDuplicates] = useOnyx(ONYXKEYS.REVIEW_DUPLICATES); + const [reviewDuplicates, reviewDuplicatesResult] = useOnyx(ONYXKEYS.REVIEW_DUPLICATES); const transaction = useMemo(() => TransactionUtils.buildNewTransactionAfterReviewingDuplicates(reviewDuplicates), [reviewDuplicates]); - const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${route.params.threadReportID}`); + const [report, reportResult] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${route.params.threadReportID}`); const [reportActions] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transaction?.reportID}`); const reportAction = Object.values(reportActions ?? {}).find( (action) => ReportActionsUtils.isMoneyRequestAction(action) && ReportActionsUtils.getOriginalMessage(action)?.IOUTransactionID === reviewDuplicates?.transactionID, @@ -56,13 +60,27 @@ function Confirmation() { [report, reportAction], ); + const reportTransactionID = TransactionUtils.getTransactionID(report?.reportID ?? ''); + const doesTransactionBelongToReport = reviewDuplicates?.transactionID === reportTransactionID || reviewDuplicates?.duplicates.includes(reportTransactionID); + + // eslint-disable-next-line rulesdir/no-negated-variables + const shouldShowNotFoundPage = + isEmptyObject(report) || + !ReportUtils.isValidReport(report) || + ReportUtils.isReportNotFound(report) || + (reviewDuplicatesResult.status === 'loaded' && (!transaction?.transactionID || !doesTransactionBelongToReport)); + + if (isLoadingOnyxValue(reviewDuplicatesResult, reportResult)) { + return ; + } + return ( {({safeAreaPaddingBottomStyle}) => ( - +