// /home/Autopartes/dashboard/chat-public.js // Public catalog chatbot — no auth required, calls /api/chat (function () { 'use strict'; var isOpen = false; var isSending = false; var history = []; function init() { // FAB button var fab = document.createElement('button'); fab.className = 'chat-fab'; fab.id = 'chatFab'; fab.title = 'Asistente IA'; fab.innerHTML = '💬'; fab.setAttribute('aria-label', 'Abrir asistente IA'); // Chat panel var panel = document.createElement('div'); panel.className = 'chat-panel'; panel.id = 'chatPanel'; panel.innerHTML = '
' + '

Asistente — Buscar partes

' + '' + '
' + '
' + '
Hola, soy el asistente de Nexus Autoparts. Dime que refaccion buscas y te ayudo a encontrarla en el catalogo.
' + '
' + '
' + '
' + '' + '' + '
'; document.body.appendChild(fab); document.body.appendChild(panel); fab.addEventListener('click', toggleChat); document.getElementById('chatClose').addEventListener('click', toggleChat); document.getElementById('chatSend').addEventListener('click', sendMessage); document.getElementById('chatInput').addEventListener('keydown', function (e) { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); sendMessage(); } }); document.getElementById('chatInput').addEventListener('input', function () { this.style.height = 'auto'; this.style.height = Math.min(this.scrollHeight, 80) + 'px'; }); } function toggleChat() { isOpen = !isOpen; var panel = document.getElementById('chatPanel'); var fab = document.getElementById('chatFab'); if (isOpen) { panel.classList.add('open'); fab.style.display = 'none'; document.getElementById('chatInput').focus(); } else { panel.classList.remove('open'); fab.style.display = 'flex'; } } function sendMessage() { if (isSending) return; var input = document.getElementById('chatInput'); var text = input.value.trim(); if (!text) return; input.value = ''; input.style.height = 'auto'; addBubble(text, 'user'); history.push({ role: 'user', content: text }); if (history.length > 20) history.splice(0, 2); isSending = true; document.getElementById('chatSend').disabled = true; showTyping(true); fetch('/api/chat', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ message: text, history: history.slice(-10) }) }) .then(function (resp) { return resp.json(); }) .then(function (data) { if (data.error) { addBubble('Error: ' + data.error, 'ai'); return; } var aiMsg = data.response || 'Sin respuesta.'; addBubble(aiMsg, 'ai'); history.push({ role: 'assistant', content: aiMsg }); if (data.search_results && data.search_results.length > 0) { addPartResults(data.search_results); } }) .catch(function (err) { addBubble('Error de conexion: ' + err.message, 'ai'); }) .finally(function () { isSending = false; document.getElementById('chatSend').disabled = false; showTyping(false); }); } function addBubble(text, role) { var container = document.getElementById('chatMessages'); var typing = document.getElementById('chatTyping'); var div = document.createElement('div'); div.className = 'chat-msg ' + role; div.textContent = text; container.insertBefore(div, typing); scrollToBottom(); } function addPartResults(parts) { var container = document.getElementById('chatMessages'); var typing = document.getElementById('chatTyping'); var wrapper = document.createElement('div'); wrapper.className = 'chat-parts'; parts.slice(0, 8).forEach(function (p) { var card = document.createElement('div'); card.className = 'chat-part-card'; var name = p.name_es || p.name_part || ''; var partNum = p.oem_part_number || p.part_number || ''; var brand = p.brand || ''; card.innerHTML = '
' + esc(partNum) + '
' + '
' + esc(name) + (brand ? ' (' + esc(brand) + ')' : '') + '
'; card.style.cursor = 'pointer'; card.addEventListener('click', function () { // Search in catalog var searchInput = document.getElementById('searchInput'); if (searchInput && partNum) { searchInput.value = partNum; if (typeof window.doSearch === 'function') window.doSearch(); toggleChat(); } }); wrapper.appendChild(card); }); container.insertBefore(wrapper, typing); scrollToBottom(); } function showTyping(show) { var el = document.getElementById('chatTyping'); if (el) el.classList.toggle('visible', show); if (show) scrollToBottom(); } function scrollToBottom() { var el = document.getElementById('chatMessages'); if (el) el.scrollTop = el.scrollHeight; } function esc(s) { if (!s) return ''; var d = document.createElement('div'); d.textContent = s; return d.innerHTML; } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } })();