"use client"; import { useState } from "react"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { useSession } from "next-auth/react"; import { useBaby } from "@/contexts/baby-context"; import { format } from "date-fns"; import { fr } from "date-fns/locale"; import { Trash2, Stethoscope, Plus, Loader2 } from "lucide-react"; interface DoctorNote { id: string; content: string; date: string; doctorName?: string | null; reason?: string | null; prescriptions?: string | null; nextAppointmentAt?: string | null; createdAt: string; userId: string; user: { id: string; name: string }; } export default function DoctorNotesPage() { const { selectedBaby, isLoading: familyLoading } = useBaby(); const { data: session } = useSession(); const qc = useQueryClient(); const userRole = (session?.user as { role?: string })?.role; const userId = session?.user?.id; const isDoctor = userRole === "DOCTOR"; const today = new Date().toISOString().slice(0, 10); const [content, setContent] = useState(""); const [date, setDate] = useState(today); const [doctorName, setDoctorName] = useState(""); const [reason, setReason] = useState(""); const [prescriptions, setPrescriptions] = useState(""); const [nextAppointmentAt, setNextAppointmentAt] = useState(""); const [formError, setFormError] = useState(null); const inputCls = "w-full px-3 py-2.5 rounded-lg border border-slate-200 dark:border-slate-700 text-sm focus:outline-none focus:ring-2 focus:ring-indigo-400 bg-white dark:bg-slate-800 text-slate-900 dark:text-slate-100"; const { data: notes = [], isLoading: notesLoading } = useQuery({ queryKey: ["doctor-notes", selectedBaby?.id], queryFn: () => fetch(`/api/doctor-notes?babyId=${selectedBaby!.id}`).then((r) => r.json()), enabled: !!selectedBaby?.id, }); const createMutation = useMutation({ mutationFn: (body: { babyId: string; content: string; date: string; doctorName?: string; reason?: string; prescriptions?: string; nextAppointmentAt?: string }) => fetch("/api/doctor-notes", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(body), }).then(async (r) => { if (!r.ok) { const data = await r.json(); throw new Error(data.error ?? "Erreur lors de la création"); } return r.json(); }), onSuccess: () => { qc.invalidateQueries({ queryKey: ["doctor-notes", selectedBaby?.id] }); setContent(""); setDate(today); setDoctorName(""); setReason(""); setPrescriptions(""); setNextAppointmentAt(""); setFormError(null); }, onError: (err: Error) => { setFormError(err.message); }, }); const deleteMutation = useMutation({ mutationFn: (id: string) => fetch(`/api/doctor-notes/${id}`, { method: "DELETE" }).then(async (r) => { if (!r.ok) { const data = await r.json(); throw new Error(data.error ?? "Erreur lors de la suppression"); } }), onSuccess: () => { qc.invalidateQueries({ queryKey: ["doctor-notes", selectedBaby?.id] }); }, }); function handleSubmit(e: React.FormEvent) { e.preventDefault(); if (!selectedBaby?.id || !content.trim() || !date) return; createMutation.mutate({ babyId: selectedBaby.id, content: content.trim(), date, doctorName: doctorName || undefined, reason: reason || undefined, prescriptions: prescriptions || undefined, nextAppointmentAt: nextAppointmentAt || undefined, }); } if (familyLoading) { return (
); } if (!selectedBaby) { return (

Aucun bébé enregistré.

Ajouter un bébé
); } return (
{/* Header */}

Observations médicales

{/* Add form — DOCTOR only */} {isDoctor && (

Ajouter une observation

setDate(e.target.value)} required className="w-full rounded-lg border border-slate-200 dark:border-slate-600 bg-slate-50 dark:bg-slate-700 text-slate-900 dark:text-slate-100 px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-emerald-500 dark:focus:ring-emerald-400" />
setDoctorName(e.target.value)} placeholder="Dr. Dupont" className={inputCls} />
setReason(e.target.value)} placeholder="Visite de routine, fièvre..." className={inputCls} />