Files
driving-academy/static/js/modules/stats-display.js
2025-10-26 23:39:49 -05:00

223 lines
7.3 KiB
JavaScript

// Stats Display Module for Index Page
class StatsDisplay {
constructor() {
this.init();
}
init() {
this.setupEventListeners();
this.loadStats();
}
setupEventListeners() {
// Reset stats modal listeners
document.getElementById('reset-stats-btn')?.addEventListener('click', () => {
this.showResetStatsModal();
});
document.getElementById('resetStatsModalClose')?.addEventListener('click', () => {
this.hideResetStatsModal();
});
document.getElementById('resetStatsModalCancel')?.addEventListener('click', () => {
this.hideResetStatsModal();
});
document.getElementById('resetStatsBackdrop')?.addEventListener('click', () => {
this.hideResetStatsModal();
});
document.getElementById('confirmResetStats')?.addEventListener('click', () => {
this.resetStats();
});
// Keyboard support for modal
document.addEventListener('keydown', (e) => {
const modal = document.getElementById('resetStatsModal');
if (modal && modal.style.display === 'block') {
if (e.key === 'Escape') {
this.hideResetStatsModal();
} else if (e.key === 'Enter') {
const focusedElement = document.activeElement;
if (focusedElement.id === 'confirmResetStats') {
this.resetStats();
} else {
this.hideResetStatsModal();
}
}
}
});
}
loadStats() {
// Load statistics from localStorage
let stats = {
total_answered: 0,
correct_answers: 0,
incorrect_answers: 0,
accuracy: 0
};
// Try to load from localStorage
try {
const savedStats = localStorage.getItem('balotario_stats');
if (savedStats) {
const parsedStats = JSON.parse(savedStats);
stats = {
total_answered: parsedStats.totalAnswered || 0,
correct_answers: parsedStats.correctAnswers || 0,
incorrect_answers: parsedStats.incorrectAnswers || 0,
accuracy: parsedStats.accuracy || 0
};
}
} catch (error) {
console.warn('Error loading stats from localStorage:', error);
}
// Update UI
this.updateStatsDisplay(stats);
}
updateStatsDisplay(stats) {
const totalAnsweredEl = document.getElementById('total-answered');
const accuracyEl = document.getElementById('accuracy');
const accuracyBarEl = document.getElementById('accuracy-bar');
const resetBtnEl = document.getElementById('reset-stats-btn');
if (totalAnsweredEl) totalAnsweredEl.textContent = stats.total_answered;
if (accuracyEl) accuracyEl.textContent = stats.accuracy + '%';
if (accuracyBarEl) accuracyBarEl.style.width = stats.accuracy + '%';
// Show/hide reset button based on stats
if (resetBtnEl) {
if (stats.total_answered > 0) {
resetBtnEl.style.display = 'inline-block';
} else {
resetBtnEl.style.display = 'none';
}
}
}
showResetStatsModal() {
if (window.Utils) {
Utils.playSound('click');
}
const modal = document.getElementById('resetStatsModal');
if (modal) {
modal.style.display = 'block';
document.body.classList.add('modal-open');
// Focus cancel button for accessibility
setTimeout(() => {
const cancelBtn = document.getElementById('resetStatsModalCancel');
if (cancelBtn) cancelBtn.focus();
}, 100);
}
}
hideResetStatsModal() {
const dialog = document.getElementById('resetStatsDialog');
if (dialog) {
dialog.classList.add('modal-closing');
setTimeout(() => {
const modal = document.getElementById('resetStatsModal');
if (modal) {
modal.style.display = 'none';
document.body.classList.remove('modal-open');
dialog.classList.remove('modal-closing');
}
}, 200);
}
}
resetStats() {
// Show loading in button
const confirmBtn = document.getElementById('confirmResetStats');
if (!confirmBtn) return;
const originalText = confirmBtn.innerHTML;
confirmBtn.innerHTML = '<i class="fas fa-spinner fa-spin me-1"></i>Restableciendo...';
confirmBtn.disabled = true;
// Reset statistics directly in localStorage
try {
// Reset using statsManager if available
if (window.statsManager) {
window.statsManager.resetStats();
} else {
// Reset directly in localStorage
const resetStats = {
totalAnswered: 0,
correctAnswers: 0,
incorrectAnswers: 0,
accuracy: 0,
studyTime: 0,
examsTaken: 0,
bestScore: 0,
streak: 0,
lastActivity: null
};
localStorage.setItem('balotario_stats', JSON.stringify(resetStats));
}
// Simulate a small pause for better UX
setTimeout(() => {
// Reload statistics
this.loadStats();
// Hide modal
this.hideResetStatsModal();
// Restore button
confirmBtn.innerHTML = originalText;
confirmBtn.disabled = false;
// Show success notification
if (window.Utils) {
Utils.showNotification('Estadísticas restablecidas correctamente', 'success', 4000);
Utils.playSound('complete');
} else {
alert('Estadísticas restablecidas correctamente');
}
// Small animation on stats card
const statsCard = document.querySelector('.stats-card');
if (statsCard) {
statsCard.style.transform = 'scale(1.05)';
statsCard.style.transition = 'transform 0.3s ease';
setTimeout(() => {
statsCard.style.transform = 'scale(1)';
}, 300);
}
}, 800);
} catch (error) {
console.error('Error resetting stats:', error);
// Restore button on error
confirmBtn.innerHTML = originalText;
confirmBtn.disabled = false;
if (window.Utils) {
Utils.showNotification('Error al restablecer estadísticas', 'danger');
} else {
alert('Error al restablecer estadísticas');
}
}
}
}
// Auto-initialize when DOM is ready
document.addEventListener('DOMContentLoaded', function() {
if (document.getElementById('stats-content')) {
window.statsDisplay = new StatsDisplay();
}
});
// Export for global use
window.StatsDisplay = StatsDisplay;