'use client'; /** * Diagnose Modal Component * * Modal voor toevoegen en bewerken van diagnoses met ICD-10 classificatie. */ import { useState, useEffect } from 'react'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { Loader2 } from 'lucide-react'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, } from '@/components/ui/dialog'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Textarea } from '@/components/ui/textarea'; import { Label } from '@/components/ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { toast } from '@/hooks/use-toast'; import { ICD10Combobox } from './icd10-combobox'; import { diagnosisSchema, diagnosisDefaults, type DiagnosisFormData, DIAGNOSIS_SEVERITIES, DIAGNOSIS_TYPES, DIAGNOSIS_STATUSES, } from '@/lib/schemas/diagnosis'; import { createDiagnosis, updateDiagnosis, type Condition } from '../../actions'; import type { ICD10Code } from '@/lib/types/icd10'; interface DiagnosisModalProps { open: boolean; onOpenChange: (open: boolean) => void; patientId: string; intakeId: string; diagnosis?: Condition; // undefined = nieuw, Condition = bewerk onSuccess: () => void; // Callback na succesvol opslaan } // Status labels voor weergave const STATUS_LABELS: Record = { active: 'Actief', remission: 'In remissie', resolved: 'Opgelost', inactive: 'Inactief', }; // Severity labels voor weergave const SEVERITY_LABELS: Record = { licht: 'Licht', matig: 'Matig', ernstig: 'Ernstig', }; // Diagnose type labels const DIAGNOSIS_TYPE_LABELS: Record = { primary: 'Hoofddiagnose', secondary: 'Nevendiagnose', }; export function DiagnosisModal({ open, onOpenChange, patientId, intakeId, diagnosis, onSuccess, }: DiagnosisModalProps) { const [isSubmitting, setIsSubmitting] = useState(false); const [selectedICD10Code, setSelectedICD10Code] = useState(null); const isEditMode = !!diagnosis; const { register, handleSubmit, formState: { errors }, reset, setValue, watch, } = useForm({ resolver: zodResolver(diagnosisSchema), defaultValues: diagnosisDefaults, }); const diagnosisType = watch('diagnosisType'); const severity = watch('severity'); const status = watch('status'); // Reset form wanneer modal opent/sluit of diagnosis wijzigt useEffect(() => { if (open) { if (diagnosis) { // Bewerk modus: vul form met bestaande data setValue('code', diagnosis.code_code || ''); setValue('description', diagnosis.code_display || ''); setValue('severity', (diagnosis.severity_display as 'licht' | 'matig' | 'ernstig') || 'matig'); setValue('status', (diagnosis.clinical_status as 'active' | 'remission' | 'resolved' | 'inactive') || 'active'); setValue('diagnosisType', diagnosis.category === 'primary-diagnosis' ? 'primary' : 'secondary'); setValue('dsm5Reference', diagnosis.code_system === 'DSM-5' ? diagnosis.code_code || '' : ''); setValue('notes', diagnosis.note || ''); // Set selected ICD-10 code voor combobox if (diagnosis.code_code && diagnosis.code_display) { setSelectedICD10Code({ code: diagnosis.code_code, display: diagnosis.code_display, keywords: [], }); } } else { // Nieuw: reset naar defaults reset(diagnosisDefaults); setSelectedICD10Code(null); } } else { // Modal gesloten: reset reset(diagnosisDefaults); setSelectedICD10Code(null); } }, [open, diagnosis, reset, setValue]); const handleICD10Select = (code: ICD10Code) => { setSelectedICD10Code(code); setValue('code', code.code); setValue('description', code.display); }; const onSubmit = async (data: DiagnosisFormData) => { setIsSubmitting(true); try { if (isEditMode && diagnosis) { // Update bestaande diagnose const result = await updateDiagnosis(diagnosis.id, { code: data.code, description: data.description, severity: data.severity, status: data.status, notes: data.notes || undefined, diagnosisType: data.diagnosisType, }); if (!result.success) { toast({ variant: 'destructive', title: 'Bijwerken mislukt', description: result.error || 'Er ging iets mis bij het bijwerken.', }); return; } toast({ title: 'Diagnose bijgewerkt', description: `${data.code} — ${data.description} is aangepast.`, }); } else { // Create nieuwe diagnose await createDiagnosis({ patientId, intakeId, code: data.code, description: data.description, severity: data.severity, status: data.status, notes: data.notes || undefined, diagnosisType: data.diagnosisType, }); toast({ title: 'Diagnose opgeslagen', description: `${data.code} — ${data.description} is toegevoegd.`, }); } onSuccess(); onOpenChange(false); } catch (error) { toast({ variant: 'destructive', title: 'Opslaan mislukt', description: error instanceof Error ? error.message : 'Er ging iets mis bij het opslaan.', }); } finally { setIsSubmitting(false); } }; return ( {isEditMode ? 'Diagnose bewerken' : 'Nieuwe diagnose'}
{/* ICD-10 Code */}
{errors.code && (

{errors.code.message}

)} {errors.description && (

{errors.description.message}

)}
{/* Ernst en Diagnose type */}
{errors.severity && (

{errors.severity.message}

)}
{DIAGNOSIS_TYPES.map((type) => (
setValue('diagnosisType', e.target.value as 'primary' | 'secondary')} disabled={isSubmitting} className="h-4 w-4 text-teal-600 focus:ring-teal-500" />
))}
{errors.diagnosisType && (

{errors.diagnosisType.message}

)}
{/* Status */}
{errors.status && (

{errors.status.message}

)}
{/* DSM-5 referentie */}
{errors.dsm5Reference && (

{errors.dsm5Reference.message}

)}
{/* Onderbouwing */}