"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<boolean>(false);
const { toast } = useToast();
const [selectedProject, setSelectedProject] = useState<any>(null);
const defaultValues: z.infer<typeof createTaskSchema> = {
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<typeof createTaskSchema>) => {
createTask(values);
};
return {
open,
setOpen,
users,
isPendingUsers,
projects,
isPendingProjects,
form,
isPending,
onSubmit,
isInputChanged,
selectedProject,
selectedAreas
};
}