Commit d794cef7 authored by lynn's avatar lynn Committed by GitHub

fix: more explore table fixes (#4806)

* testing

* remove dev dep

* fixed

* fixes

* add developer comments

* link to eth token page when eth clicked in search bar

* undo commit to wrong pr / branch smh

* fix ascending sorted tokens index
parent 19f175ba
...@@ -481,7 +481,6 @@ export const LoadedRow = forwardRef((props: LoadedRowProps, ref: ForwardedRef<HT ...@@ -481,7 +481,6 @@ export const LoadedRow = forwardRef((props: LoadedRowProps, ref: ForwardedRef<HT
const delta = token.market?.pricePercentChange?.value const delta = token.market?.pricePercentChange?.value
const arrow = getDeltaArrow(delta) const arrow = getDeltaArrow(delta)
const formattedDelta = formatDelta(delta) const formattedDelta = formatDelta(delta)
const sortAscending = useAtomValue(sortAscendingAtom)
const exploreTokenSelectedEventProperties = { const exploreTokenSelectedEventProperties = {
chain_id: filterNetwork, chain_id: filterNetwork,
...@@ -512,7 +511,7 @@ export const LoadedRow = forwardRef((props: LoadedRowProps, ref: ForwardedRef<HT ...@@ -512,7 +511,7 @@ export const LoadedRow = forwardRef((props: LoadedRowProps, ref: ForwardedRef<HT
<FavoriteIcon isFavorited={isFavorited} /> <FavoriteIcon isFavorited={isFavorited} />
</ClickFavorited> </ClickFavorited>
} }
listNumber={sortAscending ? tokenListLength - tokenListIndex : tokenListIndex + 1} listNumber={tokenListIndex + 1}
tokenInfo={ tokenInfo={
<ClickableName> <ClickableName>
<LogoContainer> <LogoContainer>
......
...@@ -58,8 +58,13 @@ function NoTokensState({ message }: { message: ReactNode }) { ...@@ -58,8 +58,13 @@ function NoTokensState({ message }: { message: ReactNode }) {
) )
} }
const LoadingMoreRows = Array(LOADING_ROWS_COUNT).fill(<LoadingRow />) const LoadingRows = (rowCount?: number) =>
const LoadingRows = (rowCount?: number) => Array(rowCount ?? PAGE_SIZE).fill(<LoadingRow />) Array(rowCount ?? PAGE_SIZE)
.fill(null)
.map((_, index) => {
return <LoadingRow key={index} />
})
const LoadingMoreRows = LoadingRows(LOADING_ROWS_COUNT)
export function LoadingTokenTable({ rowCount }: { rowCount?: number }) { export function LoadingTokenTable({ rowCount }: { rowCount?: number }) {
return ( return (
......
...@@ -8,7 +8,7 @@ import { ...@@ -8,7 +8,7 @@ import {
sortMethodAtom, sortMethodAtom,
} from 'components/Tokens/state' } from 'components/Tokens/state'
import { useAtomValue } from 'jotai/utils' import { useAtomValue } from 'jotai/utils'
import { useCallback, useEffect, useLayoutEffect, useMemo, useState } from 'react' import { useCallback, useEffect, useMemo, useState } from 'react'
import { fetchQuery, useRelayEnvironment } from 'react-relay' import { fetchQuery, useRelayEnvironment } from 'react-relay'
import { import {
...@@ -131,7 +131,7 @@ function toContractInput(token: PrefetchedTopToken) { ...@@ -131,7 +131,7 @@ function toContractInput(token: PrefetchedTopToken) {
// Map of key: ${HistoryDuration} and value: another Map, of key:${chain} + ${address} and value: TopToken object. // Map of key: ${HistoryDuration} and value: another Map, of key:${chain} + ${address} and value: TopToken object.
// Acts as a local cache. // Acts as a local cache.
const tokensWithPriceHistoryCache: Record<HistoryDuration, Record<string, TopToken>> = { let tokensWithPriceHistoryCache: Record<HistoryDuration, Record<string, TopToken>> = {
DAY: {}, DAY: {},
HOUR: {}, HOUR: {},
MAX: {}, MAX: {},
...@@ -140,6 +140,18 @@ const tokensWithPriceHistoryCache: Record<HistoryDuration, Record<string, TopTok ...@@ -140,6 +140,18 @@ const tokensWithPriceHistoryCache: Record<HistoryDuration, Record<string, TopTok
YEAR: {}, YEAR: {},
'%future added value': {}, '%future added value': {},
} }
let cachedChain: Chain | undefined
const resetTokensWithPriceHistoryCache = () => {
tokensWithPriceHistoryCache = {
DAY: {},
HOUR: {},
MAX: {},
MONTH: {},
WEEK: {},
YEAR: {},
'%future added value': {},
}
}
const checkIfAllTokensCached = (duration: HistoryDuration, tokens: PrefetchedTopToken[]) => { const checkIfAllTokensCached = (duration: HistoryDuration, tokens: PrefetchedTopToken[]) => {
let everyTokenInCache = true let everyTokenInCache = true
...@@ -174,11 +186,19 @@ export function useTopTokens(chain: Chain): UseTopTokensReturnValue { ...@@ -174,11 +186,19 @@ export function useTopTokens(chain: Chain): UseTopTokensReturnValue {
const [loadingTokensWithoutPriceHistory, setLoadingTokensWithoutPriceHistory] = useState(true) const [loadingTokensWithoutPriceHistory, setLoadingTokensWithoutPriceHistory] = useState(true)
const [loadingTokensWithPriceHistory, setLoadingTokensWithPriceHistory] = useState(true) const [loadingTokensWithPriceHistory, setLoadingTokensWithPriceHistory] = useState(true)
const [tokens, setTokens] = useState<TopToken[]>() const [tokens, setTokens] = useState<TopToken[]>()
const [prefetchedData, setPrefetchedData] = useState<PrefetchedTopToken[]>()
if (chain !== cachedChain) {
cachedChain = chain
resetTokensWithPriceHistoryCache()
}
const [page, setPage] = useState(0) const [page, setPage] = useState(0)
const [error, setError] = useState<Error | undefined>() const [error, setError] = useState<Error | undefined>()
const [prefetchedData, setPrefetchedData] = useState<PrefetchedTopToken[]>() const [prefetchedDataDuration, setPrefetchedDataDuration] = useState<HistoryDuration>()
const prefetchedSelectedTokensWithoutPriceHistory = useFilteredTokens(useSortedTokens(prefetchedData)) const prefetchedSelectedTokensWithoutPriceHistory = useFilteredTokens(useSortedTokens(prefetchedData))
const loading = Boolean(loadingTokensWithPriceHistory || loadingTokensWithoutPriceHistory) const { everyTokenInCache, cachedTokens } = useMemo(
() => checkIfAllTokensCached(duration, prefetchedSelectedTokensWithoutPriceHistory),
[duration, prefetchedSelectedTokensWithoutPriceHistory]
)
// loadingRowCount defaults to PAGE_SIZE when no prefetchedData is available yet because the initial load // loadingRowCount defaults to PAGE_SIZE when no prefetchedData is available yet because the initial load
// count will always be PAGE_SIZE. // count will always be PAGE_SIZE.
const loadingRowCount = useMemo( const loadingRowCount = useMemo(
...@@ -191,6 +211,7 @@ export function useTopTokens(chain: Chain): UseTopTokensReturnValue { ...@@ -191,6 +211,7 @@ export function useTopTokens(chain: Chain): UseTopTokensReturnValue {
const loadTokensWithoutPriceHistory = useCallback( const loadTokensWithoutPriceHistory = useCallback(
({ duration, chain }: { duration: HistoryDuration; chain: Chain }) => { ({ duration, chain }: { duration: HistoryDuration; chain: Chain }) => {
setTokens([])
fetchQuery<TopTokens100Query>( fetchQuery<TopTokens100Query>(
environment, environment,
topTokens100Query, topTokens100Query,
...@@ -201,7 +222,11 @@ export function useTopTokens(chain: Chain): UseTopTokensReturnValue { ...@@ -201,7 +222,11 @@ export function useTopTokens(chain: Chain): UseTopTokensReturnValue {
if (data?.topTokens) setPrefetchedData([...data?.topTokens]) if (data?.topTokens) setPrefetchedData([...data?.topTokens])
}, },
error: setError, error: setError,
complete: () => setLoadingTokensWithoutPriceHistory(false), complete: () => {
setLoadingTokensWithoutPriceHistory(false)
setPrefetchedDataDuration(duration)
setLoadingTokensWithPriceHistory(true)
},
}) })
}, },
[environment] [environment]
...@@ -253,22 +278,32 @@ export function useTopTokens(chain: Chain): UseTopTokensReturnValue { ...@@ -253,22 +278,32 @@ export function useTopTokens(chain: Chain): UseTopTokensReturnValue {
loadTokensWithPriceHistory({ contracts, appendingTokens: true, page, tokens }) loadTokensWithPriceHistory({ contracts, appendingTokens: true, page, tokens })
}, [prefetchedSelectedTokensWithoutPriceHistory, page, loadTokensWithPriceHistory, tokens]) }, [prefetchedSelectedTokensWithoutPriceHistory, page, loadTokensWithPriceHistory, tokens])
// Reset count when filters are changed // Load tokens from cache when everything is available.
useLayoutEffect(() => { useEffect(() => {
const { everyTokenInCache, cachedTokens } = checkIfAllTokensCached(
duration,
prefetchedSelectedTokensWithoutPriceHistory
)
if (everyTokenInCache) { if (everyTokenInCache) {
setTokens(cachedTokens) setTokens(cachedTokens)
setLoadingTokensWithPriceHistory(false) setLoadingTokensWithPriceHistory(false)
} else { }
}, [everyTokenInCache, cachedTokens])
// Load new token with price history data when prefetchedSelectedTokensWithoutPriceHistory for current
// duration has already been resolved.
useEffect(() => {
if (!everyTokenInCache) {
setLoadingTokensWithPriceHistory(true) setLoadingTokensWithPriceHistory(true)
setTokens([]) setTokens([])
const contracts = prefetchedSelectedTokensWithoutPriceHistory.slice(0, PAGE_SIZE).map(toContractInput) if (duration === prefetchedDataDuration) {
loadTokensWithPriceHistory({ contracts, appendingTokens: false, page: 0 }) const contracts = prefetchedSelectedTokensWithoutPriceHistory.slice(0, PAGE_SIZE).map(toContractInput)
loadTokensWithPriceHistory({ contracts, appendingTokens: false, page: 0 })
}
} }
}, [loadTokensWithPriceHistory, prefetchedSelectedTokensWithoutPriceHistory, duration]) }, [
everyTokenInCache,
prefetchedSelectedTokensWithoutPriceHistory,
loadTokensWithPriceHistory,
duration,
prefetchedDataDuration,
])
// Trigger fetching top 100 tokens without price history on first load, and on // Trigger fetching top 100 tokens without price history on first load, and on
// each change of chain or duration. // each change of chain or duration.
...@@ -279,7 +314,7 @@ export function useTopTokens(chain: Chain): UseTopTokensReturnValue { ...@@ -279,7 +314,7 @@ export function useTopTokens(chain: Chain): UseTopTokensReturnValue {
return { return {
error, error,
loading, loading: loadingTokensWithPriceHistory || loadingTokensWithoutPriceHistory,
tokens, tokens,
hasMore, hasMore,
loadMoreTokens, loadMoreTokens,
......
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