'use client'; /** * AISummaryBlock Component * E5.S4: AI Samenvatting met bronverwijzingen */ import { useState } from 'react'; import { Sparkles, Loader2, AlertTriangle, CheckCircle2, Clock, ExternalLink, RefreshCw, } from 'lucide-react'; import type { AISamenvatting, Aandachtspunt } from '@/lib/types/overdracht'; interface AISummaryBlockProps { patientId: string; } function formatDuration(ms: number): string { if (ms < 1000) return `${ms}ms`; return `${(ms / 1000).toFixed(1)}s`; } function formatTime(datetime: string): string { return new Date(datetime).toLocaleTimeString('nl-NL', { hour: '2-digit', minute: '2-digit', }); } function getBronTypeLabel(type: string): string { const labels: Record = { observatie: 'Vitale functie', rapportage: 'Rapportage', dagnotitie: 'Dagnotitie', risico: 'Risicobeoordeling', }; return labels[type] || type; } function getBronTypeStyle(type: string): { bg: string; text: string } { switch (type) { case 'observatie': return { bg: 'bg-teal-100', text: 'text-teal-700' }; case 'rapportage': return { bg: 'bg-indigo-100', text: 'text-indigo-700' }; case 'dagnotitie': return { bg: 'bg-amber-100', text: 'text-amber-700' }; case 'risico': return { bg: 'bg-red-100', text: 'text-red-700' }; default: return { bg: 'bg-slate-100', text: 'text-slate-700' }; } } export function AISummaryBlock({ patientId }: AISummaryBlockProps) { const [summary, setSummary] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); async function generateSummary() { setLoading(true); setError(null); try { const response = await fetch('/api/overdracht/generate', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ patientId }), }); if (!response.ok) { const data = await response.json(); throw new Error(data.error || 'Fout bij genereren samenvatting'); } const data: AISamenvatting = await response.json(); setSummary(data); } catch (err) { setError(err instanceof Error ? err.message : 'Onbekende fout'); } finally { setLoading(false); } } return (
{/* Header */}

AI Samenvatting

Gegenereerd met Claude AI

{/* Content */} {!summary && !loading && !error && (

Genereer een beknopte overdracht samenvatting op basis van alle beschikbare patiëntgegevens.

)} {loading && (

Samenvatting wordt gegenereerd...

Dit duurt meestal 3-5 seconden

)} {error && (

Fout bij genereren

{error}

)} {summary && (
{/* Samenvatting */}

Samenvatting

{summary.samenvatting}

{/* Aandachtspunten */} {summary.aandachtspunten.length > 0 && (

Aandachtspunten ({summary.aandachtspunten.length})

{summary.aandachtspunten.map((punt, index) => ( ))}
)} {/* Actiepunten */} {summary.actiepunten.length > 0 && (

Actiepunten ({summary.actiepunten.length})

    {summary.actiepunten.map((actie, index) => (
  • {actie}
  • ))}
)} {/* Footer */}
Gegenereerd om {formatTime(summary.generatedAt)} ({formatDuration(summary.durationMs)})
)}
); } function AandachtspuntItem({ punt }: { punt: Aandachtspunt }) { const bronStyle = getBronTypeStyle(punt.bron.type); return (

{punt.urgent && ( )} {punt.tekst}

{getBronTypeLabel(punt.bron.type)} {punt.bron.label} • {punt.bron.datum}
); }