Skip to content

Commit ddc2816

Browse files
authored
feat(explore-table-filter): add basic text filtering to explore page (#4105)
* feat(explore-table-filter): add basic text filtering to explore page token table * pr feedback
1 parent e7fd1a8 commit ddc2816

File tree

4 files changed

+33
-11
lines changed

4 files changed

+33
-11
lines changed

src/components/Explore/SearchBar.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
import useTheme from 'hooks/useTheme'
2+
import { useAtom } from 'jotai'
23
import { useState } from 'react'
34
import { Search } from 'react-feather'
45
import styled from 'styled-components/macro'
56

7+
import { filterStringAtom } from './state'
8+
69
export const SMALL_MEDIA_BREAKPOINT = '580px'
710

811
const StyledSearchBar = styled.div<{ focused: boolean }>`
@@ -38,12 +41,15 @@ const SearchInput = styled.input`
3841
export default function SearchBar() {
3942
const theme = useTheme()
4043
const [isFocused, setFocused] = useState(false)
44+
const [filterString, setFilterString] = useAtom(filterStringAtom)
4145

4246
return (
4347
<StyledSearchBar focused={isFocused}>
4448
<Search size={20} color={theme.text3} />
4549
<SearchInput
4650
type="text"
51+
value={filterString}
52+
onChange={({ target: { value } }) => setFilterString(value)}
4753
placeholder="Search token or paste address"
4854
id="searchBar"
4955
onFocus={() => setFocused(true)}

src/components/Explore/TokenRow.tsx

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ import { useCurrency, useToken } from 'hooks/Tokens'
44
import useTheme from 'hooks/useTheme'
55
import { TimePeriod, TokenData } from 'hooks/useTopTokens'
66
import { useAtom } from 'jotai'
7+
import { useAtomValue } from 'jotai/utils'
78
import { darken } from 'polished'
8-
import React, { ReactNode } from 'react'
9-
import { ArrowDownRight, ArrowUpRight, Heart } from 'react-feather'
10-
import { ArrowDown, ArrowUp } from 'react-feather'
9+
import { ReactNode, useMemo } from 'react'
10+
import { ArrowDown, ArrowDownRight, ArrowUp, ArrowUpRight, Heart } from 'react-feather'
1111
import { Link } from 'react-router-dom'
1212
import styled from 'styled-components/macro'
1313
import { formatAmount, formatDollarAmount } from 'utils/formatDollarAmt'
@@ -19,7 +19,7 @@ import {
1919
MOBILE_MEDIA_BREAKPOINT,
2020
SMALL_MEDIA_BREAKPOINT,
2121
} from './constants'
22-
import { favoritesAtom } from './state'
22+
import { favoritesAtom, filterStringAtom } from './state'
2323
import { TIME_DISPLAYS } from './TimeSelector'
2424

2525
enum Category {
@@ -481,14 +481,30 @@ export default function LoadedRow({
481481
listNumber: number
482482
timePeriod: TimePeriod
483483
}) {
484+
const filterString = useAtomValue(filterStringAtom)
484485
const token = useToken(tokenAddress)
485-
const tokenName = token?.name
486-
const tokenSymbol = token?.symbol
486+
const currency = useCurrency(tokenAddress)
487+
const tokenName = token?.name ?? ''
488+
const tokenSymbol = token?.symbol ?? ''
487489
const tokenData = data[tokenAddress]
488490
const [favoriteTokens, updateFavoriteTokens] = useAtom(favoritesAtom)
489491
const theme = useTheme()
490492
const isFavorited = favoriteTokens.includes(tokenAddress)
491493

494+
const showRow = useMemo(() => {
495+
if (!filterString) {
496+
return true
497+
}
498+
const lowercaseFilterString = filterString.toLowerCase()
499+
const addressIncludesFilterString = tokenAddress.toLowerCase().includes(lowercaseFilterString)
500+
const nameIncludesFilterString = tokenName.toLowerCase().includes(lowercaseFilterString)
501+
const symbolIncludesFilterString = tokenSymbol.toLowerCase().includes(lowercaseFilterString)
502+
return nameIncludesFilterString || symbolIncludesFilterString || addressIncludesFilterString
503+
}, [filterString, tokenAddress, tokenName, tokenSymbol])
504+
505+
if (!showRow) {
506+
return null
507+
}
492508
const tokenPercentChangeInfo = (
493509
<>
494510
{tokenData.delta}%
@@ -530,7 +546,7 @@ export default function LoadedRow({
530546
listNumber={listNumber}
531547
tokenInfo={
532548
<ClickableName to={`tokens/${tokenAddress}`}>
533-
<CurrencyLogo currency={useCurrency(tokenAddress)} />
549+
<CurrencyLogo currency={currency} />
534550
<TokenInfoCell>
535551
<TokenName>{tokenName}</TokenName>
536552
<TokenSymbol>{tokenSymbol}</TokenSymbol>

src/components/Explore/TokenTable.tsx

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
import { TimePeriod } from 'hooks/useTopTokens'
2-
import useTopTokens from 'hooks/useTopTokens'
1+
import useTopTokens, { TimePeriod } from 'hooks/useTopTokens'
32
import { useAtom } from 'jotai'
4-
import React from 'react'
53
import styled from 'styled-components/macro'
64

75
import { MOBILE_MEDIA_BREAKPOINT } from './constants'
@@ -39,7 +37,7 @@ const TokenRowsContainer = styled.div`
3937
`
4038
const LOADING_ROWS = Array(10)
4139
.fill(0)
42-
.map((item, index) => {
40+
.map((_item, index) => {
4341
return <LoadingRow key={`${index}`} />
4442
})
4543

src/components/Explore/state.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
import { atom } from 'jotai'
12
import { atomWithStorage } from 'jotai/utils'
23

34
export const favoritesAtom = atomWithStorage<string[]>('favorites', [])
45
export const showFavoritesAtom = atomWithStorage<boolean>('showFavorites', false)
6+
export const filterStringAtom = atom<string>('')

0 commit comments

Comments
 (0)