task-managment / src / app / dashboard / users / hooks / useUpdateUserForm.ts
useUpdateUserForm.ts
Raw
import { useState, useEffect } from "react";
import { z } from "zod";
import { trpc } from "@/app/_trpc/client";
import { useToast } from "@/components/ui/use-toast";
import { useRouter } from "next/navigation";
import useFormHandler from "@/hooks/useFormHandler";
import { userSchema } from "@/lib/schemas/userSchema";
import { User } from "@/server/user/domain/models";
import { Users } from "lucide-react";

interface UpdateUserHookProps {
  selectedUser: {
    userId: string;
    currentRol: any;
    email: string;
    firstName: string;
    lastName: string;
  };
  onClose: () => void;
  handleUpdateUser:(userList:User)=>void;
  users:User[]
}

export const useUpdateUserForm = ({
  selectedUser,
  onClose,
  users,
  handleUpdateUser
}: UpdateUserHookProps) => {
  const { toast } = useToast();
  const router = useRouter();
  const utils = trpc.useUtils();

  const defaultValues: z.infer<typeof userSchema> = {
    id:selectedUser?.userId,
    firstName: selectedUser?.firstName || "",
    lastName: selectedUser?.lastName || "",
    email: selectedUser?.email || "",
    rol: selectedUser?.currentRol,
  };

  const { form, isInputChanged, setIsInputChanged, getChangedFields } =
    useFormHandler(userSchema, defaultValues);

  const { mutate: updateUser, isPending } = trpc.users.updateUser.useMutation({
    onSuccess: (data) => {
      handleUpdateUser(data as any)
      toast({
        title: "Éxito",
        description: "Usuario actualizado con éxito",
      });
      onClose();
      setIsInputChanged(false);
    },
    onError: (opts) => {
      toast({
        title: "Error",
        description: opts?.message,
        variant: "destructive",
      });
    },
  });

  useEffect(() => {
    if (!selectedUser) return;
    form.setValue("email", selectedUser.email);
    form.setValue("firstName", selectedUser.firstName);
    form.setValue("lastName", selectedUser.lastName);
    form.setValue("rol", selectedUser.currentRol);
  }, [selectedUser, form]);

  const handleSubmit = (data: z.infer<typeof userSchema>) => {
    const changedValues = getChangedFields(data);
    if (!Object.values(changedValues)?.length) {
      return;
    }
    updateUser({ ...changedValues, id: selectedUser?.userId } as any);
  };

  return {
    form,
    isInputChanged,
    isPending,
    handleSubmit,
  };
};