Commit 740db0fe authored by eddie's avatar eddie Committed by GitHub

fix: merge portfolio tokens w/ default token list in Currency Selector (#7479)

parent ed6afb50
// eslint-disable-next-line no-restricted-imports // eslint-disable-next-line no-restricted-imports
import { t, Trans } from '@lingui/macro' import { t, Trans } from '@lingui/macro'
import { InterfaceEventName, InterfaceModalName } from '@uniswap/analytics-events' import { InterfaceEventName, InterfaceModalName } from '@uniswap/analytics-events'
import { Currency, Token } from '@uniswap/sdk-core' import { ChainId, Currency, Token } from '@uniswap/sdk-core'
import { useWeb3React } from '@web3-react/core' import { useWeb3React } from '@web3-react/core'
import { Trace } from 'analytics' import { Trace } from 'analytics'
import { useCachedPortfolioBalancesQuery } from 'components/PrefetchBalancesWrapper/PrefetchBalancesWrapper' import { useCachedPortfolioBalancesQuery } from 'components/PrefetchBalancesWrapper/PrefetchBalancesWrapper'
...@@ -76,9 +76,6 @@ export function CurrencySearch({ ...@@ -76,9 +76,6 @@ export function CurrencySearch({
const searchTokenIsAdded = useIsUserAddedToken(searchToken) const searchTokenIsAdded = useIsUserAddedToken(searchToken)
const defaultTokens = useDefaultActiveTokens(chainId) const defaultTokens = useDefaultActiveTokens(chainId)
const filteredTokens: Token[] = useMemo(() => {
return Object.values(defaultTokens).filter(getTokenFilter(debouncedQuery))
}, [defaultTokens, debouncedQuery])
const { data, loading: balancesAreLoading } = useCachedPortfolioBalancesQuery({ account }) const { data, loading: balancesAreLoading } = useCachedPortfolioBalancesQuery({ account })
const balances: TokenBalances = useMemo(() => { const balances: TokenBalances = useMemo(() => {
...@@ -100,34 +97,57 @@ export function CurrencySearch({ ...@@ -100,34 +97,57 @@ export function CurrencySearch({
) )
}, [chainId, data?.portfolios]) }, [chainId, data?.portfolios])
const sortedTokens: Token[] = useMemo( const sortedTokens: Token[] = useMemo(() => {
() => const portfolioTokens = data?.portfolios?.[0].tokenBalances
!balancesAreLoading ?.map((tokenBalance) => {
? filteredTokens if (!tokenBalance?.token?.chain || !tokenBalance.token?.address || !tokenBalance.token?.decimals) {
.filter((token) => { return undefined
if (onlyShowCurrenciesWithBalance) { }
return balances[token.address?.toLowerCase()]?.usdValue > 0 return new Token(
} supportedChainIdFromGQLChain(tokenBalance.token?.chain) ?? ChainId.MAINNET,
tokenBalance.token?.address,
tokenBalance.token?.decimals,
tokenBalance.token?.symbol,
tokenBalance.token?.name
)
})
.filter((token) => !!token) as Token[]
const filteredTokens = Object.values(defaultTokens)
.filter(getTokenFilter(debouncedQuery))
// Filter out tokens with balances so they aren't duplicated when we merge below.
.filter((token) => !(token.address?.toLowerCase() in balances))
const mergedTokens = [...(portfolioTokens ?? []), ...filteredTokens]
if (balancesAreLoading) {
return mergedTokens
}
return mergedTokens
.filter((token) => {
if (onlyShowCurrenciesWithBalance) {
return balances[token.address?.toLowerCase()]?.usdValue > 0
}
// If there is no query, filter out unselected user-added tokens with no balance.
if (!debouncedQuery && token instanceof UserAddedToken) {
if (selectedCurrency?.equals(token) || otherSelectedCurrency?.equals(token)) return true
return balances[token.address.toLowerCase()]?.usdValue > 0
}
return true
})
.sort(tokenComparator.bind(null, balances))
}, [
data,
defaultTokens,
debouncedQuery,
balancesAreLoading,
balances,
onlyShowCurrenciesWithBalance,
selectedCurrency,
otherSelectedCurrency,
])
// If there is no query, filter out unselected user-added tokens with no balance.
if (!debouncedQuery && token instanceof UserAddedToken) {
if (selectedCurrency?.equals(token) || otherSelectedCurrency?.equals(token)) return true
return balances[token.address.toLowerCase()]?.usdValue > 0
}
return true
})
.sort(tokenComparator.bind(null, balances))
: filteredTokens,
[
balancesAreLoading,
filteredTokens,
balances,
onlyShowCurrenciesWithBalance,
debouncedQuery,
selectedCurrency,
otherSelectedCurrency,
]
)
const isLoading = Boolean(balancesAreLoading && !tokenLoaderTimerElapsed) const isLoading = Boolean(balancesAreLoading && !tokenLoaderTimerElapsed)
const filteredSortedTokens = useSortTokensByQuery(debouncedQuery, sortedTokens) const filteredSortedTokens = useSortTokensByQuery(debouncedQuery, sortedTokens)
...@@ -205,7 +225,7 @@ export function CurrencySearch({ ...@@ -205,7 +225,7 @@ export function CurrencySearch({
// if no results on main list, show option to expand into inactive // if no results on main list, show option to expand into inactive
const filteredInactiveTokens = useSearchInactiveTokenLists( const filteredInactiveTokens = useSearchInactiveTokenLists(
!onlyShowCurrenciesWithBalance && (filteredTokens.length === 0 || (debouncedQuery.length > 2 && !isAddressSearch)) !onlyShowCurrenciesWithBalance && (sortedTokens.length === 0 || (debouncedQuery.length > 2 && !isAddressSearch))
? debouncedQuery ? debouncedQuery
: undefined : undefined
) )
......
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