"use client" import { useEffect, useState, useCallback } from "react" import { useRouter } from "next/navigation" import { DashboardLayout } from "@/components/dashboard-layout" import { useAuth } from "@/lib/auth-context" import { apiFetch } from "@/lib/apiutils" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Badge } from "@/components/ui/badge" import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, } from "@/components/ui/dialog" import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "@/components/ui/alert-dialog" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" import { UserPlus, Pencil, Trash2, RefreshCw, Shield, User } from "lucide-react" import { cn } from "@/lib/utils" interface SysUser { id: number name: string email: string role: "admin" | "operador" created_at: string } interface UserForm { name: string email: string password: string role: "admin" | "operador" } const EMPTY_FORM: UserForm = { name: "", email: "", password: "", role: "operador" } export default function UsuariosPage() { const { user: me } = useAuth() const router = useRouter() const [users, setUsers] = useState([]) const [loading, setLoading] = useState(true) const [dialogOpen, setDialogOpen] = useState(false) const [editTarget, setEditTarget] = useState(null) const [form, setForm] = useState(EMPTY_FORM) const [saving, setSaving] = useState(false) const [errors, setErrors] = useState>({}) const [deleteTarget, setDeleteTarget] = useState(null) // Only admins useEffect(() => { if (me && me.role !== "admin") router.replace("/dashboard") }, [me, router]) const fetchUsers = useCallback(async () => { setLoading(true) try { const res = await apiFetch("/users") if (res.ok) setUsers(await res.json()) } catch (e) { console.error(e) } finally { setLoading(false) } }, []) useEffect(() => { fetchUsers() }, [fetchUsers]) // ── Dialog helpers ──────────────────────────────────────────────────── const openCreate = () => { setEditTarget(null) setForm(EMPTY_FORM) setErrors({}) setDialogOpen(true) } const openEdit = (u: SysUser) => { setEditTarget(u) setForm({ name: u.name, email: u.email, password: "", role: u.role }) setErrors({}) setDialogOpen(true) } const validate = (): boolean => { const e: Partial = {} if (!form.name.trim()) e.name = "El nombre es obligatorio." if (!form.email.trim()) e.email = "El correo es obligatorio." if (!editTarget && form.password.length < 8) e.password = "La contraseña debe tener al menos 8 caracteres." setErrors(e) return Object.keys(e).length === 0 } const handleSave = async () => { if (!validate()) return setSaving(true) try { const body: Record = { name: form.name, email: form.email, role: form.role, status: "active", } if (form.password) body.password = form.password const res = editTarget ? await apiFetch(`/users/${editTarget.id}`, { method: "PUT", body: JSON.stringify(body) }) : await apiFetch("/users", { method: "POST", body: JSON.stringify(body) }) if (res.ok) { setDialogOpen(false) fetchUsers() } else { const data = await res.json() if (data.errors?.email) setErrors((p) => ({ ...p, email: data.errors.email[0] })) } } catch (e) { console.error(e) } finally { setSaving(false) } } const handleDelete = async () => { if (!deleteTarget) return try { await apiFetch(`/users/${deleteTarget.id}`, { method: "DELETE" }) setDeleteTarget(null) fetchUsers() } catch (e) { console.error(e) } } // ── Render ──────────────────────────────────────────────────────────── return (
{/* Header */}

Usuarios del Sistema

{loading ? "Cargando..." : `${users.length} usuario${users.length !== 1 ? "s" : ""} registrado${users.length !== 1 ? "s" : ""}`}

{/* Table */} {loading ? (
Cargando usuarios...
) : users.length === 0 ? (
No hay usuarios registrados.
) : (
{users.map((u) => ( ))}
Nombre Email Rol Creado Acciones
{u.name.charAt(0).toUpperCase()}
{u.name} {u.id === me?.id && ( Tú )}
{u.email} {u.role === "admin" ? ( Admin ) : ( Operador )} {new Date(u.created_at).toLocaleDateString("es-AR")}
)}
{/* ── Create/Edit Dialog ── */} {editTarget ? "Editar Usuario" : "Nuevo Usuario"}
setForm((p) => ({ ...p, name: e.target.value }))} className={cn(errors.name && "border-destructive")} /> {errors.name &&

{errors.name}

}
setForm((p) => ({ ...p, email: e.target.value }))} className={cn(errors.email && "border-destructive")} /> {errors.email &&

{errors.email}

}
setForm((p) => ({ ...p, password: e.target.value }))} className={cn(errors.password && "border-destructive")} /> {errors.password &&

{errors.password}

}
{/* ── Confirm Delete Dialog ── */} !o && setDeleteTarget(null)}> ¿Eliminar usuario? Se eliminará permanentemente a {deleteTarget?.name} ({deleteTarget?.email}). Esta acción no se puede deshacer. Cancelar Eliminar
) }