'use client' import { useState } from 'react' import { useRouter } from 'next/navigation' import { createItem } from '@/lib/actions' import { Plus } from 'lucide-react' import { useToast } from './ToastContainer' import { validateItemTitle, sanitizeString } from '@/lib/validation' interface InlineItemCreateProps { listId: string } export default function InlineItemCreate({ listId }: InlineItemCreateProps) { const router = useRouter() const { showToast } = useToast() const [isCreating, setIsCreating] = useState(false) const [title, setTitle] = useState('') const [isSubmitting, setIsSubmitting] = useState(false) const [error, setError] = useState('') const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() // Validate title const validationResult = validateItemTitle(title) if (!validationResult.isValid) { setError(validationResult.error || 'Invalid title') return } if (isSubmitting) { return } setIsSubmitting(true) setError('') try { // Clear form immediately for better UX const itemTitle = sanitizeString(title) setTitle('') setIsCreating(false) // Create item and refresh await createItem(listId, itemTitle) showToast('Task added successfully', 'success') // Force immediate refresh router.refresh() } catch (error) { console.error('Error creating item:', error) const errorMessage = error instanceof Error ? error.message : 'Failed to add task' setError(errorMessage) showToast(errorMessage, 'error') // Restore form on error setIsCreating(true) } finally { setIsSubmitting(false) } } const handleCancel = () => { setTitle('') setIsCreating(false) } const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === 'Escape') { handleCancel() } } if (!isCreating) { return ( ) } return (
{ setTitle(e.target.value) setError('') }} onKeyDown={handleKeyDown} placeholder="Enter task title..." autoFocus maxLength={200} className={`w-full px-3 sm:px-4 py-3 border rounded-lg focus:outline-none focus:ring-2 text-sm sm:text-base ${ error ? 'border-red-500 focus:ring-red-500' : 'border-gray-300 focus:ring-blue-500' }`} aria-invalid={error ? 'true' : 'false'} aria-describedby={error ? 'inline-title-error' : undefined} /> {error && (

{error}

)}
) }