"use client"; import { useState, useEffect } from "react"; import { Button, Input, Modal } from "@/components/ui"; import { api } from "@/lib/api"; import type { Medicine, Dose } from "@/types"; interface Props { childId: string } export function MedicineTab({ childId }: Props) { const [medicines, setMedicines] = useState([]); const [editingMed, setEditingMed] = useState(null); const [showAddMed, setShowAddMed] = useState(false); const [name, setName] = useState(""); const [dose, setDose] = useState(""); const [notes, setNotes] = useState(""); const [logDoseMedId, setLogDoseMedId] = useState(null); const [doseAmount, setDoseAmount] = useState(""); const [doseNotes, setDoseNotes] = useState(""); const [doseTime, setDoseTime] = useState(() => new Date().toISOString().slice(0, 16)); const [doseLoading, setDoseLoading] = useState(false); const [doseHistory, setDoseHistory] = useState>({}); const [showDoseHistory, setShowDoseHistory] = useState>({}); const [correctDose, setCorrectDose] = useState<{ medId: string; dose: Dose } | null>(null); const [correctAmount, setCorrectAmount] = useState(""); const [correctNotes, setCorrectNotes] = useState(""); const [correctReason, setCorrectReason] = useState(""); const [correctLoading, setCorrectLoading] = useState(false); useEffect(() => { fetchMedicines(); }, [childId]); const fetchMedicines = () => api.get<{ medicines: Medicine[] }>(`/api/medicines?childId=${childId}`) .then(d => setMedicines(d.medicines || [])) .catch(console.error); const saveMedicine = async () => { if (!name) return; try { if (editingMed) { await api.patch("/api/medicines", { id: editingMed.id, name, dose, notes }); } else { await api.post("/api/medicines", { childId, name, dose, notes }); } fetchMedicines(); } catch (err) { console.error("Failed to save medicine:", err); } resetForm(); }; const deleteMedicine = async (id: string) => { try { await api.delete(`/api/medicines?id=${id}`); fetchMedicines(); } catch (err) { console.error("Failed to delete medicine:", err); } }; const editMedicine = (med: Medicine) => { setEditingMed(med); setName(med.name); setDose(med.dose); setNotes(med.notes); setShowAddMed(true); }; const resetForm = () => { setEditingMed(null); setName(""); setDose(""); setNotes(""); setShowAddMed(false); }; const openLogDose = (medId: string) => { setLogDoseMedId(medId); setDoseAmount(""); setDoseNotes(""); setDoseTime(new Date().toISOString().slice(0, 16)); }; const submitDose = async () => { if (!logDoseMedId) return; setDoseLoading(true); try { await api.post(`/api/medicines/${logDoseMedId}/doses`, { amountGiven: doseAmount, notes: doseNotes, administeredAt: new Date(doseTime).toISOString(), }); const medId = logDoseMedId; setLogDoseMedId(null); if (showDoseHistory[medId]) fetchDoseHistory(medId); } catch (err) { console.error("Failed to log dose:", err); } setDoseLoading(false); }; const fetchDoseHistory = (medId: string) => api.get<{ doses: Dose[] }>(`/api/medicines/${medId}/doses`) .then(d => setDoseHistory(prev => ({ ...prev, [medId]: d.doses || [] }))) .catch(console.error); const toggleDoseHistory = (medId: string) => { const next = !showDoseHistory[medId]; setShowDoseHistory(prev => ({ ...prev, [medId]: next })); if (next && !doseHistory[medId]) fetchDoseHistory(medId); }; const submitCorrection = async () => { if (!correctDose) return; setCorrectLoading(true); try { await api.post(`/api/medicines/${correctDose.medId}/doses/${correctDose.dose.id}/correct`, { amountGiven: correctAmount, notes: correctNotes, reason: correctReason, }); fetchDoseHistory(correctDose.medId); setCorrectDose(null); } catch (err) { console.error("Failed to submit correction:", err); } setCorrectLoading(false); }; return (

Medicine & Supplements

{showAddMed && (
setName(e.target.value)} /> setDose(e.target.value)} /> setNotes(e.target.value)} />
)} {medicines.length === 0 && !showAddMed ? (

No medicines added

) : ( medicines.map(med => (
{med.name}
{med.dose}{med.notes && ` · ${med.notes}`} {med.reminderTime && ` · ⏰ ${med.reminderTime}`}
{showDoseHistory[med.id] && (
{!doseHistory[med.id] ? (

Loading…

) : doseHistory[med.id].length === 0 ? (

No doses logged yet.

) : doseHistory[med.id].map(d => { const latest = d.corrections?.[0]?.corrected_value; const displayAmount = latest?.amountGiven ?? d.amount_given; const displayNotes = latest?.notes ?? d.notes; return (
{new Date(d.administered_at).toLocaleString()} {displayAmount && · {displayAmount}} {displayNotes && · {displayNotes}} {!!latest && edited}
); })}
)}
)) )} {!showAddMed && ( )} setLogDoseMedId(null)} title="Log Dose" maxWidth="sm">
setDoseAmount(e.target.value)} /> setDoseTime(e.target.value)} /> setDoseNotes(e.target.value)} />
setCorrectDose(null)} title="Edit Dose (Correction)" maxWidth="sm">

Original is kept. A correction record is added.

{correctDose && (
Original: {correctDose.dose.amount_given || "—"} · {new Date(correctDose.dose.administered_at).toLocaleString()}
)} setCorrectAmount(e.target.value)} /> setCorrectNotes(e.target.value)} /> setCorrectReason(e.target.value)} />
); }