(function(){ if (typeof MVCHAT === 'undefined') return; function $(id){ return document.getElementById(id); } const root = document.querySelector('[data-mvchat]'); if(!root) return; const ME = parseInt(MVCHAT.me, 10) || 0; const elSearch = $('mvchat-search'); const elZone = $('mvchat-zone'); const elResults = $('mvchat-results'); const elConvs = $('mvchat-conversations'); const elMsgs = $('mvchat-messages'); const elInput = $('mvchat-input'); const elSend = $('mvchat-send'); const elWho = $('mvchat-who'); const elWhere = $('mvchat-where'); const elOnline = $('mvchat-online'); const btnSearch = $('mvchat-btn-search'); const btnClear = $('mvchat-btn-clear'); let selectedUser = null; let debounceT = null; function api(path){ return fetch(MVCHAT.rest + path, { headers: { 'X-WP-Nonce': MVCHAT.nonce } }).then(r => r.json()); } function post(path, formData){ return fetch(MVCHAT.rest + path, { method: 'POST', headers: { 'X-WP-Nonce': MVCHAT.nonce }, body: formData }).then(r => r.json()); } function heartbeat(){ fetch(MVCHAT.rest + 'heartbeat', { method: 'POST', headers: { 'X-WP-Nonce': MVCHAT.nonce } }).catch(()=>{}); } function avatarLetter(name){ if(!name) return 'M'; return name.trim().charAt(0).toUpperCase(); } function renderList(container, list, onClick){ container.innerHTML = ''; if(!list || list.length === 0){ container.innerHTML = '
Sin resultados.
'; return; } list.forEach(u => { const div = document.createElement('div'); div.className = 'mvchat-item'; div.innerHTML = `
${avatarLetter(u.display_name)}
${u.display_name} ${u.online ? '🟢 Online' : '⚪ Offline'} ${parseInt(u.unread || 0, 10) > 0 ? `${u.unread}` : ''}
📍 ${u.city || 'Zona no definida'}${u.province ? ' · ' + u.province : ''}
`; div.addEventListener('click', () => onClick(u)); container.appendChild(div); }); } function setActiveUser(u){ selectedUser = u.ID; elWho.textContent = u.display_name || 'Usuario'; elWhere.textContent = '📍 ' + (u.city || 'Zona no definida') + (u.province ? ' · ' + u.province : ''); elOnline.textContent = u.online ? '🟢 Online' : '⚪ Offline'; elInput.disabled = false; elSend.disabled = false; loadMessages(); } function loadZones(){ api('zones').then(list => { elZone.innerHTML = ''; (list || []).forEach(z => { const opt = document.createElement('option'); opt.value = z.city; opt.textContent = z.city; elZone.appendChild(opt); }); }).catch(() => { elZone.innerHTML = ''; }); } function loadConversations(){ api('conversations').then(list => { if(!list || list.length === 0){ elConvs.innerHTML = '
Aún no tienes conversaciones.
'; return; } renderList(elConvs, list, setActiveUser); }).catch(() => { elConvs.innerHTML = '
No se pudieron cargar conversaciones.
'; }); } function doSearch(){ const q = (elSearch.value || '').trim(); const zone = (elZone.value || '').trim(); if(q.length < 2 && zone !== ''){ api('search?q=&zone=' + encodeURIComponent(zone)) .then(list => renderList(elResults, list, setActiveUser)) .catch(() => { elResults.innerHTML = '
Error buscando usuarios.
'; }); return; } if(q.length < 2){ elResults.innerHTML = '
Escribe al menos 2 letras o selecciona zona.
'; return; } api('search?q=' + encodeURIComponent(q) + '&zone=' + encodeURIComponent(zone)) .then(list => renderList(elResults, list, setActiveUser)) .catch(() => { elResults.innerHTML = '
Error buscando usuarios.
'; }); } function clearSearch(){ elSearch.value = ''; elZone.value = ''; elResults.innerHTML = '
Busca un usuario para empezar.
'; } function loadMessages(){ if(!selectedUser) return; api('messages?receiver_id=' + selectedUser).then(list => { elMsgs.innerHTML = ''; if(!list || list.length === 0){ elMsgs.innerHTML = '
No hay mensajes todavía. Envía el primero 👇
'; loadConversations(); return; } list.forEach(m => { const div = document.createElement('div'); div.className = 'mvchat-bubble ' + (parseInt(m.sender_id, 10) === ME ? 'mvchat-me' : 'mvchat-other'); div.textContent = m.message; elMsgs.appendChild(div); }); elMsgs.scrollTop = elMsgs.scrollHeight; loadConversations(); }).catch(()=>{}); } function sendMessage(){ if(!selectedUser) return; const msg = (elInput.value || '').trim(); if(!msg) return; const fd = new FormData(); fd.append('receiver_id', selectedUser); fd.append('message', msg); post('send', fd).then(() => { elInput.value = ''; loadMessages(); loadConversations(); }).catch(() => { alert('No se pudo enviar el mensaje.'); }); } btnSearch.addEventListener('click', doSearch); btnClear.addEventListener('click', clearSearch); elZone.addEventListener('change', () => { doSearch(); }); elSearch.addEventListener('keyup', () => { clearTimeout(debounceT); debounceT = setTimeout(() => { if((elSearch.value || '').trim().length >= 2 || (elZone.value || '').trim() !== ''){ doSearch(); } }, 350); }); elSend.addEventListener('click', sendMessage); elInput.addEventListener('keydown', (e) => { if(e.key === 'Enter'){ e.preventDefault(); sendMessage(); } }); heartbeat(); setInterval(heartbeat, 30000); setInterval(() => { if(selectedUser) loadMessages(); else loadConversations(); }, 5000); elResults.innerHTML = '
Busca un usuario para empezar.
'; loadZones(); loadConversations(); })();