import { useState } from "react"; import { AreaChart, Area, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, Legend, } from "recharts"; import { useQuery } from "@tanstack/react-query"; import { trpc } from "@/utils/trpc"; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@pram/ui/components/card"; import { Tabs, TabsList, TabsTrigger, } from "@pram/ui/components/tabs"; import { MaterialIcon } from "@/components/ui/MaterialIcon"; type Period = "daily" | "weekly" | "monthly"; interface ChartDataPoint { date: string; label: string; totalTokens: number; jobCount: number; } function formatTokenValue(value: number): string { if (value >= 1_000_000) return `${(value / 1_000_000).toFixed(1)}M`; if (value >= 1_000) return `${(value / 1_000).toFixed(1)}K`; return value.toString(); } export function TokenUsageChart() { const [period, setPeriod] = useState("daily"); const { data, isLoading } = useQuery( trpc.ai.tokenUsageHistory.queryOptions({ period }), ); const chartData: ChartDataPoint[] = (data ?? []).map((d) => ({ date: d.date, label: d.label, totalTokens: d.totalTokens, jobCount: d.jobCount, })); const hasData = chartData.some((d) => d.totalTokens > 0 || d.jobCount > 0); return (
Tren Penggunaan Token {period === "daily" && "7 hari terakhir"} {period === "weekly" && "4 minggu terakhir"} {period === "monthly" && "6 bulan terakhir"}
setPeriod((v as Period) ?? "daily")} > Harian Mingguan Bulanan
{isLoading ? (
) : !hasData ? (

Belum ada data penggunaan

Generate soal untuk melihat statistik penggunaan token.

) : ( { const num = typeof value === "number" ? value : 0; const n = typeof name === "string" ? name : ""; if (n === "totalTokens") return [num.toLocaleString("id-ID"), "Token"]; if (n === "jobCount") return [num, "Job"]; return [num, n]; }} /> { if (v === "totalTokens") return "Token"; if (v === "jobCount") return "Job"; return v; }} /> )} ); }