import { useState } from 'react' import { Box, TextField, Button, FormControl, InputLabel, Select, MenuItem, Paper, Typography, Alert, type SelectChangeEvent, } from '@mui/material' import { useNavigate } from 'react-router' import type { CreateTaskRequest, Task } from '~/types/task' import { TaskStatus } from '~/types/task' import { useTasks } from '~/hooks/useTasks' interface TaskFormProps { task?: Task onSuccess?: (task: Task) => void onCancel?: () => void inline?: boolean } interface FormData { title: string description: string status: TaskStatus } interface FormErrors { title?: string description?: string } export function TaskForm({ task, onSuccess, onCancel, inline = false, }: TaskFormProps) { const navigate = useNavigate() const { createTask, loading, error } = useTasks({ autoFetch: false }) const [formData, setFormData] = useState({ title: task?.title || '', description: task?.description || '', status: task?.status || TaskStatus.Todo, }) const [errors, setErrors] = useState({}) const [isSubmitting, setIsSubmitting] = useState(false) const validateForm = (): boolean => { const newErrors: FormErrors = {} if (!formData.title.trim()) { newErrors.title = 'Title is required' } else if (formData.title.trim().length < 3) { newErrors.title = 'Title must be at least 3 characters long' } else if (formData.title.trim().length > 200) { newErrors.title = 'Title must be less than 200 characters' } if (formData.description.length > 1000) { newErrors.description = 'Description must be less than 1000 characters' } setErrors(newErrors) return Object.keys(newErrors).length === 0 } const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() if (!validateForm()) { return } setIsSubmitting(true) try { if (task) { // Update existing task - for now we only support create // This would use updateTask hook when implemented console.log('Update not implemented yet') } else { // Create new task const createData: CreateTaskRequest = { title: formData.title.trim(), description: formData.description.trim() || undefined, } const newTask = await createTask(createData) if (newTask) { if (onSuccess) { onSuccess(newTask) } else { navigate('/') } } } } catch (err) { console.error('Form submission error:', err) } finally { setIsSubmitting(false) } } const handleCancel = () => { if (onCancel) { onCancel() } else { navigate('/') } } const handleInputChange = (field: keyof FormData) => (e: React.ChangeEvent) => { setFormData(prev => ({ ...prev, [field]: e.target.value, })) // Clear error for this field when user starts typing if (errors[field as keyof FormErrors]) { setErrors(prev => ({ ...prev, [field]: undefined, })) } } const handleStatusChange = (event: SelectChangeEvent) => { setFormData(prev => ({ ...prev, status: event.target.value as TaskStatus, })) } const content = ( {task ? 'Edit Task' : 'Create New Task'} {error && ( {error} )} {task && ( Status )} ) if (inline) { return content } return ( {content} ) }