Skip to content

Commit c73cf29

Browse files
authored
Merge pull request #60662 from software-mansion-labs/@szymczak/highlight-new-transactions-in-report
2 parents 9bbd501 + 3fbad17 commit c73cf29

2 files changed

Lines changed: 162 additions & 119 deletions

File tree

src/components/MoneyRequestReportView/MoneyRequestReportTransactionList.tsx

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import useHover from '@hooks/useHover';
1616
import useLocalize from '@hooks/useLocalize';
1717
import useMobileSelectionMode from '@hooks/useMobileSelectionMode';
1818
import {useMouseContext} from '@hooks/useMouseContext';
19+
import usePrevious from '@hooks/usePrevious';
1920
import useResponsiveLayout from '@hooks/useResponsiveLayout';
2021
import useStyleUtils from '@hooks/useStyleUtils';
2122
import useThemeStyles from '@hooks/useThemeStyles';
@@ -51,6 +52,11 @@ type MoneyRequestReportTransactionListProps = {
5152
hasComments: boolean;
5253
};
5354

55+
type TransactionWithOptionalHighlight = OnyxTypes.Transaction & {
56+
/** Whether the transaction should be highlighted, when it is added to the report */
57+
shouldBeHighlighted?: boolean;
58+
};
59+
5460
const sortableColumnNames = [
5561
CONST.SEARCH.TABLE_COLUMNS.DATE,
5662
CONST.SEARCH.TABLE_COLUMNS.MERCHANT,
@@ -104,6 +110,8 @@ function MoneyRequestReportTransactionList({report, transactions, reportActions,
104110
}, [setSelectedTransactionsID]),
105111
);
106112

113+
const prevTransactions = usePrevious(transactions);
114+
107115
const handleMouseLeave = (e: React.MouseEvent<Element, MouseEvent>) => {
108116
bind.onMouseLeave();
109117
e.stopPropagation();
@@ -117,9 +125,28 @@ function MoneyRequestReportTransactionList({report, transactions, reportActions,
117125

118126
const {sortBy, sortOrder} = sortConfig;
119127

120-
const sortedTransactions = useMemo(() => {
121-
return [...transactions].sort((a, b) => compareValues(a[getTransactionKey(a, sortBy)], b[getTransactionKey(b, sortBy)], sortOrder, sortBy));
122-
}, [sortBy, sortOrder, transactions]);
128+
const newTransactionID = useMemo(() => {
129+
if (!prevTransactions || transactions.length === prevTransactions.length) {
130+
return CONST.EMPTY_ARRAY as unknown as string[];
131+
}
132+
133+
return transactions
134+
.filter((transaction) => !prevTransactions.some((prevTransaction) => prevTransaction.transactionID === transaction.transactionID))
135+
.reduce((latest, t) => {
136+
const inserted = t?.inserted ?? 0;
137+
const latestInserted = latest?.inserted ?? 0;
138+
return inserted > latestInserted ? t : latest;
139+
}, transactions.at(0))?.transactionID;
140+
}, [prevTransactions, transactions]);
141+
142+
const sortedTransactions: TransactionWithOptionalHighlight[] = useMemo(() => {
143+
return [...transactions]
144+
.sort((a, b) => compareValues(a[getTransactionKey(a, sortBy)], b[getTransactionKey(b, sortBy)], sortOrder, sortBy))
145+
.map((transaction) => ({
146+
...transaction,
147+
shouldBeHighlighted: newTransactionID === transaction.transactionID,
148+
}));
149+
}, [newTransactionID, sortBy, sortOrder, transactions]);
123150

124151
const navigateToTransaction = useCallback(
125152
(activeTransaction: OnyxTypes.Transaction) => {
@@ -293,3 +320,4 @@ function MoneyRequestReportTransactionList({report, transactions, reportActions,
293320
MoneyRequestReportTransactionList.displayName = 'MoneyRequestReportTransactionList';
294321

295322
export default memo(MoneyRequestReportTransactionList);
323+
export type {TransactionWithOptionalHighlight};

0 commit comments

Comments
 (0)