"use client"; import Link from "next/link"; import { useQuery } from "@tanstack/react-query"; import { Activity, AlertTriangle, CalendarDays, HeartPulse, TrendingUp, } from "lucide-react"; import { PieChart, Pie, Cell, ResponsiveContainer, Legend, Tooltip, } from "recharts"; import { Card, CardContent } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { api } from "@/lib/api"; import { useT } from "@/i18n/context"; export function DashboardClient() { const { dict, locale } = useT(); const stats = useQuery({ queryKey: ["stats"], queryFn: api.stats }); const history = useQuery({ queryKey: ["history"], queryFn: api.history }); const s = stats.data ?? { total: 0, high_risk: 0, low_risk: 0, high_risk_pct: 0, today: 0, }; const recent = (history.data ?? []).slice(-8).reverse(); const pieData = [ { name: dict.dashboard.kpi.lowRisk, value: s.low_risk, color: "var(--success)" }, { name: dict.dashboard.kpi.highRisk, value: s.high_risk, color: "var(--destructive)" }, ]; return (
} label={dict.dashboard.kpi.totalAssessments} value={s.total.toString()} /> } label={dict.dashboard.kpi.todayAssessments} value={s.today.toString()} /> } label={dict.dashboard.kpi.highRiskPct} value={`${s.high_risk_pct}%`} tone={s.high_risk_pct >= 40 ? "danger" : "default"} /> } label={dict.dashboard.kpi.highRisk} value={s.high_risk.toString()} tone="danger" />

{dict.dashboard.recentTitle}

{recent.length === 0 ? (
{dict.dashboard.recentEmpty}
) : (
{recent.map((r, i) => ( ))}
{dict.history.columns.patientId} {dict.history.columns.date} {dict.history.columns.age} {dict.history.columns.sex} {dict.history.columns.probability} {dict.history.columns.risk}
{r.patient_id} {r.date} ยท {r.time} {r.age} {r.sex} {r.probability.toFixed(1)}% {r.risk === "ALTO" ? dict.common.high : dict.common.low}
)}

{dict.dashboard.riskDistribution}

{s.total === 0 ? (
{dict.common.noData}
) : ( {pieData.map((d, i) => ( ))} )}
); } function KpiCard({ icon, label, value, tone = "default", }: { icon: React.ReactNode; label: string; value: string; tone?: "default" | "danger"; }) { return (
{label}
{value}
{icon}
); }