PantunGen / static /js /generator.js
Mascode01's picture
Upload 21 files
28b723d verified
Raw
History Blame Contribute Delete
4.32 kB
document.addEventListener('DOMContentLoaded', () => {
// Auto-fill form if parameters exist in URL (from Home page)
const urlParams = new URLSearchParams(window.location.search);
const temaParam = urlParams.get('tema');
if (temaParam) {
document.getElementById('tema-input').value = temaParam;
}
const form = document.getElementById('generate-form');
const generateBtn = document.getElementById('generate-btn');
const btnText = document.getElementById('btn-text');
const btnSpinner = document.getElementById('btn-spinner');
const emptyState = document.getElementById('empty-state');
const resultContainer = document.getElementById('result-container');
const resultBadge = document.getElementById('result-badge');
const resultText = document.getElementById('result-text');
const analyticsContainer = document.getElementById('analytics-container');
const visualizationContainer = document.getElementById('visualization-container');
form.addEventListener('submit', async (e) => {
e.preventDefault();
const tema = document.getElementById('tema-input').value.trim();
const gaya = document.getElementById('gaya-input').value;
if (!tema) {
window.showToast('Tema tidak boleh kosong!', 'error');
return;
}
// Set Loading State
setLoadingState(true);
try {
const response = await fetch('/api/generate', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ tema, gaya })
});
if (!response.ok) {
throw new Error('Terjadi kesalahan pada server');
}
const data = await response.json();
// Display Results
displayResults(data);
} catch (error) {
console.error('Generation error:', error);
window.showToast(error.message || 'Gagal terhubung ke server', 'error');
} finally {
// Remove Loading State
setLoadingState(false);
}
});
function setLoadingState(isLoading) {
if (isLoading) {
generateBtn.disabled = true;
btnText.textContent = 'Memproses...';
btnSpinner.classList.remove('hidden');
// Hide previous results if any
resultContainer.classList.add('hidden');
analyticsContainer.classList.add('hidden');
visualizationContainer.classList.add('hidden');
// Show empty state briefly with loading indication if desired
// Or leave it hidden during loading
emptyState.classList.add('hidden');
} else {
generateBtn.disabled = false;
btnText.textContent = 'Generate Now';
btnSpinner.classList.add('hidden');
}
}
function displayResults(data) {
// Update DOM elements with data
resultBadge.textContent = `Tema: ${data.tema} | Gaya: ${data.gaya}`;
resultText.textContent = data.pantun;
document.getElementById('stat-rima').textContent = data.pola_rima;
document.getElementById('stat-suku').textContent = data.suku_kata;
document.getElementById('stat-conf').textContent = `${(data.confidence * 100).toFixed(0)}%`;
document.getElementById('stat-sent').textContent = data.sentiment;
// Apply animations
resultContainer.classList.remove('hidden');
resultContainer.classList.add('fade-in');
analyticsContainer.classList.remove('hidden');
analyticsContainer.classList.add('fade-in');
visualizationContainer.classList.remove('hidden');
visualizationContainer.classList.add('fade-in');
// Ensure empty state is hidden
emptyState.classList.add('hidden');
// Remove animation class after it completes to allow re-triggering
setTimeout(() => {
resultContainer.classList.remove('fade-in');
analyticsContainer.classList.remove('fade-in');
visualizationContainer.classList.remove('fade-in');
}, 500);
}
});