import { api } from "../lib/api.js"; const DAYS = [ { id: "lun", label: "Lun" }, { id: "mar", label: "Mar" }, { id: "mie", label: "Mié" }, { id: "jue", label: "Jue" }, { id: "vie", label: "Vie" }, { id: "sab", label: "Sáb" }, { id: "dom", label: "Dom" }, ]; class SettingsCrud extends HTMLElement { constructor() { super(); this.attachShadow({ mode: "open" }); this.settings = null; this.loading = false; this.saving = false; this.shadowRoot.innerHTML = `
Cargando configuración...
`; } connectedCallback() { this.load(); } async load() { this.loading = true; this.render(); try { this.settings = await api.getSettings(); this.loading = false; this.render(); } catch (e) { console.error("Error loading settings:", e); this.loading = false; this.showError("Error cargando configuración: " + e.message); } } render() { const content = this.shadowRoot.getElementById("content"); if (this.loading) { content.innerHTML = `
Cargando configuración...
`; return; } if (!this.settings) { content.innerHTML = `
No se pudo cargar la configuración
`; return; } const s = this.settings; const deliveryDays = (s.delivery_days || "").split(",").filter(d => d); const pickupDays = (s.pickup_days || "").split(",").filter(d => d); content.innerHTML = `
Información del Negocio
Se usa en los mensajes del bot
El asistente virtual
Delivery (Envío a domicilio)
Delivery habilitado
${DAYS.map(d => ` `).join("")}
Horario: a (formato 24hs)
Retiro en Tienda
Retiro en tienda habilitado
${DAYS.map(d => ` `).join("")}
Horario: a (formato 24hs)
`; this.setupEventListeners(); } setupEventListeners() { // Toggle delivery const deliveryToggle = this.shadowRoot.getElementById("deliveryToggle"); deliveryToggle?.addEventListener("click", () => { this.settings.delivery_enabled = !this.settings.delivery_enabled; this.render(); }); // Toggle pickup const pickupToggle = this.shadowRoot.getElementById("pickupToggle"); pickupToggle?.addEventListener("click", () => { this.settings.pickup_enabled = !this.settings.pickup_enabled; this.render(); }); // Delivery days this.shadowRoot.querySelectorAll("#deliveryDays .day-btn").forEach(btn => { btn.addEventListener("click", () => { const day = btn.dataset.day; let days = (this.settings.delivery_days || "").split(",").filter(d => d); if (days.includes(day)) { days = days.filter(d => d !== day); } else { days.push(day); } // Ordenar días days.sort((a, b) => DAYS.findIndex(d => d.id === a) - DAYS.findIndex(d => d.id === b)); this.settings.delivery_days = days.join(","); this.render(); }); }); // Pickup days this.shadowRoot.querySelectorAll("#pickupDays .day-btn").forEach(btn => { btn.addEventListener("click", () => { const day = btn.dataset.day; let days = (this.settings.pickup_days || "").split(",").filter(d => d); if (days.includes(day)) { days = days.filter(d => d !== day); } else { days.push(day); } days.sort((a, b) => DAYS.findIndex(d => d.id === a) - DAYS.findIndex(d => d.id === b)); this.settings.pickup_days = days.join(","); this.render(); }); }); // Save button this.shadowRoot.getElementById("saveBtn")?.addEventListener("click", () => this.save()); // Reset button this.shadowRoot.getElementById("resetBtn")?.addEventListener("click", () => this.load()); } async save() { // Collect form data BEFORE re-rendering const data = { store_name: this.shadowRoot.getElementById("storeName")?.value || "", bot_name: this.shadowRoot.getElementById("botName")?.value || "", store_address: this.shadowRoot.getElementById("storeAddress")?.value || "", store_phone: this.shadowRoot.getElementById("storePhone")?.value || "", delivery_enabled: this.settings.delivery_enabled, delivery_days: this.settings.delivery_days, delivery_hours_start: this.shadowRoot.getElementById("deliveryStart")?.value || "09:00", delivery_hours_end: this.shadowRoot.getElementById("deliveryEnd")?.value || "18:00", delivery_min_order: parseFloat(this.shadowRoot.getElementById("deliveryMinOrder")?.value) || 0, pickup_enabled: this.settings.pickup_enabled, pickup_days: this.settings.pickup_days, pickup_hours_start: this.shadowRoot.getElementById("pickupStart")?.value || "08:00", pickup_hours_end: this.shadowRoot.getElementById("pickupEnd")?.value || "20:00", }; // Update settings with form values so they persist through render this.settings = { ...this.settings, ...data }; this.saving = true; this.render(); try { console.log("[settings-crud] Saving:", data); const result = await api.saveSettings(data); console.log("[settings-crud] Save result:", result); if (result.ok === false) { throw new Error(result.message || result.error || "Error desconocido"); } this.settings = result.settings || data; this.saving = false; this.showSuccess(result.message || "Configuración guardada correctamente"); this.render(); } catch (e) { console.error("[settings-crud] Error saving settings:", e); this.saving = false; this.showError("Error guardando: " + (e.message || e)); this.render(); } } escapeHtml(str) { return (str || "").replace(/&/g, "&").replace(//g, ">").replace(/"/g, """); } showSuccess(msg) { const messages = this.shadowRoot.getElementById("messages"); messages.innerHTML = `
${msg}
`; setTimeout(() => { messages.innerHTML = ""; }, 4000); } showError(msg) { const messages = this.shadowRoot.getElementById("messages"); messages.innerHTML = `
${msg}
`; setTimeout(() => { messages.innerHTML = ""; }, 5000); } } customElements.define("settings-crud", SettingsCrud);