Commit f312a148 authored by Jordan Frankfurt's avatar Jordan Frankfurt Committed by GitHub

fix: persist volume ranking in token table rows instead of using index (#5819)

* fix: persist volume ranking in token table rows instead of using index

* pr feedback
parent cf5bb574
...@@ -434,16 +434,16 @@ interface LoadedRowProps { ...@@ -434,16 +434,16 @@ interface LoadedRowProps {
tokenListLength: number tokenListLength: number
token: NonNullable<TopToken> token: NonNullable<TopToken>
sparklineMap: SparklineMap sparklineMap: SparklineMap
volumeRank: number
} }
/* Loaded State: row component with token information */ /* Loaded State: row component with token information */
export const LoadedRow = forwardRef((props: LoadedRowProps, ref: ForwardedRef<HTMLDivElement>) => { export const LoadedRow = forwardRef((props: LoadedRowProps, ref: ForwardedRef<HTMLDivElement>) => {
const { tokenListIndex, tokenListLength, token } = props const { tokenListIndex, tokenListLength, token, volumeRank } = props
const tokenAddress = token.address const tokenAddress = token.address
const tokenName = token.name const tokenName = token.name
const tokenSymbol = token.symbol const tokenSymbol = token.symbol
const filterString = useAtomValue(filterStringAtom) const filterString = useAtomValue(filterStringAtom)
const sortAscending = useAtomValue(sortAscendingAtom)
const lowercaseChainName = useParams<{ chainName?: string }>().chainName?.toUpperCase() ?? 'ethereum' const lowercaseChainName = useParams<{ chainName?: string }>().chainName?.toUpperCase() ?? 'ethereum'
const filterNetwork = lowercaseChainName.toUpperCase() const filterNetwork = lowercaseChainName.toUpperCase()
...@@ -454,14 +454,13 @@ export const LoadedRow = forwardRef((props: LoadedRowProps, ref: ForwardedRef<HT ...@@ -454,14 +454,13 @@ export const LoadedRow = forwardRef((props: LoadedRowProps, ref: ForwardedRef<HT
const arrow = getDeltaArrow(delta) const arrow = getDeltaArrow(delta)
const smallArrow = getDeltaArrow(delta, 14) const smallArrow = getDeltaArrow(delta, 14)
const formattedDelta = formatDelta(delta) const formattedDelta = formatDelta(delta)
const rank = sortAscending ? tokenListLength - tokenListIndex : tokenListIndex + 1
const exploreTokenSelectedEventProperties = { const exploreTokenSelectedEventProperties = {
chain_id: chainId, chain_id: chainId,
token_address: tokenAddress, token_address: tokenAddress,
token_symbol: tokenSymbol, token_symbol: tokenSymbol,
token_list_index: tokenListIndex, token_list_index: tokenListIndex,
token_list_rank: rank, token_list_rank: volumeRank,
token_list_length: tokenListLength, token_list_length: tokenListLength,
time_frame: timePeriod, time_frame: timePeriod,
search_token_address_input: filterString, search_token_address_input: filterString,
...@@ -478,7 +477,7 @@ export const LoadedRow = forwardRef((props: LoadedRowProps, ref: ForwardedRef<HT ...@@ -478,7 +477,7 @@ export const LoadedRow = forwardRef((props: LoadedRowProps, ref: ForwardedRef<HT
> >
<TokenRow <TokenRow
header={false} header={false}
listNumber={rank} listNumber={volumeRank}
tokenInfo={ tokenInfo={
<ClickableName> <ClickableName>
<LogoContainer> <LogoContainer>
......
...@@ -78,7 +78,7 @@ function LoadingTokenTable({ rowCount = PAGE_SIZE }: { rowCount?: number }) { ...@@ -78,7 +78,7 @@ function LoadingTokenTable({ rowCount = PAGE_SIZE }: { rowCount?: number }) {
export default function TokenTable() { export default function TokenTable() {
// TODO: consider moving prefetched call into app.tsx and passing it here, use a preloaded call & updated on interval every 60s // TODO: consider moving prefetched call into app.tsx and passing it here, use a preloaded call & updated on interval every 60s
const chainName = validateUrlChainParam(useParams<{ chainName?: string }>().chainName) const chainName = validateUrlChainParam(useParams<{ chainName?: string }>().chainName)
const { tokens, loadingTokens, sparklines } = useTopTokens(chainName) const { tokens, tokenVolumeRank, loadingTokens, sparklines } = useTopTokens(chainName)
/* loading and error state */ /* loading and error state */
if (loadingTokens) { if (loadingTokens) {
...@@ -103,13 +103,14 @@ export default function TokenTable() { ...@@ -103,13 +103,14 @@ export default function TokenTable() {
<TokenDataContainer> <TokenDataContainer>
{tokens.map( {tokens.map(
(token, index) => (token, index) =>
token && ( token?.address && (
<LoadedRow <LoadedRow
key={token?.address} key={token.address}
tokenListIndex={index} tokenListIndex={index}
tokenListLength={tokens.length} tokenListLength={tokens.length}
token={token} token={token}
sparklineMap={sparklines} sparklineMap={sparklines}
volumeRank={tokenVolumeRank[token.address]}
/> />
) )
)} )}
......
...@@ -119,6 +119,7 @@ export type TopToken = NonNullable<NonNullable<TopTokens100Query>['topTokens']>[ ...@@ -119,6 +119,7 @@ export type TopToken = NonNullable<NonNullable<TopTokens100Query>['topTokens']>[
interface UseTopTokensReturnValue { interface UseTopTokensReturnValue {
tokens: TopToken[] | undefined tokens: TopToken[] | undefined
tokenVolumeRank: Record<string, number>
loadingTokens: boolean loadingTokens: boolean
sparklines: SparklineMap sparklines: SparklineMap
} }
...@@ -143,11 +144,30 @@ export function useTopTokens(chain: Chain): UseTopTokensReturnValue { ...@@ -143,11 +144,30 @@ export function useTopTokens(chain: Chain): UseTopTokensReturnValue {
const { data, loading: loadingTokens } = useTopTokens100Query({ const { data, loading: loadingTokens } = useTopTokens100Query({
variables: { duration, chain }, variables: { duration, chain },
}) })
const mappedTokens = useMemo( const unwrappedTokens = useMemo(
() => data?.topTokens?.map((token) => unwrapToken(chainId, token)) ?? [], () => data?.topTokens?.map((token) => unwrapToken(chainId, token)) ?? [],
[chainId, data] [chainId, data]
) )
const filteredTokens = useFilteredTokens(mappedTokens) const tokenVolumeRank = useMemo(
() =>
unwrappedTokens
.sort((a, b) => {
if (!a.market?.volume || !b.market?.volume) return 0
return a.market.volume.value > b.market.volume.value ? -1 : 1
})
.reduce((acc, cur, i) => {
if (!cur.address) return acc
return {
...acc,
[cur.address]: i + 1,
}
}, {}),
[unwrappedTokens]
)
const filteredTokens = useFilteredTokens(unwrappedTokens)
const sortedTokens = useSortedTokens(filteredTokens) const sortedTokens = useSortedTokens(filteredTokens)
return useMemo(() => ({ tokens: sortedTokens, loadingTokens, sparklines }), [loadingTokens, sortedTokens, sparklines]) return useMemo(
() => ({ tokens: sortedTokens, tokenVolumeRank, loadingTokens, sparklines }),
[loadingTokens, tokenVolumeRank, sortedTokens, sparklines]
)
} }
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