'use client'; import React, { useState, useEffect } from 'react'; import { format, addHours } from 'date-fns'; import { nl } from 'date-fns/locale'; import { Calendar, Clock, X, ArrowRight, AlertCircle, CheckCircle2 } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { rescheduleEncounter } from '@/app/epd/agenda/actions'; import { CalendarEvent } from '@/app/epd/agenda/types'; import { motion } from 'framer-motion'; interface AgendaRescheduleFormProps { prefillData?: { identifier?: { encounterId?: string; encounter?: CalendarEvent }; newDatetime?: { date: Date; time: string }; }; onClose?: () => void; } export function AgendaRescheduleForm({ prefillData, onClose }: AgendaRescheduleFormProps) { // Use encounter from prefill if provided directly (we might need to pass it in prefillData from parent) const encounter = prefillData?.identifier?.encounter; const encounterId = prefillData?.identifier?.encounterId; // State for new date/time const [date, setDate] = useState( prefillData?.newDatetime?.date ? format(prefillData.newDatetime.date, 'yyyy-MM-dd') : encounter ? format(new Date(encounter.start), 'yyyy-MM-dd') : format(new Date(), 'yyyy-MM-dd') ); const [time, setTime] = useState( prefillData?.newDatetime?.time ? prefillData.newDatetime.time : encounter ? format(new Date(encounter.start), 'HH:mm') : '09:00' ); const [isSubmitting, setIsSubmitting] = useState(false); const [isSuccess, setIsSuccess] = useState(false); const [error, setError] = useState(null); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!encounterId) { setError('Geen afspraak ID gevonden.'); return; } setIsSubmitting(true); setError(null); try { const startDate = new Date(`${date}T${time}`); // Keep same duration? For simplicty default to 1 hour or original duration if we knew it. // API rescheduleEncounter takes start/end. let endDate = addHours(startDate, 1); if (encounter && encounter.end) { const originalDuration = new Date(encounter.end).getTime() - new Date(encounter.start).getTime(); endDate = new Date(startDate.getTime() + originalDuration); } // Check if not in past if (startDate < new Date()) { setError('Kan niet verplaatsen naar een datum in het verleden.'); setIsSubmitting(false); return; } const result = await rescheduleEncounter( encounterId, startDate.toISOString(), endDate.toISOString() ); if (result.success) { setIsSuccess(true); setTimeout(() => onClose?.(), 2000); } else { setError(result.error || 'Kon de afspraak niet verzetten.'); } } catch (err) { console.error('Reschedule error:', err); setError('Er is een onverwachte fout opgetreden.'); } finally { setIsSubmitting(false); } }; if (isSuccess) { return (

Afspraak verzet

De afspraak is verplaatst naar {format(new Date(`${date}T${time}`), 'd MMMM HH:mm', { locale: nl })}.

); } if (!encounter && !encounterId) { return (

Geen afspraak gevonden om te verzetten.

); } // Calculate current date/time for display const currentStart = encounter ? new Date(encounter.start) : null; const currentStr = currentStart ? format(currentStart, 'd MMMM yyyy HH:mm', { locale: nl }) : 'Onbekend'; return ( {/* Header */}

Afspraak verzetten

{/* Form */}
{/* Info Card */}
{encounter &&

{encounter.title}

}
{currentStr}
{date && time ? format(new Date(`${date}T${time}`), 'd MMMM yyyy HH:mm', { locale: nl }) : '...'}
{error && (
{error}
)}
setDate(e.target.value)} className="pl-10 h-10 bg-white/50 backdrop-blur-sm border-black/10 focus:bg-white transition-colors" required />
setTime(e.target.value)} className="pl-10 h-10 bg-white/50 backdrop-blur-sm border-black/10 focus:bg-white transition-colors" required />
{/* Footer */}
); }