import { useTranslation } from "react-i18next"; import { AreaChart, Area, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, Legend, } from "recharts"; import { useUsageTrends } from "@/lib/query/usage"; import { Loader2 } from "lucide-react"; interface UsageTrendChartProps { days: number; } export function UsageTrendChart({ days }: UsageTrendChartProps) { const { t } = useTranslation(); const { data: trends, isLoading } = useUsageTrends(days); if (isLoading) { return (
); } const isToday = days === 1; const chartData = trends?.map((stat) => { const pointDate = new Date(stat.date); return { rawDate: stat.date, label: isToday ? pointDate.toLocaleTimeString("zh-CN", { hour: "2-digit" }) : pointDate.toLocaleDateString("zh-CN", { month: "2-digit", day: "2-digit", }), hour: pointDate.getHours(), inputTokens: stat.totalInputTokens, outputTokens: stat.totalOutputTokens, cost: parseFloat(stat.totalCost), }; }) || []; const hourlyData = (() => { if (!isToday) return chartData; const map = new Map(); chartData.forEach((point) => { map.set(point.hour ?? 0, point); }); return Array.from({ length: 24 }, (_, hour) => { const bucket = map.get(hour); return { label: `${hour.toString().padStart(2, "0")}:00`, inputTokens: bucket?.inputTokens ?? 0, outputTokens: bucket?.outputTokens ?? 0, cost: bucket?.cost ?? 0, }; }); })(); const displayData = isToday ? hourlyData : chartData; const CustomTooltip = ({ active, payload, label }: any) => { if (active && payload && payload.length) { return (

{label}

{payload.map((entry: any, index: number) => (
{entry.name}: {entry.name.includes(t("usage.cost", "成本")) ? `$${typeof entry.value === "number" ? entry.value.toFixed(6) : entry.value}` : entry.value.toLocaleString()}
))}
); } return null; }; return (

{t("usage.trends", "使用趋势")}

{isToday ? t("usage.rangeToday", "今天 (按小时)") : days === 7 ? t("usage.rangeLast7Days", "过去 7 天") : t("usage.rangeLast30Days", "过去 30 天")}

`${(value / 1000).toFixed(0)}k`} /> `$${value}`} /> } />
); }