import { useState, FormEvent } from 'react'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { toast } from 'sonner'; import api, { getErrorMessage } from '@/lib/api'; import type { ProjectTask, Person } from '@/types'; import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetFooter, SheetClose, } from '@/components/ui/sheet'; import { Input } from '@/components/ui/input'; import { Textarea } from '@/components/ui/textarea'; import { Select } from '@/components/ui/select'; import { Label } from '@/components/ui/label'; import { Button } from '@/components/ui/button'; interface TaskFormProps { projectId: number; task: ProjectTask | null; parentTaskId?: number | null; defaultDueDate?: string; onClose: () => void; } export default function TaskForm({ projectId, task, parentTaskId, defaultDueDate, onClose }: TaskFormProps) { const queryClient = useQueryClient(); const [formData, setFormData] = useState({ title: task?.title || '', description: task?.description || '', status: task?.status || 'pending', priority: task?.priority || 'medium', due_date: task?.due_date ? task.due_date.slice(0, 10) : (!task && defaultDueDate ? defaultDueDate.slice(0, 10) : ''), person_id: task?.person_id?.toString() || '', }); const { data: people = [] } = useQuery({ queryKey: ['people'], queryFn: async () => { const { data } = await api.get('/people'); return data; }, }); const mutation = useMutation({ mutationFn: async (data: typeof formData) => { const payload: Record = { ...data, person_id: data.person_id ? parseInt(data.person_id) : null, }; if (task) { const response = await api.put(`/projects/${projectId}/tasks/${task.id}`, payload); return response.data; } else { if (parentTaskId) { payload.parent_task_id = parentTaskId; } const response = await api.post(`/projects/${projectId}/tasks`, payload); return response.data; } }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['projects', projectId.toString()] }); toast.success(task ? 'Task updated' : 'Task created'); onClose(); }, onError: (error) => { toast.error(getErrorMessage(error, task ? 'Failed to update task' : 'Failed to create task')); }, }); const deleteMutation = useMutation({ mutationFn: async () => { await api.delete(`/projects/${projectId}/tasks/${task!.id}`); }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['projects', projectId.toString()] }); toast.success('Task deleted'); onClose(); }, onError: () => { toast.error('Failed to delete task'); }, }); const handleSubmit = (e: FormEvent) => { e.preventDefault(); mutation.mutate(formData); }; return ( {task ? 'Edit Task' : parentTaskId ? 'New Subtask' : 'New Task'}
setFormData({ ...formData, title: e.target.value })} required />