import Task from "@/components/task"; import ModalCalendar from "@/components/ModalCalendar"; import Button from "@/components/ui/Button"; import ModalWindow from "@/components/ui/Modal"; import { withTitle } from "@/constructors/Component"; import { UrlsTitle } from "@/enums/urls"; import { cn } from "@/utils/class-merge"; import { PlusIcon } from "@heroicons/react/20/solid"; import { BookmarkIcon, BookOpenIcon, CalendarDaysIcon, DocumentDuplicateIcon, FunnelIcon, InboxArrowDownIcon, MagnifyingGlassIcon, PencilIcon, } from "@heroicons/react/24/outline"; import { FunctionComponent } from "preact"; 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"; import classes from "./profile_tasks.module.scss"; const example_tasks: ITask[] = [ { checked: false, date: new Date(), description: "test", id: 1, name: "test1", tags: ["Программирование", "Лабораторная работа"], }, { checked: true, date: new Date(2025, 6, 2), description: "test2", id: 3, name: "test3", tags: ["Информатика", "Практическая работа"], }, { checked: false, date: new Date(2025, 5, 1), description: "test3", id: 2, name: "test2", tags: ["Математика", "Домашнее задание"], }, ]; const ProfileTasks: FunctionComponent = () => { const [openModal, setIsOpen] = useState(false); // Открыта модалка const [openModalCalendar, setOpenModalCalendar] = useState(false); // Открыта модалка календаря const [isEdit, setIsEdit] = useState(false); // Открыта задача const [isEditModal, setIsEditModal] = useState(false); // Включено редактирование задачи const [isCreating, setIsCreating] = useState(false); // Включено создание задачи const [editContent, setEditContent] = useState(null); // Содержимое редактируемой задачи const [calendarDate, setCalendarDate] = useState>(); // Выбранная в календаре дата const getDate = useMemo(() => { const date = new Date(); const formatter = new Intl.DateTimeFormat("ru-RU", { month: "long", day: "numeric" }); return formatter.format(date); }, []); const init_tasks: ITask[] = localStorage.getItem("tasks") ? JSON.parse(localStorage.getItem("tasks") as string) : example_tasks; init_tasks.forEach((task) => { task.date = new Date(task.date); }); const [tasks, setTasks] = useState(init_tasks); useEffect(() => { localStorage.setItem("tasks", JSON.stringify(tasks)); }, [tasks]); const { handleSubmit, register, reset, setError, formState: { errors }, } = useForm({ defaultValues: { tags: [], }, }); 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) }); else reset(); }, [editContent]); useEffect(() => { reset({ name: "", description: "", date: "", tags: ["Тег1", "Тег2"], checked: false, }); }, [isCreating]); return (
{ if (isEdit && !isEditModal) setCalendarDate(null); }} onChange={(e) => (isCreating || isEditModal) && setCalendarDate(e.value)} value={calendarDate!} /> { setIsEdit(false); setEditContent(null); setIsCreating(false); setIsEditModal(false); setCalendarDate(null); }} > {isEdit && editContent && (
{ e.preventDefault(); if (isEditModal) handleSubmit(saveTask)(); else setIsEditModal(!isEditModal); }} >