11import { useTokensWithBalance } from './useTokensWithBalance' ;
22import { Hex , CaipChainId } from '@metamask/utils' ;
3- import { useMemo } from 'react' ;
43import { useTopTokens } from './useTopTokens' ;
54import { BridgeToken } from '../types' ;
65
@@ -27,32 +26,29 @@ export function useTokens({
2726 chainIds : balanceChainIds
2827 } ) ;
2928
30- const { topTokens, pending } = useTopTokens ( { chainId : topTokensChainId } ) ;
29+ const { topTokens, remainingTokens , pending } = useTopTokens ( { chainId : topTokensChainId } ) ;
3130
32- const topTokensFiltered = useMemo ( ( ) =>
33- topTokens
34- // filter out tokens that are already in the tokensWithBalance array
35- ?. filter ( ( token ) => ! tokensWithBalance . some (
36- ( t ) => t . address === token . address && t . chainId === token . chainId
37- ) ) ?? [ ] ,
38- [ topTokens , tokensWithBalance ]
39- ) ;
31+ const getTokenKey = ( token : { address : string ; chainId : Hex | CaipChainId } ) => `${ token . address } -${ token . chainId } ` ;
4032
41- const uniqueTokens = useMemo (
42- ( ) => [ ... tokensWithBalance , ... topTokensFiltered ] ,
43- [ tokensWithBalance , topTokensFiltered ]
33+ // Create Sets for O(1) lookups
34+ const tokensWithBalanceSet = new Set (
35+ tokensWithBalance . map ( token => getTokenKey ( token ) )
4436 ) ;
45-
46- const filteredTokens = useMemo (
47- ( ) => uniqueTokens . filter ( ( token ) => {
48- // filter out tokens that are in the tokensToExclude array
49- const isSelectedToken = tokensToExclude ?. some (
50- ( t ) => t . address === token . address && t . chainId === token . chainId
51- ) ;
52- return ! isSelectedToken ;
53- } ) ,
54- [ uniqueTokens , tokensToExclude ]
37+ const excludedTokensSet = new Set (
38+ tokensToExclude ?. map ( token => getTokenKey ( token ) ) ?? [ ]
5539 ) ;
5640
57- return { tokens : filteredTokens , pending } ;
41+ // Combine and filter tokens in a single pass
42+ const tokensWithoutBalance = ( topTokens ?? [ ] ) . concat ( remainingTokens ?? [ ] ) . filter ( token => {
43+ const tokenKey = getTokenKey ( token ) ;
44+ return ! tokensWithBalanceSet . has ( tokenKey ) ;
45+ } ) ;
46+
47+ // Combine tokens with balance and filtered tokens and filter out excluded tokens
48+ const tokens = tokensWithBalance . concat ( tokensWithoutBalance ) . filter ( token => {
49+ const tokenKey = getTokenKey ( token ) ;
50+ return ! excludedTokensSet . has ( tokenKey ) ;
51+ } ) ;
52+
53+ return { tokens, pending } ;
5854}
0 commit comments