"use client"; import { useState } from "react"; import { useTenant } from "@/contexts/TenantContext"; type ToolUsageStats = { count: number; avg_latency_ms: number; total_tokens: number; success_count: number; error_count: number; }; type AnalyticsOverview = { overview: { total_queries: number; tool_usage: Record; redflag_count: number; active_users: number; }; }; const API_BASE = process.env.NEXT_PUBLIC_API_URL?.replace(/\/$/, "") || "http://localhost:8000"; export function AnalyticsPanel() { const { tenantId } = useTenant(); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [data, setData] = useState(null); async function fetchAnalytics() { setLoading(true); setError(null); try { const res = await fetch(`${API_BASE}/analytics/overview`, { headers: { "x-tenant-id": tenantId, }, }); if (!res.ok) { throw new Error(`Analytics endpoint returned ${res.status}`); } const payload: AnalyticsOverview = await res.json(); setData(payload.overview); } catch (err) { console.error(err); setError( err instanceof Error ? err.message : "Unable to reach analytics API. Is the FastAPI service running?", ); } finally { setLoading(false); } } return (

Compliance Pulse

Analytics snapshot

{["total_queries", "active_users", "redflag_count"].map((key) => (

{key.replace("_", " ")}

{data ? data[key as keyof typeof data] : "—"}

))}

Tool usage (top)

{data ? Object.entries(data.tool_usage) .sort((a, b) => b[1].count - a[1].count)[0]?.[0] ?? "—" : "—"}

Raw tool usage

{data ? Object.entries(data.tool_usage).map(([tool, stats]) => (

{tool}

{stats.count}

)) : Array.from({ length: 3 }).map((_, idx) => (

Tool {idx + 1}

))}
{error && (

{error}

)}
); }