/opt/mawid/apps/dashboard/app/(app)/patients/[id]
NameSizeModeActions
page.tsx40900644editdlrm
Edit: /opt/mawid/apps/dashboard/app/(app)/patients/[id]/page.tsx (4090B)
'use client'; import { useCallback, useEffect, useState } from 'react'; import { useParams, useRouter } from 'next/navigation'; import { api, serviceName, formatInTz } from '@/lib/api'; import { useLang } from '@/lib/i18n'; import { Badge, Button, Card, Field, Input, Select, Spinner, Textarea } from '@/components/ui'; interface PatientDetail { id: string; name: string | null; waPhone: string; language: string; notes: string | null; tags: string[]; appointments: Array<{ id: string; startsAt: string; status: string; service: { name: unknown }; staff: { name: string }; }>; } const STATUS_COLORS: Record = { pending: 'amber', confirmed: 'emerald', cancelled: 'slate', completed: 'blue', no_show: 'red', }; export default function PatientDetailPage() { const { t, lang } = useLang(); const params = useParams<{ id: string }>(); const router = useRouter(); const [patient, setPatient] = useState(null); const [name, setName] = useState(''); const [language, setLanguage] = useState('tr'); const [notes, setNotes] = useState(''); const [tags, setTags] = useState(''); const [savedFlash, setSavedFlash] = useState(false); const load = useCallback(async () => { const data = await api(`/patients/${params.id}`); setPatient(data); setName(data.name ?? ''); setLanguage(data.language); setNotes(data.notes ?? ''); setTags(data.tags.join(', ')); }, [params.id]); useEffect(() => { load().catch(() => router.push('/patients')); }, [load, router]); async function save() { await api(`/patients/${params.id}`, { method: 'PATCH', body: JSON.stringify({ name: name || undefined, language, notes: notes || null, tags: tags .split(',') .map((s) => s.trim()) .filter(Boolean), }), }); setSavedFlash(true); setTimeout(() => setSavedFlash(false), 1500); load(); } if (!patient) return ; return (
{patient.waPhone}
setName(e.target.value)} />