"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 { User, CreateUserDto } from "@/types/admin"; import { useEffect, useState } from "react"; import { adminApi } from "@/lib/api/admin"; import { Loader2 } from "lucide-react"; const userSchema = z.object({ username: z.string().min(3, "Username must be at least 3 characters"), email: z.string().email("Invalid email address"), first_name: z.string().min(1, "First name is required"), last_name: z.string().min(1, "Last name is required"), password: z.string().min(6, "Password must be at least 6 characters").optional(), is_active: z.boolean().default(true), roles: z.array(z.number()).min(1, "At least one role is required"), }); type UserFormData = z.infer; interface UserDialogProps { open: boolean; onOpenChange: (open: boolean) => void; user?: User | null; onSuccess: () => void; } export function UserDialog({ open, onOpenChange, user, onSuccess }: UserDialogProps) { const [isSubmitting, setIsSubmitting] = useState(false); const { register, handleSubmit, setValue, watch, reset, formState: { errors }, } = useForm({ resolver: zodResolver(userSchema), defaultValues: { is_active: true, roles: [], }, }); 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, roles: user.roles.map((r) => r.role_id), }); } else { reset({ username: "", email: "", first_name: "", last_name: "", is_active: true, roles: [], }); } }, [user, reset, open]); 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 selectedRoles = watch("roles") || []; const handleRoleChange = (roleId: number, checked: boolean) => { const currentRoles = selectedRoles; const newRoles = checked ? [...currentRoles, roleId] : currentRoles.filter((id) => id !== roleId); setValue("roles", newRoles, { shouldValidate: true }); }; const onSubmit = async (data: UserFormData) => { setIsSubmitting(true); try { if (user) { // await adminApi.updateUser(user.user_id, data); console.log("Update user", user.user_id, data); } else { await adminApi.createUser(data as CreateUserDto); } onSuccess(); onOpenChange(false); } catch (error) { console.error(error); alert("Failed to save user"); } finally { setIsSubmitting(false); } }; return ( {user ? "Edit User" : "Create New User"}
{errors.username && (

{errors.username.message}

)}
{errors.email && (

{errors.email.message}

)}
{errors.first_name && (

{errors.first_name.message}

)}
{errors.last_name && (

{errors.last_name.message}

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

{errors.password.message}

)}
)}
{availableRoles.map((role) => (
handleRoleChange(role.role_id, checked as boolean)} />

{role.description}

))}
{errors.roles && (

{errors.roles.message}

)}
setValue("is_active", checked as boolean)} />
); }