File size: 4,186 Bytes
cb28fad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
    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);