'use client'; /** * Diagnosis Manager Component * * Beheert de lijst van diagnoses met modal voor toevoegen/bewerken en cards voor weergave. */ import { useState, useMemo } from 'react'; import { useTransition } from 'react'; import { Plus, Loader2, AlertTriangle } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { DiagnosisCard } from './diagnosis-card'; import { DiagnosisModal } from './diagnosis-modal'; import { deleteDiagnosis, type Condition } from '../../actions'; import { toast } from '@/hooks/use-toast'; interface DiagnosisManagerProps { patientId: string; intakeId: string; diagnoses: Condition[]; } export function DiagnosisManager({ patientId, intakeId, diagnoses }: DiagnosisManagerProps) { const [modalOpen, setModalOpen] = useState(false); const [editingDiagnosis, setEditingDiagnosis] = useState(); const [deletingId, setDeletingId] = useState(null); const [showDeleteConfirm, setShowDeleteConfirm] = useState(false); const [isPending, startTransition] = useTransition(); // Sorteer diagnoses: hoofddiagnoses eerst, dan op datum const sortedDiagnoses = useMemo(() => { return [...diagnoses].sort((a, b) => { // Hoofddiagnoses eerst const aIsPrimary = a.category === 'primary-diagnosis'; const bIsPrimary = b.category === 'primary-diagnosis'; if (aIsPrimary && !bIsPrimary) return -1; if (!aIsPrimary && bIsPrimary) return 1; // Dan op datum (nieuwste eerst) const aDate = a.recorded_date ? new Date(a.recorded_date).getTime() : 0; const bDate = b.recorded_date ? new Date(b.recorded_date).getTime() : 0; return bDate - aDate; }); }, [diagnoses]); const handleNewDiagnosis = () => { setEditingDiagnosis(undefined); setModalOpen(true); }; const handleEditDiagnosis = (diagnosis: Condition) => { setEditingDiagnosis(diagnosis); setModalOpen(true); }; const handleDeleteClick = (diagnosisId: string) => { setDeletingId(diagnosisId); setShowDeleteConfirm(true); }; const handleDeleteConfirm = () => { if (!deletingId) return; startTransition(async () => { try { await deleteDiagnosis(patientId, intakeId, deletingId); toast({ title: 'Diagnose verwijderd', description: 'De diagnose is succesvol verwijderd.', }); setShowDeleteConfirm(false); setDeletingId(null); } catch (error) { toast({ variant: 'destructive', title: 'Verwijderen mislukt', description: error instanceof Error ? error.message : 'Er ging iets mis bij het verwijderen.', }); setDeletingId(null); } }); }; const handleModalSuccess = () => { setModalOpen(false); setEditingDiagnosis(undefined); // Toast wordt al getoond door de modal }; const diagnosisToDelete = deletingId ? diagnoses.find((d) => d.id === deletingId) : null; return (
{/* Header met button */}

Diagnoses ({diagnoses.length})

{/* Diagnoses lijst */} {sortedDiagnoses.length === 0 ? (

Nog geen diagnoses geregistreerd.

Klik op "Nieuwe diagnose" om er een toe te voegen.

) : (
{sortedDiagnoses.map((diagnosis) => { const isPrimary = diagnosis.category === 'primary-diagnosis'; return ( handleEditDiagnosis(diagnosis)} onDelete={() => handleDeleteClick(diagnosis.id)} isDeleting={deletingId === diagnosis.id && isPending} /> ); })}
)} {/* Diagnosis Modal */} {/* Delete Confirmation Dialog */} Diagnose verwijderen?

Weet je zeker dat je deze diagnose wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.

{diagnosisToDelete && (
{diagnosisToDelete.code_code} — {diagnosisToDelete.code_display}
{diagnosisToDelete.severity_display && (
Ernst: {diagnosisToDelete.severity_display}
)}
)}
); }