Skip to content

Commit 9881633

Browse files
committed
Display button spinner instead of full page loading when checking report data
1 parent 19a2abb commit 9881633

2 files changed

Lines changed: 32 additions & 24 deletions

File tree

src/pages/TransactionMerge/ConfirmationPage.tsx

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, {useCallback, useEffect, useMemo, useState} from 'react';
1+
import React, {useCallback, useMemo, useState} from 'react';
22
import {View} from 'react-native';
33
import type {OnyxEntry} from 'react-native-onyx';
44
import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView';
@@ -19,7 +19,6 @@ import {buildMergedTransactionData, getSourceTransactionFromMergeTransaction, ge
1919
import Navigation from '@libs/Navigation/Navigation';
2020
import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
2121
import type {MergeTransactionNavigatorParamList} from '@libs/Navigation/types';
22-
import {openReport} from '@userActions/Report';
2322
import ONYXKEYS from '@src/ONYXKEYS';
2423
import type SCREENS from '@src/SCREENS';
2524
import type {Transaction} from '@src/types/onyx';
@@ -47,20 +46,6 @@ function ConfirmationPage({route}: ConfirmationPageProps) {
4746
const targetTransactionThreadReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${targetTransactionThreadReportID}`];
4847
const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${targetTransactionThreadReport?.policyID}`, {canBeMissing: true});
4948

50-
// When user selects a card transaction to merge, that card transaction becomes the target transaction.
51-
// The App may not have the transaction thread report loaded for card transactions, so we need to trigger
52-
// OpenReport to ensure the transaction thread report is available.
53-
useEffect(() => {
54-
if (!targetTransactionThreadReportID && targetTransaction?.reportID) {
55-
openReport(targetTransaction.reportID);
56-
return;
57-
}
58-
59-
if (targetTransactionThreadReportID && !targetTransactionThreadReport) {
60-
openReport(targetTransactionThreadReportID);
61-
}
62-
}, [targetTransactionThreadReportID, targetTransaction, targetTransactionThreadReport]);
63-
6449
// Build the merged transaction data for display
6550
const mergedTransactionData = useMemo(() => buildMergedTransactionData(targetTransaction, mergeTransaction), [targetTransaction, mergeTransaction]);
6651

src/pages/TransactionMerge/DetailsReviewPage.tsx

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React from 'react';
1+
import React, {useEffect, useState} from 'react';
22
import {View} from 'react-native';
33
import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView';
44
import Button from '@components/Button';
@@ -20,13 +20,15 @@ import {
2020
getMergeFieldValue,
2121
getSourceTransactionFromMergeTransaction,
2222
getTargetTransactionFromMergeTransaction,
23+
getTransactionThreadReportID,
2324
isEmptyMergeValue,
2425
} from '@libs/MergeTransactionUtils';
2526
import type {MergeFieldKey, MergeValue} from '@libs/MergeTransactionUtils';
2627
import Navigation from '@libs/Navigation/Navigation';
2728
import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
2829
import type {MergeTransactionNavigatorParamList} from '@libs/Navigation/types';
2930
import {getCurrency} from '@libs/TransactionUtils';
31+
import {openReport} from '@userActions/Report';
3032
import type {TranslationPaths} from '@src/languages/types';
3133
import ONYXKEYS from '@src/ONYXKEYS';
3234
import ROUTES from '@src/ROUTES';
@@ -42,21 +44,22 @@ function DetailsReviewPage({route}: DetailsReviewPageProps) {
4244
const styles = useThemeStyles();
4345
const {transactionID, backTo} = route.params;
4446

47+
const [allReports] = useOnyx(ONYXKEYS.COLLECTION.REPORT, {canBeMissing: false});
4548
const [mergeTransaction, mergeTransactionMetadata] = useOnyx(`${ONYXKEYS.COLLECTION.MERGE_TRANSACTION}${transactionID}`, {canBeMissing: false});
4649
const [targetTransaction = getTargetTransactionFromMergeTransaction(mergeTransaction)] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${mergeTransaction?.targetTransactionID}`, {
4750
canBeMissing: true,
4851
});
4952
const [sourceTransaction = getSourceTransactionFromMergeTransaction(mergeTransaction)] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${mergeTransaction?.sourceTransactionID}`, {
5053
canBeMissing: true,
5154
});
55+
const targetTransactionThreadReportID = getTransactionThreadReportID(targetTransaction);
56+
const targetTransactionThreadReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${targetTransactionThreadReportID}`];
5257

53-
// State for selected values and error
54-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
55-
const [hasErrors, setHasErrors] = React.useState<Partial<Record<MergeFieldKey, boolean>>>({});
58+
const [hasErrors, setHasErrors] = useState<Partial<Record<MergeFieldKey, boolean>>>({});
59+
const [diffFields, setDiffFields] = useState<MergeFieldKey[]>([]);
60+
const [isCheckingDataBeforeGoNext, setIsCheckingDataBeforeGoNext] = useState<boolean>(false);
5661

57-
const [diffFields, setDiffFields] = React.useState<MergeFieldKey[]>([]);
58-
59-
React.useEffect(() => {
62+
useEffect(() => {
6063
if (!transactionID || !targetTransaction || !sourceTransaction) {
6164
return;
6265
}
@@ -67,6 +70,25 @@ function DetailsReviewPage({route}: DetailsReviewPageProps) {
6770
setDiffFields(conflictFields as MergeFieldKey[]);
6871
}, [targetTransaction, sourceTransaction, transactionID]);
6972

73+
useEffect(() => {
74+
if (!isCheckingDataBeforeGoNext) {
75+
return;
76+
}
77+
78+
// When user selects a card transaction to merge, that card transaction becomes the target transaction.
79+
// The App may not have the transaction thread report loaded for card transactions, so we need to trigger
80+
// OpenReport to ensure the transaction thread report is available for confirmation page
81+
if (!targetTransactionThreadReportID && targetTransaction?.reportID) {
82+
return openReport(targetTransaction.reportID);
83+
}
84+
if (targetTransactionThreadReportID && !targetTransactionThreadReport) {
85+
return openReport(targetTransactionThreadReportID);
86+
}
87+
88+
Navigation.navigate(ROUTES.MERGE_TRANSACTION_CONFIRMATION_PAGE.getRoute(transactionID, Navigation.getActiveRoute()));
89+
setIsCheckingDataBeforeGoNext(false);
90+
}, [isCheckingDataBeforeGoNext, targetTransactionThreadReportID, targetTransaction?.reportID, targetTransactionThreadReport, transactionID]);
91+
7092
// Handle selection
7193
const handleSelect = (field: MergeFieldKey, value: MergeValue) => {
7294
// Clear error if it has
@@ -98,7 +120,7 @@ function DetailsReviewPage({route}: DetailsReviewPageProps) {
98120
setHasErrors(newHasErrors);
99121

100122
if (isEmptyObject(newHasErrors)) {
101-
Navigation.navigate(ROUTES.MERGE_TRANSACTION_CONFIRMATION_PAGE.getRoute(transactionID, Navigation.getActiveRoute()));
123+
setIsCheckingDataBeforeGoNext(true);
102124
}
103125
};
104126

@@ -191,6 +213,7 @@ function DetailsReviewPage({route}: DetailsReviewPageProps) {
191213
text={translate('common.continue')}
192214
onPress={handleContinue}
193215
isDisabled={!isEmptyObject(hasErrors)}
216+
isLoading={isCheckingDataBeforeGoNext}
194217
pressOnEnter
195218
/>
196219
</FixedFooter>

0 commit comments

Comments
 (0)