// src/pages/Usuarios.jsx import { useState, useEffect, useCallback } from "react"; import { api } from "../lib/api"; import { Loader, ErrorBox, Filters, Select } from "../components/UI"; const ROLES = ["ADMINISTRADOR", "VENTAS", "COBRANZA"]; export default function Usuarios() { const [usuarios, setUsuarios] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); // form nuevo usuario const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [nombre, setNombre] = useState(""); const [rol, setRol] = useState("COBRANZA"); const [creando, setCreando] = useState(false); const [msg, setMsg] = useState(null); const cargar = useCallback(() => { setLoading(true); setError(null); api.usuariosListar() .then((res) => { setUsuarios(res.usuarios || []); setLoading(false); }) .catch((e) => { setError(e.message); setLoading(false); }); }, []); useEffect(() => { cargar(); }, [cargar]); async function crear() { setMsg(null); if (!email.trim() || !password.trim()) { setMsg({ ok:false, txt:"Correo y contraseña son obligatorios." }); return; } setCreando(true); try { await api.usuariosCrear(email.trim(), password, nombre.trim(), rol); setMsg({ ok:true, txt:`Usuario ${email} creado como ${rol}.` }); setEmail(""); setPassword(""); setNombre(""); setRol("COBRANZA"); cargar(); } catch (e) { setMsg({ ok:false, txt:"Error: " + e.message }); } setCreando(false); } async function cambiarRol(id, nuevoRol) { try { await api.usuariosActualizarRol(id, nuevoRol); cargar(); } catch (e) { alert("No se pudo cambiar el rol: " + e.message); } } async function eliminar(id, correo) { if (!confirm(`¿Eliminar al usuario ${correo}? Esta acción no se puede deshacer.`)) return; try { await api.usuariosEliminar(id); cargar(); } catch (e) { alert("No se pudo eliminar: " + e.message); } } return (

🔐 Usuarios

{/* Crear nuevo usuario */}

➕ Crear nuevo usuario

setEmail(e.target.value)} placeholder="usuario@escuela.com" style={inp} /> setPassword(e.target.value)} placeholder="mín. 6 caracteres" style={inp} /> setNombre(e.target.value)} placeholder="Nombre completo" style={inp} /> cambiarRol(u.id, e.target.value)} style={{ padding:"5px 8px", border:"1px solid #cbd5e1", borderRadius:6, fontSize:12 }}> {ROLES.map((r)=>)} ))} {usuarios.length === 0 && ( Sin usuarios. )}
}
); } function Campo({ label, children }) { return (
{children}
); } const inp = { padding:"8px 12px", border:"1px solid #cbd5e1", borderRadius:8, fontSize:13, minWidth:180 };