"use client"; import { useMemo, useState } from "react"; import { useQuery } from "@tanstack/react-query"; import { Download, Search } from "lucide-react"; import { api, type HistoryEntry } from "@/lib/api"; import { useT } from "@/i18n/context"; import { Card, CardContent } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; type Filter = "all" | "high" | "low"; export function PatientsTable() { const { dict } = useT(); const [query, setQuery] = useState(""); const [filter, setFilter] = useState("all"); const { data } = useQuery({ queryKey: ["history"], queryFn: api.history }); const rows = useMemo(() => { let r = [...(data ?? [])].reverse(); if (filter === "high") r = r.filter((x) => x.risk === "ALTO"); if (filter === "low") r = r.filter((x) => x.risk !== "ALTO"); if (query.trim()) r = r.filter((x) => x.patient_id.toLowerCase().includes(query.toLowerCase()) ); return r; }, [data, query, filter]); function exportCsv() { const headers = [ "Date","Time","Patient ID","Age","Sex","Max HR","Fasting BS","Exercise Angina","Chest Pain","ST Slope","Probability","Risk", ]; const lines = [ headers.join(","), ...rows.map((r: HistoryEntry) => [ r.date, r.time, r.patient_id, r.age, r.sex, r.max_hr, r.fasting_bs, r.exercise_angina, r.chest_pain_type, r.st_slope, r.probability, r.risk, ].join(",") ), ]; const blob = new Blob([lines.join("\n")], { type: "text/csv" }); const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = `beatsense-patients-${new Date().toISOString().slice(0, 10)}.csv`; a.click(); URL.revokeObjectURL(url); } return (
setQuery(e.target.value)} placeholder={dict.history.search} className="h-9 w-72 rounded-md border border-input bg-background pl-9 pr-3 text-sm focus:outline-none focus:ring-2 focus:ring-ring" />
setFilter("all")} /> setFilter("high")} /> setFilter("low")} />
{rows.length === 0 ? ( ) : ( rows.map((r, i) => ( )) )}
{dict.history.columns.date} {dict.history.columns.time} {dict.history.columns.patientId} {dict.history.columns.age} {dict.history.columns.sex} {dict.history.columns.maxHr} {dict.history.columns.fastingBs} {dict.history.columns.exerciseAngina} {dict.history.columns.chestPain} {dict.history.columns.stSlope} {dict.history.columns.probability} {dict.history.columns.risk}
{dict.common.noData}
{r.date} {r.time} {r.patient_id} {r.age} {r.sex} {r.max_hr} {r.fasting_bs} {r.exercise_angina} {r.chest_pain_type} {r.st_slope} {r.probability.toFixed(1)}% {r.risk === "ALTO" ? dict.common.high : dict.common.low}
); } function FilterButton({ label, active, onClick, }: { label: string; active: boolean; onClick: () => void; }) { return ( ); } function Th({ children, className, }: { children: React.ReactNode; className?: string; }) { return ( {children} ); } function Td({ children, className, }: { children: React.ReactNode; className?: string; }) { return {children}; }