Skip to content

Commit d057afc

Browse files
authored
Merge pull request Expensify#67998 from shubham1206agra/refactor-onyx-42
Removed Onyx.connect from DistanceRate Actions (part 1)
2 parents 222b827 + caffb7a commit d057afc

4 files changed

Lines changed: 108 additions & 43 deletions

File tree

src/libs/actions/Policy/DistanceRate.ts

Lines changed: 19 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import {getDistanceRateCustomUnit, goBackWhenEnableFeature, removePendingFieldsF
1818
import * as ReportUtils from '@libs/ReportUtils';
1919
import CONST from '@src/CONST';
2020
import ONYXKEYS from '@src/ONYXKEYS';
21-
import type {Policy, Report, Transaction, TransactionViolation} from '@src/types/onyx';
21+
import type {Policy, Report, TransactionViolation} from '@src/types/onyx';
2222
import type {ErrorFields} from '@src/types/onyx/OnyxCommon';
2323
import type {CustomUnit, Rate} from '@src/types/onyx/Policy';
2424
import type {OnyxData} from '@src/types/onyx/Request';
@@ -56,29 +56,6 @@ Onyx.connect({
5656
},
5757
});
5858

59-
let allTransactions: NonNullable<OnyxCollection<Transaction>> = {};
60-
Onyx.connect({
61-
key: ONYXKEYS.COLLECTION.TRANSACTION,
62-
waitForCollectionCallback: true,
63-
callback: (value) => {
64-
if (!value) {
65-
allTransactions = {};
66-
return;
67-
}
68-
69-
allTransactions = value;
70-
},
71-
});
72-
73-
let transactionViolations: OnyxCollection<TransactionViolation[]>;
74-
Onyx.connect({
75-
key: ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS,
76-
waitForCollectionCallback: true,
77-
callback: (value) => {
78-
transactionViolations = value;
79-
},
80-
});
81-
8259
/**
8360
* Takes array of customUnitRates and removes pendingFields and errorFields from each rate - we don't want to send those via API
8461
*/
@@ -451,7 +428,13 @@ function setPolicyDistanceRatesEnabled(policyID: string, customUnit: CustomUnit,
451428
API.write(WRITE_COMMANDS.SET_POLICY_DISTANCE_RATES_ENABLED, params, {optimisticData, successData, failureData});
452429
}
453430

