diff --git a/src/app/medical/page.tsx b/src/app/medical/page.tsx index 171f603..343202f 100644 --- a/src/app/medical/page.tsx +++ b/src/app/medical/page.tsx @@ -2,6 +2,37 @@ import { useState, useEffect } from "react"; +interface Medicine { + id: string; + name: string; + dose: string; + notes: string; + reminderTime?: string; +} + +interface Allergy { + id: string; + name: string; + severity: string; + notes: string; +} + +interface Visit { + id: string; + doctorName: string; + reason: string; + date: string; + notes: string; +} + +interface Illness { + id: string; + name: string; + startDate: string; + endDate?: string; + notes: string; +} + // IAP Vaccination Schedule (India) const IAP_SCHEDULE = [ { name: "BCG", weeks: 0 }, @@ -48,6 +79,218 @@ export default function MedicalPage() { const [showReminder, setShowReminder] = useState(null); const [reminderTime, setReminderTime] = useState("08:00"); + // CRUD state for medicine, allergies, visits, illness + const [medicines, setMedicines] = useState([]); + const [allergies, setAllergies] = useState([]); + const [visits, setVisits] = useState([]); + const [illnesses, setIllnesses] = useState([]); + + // Add/Edit mode + const [editingMed, setEditingMed] = useState(null); + const [editingAllergy, setEditingAllergy] = useState(null); + const [editingVisit, setEditingVisit] = useState(null); + const [editingIllness, setEditingIllness] = useState(null); + const [showAddMed, setShowAddMed] = useState(false); + const [showAddAllergy, setShowAddAllergy] = useState(false); + const [showAddVisit, setShowAddVisit] = useState(false); + const [showAddIllness, setShowAddIllness] = useState(false); + + // Form state for new items + const [newMedName, setNewMedName] = useState(""); + const [newMedDose, setNewMedDose] = useState(""); + const [newMedNotes, setNewMedNotes] = useState(""); + const [newAllergyName, setNewAllergyName] = useState(""); + const [newAllergySeverity, setNewAllergySeverity] = useState("mild"); + const [newAllergyNotes, setNewAllergyNotes] = useState(""); + const [newVisitDoctor, setNewVisitDoctor] = useState(""); + const [newVisitReason, setNewVisitReason] = useState(""); + const [newVisitDate, setNewVisitDate] = useState(""); + const [newVisitNotes, setNewVisitNotes] = useState(""); + const [newIllnessName, setNewIllnessName] = useState(""); + const [newIllnessStart, setNewIllnessStart] = useState(""); + const [newIllnessEnd, setNewIllnessEnd] = useState(""); + const [newIllnessNotes, setNewIllnessNotes] = useState(""); + + // Load data from localStorage on mount + useEffect(() => { + // Load medicines + const savedMeds = localStorage.getItem("tia_medicines"); + if (savedMeds) setMedicines(JSON.parse(savedMeds)); + + const savedAllergies = localStorage.getItem("tia_allergies"); + if (savedAllergies) setAllergies(JSON.parse(savedAllergies)); + + const savedVisits = localStorage.getItem("tia_visits"); + if (savedVisits) setVisits(JSON.parse(savedVisits)); + + const savedIllnesses = localStorage.getItem("tia_illnesses"); + if (savedIllnesses) setIllnesses(JSON.parse(savedIllnesses)); + }, []); + + // Medicine CRUD + const saveMedicine = () => { + if (!newMedName) return; + const newItem: Medicine = { + id: editingMed?.id || Date.now().toString(), + name: newMedName, + dose: newMedDose, + notes: newMedNotes, + reminderTime: reminderTime, + }; + const updated = editingMed + ? medicines.map((m) => (m.id === editingMed.id ? newItem : m)) + : [...medicines, newItem]; + setMedicines(updated); + localStorage.setItem("tia_medicines", JSON.stringify(updated)); + resetMedForm(); + }; + + const deleteMedicine = (id: string) => { + const updated = medicines.filter((m) => m.id !== id); + setMedicines(updated); + localStorage.setItem("tia_medicines", JSON.stringify(updated)); + }; + + const editMedicine = (med: Medicine) => { + setEditingMed(med); + setNewMedName(med.name); + setNewMedDose(med.dose); + setNewMedNotes(med.notes); + setReminderTime(med.reminderTime || "08:00"); + setShowAddMed(true); + }; + + const resetMedForm = () => { + setEditingMed(null); + setNewMedName(""); + setNewMedDose(""); + setNewMedNotes(""); + setShowAddMed(false); + }; + + // Allergy CRUD + const saveAllergy = () => { + if (!newAllergyName) return; + const newItem: Allergy = { + id: editingAllergy?.id || Date.now().toString(), + name: newAllergyName, + severity: newAllergySeverity, + notes: newAllergyNotes, + }; + const updated = editingAllergy + ? allergies.map((a) => (a.id === editingAllergy.id ? newItem : a)) + : [...allergies, newItem]; + setAllergies(updated); + localStorage.setItem("tia_allergies", JSON.stringify(updated)); + resetAllergyForm(); + }; + + const deleteAllergy = (id: string) => { + const updated = allergies.filter((a) => a.id !== id); + setAllergies(updated); + localStorage.setItem("tia_allergies", JSON.stringify(updated)); + }; + + const editAllergy = (allergy: Allergy) => { + setEditingAllergy(allergy); + setNewAllergyName(allergy.name); + setNewAllergySeverity(allergy.severity); + setNewAllergyNotes(allergy.notes); + setShowAddAllergy(true); + }; + + const resetAllergyForm = () => { + setEditingAllergy(null); + setNewAllergyName(""); + setNewAllergySeverity("mild"); + setNewAllergyNotes(""); + setShowAddAllergy(false); + }; + + // Visit CRUD + const saveVisit = () => { + if (!newVisitDoctor) return; + const newItem: Visit = { + id: editingVisit?.id || Date.now().toString(), + doctorName: newVisitDoctor, + reason: newVisitReason, + date: newVisitDate || new Date().toISOString().split("T")[0], + notes: newVisitNotes, + }; + const updated = editingVisit + ? visits.map((v) => (v.id === editingVisit.id ? newItem : v)) + : [...visits, newItem]; + setVisits(updated); + localStorage.setItem("tia_visits", JSON.stringify(updated)); + resetVisitForm(); + }; + + const deleteVisit = (id: string) => { + const updated = visits.filter((v) => v.id !== id); + setVisits(updated); + localStorage.setItem("tia_visits", JSON.stringify(updated)); + }; + + const editVisit = (visit: Visit) => { + setEditingVisit(visit); + setNewVisitDoctor(visit.doctorName); + setNewVisitReason(visit.reason); + setNewVisitDate(visit.date); + setNewVisitNotes(visit.notes); + setShowAddVisit(true); + }; + + const resetVisitForm = () => { + setEditingVisit(null); + setNewVisitDoctor(""); + setNewVisitReason(""); + setNewVisitDate(""); + setNewVisitNotes(""); + setShowAddVisit(false); + }; + + // Illness CRUD + const saveIllness = () => { + if (!newIllnessName) return; + const newItem: Illness = { + id: editingIllness?.id || Date.now().toString(), + name: newIllnessName, + startDate: newIllnessStart || new Date().toISOString().split("T")[0], + endDate: newIllnessEnd || undefined, + notes: newIllnessNotes, + }; + const updated = editingIllness + ? illnesses.map((i) => (i.id === editingIllness.id ? newItem : i)) + : [...illnesses, newItem]; + setIllnesses(updated); + localStorage.setItem("tia_illnesses", JSON.stringify(updated)); + resetIllnessForm(); + }; + + const deleteIllness = (id: string) => { + const updated = illnesses.filter((i) => i.id !== id); + setIllnesses(updated); + localStorage.setItem("tia_illnesses", JSON.stringify(updated)); + }; + + const editIllness = (illness: Illness) => { + setEditingIllness(illness); + setNewIllnessName(illness.name); + setNewIllnessStart(illness.startDate); + setNewIllnessEnd(illness.endDate || ""); + setNewIllnessNotes(illness.notes); + setShowAddIllness(true); + }; + + const resetIllnessForm = () => { + setEditingIllness(null); + setNewIllnessName(""); + setNewIllnessStart(""); + setNewIllnessEnd(""); + setNewIllnessNotes(""); + setShowAddIllness(false); + }; + // Reminder save handler const handleSetReminder = (medName: string) => { // In production, save to database with reminder time @@ -134,7 +377,7 @@ const SUPPLEMENTS = [ onClick={() => setTab("visits")} className={`px-4 p-3 rounded-xl ${tab === "visits" ? "bg-rose-400 text-white" : "bg-white"}`} > - Visits + Doctor Visit - - - ) : ( - - )} - +

