'use client'; import React, { useState, useEffect } from 'react'; import { AppointmentTypeCode, LocationClassCode, CalendarEvent } from '@/app/epd/agenda/types'; import { AgendaListView } from './agenda-list-view'; import { AgendaCreateForm } from './agenda-create-form'; import { AgendaCancelView } from './agenda-cancel-view'; import { AgendaRescheduleForm } from './agenda-reschedule-form'; import { AgendaErrorState } from './agenda-error-state'; import { motion, AnimatePresence } from 'framer-motion'; import { Loader2 } from 'lucide-react'; export interface AgendaBlockProps { mode: 'list' | 'create' | 'cancel' | 'reschedule'; appointments?: CalendarEvent[]; dateRange?: { start?: Date; end?: Date; label: string }; prefillData?: { patient?: { id: string; name: string }; datetime?: { date: Date; time: string }; type?: AppointmentTypeCode; location?: LocationClassCode; notes?: string; identifier?: { encounterId?: string; encounter?: CalendarEvent }; newDatetime?: { date: Date; time: string }; }; disambiguationOptions?: CalendarEvent[]; onClose?: () => void; } export function AgendaBlock({ mode, appointments: initialAppointments, dateRange: initialDateRange, prefillData, disambiguationOptions, onClose, }: AgendaBlockProps) { // State for fetched appointments (only used in list mode) const [appointments, setAppointments] = useState(initialAppointments); const [dateRange, setDateRange] = useState<{ start?: Date; end?: Date; label: string } | undefined>(initialDateRange); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(null); const [refetchKey, setRefetchKey] = useState(0); // Fetch appointments when in list mode and no appointments are provided // Server-side bepaalt de datum (consistent met EPD agenda) useEffect(() => { if (mode !== 'list') return; if (initialAppointments && initialAppointments.length > 0) return; const fetchAppointments = async () => { setIsLoading(true); setError(null); try { // Build query params - server bepaalt de datum const params = new URLSearchParams(); // Stuur alleen label naar server, server berekent de datums if (initialDateRange?.label) { params.set('label', initialDateRange.label); } // Als geen label en geen expliciete datums, server defaults naar vandaag const response = await fetch(`/api/cortex/agenda?${params}`); if (!response.ok) { const errorData = await response.json(); throw new Error(errorData.error || 'Kon afspraken niet laden'); } const data = await response.json(); setAppointments(data.appointments || []); // Update dateRange met server-side berekende waarden if (data.dateRange) { setDateRange({ start: new Date(data.dateRange.start), end: new Date(data.dateRange.end), label: data.dateRange.label, }); } } catch (err) { console.error('Error fetching appointments:', err); setError(err instanceof Error ? err.message : 'Er ging iets mis'); } finally { setIsLoading(false); } }; fetchAppointments(); }, [mode, initialAppointments, initialDateRange, refetchKey]); const renderContent = () => { switch (mode) { case 'list': if (isLoading) { return (

Afspraken laden...

); } if (error) { return ( { setError(null); setRefetchKey((k) => k + 1); // Trigger refetch }} /> ); } return ( console.log('Cancel requested', evt)} onViewDetails={(evt) => window.location.href = `/epd/agenda?focus=${evt.id}`} /> ); case 'create': return ; case 'cancel': return ( ); case 'reschedule': return ; default: return
Unknown mode: {mode}
; } }; return ( {renderContent()} ); }