// Configuração do Markdown parser personalizado com Highlight.js integrado const renderer = new marked.Renderer(); // Função auxiliar para escapar caracteres HTML function escapeHtml(text) { return text .replace(/&/g, "&") .replace(//g, ">") .replace(/"/g, """) .replace(/'/g, "'"); } renderer.code = function(code, language) { // Ajuste para lidar com as diferenças na assinatura do marked.js const codeContent = typeof code === 'object' ? code.text : code; const lang = (typeof code === 'object' ? code.lang : language) || 'txt'; return `
${escapeHtml(codeContent)}
${escapeHtml(content).replace(/\n/g, '
')}
Desculpe, ocorreu um erro ao obter resposta da Camila AI. Por favor, tente novamente.
`; scrollToBottom(); } finally { isGenerating = false; btnSend.disabled = userInput.value.trim() === ''; userInput.disabled = false; userInput.focus(); } }; // Envio pelo Formulário chatForm.addEventListener('submit', (e) => { e.preventDefault(); const text = userInput.value.trim(); handleSendMessage(text); }); // Sugestões de Prompt Rápidas suggestionCards.forEach(card => { card.addEventListener('click', () => { const prompt = card.dataset.prompt; if (prompt) { handleSendMessage(prompt); } }); }); // ========================================================================== // LOGOUT & INICIALIZAÇÃO // ========================================================================== btnLogout.addEventListener('click', async () => { try { const response = await fetch('/api/logout', { method: 'POST' }); if (response.ok) { window.location.href = '/login'; } } catch (error) { console.error('Erro ao fazer logout:', error); } }); // Inicializar interface if (currentChatId) { // Tenta carregar o chat ativo const activeChat = chats.find(c => c.id === currentChatId); if (activeChat) { selectChat(currentChatId); } else { createNewChat(); } } else { createNewChat(); } // Inicializar reconhecimento de voz initVoiceRecognition(); });