Skip to content

Commit deb6823

Browse files
committed
perf: avoid cloning violations map in LHN RBR hot path
Replace filterOutModifiedAmountViolationsForTransactions (which shallow-cloned the entire transactionViolations map per processing report) with a dedicated hasNoticeTypeViolationsForRBRInLHN helper that filters excluded violation names inline per transaction. This removes repeated O(totalViolations) map copies from the LHN render path and eliminates the associated GC pressure on large workspaces, while preserving identical behavior: MODIFIED_AMOUNT notice violations are still excluded from the LHN RBR check for processing/submitted reports, and expense-details rendering is unchanged. Addresses Codex review on Expensify#88230.
1 parent d0d4a86 commit deb6823

1 file changed

Lines changed: 19 additions & 27 deletions

File tree

src/libs/ReportUtils.ts

Lines changed: 19 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -9183,9 +9183,7 @@ function getViolatingReportIDForRBRInLHN(report: OnyxEntry<Report>, transactionV
91839183
return false;
91849184
}
91859185

9186-
const transactionViolationsForNoticeCheck = isProcessingReport(potentialReport)
9187-
? filterOutModifiedAmountViolationsForTransactions(transactionViolations, transactions)
9188-
: transactionViolations;
9186+
const excludedNoticeNamesForLHN = isProcessingReport(potentialReport) ? [CONST.VIOLATIONS.MODIFIED_AMOUNT] : [];
91899187

91909188
return (
91919189
!isInvoiceReport(potentialReport) &&
@@ -9217,43 +9215,37 @@ function getViolatingReportIDForRBRInLHN(report: OnyxEntry<Report>, transactionV
92179215
potentialReport,
92189216
policy,
92199217
) ||
9220-
hasNoticeTypeViolations(
9221-
potentialReport.reportID,
9222-
transactionViolationsForNoticeCheck,
9218+
hasNoticeTypeViolationsForRBRInLHN(
9219+
transactionViolations,
92239220
deprecatedCurrentUserAccountID ?? CONST.DEFAULT_NUMBER_ID,
92249221
deprecatedCurrentUserEmail ?? '',
9225-
true,
92269222
transactions,
92279223
potentialReport,
92289224
policy,
9225+
excludedNoticeNamesForLHN,
92299226
))
92309227
);
92319228
});
92329229
return violatingReport ? violatingReport.reportID : null;
92339230
}
92349231

9235-
function filterOutModifiedAmountViolationsForTransactions(
9232+
function hasNoticeTypeViolationsForRBRInLHN(
92369233
transactionViolations: OnyxCollection<TransactionViolation[]>,
9237-
transactions: Transaction[],
9238-
): OnyxCollection<TransactionViolation[]> {
9239-
const filteredViolations = {...transactionViolations};
9240-
9241-
for (const transaction of transactions) {
9242-
const transactionID = transaction?.transactionID;
9243-
if (!transactionID) {
9244-
continue;
9245-
}
9246-
9247-
const transactionViolationKey = `${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`;
9248-
const violations = filteredViolations[transactionViolationKey];
9249-
if (!violations?.length) {
9250-
continue;
9234+
currentUserAccountIDParam: number,
9235+
currentUserEmailParam: string,
9236+
reportTransactions: Transaction[],
9237+
report: OnyxEntry<Report>,
9238+
policy: OnyxEntry<Policy>,
9239+
excludedViolationNames: string[],
9240+
): boolean {
9241+
return reportTransactions.some((transaction) => {
9242+
const rawViolations = transactionViolations?.[`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transaction?.transactionID}`];
9243+
if (!rawViolations?.length) {
9244+
return false;
92519245
}
9252-
9253-
filteredViolations[transactionViolationKey] = violations.filter((violation) => violation.name !== CONST.VIOLATIONS.MODIFIED_AMOUNT);
9254-
}
9255-
9256-
return filteredViolations;
9246+
const filteredViolations = excludedViolationNames.length > 0 ? rawViolations.filter((violation) => !excludedViolationNames.includes(violation.name)) : rawViolations;
9247+
return hasNoticeTypeViolation(transaction, filteredViolations, currentUserEmailParam, currentUserAccountIDParam, report, policy, true);
9248+
});
92579249
}
92589250

92599251
/**

0 commit comments

Comments
 (0)