From b091e8d20d956d2139e6a31880b7bce60629e27a Mon Sep 17 00:00:00 2001 From: Sergey Elpashev Date: Wed, 23 Apr 2025 16:09:41 +0300 Subject: [PATCH] feat: create task form --- src/components/task.tsx | 6 +-- src/pages/profile_tasks.tsx | 104 +++++++++++++++++++++--------------- 2 files changed, 63 insertions(+), 47 deletions(-) diff --git a/src/components/task.tsx b/src/components/task.tsx index 103eb76..2935c4f 100644 --- a/src/components/task.tsx +++ b/src/components/task.tsx @@ -31,14 +31,14 @@ const markStyle = tv({ const Task: FunctionComponent = ({ name, checked = false, onClick = () => {} }: TaskProps) => { return ( // Временное действие для тестирования - + ); }; diff --git a/src/pages/profile_tasks.tsx b/src/pages/profile_tasks.tsx index e22b9bf..2bda06a 100644 --- a/src/pages/profile_tasks.tsx +++ b/src/pages/profile_tasks.tsx @@ -18,7 +18,7 @@ import { PencilIcon, } from "@heroicons/react/24/outline"; import { FunctionComponent } from "preact"; -import { useEffect, useMemo, useRef, useState } from "preact/hooks"; +import { useEffect, useMemo, useState } from "preact/hooks"; import { Nullable } from "primereact/ts-helpers"; import { SubmitHandler, useForm } from "react-hook-form"; import { ITask, ITaskForm } from "./profile_tasks.dto"; @@ -58,9 +58,7 @@ const ProfileTasks: FunctionComponent = () => { const [isEditModal, setIsEditModal] = useState(false); // Включено редактирование задачи const [isCreating, setIsCreating] = useState(false); // Включено создание задачи const [editContent, setEditContent] = useState(null); // Содержимое редактируемой задачи - const taskNameRef = useRef(null); - const taskDescriptionRef = useRef(null); - const [calendarDate, setCalendarDate] = useState>(); + const [calendarDate, setCalendarDate] = useState>(); // Выбранная в календаре дата const getDate = useMemo(() => { const date = new Date(); const formatter = new Intl.DateTimeFormat("ru-RU", { month: "long", day: "numeric" }); @@ -81,17 +79,22 @@ const ProfileTasks: FunctionComponent = () => { handleSubmit, register, reset, + setError, formState: { errors }, } = useForm({ defaultValues: { tags: [], }, }); - const saveEdited: SubmitHandler = (data) => { - if (!editContent) return; - const editedTask: ITask = { ...data, date: new Date(data.date) }; - setTasks(tasks.map((task) => (task.id === editedTask.id ? editedTask : task))); - setIsEditModal(false); + const saveTask: SubmitHandler = (data) => { + if (!calendarDate) { + setError("date", { message: "Выберите дату" }); + return; + } + const eTask: ITask = { ...data, date: calendarDate }; + if (isCreating) setTasks([...tasks, eTask]); + else setTasks(tasks.map((task) => (task.id === eTask.id ? eTask : task))); + if (isCreating) setIsOpen(false); }; useEffect(() => { if (editContent) reset({ ...editContent, date: editContent.date.toISOString().slice(0, 16) }); @@ -100,6 +103,15 @@ const ProfileTasks: FunctionComponent = () => { useEffect(() => { if (calendarDate && editContent) setEditContent({ ...editContent, date: calendarDate }); }, [calendarDate]); + useEffect(() => { + reset({ + name: "", + description: "", + date: "", + tags: ["Тег1", "Тег2"], + checked: false, + }); + }, [isCreating]); return (
{ }} > {isEdit && editContent && ( -
e.preventDefault()}> + { + e.preventDefault(); + if (isEditModal) handleSubmit(saveTask)(); + else setIsEditModal(!isEditModal); + }} + >
{
{ - if (isEditModal) handleSubmit(saveEdited)(); - else setIsEditModal(!isEditModal); + if (isEditModal) { + handleSubmit(saveTask)(); + setIsEditModal(!isEditModal); + } else setIsEditModal(!isEditModal); }} > {isEditModal ? ( @@ -210,16 +231,34 @@ const ProfileTasks: FunctionComponent = () => { )} {isCreating && ( -
+
{ + e.preventDefault(); + handleSubmit((data) => saveTask({ ...data, id: tasks.length + 1 }))(); + }} + >
- +