diff --git a/public/app.js b/public/app.js index fee3607..57a12f2 100644 --- a/public/app.js +++ b/public/app.js @@ -3,6 +3,7 @@ import "./components/home-dashboard.js"; import "./components/run-timeline.js"; import "./components/chat-simulator.js"; import "./components/conversation-inspector.js"; +import "./components/conversation-list.js"; import "./components/conversations-crud.js"; import "./components/users-crud.js"; import "./components/products-crud.js"; diff --git a/public/components/chat-simulator.js b/public/components/chat-simulator.js index 76a3487..1ad894e 100644 --- a/public/components/chat-simulator.js +++ b/public/components/chat-simulator.js @@ -11,55 +11,44 @@ class ChatSimulator extends HTMLElement { this._sending = false; this.shadowRoot.innerHTML = `
-
-
Evolution Sim
-
+
+ +
@@ -78,16 +67,16 @@ class ChatSimulator extends HTMLElement {
-
-
Mensaje
-
- -
+
+ +
+ +
-
+
`; diff --git a/public/components/ops-shell.js b/public/components/ops-shell.js index ed0115c..c9c11ba 100644 --- a/public/components/ops-shell.js +++ b/public/components/ops-shell.js @@ -75,12 +75,11 @@ class OpsShell extends HTMLElement { box-shadow: 0 0 0 2px var(--panel); } - /* Layout para chat activo (2 columnas: burbujas + inspector) */ - .layout-chat { height:100%; display:grid; grid-template-columns:1fr 1fr; grid-template-rows:1fr 310px; min-height:0; overflow:hidden; } - .col { border-right:1px solid var(--border); min-height:0; overflow:hidden; } - .chatTop { grid-column:1; grid-row:1; border-bottom:1px solid var(--border); } - .chatBottom { grid-column:1 / 3; grid-row:2; overflow:hidden; border-top:1px solid var(--border); } - .inspectorTop { grid-column:2; grid-row:1; border-right:none; } + /* Layout para chat activo (3 columnas: lista | burbujas | inspector+sim) */ + .layout-chat { height:100%; display:grid; grid-template-columns:280px 1fr 360px; min-height:0; overflow:hidden; } + .chatLeft { border-right:1px solid var(--border); min-height:0; overflow-y:auto; } + .chatCenter { display:flex; flex-direction:column; min-height:0; overflow:hidden; border-right:1px solid var(--border); } + .chatRight { display:flex; flex-direction:column; min-height:0; overflow:hidden; } /* Layout para CRUDs */ .layout-crud { height:100%; display:block; min-height:0; overflow:hidden; } @@ -126,9 +125,12 @@ class OpsShell extends HTMLElement {
-
-
-
+
+
+
+ + +
diff --git a/public/lib/api.js b/public/lib/api.js index e400874..a39c19f 100644 --- a/public/lib/api.js +++ b/public/lib/api.js @@ -105,7 +105,7 @@ export const api = { }, async syncProducts() { - return fetch("/products/sync", { method: "POST" }).then(r => r.json()); + return safeFetch("/products/sync", { method: "POST" }); }, async updateProductUnit(wooProductId, { sell_unit }) { @@ -214,7 +214,7 @@ export const api = { // Sync de emergencia desde WooCommerce async syncFromWoo() { - return fetch("/products/sync-from-woo", { method: "POST" }).then(r => r.json()); + return safeFetch("/products/sync-from-woo", { method: "POST" }); }, // --- Orders & Stats --- diff --git a/src/modules/2-identity/services/woo.js b/src/modules/2-identity/services/woo.js index 0bf3e2c..a7b9832 100644 --- a/src/modules/2-identity/services/woo.js +++ b/src/modules/2-identity/services/woo.js @@ -172,7 +172,7 @@ export async function createWooCustomer({ tenantId, wa_chat_id, phone, name }) { throw new Error("consumer_secret not set"); })(); - const base = cfg.base_url.replace(/\/+$/, ""); + const base = `${cfg.base_url.replace(/\/+$/, "")}/wp-json/${cfg.api_version || "wc/v3"}`; const email = `${phone || wa_chat_id}@no-email.local`; const username = wa_chat_id; const timeout = Math.max(cfg.timeout_ms ?? 20000, 20000); diff --git a/src/modules/4-woo-orders/wooOrders.js b/src/modules/4-woo-orders/wooOrders.js index ca28c74..d3b8999 100644 --- a/src/modules/4-woo-orders/wooOrders.js +++ b/src/modules/4-woo-orders/wooOrders.js @@ -89,7 +89,8 @@ async function getWooClient({ tenantId }) { (() => { throw new Error("consumer_secret not set"); })(); - const base = cfg.base_url.replace(/\/+$/, ""); + const apiVersion = cfg.api_version || "wc/v3"; + const base = `${cfg.base_url.replace(/\/+$/, "")}/wp-json/${apiVersion}`; const auth = Buffer.from(`${consumerKey}:${consumerSecret}`).toString("base64"); return { base, diff --git a/src/modules/shared/wooSnapshot.js b/src/modules/shared/wooSnapshot.js index 767bd37..79d7520 100644 --- a/src/modules/shared/wooSnapshot.js +++ b/src/modules/shared/wooSnapshot.js @@ -57,7 +57,8 @@ async function getWooClient({ tenantId }) { (() => { throw new Error("consumer_secret not set"); })(); - const base = cfg.base_url.replace(/\/+$/, ""); + const apiVersion = cfg.api_version || "wc/v3"; + const base = `${cfg.base_url.replace(/\/+$/, "")}/wp-json/${apiVersion}`; const auth = Buffer.from(`${consumerKey}:${consumerSecret}`).toString("base64"); return { base,