// src/pages/Asesores.jsx import { useState, useEffect, useCallback } from "react"; import { api } from "../lib/api"; import { Loader, ErrorBox } from "../components/UI"; const ESTADO_INFO = { online: { txt: "En Línea", color: "#10b981", bg: "#d1fae5", fg: "#065f46" }, busy: { txt: "Ocupado", color: "#f59e0b", bg: "#fef9c3", fg: "#854d0e" }, offline:{ txt: "Fuera de Línea", color: "#94a3b8", bg: "#f1f5f9", fg: "#475569" }, }; export default function Asesores() { const [agentes, setAgentes] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [cambiando, setCambiando] = useState(null); const cargar = useCallback(() => { setLoading(true); setError(null); api.asesores() .then((res)=>{ setAgentes(res.agentes||[]); setLoading(false); }) .catch((e)=>{ setError(e.message); setLoading(false); }); }, []); useEffect(() => { cargar(); }, [cargar]); async function toggle(ag) { const online = ag.availability_status !== "online"; setCambiando(ag.id); try { await api.asesorEstado(ag.id, online); setAgentes((prev)=>prev.map((a)=>a.id===ag.id ? {...a, availability_status: online?"online":"offline"} : a)); } catch (e) { /* noop */ } setCambiando(null); } async function todos(online) { setCambiando("all"); for (const ag of agentes) { try { await api.asesorEstado(ag.id, online); } catch (e) {} } setAgentes((prev)=>prev.map((a)=>({...a, availability_status: online?"online":"offline"}))); setCambiando(null); } const total = agentes.length; const enLinea = agentes.filter((a)=>a.availability_status==="online").length; const ocupados = agentes.filter((a)=>a.availability_status==="busy").length; const offline = total - enLinea - ocupados; return (

👥 Asesores

{loading ? : error ? : <>
👥
Total Asesores
{total}
🟢
En Línea
{enLinea}
🟡
Ocupados
{ocupados}
🔴
Fuera de Línea
{offline}
{agentes.map((ag)=>{ const est = ESTADO_INFO[ag.availability_status] || ESTADO_INFO.offline; const isOnline = ag.availability_status==="online"; return ( ); })}
ASESOREMAILROLESTADOACCIÓN
{ag.name || ag.available_name || "—"} {ag.email || "—"} {ag.role || "agent"} ● {est.txt}
}
); }