diff --git a/src/index.js b/src/index.js index 03737ba3..8784f3b8 100644 --- a/src/index.js +++ b/src/index.js @@ -3,172 +3,161 @@ document.addEventListener("DOMContentLoaded", () => { // View divs const quizView = document.querySelector("#quizView"); const endView = document.querySelector("#endView"); - // Quiz view elements const progressBar = document.querySelector("#progressBar"); const questionCount = document.querySelector("#questionCount"); const questionContainer = document.querySelector("#question"); const choiceContainer = document.querySelector("#choices"); const nextButton = document.querySelector("#nextButton"); - + const choicesElements = document.getElementsByName("choice"); + const timeRemainingContainer = document.getElementById("timeRemaining"); // End view elements const resultContainer = document.querySelector("#result"); - - /************ SET VISIBILITY OF VIEWS ************/ - // Show the quiz view (div#quizView) and hide the end view (div#endView) quizView.style.display = "block"; endView.style.display = "none"; - - /************ QUIZ DATA ************/ - // Array with the quiz questions const questions = [ new Question("What is 2 + 2?", ["3", "4", "5", "6"], "4", 1), - new Question("What is the capital of France?", ["Miami", "Paris", "Oslo", "Rome"], "Paris", 1), - new Question("Who created JavaScript?", ["Plato", "Brendan Eich", "Lea Verou", "Bill Gates"], "Brendan Eich", 2), - new Question("What is the mass–energy equivalence equation?", ["E = mc^2", "E = m*c^2", "E = m*c^3", "E = m*c"], "E = mc^2", 3), + new Question( + "What is the capital of France?", + ["Miami", "Paris", "Oslo", "Rome"], + "Paris", + 1 + ), + new Question( + "Who created JavaScript?", + ["Plato", "Brendan Eich", "Lea Verou", "Bill Gates"], + "Brendan Eich", + 2 + ), + new Question( + "What is the mass–energy equivalence equation?", + ["E = mc^2", "E = m*c^2", "E = m*c^3", "E = m*c"], + "E = mc^2", + 3 + ), // Add more questions here ]; const quizDuration = 120; // 120 seconds (2 minutes) - - /************ QUIZ INSTANCE ************/ - // Create a new Quiz instance object const quiz = new Quiz(questions, quizDuration, quizDuration); // Shuffle the quiz questions quiz.shuffleQuestions(); - - /************ SHOW INITIAL CONTENT ************/ - // Convert the time remaining in seconds to minutes and seconds, and pad the numbers with zeros if needed - const minutes = Math.floor(quiz.timeRemaining / 60).toString().padStart(2, "0"); + const minutes = Math.floor(quiz.timeRemaining / 60) + .toString() + .padStart(2, "0"); const seconds = (quiz.timeRemaining % 60).toString().padStart(2, "0"); - // Display the time remaining in the time remaining container - const timeRemainingContainer = document.getElementById("timeRemaining"); timeRemainingContainer.innerText = `${minutes}:${seconds}`; - // Show first question showQuestion(); - - /************ TIMER ************/ - let timer; - - /************ EVENT LISTENERS ************/ - nextButton.addEventListener("click", nextButtonHandler); - - - /************ FUNCTIONS ************/ - - // showQuestion() - Displays the current question and its choices + showQuestion(); //Displays the current question and its choices // nextButtonHandler() - Handles the click on the next button // showResults() - Displays the end view and the quiz results - - - function showQuestion() { // If the quiz has ended, show the results if (quiz.hasEnded()) { showResults(); return; } - // Clear the previous question text and question choices questionContainer.innerText = ""; choiceContainer.innerHTML = ""; - // Get the current question from the quiz by calling the Quiz class method `getQuestion()` const question = quiz.getQuestion(); // Shuffle the choices of the current question by calling the method 'shuffleChoices()' on the question object question.shuffleChoices(); - - - // YOUR CODE HERE: - // // 1. Show the question - // Update the inner text of the question container element and show the question text - - + // Update the inner text of the question contaier element and show the question text + questionContainer.textContent = question.text; // 2. Update the green progress bar // Update the green progress bar (div#progressBar) width so that it shows the percentage of questions answered - - progressBar.style.width = `65%`; // This value is hardcoded as a placeholder - - - - // 3. Update the question count text + //const progress = (quiz.currentQuestionIndex / quiz.questions.length) * 100; + //progressBar.style.width = `${progress}%`; // This value is hardcoded as a placeholder + const progressPercentage = + ((quiz.questionIndex + 1) / quiz.questions.length) * 100; + progressBar.style.width = `${progressPercentage}%`; + // 3. Update the question count text // Update the question count (div#questionCount) show the current question out of total questions - - questionCount.innerText = `Question 1 of 10`; // This value is hardcoded as a placeholder - - - + const current = quiz.currentQuestionIndex + 1; + const total = quiz.questions.length; + questionCount.innerText = `Question ${current} of ${total}`; // This value is hardcoded as a placeholder // 4. Create and display new radio input element with a label for each choice. // Loop through the current question `choices`. - // For each choice create a new radio input with a label, and append it to the choice container. - // Each choice should be displayed as a radio input element with a label: - /* + // For each choice create a new radio input with a label, and append it to the choice container. + // Each choice should be displayed as a radio input element with a label: + /*
*/ - // Hint 1: You can use the `document.createElement()` method to create a new element. - // Hint 2: You can use the `element.type`, `element.name`, and `element.value` properties to set the type, name, and value of an element. - // Hint 3: You can use the `element.appendChild()` method to append an element to the choices container. - // Hint 4: You can use the `element.innerText` property to set the inner text of an element. - + question.choices.forEach((choice) => { + const choiceInput = document.createElement("input"); + choiceInput.type = "radio"; + choiceInput.name = "choice"; + choiceInput.value = choice; + choiceContainer.appendChild(choiceInput); + const choiceLabel = document.createElement("label"); + choiceLabel.innerText = choice; + choiceContainer.appendChild(choiceLabel); + }); } - - - - function nextButtonHandler () { - let selectedAnswer; // A variable to store the selected answer value - - - + function nextButtonHandler() { + // A variable to store the selected answer value // YOUR CODE HERE: - // - // 1. Get all the choice elements. You can use the `document.querySelectorAll()` method. - - - // 2. Loop through all the choice elements and check which one is selected - // Hint: Radio input elements have a property `.checked` (e.g., `element.checked`). - // When a radio input gets selected the `.checked` property will be set to true. - // You can use check which choice was selected by checking if the `.checked` property is true. - - + let selectedAnswer = ""; + for (let i = 0; i < choicesElements.length; i++) { + if (choicesElements[i].checked) { + selectedAnswer = choicesElements[i].value; + } + } + if (selectedAnswer) { + quiz.checkAnswer(selectedAnswer); + } + quiz.currentQuestionIndex++; + showQuestion(); // 3. If an answer is selected (`selectedAnswer`), check if it is correct and move to the next question - // Check if selected answer is correct by calling the quiz method `checkAnswer()` with the selected answer. - // Move to the next question by calling the quiz method `moveToNextQuestion()`. - // Show the next question by calling the function `showQuestion()`. - } - - - - + // Check if selected answer is correct by calling the quiz method `checkAnswer()` with the selected answer. + // Move to the next question by calling the quiz method `moveToNextQuestion()`. + // Show the next question by calling the function `showQuestion()`. + } function showResults() { - // YOUR CODE HERE: // // 1. Hide the quiz view (div#quizView) quizView.style.display = "none"; - // 2. Show the end view (div#endView) endView.style.display = "flex"; - // 3. Update the result container (div#result) inner text to show the number of correct answers out of total questions resultContainer.innerText = `You scored 1 out of 1 correct answers!`; // This value is hardcoded as a placeholder } - -}); \ No newline at end of file + //TIMER + function startTimer() { + console.log("quiz time remaining", quiz.timeRemaining); + timer = setInterval(() => { + quiz.timeRemaining--; + const minutes = Math.floor(quiz.timeRemaining / 60) + .toString() + .padStart(2, "0"); + const seconds = (quiz.timeRemaining % 60).toString().padStart(2, "0"); + timeRemainingContainer.innerText = `${minutes}:${seconds}`; + if (quiz.timeRemaining <= 0) { + clearInterval(timer); + showResults(); + } + }, 1000); + } + startTimer(); +}); diff --git a/src/question.js b/src/question.js index 68f6631a..fe3913c1 100644 --- a/src/question.js +++ b/src/question.js @@ -1,7 +1,19 @@ class Question { - // YOUR CODE HERE: - // - // 1. constructor (text, choices, answer, difficulty) + constructor(text, choices, answer, difficulty) { + this.text = text; // data type strings + this.choices = choices; // data type array of strings + this.answer = answer; // data type strings + this.difficulty = difficulty; // data type number + } + shuffleChoices() { + for (let i = 0; i < this.choices.length; i++) { + let randomIndex = Math.floor(Math.random() * this.choices.length); + let choiceToMove = this.choices[i]; + this.choices.splice(i, 1); + this.choices.splice(randomIndex, 0, choiceToMove); - // 2. shuffleChoices() -} \ No newline at end of file + //apply to the property choice using sort method and Math.random between -0 e 9. + //this.choices = this.choices.sort(() => Math.random() - 0.5); + } + } +} diff --git a/src/quiz.js b/src/quiz.js index d94cfd14..94f26072 100644 --- a/src/quiz.js +++ b/src/quiz.js @@ -1,15 +1,52 @@ class Quiz { - // YOUR CODE HERE: - // - // 1. constructor (questions, timeLimit, timeRemaining) + constructor(questions, timeLimit, timeRemaining) { + this.questions = questions; // 1º array of objects to store all questions + this.timeLimit = timeLimit; // 2º Number + this.timeRemaining = timeRemaining; // 3º Number + this.correctAnswers = 0; + this.currentQuestionIndex = 0; + } - // 2. getQuestion() - - // 3. moveToNextQuestion() + getQuestion() { + return this.questions[this.currentQuestionIndex]; // Array index already initialized by 0 + } - // 4. shuffleQuestions() + moveToNextQuestion() { + this.currentQuestionIndex += 1; + } - // 5. checkAnswer(answer) + shuffleQuestions() { + this.questions = this.questions.sort(() => Math.random() - 0.9); + } - // 6. hasEnded() -} \ No newline at end of file + checkAnswer(answer) { + const currentQuestion = this.getQuestion(); // Store answer input into a variable + if (answer === currentQuestion.answer) { + //compare answer input with correct answer from the question + this.correctAnswers += 1; // increase by 1 if correct answered. + } + } + + hasEnded() { + return this.currentQuestionIndex === this.questions.length; // It is comparisson No need to return with if/else + } + + filterQuestionsByDifficulty(difficulty) { + if (difficulty !== 1 && difficulty !== 2 && difficulty !== 3) { + return; + } + this.questions = this.questions.filter((oneQuestion) => { + if (oneQuestion.difficulty === difficulty) { + return true; + } + }); + } + + averageDifficulty() { + return ( + this.questions.reduce((acc, currentQuestion) => { + return acc + currentQuestion.difficulty; + }, 0) / this.questions.length + ); + } +}