import { ClipboardDocumentIcon } from "@heroicons/react/24/outline"; import { useQuery } from "@tanstack/react-query"; import { type GetCoinResponse, getCoin } from "@zoralabs/coins-sdk"; import { useMemo, useState } from "react"; import type { Address } from "viem"; import { base } from "viem/chains"; import Loader from "@/components/Shared/Loader"; import { Button, Image, Modal } from "@/components/Shared/UI"; import cn from "@/helpers/cn"; import humanize from "@/helpers/humanize"; import useCopyToClipboard from "@/hooks/useCopyToClipboard"; import Trade from "./Trade"; interface CreatorCoinDetailsProps { address: Address; } const CreatorCoinDetails = ({ address }: CreatorCoinDetailsProps) => { const { data: coin } = useQuery({ enabled: !!address, queryFn: async () => { const coin = await getCoin({ address, chain: base.id }); return coin.data?.zora20Token ?? null; }, queryKey: ["coin", address], refetchInterval: 5000 }); const [showTrade, setShowTrade] = useState(false); const marketCap = useMemo(() => Number(coin?.marketCap ?? 0), [coin]); const delta24h = useMemo(() => Number(coin?.marketCapDelta24h ?? 0), [coin]); const changePct = useMemo(() => { const prev = marketCap - delta24h; if (!prev || !Number.isFinite(prev) || prev === 0) return 0; return (delta24h / prev) * 100; }, [marketCap, delta24h]); const holders = coin?.uniqueHolders ?? 0; const volume24h = Number(coin?.volume24h ?? 0); const copyAddress = useCopyToClipboard(coin?.address ?? "", "Address copied"); if (!coin) { return ; } return (
${coin.symbol}
${humanize(Math.round(marketCap))}
= 0 ? "text-emerald-600 dark:text-emerald-400" : "text-red-600 dark:text-red-400" )} > {changePct >= 0 ? "▲" : "▼"} {`${changePct >= 0 ? "" : "-"}${Math.abs(changePct).toFixed(2)}%`}
{coin.name}
Holders
{humanize(holders)}
24h volume
${humanize(Math.round(volume24h))}
setShowTrade(false)} show={showTrade} title={`Trade $${coin.name}`} > setShowTrade(false)} />
); }; export default CreatorCoinDetails;