diff --git a/frontend/src/app/(dashboard)/patients/page.tsx b/frontend/src/app/(dashboard)/patients/page.tsx index 4095d41..aa85f3d 100644 --- a/frontend/src/app/(dashboard)/patients/page.tsx +++ b/frontend/src/app/(dashboard)/patients/page.tsx @@ -2,8 +2,11 @@ import { useEffect, useMemo, useState } from 'react'; import { Button } from '@/components/ui/common/Button'; +import { ToastStack } from '@/components/ui/common/Toast'; import { patientsApi } from '@/lib/api/patients'; +import { formatApiErrorMessage } from '@/lib/formatApiError'; import { useAuth } from '@/lib/hooks/useAuth'; +import { useToast } from '@/lib/hooks/useToast'; import { hasPermission } from '@/shared/permissions'; import { CreatePatientInput, @@ -25,6 +28,7 @@ const EMPTY_PATIENT_FORM: CreatePatientInput = { export default function PatientsPage() { const { currentOrganization } = useAuth(); + const toast = useToast(); const [search, setSearch] = useState(''); const [patients, setPatients] = useState([]); const [selectedPatient, setSelectedPatient] = useState(); @@ -35,8 +39,6 @@ export default function PatientsPage() { const [savingPatient, setSavingPatient] = useState(false); const [savingTreatment, setSavingTreatment] = useState(false); const [patientForm, setPatientForm] = useState(EMPTY_PATIENT_FORM); - const [errorMessage, setErrorMessage] = useState(''); - const [successMessage, setSuccessMessage] = useState(''); const canEditPatients = hasPermission(currentOrganization, 'TAB_PATIENTS_EDIT'); const sortedPatients = useMemo( @@ -58,21 +60,9 @@ export default function PatientsPage() { void loadPatients(''); }, []); - useEffect(() => { - if (!successMessage) { - return; - } - - const timeout = setTimeout(() => { - setSuccessMessage(''); - }, 3000); - - return () => clearTimeout(timeout); - }, [successMessage]); - async function loadPatients(q: string) { setLoadingPatients(true); - setErrorMessage(''); + toast.setError(''); try { const response = await patientsApi.list({ q, page: 1, limit: 25 }); const items = response.data.items; @@ -82,9 +72,8 @@ export default function PatientsPage() { const freshSelected = items.find((item) => item.id === selectedPatient.id); setSelectedPatient(freshSelected); } - } catch (error: any) { - const message = Array.isArray(error?.message) ? error.message.join(', ') : error?.message; - setErrorMessage(message || 'Failed to load patients.'); + } catch (error: unknown) { + toast.showError(formatApiErrorMessage(error, 'Failed to load patients.')); } finally { setLoadingPatients(false); } @@ -92,13 +81,12 @@ export default function PatientsPage() { async function loadTreatments(patientId: string) { setLoadingTreatments(true); - setErrorMessage(''); + toast.setError(''); try { const response = await patientsApi.listTreatments(patientId); setTreatments(response.data); - } catch (error: any) { - const message = Array.isArray(error?.message) ? error.message.join(', ') : error?.message; - setErrorMessage(message || 'Failed to load treatment history.'); + } catch (error: unknown) { + toast.showError(formatApiErrorMessage(error, 'Failed to load treatment history.')); } finally { setLoadingTreatments(false); } @@ -106,8 +94,7 @@ export default function PatientsPage() { async function handleCreatePatient() { setSavingPatient(true); - setErrorMessage(''); - setSuccessMessage(''); + toast.setError(''); try { const response = await patientsApi.create(patientForm); setIsCreateOpen(false); @@ -115,12 +102,11 @@ export default function PatientsPage() { await loadPatients(search); setSelectedPatient(response.data); await loadTreatments(response.data.id); - setSuccessMessage( + toast.showSuccess( `Patient ${response.data.firstName} ${response.data.lastName} was saved successfully.`, ); - } catch (error: any) { - const message = Array.isArray(error?.message) ? error.message.join(', ') : error?.message; - setErrorMessage(message || 'Failed to save patient.'); + } catch (error: unknown) { + toast.showError(formatApiErrorMessage(error, 'Failed to save patient.')); } finally { setSavingPatient(false); } @@ -139,29 +125,28 @@ export default function PatientsPage() { }; setSavingTreatment(true); - setErrorMessage(''); - setSuccessMessage(''); + toast.setError(''); try { await patientsApi.addTreatment(selectedPatient.id, payload); await loadTreatments(selectedPatient.id); - setSuccessMessage('Treatment entry added successfully.'); - } catch (error: any) { - const message = Array.isArray(error?.message) ? error.message.join(', ') : error?.message; - setErrorMessage(message || 'Failed to add treatment entry.'); + toast.showSuccess('Treatment entry added successfully.'); + } catch (error: unknown) { + toast.showError(formatApiErrorMessage(error, 'Failed to add treatment entry.')); } finally { setSavingTreatment(false); } } return ( -
-
+
+

Patients

- setPatientForm((prev) => ({ ...prev, ...patch }))} - onSubmit={handleCreatePatient} - onClose={() => setIsCreateOpen(false)} - loading={savingPatient} - /> + + + {isCreateOpen && ( + setPatientForm((prev) => ({ ...prev, ...patch }))} + onSubmit={() => void handleCreatePatient()} + onClose={() => setIsCreateOpen(false)} + loading={savingPatient} + /> + )}
@@ -213,21 +202,6 @@ export default function PatientsPage() {
- - {(errorMessage || successMessage) && ( -
- {errorMessage && ( -
- {errorMessage} -
- )} - {successMessage && ( -
- {successMessage} -
- )} -
- )}
); }