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

feat(token-details): link between native:wrapped assets in the balance summary (#4817)

* feat(token-details): link between native:wrapped assets in the balance summary

* update pageChainName access method
parent 22b26de7
...@@ -2,8 +2,11 @@ import { Trans } from '@lingui/macro' ...@@ -2,8 +2,11 @@ import { Trans } from '@lingui/macro'
import { Currency, CurrencyAmount, Token } from '@uniswap/sdk-core' import { Currency, CurrencyAmount, Token } from '@uniswap/sdk-core'
import { formatToDecimal } from 'analytics/utils' import { formatToDecimal } from 'analytics/utils'
import CurrencyLogo from 'components/CurrencyLogo' import CurrencyLogo from 'components/CurrencyLogo'
import { validateUrlChainParam } from 'graphql/data/util'
import { useStablecoinValue } from 'hooks/useStablecoinPrice' import { useStablecoinValue } from 'hooks/useStablecoinPrice'
import { useParams } from 'react-router-dom'
import styled from 'styled-components/macro' import styled from 'styled-components/macro'
import { StyledInternalLink } from 'theme'
import { formatDollarAmount } from 'utils/formatDollarAmt' import { formatDollarAmount } from 'utils/formatDollarAmt'
const BalancesCard = styled.div` const BalancesCard = styled.div`
...@@ -43,6 +46,32 @@ const TotalBalanceItem = styled.div` ...@@ -43,6 +46,32 @@ const TotalBalanceItem = styled.div`
display: flex; display: flex;
` `
const BalanceRowLink = styled(StyledInternalLink)`
color: unset;
`
function BalanceRow({ currency, formattedBalance, formattedUSDValue, href }: BalanceRowData) {
const content = (
<TotalBalance key={currency.wrapped.address}>
<TotalBalanceItem>
<CurrencyLogo currency={currency} />
&nbsp;{formattedBalance} {currency?.symbol}
</TotalBalanceItem>
<TotalBalanceItem>{formatDollarAmount(formattedUSDValue === 0 ? undefined : formattedUSDValue)}</TotalBalanceItem>
</TotalBalance>
)
if (href) {
return <BalanceRowLink to={href}>{content}</BalanceRowLink>
}
return content
}
interface BalanceRowData {
currency: Currency
formattedBalance: number
formattedUSDValue: number | undefined
href?: string
}
export interface BalanceSummaryProps { export interface BalanceSummaryProps {
tokenAmount: CurrencyAmount<Token> | undefined tokenAmount: CurrencyAmount<Token> | undefined
nativeCurrencyAmount: CurrencyAmount<Currency> | undefined nativeCurrencyAmount: CurrencyAmount<Currency> | undefined
...@@ -53,6 +82,9 @@ export default function BalanceSummary({ tokenAmount, nativeCurrencyAmount, isNa ...@@ -53,6 +82,9 @@ export default function BalanceSummary({ tokenAmount, nativeCurrencyAmount, isNa
const balanceUsdValue = useStablecoinValue(tokenAmount)?.toFixed(2) const balanceUsdValue = useStablecoinValue(tokenAmount)?.toFixed(2)
const nativeBalanceUsdValue = useStablecoinValue(nativeCurrencyAmount)?.toFixed(2) const nativeBalanceUsdValue = useStablecoinValue(nativeCurrencyAmount)?.toFixed(2)
const { chainName } = useParams<{ chainName?: string }>()
const pageChainName = validateUrlChainParam(chainName).toLowerCase()
const tokenIsWrappedNative = const tokenIsWrappedNative =
tokenAmount && tokenAmount &&
nativeCurrencyAmount && nativeCurrencyAmount &&
...@@ -70,14 +102,18 @@ export default function BalanceSummary({ tokenAmount, nativeCurrencyAmount, isNa ...@@ -70,14 +102,18 @@ export default function BalanceSummary({ tokenAmount, nativeCurrencyAmount, isNa
const currencies = [] const currencies = []
if (tokenAmount) { if (tokenAmount) {
currencies.push({ const tokenData: BalanceRowData = {
currency: tokenAmount.currency, currency: tokenAmount.currency,
formattedBalance: formatToDecimal(tokenAmount, Math.min(tokenAmount.currency.decimals, 2)), formattedBalance: formatToDecimal(tokenAmount, Math.min(tokenAmount.currency.decimals, 2)),
formattedUSDValue: balanceUsdValue ? parseFloat(balanceUsdValue) : undefined, formattedUSDValue: balanceUsdValue ? parseFloat(balanceUsdValue) : undefined,
}) }
if (isNative) {
tokenData.href = `/tokens/${pageChainName}/${tokenAmount.currency.address}`
}
currencies.push(tokenData)
} }
if (showNative && nativeCurrencyAmount) { if (showNative && nativeCurrencyAmount) {
const nativeData = { const nativeData: BalanceRowData = {
currency: nativeCurrencyAmount.currency, currency: nativeCurrencyAmount.currency,
formattedBalance: formatToDecimal(nativeCurrencyAmount, Math.min(nativeCurrencyAmount.currency.decimals, 2)), formattedBalance: formatToDecimal(nativeCurrencyAmount, Math.min(nativeCurrencyAmount.currency.decimals, 2)),
formattedUSDValue: nativeBalanceUsdValue ? parseFloat(nativeBalanceUsdValue) : undefined, formattedUSDValue: nativeBalanceUsdValue ? parseFloat(nativeBalanceUsdValue) : undefined,
...@@ -85,6 +121,7 @@ export default function BalanceSummary({ tokenAmount, nativeCurrencyAmount, isNa ...@@ -85,6 +121,7 @@ export default function BalanceSummary({ tokenAmount, nativeCurrencyAmount, isNa
if (isNative) { if (isNative) {
currencies.unshift(nativeData) currencies.unshift(nativeData)
} else { } else {
nativeData.href = `/tokens/${pageChainName}/NATIVE`
currencies.push(nativeData) currencies.push(nativeData)
} }
} }
...@@ -93,16 +130,8 @@ export default function BalanceSummary({ tokenAmount, nativeCurrencyAmount, isNa ...@@ -93,16 +130,8 @@ export default function BalanceSummary({ tokenAmount, nativeCurrencyAmount, isNa
<BalancesCard> <BalancesCard>
<TotalBalanceSection> <TotalBalanceSection>
<Trans>Your balance</Trans> <Trans>Your balance</Trans>
{currencies.map(({ currency, formattedBalance, formattedUSDValue }) => ( {currencies.map((props) => (
<TotalBalance key={currency.wrapped.address}> <BalanceRow {...props} key={props.currency.wrapped.address} />
<TotalBalanceItem>
<CurrencyLogo currency={currency} />
&nbsp;{formattedBalance} {currency?.symbol}
</TotalBalanceItem>
<TotalBalanceItem>
{formatDollarAmount(formattedUSDValue === 0 ? undefined : formattedUSDValue)}
</TotalBalanceItem>
</TotalBalance>
))} ))}
</TotalBalanceSection> </TotalBalanceSection>
</BalancesCard> </BalancesCard>
......
...@@ -84,7 +84,7 @@ export default function TokenDetails() { ...@@ -84,7 +84,7 @@ export default function TokenDetails() {
const { tokenAddress: tokenAddressParam, chainName } = useParams<{ tokenAddress?: string; chainName?: string }>() const { tokenAddress: tokenAddressParam, chainName } = useParams<{ tokenAddress?: string; chainName?: string }>()
const { account } = useWeb3React() const { account } = useWeb3React()
const currentChainName = validateUrlChainParam(chainName) const currentChainName = validateUrlChainParam(chainName)
const pageChainId = CHAIN_NAME_TO_CHAIN_ID[validateUrlChainParam(chainName)] const pageChainId = CHAIN_NAME_TO_CHAIN_ID[currentChainName]
const nativeCurrency = nativeOnChain(pageChainId) const nativeCurrency = nativeOnChain(pageChainId)
const timePeriod = useAtomValue(filterTimeAtom) const timePeriod = useAtomValue(filterTimeAtom)
const isNative = tokenAddressParam === 'NATIVE' const isNative = tokenAddressParam === 'NATIVE'
......
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