"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, useRoles } from "@/hooks/use-users"; import { useOrganizations } from "@/hooks/use-master-data"; import { useEffect } from "react"; import { User } from "@/types/user"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; 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), line_id: z.string().optional(), primary_organization_id: z.coerce.number().optional(), role_ids: z.array(z.number()).default([]), }); 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 { data: roles = [] } = useRoles(); const { data: organizations = [] } = useOrganizations(); const { register, handleSubmit, setValue, watch, reset, formState: { errors }, } = useForm({ resolver: zodResolver(userSchema) as any, defaultValues: { username: "", email: "", first_name: "", last_name: "", is_active: true, role_ids: [] as number[], line_id: "", primary_organization_id: undefined as number | undefined, }, }); 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, line_id: user.line_id || "", primary_organization_id: user.primary_organization_id, role_ids: user.roles?.map((r: any) => r.roleId) || [], }); } else { reset({ username: "", email: "", first_name: "", last_name: "", is_active: true, line_id: "", primary_organization_id: undefined, role_ids: [], }); } }, [user, reset, open]); const selectedRoleIds = watch("role_ids") || []; const onSubmit = (data: UserFormData) => { // If password is empty (and editing), exclude it if (user && !data.password) { delete data.password; } 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}

)}
)}
{roles.length === 0 &&

Loading roles...

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

{role.description}

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