document.addEventListener("DOMContentLoaded", () => { console.log("js file loaded") const convo = document.querySelector(".convo"); const input = document.querySelector(".qt input"); const sendBtn = document.querySelector(".sendingQA"); const fileBtn = document.querySelector(".fa-file"); const imageBtn = document.querySelector(".fa-image"); let selectedFile = null; let filePreviewBubble = null; // Hidden file input const fileInput = document.createElement("input"); fileInput.type = "file"; fileInput.accept = ".pdf,.docx,.pptx,.xlsx,image/*"; fileInput.style.display = "none"; document.body.appendChild(fileInput); fileBtn.addEventListener("click", () => fileInput.click()); imageBtn.addEventListener("click", () => fileInput.click()); fileInput.addEventListener("change", () => { const file = fileInput.files[0]; if (file) { selectedFile = file; if (filePreviewBubble) filePreviewBubble.remove(); filePreviewBubble = document.createElement("div"); filePreviewBubble.className = "file-preview-bubble bubble right"; filePreviewBubble.textContent = `📎 Selected: ${file.name}`; convo.appendChild(filePreviewBubble); convo.scrollTop = convo.scrollHeight; } }); function createMessageBubble(text, sender = "You", audioSrc = null, fileName = null) { const bubble = document.createElement("div"); bubble.className = `bubble ${sender === "You" ? "right" : "left"}`; const label = document.createElement("div"); label.className = "label"; label.innerText = sender; const message = document.createElement("div"); message.className = "text"; message.style.whiteSpace = "pre-wrap"; if (sender === "You") { let fileLine = fileName ? `📎 Selected file: ${fileName}\n` : ""; message.innerText = `${fileLine}❓ ${text}`; } else { message.style.display = "flex"; message.style.justifyContent = "space-between"; message.style.alignItems = "center"; const msgSpan = document.createElement("span"); msgSpan.innerText = text; message.appendChild(msgSpan); if (audioSrc) { const icon = document.createElement("i"); icon.className = "fa-solid fa-volume-high audio-toggle"; icon.title = "Click to mute"; icon.style.cursor = "pointer"; icon.style.fontSize = "18px"; const audio = new Audio(audioSrc); audio.play(); icon.addEventListener("click", () => { if (audio.muted) { audio.currentTime = 0; audio.muted = false; icon.classList.remove("fa-volume-xmark"); icon.classList.add("fa-volume-high"); icon.title = "Click to mute"; audio.play(); } else { audio.muted = true; icon.classList.remove("fa-volume-high"); icon.classList.add("fa-volume-xmark"); icon.title = "Click to unmute"; } }); message.appendChild(icon); } } bubble.appendChild(label); bubble.appendChild(message); convo.appendChild(bubble); convo.scrollTop = convo.scrollHeight; return bubble; } async function sendMessage() { const question = input.value.trim(); if (!question) return; if (!selectedFile) { alert("Please upload a document or image first."); return; } // Remove file preview bubble if (filePreviewBubble) { filePreviewBubble.remove(); filePreviewBubble = null; } // User message with file info createMessageBubble(question, "You", null, selectedFile.name); // Aidan is thinking... const thinkingBubble = createMessageBubble("Wait, Let me think 🤔...", "Aidan"); const formData = new FormData(); formData.append("question", question); formData.append("file", selectedFile); try { const response = await fetch("/qtAnswering/predict", { method: "POST", body: formData }); const result = await response.json(); const answerText = result.answer || "No response."; const audioSrc = result.audio || null; // Replace "Let me think..." with actual answer const message = thinkingBubble.querySelector(".text"); message.innerText = answerText; if (audioSrc) { const icon = document.createElement("i"); icon.className = "fa-solid fa-volume-high audio-toggle"; icon.title = "Click to mute"; icon.style.cursor = "pointer"; icon.style.fontSize = "18px"; icon.style.marginLeft = "10px"; const audio = new Audio(audioSrc); audio.play(); icon.addEventListener("click", () => { if (audio.muted) { audio.currentTime = 0; audio.muted = false; icon.classList.remove("fa-volume-xmark"); icon.classList.add("fa-volume-high"); icon.title = "Click to mute"; audio.play(); } else { audio.muted = true; icon.classList.remove("fa-volume-high"); icon.classList.add("fa-volume-xmark"); icon.title = "Click to unmute"; } }); message.style.display = "flex"; message.style.justifyContent = "space-between"; message.appendChild(icon); } } catch (err) { const message = thinkingBubble.querySelector(".text"); message.innerText = "⚠️ Aidan had trouble responding."; } // Clear inputs after processing is complete input.value = ""; selectedFile = null; } // Click event for send button sendBtn.addEventListener("click", sendMessage); // Enter key event for input field input.addEventListener("keydown", (event) => { if (event.key === "Enter") { event.preventDefault(); // Prevent form submission sendMessage(); } }); var backarrow = document.querySelector(".fa-arrow-left"); backarrow.addEventListener('click', function () { window.location.href = '/'; }); });