/opt/mawid/apps/dashboard/app/(app)/patients/[id]
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)} />
setTags(e.target.value)} />
{t('history')}
{patient.appointments.map((appt) => (
{formatInTz(appt.startsAt, 'Europe/Istanbul', lang)}
{serviceName(appt.service.name, lang)} · {appt.staff.name}
{t(`st_${appt.status}` as never)}
))}
{patient.appointments.length === 0 && (
{t('noResults')}
)}
);
}