@@ -27,6 +27,14 @@ export interface AssetToBuySection {
27
27
const MAX_UNVERIFIED_RESULTS = 8 ;
28
28
const MAX_VERIFIED_RESULTS = 48 ;
29
29
30
+ const mergeAssetsFavoriteStatus = ( {
31
+ assets,
32
+ favoritesList,
33
+ } : {
34
+ assets : SearchAsset [ ] | undefined ;
35
+ favoritesList : SearchAsset [ ] | undefined ;
36
+ } ) : SearchAsset [ ] => assets ?. map ( asset => ( { ...asset , favorite : favoritesList ?. some ( fav => fav . address === asset . address ) } ) ) || [ ] ;
37
+
30
38
const filterAssetsFromBridge = ( {
31
39
assets,
32
40
filteredBridgeAssetAddress,
@@ -35,16 +43,43 @@ const filterAssetsFromBridge = ({
35
43
filteredBridgeAssetAddress : string | undefined ;
36
44
} ) : SearchAsset [ ] => assets ?. filter ( curatedAsset => ! isLowerCaseMatch ( curatedAsset ?. address , filteredBridgeAssetAddress ) ) || [ ] ;
37
45
38
- const filterAssetsFromFavoritesAndBridge = ( {
46
+ const filterAssetsFromRecentSwaps = ( {
47
+ assets,
48
+ recentSwaps,
49
+ } : {
50
+ assets : SearchAsset [ ] | undefined ;
51
+ recentSwaps : RecentSwap [ ] | undefined ;
52
+ } ) : SearchAsset [ ] => ( assets || [ ] ) . filter ( asset => ! recentSwaps ?. some ( recent => recent . address === asset . address ) ) ;
53
+
54
+ const filterAssetsFromBridgeAndRecent = ( {
55
+ assets,
56
+ recentSwaps,
57
+ filteredBridgeAssetAddress,
58
+ } : {
59
+ assets : SearchAsset [ ] | undefined ;
60
+ recentSwaps : RecentSwap [ ] | undefined ;
61
+ filteredBridgeAssetAddress : string | undefined ;
62
+ } ) : SearchAsset [ ] =>
63
+ filterAssetsFromRecentSwaps ( {
64
+ assets : filterAssetsFromBridge ( { assets, filteredBridgeAssetAddress } ) ,
65
+ recentSwaps : recentSwaps ,
66
+ } ) ;
67
+
68
+ const filterAssetsFromFavoritesAndBridgeAndRecent = ( {
39
69
assets,
40
70
favoritesList,
41
71
filteredBridgeAssetAddress,
72
+ recentSwaps,
42
73
} : {
43
74
assets : SearchAsset [ ] | undefined ;
44
75
favoritesList : SearchAsset [ ] | undefined ;
45
76
filteredBridgeAssetAddress : string | undefined ;
77
+ recentSwaps : RecentSwap [ ] | undefined ;
46
78
} ) : SearchAsset [ ] =>
47
- filterAssetsFromBridge ( { assets, filteredBridgeAssetAddress } ) ?. filter (
79
+ filterAssetsFromRecentSwaps ( {
80
+ assets : filterAssetsFromBridge ( { assets, filteredBridgeAssetAddress } ) ,
81
+ recentSwaps : recentSwaps ,
82
+ } ) ?. filter (
48
83
curatedAsset => ! favoritesList ?. some ( ( { address } ) => curatedAsset . address === address || curatedAsset . mainnetAddress === address )
49
84
) || [ ] ;
50
85
@@ -79,49 +114,65 @@ const buildListSectionsData = ({
79
114
} ;
80
115
81
116
if ( combinedData . bridgeAsset ) {
82
- addSection ( 'bridge' , [ combinedData . bridgeAsset ] ) ;
117
+ addSection (
118
+ 'bridge' ,
119
+ mergeAssetsFavoriteStatus ( {
120
+ assets : [ combinedData . bridgeAsset ] ,
121
+ favoritesList,
122
+ } )
123
+ ) ;
83
124
}
84
125
85
126
if ( combinedData . recentSwaps ?. length ) {
86
- const filteredRecents = filterAssetsFromFavoritesAndBridge ( {
127
+ const filteredRecents = filterAssetsFromBridge ( {
87
128
assets : combinedData . recentSwaps ,
88
- favoritesList,
89
129
filteredBridgeAssetAddress,
90
130
} ) ;
91
- addSection ( 'recent' , filteredRecents ) ;
131
+
132
+ addSection (
133
+ 'recent' ,
134
+ mergeAssetsFavoriteStatus ( {
135
+ assets : filteredRecents ,
136
+ favoritesList,
137
+ } )
138
+ ) ;
92
139
}
93
140
94
141
if ( favoritesList ?. length ) {
95
- const filteredFavorites = filterAssetsFromBridge ( {
142
+ const filteredFavorites = filterAssetsFromBridgeAndRecent ( {
96
143
assets : favoritesList ,
97
144
filteredBridgeAssetAddress,
145
+ recentSwaps : combinedData . recentSwaps ,
98
146
} ) ;
99
147
addSection ( 'favorites' , filteredFavorites ) ;
100
148
}
101
149
102
150
if ( combinedData . verifiedAssets ?. length ) {
103
- const filteredVerified = filterAssetsFromFavoritesAndBridge ( {
151
+ const filteredVerified = filterAssetsFromFavoritesAndBridgeAndRecent ( {
104
152
assets : combinedData . verifiedAssets ,
105
153
favoritesList,
106
154
filteredBridgeAssetAddress,
155
+ recentSwaps : combinedData . recentSwaps ,
107
156
} ) ;
108
157
addSection ( 'verified' , filteredVerified ) ;
109
158
}
110
159
111
160
if ( ! formattedData . length && combinedData . crosschainExactMatches ?. length ) {
112
- const filteredCrosschain = filterAssetsFromFavoritesAndBridge ( {
161
+ const filteredCrosschain = filterAssetsFromFavoritesAndBridgeAndRecent ( {
113
162
assets : combinedData . crosschainExactMatches ,
114
163
favoritesList,
115
164
filteredBridgeAssetAddress,
165
+ recentSwaps : combinedData . recentSwaps ,
116
166
} ) ;
117
167
addSection ( 'other_networks' , filteredCrosschain ) ;
118
168
}
119
169
120
170
if ( combinedData . unverifiedAssets ?. length ) {
121
- const filteredUnverified = filterAssetsFromFavoritesAndBridge ( {
171
+ const filteredUnverified = filterAssetsFromFavoritesAndBridgeAndRecent ( {
122
172
assets : combinedData . unverifiedAssets ,
123
173
favoritesList,
124
174
filteredBridgeAssetAddress,
175
+ recentSwaps : combinedData . recentSwaps ,
125
176
} ) ;
126
177
addSection ( 'unverified' , filteredUnverified ) ;
127
178
}
@@ -236,10 +287,6 @@ export function useSearchCurrencyLists() {
236
287
} ) ) as SearchAsset [ ] ;
237
288
} , [ favorites , state . toChainId ] ) ;
238
289
239
- const recentsForChain = useMemo ( ( ) => {
240
- return getRecentSwapsByChain ( state . toChainId ) ;
241
- } , [ getRecentSwapsByChain , state . toChainId ] ) ;
242
-
243
290
const memoizedData = useMemo ( ( ) => {
244
291
const queryIsAddress = isAddress ( query ) ;
245
292
const keys : TokenSearchAssetKey [ ] = queryIsAddress ? [ 'address' ] : [ 'name' , 'symbol' ] ;
@@ -256,23 +303,22 @@ export function useSearchCurrencyLists() {
256
303
: null ;
257
304
258
305
const filteredBridgeAsset = bridgeAsset && filterBridgeAsset ( { asset : bridgeAsset , filter : query } ) ? bridgeAsset : null ;
259
- const isBridgeAssetUserFavorite =
260
- bridgeAsset &&
261
- unfilteredFavorites . some ( asset => asset . mainnetAddress === bridgeAsset . mainnetAddress || asset . address === bridgeAsset . address ) ;
262
306
263
307
return {
264
308
queryIsAddress,
265
309
keys,
266
310
threshold,
267
311
enableUnverifiedSearch,
268
- filteredBridgeAsset : filteredBridgeAsset
269
- ? {
270
- ...filteredBridgeAsset ,
271
- favorite : isBridgeAssetUserFavorite ,
272
- }
273
- : null ,
312
+ filteredBridgeAsset,
274
313
} ;
275
- } , [ assetToSell , query , selectedOutputChainId , state , verifiedAssets , unfilteredFavorites ] ) ;
314
+ } , [ assetToSell , query , selectedOutputChainId , state , verifiedAssets ] ) ;
315
+
316
+ const recentsForChain = useMemo ( ( ) => {
317
+ return filterList ( getRecentSwapsByChain ( state . toChainId ) , query , memoizedData . keys , {
318
+ threshold : memoizedData . queryIsAddress ? rankings . CASE_SENSITIVE_EQUAL : rankings . CONTAINS ,
319
+ sorter : matchItems => matchItems . sort ( ( a , b ) => b . item . swappedAt - a . item . swappedAt ) ,
320
+ } ) ;
321
+ } , [ getRecentSwapsByChain , state . toChainId , query , memoizedData . keys , memoizedData . queryIsAddress ] ) ;
276
322
277
323
const favoritesList = useMemo ( ( ) => {
278
324
if ( query === '' ) {
0 commit comments