Skip to content

Commit

Permalink
Merge pull request #45961 from Expensify/Rory-FixOptimisticMerge
Browse files Browse the repository at this point in the history
Fix optimistic duplicate expense merge
  • Loading branch information
techievivek authored Jul 29, 2024
2 parents d8d7f78 + 85169e9 commit c486e56
Showing 1 changed file with 90 additions and 3 deletions.
93 changes: 90 additions & 3 deletions src/libs/actions/IOU.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import {format} from 'date-fns';
import {fastMerge, Str} from 'expensify-common';
import type {NullishDeep, OnyxCollection, OnyxEntry, OnyxInputValue, OnyxUpdate} from 'react-native-onyx';
import Onyx from 'react-native-onyx';
import type {ValueOf} from 'type-fest';
import type {PartialDeep, ValueOf} from 'type-fest';
import ReceiptGeneric from '@assets/images/receipt-generic.png';
import * as API from '@libs/API';
import type {
Expand Down Expand Up @@ -7677,11 +7677,98 @@ function mergeDuplicates(params: TransactionMergeParams) {
};
});

const duplicateTransactionTotals = params.transactionIDList.reduce((total, id) => {
const duplicateTransaction = allTransactions[`${ONYXKEYS.COLLECTION.TRANSACTION}${id}`];
if (!duplicateTransaction) {
return total;
}
return total + duplicateTransaction.amount;
}, 0);

const expenseReport = ReportConnection.getAllReports()?.[`${ONYXKEYS.COLLECTION.REPORT}${params.reportID}`];
const expenseReportOptimisticData: OnyxUpdate = {
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.REPORT}${params.reportID}`,
value: {
total: (expenseReport?.total ?? 0) - duplicateTransactionTotals,
},
};
const expenseReportFailureData: OnyxUpdate = {
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.REPORT}${params.reportID}`,
value: {
total: expenseReport?.total,
},
};

const iouActionsToDelete = Object.values(allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${params.reportID}`] ?? {})?.filter(
(reportAction): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> => {
if (!ReportActionsUtils.isMoneyRequestAction(reportAction)) {
return false;
}
const message = ReportActionsUtils.getOriginalMessage(reportAction);
if (!message?.IOUTransactionID) {
return false;
}
return params.transactionIDList.includes(message.IOUTransactionID);
},
);

const deletedTime = DateUtils.getDBTime();
const expenseReportActionsOptimisticData: OnyxUpdate = {
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${params.reportID}`,
value: iouActionsToDelete.reduce<Record<string, PartialDeep<ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU>>>>((val, reportAction) => {
// eslint-disable-next-line no-param-reassign
val[reportAction.reportActionID] = {
originalMessage: {
deleted: deletedTime,
},
...(Array.isArray(reportAction.message) &&
!!reportAction.message[0] && {
message: [
{
...reportAction.message[0],
deleted: deletedTime,
},
...reportAction.message.slice(1),
],
}),
...(!Array.isArray(reportAction.message) && {
message: {
deleted: deletedTime,
},
}),
};
return val;
}, {}),
};
const expenseReportActionsFailureData: OnyxUpdate = {
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${params.reportID}`,
value: iouActionsToDelete.reduce<Record<string, NullishDeep<PartialDeep<ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU>>>>>((val, reportAction) => {
// eslint-disable-next-line no-param-reassign
val[reportAction.reportActionID] = {
originalMessage: {
deleted: null,
},
message: reportAction.message,
};
return val;
}, {}),
};

const optimisticData: OnyxUpdate[] = [];
const failureData: OnyxUpdate[] = [];

optimisticData.push(optimisticTransactionData, ...optimisticTransactionDuplicatesData, ...optimisticTransactionViolations);
failureData.push(failureTransactionData, ...failureTransactionDuplicatesData, ...failureTransactionViolations);
optimisticData.push(
optimisticTransactionData,
...optimisticTransactionDuplicatesData,
...optimisticTransactionViolations,
expenseReportOptimisticData,
expenseReportActionsOptimisticData,
);
failureData.push(failureTransactionData, ...failureTransactionDuplicatesData, ...failureTransactionViolations, expenseReportFailureData, expenseReportActionsFailureData);

API.write(WRITE_COMMANDS.TRANSACTION_MERGE, params, {optimisticData, failureData});
}
Expand Down

0 comments on commit c486e56

Please sign in to comment.