import { useTranslation } from "react-i18next"; import { RotateCcw, Zap } from "lucide-react"; import { useRestore, useStatus, useLogs } from "@/lib/queries"; import { useToast } from "@/components/toast"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Table, TBody, TD, TH, THead, TR } from "@/components/ui/table"; function formatUptime(seconds: number): string { if (seconds < 60) return `${seconds}s`; if (seconds < 3600) return `${Math.floor(seconds / 60)}m ${seconds % 60}s`; return `${Math.floor(seconds / 3600)}h ${Math.floor((seconds % 3600) / 60)}m`; } function formatTime(iso: string): string { const date = new Date(iso); return date.toLocaleTimeString(); } export default function Dashboard() { const { t } = useTranslation(); const status = useStatus(); const logs = useLogs(); const restore = useRestore(); const { show } = useToast(); if (status.isPending) { return
{t("common.loading")}
; } if (status.isError || !status.data) { return (
{t("common.error")}
); } const s = status.data; const active = s.active_claude_provider; return (
{t("dashboard.gateway")}
{s.running ? t("dashboard.running") : t("dashboard.stopped")} {t("dashboard.port")} {s.port}
{t("dashboard.uptime")} {formatUptime(s.uptime_sec)} ยท {t("dashboard.version")}{" "} {s.version}
{t("dashboard.activeProvider")} {active ? ( <>
{active.name}
{active.base_url}
) : (
{t("dashboard.noActiveProvider")}
)}
{t("dashboard.statsTitle")}
{t("dashboard.requests")}
{s.stats.requests_total}
{t("dashboard.failed")}
{s.stats.requests_failed}
{t("dashboard.tokensIn")}
{s.stats.input_tokens}
{t("dashboard.tokensOut")}
{s.stats.output_tokens}
{t("dashboard.recentRequests")} {logs.data && logs.data.items.length > 0 ? ( {logs.data.items.slice(0, 12).map((entry, index) => ( ))}
{t("dashboard.tableTime")} {t("dashboard.tableModel")} {t("dashboard.tableStatus")} {t("dashboard.tableDuration")} {t("dashboard.tableTokens")}
{formatTime(entry.time)} {entry.model ?? entry.path} {entry.status} {entry.duration_ms} ms {entry.input_tokens ?? 0} / {entry.output_tokens ?? 0}
) : (
{t("dashboard.emptyLogs")}
)}
); }