/* global React, ChIcon, NavIcon, CHANNELS, TICKETS, StateBadge */
const { useMemo: useMemoQ, useState: useStateQ, useRef: useRefQ, useEffect: useEffectQ } = React;
const initials = (name) => name.split(/\s+/).filter(Boolean).slice(0,2).map(w => w[0]).join("").toUpperCase();
const phaseFromState = (t) => {
if (t.state === "resolved") return 5;
if (t.state === "auto" && t.handler === "sofia") return 4;
if (t.state === "progress") return 3;
if (t.state === "waiting") return 2;
if (t.state === "escalated" || t.urgent) return 2;
return 3;
};
const stateToTone = (t) => {
if (t.urgent || t.state === "escalated") return "yellow";
if (t.state === "progress") return "lavender";
if (t.state === "waiting") return "pink";
if (t.state === "auto") return "lavender";
if (t.state === "resolved") return "white";
return "white";
};
const stateChipLabel = (t) => {
if (t.urgent || t.state === "escalated") return { label: "Requiere operador", cls: "urgent" };
if (t.state === "auto") return { label: "Auto · SOF.IA", cls: "" };
if (t.state === "progress") return { label: "En curso", cls: "" };
if (t.state === "waiting") return { label: "Esperando cliente", cls: "" };
if (t.state === "resolved") return { label: "Resuelto", cls: "" };
return { label: t.state, cls: "" };
};
const TicketCard = ({ t, onOpen }) => {
const ph = phaseFromState(t);
const tone = stateToTone(t);
const chip = stateChipLabel(t);
const isSofia = t.handler === "sofia" && !(t.urgent || t.state === "escalated");
return (
Cola Omnicanal · {filtered.length} de {TICKETS.length} tickets
Tickets Activos
Resueltos sin humano
80%
Captura promedio
42seg
Escalados hoy
23
{/* Tabs nav only */}
Activos
{totalActive}
setRoute && setRoute("pending")}>
Pendientes
14
setRoute && setRoute("resolved")}>
Resueltos hoy
47
setRoute && setRoute("lifecycle")}>
Todos los tickets
{TICKETS.length + 30}
{/* === TOOLBAR === */}
setSearch(e.target.value)}
placeholder="Buscar por cliente, empresa, ticket, modelo, serie…"
/>
{search && (
)}
setViewMode("cards")}
title="Vista tablero"
>
setViewMode("list")}
title="Vista lista"
>
{sortOpen && (
{SORT_OPTIONS.map(o => (
))}
)}
{/* === FILTER ROW === */}
Estado
{STATE_FILTERS.map(s => (
setStateFilter(s.id)}
>
{s.label}
{stateCounts[s.id]}
))}
Canal
setFilterChannel(null)}
>
Todos
{TICKETS.length}
{CHANNELS.map(ch => (
setFilterChannel(filterChannel === ch.id ? null : ch.id)}
>
{ch.label}
{counts[ch.id]}
))}
{/* Empty state */}
{filtered.length === 0 && (
— sin tickets para los filtros activos —
)}
{/* === CARDS VIEW === */}
{viewMode === "cards" && filtered.length > 0 && (
<>
{sections.urgent.length > 0 && (
Requieren operador
{sections.urgent.length} {sections.urgent.length === 1 ? "ticket" : "tickets"} · cliente esperando
{sections.urgent.map(t => )}
)}
{sections.progress.length > 0 && (
En curso
{sections.progress.length} {sections.progress.length === 1 ? "ticket" : "tickets"} · indagación o espera
{sections.progress.map(t => )}
)}
{sections.auto.length > 0 && (
SOF.IA · resolviendo en automático
{sections.auto.length} {sections.auto.length === 1 ? "ticket" : "tickets"} · sin intervención humana
{sections.auto.map(t =>
)}
)}
{sections.resolved.length > 0 && (
Resueltos recientemente
{sections.resolved.length} {sections.resolved.length === 1 ? "ticket" : "tickets"} · cerrados en las últimas horas
{sections.resolved.map(t => )}
)}
>
)}
{/* === LIST VIEW === */}
{viewMode === "list" && filtered.length > 0 && (
Ticket
Cliente
Equipo
Estado
Manejado por
Edad
{filtered.map(t =>
)}
)}
);
};
window.QueueScreen = QueueScreen;