import React from "react"; import { Controller, useForm } from "react-hook-form"; import type { Task } from "../utils/types"; import { useRef } from "react"; import { useContext } from "react"; import { UserContext } from "../contexts/userContext"; import { TaskContext } from "../contexts/taskContext"; import { Autocomplete, Button, Card, CardHeader, Skeleton, TextField, } from "@mui/material"; import { DatePicker } from "@mui/x-date-pickers/DatePicker"; import { validateDueDate } from "../utils/validation"; import type { Dayjs } from "dayjs"; type FormValues = { text: string; assignedTo: number; dueDate: Dayjs; }; const TaskForm: React.FC = () => { const { register, handleSubmit, control, reset, formState: { errors: formErrors }, } = useForm(); const { users, loading, error } = useContext(UserContext); const { tasks, setTasks } = useContext(TaskContext); const creationDate = useRef(new Date()); function addTask(data: FormValues) { creationDate.current = new Date(); const currentIdMaxId = Math.max(...tasks.map((task) => task.id)) + 1; const newId = Math.max(currentIdMaxId, 1); const newTask: Task = { id: newId, assignedTo: Number(data.assignedTo), due: data.dueDate.format("YYYY-MM-DD"), text: data.text, createdAt: creationDate, finished: false, }; setTasks((prev) => [...prev, newTask]); reset(); } if (loading) return ; // TODO Better error display if (users == null) return
{error}
; return (
( ({ label: user.name, id: user.id, }))} getOptionLabel={(option) => option.label} onChange={(_, data) => field.onChange(data?.id || "")} renderInput={(params) => ( )} /> )} /> ( field.onChange(date)} slotProps={{ textField: { fullWidth: true, error: !!formErrors.dueDate, helperText: formErrors.dueDate?.message, }, }} /> )} />
); }; export default TaskForm;