218 lines
		
	
	
	
		
			7.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			218 lines
		
	
	
	
		
			7.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
const start_btn = document.querySelector(".start_btn button"),
 | 
						|
    info_box = document.querySelector(".info_box"),
 | 
						|
    exit_btn = info_box.querySelector(".buttons .quit"),
 | 
						|
    continue_btn = info_box.querySelector(".buttons .restart"),
 | 
						|
    quiz_box = document.querySelector(".quiz_box"),
 | 
						|
    result_box = document.querySelector(".result_box"),
 | 
						|
    option_list = document.querySelector(".option_list"),
 | 
						|
    time_line = document.querySelector("header .time_line"),
 | 
						|
    time_text = document.querySelector(".timer .time_left_txt"),
 | 
						|
    timeCount = document.querySelector(".timer .timer_sec"),
 | 
						|
    next_btn = document.querySelector("footer .next_btn"),
 | 
						|
    bottom_ques_counter = document.querySelector("footer .total_que"),
 | 
						|
    quit_quiz = result_box.querySelector(".buttons .quit"),
 | 
						|
    quizContainer = document.querySelector(".quiz-container");
 | 
						|
 | 
						|
let timeValue = 15,
 | 
						|
    que_count = 0,
 | 
						|
    que_numb = 1,
 | 
						|
    userScore = 0,
 | 
						|
    counter,
 | 
						|
    counterLine,
 | 
						|
    widthValue = 0,
 | 
						|
    questions = [],
 | 
						|
    quizStarted = false;
 | 
						|
(tickIconTag = '<div class="icon tick"><i class="fas fa-check"></i></div>'), (crossIconTag = '<div class="icon cross"><i class="fas fa-times"></i></div>');
 | 
						|
 | 
						|
const showResult = () => {
 | 
						|
    quiz_box.style.display = "none";
 | 
						|
    result_box.style.display = "flex";
 | 
						|
    quiz_box.classList.remove("activeQuiz");
 | 
						|
    result_box.classList.add("activeResult");
 | 
						|
    const scoreText = result_box.querySelector(".score_text");
 | 
						|
    let scoreTag = `<span>and you got <p>${userScore}</p> out of <p>${questions.length}</p></span>`;
 | 
						|
    scoreText.innerHTML = scoreTag;
 | 
						|
};
 | 
						|
 | 
						|
const showQuestions = (index) => {
 | 
						|
    const que_text = document.querySelector(".que_text");
 | 
						|
    let question = questions[index];
 | 
						|
    let que_tag = `<span>${question.numb}. ${question.question}</span>`;
 | 
						|
    let option_tag = question.options.map((option, idx) => `<div class="option"><span>${option}</span></div>`).join("");
 | 
						|
    que_text.innerHTML = que_tag;
 | 
						|
    option_list.innerHTML = option_tag;
 | 
						|
    const options = option_list.querySelectorAll(".option");
 | 
						|
    options.forEach((option, idx) => {
 | 
						|
        option.onclick = () => optionSelected(option, question.answer);
 | 
						|
    });
 | 
						|
};
 | 
						|
 | 
						|
const optionSelected = (option, correctAnswer) => {
 | 
						|
    clearInterval(counter);
 | 
						|
    clearInterval(counterLine);
 | 
						|
    let selectedOptionText = option.textContent;
 | 
						|
    let allOptions = option_list.querySelectorAll(".option");
 | 
						|
    allOptions.forEach((opt) => opt.classList.add("disabled"));
 | 
						|
    if (selectedOptionText === correctAnswer) {
 | 
						|
        userScore += 1;
 | 
						|
        option.classList.add("correct");
 | 
						|
        option.insertAdjacentHTML("beforeend", tickIconTag);
 | 
						|
    } else {
 | 
						|
        option.classList.add("incorrect");
 | 
						|
        option.insertAdjacentHTML("beforeend", crossIconTag);
 | 
						|
        allOptions.forEach((opt) => {
 | 
						|
            if (opt.textContent === correctAnswer) {
 | 
						|
                opt.classList.add("correct");
 | 
						|
                opt.insertAdjacentHTML("beforeend", tickIconTag);
 | 
						|
            }
 | 
						|
        });
 | 
						|
    }
 | 
						|
    if (que_count < questions.length - 1) {
 | 
						|
        next_btn.classList.add("show");
 | 
						|
    } else {
 | 
						|
        showResult();
 | 
						|
    }
 | 
						|
};
 | 
						|
 | 
						|
const queCounter = (index) => {
 | 
						|
    let totalQueCounTag = `<span><p>${index}</p> of <p>${questions.length}</p> Questions</span>`;
 | 
						|
    bottom_ques_counter.innerHTML = totalQueCounTag;
 | 
						|
};
 | 
						|
 | 
						|
const startTimer = (time) => {
 | 
						|
    counter = setInterval(timer, 1000);
 | 
						|
    function timer() {
 | 
						|
        timeCount.textContent = time;
 | 
						|
        time--;
 | 
						|
        if (time < 9) {
 | 
						|
            let addZero = timeCount.textContent;
 | 
						|
            timeCount.textContent = "0" + addZero;
 | 
						|
        }
 | 
						|
        if (time < 0) {
 | 
						|
            clearInterval(counter);
 | 
						|
            time_text.textContent = "Time Off";
 | 
						|
            const allOptions = option_list.children.length;
 | 
						|
            let correcAns = questions[que_count].answer;
 | 
						|
            for (i = 0; i < allOptions; i++) {
 | 
						|
                if (option_list.children[i].textContent == correcAns) {
 | 
						|
                    option_list.children[i].setAttribute("class", "option correct");
 | 
						|
                    option_list.children[i].insertAdjacentHTML("beforeend", tickIconTag);
 | 
						|
                    console.log("Time Off: Auto selected correct answer.");
 | 
						|
                }
 | 
						|
            }
 | 
						|
            for (i = 0; i < allOptions; i++) {
 | 
						|
                option_list.children[i].classList.add("disabled");
 | 
						|
            }
 | 
						|
            next_btn.classList.add("show");
 | 
						|
        }
 | 
						|
    }
 | 
						|
};
 | 
						|
 | 
						|
