'use client'; import { useState } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { X } from 'lucide-react'; interface CreateTodoModalProps { onClose: () => void; onCreate: (todoData: any) => Promise; } export function CreateTodoModal({ onClose, onCreate }: CreateTodoModalProps) { const [title, setTitle] = useState(''); const [description, setDescription] = useState(''); const [priority, setPriority] = useState<'low' | 'medium' | 'high'>('medium'); const [dueDate, setDueDate] = useState(''); const [tags, setTags] = useState(''); const [isSubmitting, setIsSubmitting] = useState(false); const [errorMessage, setErrorMessage] = useState(''); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!title.trim()) return; setIsSubmitting(true); setErrorMessage(''); try { await onCreate({ title: title.trim(), description: description.trim() || null, priority, due_date: dueDate || null, tags: tags ? tags.split(',').map((t) => t.trim()).filter(Boolean) : null, }); // Clear form on success setTitle(''); setDescription(''); setPriority('medium'); setDueDate(''); setTags(''); // Success - modal will close via onCreate callback } catch (error: any) { console.error('Failed to create todo:', error); setErrorMessage(error?.message || 'Failed to create todo. Please try again.'); } finally { setIsSubmitting(false); } }; const priorityStyles = { low: { bg: 'bg-emerald-50 dark:bg-emerald-900/20', border: 'border-emerald-200 dark:border-emerald-800', text: 'text-emerald-700 dark:text-emerald-300', selected: 'bg-emerald-500 border-emerald-500 text-white dark:shadow-[0_0_15px_rgba(16,185,129,0.6)]' }, medium: { bg: 'bg-amber-50 dark:bg-amber-900/20', border: 'border-amber-200 dark:border-amber-800', text: 'text-amber-700 dark:text-amber-300', selected: 'bg-amber-500 border-amber-500 text-white dark:shadow-[0_0_15px_rgba(245,158,11,0.6)]' }, high: { bg: 'bg-rose-50 dark:bg-rose-900/20', border: 'border-rose-200 dark:border-rose-800', text: 'text-rose-700 dark:text-rose-300', selected: 'bg-rose-500 border-rose-500 text-white dark:shadow-[0_0_15px_rgba(244,63,94,0.6)]' } }; return ( {/* Backdrop */}
{/* Modal */} e.stopPropagation()} className="relative w-full max-w-md max-h-[90vh] sm:max-h-[85vh] flex flex-col" >
{/* Header */}

Create New Todo

{/* Form */}
{/* Error Message */} {errorMessage && (

{errorMessage}

)}
{/* Title */}
setTitle(e.target.value)} required placeholder="What needs to be done?" className="w-full px-3 py-2 text-sm border border-gray-300 dark:border-cyan-500/50 rounded-lg focus:ring-2 focus:ring-blue-500 dark:focus:ring-cyan-500 dark:focus:shadow-[0_0_10px_rgba(6,182,212,0.5)] bg-white dark:bg-gray-800 text-gray-900 dark:text-white transition-all" />
{/* Description */}