'use client'; /** * DiagnoseBlock * * Shows diagnoses for an intake: primary/secondary distinction, ICD-10 codes. * Uses Cortex shared components and hooks. * * Epic: E2.S3 - Intake Blocks */ import { useCortexStore } from '@/stores/cortex-store'; import { BlockContainer } from './block-container'; import { BLOCK_CONFIGS } from '@/lib/cortex/types'; import { Stethoscope, User, ExternalLink, Star, Activity, } from 'lucide-react'; // Use extracted hooks and components import { useBlockData, useIntakeContext, type IntakePrefillData } from '@/lib/cortex/hooks'; import { BlockLoading, BlockError, BlockEmpty, BlockSection, BlockItem, BlockFooter, type BadgeVariant, } from '@/components/cortex/shared'; // Import response type from API import type { IntakeDiagnoseResponse, DiagnosisItem } from '@/app/api/cortex/intake/diagnose/route'; // ============================================================================ // Types // ============================================================================ interface DiagnoseBlockProps { prefill?: IntakePrefillData; } // ============================================================================ // Sub-components // ============================================================================ function PrimaryDiagnosisCard({ diagnosis }: { diagnosis: DiagnosisItem }) { return (
Hoofddiagnose {diagnosis.code && ( {diagnosis.codeSystem}: {diagnosis.code} )}

{diagnosis.description}

{diagnosis.severity && (

Ernst: {diagnosis.severity}

)}
); } function getStatusBadgeVariant(status: string): BadgeVariant { switch (status) { case 'active': case 'recurrence': case 'relapse': return 'warning'; case 'resolved': case 'remission': return 'success'; case 'inactive': return 'default'; default: return 'default'; } } function getStatusLabel(status: string): string { const labels: Record = { active: 'Actief', recurrence: 'Recidief', relapse: 'Terugval', inactive: 'Inactief', remission: 'Remissie', resolved: 'Hersteld', }; return labels[status] || status; } function DiagnosisItemRow({ diagnosis }: { diagnosis: DiagnosisItem }) { const formatDate = (dateStr: string) => { if (!dateStr) return ''; return new Date(dateStr).toLocaleDateString('nl-NL', { day: 'numeric', month: 'short', year: 'numeric', }); }; const subtitle = [ diagnosis.code ? `${diagnosis.codeSystem}: ${diagnosis.code}` : null, formatDate(diagnosis.recordedDate), ] .filter(Boolean) .join(' • '); return ( ); } function DiagnosisSummary({ summary }: { summary: IntakeDiagnoseResponse['summary'] }) { return (
{summary.total} diagnose{summary.total !== 1 ? 's' : ''}
{summary.hasActiveConditions && ( Actieve condities )}
); } // ============================================================================ // Main Component // ============================================================================ export function DiagnoseBlock({ prefill }: DiagnoseBlockProps) { const config = BLOCK_CONFIGS.diagnose_query; const { closeBlock } = useCortexStore(); // Get patient context (from prefill or activePatient) const { patientId, patientName, hasPatientContext } = useIntakeContext(prefill); // Fetch diagnosis data const { data, isLoading, error, refetch } = useBlockData({ endpoint: '/api/cortex/intake/diagnose', params: { patientId: patientId || undefined, intakeId: prefill?.intakeId, }, enabled: hasPatientContext, operationName: 'Diagnoses laden', }); // No patient context if (!hasPatientContext) { return ( { closeBlock(); // TODO: Open zoeken block }, }} /> ); } // Loading state if (isLoading) { return ( ); } // Error state if (error) { return ( ); } // No data if (!data) { return ( ); } // Get secondary diagnoses (non-primary) const secondaryDiagnoses = data.diagnoses.filter((d) => !d.isPrimary); return (
{/* Patient name header */} {patientName && (
Patiënt: {patientName}
)} {/* Summary stats */} {/* Primary diagnosis */} {data.summary.primaryDiagnosis ? ( ) : (
Geen hoofddiagnose geregistreerd
)} {/* Secondary diagnoses */} {secondaryDiagnoses.length > 0 ? (
{secondaryDiagnoses.map((diagnosis) => ( ))}
) : data.diagnoses.length > 0 ? (
Geen nevendiagnoses geregistreerd
) : null} {/* No diagnoses at all */} {data.diagnoses.length === 0 && (

Nog geen diagnoses geregistreerd

)} {/* Footer with actions */} { // Navigate to diagnosis page const url = `/epd/patients/${data.patientId}/intakes/${data.intakeId}/diagnosis`; window.location.href = url; }, }} />
); }