-
-
`;
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,