import _ from 'lodash' import { memo, useRef } from 'react' import Image from 'next/image' import { type Token, type ActionTypes } from '@/utils/types' import { usePortfolioBalances } from '@/slices/portfolio/hooks' import { useBridgeState } from '@/slices/bridge/hooks' import { CHAINS_BY_ID, isActiveChainId } from '@/constants/chains' import { findChainIdsWithPausedToken } from '@/constants/tokens' import { getActiveStyleForButton, getHoverStyleForButton } from '@/styles/hover' import { joinClassNames } from '@/utils/joinClassNames' import { useSwapState } from '@/slices/swap/hooks' import { formatAmount } from '@/utils/formatAmount' import { getParsedBalance } from '@/utils/getParsedBalance' export const SelectSpecificTokenButton = ({ showAllChains, isOrigin, token, onClick, action, isSelected, isActive, }: { showAllChains?: boolean isOrigin: boolean token: Token onClick: () => void action: ActionTypes isSelected: boolean isActive: boolean }) => { const ref = useRef(null) const { fromChainId, toChainId } = useBridgeState() const { swapChainId } = useSwapState() const buttonClasses = { other: 'whitespace-nowrap', grid: 'grid gap-0.5', space: 'pl-2 pr-1.5 py-2.5 w-full', border: 'border border-transparent', transition: 'transition-all duration-75', hover: getHoverStyleForButton(token?.color), activeStyle: isActive || isSelected ? getActiveStyleForButton(token?.color) : '', } const chainId = action === 'Swap' ? swapChainId : isOrigin ? fromChainId : toChainId return ( ) } const ButtonContent = memo( ({ token, chainId, isOrigin, showAllChains, action, }: { token: Token chainId: number isOrigin: boolean showAllChains: boolean action: ActionTypes }) => { const portfolioBalances = usePortfolioBalances() const tokenData = portfolioBalances[chainId]?.find( (tb) => tb.token.addresses[chainId] === token.addresses[chainId] ) const decimals = tokenData?.token?.decimals[chainId] const balance = tokenData?.balance const parsedBalance = getParsedBalance(balance, decimals) const formattedBalance = formatAmount(parsedBalance) return (
) } ) const Coin = ({ token, showAllChains, isOrigin, parsedBalance, }: { token showAllChains: boolean isOrigin: boolean parsedBalance: string | undefined }) => { return (
Token Image
{token?.symbol}
{!showAllChains && isOrigin && ( )} {showAllChains && }
) } const TokenBalance = ({ parsedBalance }: { parsedBalance?: string }) => { return (
{parsedBalance && parsedBalance !== '0.0' &&
{parsedBalance}
}
) } const AvailableChains = ({ token }: { token: Token }) => { const pausedChainIds = findChainIdsWithPausedToken(token.routeSymbol) const chainIds = _.difference( Object.keys(token.addresses).filter(isActiveChainId), pausedChainIds ) const hasOneChain = chainIds.length > 0 const hasMultipleChains = chainIds.length > 1 const numOverTwoChains = chainIds.length - 2 > 0 ? chainIds.length - 2 : 0 return (
{hasOneChain && ( {`${CHAINS_BY_ID[chainIds[0]].name} )} {hasMultipleChains && ( {`${CHAINS_BY_ID[chainIds[1]].name} )} {numOverTwoChains > 0 && (
+ {numOverTwoChains}
)}
) }