import { useCallback, useEffect, useState } from "react"; import { getBehaviorDashboardStats, getCostDashboardStats, getModelDashboardStats, getOverviewStats, getRecentErrors, getRecentRequests, sync, } from "./api"; import { BehaviorChart } from "./components/BehaviorChart"; import { BehaviorModelsTable } from "./components/BehaviorModelsTable"; import { BehaviorSummary } from "./components/BehaviorSummary"; import { ChartsContainer } from "./components/ChartsContainer"; import { CostChart } from "./components/CostChart"; import { CostSummary } from "./components/CostSummary"; import { Header } from "./components/Header"; import { ModelsTable } from "./components/ModelsTable"; import { RequestDetail } from "./components/RequestDetail"; import { RequestList } from "./components/RequestList"; import { StatsGrid } from "./components/StatsGrid"; import type { BehaviorDashboardStats, CostDashboardStats, MessageStats, ModelDashboardStats, OverviewStats, TimeRange, } from "./types"; type Tab = "overview" | "requests" | "errors" | "models" | "costs" | "behavior"; export default function App() { const [overviewStats, setOverviewStats] = useState(null); const [modelStats, setModelStats] = useState(null); const [costStats, setCostStats] = useState(null); const [behaviorStats, setBehaviorStats] = useState(null); const [recentRequests, setRecentRequests] = useState([]); const [recentErrors, setRecentErrors] = useState([]); const [selectedRequest, setSelectedRequest] = useState(null); const [syncing, setSyncing] = useState(false); const [activeTab, setActiveTab] = useState("overview"); const [timeRange, setTimeRange] = useState("24h"); const loadRecentLists = useCallback(async () => { try { const [requests, errors] = await Promise.all([getRecentRequests(50), getRecentErrors(50)]); setRecentRequests(requests); setRecentErrors(errors); } catch (err) { console.error(err); } }, []); const loadActiveTabStats = useCallback(async () => { try { if (activeTab === "models") { setModelStats(await getModelDashboardStats(timeRange)); return; } if (activeTab === "costs") { setCostStats(await getCostDashboardStats(timeRange)); return; } if (activeTab === "behavior") { setBehaviorStats(await getBehaviorDashboardStats(timeRange)); return; } if (activeTab === "overview") { setOverviewStats(await getOverviewStats(timeRange)); } } catch (err) { console.error(err); } }, [activeTab, timeRange]); const handleSync = async () => { setSyncing(true); try { await sync(); await Promise.all([loadActiveTabStats(), loadRecentLists()]); } finally { setSyncing(false); } }; useEffect(() => { loadRecentLists(); const interval = setInterval(loadRecentLists, 30000); return () => clearInterval(interval); }, [loadRecentLists]); useEffect(() => { loadActiveTabStats(); const interval = setInterval(loadActiveTabStats, 30000); return () => clearInterval(interval); }, [loadActiveTabStats]); return (
{activeTab === "overview" && (
{overviewStats ? ( ) : ( )}
r.id && setSelectedRequest(r.id)} /> r.id && setSelectedRequest(r.id)} />
)} {activeTab === "requests" && (
r.id && setSelectedRequest(r.id)} />
)} {activeTab === "errors" && (
r.id && setSelectedRequest(r.id)} />
)} {activeTab === "models" && (
{modelStats ? ( <> ) : ( )}
)} {activeTab === "costs" && (
{costStats ? ( <> ) : ( )}
)} {activeTab === "behavior" && (
{behaviorStats ? ( <> ) : ( )}
)} {selectedRequest !== null && ( setSelectedRequest(null)} /> )}
); } function LoadingState({ label }: { label: string }) { return (
{label}
); }