import { useEffect } from "react"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { Modal, Button, Select } from "react-daisyui"; import { InputField } from "@/components/ui/input"; import { useUpdateUser, useTenants } from "@/hooks/useAdmin"; import { usePermissions } from "@/hooks/useAuth"; import { User } from "@/types/admin"; import { Toggle } from "@/components/ui/toggle"; const updateUserSchema = z.object({ username: z.string().min(3, "El nombre de usuario debe tener al menos 3 caracteres").optional(), email: z.string().email("Email inválido").optional(), password: z.string().min(6, "La contraseña debe tener al menos 6 caracteres").optional(), role: z.enum(["admin", "tenant_admin", "user", "readonly"] as const).optional(), tenant_id: z.string().optional(), enabled: z.boolean().optional(), }); type UpdateUserForm = z.infer; interface EditUserDialogProps { open: boolean; user: User | null; onClose: () => void; } export default function EditUserDialog({ open, user, onClose }: EditUserDialogProps) { const updateUser = useUpdateUser(); const { data: tenants } = useTenants(); const { isAdmin } = usePermissions(); const form = useForm({ resolver: zodResolver(updateUserSchema), defaultValues: { username: "", email: "", password: "", role: "user", tenant_id: "", enabled: true, }, }); const selectedRole = form.watch("role"); useEffect(() => { if (user && open) { form.reset({ username: user.username, email: user.email, password: "", role: user.role, tenant_id: user.tenant_id || "", enabled: user.enabled, }); } }, [user, open, form]); const handleSubmit = async (data: UpdateUserForm) => { if (!user) return; try { // Remove empty password field const updateData = { ...data }; if (!updateData.password) { delete updateData.password; } // Convert empty tenant_id to undefined if (updateData.tenant_id === "") { updateData.tenant_id = undefined; } await updateUser.mutateAsync({ id: user.id, data: updateData, }); onClose(); } catch (error) { // Error is handled by the mutation } }; const roleOptions = [ ...(isAdmin ? [{ value: "admin", label: "Administrador" }] : []), { value: "tenant_admin", label: "Administrador de Tenant" }, { value: "user", label: "Usuario" }, { value: "readonly", label: "Solo Lectura" }, ]; if (!user) return null; return ( Editar Usuario: {user.username}
{/* Show tenant selector for tenant_admin and user roles */} {(selectedRole === "tenant_admin" || selectedRole === "user") && (
)}
); }