dashboard.js (3692B)
1 /** 2 * Dashboard de Progresso 3 * Lê dados do localStorage e mostra estatísticas de estudo 4 */ 5 6 var PROGRESS_PREFIX = window.PROGRESS_PREFIX || 'quiz_progress_'; 7 8 function initDashboard() { 9 const dashboard = document.getElementById('dashboard-stats'); 10 if (!dashboard) return; 11 12 const stats = calculateStats(); 13 renderDashboard(stats); 14 } 15 16 function calculateStats() { 17 const allKeys = Object.keys(localStorage); 18 const progressKeys = allKeys.filter((k) => k.startsWith(PROGRESS_PREFIX)); 19 20 const stats = { 21 totalQuizzes: progressKeys.length, 22 totalAcertos: 0, 23 totalErros: 0, 24 disciplinas: {}, 25 }; 26 27 progressKeys.forEach((key) => { 28 try { 29 const data = JSON.parse(localStorage.getItem(key)); 30 if (!data || !data.questions) return; 31 32 const disciplina = key.replace(PROGRESS_PREFIX, '').split('_')[0]; 33 if (!stats.disciplinas[disciplina]) { 34 stats.disciplinas[disciplina] = { 35 acertos: 0, 36 erros: 0, 37 total: 0, 38 }; 39 } 40 41 stats.disciplinas[disciplina].acertos += data.acertos || 0; 42 stats.disciplinas[disciplina].erros += data.erros || 0; 43 stats.disciplinas[disciplina].total += data.questions.length; 44 45 stats.totalAcertos += data.acertos || 0; 46 stats.totalErros += data.erros || 0; 47 } catch (e) {} 48 }); 49 50 return stats; 51 } 52 53 function renderDashboard(stats) { 54 const dashboard = document.getElementById('dashboard-stats'); 55 if (!dashboard) return; 56 57 const totalQuestoes = stats.totalAcertos + stats.totalErros; 58 const pctGeral = totalQuestoes > 0 ? Math.round((stats.totalAcertos / totalQuestoes) * 100) : 0; 59 60 let html = ` 61 <div class="dashboard-container"> 62 <h2>📊 Seu Progresso de Estudo</h2> 63 64 <div class="dashboard-overview"> 65 <div class="stat-card"> 66 <div class="stat-label">Quizzes Iniciados</div> 67 <div class="stat-value">${stats.totalQuizzes}</div> 68 </div> 69 <div class="stat-card"> 70 <div class="stat-label">Taxa de Acerto Geral</div> 71 <div class="stat-value">${pctGeral}%</div> 72 </div> 73 <div class="stat-card"> 74 <div class="stat-label">Questões Respondidas</div> 75 <div class="stat-value">${totalQuestoes}</div> 76 </div> 77 </div> 78 79 <div class="dashboard-disciplines"> 80 <h3>Por Disciplina</h3> 81 `; 82 83 Object.entries(stats.disciplinas).forEach(([disc, data]) => { 84 const pct = data.total > 0 ? Math.round((data.acertos / data.total) * 100) : 0; 85 const nivel = pct >= 80 ? '🟢 Dominado' : pct >= 60 ? '🟡 Bom' : '🔴 Revisar'; 86 87 html += ` 88 <div class="disc-stat"> 89 <div class="disc-name">${disc}</div> 90 <div class="disc-bar"> 91 <div class="disc-progress" style="width: ${pct}%"></div> 92 </div> 93 <div class="disc-info"> 94 <span>${data.acertos}/${data.total}</span> 95 <span>${pct}%</span> 96 <span>${nivel}</span> 97 </div> 98 </div> 99 `; 100 }); 101 102 html += ` 103 </div> 104 <div class="dashboard-actions"> 105 <button class="btn" onclick="clearAllProgress()">Limpar Histórico</button> 106 </div> 107 </div> 108 `; 109 110 dashboard.innerHTML = html; 111 } 112 113 function clearAllProgress() { 114 if (confirm('Tem certeza que quer limpar todo o histórico de progresso?')) { 115 const allKeys = Object.keys(localStorage); 116 allKeys.forEach((key) => { 117 if (key.startsWith(PROGRESS_PREFIX)) { 118 localStorage.removeItem(key); 119 } 120 }); 121 initDashboard(); 122 } 123 } 124 125 // Inicializar quando o DOM estiver pronto 126 if (document.readyState === 'loading') { 127 document.addEventListener('DOMContentLoaded', initDashboard); 128 } else { 129 initDashboard(); 130 }