Skip to content

Commit c133c47

Browse files
committed
fix(search): fix searching tokens to be more tolerant, and sort the exact matched symbols first
1 parent 0019ccd commit c133c47

File tree

2 files changed

+32
-11
lines changed

2 files changed

+32
-11
lines changed

src/components/SearchModal/filtering.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,22 @@ export function filterTokens(tokens: Token[], search: string): Token[] {
1010
return tokens.filter(token => token.address === searchingAddress)
1111
}
1212

13-
const lowerSearchParts = searchingAddress ? [] : search.toLowerCase().split(/\s+/)
13+
const lowerSearchParts = search
14+
.toLowerCase()
15+
.split(/\s+/)
16+
.filter(s => s.length > 0)
17+
18+
if (lowerSearchParts.length === 0) {
19+
return tokens
20+
}
1421

1522
const matchesSearch = (s: string): boolean => {
16-
const sParts = s.toLowerCase().split(/\s+/)
23+
const sParts = s
24+
.toLowerCase()
25+
.split(/\s+/)
26+
.filter(s => s.length > 0)
1727

18-
return lowerSearchParts.every(p => p.length === 0 || sParts.some(sp => sp.startsWith(p)))
28+
return lowerSearchParts.every(p => p.length === 0 || sParts.some(sp => sp.startsWith(p) || sp.endsWith(p)))
1929
}
2030

2131
return tokens.filter(token => {

src/components/SearchModal/index.tsx

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -74,15 +74,26 @@ function SearchModal({
7474

7575
const tokenComparator = useTokenComparator(invertSearchOrder)
7676

77-
const sortedTokens: Token[] = useMemo(() => {
77+
const filteredTokens: Token[] = useMemo(() => {
7878
if (!isTokenView) return []
79-
return Object.values(allTokens).sort(tokenComparator)
80-
}, [allTokens, isTokenView, tokenComparator])
79+
return filterTokens(Object.values(allTokens), searchQuery)
80+
}, [isTokenView, allTokens, searchQuery])
8181

82-
const filteredTokens: Token[] = useMemo(() => {
82+
const filteredSortedTokens: Token[] = useMemo(() => {
8383
if (!isTokenView) return []
84-
return filterTokens(sortedTokens, searchQuery)
85-
}, [isTokenView, sortedTokens, searchQuery])
84+
const sorted = filteredTokens.sort(tokenComparator)
85+
const symbolMatch = searchQuery
86+
.toLowerCase()
87+
.split(/\s+/)
88+
.filter(s => s.length > 0)
89+
if (symbolMatch.length > 1) return sorted
90+
91+
return [
92+
// sort any exact symbol matches first
93+
...sorted.filter(token => token.symbol.toLowerCase() === symbolMatch[0]),
94+
...sorted.filter(token => token.symbol.toLowerCase() !== symbolMatch[0])
95+
]
96+
}, [filteredTokens, isTokenView, searchQuery, tokenComparator])
8697

8798
function _onTokenSelect(address: string) {
8899
onTokenSelect(address)
@@ -157,7 +168,7 @@ function SearchModal({
157168
placement="bottom"
158169
>
159170
<SearchInput
160-
type={'text'}
171+
type="text"
161172
id="token-search-input"
162173
placeholder={t('tokenSearchPlaceholder')}
163174
value={searchQuery}
@@ -181,7 +192,7 @@ function SearchModal({
181192
<div style={{ width: '100%', height: '1px', backgroundColor: theme.bg2 }} />
182193
{isTokenView ? (
183194
<TokenList
184-
tokens={filteredTokens}
195+
tokens={filteredSortedTokens}
185196
allTokenBalances={allTokenBalances}
186197
onRemoveAddedToken={removeTokenByAddress}
187198
onTokenSelect={_onTokenSelect}

0 commit comments

Comments
 (0)