Medicine & Supplements

+ + {/* Add Form */} + {showAddMed && ( +
+ setNewMedName(e.target.value)} + placeholder="Medicine name" + className="w-full p-2 border rounded-lg" + /> + setNewMedDose(e.target.value)} + placeholder="Dose (e.g., 5ml, 1 tablet)" + className="w-full p-2 border rounded-lg" + /> + setNewMedNotes(e.target.value)} + placeholder="Notes" + className="w-full p-2 border rounded-lg" + /> +
+ +
- ))} + )} + + {medicines.length === 0 && !showAddMed ? ( +
+

No medicines added

+
+ ) : ( + medicines.map((med) => ( +
+
+
+
{med.name}
+
+ {med.dose} {med.notes && `· ${med.notes}`} + {med.reminderTime && ` · ⏰ ${med.reminderTime}`} +
+
+
+ + +
+
+
+ )) + )} + + {!showAddMed && ( + + )} )} {tab === "allergies" && (

Known Allergies

-
-

No allergies recorded

-
- + + {showAddAllergy && ( +
+ setNewAllergyName(e.target.value)} + placeholder="Allergy name (e.g., Peanut, Milk)" + className="w-full p-2 border rounded-lg" + /> + + setNewAllergyNotes(e.target.value)} + placeholder="Notes" + className="w-full p-2 border rounded-lg" + /> +
+ + +
+
+ )} + + {allergies.length === 0 && !showAddAllergy ? ( +
+

No allergies recorded

+
+ ) : ( + allergies.map((allergy) => ( +
+
+
+
{allergy.name}
+
+ + {allergy.severity.toUpperCase()} + + {allergy.notes && ` · ${allergy.notes}`} +
+
+
+ + +
+
+
+ )) + )} + + {!showAddAllergy && ( + + )}
)} {tab === "visits" && (

Doctor Visits

-
-

No visits recorded

-
- + + {showAddVisit && ( +
+ setNewVisitDoctor(e.target.value)} + placeholder="Doctor name" + className="w-full p-2 border rounded-lg" + /> + setNewVisitReason(e.target.value)} + placeholder="Reason (e.g., Checkup, Fever)" + className="w-full p-2 border rounded-lg" + /> + setNewVisitDate(e.target.value)} + className="w-full p-2 border rounded-lg" + /> + setNewVisitNotes(e.target.value)} + placeholder="Notes" + className="w-full p-2 border rounded-lg" + /> +
+ + +
+
+ )} + + {visits.length === 0 && !showAddVisit ? ( +
+

No visits recorded

+
+ ) : ( + visits.map((visit) => ( +
+
+
+
{visit.doctorName}
+
+ {new Date(visit.date).toLocaleDateString()} + {visit.reason && ` · ${visit.reason}`} + {visit.notes && ` · ${visit.notes}`} +
+
+
+ + +
+
+
+ )) + )} + + {!showAddVisit && ( + + )}
)} {tab === "illness" && (

Illness Log

-
-

No illnesses recorded

-
- + + {showAddIllness && ( +
+ setNewIllnessName(e.target.value)} + placeholder="Illness (e.g., Cold, Fever, Flu)" + className="w-full p-2 border rounded-lg" + /> +
+ setNewIllnessStart(e.target.value)} + placeholder="Start date" + className="w-full p-2 border rounded-lg" + /> + setNewIllnessEnd(e.target.value)} + placeholder="End date" + className="w-full p-2 border rounded-lg" + /> +
+ setNewIllnessNotes(e.target.value)} + placeholder="Notes" + className="w-full p-2 border rounded-lg" + /> +
+ + +
+
+ )} + + {illnesses.length === 0 && !showAddIllness ? ( +
+

No illnesses recorded

+
+ ) : ( + illnesses.map((illness) => ( +
+
+
+
{illness.name}
+
+ {new Date(illness.startDate).toLocaleDateString()} + {illness.endDate && ` - ${new Date(illness.endDate).toLocaleDateString()}`} + {illness.notes && ` · ${illness.notes}`} +
+
+
+ + +
+
+
+ )) + )} + + {!showAddIllness && ( + + )}
)}