Spaces:
Runtime error
Runtime error
| const sessionId = localStorage.getItem('currentSessionId'); | |
| async function fetchReportData() { | |
| try { | |
| if (!sessionId) { | |
| document.getElementById('dominant-emotion').textContent = "Tidak ada data"; | |
| return; | |
| } | |
| const response = await fetch(`http://localhost:8080/api/session-report/${sessionId}`); | |
| const data = await response.json(); | |
| if (data.error) { | |
| document.getElementById('dominant-emotion').textContent = data.error; | |
| return; | |
| } | |
| document.getElementById('dominant-emotion').textContent = capitalizeFirstLetter(data.dominantEmotion); | |
| document.getElementById('avg-stress').textContent = data.averageStressLevel; | |
| setStressLevelColor('avg-stress', data.averageStressLevel); | |
| document.getElementById('total-frames').textContent = data.totalFrames; | |
| document.getElementById('max-stress').textContent = data.maxStressLevel; | |
| document.getElementById('min-stress').textContent = data.minStressLevel; | |
| document.getElementById('duration').textContent = `${Math.round(data.totalFrames / 1)} detik`; | |
| setStressInterpretation(data.averageStressLevel); | |
| createEmotionChart(data.emotionCounts); | |
| } catch (error) { | |
| console.error('Error fetching report data:', error); | |
| document.getElementById('dominant-emotion').textContent = "Error mengambil data laporan"; | |
| } | |
| } | |
| function capitalizeFirstLetter(string) { | |
| return string.charAt(0).toUpperCase() + string.slice(1); | |
| } | |
| function setStressLevelColor(elementId, stressLevel) { | |
| const element = document.getElementById(elementId); | |
| if (stressLevel >= 80) { | |
| element.classList.add('text-red-600'); | |
| } else if (stressLevel >= 50) { | |
| element.classList.add('text-yellow-600'); | |
| } else { | |
| element.classList.add('text-green-600'); | |
| } | |
| } | |
| function setStressInterpretation(stressLevel) { | |
| const interpretationElement = document.getElementById('stress-interpretation'); | |
| let message, bgColor, textColor; | |
| if (stressLevel >= 80) { | |
| message = "Tingkat stres tinggi. Rekomendasi: Istirahat dan konsultasi dengan profesional kesehatan mental."; | |
| bgColor = "bg-red-100"; | |
| textColor = "text-red-800"; | |
| } else if (stressLevel >= 50) { | |
| message = "Tingkat stres sedang. Rekomendasi: Pertimbangkan teknik relaksasi dan manajemen stres."; | |
| bgColor = "bg-yellow-100"; | |
| textColor = "text-yellow-800"; | |
| } else { | |
| message = "Tingkat stres rendah. Tetap jaga kesehatan fisik dan mental."; | |
| bgColor = "bg-green-100"; | |
| textColor = "text-green-800"; | |
| } | |
| interpretationElement.classList.add(bgColor, textColor); | |
| interpretationElement.textContent = message; | |
| } | |
| function createEmotionChart(emotionCounts) { | |
| const ctx = document.getElementById('emotion-chart').getContext('2d'); | |
| const labels = Object.keys(emotionCounts).map(emotion => capitalizeFirstLetter(emotion)); | |
| const data = Object.values(emotionCounts); | |
| const backgroundColors = [ | |
| 'rgba(255, 99, 132, 0.7)', | |
| 'rgba(75, 192, 192, 0.7)', | |
| 'rgba(255, 205, 86, 0.7)', | |
| 'rgba(54, 162, 235, 0.7)', | |
| 'rgba(153, 102, 255, 0.7)', | |
| 'rgba(201, 203, 207, 0.7)', | |
| 'rgba(255, 159, 64, 0.7)' | |
| ]; | |
| new Chart(ctx, { | |
| type: 'doughnut', | |
| data: { | |
| labels: labels, | |
| datasets: [{ | |
| data: data, | |
| backgroundColor: backgroundColors.slice(0, labels.length), | |
| borderColor: 'white', | |
| borderWidth: 2 | |
| }] | |
| }, | |
| options: { | |
| responsive: true, | |
| maintainAspectRatio: false, | |
| plugins: { | |
| legend: { | |
| position: 'right' | |
| } | |
| } | |
| } | |
| }); | |
| } | |
| window.addEventListener('DOMContentLoaded', fetchReportData); |