Skip to content

Commit 6fd16ac

Browse files
Merge pull request #45965 from gijoe0295/gijoe/45835
Show not found for invalid report or transaction in review duplicates confirmation page
2 parents bc69605 + 545d78e commit 6fd16ac

File tree

3 files changed

+33
-5
lines changed

3 files changed

+33
-5
lines changed

src/libs/Navigation/AppNavigator/Navigators/RightModalNavigator.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type {StackCardInterpolationProps, StackScreenProps} from '@react-navigation/stack';
22
import {createStackNavigator} from '@react-navigation/stack';
33
import React, {useMemo, useRef} from 'react';
4-
import {View} from 'react-native';
4+
import {InteractionManager, View} from 'react-native';
55
import NoDropZone from '@components/DragAndDrop/NoDropZone';
66
import useStyleUtils from '@hooks/useStyleUtils';
77
import useThemeStyles from '@hooks/useThemeStyles';
@@ -62,7 +62,11 @@ function RightModalNavigator({navigation, route}: RightModalNavigatorProps) {
6262
) {
6363
return;
6464
}
65-
abandonReviewDuplicateTransactions();
65+
// Delay clearing review duplicate data till the RHP is completely closed
66+
// to avoid not found showing briefly in confirmation page when RHP is closing
67+
InteractionManager.runAfterInteractions(() => {
68+
abandonReviewDuplicateTransactions();
69+
});
6670
},
6771
}}
6872
id={NAVIGATORS.RIGHT_MODAL_NAVIGATOR}

src/libs/ReportUtils.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5773,6 +5773,11 @@ function canAccessReport(report: OnyxEntry<Report>, policies: OnyxCollection<Pol
57735773
return true;
57745774
}
57755775

5776+
// eslint-disable-next-line rulesdir/no-negated-variables
5777+
function isReportNotFound(report: OnyxEntry<Report>): boolean {
5778+
return !!report?.errorFields?.notFound;
5779+
}
5780+
57765781
/**
57775782
* Check if the report is the parent report of the currently viewed report or at least one child report has report action
57785783
*/
@@ -7733,6 +7738,7 @@ export {
77337738
buildParticipantsFromAccountIDs,
77347739
buildTransactionThread,
77357740
canAccessReport,
7741+
isReportNotFound,
77367742
canAddTransaction,
77377743
canDeleteTransaction,
77387744
canBeAutoReimbursed,

src/pages/TransactionDuplicate/Confirmation.tsx

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {useOnyx} from 'react-native-onyx';
77
import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView';
88
import Button from '@components/Button';
99
import FixedFooter from '@components/FixedFooter';
10+
import FullScreenLoadingIndicator from '@components/FullscreenLoadingIndicator';
1011
import HeaderWithBackButton from '@components/HeaderWithBackButton';
1112
import MoneyRequestView from '@components/ReportActionItem/MoneyRequestView';
1213
import ScreenWrapper from '@components/ScreenWrapper';
@@ -20,19 +21,22 @@ import type {TransactionDuplicateNavigatorParamList} from '@libs/Navigation/type
2021
import variables from '@styles/variables';
2122
import * as IOU from '@src/libs/actions/IOU';
2223
import * as ReportActionsUtils from '@src/libs/ReportActionsUtils';
24+
import * as ReportUtils from '@src/libs/ReportUtils';
2325
import * as TransactionUtils from '@src/libs/TransactionUtils';
2426
import ONYXKEYS from '@src/ONYXKEYS';
2527
import ROUTES from '@src/ROUTES';
2628
import type SCREENS from '@src/SCREENS';
2729
import type {Transaction} from '@src/types/onyx';
30+
import {isEmptyObject} from '@src/types/utils/EmptyObject';
31+
import isLoadingOnyxValue from '@src/types/utils/isLoadingOnyxValue';
2832

2933
function Confirmation() {
3034
const styles = useThemeStyles();
3135
const {translate} = useLocalize();
3236
const route = useRoute<RouteProp<TransactionDuplicateNavigatorParamList, typeof SCREENS.TRANSACTION_DUPLICATE.REVIEW>>();
33-
const [reviewDuplicates] = useOnyx(ONYXKEYS.REVIEW_DUPLICATES);
37+
const [reviewDuplicates, reviewDuplicatesResult] = useOnyx(ONYXKEYS.REVIEW_DUPLICATES);
3438
const transaction = useMemo(() => TransactionUtils.buildNewTransactionAfterReviewingDuplicates(reviewDuplicates), [reviewDuplicates]);
35-
const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${route.params.threadReportID}`);
39+
const [report, reportResult] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${route.params.threadReportID}`);
3640
const [reportActions] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transaction?.reportID}`);
3741
const reportAction = Object.values(reportActions ?? {}).find(
3842
(action) => ReportActionsUtils.isMoneyRequestAction(action) && ReportActionsUtils.getOriginalMessage(action)?.IOUTransactionID === reviewDuplicates?.transactionID,
@@ -56,13 +60,27 @@ function Confirmation() {
5660
[report, reportAction],
5761
);
5862

63+
const reportTransactionID = TransactionUtils.getTransactionID(report?.reportID ?? '');
64+
const doesTransactionBelongToReport = reviewDuplicates?.transactionID === reportTransactionID || reviewDuplicates?.duplicates.includes(reportTransactionID);
65+
66+
// eslint-disable-next-line rulesdir/no-negated-variables
67+
const shouldShowNotFoundPage =
68+
isEmptyObject(report) ||
69+
!ReportUtils.isValidReport(report) ||
70+
ReportUtils.isReportNotFound(report) ||
71+
(reviewDuplicatesResult.status === 'loaded' && (!transaction?.transactionID || !doesTransactionBelongToReport));
72+
73+
if (isLoadingOnyxValue(reviewDuplicatesResult, reportResult)) {
74+
return <FullScreenLoadingIndicator />;
75+
}
76+
5977
return (
6078
<ScreenWrapper
6179
testID={Confirmation.displayName}
6280
shouldShowOfflineIndicator
6381
>
6482
{({safeAreaPaddingBottomStyle}) => (
65-
<FullPageNotFoundView shouldShow={!reviewDuplicates}>
83+
<FullPageNotFoundView shouldShow={shouldShowNotFoundPage}>
6684
<View style={[styles.flex1, safeAreaPaddingBottomStyle]}>
6785
<HeaderWithBackButton title={translate('iou.reviewDuplicates')} />
6886
<ScrollView>

0 commit comments

Comments
 (0)