import { useState, FormEvent } from 'react'; import type { CalendarEvent } from '../../types/calendar'; import { createEvent, updateEvent } from '../../api/calendar'; import { toast } from 'sonner'; const COLOR_SWATCHES = [ { label: 'Blue', value: 'blue', cls: 'bg-blue-500' }, { label: 'Green', value: 'green', cls: 'bg-green-500' }, { label: 'Red', value: 'red', cls: 'bg-red-500' }, { label: 'Purple', value: 'purple', cls: 'bg-purple-500' }, { label: 'Orange', value: 'orange', cls: 'bg-orange-500' }, { label: 'Pink', value: 'pink', cls: 'bg-pink-500' }, ]; interface Props { date: string; existing?: CalendarEvent; defaultType?: CalendarEvent['event_type']; onSuccess: () => void; onCancel: () => void; } export default function CalendarEventForm({ date, existing, defaultType = 'general', onSuccess, onCancel }: Props) { const [title, setTitle] = useState(existing?.title ?? ''); const [description, setDescription] = useState(existing?.description ?? ''); const [eventType, setEventType] = useState(existing?.event_type ?? defaultType); const [color, setColor] = useState(existing?.color ?? ''); const [startTime, setStartTime] = useState(existing?.start_time ?? ''); const [isCompleted, setIsCompleted] = useState(existing?.is_completed ?? false); const [submitting, setSubmitting] = useState(false); const handleSubmit = async (e: FormEvent) => { e.preventDefault(); if (!title.trim()) { toast.error('Title is required'); return; } setSubmitting(true); try { if (existing?.id) { await updateEvent(existing.id, { title: title.trim(), description: description.trim() || undefined, event_type: eventType, color: color || undefined, start_time: startTime || undefined, is_completed: isCompleted, }); toast.success('Event updated'); } else { await createEvent({ date, title: title.trim(), description: description.trim() || undefined, event_type: eventType, color: color || undefined, start_time: startTime || undefined, is_completed: isCompleted, }); toast.success('Event created'); } onSuccess(); } catch { toast.error('Failed to save event'); } finally { setSubmitting(false); } }; return (
setTitle(e.target.value)} className="w-full rounded-md border border-zinc-300 dark:border-zinc-600 bg-white dark:bg-zinc-800 px-3 py-2 text-sm text-zinc-900 dark:text-zinc-100 focus:outline-none focus:ring-2 focus:ring-primary" placeholder="Event title" required />