document.addEventListener('DOMContentLoaded', () => { const chatHistory = document.getElementById('chat-history'); const queryInput = document.getElementById('query-input'); const sendBtn = document.getElementById('send-btn'); const appendMessage = (content, isUser, sources = []) => { const msgDiv = document.createElement('div'); msgDiv.className = `message ${isUser ? 'user-message' : 'bot-message'}`; // Parse markdown if it's from the bot const parsedContent = isUser ? content : marked.parse(content); let html = `
${parsedContent}
`; if (!isUser && sources.length > 0) { html += '
Sources:
'; sources.forEach(src => { html += `${src}`; }); html += '
'; } msgDiv.innerHTML = html; chatHistory.appendChild(msgDiv); chatHistory.scrollTop = chatHistory.scrollHeight; }; const handleQuery = async (forcedQuery = null) => { const query = (forcedQuery || queryInput.value).trim(); if (!query) return; appendMessage(query, true); queryInput.value = ''; // Add loading indicator const loadingDiv = document.createElement('div'); loadingDiv.className = 'message bot-message loading-indicator'; loadingDiv.innerHTML = 'Thinking'; chatHistory.appendChild(loadingDiv); chatHistory.scrollTop = chatHistory.scrollHeight; try { const response = await fetch('/ask', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ query }) }); const data = await response.json(); // Remove loading chatHistory.removeChild(loadingDiv); if (data.answer) { appendMessage(data.answer, false, data.sources); } else { appendMessage("Sorry, I encountered an error: " + (data.error || "Unknown error"), false); } } catch (error) { chatHistory.removeChild(loadingDiv); appendMessage("Connection error. Is the server running?", false); } }; // Suggestion chips document.querySelectorAll('.chip').forEach(chip => { chip.addEventListener('click', () => { handleQuery(chip.getAttribute('data-query')); }); }); sendBtn.addEventListener('click', () => handleQuery()); queryInput.addEventListener('keypress', (e) => { if (e.key === 'Enter') handleQuery(); }); });