Skip to content

Commit 0c37ce9

Browse files
committed
Fallback to get transaction from mergeTransaction
1 parent 07d285c commit 0c37ce9

6 files changed

Lines changed: 60 additions & 20 deletions

File tree

src/libs/MergeTransactionUtils.ts

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,18 +73,38 @@ function fillMissingReceiptSource(transaction: Transaction) {
7373
};
7474
}
7575

76+
const getTransactionFromMergeTransaction = (mergeTransaction: OnyxEntry<MergeTransaction>, transactionID: string) => {
77+
if (!mergeTransaction?.eligibleTransactions) {
78+
return undefined;
79+
}
80+
const transaction = mergeTransaction.eligibleTransactions.find((eligibleTransaction) => eligibleTransaction.transactionID === transactionID);
81+
return transaction ? fillMissingReceiptSource(transaction) : transaction;
82+
};
83+
7684
/**
7785
* Get the source transaction from a merge transaction
7886
* @param mergeTransaction - The merge transaction to get the source transaction from
7987
* @returns The source transaction or null if it doesn't exist
8088
*/
81-
const getSourceTransaction = (mergeTransaction: OnyxEntry<MergeTransaction>) => {
89+
const getSourceTransactionFromMergeTransaction = (mergeTransaction: OnyxEntry<MergeTransaction>) => {
8290
if (!mergeTransaction?.sourceTransactionID) {
8391
return undefined;
8492
}
8593

86-
const sourceTransaction = mergeTransaction.eligibleTransactions?.find((transaction) => transaction.transactionID === mergeTransaction.sourceTransactionID);
87-
return sourceTransaction ? fillMissingReceiptSource(sourceTransaction) : sourceTransaction;
94+
return getTransactionFromMergeTransaction(mergeTransaction, mergeTransaction.sourceTransactionID);
95+
};
96+
97+
/**
98+
* Get the target transaction from a merge transaction
99+
* @param mergeTransaction - The merge transaction to get the target transaction from
100+
* @returns The target transaction or null if it doesn't exist
101+
*/
102+
const getTargetTransactionFromMergeTransaction = (mergeTransaction: OnyxEntry<MergeTransaction>) => {
103+
if (!mergeTransaction?.targetTransactionID) {
104+
return undefined;
105+
}
106+
107+
return getTransactionFromMergeTransaction(mergeTransaction, mergeTransaction.targetTransactionID);
88108
};
89109

90110
/**
@@ -247,7 +267,8 @@ function selectTargetAndSourceTransactionIDsForMerge(originalTargetTransaction:
247267
}
248268

249269
export {
250-
getSourceTransaction,
270+
getSourceTransactionFromMergeTransaction,
271+
getTargetTransactionFromMergeTransaction,
251272
shouldNavigateToReceiptReview,
252273
getMergeableDataAndConflictFields,
253274
getMergeFieldValue,

src/pages/TransactionMerge/ConfirmationPage.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import useLocalize from '@hooks/useLocalize';
1515
import useOnyx from '@hooks/useOnyx';
1616
import useThemeStyles from '@hooks/useThemeStyles';
1717
import {mergeTransactionRequest} from '@libs/actions/MergeTransaction';
18-
import {buildMergedTransactionData, getSourceTransaction, getTransactionThreadReportID} from '@libs/MergeTransactionUtils';
18+
import {buildMergedTransactionData, getSourceTransactionFromMergeTransaction, getTargetTransactionFromMergeTransaction, getTransactionThreadReportID} from '@libs/MergeTransactionUtils';
1919
import Navigation from '@libs/Navigation/Navigation';
2020
import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
2121
import type {MergeTransactionNavigatorParamList} from '@libs/Navigation/types';
@@ -35,8 +35,12 @@ function ConfirmationPage({route}: ConfirmationPageProps) {
3535

3636
const [allReports] = useOnyx(ONYXKEYS.COLLECTION.REPORT, {canBeMissing: false});
3737
const [mergeTransaction, mergeTransactionMetadata] = useOnyx(`${ONYXKEYS.COLLECTION.MERGE_TRANSACTION}${transactionID}`, {canBeMissing: false});
38-
const [targetTransaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${mergeTransaction?.targetTransactionID}`, {canBeMissing: true});
39-
const [sourceTransaction = getSourceTransaction(mergeTransaction)] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${mergeTransaction?.sourceTransactionID}`, {canBeMissing: true});
38+
const [targetTransaction = getTargetTransactionFromMergeTransaction(mergeTransaction)] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${mergeTransaction?.targetTransactionID}`, {
39+
canBeMissing: true,
40+
});
41+
const [sourceTransaction = getSourceTransactionFromMergeTransaction(mergeTransaction)] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${mergeTransaction?.sourceTransactionID}`, {
42+
canBeMissing: true,
43+
});
4044

4145
const targetTransactionThreadReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${getTransactionThreadReportID(targetTransaction)}`];
4246
const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${targetTransactionThreadReport?.policyID}`, {canBeMissing: true});

src/pages/TransactionMerge/DetailsReviewPage.tsx

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,14 @@ import useOnyx from '@hooks/useOnyx';
1414
import useThemeStyles from '@hooks/useThemeStyles';
1515
import {setMergeTransactionKey} from '@libs/actions/MergeTransaction';
1616
import {convertToDisplayString} from '@libs/CurrencyUtils';
17-
import {getMergeableDataAndConflictFields, getMergeFieldTranslationKey, getMergeFieldValue, getSourceTransaction, isEmptyMergeValue} from '@libs/MergeTransactionUtils';
17+
import {
18+
getMergeableDataAndConflictFields,
19+
getMergeFieldTranslationKey,
20+
getMergeFieldValue,
21+
getSourceTransactionFromMergeTransaction,
22+
getTargetTransactionFromMergeTransaction,
23+
isEmptyMergeValue,
24+
} from '@libs/MergeTransactionUtils';
1825
import type {MergeFieldKey, MergeValue} from '@libs/MergeTransactionUtils';
1926
import Navigation from '@libs/Navigation/Navigation';
2027
import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
@@ -36,8 +43,12 @@ function DetailsReviewPage({route}: DetailsReviewPageProps) {
3643
const {transactionID, backTo} = route.params;
3744

3845
const [mergeTransaction, mergeTransactionMetadata] = useOnyx(`${ONYXKEYS.COLLECTION.MERGE_TRANSACTION}${transactionID}`, {canBeMissing: false});
39-
const [targetTransaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${mergeTransaction?.targetTransactionID}`, {canBeMissing: true});
40-
const [sourceTransaction = getSourceTransaction(mergeTransaction)] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${mergeTransaction?.sourceTransactionID}`, {canBeMissing: true});
46+
const [targetTransaction = getTargetTransactionFromMergeTransaction(mergeTransaction)] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${mergeTransaction?.targetTransactionID}`, {
47+
canBeMissing: true,
48+
});
49+
const [sourceTransaction = getSourceTransactionFromMergeTransaction(mergeTransaction)] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${mergeTransaction?.sourceTransactionID}`, {
50+
canBeMissing: true,
51+
});
4152

4253
// State for selected values and error
4354
// eslint-disable-next-line @typescript-eslint/no-unused-vars

src/pages/TransactionMerge/MergeTransactionsListContent.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import {getTransactionsForMerging, getTransactionsForMergingLocally, setMergeTra
1616
import {
1717
fillMissingReceiptSource,
1818
getMergeableDataAndConflictFields,
19-
getSourceTransaction,
19+
getSourceTransactionFromMergeTransaction,
2020
getTransactionThreadReportID,
2121
selectTargetAndSourceTransactionIDsForMerge,
2222
shouldNavigateToReceiptReview,
@@ -110,7 +110,7 @@ function MergeTransactionsListContent({transactionID, mergeTransaction}: MergeTr
110110
}, [translate, styles.textAlignCenter, styles.textSupporting, styles.textNormal]);
111111

112112
const handleConfirm = useCallback(() => {
113-
const sourceTransaction = getSourceTransaction(mergeTransaction);
113+
const sourceTransaction = getSourceTransactionFromMergeTransaction(mergeTransaction);
114114

115115
if (!sourceTransaction || !targetTransaction) {
116116
return;

src/pages/TransactionMerge/ReceiptReviewPage.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import useLocalize from '@hooks/useLocalize';
1212
import useOnyx from '@hooks/useOnyx';
1313
import useThemeStyles from '@hooks/useThemeStyles';
1414
import {setMergeTransactionKey} from '@libs/actions/MergeTransaction';
15-
import {getMergeableDataAndConflictFields, getSourceTransaction} from '@libs/MergeTransactionUtils';
15+
import {getMergeableDataAndConflictFields, getSourceTransactionFromMergeTransaction, getTargetTransactionFromMergeTransaction} from '@libs/MergeTransactionUtils';
1616
import Navigation from '@libs/Navigation/Navigation';
1717
import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
1818
import type {MergeTransactionNavigatorParamList} from '@libs/Navigation/types';
@@ -32,8 +32,12 @@ function ReceiptReviewPage({route}: ReceiptReviewPageProps) {
3232
const {transactionID, backTo} = route.params;
3333

3434
const [mergeTransaction, mergeTransactionMetadata] = useOnyx(`${ONYXKEYS.COLLECTION.MERGE_TRANSACTION}${transactionID}`, {canBeMissing: false});
35-
const [targetTransaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${mergeTransaction?.targetTransactionID}`, {canBeMissing: true});
36-
const [sourceTransaction = getSourceTransaction(mergeTransaction)] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${mergeTransaction?.sourceTransactionID}`, {canBeMissing: true});
35+
const [targetTransaction = getTargetTransactionFromMergeTransaction(mergeTransaction)] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${mergeTransaction?.targetTransactionID}`, {
36+
canBeMissing: true,
37+
});
38+
const [sourceTransaction = getSourceTransactionFromMergeTransaction(mergeTransaction)] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${mergeTransaction?.sourceTransactionID}`, {
39+
canBeMissing: true,
40+
});
3741

3842
const transactions = [targetTransaction, sourceTransaction].filter((transaction): transaction is Transaction => !!transaction);
3943

tests/unit/MergeTransactionUtilsTest.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import {
33
getMergeableDataAndConflictFields,
44
getMergeFieldTranslationKey,
55
getMergeFieldValue,
6-
getSourceTransaction,
6+
getSourceTransactionFromMergeTransaction,
77
isEmptyMergeValue,
88
selectTargetAndSourceTransactionIDsForMerge,
99
shouldNavigateToReceiptReview,
@@ -13,13 +13,13 @@ import createRandomMergeTransaction from '../utils/collections/mergeTransaction'
1313
import createRandomTransaction from '../utils/collections/transaction';
1414

1515
describe('MergeTransactionUtils', () => {
16-
describe('getSourceTransaction', () => {
16+
describe('getSourceTransactionFromMergeTransaction', () => {
1717
it('should return undefined when mergeTransaction is undefined', () => {
1818
// Given a null merge transaction
1919
const mergeTransaction = undefined;
2020

2121
// When we try to get the source transaction
22-
const result = getSourceTransaction(mergeTransaction);
22+
const result = getSourceTransactionFromMergeTransaction(mergeTransaction);
2323

2424
// Then it should return undefined because the merge transaction is undefined
2525
expect(result).toBeUndefined();
@@ -36,7 +36,7 @@ describe('MergeTransactionUtils', () => {
3636
};
3737

3838
// When we try to get the source transaction
39-
const result = getSourceTransaction(mergeTransaction);
39+
const result = getSourceTransactionFromMergeTransaction(mergeTransaction);
4040

4141
// Then it should return undefined because the source transaction ID doesn't match any eligible transaction
4242
expect(result).toBeUndefined();
@@ -55,7 +55,7 @@ describe('MergeTransactionUtils', () => {
5555
};
5656

5757
// When we try to get the source transaction
58-
const result = getSourceTransaction(mergeTransaction);
58+
const result = getSourceTransactionFromMergeTransaction(mergeTransaction);
5959

6060
// Then it should return the matching transaction from the eligible transactions
6161
expect(result).toBe(sourceTransaction);

0 commit comments

Comments
 (0)