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 (
{/* Header */}
Market Overview
{/* Global Stats */} {(data.totalMarketCap || data.btcDominance || data.fearGreedIndex) && (
{data.totalMarketCap && (

Total Market Cap

{formatLargeNumber(data.totalMarketCap)}

)} {data.totalVolume24h && (

24h Volume

{formatLargeNumber(data.totalVolume24h)}

)} {data.btcDominance && (

BTC Dominance

{data.btcDominance.toFixed(1)}%

)} {data.fearGreedIndex && (
50 ? "bg-green-500/10" : "bg-red-500/10" )}>

Fear & Greed

50 ? "text-green-500" : "text-red-500" )}> {data.fearGreedIndex} - {getFearGreedLabel(data.fearGreedIndex)}

)}
)} {/* Token Prices */}
{data.tokens.map((token) => (
onTokenClick?.(token)} >

{token.symbol}

{token.name}

{formatPrice(token.price)}

= 0 ? "text-green-500" : "text-red-500" )}> {token.priceChange24h >= 0 ? ( ) : ( )} {token.priceChange24h >= 0 ? "+" : ""}{token.priceChange24h.toFixed(2)}%

))}
); }