import { DataLoader } from './data-loader.js'; import { TeamQuizGenerator, QuizQuestion } from './team-quiz-generator.js'; class GitHubWrappedQuiz { private dataLoader: DataLoader; private quizGenerator?: TeamQuizGenerator; private questions: QuizQuestion[] = []; private currentQuestion = 0; private score = 0; private answered = false; private selectedOption: number | null = null; constructor() { this.dataLoader = new DataLoader(); } async init(): Promise { try { const data = await this.dataLoader.load(); this.quizGenerator = new TeamQuizGenerator(data); this.questions = this.quizGenerator.getQuestions(); this.showWelcome(); } catch (error) { this.showError('Failed to load data. Make sure data.json exists.'); } } private showWelcome(): void { const container = document.getElementById('app')!; container.innerHTML = `
← Accueil
🎮

Team Quiz

Testez vos connaissances sur votre équipe !

${this.questions.length} Questions
4 Options

Devinez qui a fait quoi dans votre équipe !

`; document.getElementById('startBtn')?.addEventListener('click', () => { this.startQuiz(); }); } private startQuiz(): void { this.currentQuestion = 0; this.score = 0; this.renderQuestion(); } private renderQuestion(): void { const question = this.questions[this.currentQuestion]; const container = document.getElementById('app')!; this.answered = false; this.selectedOption = null; container.innerHTML = `
← Accueil
${this.currentQuestion + 1} / ${this.questions.length}
Score: ${this.score}
${question.emoji}

${question.question}

${question.options.map((option, index) => ` `).join('')}
`; // Add click handlers for options document.querySelectorAll('.quiz-option').forEach(option => { option.addEventListener('click', (e) => { if (this.answered) return; const index = parseInt((e.currentTarget as HTMLElement).dataset.index!); this.selectOption(index); }); }); document.getElementById('nextBtn')?.addEventListener('click', () => { this.nextQuestion(); }); } private selectOption(index: number): void { if (this.answered) return; this.answered = true; this.selectedOption = index; const question = this.questions[this.currentQuestion]; const isCorrect = index === question.correctIndex; if (isCorrect) { this.score++; } // Update UI document.querySelectorAll('.quiz-option').forEach((option, i) => { const optionEl = option as HTMLElement; optionEl.classList.add('disabled'); if (i === question.correctIndex) { optionEl.classList.add('correct'); } else if (i === index && !isCorrect) { optionEl.classList.add('wrong'); } }); // Show feedback const feedback = document.getElementById('feedback')!; const feedbackIcon = document.getElementById('feedbackIcon')!; const feedbackText = document.getElementById('feedbackText')!; const explanation = document.getElementById('explanation')!; const nextBtn = document.getElementById('nextBtn')!; feedback.style.display = 'block'; feedback.className = `quiz-feedback ${isCorrect ? 'correct' : 'wrong'}`; feedbackIcon.textContent = isCorrect ? '🎉' : '😅'; feedbackText.textContent = isCorrect ? 'Bonne reponse!' : 'Pas tout a fait...'; explanation.textContent = question.explanation; // Update score display document.querySelector('.quiz-score-value')!.textContent = this.score.toString(); // Show next button with animation setTimeout(() => { nextBtn.style.display = 'block'; }, 500); } private nextQuestion(): void { if (this.currentQuestion < this.questions.length - 1) { this.currentQuestion++; this.renderQuestion(); } else { this.showResults(); } } private showResults(): void { const container = document.getElementById('app')!; const percentage = Math.round((this.score / this.questions.length) * 100); let grade = ''; let gradeEmoji = ''; let message = ''; if (percentage >= 90) { grade = 'Expert'; gradeEmoji = '🏆'; message = 'Vous connaissez votre équipe par cœur !'; } else if (percentage >= 70) { grade = 'Tres Bien'; gradeEmoji = '🌟'; message = 'Excellente connaissance de l\'équipe !'; } else if (percentage >= 50) { grade = 'Bien'; gradeEmoji = '👍'; message = 'Pas mal ! Vous suivez bien l\'équipe.'; } else if (percentage >= 30) { grade = 'Peut mieux faire'; gradeEmoji = '🤔'; message = 'Il est temps de mieux connaître vos collègues !'; } else { grade = 'Oups!'; gradeEmoji = '😅'; message = 'Rejoignez plus de standups !'; } container.innerHTML = `
← Accueil
${gradeEmoji}

Quiz Terminé !

${this.score} / ${this.questions.length}
${percentage}%
Grade: ${grade}

${message}

Voir les Stats
🏠 Retour à l'Accueil
`; document.getElementById('retryBtn')?.addEventListener('click', () => { // Re-shuffle questions this.questions = this.quizGenerator!.getQuestions(); this.startQuiz(); }); } private showError(message: string): void { const container = document.getElementById('app')!; container.innerHTML = `

Erreur

${message}

`; } } // Initialize the quiz const quiz = new GitHubWrappedQuiz(); quiz.init();