Commit c133c472 authored by Moody Salem's avatar Moody Salem

fix(search): fix searching tokens to be more tolerant, and sort the exact matched symbols first

parent 0019ccdf
...@@ -10,12 +10,22 @@ export function filterTokens(tokens: Token[], search: string): Token[] { ...@@ -10,12 +10,22 @@ export function filterTokens(tokens: Token[], search: string): Token[] {
return tokens.filter(token => token.address === searchingAddress) return tokens.filter(token => token.address === searchingAddress)
} }
const lowerSearchParts = searchingAddress ? [] : search.toLowerCase().split(/\s+/) const lowerSearchParts = search
.toLowerCase()
.split(/\s+/)
.filter(s => s.length > 0)
if (lowerSearchParts.length === 0) {
return tokens
}
const matchesSearch = (s: string): boolean => { const matchesSearch = (s: string): boolean => {
const sParts = s.toLowerCase().split(/\s+/) const sParts = s
.toLowerCase()
.split(/\s+/)
.filter(s => s.length > 0)
return lowerSearchParts.every(p => p.length === 0 || sParts.some(sp => sp.startsWith(p))) return lowerSearchParts.every(p => p.length === 0 || sParts.some(sp => sp.startsWith(p) || sp.endsWith(p)))
} }
return tokens.filter(token => { return tokens.filter(token => {
......
...@@ -74,15 +74,26 @@ function SearchModal({ ...@@ -74,15 +74,26 @@ function SearchModal({
const tokenComparator = useTokenComparator(invertSearchOrder) const tokenComparator = useTokenComparator(invertSearchOrder)
const sortedTokens: Token[] = useMemo(() => { const filteredTokens: Token[] = useMemo(() => {
if (!isTokenView) return [] if (!isTokenView) return []
return Object.values(allTokens).sort(tokenComparator) return filterTokens(Object.values(allTokens), searchQuery)
}, [allTokens, isTokenView, tokenComparator]) }, [isTokenView, allTokens, searchQuery])
const filteredTokens: Token[] = useMemo(() => { const filteredSortedTokens: Token[] = useMemo(() => {
if (!isTokenView) return [] if (!isTokenView) return []
return filterTokens(sortedTokens, searchQuery) const sorted = filteredTokens.sort(tokenComparator)
}, [isTokenView, sortedTokens, searchQuery]) const symbolMatch = searchQuery
.toLowerCase()
.split(/\s+/)
.filter(s => s.length > 0)
if (symbolMatch.length > 1) return sorted
return [
// sort any exact symbol matches first
...sorted.filter(token => token.symbol.toLowerCase() === symbolMatch[0]),
...sorted.filter(token => token.symbol.toLowerCase() !== symbolMatch[0])
]
}, [filteredTokens, isTokenView, searchQuery, tokenComparator])
function _onTokenSelect(address: string) { function _onTokenSelect(address: string) {
onTokenSelect(address) onTokenSelect(address)
...@@ -157,7 +168,7 @@ function SearchModal({ ...@@ -157,7 +168,7 @@ function SearchModal({
placement="bottom" placement="bottom"
> >
<SearchInput <SearchInput
type={'text'} type="text"
id="token-search-input" id="token-search-input"
placeholder={t('tokenSearchPlaceholder')} placeholder={t('tokenSearchPlaceholder')}
value={searchQuery} value={searchQuery}
...@@ -181,7 +192,7 @@ function SearchModal({ ...@@ -181,7 +192,7 @@ function SearchModal({
<div style={{ width: '100%', height: '1px', backgroundColor: theme.bg2 }} /> <div style={{ width: '100%', height: '1px', backgroundColor: theme.bg2 }} />
{isTokenView ? ( {isTokenView ? (
<TokenList <TokenList
tokens={filteredTokens} tokens={filteredSortedTokens}
allTokenBalances={allTokenBalances} allTokenBalances={allTokenBalances}
onRemoveAddedToken={removeTokenByAddress} onRemoveAddedToken={removeTokenByAddress}
onTokenSelect={_onTokenSelect} onTokenSelect={_onTokenSelect}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment