@@ -16,6 +16,7 @@ import useHover from '@hooks/useHover';
1616import useLocalize from '@hooks/useLocalize' ;
1717import useMobileSelectionMode from '@hooks/useMobileSelectionMode' ;
1818import { useMouseContext } from '@hooks/useMouseContext' ;
19+ import usePrevious from '@hooks/usePrevious' ;
1920import useResponsiveLayout from '@hooks/useResponsiveLayout' ;
2021import useStyleUtils from '@hooks/useStyleUtils' ;
2122import 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+
5460const 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,
293320MoneyRequestReportTransactionList . displayName = 'MoneyRequestReportTransactionList' ;
294321
295322export default memo ( MoneyRequestReportTransactionList ) ;
323+ export type { TransactionWithOptionalHighlight } ;
0 commit comments