forked from Simnation/Main
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;
|
|
}
|
|
});
|