Spaces:
Running
Running
| document.addEventListener('DOMContentLoaded', function() { | |
| const form = document.getElementById('uploadForm'); | |
| const imageInput = document.getElementById('imageInput'); | |
| const submitBtn = document.getElementById('submitBtn'); | |
| const spinner = submitBtn.querySelector('.spinner-border'); | |
| const resultSection = document.getElementById('resultSection'); | |
| const previewImage = document.getElementById('previewImage'); | |
| const captionText = document.getElementById('captionText'); | |
| const errorAlert = document.getElementById('errorAlert'); | |
| const uploadApp = document.querySelector('.upload-app'); | |
| // Preview image when selected | |
| imageInput.addEventListener('change', function(e) { | |
| const file = e.target.files[0]; | |
| if (file) { | |
| const reader = new FileReader(); | |
| reader.onload = function(e) { | |
| previewImage.src = e.target.result; | |
| resultSection.classList.remove('d-none'); | |
| captionText.textContent = ''; | |
| errorAlert.classList.add('d-none'); | |
| // Add success animation class | |
| uploadApp.classList.add('file-selected'); | |
| }; | |
| reader.readAsDataURL(file); | |
| } | |
| }); | |
| form.addEventListener('submit', async function(e) { | |
| e.preventDefault(); | |
| const formData = new FormData(); | |
| const file = imageInput.files[0]; | |
| if (!file) { | |
| showError('Please select an image first.'); | |
| return; | |
| } | |
| // Add file and selected model to form data | |
| formData.append('image', file); | |
| formData.append('model', document.querySelector('input[name="model"]:checked').value); | |
| // Show loading state | |
| setLoading(true); | |
| try { | |
| const response = await fetch('/upload', { | |
| method: 'POST', | |
| body: formData | |
| }); | |
| const data = await response.json(); | |
| if (!response.ok) { | |
| throw new Error(data.error || 'Failed to generate caption'); | |
| } | |
| // Display the caption | |
| captionText.textContent = data.caption; | |
| resultSection.classList.remove('d-none'); | |
| errorAlert.classList.add('d-none'); | |
| } catch (error) { | |
| showError(error.message || 'An error occurred while generating the caption'); | |
| } finally { | |
| setLoading(false); | |
| } | |
| }); | |
| function setLoading(isLoading) { | |
| submitBtn.disabled = isLoading; | |
| spinner.classList.toggle('d-none', !isLoading); | |
| submitBtn.textContent = isLoading ? ' Processing...' : 'Generate Caption'; | |
| if (isLoading) { | |
| submitBtn.prepend(spinner); | |
| } | |
| } | |
| function showError(message) { | |
| errorAlert.textContent = message; | |
| errorAlert.classList.remove('d-none'); | |
| } | |
| }); |