230 lines
6.9 KiB
JavaScript
230 lines
6.9 KiB
JavaScript
// Study Mode Module
|
|
class StudyMode extends BaseModule {
|
|
constructor() {
|
|
super();
|
|
this.showingAnswer = false;
|
|
this.navigator = null;
|
|
this.init();
|
|
}
|
|
|
|
init() {
|
|
this.setupEventListeners();
|
|
this.loadQuestions();
|
|
}
|
|
|
|
setupEventListeners() {
|
|
// Filter controls
|
|
document.getElementById('apply-filters')?.addEventListener('click', () => {
|
|
this.loadQuestions();
|
|
});
|
|
|
|
document.getElementById('reset-filters')?.addEventListener('click', () => {
|
|
document.getElementById('start-question').value = 1;
|
|
document.getElementById('end-question').value = 200;
|
|
this.loadQuestions();
|
|
});
|
|
|
|
// Navigation controls
|
|
document.getElementById('prev-btn')?.addEventListener('click', () => {
|
|
this.previousQuestion();
|
|
});
|
|
|
|
document.getElementById('next-btn')?.addEventListener('click', () => {
|
|
this.nextQuestion();
|
|
});
|
|
|
|
// Answer controls
|
|
document.getElementById('show-answer')?.addEventListener('click', () => {
|
|
this.showAnswer();
|
|
});
|
|
|
|
document.getElementById('hide-answer')?.addEventListener('click', () => {
|
|
this.hideAnswer();
|
|
});
|
|
|
|
// Keyboard navigation
|
|
document.addEventListener('keydown', (e) => {
|
|
this.handleKeyboard(e);
|
|
});
|
|
}
|
|
|
|
async loadQuestions() {
|
|
this.showLoading();
|
|
BaseModule.hide('study-content');
|
|
BaseModule.hide('no-questions');
|
|
|
|
const start = document.getElementById('start-question').value;
|
|
const end = document.getElementById('end-question').value;
|
|
|
|
try {
|
|
const data = await this.fetchQuestions({
|
|
mode: 'range',
|
|
start: start,
|
|
end: end
|
|
});
|
|
|
|
this.questions = data;
|
|
this.currentIndex = 0;
|
|
|
|
if (this.questions.length === 0) {
|
|
this.hideLoading();
|
|
BaseModule.show('no-questions');
|
|
return;
|
|
}
|
|
|
|
document.getElementById('total-questions').textContent = this.questions.length;
|
|
|
|
// Initialize navigator
|
|
this.initializeNavigator(start, end);
|
|
|
|
this.displayQuestion();
|
|
this.updateProgress('study-progress');
|
|
|
|
this.hideLoading();
|
|
BaseModule.show('study-content');
|
|
|
|
} catch (error) {
|
|
this.hideLoading();
|
|
console.error('Error in loadQuestions:', error);
|
|
}
|
|
}
|
|
|
|
initializeNavigator(start, end) {
|
|
if (!this.navigator) {
|
|
this.navigator = new QuestionNavigator('question-navigator', {
|
|
onQuestionSelect: (index) => {
|
|
this.currentIndex = index;
|
|
this.displayQuestion();
|
|
this.hideAnswer();
|
|
},
|
|
storagePrefix: `study_${start}_${end}`
|
|
});
|
|
}
|
|
|
|
this.navigator.setQuestions(this.questions);
|
|
}
|
|
|
|
displayQuestion() {
|
|
if (this.questions.length === 0) return;
|
|
|
|
const question = this.questions[this.currentIndex];
|
|
|
|
let html = this.createQuestionHTML(question, this.currentIndex, this.questions.length);
|
|
html += this.createOptionsHTML(question.options, question.correct);
|
|
|
|
document.getElementById('question-container').innerHTML = html;
|
|
|
|
// Animate options
|
|
this.animateOptions();
|
|
|
|
this.updateNavigation('prev-btn', 'next-btn', 'current-question');
|
|
this.updateProgress('study-progress');
|
|
|
|
if (this.navigator) {
|
|
this.navigator.setCurrentIndex(this.currentIndex);
|
|
}
|
|
}
|
|
|
|
animateOptions() {
|
|
const options = document.querySelectorAll('.option-btn');
|
|
options.forEach((option, index) => {
|
|
option.style.opacity = '0';
|
|
option.style.transform = 'translateY(20px)';
|
|
setTimeout(() => {
|
|
option.style.transition = 'all 0.3s ease';
|
|
option.style.opacity = '1';
|
|
option.style.transform = 'translateY(0)';
|
|
}, index * 100);
|
|
});
|
|
}
|
|
|
|
showAnswer() {
|
|
const correctOption = document.querySelector('.option-btn[data-correct="true"]');
|
|
if (correctOption) {
|
|
correctOption.classList.add('correct', 'correct-option');
|
|
correctOption.style.background = 'rgba(39, 174, 96, 0.3)';
|
|
correctOption.style.borderColor = '#27ae60';
|
|
correctOption.style.color = '#ffffff';
|
|
correctOption.style.fontWeight = 'bold';
|
|
|
|
const indicator = correctOption.querySelector('.answer-indicator');
|
|
if (indicator) {
|
|
indicator.style.display = 'inline';
|
|
}
|
|
}
|
|
|
|
// Dim incorrect options
|
|
const incorrectOptions = document.querySelectorAll('.option-btn[data-correct="false"]');
|
|
incorrectOptions.forEach(option => {
|
|
option.classList.add('text-muted');
|
|
option.style.opacity = '0.6';
|
|
});
|
|
|
|
BaseModule.hide('show-answer');
|
|
BaseModule.show('hide-answer');
|
|
this.showingAnswer = true;
|
|
}
|
|
|
|
hideAnswer() {
|
|
const allOptions = document.querySelectorAll('.option-btn');
|
|
allOptions.forEach(option => {
|
|
option.classList.remove('correct', 'correct-option', 'text-muted');
|
|
option.style.background = '';
|
|
option.style.borderColor = '';
|
|
option.style.color = '';
|
|
option.style.fontWeight = '';
|
|
option.style.opacity = '';
|
|
});
|
|
|
|
const indicators = document.querySelectorAll('.answer-indicator');
|
|
indicators.forEach(indicator => {
|
|
indicator.style.display = 'none';
|
|
});
|
|
|
|
BaseModule.show('show-answer');
|
|
BaseModule.hide('hide-answer');
|
|
this.showingAnswer = false;
|
|
}
|
|
|
|
previousQuestion() {
|
|
if (this.currentIndex > 0) {
|
|
this.currentIndex--;
|
|
this.displayQuestion();
|
|
this.hideAnswer();
|
|
}
|
|
}
|
|
|
|
nextQuestion() {
|
|
if (this.currentIndex < this.questions.length - 1) {
|
|
this.currentIndex++;
|
|
this.displayQuestion();
|
|
this.hideAnswer();
|
|
}
|
|
}
|
|
|
|
handleKeyboard(e) {
|
|
if (e.key === 'ArrowLeft' && this.currentIndex > 0) {
|
|
this.previousQuestion();
|
|
} else if (e.key === 'ArrowRight' && this.currentIndex < this.questions.length - 1) {
|
|
this.nextQuestion();
|
|
} else if (e.key === ' ') {
|
|
e.preventDefault();
|
|
if (this.showingAnswer) {
|
|
this.hideAnswer();
|
|
} else {
|
|
this.showAnswer();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Auto-initialize when DOM is ready
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
if (document.getElementById('study-content')) {
|
|
window.studyMode = new StudyMode();
|
|
}
|
|
});
|
|
|
|
// Export for global use
|
|
window.StudyMode = StudyMode;
|