"use client"; import { Plus, Search } from "lucide-react"; import { useRouter } from "next/navigation"; import { useEffect, useState } from "react"; import { PatientFormDialog } from "@/components/chat/patient-form-dialog"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { listPatients, type Patient } from "@/lib/patients"; type BadgeVariant = "secondary" | "destructive" | "outline"; const statusVariant: Record = { active: "secondary", inpatient: "destructive", discharged: "outline", }; export function PatientsView() { const router = useRouter(); const [query, setQuery] = useState(""); const [addOpen, setAddOpen] = useState(false); // Bumped on open so the create dialog remounts with a fresh file # / form. const [addKey, setAddKey] = useState(0); const [allPatients, setAllPatients] = useState([]); const [loading, setLoading] = useState(true); const [loadError, setLoadError] = useState(null); useEffect(() => { let active = true; setLoading(true); listPatients() .then((data) => { if (!active) return; setAllPatients(data); setLoadError(null); }) .catch((err) => { if (!active) return; setLoadError( err instanceof Error ? err.message : "Failed to load patients." ); }) .finally(() => { if (active) setLoading(false); }); return () => { active = false; }; }, []); const q = query.trim().toLowerCase(); const patients = allPatients.filter( (p) => !q || p.name.toLowerCase().includes(q) || p.fileNumber.includes(q) ); const open = (fileNumber: string) => router.push(`/?patient=${fileNumber}`); return (

Patients

setQuery(event.target.value)} placeholder="Search name or MRN" value={query} />
{loading ? ( ) : loadError ? ( ) : patients.length === 0 ? ( ) : ( patients.map((p) => ( open(p.fileNumber)} onKeyDown={(event) => { if (event.key === "Enter" || event.key === " ") { event.preventDefault(); open(p.fileNumber); } }} role="button" tabIndex={0} > )) )}
Name MRN Age · Sex Status Last seen Allergies
Loading patients…
{loadError}
No patients found.
{p.name} {p.fileNumber} {p.age} · {p.sex} {p.status} {p.encounters[0]?.date ?? "—"} {p.allergies.length || "—"}
open(fileNumber)} onOpenChange={setAddOpen} open={addOpen} />
); }