"use client"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { Dialog, DialogContent, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Checkbox } from "@/components/ui/checkbox"; import { useCreateUser, useUpdateUser } from "@/hooks/use-users"; import { useEffect } from "react"; import { User } from "@/types/user"; const userSchema = z.object({ username: z.string().min(3), email: z.string().email(), first_name: z.string().min(1), last_name: z.string().min(1), password: z.string().min(6).optional(), is_active: z.boolean().default(true), role_ids: z.array(z.number()).default([]), // Using role_ids array }); type UserFormData = z.infer; interface UserDialogProps { open: boolean; onOpenChange: (open: boolean) => void; user?: User | null; } export function UserDialog({ open, onOpenChange, user }: UserDialogProps) { const createUser = useCreateUser(); const updateUser = useUpdateUser(); const { register, handleSubmit, setValue, watch, reset, formState: { errors }, } = useForm({ resolver: zodResolver(userSchema), defaultValues: { is_active: true, role_ids: [] } }); useEffect(() => { if (user) { reset({ username: user.username, email: user.email, first_name: user.first_name, last_name: user.last_name, is_active: user.is_active, role_ids: user.roles?.map(r => r.role_id) || [] }); } else { reset({ username: "", email: "", first_name: "", last_name: "", is_active: true, role_ids: [] }); } }, [user, reset, open]); // Reset when open changes or user changes const availableRoles = [ { role_id: 1, role_name: "ADMIN", description: "System Administrator" }, { role_id: 2, role_name: "USER", description: "Regular User" }, { role_id: 3, role_name: "APPROVER", description: "Document Approver" }, ]; const selectedRoleIds = watch("role_ids") || []; const onSubmit = (data: UserFormData) => { if (user) { updateUser.mutate({ id: user.user_id, data }, { onSuccess: () => onOpenChange(false) }); } else { // eslint-disable-next-line @typescript-eslint/no-explicit-any createUser.mutate(data as any, { onSuccess: () => onOpenChange(false) }); } }; return ( {user ? "Edit User" : "Create New User"}
{errors.username &&

{errors.username.message}

}
{errors.email &&

{errors.email.message}

}
{!user && (
{errors.password &&

{errors.password.message}

}
)}
{availableRoles.map((role) => (
{ const current = selectedRoleIds; if (checked) { setValue("role_ids", [...current, role.role_id]); } else { setValue("role_ids", current.filter(id => id !== role.role_id)); } }} />

{role.description}

))}
{user && (
setValue("is_active", chk === true)} />
)}
); }