import { Currency, CurrencyAmount, currencyEquals, DEV, Token } from 'moonbeamswap' import React, { CSSProperties, MutableRefObject, useCallback, useMemo } from 'react' import { FixedSizeList } from 'react-window' import { Text } from 'rebass' import styled from 'styled-components' import { useActiveWeb3React } from '../../hooks' import { useSelectedTokenList, WrappedTokenInfo } from '../../state/lists/hooks' import { useAddUserToken, useRemoveUserAddedToken } from '../../state/user/hooks' import { useCurrencyBalance } from '../../state/wallet/hooks' import { LinkStyledButton, TYPE } from '../../theme' import { useIsUserAddedToken } from '../../hooks/Tokens' import Column from '../Column' import { RowFixed } from '../Row' import CurrencyLogo from '../CurrencyLogo' import { MouseoverTooltip } from '../Tooltip' import { FadedSpan, MenuItem } from './styleds' import Loader from '../Loader' import { isTokenOnList } from '../../utils' function currencyKey(currency: Currency): string { return currency instanceof Token ? currency.address : currency === DEV ? 'DEV' : '' } const StyledBalanceText = styled(Text)` white-space: nowrap; overflow: hidden; max-width: 5rem; text-overflow: ellipsis; ` const Tag = styled.div` background-color: ${({ theme }) => theme.bg3}; color: ${({ theme }) => theme.text2}; font-size: 14px; border-radius: 4px; padding: 0.25rem 0.3rem 0.25rem 0.3rem; max-width: 6rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; justify-self: flex-end; margin-right: 4px; ` function Balance({ balance }: { balance: CurrencyAmount }) { return {balance.toSignificant(4)} } const TagContainer = styled.div` display: flex; justify-content: flex-end; ` function TokenTags({ currency }: { currency: Currency }) { if (!(currency instanceof WrappedTokenInfo)) { return } const tags = currency.tags if (!tags || tags.length === 0) return const tag = tags[0] return ( {tag.name} {tags.length > 1 ? ( `${name}: ${description}`) .join('; \n')} > ... ) : null} ) } function CurrencyRow({ currency, onSelect, isSelected, otherSelected, style }: { currency: Currency onSelect: () => void isSelected: boolean otherSelected: boolean style: CSSProperties }) { const { account, chainId } = useActiveWeb3React() const key = currencyKey(currency) const selectedTokenList = useSelectedTokenList() const isOnSelectedList = isTokenOnList(selectedTokenList, currency) const customAdded = useIsUserAddedToken(currency) const balance = useCurrencyBalance(account ?? undefined, currency) const removeToken = useRemoveUserAddedToken() const addToken = useAddUserToken() // only show add or remove buttons if not on selected list return ( (isSelected ? null : onSelect())} disabled={isSelected} selected={otherSelected} > {currency.symbol} {!isOnSelectedList && customAdded ? ( Added by user { event.stopPropagation() if (chainId && currency instanceof Token) removeToken(chainId, currency.address) }} > (Remove) ) : null} {!isOnSelectedList && !customAdded ? ( Found by address { event.stopPropagation() if (currency instanceof Token) addToken(currency) }} > (Add) ) : null} {balance ? : account ? : null} ) } export default function CurrencyList({ height, currencies, selectedCurrency, onCurrencySelect, otherCurrency, fixedListRef, showETH }: { height: number currencies: Currency[] selectedCurrency?: Currency | null onCurrencySelect: (currency: Currency) => void otherCurrency?: Currency | null fixedListRef?: MutableRefObject showETH: boolean }) { const itemData = useMemo(() => (showETH ? [Currency.DEV, ...currencies] : currencies), [currencies, showETH]) const Row = useCallback( ({ data, index, style }) => { const currency: Currency = data[index] const isSelected = Boolean(selectedCurrency && currencyEquals(selectedCurrency, currency)) const otherSelected = Boolean(otherCurrency && currencyEquals(otherCurrency, currency)) const handleSelect = () => onCurrencySelect(currency) return ( ) }, [onCurrencySelect, otherCurrency, selectedCurrency] ) const itemKey = useCallback((index: number, data: any) => currencyKey(data[index]), []) return ( {Row} ) }