"use client"; import { Select, SelectItem } from "@heroui/select"; import { zodResolver } from "@hookform/resolvers/zod"; import { ShieldIcon, UserIcon } from "lucide-react"; import { Dispatch, SetStateAction } from "react"; import { Controller, useForm } from "react-hook-form"; import * as z from "zod"; import { updateUser, updateUserRole } from "@/actions/users/users"; import { SaveIcon } from "@/components/icons"; import { useToast } from "@/components/ui"; import { CustomButton, CustomInput } from "@/components/ui/custom"; import { Form } from "@/components/ui/form"; import { editUserFormSchema } from "@/types"; export const EditForm = ({ userId, userName, userEmail, userCompanyName, roles = [], currentRole = "", setIsOpen, }: { userId: string; userName?: string; userEmail?: string; userCompanyName?: string; roles: Array<{ id: string; name: string }>; currentRole?: string; setIsOpen: Dispatch>; }) => { const formSchema = editUserFormSchema(); const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: { userId: userId, name: userName, email: userEmail, company_name: userCompanyName, role: roles.find((role) => role.name === currentRole)?.id || "", }, }); const { toast } = useToast(); const isLoading = form.formState.isSubmitting; const onSubmitClient = async (values: z.infer) => { const formData = new FormData(); // Update basic user data if (values.name !== undefined) { formData.append("name", values.name); } if (values.email !== undefined) { formData.append("email", values.email); } if (values.company_name !== undefined) { formData.append("company_name", values.company_name); } // Always include userId formData.append("userId", userId); // Handle role updates separately if (values.role !== roles.find((role) => role.name === currentRole)?.id) { const roleFormData = new FormData(); roleFormData.append("userId", userId); roleFormData.append("roleId", values.role || ""); const roleUpdateResponse = await updateUserRole(roleFormData); if (roleUpdateResponse?.errors && roleUpdateResponse.errors.length > 0) { const error = roleUpdateResponse.errors[0]; toast({ variant: "destructive", title: "Role Update Failed", description: `${error.detail}`, }); return; } } // Update other user attributes const data = await updateUser(formData); if (data?.errors && data.errors.length > 0) { const error = data.errors[0]; const errorMessage = `${error.detail}`; // Show error toast({ variant: "destructive", title: "Oops! Something went wrong", description: errorMessage, }); } else { toast({ title: "Success!", description: "The user was updated successfully.", }); setIsOpen(false); // Close the modal on success } }; return (
Name: {userName}
Role: {currentRole ? currentRole : "No role"} {currentRole}
( )} /> {form.formState.errors.role && (

{form.formState.errors.role.message}

)}
setIsOpen(false)} isDisabled={isLoading} > Cancel } > {isLoading ? <>Loading : Save}
); };