"use client"; import { memo } from "react"; import { Tooltip, TooltipContent, TooltipTrigger } from "@kandev/ui/tooltip"; import { cn } from "@/lib/utils"; import { useSessionContextWindow } from "@/hooks/domains/session/use-session-context-window"; type TokenUsageDisplayProps = { sessionId: string | null; className?: string; }; function formatNumber(num: number): string { if (num >= 1_000_000) { return `${(num / 1_000_000).toFixed(1)}M`; } if (num >= 1_000) { return `${(num / 1_000).toFixed(1)}K`; } return num.toLocaleString(); } function getCircleColor(efficiency: number): string { if (efficiency >= 90) return "text-yellow-500"; if (efficiency >= 75) return "text-yellow-300"; if (efficiency >= 50) return "text-blue-500"; return "text-blue-300"; } export const TokenUsageDisplay = memo(function TokenUsageDisplay({ sessionId, className, }: TokenUsageDisplayProps) { const contextWindow = useSessionContextWindow(sessionId); if (!contextWindow || contextWindow.size === 0) return null; const { size, used, efficiency } = contextWindow; const usagePercent = Math.min(efficiency, 100); const progress = usagePercent / 100; // SVG circle parameters const radius = 10; const strokeWidth = 2.5; const circumference = 2 * Math.PI * radius; const strokeDashoffset = circumference * (1 - progress); return (
{efficiency.toFixed(0)}% ({formatNumber(used)} / {formatNumber(size)})
); });