const startTimerLine = (time) => {
 | 
						|
    counterLine = setInterval(timer, 29);
 | 
						|
    function timer() {
 | 
						|
        time += 1;
 | 
						|
        time_line.style.width = time + "px";
 | 
						|
        if (time > 549) {
 | 
						|
            clearInterval(counterLine);
 | 
						|
        }
 | 
						|
    }
 | 
						|
};
 | 
						|
 | 
						|
const resetTimerAndLine = () => {
 | 
						|
    clearInterval(counter);
 | 
						|
    clearInterval(counterLine);
 | 
						|
    startTimer(timeValue);
 | 
						|
    startTimerLine(widthValue);
 | 
						|
};
 | 
						|
 | 
						|
const setupQuizGame = (questionsData, timeForQuiz) => {
 | 
						|
    quiz_box.classList.add("activeQuiz");
 | 
						|
    result_box.classList.remove("activeResult");
 | 
						|
    que_count = 0;
 | 
						|
    que_numb = 1;
 | 
						|
    userScore = 0;
 | 
						|
    widthValue = 0;
 | 
						|
    showQuestions(que_count);
 | 
						|
    queCounter(que_numb);
 | 
						|
    startTimer(timeForQuiz);
 | 
						|
    startTimerLine(0);
 | 
						|
};
 | 
						|
 | 
						|
const resetQuizUI = () => {
 | 
						|
    start_btn.parentElement.style.display = "none";
 | 
						|
    info_box.style.display = "none";
 | 
						|
    quiz_box.style.display = "none";
 | 
						|
    result_box.style.display = "none";
 | 
						|
    quizStarted = false;
 | 
						|
};
 | 
						|
 | 
						|
start_btn.onclick = () => {
 | 
						|
    start_btn.parentElement.style.display = "none";
 | 
						|
    info_box.classList.add("activeInfo");
 | 
						|
    info_box.style.display = "flex";
 | 
						|
};
 | 
						|
 | 
						|
continue_btn.onclick = () => {
 | 
						|
    info_box.style.display = "none";
 | 
						|
    quiz_box.style.display = "flex";
 | 
						|
    setupQuizGame(questions, timeValue);
 | 
						|
};
 | 
						|
 | 
						|
exit_btn.onclick = () => {
 | 
						|
    fetch(`https://${GetParentResourceName()}/exitQuiz`, {
 | 
						|
        method: "POST",
 | 
						|
        headers: {
 | 
						|
            "Content-Type": "application/json; charset=UTF-8",
 | 
						|
        },
 | 
						|
    }).catch((err) => console.error("Error with fetch:", err));
 | 
						|
    resetQuizUI();
 | 
						|
};
 | 
						|
 | 
						|
quit_quiz.onclick = () => {
 | 
						|
    fetch(`https://${GetParentResourceName()}/quitQuiz`, {
 | 
						|
        method: "POST",
 | 
						|
        headers: {
 | 
						|
            "Content-Type": "application/json; charset=UTF-8",
 | 
						|
        },
 | 
						|
        body: JSON.stringify({ score: userScore }),
 | 
						|
    }).catch((err) => console.error("Error with fetch:", err));
 | 
						|
    resetQuizUI();
 | 
						|
};
 | 
						|
 | 
						|
next_btn.onclick = () => {
 | 
						|
    if (que_count < questions.length - 1) {
 | 
						|
        que_count++;
 | 
						|
        que_numb++;
 | 
						|
        showQuestions(que_count);
 | 
						|
        queCounter(que_numb);
 | 
						|
        resetTimerAndLine();
 | 
						|
        next_btn.classList.remove("show");
 | 
						|
    } else {
 | 
						|
        clearInterval(counter);
 | 
						|
        clearInterval(counterLine);
 | 
						|
        showResult();
 | 
						|
    }
 | 
						|
};
 | 
						|
 | 
						|
document.addEventListener("keydown", (event) => {
 | 
						|
    if (!quizStarted) return;
 | 
						|
    if (event.key === "Escape") {
 | 
						|
        fetch(`https://${GetParentResourceName()}/closeQuiz`, {
 | 
						|
            method: "POST",
 | 
						|
            headers: { "Content-Type": "application/json; charset=UTF-8" },
 | 
						|
            body: JSON.stringify({}),
 | 
						|
        }).catch((err) => console.error("Error with fetch:", err));
 | 
						|
        resetQuizUI();
 | 
						|
    }
 | 
						|
});
 | 
						|
 | 
						|
window.addEventListener("message", (event) => {
 | 
						|
    let data = event.data;
 | 
						|
    if (data.action === "startQuiz") {
 | 
						|
        questions = data.questions;
 | 
						|
        quizContainer.style.display = "flex";
 | 
						|
        start_btn.parentElement.style.display = "flex";
 | 
						|
        quizStarted = true;
 | 
						|
    }
 | 
						|
});
 |