import { Bank } from '@blockworks-foundation/mango-v4' import Change from '@components/shared/Change' import ChartRangeButtons from '@components/shared/ChartRangeButtons' import { ArrowSmallUpIcon, NoSymbolIcon } from '@heroicons/react/20/solid' import dayjs from 'dayjs' import relativeTime from 'dayjs/plugin/relativeTime' import { useCoingecko } from 'hooks/useCoingecko' import parse from 'html-react-parser' import { useTranslation } from 'next-i18next' import dynamic from 'next/dynamic' import { useLayoutEffect, useMemo, useRef, useState } from 'react' import { formatFixedDecimals } from 'utils/numbers' const PriceChart = dynamic(() => import('@components/token/PriceChart'), { ssr: false, }) dayjs.extend(relativeTime) const DEFAULT_COINGECKO_VALUES = { ath: 0, atl: 0, ath_change_percentage: 0, atl_change_percentage: 0, ath_date: 0, atl_date: 0, high_24h: 0, circulating_supply: 0, fully_diluted_valuation: 0, low_24h: 0, market_cap: 0, max_supply: 0, price_change_percentage_24h: 0, total_supply: 0, total_volume: 0, } const CoingeckoStats = ({ bank, coingeckoData, coingeckoId, }: { bank: Bank coingeckoData: any coingeckoId: string }) => { const { t } = useTranslation(['common', 'token']) const [showFullDesc, setShowFullDesc] = useState(false) const [daysToShow, setDaysToShow] = useState('1') const [chartData, setChartData] = useState<{ prices: any[] } | null>(null) const [loadChartData, setLoadChartData] = useState(true) const { isLoading: loadingPrices, data: coingeckoPrices } = useCoingecko() const descWidthRef = useRef(null) const [width, setWidth] = useState(0) useLayoutEffect(() => { if (!descWidthRef.current) return setWidth(descWidthRef.current.clientWidth) }, []) const handleDaysToShow = async (days: string) => { if (days !== '1') { try { const response = await fetch( `https://api.coingecko.com/api/v3/coins/${coingeckoId}/market_chart?vs_currency=usd&days=${days}` ) const data = await response.json() setLoadChartData(false) setChartData(data) } catch { setLoadChartData(false) } } setDaysToShow(days) } const { ath, atl, ath_change_percentage, atl_change_percentage, ath_date, atl_date, circulating_supply, fully_diluted_valuation, market_cap, max_supply, total_supply, total_volume, } = coingeckoData ? coingeckoData.market_data : DEFAULT_COINGECKO_VALUES const loadingChart = useMemo(() => { return daysToShow == '1' ? loadingPrices : loadChartData }, [loadChartData, loadingPrices]) const coingeckoTokenPrices = useMemo(() => { if (daysToShow === '1' && coingeckoPrices.length && bank) { const tokenPriceData = coingeckoPrices.find( (asset) => asset.symbol === bank.name ) if (tokenPriceData) { return tokenPriceData.prices } } else { if (chartData && !loadingChart) { return chartData.prices } } return [] }, [coingeckoPrices, bank, daysToShow, chartData, loadingChart]) return ( <>

About {bank.name}

{parse(coingeckoData.description.en)}

{width === 720 ? ( setShowFullDesc(!showFullDesc)} > {showFullDesc ? 'Less' : 'More'} ) : null}
{!loadingChart ? ( coingeckoTokenPrices.length ? ( <>

{bank.name} Price Chart

handleDaysToShow(v)} />
) : bank?.name === 'USDC' || bank?.name === 'USDT' ? null : (

{t('token:chart-unavailable')}

) ) : (
)}

{bank.name} Stats

{t('token:market-cap')}

{market_cap?.usd ? ( formatFixedDecimals(market_cap.usd, true) ) : ( {t('unavailable')} )}{' '} {coingeckoData.market_cap_rank ? `#${coingeckoData.market_cap_rank}` : ''}

{t('token:volume')}

{total_volume?.usd ? ( formatFixedDecimals(total_volume.usd, true) ) : ( {t('unavailable')} )}

{t('token:all-time-high')}

{ath?.usd ? ( formatFixedDecimals(ath.usd, true) ) : ( {t('unavailable')} )} {ath_change_percentage.usd ? ( ) : null}

{dayjs(ath_date.usd).format('MMM, D, YYYY')} ( {dayjs(ath_date.usd).fromNow()})

{t('token:all-time-low')}

{atl?.usd ? ( formatFixedDecimals(atl.usd, true) ) : ( {t('unavailable')} )}

{dayjs(atl_date.usd).format('MMM, D, YYYY')} ( {dayjs(atl_date.usd).fromNow()})

{fully_diluted_valuation.usd ? (

{t('token:fdv')}

{fully_diluted_valuation?.usd ? ( formatFixedDecimals(fully_diluted_valuation.usd, true) ) : ( {t('unavailable')} )}

) : null}

{t('token:circulating-supply')}

{circulating_supply ? ( formatFixedDecimals(circulating_supply) ) : ( {t('unavailable')} )}

{t('token:total-supply')}

{total_supply ? ( formatFixedDecimals(total_supply) ) : ( {t('unavailable')} )}

{max_supply ? (

{t('token:max-supply')}

{max_supply ? ( formatFixedDecimals(max_supply) ) : ( {t('unavailable')} )}

) : null}
) } export default CoingeckoStats