import { api } from "../lib/api.js"; import { emit, on } from "../lib/bus.js"; class RunTimeline extends HTMLElement { constructor() { super(); this.attachShadow({ mode: "open" }); this.chatId = null; this.items = []; this.shadowRoot.innerHTML = `
Conversación
Seleccioná una conversación.
`; } connectedCallback() { this.shadowRoot.getElementById("refresh").onclick = () => this.loadMessages(); this._unsubSel = on("ui:selectedChat", async ({ chat_id }) => { this.chatId = chat_id; await this.loadMessages(); }); this._unsubRun = on("run:created", (run) => { if (this.chatId && run.chat_id === this.chatId) { // nuevo run => refrescar mensajes para ver los bubbles actualizados this.loadMessages(); } }); } disconnectedCallback() { this._unsubSel?.(); this._unsubRun?.(); } async loadMessages() { this.shadowRoot.getElementById("chat").textContent = this.chatId || "—"; this.shadowRoot.getElementById("meta").textContent = "Cargando…"; this.shadowRoot.getElementById("count").textContent = ""; if (!this.chatId) { this.shadowRoot.getElementById("meta").textContent = "Seleccioná una conversación."; this.shadowRoot.getElementById("log").innerHTML = ""; return; } try { const data = await api.messages({ chat_id: this.chatId, limit: 200 }); this.items = data.items || []; this.render(); } catch (e) { this.items = []; this.shadowRoot.getElementById("meta").textContent = `Error cargando mensajes: ${String( e?.message || e )}`; this.shadowRoot.getElementById("log").innerHTML = ""; } } isErrorMsg(m) { const txt = String(m?.text || ""); return Boolean(m?.payload?.error) || txt.startsWith("[ERROR]") || txt.toLowerCase().includes("internal_error"); } displayNameFor(m) { // Inbound: usar pushName si vino del webhook; fallback al "from" (teléfono) si existe. const pushName = m?.payload?.raw?.meta?.pushName || m?.payload?.raw?.meta?.pushname || null; const from = m?.payload?.raw?.from || null; if (m?.direction === "in") return pushName || from || "test_lucas"; // Outbound: nombre del bot return "Piaf"; } render() { const meta = this.shadowRoot.getElementById("meta"); const count = this.shadowRoot.getElementById("count"); const log = this.shadowRoot.getElementById("log"); meta.textContent = `Mostrando historial (últimos ${this.items.length}).`; count.textContent = this.items.length ? `${this.items.length} msgs` : ""; log.innerHTML = ""; for (const m of this.items) { const who = m.direction === "in" ? "user" : "bot"; const isErr = this.isErrorMsg(m); const bubble = document.createElement("div"); bubble.className = `bubble ${isErr ? "err" : who}`; const nameEl = document.createElement("span"); nameEl.className = "name"; nameEl.textContent = this.displayNameFor(m); bubble.appendChild(nameEl); const textEl = document.createElement("div"); textEl.textContent = m.text || (isErr ? "Error" : "—"); bubble.appendChild(textEl); const metaEl = document.createElement("span"); metaEl.className = "meta"; metaEl.textContent = `${new Date(m.ts).toLocaleString()} • ${m.provider} • ${m.message_id}`; bubble.appendChild(metaEl); bubble.title = "Click para ver detalles (JSON)"; bubble.onclick = () => emit("ui:selectedMessage", { message: m }); log.appendChild(bubble); } // auto-scroll log.scrollTop = log.scrollHeight; } } customElements.define("run-timeline", RunTimeline);