ikraamkb's picture
Update static/appS.js
2a8891b verified
raw
history blame
9.34 kB
document.addEventListener('DOMContentLoaded', () => {
const GotitB = document.querySelector(".explainChoix button");
const explain = document.querySelector(".explainChoix");
const SummarizeInput = document.querySelector(".SummarizeInput");
const CaptionInput = document.querySelector(".CaptionInput");
const fileUpload = document.getElementById('file-upload');
const imageUpload = document.getElementById('image-upload');
const fileBtn = document.getElementById('file-btn');
const imageBtn = document.getElementById('image-btn');
const convo = document.querySelector('.convo');
GotitB.addEventListener("click", () => {
explain.style.opacity = "0";
});
document.querySelectorAll('.select-options input[type="radio"]').forEach(radio => {
radio.addEventListener('change', (e) => {
if (e.target.checked) {
const selectedValue = e.target.value;
if (selectedValue === "Summarize") {
SummarizeInput.classList.add("active");
SummarizeInput.classList.remove("innactive");
CaptionInput.classList.remove("active");
CaptionInput.classList.add("innactive");
} else {
SummarizeInput.classList.add("innactive");
SummarizeInput.classList.remove("active");
CaptionInput.classList.remove("innactive");
CaptionInput.classList.add("active");
}
}
});
});
fileBtn.addEventListener('click', () => fileUpload.click());
imageBtn.addEventListener('click', () => imageUpload.click());
document.querySelectorAll('.sendingQA').forEach(button => {
button.addEventListener('click', async () => {
const isSummarizeMode = document.querySelector('input[name="option"]:checked').value === 'Summarize';
if (isSummarizeMode) {
await handleSummarize();
} else {
await handleCaption();
}
});
});
convo.addEventListener('dragover', (e) => {
e.preventDefault();
convo.classList.add('drag-over');
});
convo.addEventListener('dragleave', () => {
convo.classList.remove('drag-over');
});
convo.addEventListener('drop', async (e) => {
e.preventDefault();
convo.classList.remove('drag-over');
if (e.dataTransfer.files.length) {
const file = e.dataTransfer.files[0];
const isSummarizeMode = document.querySelector('input[name="option"]:checked').value === 'Summarize';
if (isSummarizeMode) {
fileUpload.files = e.dataTransfer.files;
await handleSummarize();
} else {
imageUpload.files = e.dataTransfer.files;
await handleCaption();
}
}
});
async function handleSummarize() {
const file = fileUpload.files[0];
if (!file) {
displayError('Please upload a document first');
return;
}
console.log("Selected file:", file.name, "Type:", file.type);
const length = document.querySelector('input[name="optionS"]:checked')?.value || "medium";
try {
convo.innerHTML = '';
displayFileInfo(file.name, 'document');
displayThinkingMessage();
console.log("Starting summarization...");
const result = await summarizeDocument(file, length);
console.log("Summarization result:", result);
displaySummaryResult(file.name, result.summary, result.audioUrl, result.pdfUrl);
} catch (error) {
console.error("Summarization failed:", error);
displayError(error.message || 'Failed to summarize document');
}
}
async function handleCaption() {
const file = imageUpload.files[0];
if (!file) {
displayError('Please upload an image first');
return;
}
try {
convo.innerHTML = '';
displayFileInfo(file.name, 'image');
displayThinkingMessage();
const caption = await captionImage(file);
displayCaptionResult(file.name, caption);
} catch (error) {
displayError(error.message || 'Failed to generate caption');
}
}
async function summarizeDocument(file, length) {
const formData = new FormData();
formData.append('file', file);
formData.append('length', length);
try {
const response = await fetch('/summarize/', {
method: 'POST',
body: formData
});
const result = await response.json();
if (!response.ok) {
throw new Error(result.detail || result.message || "Summarization failed");
}
// Map backend fields to frontend expectations
return {
summary: result.summary,
audioUrl: result.audio_url || result.audioUrl,
pdfUrl: result.pdf_url || result.pdfUrl
};
} catch (error) {
console.error("Summarization error:", error);
throw error;
}
}
async function captionImage(file) {
const formData = new FormData();
formData.append('file', file);
const response = await fetch('/imagecaption/', {
method: 'POST',
body: formData
});
if (!response.ok) {
const error = await response.json();
throw new Error(error.detail || 'Captioning failed');
}
const result = await response.json();
return result.caption;
}
function displayFileInfo(filename, type) {
const bubble = document.createElement('div');
bubble.className = 'bubble right';
bubble.innerHTML = `
<div class="label">You</div>
<div class="text">${type === 'document' ? '๐Ÿ“„' : '๐Ÿ–ผ๏ธ'} ${filename}</div>
`;
convo.appendChild(bubble);
}
function displayThinkingMessage() {
const bubble = document.createElement('div');
bubble.className = 'bubble left';
bubble.innerHTML = `
<div class="label">Aidan</div>
<div class="text">
<div style="display:flex;align-items:center;gap:8px">
<span>Processing...</span>
<div class="loader"></div>
</div>
</div>
`;
convo.appendChild(bubble);
convo.scrollTop = convo.scrollHeight;
}
function displaySummaryResult(filename, summary, audioUrl, pdfUrl) {
// Remove thinking message if it exists
const lastBubble = convo.lastChild;
if (lastBubble && lastBubble.querySelector('.loader')) {
convo.removeChild(lastBubble);
}
const bubble = document.createElement('div');
bubble.className = 'bubble left';
// Safely handle missing summary
const summaryContent = summary ? summary.replace(/\n/g, '<br>') : "No summary generated";
bubble.innerHTML = `
<div class="label">Aidan</div>
<div class="text">
<strong>Summary:</strong><br><br>
${summaryContent}
${audioUrl ? `<br><br><audio controls src="${audioUrl}" style="width: 100%;"></audio>` : ''}
${pdfUrl ? `<br><a href="${pdfUrl}" download="${filename.replace(/\.[^/.]+$/, '')}_summary.pdf" class="download-link">๐Ÿ“ฅ Download PDF Summary</a>` : ''}
</div>
`;
convo.appendChild(bubble);
convo.scrollTop = convo.scrollHeight;
}
function displayCaptionResult(filename, caption) {
convo.removeChild(convo.lastChild);
const bubble = document.createElement('div');
bubble.className = 'bubble left';
bubble.innerHTML = `
<div class="label">Aidan</div>
<div class="text">
<strong>Caption:</strong><br><br>
${caption}
</div>
`;
convo.appendChild(bubble);
convo.scrollTop = convo.scrollHeight;
}
function displayError(message) {
const bubble = document.createElement('div');
bubble.className = 'bubble left';
bubble.innerHTML = `
<div class="label">Aidan</div>
<div class="text" style="color: #ef4444;">
โš ๏ธ ${message}
</div>
`;
convo.appendChild(bubble);
convo.scrollTop = convo.scrollHeight;
}
const style = document.createElement('style');
style.textContent = `
.loader {
border: 2px solid #f3f3f3;
border-top: 2px solid #3b82f6;
border-radius: 50%;
width: 16px;
height: 16px;
animation: spin 1s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
.download-link {
display: inline-block;
margin-top: 10px;
padding: 5px 10px;
background: #3b82f6;
color: white;
border-radius: 5px;
text-decoration: none;
}
.download-link:hover {
background: #2563eb;
}
`;
document.head.appendChild(style);
});