'use client'; import React, { useState } from 'react'; import { format } from 'date-fns'; import { nl } from 'date-fns/locale'; import { AlertTriangle, Calendar, Clock, X, CheckCircle2 } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group'; import { Label } from '@/components/ui/label'; import { cancelEncounter } from '@/app/epd/agenda/actions'; import { CalendarEvent, APPOINTMENT_TYPES, AppointmentTypeCode } from '@/app/epd/agenda/types'; interface AgendaCancelViewProps { disambiguationOptions?: CalendarEvent[]; prefillData?: { identifier?: { encounterId?: string }; }; onClose?: () => void; } export function AgendaCancelView({ disambiguationOptions, prefillData, onClose }: AgendaCancelViewProps) { const [selectedEncounterId, setSelectedEncounterId] = useState( prefillData?.identifier?.encounterId ); // If we have disambiguation options and no selection yet, default to first? // Better to let user choose. const [isSubmitting, setIsSubmitting] = useState(false); const [isSuccess, setIsSuccess] = useState(false); const [error, setError] = useState(null); // If there's only one option provided via disambiguationOptions (and no prefill), select it automatically? // Logic: if prefill encounterId is set, use that. // If not, and disambiguationOptions has 1 item, use that. // If not, wait for user selection. const effectiveEncounter = disambiguationOptions?.find(e => e.id === selectedEncounterId) || (disambiguationOptions?.length === 1 ? disambiguationOptions[0] : undefined); const handleCancel = async () => { const idToCancel = selectedEncounterId || effectiveEncounter?.id; if (!idToCancel) { setError('Selecteer eerst een afspraak om te annuleren.'); return; } setIsSubmitting(true); setError(null); try { const result = await cancelEncounter(idToCancel); if (result.success) { setIsSuccess(true); // Wait a moment before closing or let user close setTimeout(() => onClose?.(), 2000); } else { setError(result.error || 'Kon de afspraak niet annuleren.'); } } catch (err) { console.error('Cancel error:', err); setError('Er is een onverwachte fout opgetreden.'); } finally { setIsSubmitting(false); } }; if (isSuccess) { return (

Afspraak geannuleerd

De afspraak is succesvol verwijderd uit de agenda.

); } // Disambiguation Mode if (!effectiveEncounter && disambiguationOptions && disambiguationOptions.length > 1) { return (

Afspraak annuleren

Er zijn meerdere afspraken gevonden. Welke wil je annuleren?

{disambiguationOptions.map((evt) => { const encounter = evt.extendedProps.encounter; const typeCode = encounter.type_code as AppointmentTypeCode; const dateStr = format(new Date(evt.start), 'd MMM yyyy', { locale: nl }); const timeStr = format(new Date(evt.start), 'HH:mm'); return (
); })}
); } // Confirmation Mode (Single Match) if (effectiveEncounter) { const encounter = effectiveEncounter.extendedProps.encounter; const typeCode = encounter.type_code as AppointmentTypeCode; const dateStr = format(new Date(effectiveEncounter.start), 'EEEE d MMMM yyyy', { locale: nl }); const timeStr = format(new Date(effectiveEncounter.start), 'HH:mm'); const endTimeStr = effectiveEncounter.end ? format(new Date(effectiveEncounter.end), 'HH:mm') : ''; return (

Weet je het zeker?

Deze actie kan niet ongedaan worden gemaakt.

De afspraak wordt permanent uit de agenda verwijderd.

{effectiveEncounter.title}

{dateStr}
{timeStr} {endTimeStr && `- ${endTimeStr}`}
Type: {encounter.type_display || APPOINTMENT_TYPES[typeCode]}
{error && (
{error}
)}
); } // Fallback / Loading return (

Geen afspraak geselecteerd.

); }