task-managment / src / hooks / useCreateTask.ts
useCreateTask.ts
Raw
"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
  };
}