import { cn } from "~/lib/utils"; import { Globe, TrendingUp, TrendingDown } from "lucide-react"; export interface MarketToken { symbol: string; name: string; price: number; priceChange24h: number; marketCap?: number; volume24h?: number; } export interface MarketOverviewData { tokens: MarketToken[]; totalMarketCap?: number; totalVolume24h?: number; btcDominance?: number; fearGreedIndex?: number; } export interface MarketOverviewWidgetProps { /** Market overview data */ data: MarketOverviewData; /** Callback when token is clicked */ onTokenClick?: (token: MarketToken) => void; /** Additional class names */ className?: string; } const formatPrice = (price: number): string => { if (price < 1) return `$${price.toFixed(4)}`; return `$${price.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`; }; const formatLargeNumber = (num: number): string => { if (num >= 1e12) return `$${(num / 1e12).toFixed(2)}T`; if (num >= 1e9) return `$${(num / 1e9).toFixed(2)}B`; if (num >= 1e6) return `$${(num / 1e6).toFixed(2)}M`; return `$${num.toFixed(2)}`; }; const getFearGreedLabel = (index: number): string => { if (index > 75) return "Extreme Greed"; if (index > 50) return "Greed"; if (index > 25) return "Fear"; return "Extreme Fear"; }; /** * MarketOverviewWidget - Displays market overview inline in chat * Used when AI responds to "show market overview" or "how's the market?" */ export function MarketOverviewWidget({ data, onTokenClick, className, }: MarketOverviewWidgetProps) { return (
Total Market Cap
{formatLargeNumber(data.totalMarketCap)}
24h Volume
{formatLargeNumber(data.totalVolume24h)}
BTC Dominance
{data.btcDominance.toFixed(1)}%
Fear & Greed
50 ? "text-green-500" : "text-red-500" )}> {data.fearGreedIndex} - {getFearGreedLabel(data.fearGreedIndex)}
{token.symbol}
{token.name}
{formatPrice(token.price)}
= 0 ? "text-green-500" : "text-red-500"
)}>
{token.priceChange24h >= 0 ? (