class InkBoard { constructor() { this.currentCreationId = null; this.currentSection = 'create'; this.init(); } init() { this.setupEventListeners(); this.loadGallery(); this.showSection('create'); } setupEventListeners() { document.getElementById('scene-form').addEventListener('submit', (e) => { e.preventDefault(); this.generateContent(); }); document.getElementById('save-journal').addEventListener('click', () => { this.saveJournal(); }); document.getElementById('journalModal').addEventListener('hidden.bs.modal', () => { this.currentCreationId = null; document.getElementById('journal-text').value = ''; }); } async generateContent() { const sceneIdea = document.getElementById('scene-idea').value.trim(); if (!sceneIdea) { this.showAlert('Please enter a scene idea', 'danger'); return; } try { this.showLoading(true); this.setButtonLoading(true); const response = await fetch('/generate', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ scene_idea: sceneIdea }) }); const data = await response.json(); if (data.success) { this.displayResult(data); this.loadGallery(); document.getElementById('scene-idea').value = ''; this.showAlert('Story and image generated successfully!', 'success'); } else { this.showAlert(data.error || 'Failed to generate content', 'danger'); } } catch (error) { console.error('Error generating content:', error); this.showAlert('Network error. Please try again.', 'danger'); } finally { this.showLoading(false); this.setButtonLoading(false); } } displayResult(data) { const resultsSection = document.getElementById('results-section'); const imageSection = data.image_url ? `
${data.story}
Start by describing a scene above!
${creation.journal_entry}
${creation.journal_entry}