"use client"; import { useEffect, useMemo, useState } from "react"; import { trpc } from "@/app/_trpc/client"; import { useToast } from "@/components/ui/use-toast"; import { formatDate } from "@/lib/utils"; import useFormHandler from "@/hooks/useFormHandler"; import { createTaskSchema } from "@/lib/schemas/taskSchema"; import { ProjectDetail } from "@/server/project/domain/models"; import { z } from "zod"; export default function useCreateTask(currentSingleProject?: ProjectDetail) { const [open, setOpen] = useState(false); const { toast } = useToast(); const [selectedProject, setSelectedProject] = useState(null); const defaultValues: z.infer = { projectId: "", areaName: "", floorName: "", projectName: "", startDate: formatDate(new Date()), expireDate: undefined, priority: "baja", comments: "", userId: "", areaId: "", }; const { data: users, isPending: isPendingUsers } = trpc.users.getUsers.useQuery(); const { data: projectsFetched, isPending: isPendingProjects } = trpc.projects.getProjects.useQuery( { limit: 50, includeAreas: true, includeFloor: true, includeTasks: true }, { refetchOnMount: false, refetchOnWindowFocus: false } ); const { projects } = projectsFetched || {}; const utils = trpc.useUtils(); const { form, isInputChanged, setIsInputChanged } = useFormHandler(createTaskSchema, defaultValues); const projectId = form.watch("projectId"); const { mutate: createTask, isPending } = trpc.tasks.createTask.useMutation({ onSuccess: () => { setOpen(false); utils.tasks.getProjectTasks.invalidate(); if (form.getValues("projectId")) { const projectId = form.getValues("projectId"); utils.projects.getProjectById.invalidate({ value: projectId }); } form.reset(); toast({ title: "Nueva tarea", description: "Tarea creada con éxito" }); setIsInputChanged(false); }, onError: (opts) => { console.log('err assing',opts.data) const message = opts?.data?.code === "CONFLICT" ? "Reasigne, modifique o elimine la tarea ya asignada" : "Error inesperado, por favor inténtelo más tarde"; toast({ title: opts?.message, description: message, variant: "destructive" }); }, }); useEffect(() => { if (currentSingleProject) { form.setValue("projectId", currentSingleProject.id); form.setValue("projectName", currentSingleProject.name); form.setValue("areaId", currentSingleProject.id); setSelectedProject(currentSingleProject); } }, [projectId, currentSingleProject, form]); useEffect(() => { if (selectedProject) { form.setValue("projectId", selectedProject.id); form.setValue("projectName", selectedProject.name); } }, [selectedProject, form]); useMemo(() => { const newSelectedProject = projects?.find((project: any) => project.id === projectId) || []; setSelectedProject(newSelectedProject); }, [projectId, projects]); const floorName = form.watch("floorName"); const selectedAreas = useMemo(() => { if (!floorName) return; const floor = selectedProject?.floor?.find((floor: any) => floor.name === floorName); return floor?.areas; }, [floorName, selectedProject]); const areaId = form.watch("areaId"); useMemo(() => { const currentAreaName = selectedAreas?.find((item: any) => item.id === areaId)?.type; if (!currentAreaName) return; form.setValue("areaName", currentAreaName); }, [selectedAreas, areaId, form]); const onSubmit = (values: z.infer) => { createTask(values); }; return { open, setOpen, users, isPendingUsers, projects, isPendingProjects, form, isPending, onSubmit, isInputChanged, selectedProject, selectedAreas }; }