alterações de melhorias

This commit is contained in:
2026-06-24 14:13:09 +00:00
parent d942694ec0
commit 29190cd71c
34 changed files with 2570 additions and 950 deletions
+44 -4
View File
@@ -1101,7 +1101,7 @@ async function carregarConversas() {
});
}
renderConversas(data.data, busca);
} catch(e) {}
} catch(e) { if (Chatc2Toast) Chatc2Toast.error('Erro ao carregar conversas'); }
}
var AVATAR_COLORS = ['#667eea','#764ba2','#f093fb','#4facfe','#43e97b','#fa709a','#fee140','#30cfd0','#a18cd1','#fda085'];
@@ -1151,6 +1151,23 @@ function renderConversas(convs, busca) {
return '<span class="conv-badge" style="background:' + esc(l.cor || '#667eea') + '">' + esc(l.nome || '') + '</span>';
}).join('');
const ultimaMsg = (c.ultimaMsg || '').substring(0, 60);
// Preview com ícone por tipo de mensagem
var previewHtml;
if (!c.ultimaMsg) {
previewHtml = '<em>Sem mensagens</em>';
} else if (c.ultimaTipo === 'audio' || c.ultimaTipo === 'ptt') {
previewHtml = '🎤 Mensagem de voz';
} else if (c.ultimaTipo === 'image') {
previewHtml = '🖼️ Imagem';
} else if (c.ultimaTipo === 'video') {
previewHtml = '🎥 Vídeo';
} else if (c.ultimaTipo === 'document') {
previewHtml = '📎 Documento';
} else if (c.ultimaTipo === 'triagem') {
previewHtml = '🤖 Menu de triagem';
} else {
previewHtml = esc(ultimaMsg);
}
const tempo = formatTime(c.dtUltimaMsg);
return '<div class="conv-item ' + isActive + '" onclick="abrirConversa(' + c.id + ')" data-id="' + c.id + '">' +
'<div class="conv-avatar" style="background:' + cor + '">' + iniciais + '</div>' +
@@ -1159,7 +1176,7 @@ function renderConversas(convs, busca) {
'<div class="conv-nome">' + esc(nome) + '</div>' +
'<div style="font-size:10px;color:rgba(255,255,255,0.35);flex-shrink:0">' + tempo + '</div>' +
'</div>' +
'<div class="conv-ultima">' + (ultimaMsg ? esc(ultimaMsg) : '<em>Sem mensagens</em>') + '</div>' +
'<div class="conv-ultima">' + previewHtml + '</div>' +
'<div class="conv-status">' + statusDot + ' ' + (c.status === 'E' ? 'Em espera' : c.status === 'A' ? 'Aberto' : 'Finalizado') + '</div>' +
(labelsHtml ? '<div class="conv-badges">' + labelsHtml + '</div>' : '') +
'</div>' +
@@ -1491,8 +1508,20 @@ async function carregarMensagens() {
headers: { 'Authorization': 'Bearer ' + token }
});
var data = await res.json();
if (data.success) renderMensagens(data.data);
} catch(e) {}
if (data.success) {
// Notificação desktop: detecta novas mensagens de cliente
var novasDoCliente = data.data.filter(function(m) {
return m.remetente === 'C' && m.id > ultimaMsgIdGlobal && m.privada !== 'S';
});
if (novasDoCliente.length > 0 && Chatc2Notify) {
var ultima = novasDoCliente[novasDoCliente.length - 1];
Chatc2Notify.show('Nova mensagem', (ultima.mensagem || 'Mídia recebida').substring(0, 100));
}
// Atualiza ID máximo global
data.data.forEach(function(m) { if (m.id > ultimaMsgIdGlobal) ultimaMsgIdGlobal = m.id; });
renderMensagens(data.data);
}
} catch(e) { if (Chatc2Toast) Chatc2Toast.error('Erro ao carregar mensagens'); }
carregandoMsgs = false;
}
@@ -2110,11 +2139,20 @@ window.logout = function() {
};
// Auto-refresh a cada 5 segundos
let ultimaMsgIdGlobal = 0;
setInterval(function() {
carregarConversas();
if (conversaAtiva) carregarMensagens();
}, 5000);
// Notificação desktop: pede permissão na primeira interação
document.addEventListener('click', function pedirPermissao() {
document.removeEventListener('click', pedirPermissao);
if (Chatc2Notify && Chatc2Notify.isSupported()) {
Chatc2Notify.requestPermission();
}
}, { once: true });
// Presença: marca o atendente como "online" para o dashboard
function pingPresenca() {
fetch('/api/' + alias + '/dashboard/ping', {
@@ -2133,6 +2171,8 @@ document.getElementById('msgInput').addEventListener('input', function() {
})();
</script>
<script src="/js/dark-mode.js"></script>
<script src="/js/notifications.js"></script>
<script src="/js/toast.js"></script>
<!-- impeccable-live-start -->
<script src="http://localhost:8400/live.js"></script>
<!-- impeccable-live-end -->