diff --git a/src/components/SelectionList/Search/TransactionGroupListItem.tsx b/src/components/SelectionList/Search/TransactionGroupListItem.tsx index ea4791a26984..09af528e221e 100644 --- a/src/components/SelectionList/Search/TransactionGroupListItem.tsx +++ b/src/components/SelectionList/Search/TransactionGroupListItem.tsx @@ -36,6 +36,7 @@ import Navigation from '@libs/Navigation/Navigation'; import {getReportAction} from '@libs/ReportActionsUtils'; import {canAddTransaction as canAddTransactionUtil, getAddExpenseDropdownOptions} from '@libs/ReportUtils'; import {createAndOpenSearchTransactionThread, getColumnsToShow, getSections} from '@libs/SearchUIUtils'; +import {getTransactionViolations} from '@libs/TransactionUtils'; import variables from '@styles/variables'; import {setActiveTransactionThreadIDs} from '@userActions/TransactionThreadNavigation'; import CONST from '@src/CONST'; @@ -351,7 +352,7 @@ function TransactionGroupListItem({ key={transaction.transactionID} report={transaction.report} transactionItem={transaction} - violations={violations?.[`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transaction.transactionID}`]} + violations={getTransactionViolations(transaction, violations)} isSelected={!!transaction.isSelected} dateColumnSize={dateColumnSize} amountColumnSize={amountColumnSize} diff --git a/src/components/SelectionList/Search/TransactionListItem.tsx b/src/components/SelectionList/Search/TransactionListItem.tsx index c6ab5dd62079..2f3e7e4360a3 100644 --- a/src/components/SelectionList/Search/TransactionListItem.tsx +++ b/src/components/SelectionList/Search/TransactionListItem.tsx @@ -14,6 +14,7 @@ import useSyncFocus from '@hooks/useSyncFocus'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import {handleActionButtonPress as handleActionButtonPressUtil} from '@libs/actions/Search'; +import {getTransactionViolations} from '@libs/TransactionUtils'; import variables from '@styles/variables'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; @@ -74,6 +75,8 @@ function TransactionListItem({ }; }, [transactionItem]); + const transactionViolations = useMemo(() => getTransactionViolations(transactionItem, violations), [transactionItem, violations]); + const handleActionButtonPress = useCallback(() => { handleActionButtonPressUtil( currentSearchHash, @@ -148,7 +151,7 @@ function TransactionListItem({ shouldShowCheckbox={!!canSelectMultiple} style={[styles.p3, shouldUseNarrowLayout ? styles.pt2 : {}]} areAllOptionalColumnsHidden={areAllOptionalColumnsHidden} - violations={violations?.[`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionItem.transactionID}`]} + violations={transactionViolations} /> diff --git a/src/hooks/useTransactionsAndViolationsForReport.ts b/src/hooks/useTransactionsAndViolationsForReport.ts index bce3f3de50cc..e05c493b8e39 100644 --- a/src/hooks/useTransactionsAndViolationsForReport.ts +++ b/src/hooks/useTransactionsAndViolationsForReport.ts @@ -1,5 +1,8 @@ +import {useMemo} from 'react'; import {useAllReportsTransactionsAndViolations} from '@components/OnyxListItemProvider'; -import CONST from '@src/CONST'; +import {getTransactionViolations} from '@libs/TransactionUtils'; +import ONYXKEYS from '@src/ONYXKEYS'; +import type {TransactionViolations} from '@src/types/onyx'; import type {ReportTransactionsAndViolations} from '@src/types/onyx/DerivedValues'; const DEFAULT_RETURN_VALUE: ReportTransactionsAndViolations = {transactions: {}, violations: {}}; @@ -7,11 +10,26 @@ const DEFAULT_RETURN_VALUE: ReportTransactionsAndViolations = {transactions: {}, function useTransactionsAndViolationsForReport(reportID?: string) { const allReportsTransactionsAndViolations = useAllReportsTransactionsAndViolations(); - if (!reportID) { - return DEFAULT_RETURN_VALUE; - } + const {transactions, violations} = reportID ? (allReportsTransactionsAndViolations?.[reportID] ?? DEFAULT_RETURN_VALUE) : DEFAULT_RETURN_VALUE; - return allReportsTransactionsAndViolations?.[reportID ?? CONST.DEFAULT_NUMBER_ID] ?? DEFAULT_RETURN_VALUE; + const transactionsAndViolations = useMemo(() => { + const filteredViolations = Object.keys(violations).reduce( + (filteredTransactionViolations, transactionViolationKey) => { + const transactionID = transactionViolationKey.split('_').at(1) ?? ''; + const transaction = transactions[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]; + + // This is our accumulator, it's okay to reassign + // eslint-disable-next-line no-param-reassign + filteredTransactionViolations[transactionViolationKey] = getTransactionViolations(transaction, violations) ?? []; + return filteredTransactionViolations; + }, + {} as Record, + ); + + return {transactions, violations: filteredViolations}; + }, [transactions, violations]); + + return transactionsAndViolations; } export default useTransactionsAndViolationsForReport; diff --git a/src/libs/ReportPrimaryActionUtils.ts b/src/libs/ReportPrimaryActionUtils.ts index 8180eaaac9d7..499277f8e89b 100644 --- a/src/libs/ReportPrimaryActionUtils.ts +++ b/src/libs/ReportPrimaryActionUtils.ts @@ -255,7 +255,7 @@ function isRemoveHoldAction(report: Report, chatReport: OnyxEntry, repor } function isReviewDuplicatesAction(report: Report, reportTransactions: Transaction[]) { - const hasDuplicates = reportTransactions.some((transaction) => isDuplicate(transaction)); + const hasDuplicates = reportTransactions.some((transaction) => isDuplicate(transaction, true)); if (!hasDuplicates) { return false; diff --git a/src/libs/ReportSecondaryActionUtils.ts b/src/libs/ReportSecondaryActionUtils.ts index 47ec3e46533f..32b7ff70c7d1 100644 --- a/src/libs/ReportSecondaryActionUtils.ts +++ b/src/libs/ReportSecondaryActionUtils.ts @@ -213,7 +213,7 @@ function isApproveAction(report: Report, reportTransactions: Transaction[], viol return false; } const isExpenseReport = isExpenseReportUtils(report); - const reportHasDuplicatedTransactions = reportTransactions.some((transaction) => isDuplicate(transaction)); + const reportHasDuplicatedTransactions = reportTransactions.some((transaction) => isDuplicate(transaction, true)); if (isExpenseReport && isProcessingReport && reportHasDuplicatedTransactions) { return true;