454-
function deletePolicyDistanceRates(policyID: string, customUnit: CustomUnit, rateIDsToDelete: string[]) {
431+
function deletePolicyDistanceRates(
432+
policyID: string,
433+
customUnit: CustomUnit,
434+
rateIDsToDelete: string[],
435+
transactionIDsAffected: string[],
436+
transactionViolations: OnyxCollection<TransactionViolation[]>,
437+
) {
455438
const currentRates = customUnit.rates;
456439
const optimisticRates: Record<string, Rate> = {};
457440
const successRates: Record<string, Rate> = {};
@@ -520,22 +503,18 @@ function deletePolicyDistanceRates(policyID: string, customUnit: CustomUnit, rat
520503
},
521504
];
522505

523-
const transactions = Object.values(allTransactions ?? {}).filter(
524-
(transaction) =>
525-
transaction?.comment?.customUnit?.customUnitID === customUnit.customUnitID &&
526-
transaction?.comment?.customUnit?.customUnitRateID &&
527-
rateIDsToDelete.includes(transaction?.comment?.customUnit?.customUnitRateID),
528-
);
529506
const optimisticTransactionsViolations: OnyxUpdate[] = [];
507+
const failureTransactionsViolations: OnyxUpdate[] = [];
530508

531-
transactions.forEach((transaction) => {
532-
const currentTransactionViolations = transactionViolations?.[`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transaction?.transactionID}`] ?? [];
509+
for (const transactionID of transactionIDsAffected) {
510+
const currentTransactionViolations = transactionViolations?.[`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`] ?? [];
533511
if (currentTransactionViolations.some((violation) => violation.name === CONST.VIOLATIONS.CUSTOM_UNIT_OUT_OF_POLICY)) {
534512
return;
535513
}
514+
536515
optimisticTransactionsViolations.push({
537516
onyxMethod: Onyx.METHOD.MERGE,
538-
key: `${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transaction?.transactionID}`,
517+
key: `${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`,
539518
value: [
540519
...currentTransactionViolations,
541520
{
@@ -545,12 +524,13 @@ function deletePolicyDistanceRates(policyID: string, customUnit: CustomUnit, rat
545524
},
546525
],
547526
});
548-
});
549527

550-
const failureTransactionsViolations: OnyxUpdate[] = transactions.map((transaction) => {
551-
const currentTransactionViolations = transactionViolations?.[`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transaction?.transactionID}`];
552-
return {onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transaction?.transactionID}`, value: currentTransactionViolations};
553-
});
528+
failureTransactionsViolations.push({
529+
onyxMethod: Onyx.METHOD.MERGE,
530+
key: `${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`,
531+
value: currentTransactionViolations,
532+
});
533+
}
554534

555535
optimisticData.push(...optimisticTransactionsViolations);
556536
failureData.push(...failureTransactionsViolations);

src/pages/workspace/distanceRates/PolicyDistanceRateDetailsPage.tsx

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,42 @@ function PolicyDistanceRateDetailsPage({route}: PolicyDistanceRateDetailsPagePro
3838
const policyID = route.params.policyID;
3939
const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${route.params.policyID}`, {canBeMissing: true});
4040
const rateID = route.params.rateID;
41-
4241
const customUnit = getDistanceRateCustomUnit(policy);
4342
const rate = customUnit?.rates[rateID];
43+
const customUnitID = customUnit?.customUnitID;
44+
const [eligibleTransactionIDs] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION, {
45+
selector: (transactions) => {
46+
return Object.values(transactions ?? {}).reduce((transactionIDs, transaction) => {
47+
if (
48+
transaction &&
49+
customUnitID &&
50+
transaction?.comment?.customUnit?.customUnitID === customUnitID &&
51+
transaction?.comment?.customUnit?.customUnitRateID &&
52+
transaction?.comment?.customUnit?.customUnitRateID === rateID
53+
) {
54+
transactionIDs.add(transaction?.transactionID);
55+
}
56+
return transactionIDs;
57+
}, new Set<string>());
58+
},
59+
canBeMissing: true,
60+
});
61+
62+
const [transactionViolations] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, {
63+
selector: (violations) => {
64+
if (!eligibleTransactionIDs || eligibleTransactionIDs.size === 0) {
65+
return undefined;
66+
}
67+
return Object.fromEntries(
68+
Object.entries(violations ?? {}).filter(([key]) => {
69+
const id = key.replace(ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, '');
70+
return eligibleTransactionIDs?.has(id);
71+
}),
72+
);
73+
},
74+
canBeMissing: true,
75+
});
76+
4477
const currency = rate?.currency ?? CONST.CURRENCY.USD;
4578
const taxClaimablePercentage = rate?.attributes?.taxClaimablePercentage;
4679
const taxRateExternalID = rate?.attributes?.taxRateExternalID;
@@ -83,7 +116,7 @@ function PolicyDistanceRateDetailsPage({route}: PolicyDistanceRateDetailsPagePro
83116

84117
const deleteRate = () => {
85118
Navigation.goBack();
86-
deletePolicyDistanceRates(policyID, customUnit, [rateID]);
119+
deletePolicyDistanceRates(policyID, customUnit, [rateID], Array.from(eligibleTransactionIDs ?? []), transactionViolations);
87120
setIsDeleteModalVisible(false);
88121
};
89122

src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import useFilteredSelection from '@hooks/useFilteredSelection';
1818
import useLocalize from '@hooks/useLocalize';
1919
import useMobileSelectionMode from '@hooks/useMobileSelectionMode';
2020
import useNetwork from '@hooks/useNetwork';
21+
import useOnyx from '@hooks/useOnyx';
2122
import usePolicy from '@hooks/usePolicy';
2223
import useResponsiveLayout from '@hooks/useResponsiveLayout';
2324
import useSearchBackPress from '@hooks/useSearchBackPress';
@@ -42,6 +43,7 @@ import type {WorkspaceSplitNavigatorParamList} from '@navigation/types';
4243
import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper';
4344
import ButtonWithDropdownMenu from '@src/components/ButtonWithDropdownMenu';
4445
import CONST from '@src/CONST';
46+
import ONYXKEYS from '@src/ONYXKEYS';
4547
import ROUTES from '@src/ROUTES';
4648
import type SCREENS from '@src/SCREENS';
4749
import type {Rate} from '@src/types/onyx/Policy';
@@ -78,6 +80,54 @@ function PolicyDistanceRatesPage({
7880
[customUnitRates],
7981
);
8082

83+
const rateIDs = new Set(Object.keys(selectableRates));
84+
85+
const [eligibleTransactionsData] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION, {
86+
selector: (transactions) => {
87+
if (!customUnit?.customUnitID || rateIDs.size === 0) {
88+
return undefined;
89+
}
90+
return Object.values(transactions ?? {}).reduce(
91+
(transactionsData, transaction) => {
92+
if (
93+
transaction &&
94+
customUnit?.customUnitID &&
95+
transaction?.comment?.customUnit?.customUnitID === customUnit.customUnitID &&
96+
transaction?.comment?.customUnit?.customUnitRateID &&
97+
rateIDs.has(transaction?.comment?.customUnit?.customUnitRateID)
98+
) {
99+
transactionsData.transactionIDs.add(transaction.transactionID);
100+
if (!transactionsData.rateIDToTransactionIDsMap[transaction?.comment?.customUnit?.customUnitRateID]) {
101+
// eslint-disable-next-line no-param-reassign
102+
transactionsData.rateIDToTransactionIDsMap[transaction?.comment?.customUnit?.customUnitRateID] = [];
103+
}
104+
transactionsData.rateIDToTransactionIDsMap[transaction?.comment?.customUnit?.customUnitRateID]?.push(transaction?.transactionID);
105+
}
106+
return transactionsData;
107+
},
108+
{transactionIDs: new Set<string>(), rateIDToTransactionIDsMap: {} as Record<string, string[]>},
109+
);
110+
},
111+
canBeMissing: true,
112+
});
113+
114+
const eligibleTransactionIDs = eligibleTransactionsData?.transactionIDs;
115+
116+
const [transactionViolations] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, {
117+
selector: (violations) => {
118+
if (!eligibleTransactionIDs || eligibleTransactionIDs.size === 0) {
119+
return undefined;
120+
}
121+
return Object.fromEntries(
122+
Object.entries(violations ?? {}).filter(([key]) => {
123+
const id = key.replace(ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, '');
124+
return eligibleTransactionIDs?.has(id);
125+
}),
126+
);
127+
},
128+
canBeMissing: true,
129+
});
130+
81131
const filterRateSelection = useCallback(
82132
(rate?: Rate) => !!rate && !!customUnitRates?.[rate.customUnitRateID] && customUnitRates?.[rate.customUnitRateID]?.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE,
83133
[customUnitRates],
@@ -235,7 +285,9 @@ function PolicyDistanceRatesPage({
235285
return;
236286
}
237287

238-
deletePolicyDistanceRates(policyID, customUnit, selectedDistanceRates);
288+
const transactionIDsAffected = selectedDistanceRates.flatMap((rateID) => eligibleTransactionsData?.rateIDToTransactionIDsMap?.[rateID] ?? []);
289+
290+
deletePolicyDistanceRates(policyID, customUnit, selectedDistanceRates, transactionIDsAffected, transactionViolations);
239291
setIsDeleteModalVisible(false);
240292

241293
InteractionManager.runAfterInteractions(() => {

tests/unit/DistanceRateTest.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ describe('DistanceRate', () => {
7676
await Onyx.set(`${ONYXKEYS.COLLECTION.POLICY}${policy.id}`, policy);
7777

7878
if (policy.customUnits) {
79-
deletePolicyDistanceRates(policy.id, policy.customUnits[customUnitID], [customUnitRateID1]);
79+
deletePolicyDistanceRates(policy.id, policy.customUnits[customUnitID], [customUnitRateID1], [transaction1.transactionID], undefined);
8080
}
8181
await waitForBatchedUpdates();
8282
const transactionViolations = await new Promise<Record<string, TransactionViolations | undefined>>((resolve) => {

0 commit comments

Comments
 (0)