@jhbhan/kings-quiz
Version:
Old testament Kings trivia quiz game
381 lines (371 loc) • 26.5 kB
JavaScript
// #style-inject:#style-inject
function styleInject(css, { insertAt } = {}) {
if (!css || typeof document === "undefined") return;
const head = document.head || document.getElementsByTagName("head")[0];
const style = document.createElement("style");
style.type = "text/css";
if (insertAt === "top") {
if (head.firstChild) {
head.insertBefore(style, head.firstChild);
} else {
head.appendChild(style);
}
} else {
head.appendChild(style);
}
if (style.styleSheet) {
style.styleSheet.cssText = css;
} else {
style.appendChild(document.createTextNode(css));
}
}
// src/index.css
styleInject('* {\n box-sizing: border-box;\n}\nbody {\n margin: 0;\n font-family:\n "Helvetica Neue",\n Arial,\n sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n background-color: #f0f0f0;\n min-height: 100vh;\n color: #333;\n}\n.trivia-container {\n max-width: 800px;\n margin: 0 auto;\n padding: 20px;\n min-height: 100vh;\n display: flex;\n flex-direction: column;\n}\n.trivia-header {\n background-color: #ffffff;\n border-radius: 8px;\n padding: 20px;\n margin-bottom: 30px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n border: 1px solid #ddd;\n}\n.progress-bar {\n width: 100%;\n height: 8px;\n background-color: #e0e0e0;\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 15px;\n}\n.progress-fill {\n height: 100%;\n background-color: #666666;\n transition: width 0.3s ease;\n}\n.question-counter {\n font-size: 14px;\n color: #666;\n margin-bottom: 5px;\n}\n.score {\n font-size: 18px;\n font-weight: bold;\n color: #333;\n}\n.question-section {\n background-color: #ffffff;\n border-radius: 8px;\n padding: 40px 30px;\n margin-bottom: 30px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n border: 1px solid #ddd;\n text-align: center;\n}\n.question {\n font-size: 28px;\n font-weight: 600;\n color: #333;\n margin: 0;\n line-height: 1.4;\n}\n.answers-section {\n display: flex;\n flex-direction: column;\n gap: 15px;\n margin-bottom: 30px;\n}\n.answer-option {\n background-color: #ffffff;\n border: 1px solid #ccc;\n border-radius: 8px;\n padding: 20px;\n font-size: 18px;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n text-align: left;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n color: #333;\n}\n.answer-option:hover:not(:disabled) {\n border-color: #666;\n transform: translateY(-2px);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n.answer-option.selected {\n border-color: #333;\n background-color: #e8e8e8;\n}\n.answer-option.correct {\n border-color: #4a7c59;\n background-color: #e6f4ea;\n color: #333;\n}\n.answer-option.incorrect {\n border-color: #b85c5c;\n background-color: #fbeaea;\n color: #333;\n}\n.answer-option:disabled {\n cursor: not-allowed;\n opacity: 0.7;\n}\n.option-letter {\n background-color: #666;\n color: #ffffff;\n width: 32px;\n height: 32px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-weight: bold;\n margin-right: 15px;\n flex-shrink: 0;\n}\n.answer-option.correct .option-letter {\n background-color: #4a7c59;\n}\n.answer-option.incorrect .option-letter {\n background-color: #b85c5c;\n}\n.option-text {\n flex: 1;\n}\n.submit-section {\n text-align: center;\n}\n.submit-btn {\n background-color: #333;\n color: #ffffff;\n border: none;\n border-radius: 8px;\n padding: 15px 40px;\n font-size: 18px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n.submit-btn:hover:not(:disabled) {\n background-color: #555;\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);\n}\n.submit-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n transform: none;\n}\n.result-message {\n font-size: 20px;\n font-weight: 600;\n padding: 15px;\n}\n.correct-message {\n color: #333;\n}\n.incorrect-message {\n color: #333;\n}\n.game-finished {\n background-color: #ffffff;\n border-radius: 8px;\n padding: 60px 40px;\n text-align: center;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n border: 1px solid #ddd;\n margin-top: 50px;\n}\n.game-finished h1 {\n color: #333;\n margin-bottom: 30px;\n font-size: 36px;\n}\n.final-score h2 {\n color: #333;\n margin-bottom: 15px;\n font-size: 32px;\n}\n.score-percentage {\n font-size: 24px;\n color: #666;\n margin-bottom: 40px;\n}\n.play-again-btn {\n background-color: #333;\n color: #ffffff;\n border: none;\n border-radius: 8px;\n padding: 15px 40px;\n font-size: 18px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n.play-again-btn:hover {\n background-color: #555;\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);\n}\n.landing-screen {\n background-color: #ffffff;\n border-radius: 8px;\n padding: 40px;\n text-align: center;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n border: 1px solid #ddd;\n margin-top: 20px;\n max-width: 700px;\n margin-left: auto;\n margin-right: auto;\n}\n.app-title {\n font-size: 48px;\n font-weight: 700;\n color: #333;\n margin-bottom: 10px;\n}\n.app-description {\n font-size: 20px;\n color: #666;\n margin-bottom: 40px;\n line-height: 1.5;\n}\n.game-settings {\n margin-bottom: 40px;\n}\n.setting-group {\n margin-bottom: 30px;\n}\n.setting-group h3 {\n font-size: 20px;\n color: #333;\n margin-bottom: 15px;\n}\n.category-options {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 15px;\n}\n.category-option {\n background-color: #ffffff;\n border: 1px solid #ccc;\n border-radius: 8px;\n padding: 15px;\n cursor: pointer;\n transition: all 0.2s ease;\n text-align: left;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.category-option:hover {\n border-color: #666;\n transform: translateY(-1px);\n}\n.category-option.selected {\n border-color: #333;\n background-color: #e8e8e8;\n}\n.category-name {\n display: block;\n font-size: 16px;\n font-weight: 600;\n color: #333;\n margin-bottom: 5px;\n}\n.category-count {\n font-size: 14px;\n color: #666;\n}\n.game-info {\n background-color: #f8f8f8;\n border-radius: 8px;\n padding: 20px;\n margin-bottom: 30px;\n border: 1px solid #ddd;\n}\n.info-summary p {\n margin: 5px 0;\n color: #333;\n font-size: 16px;\n}\n.start-btn {\n background-color: #333;\n color: #ffffff;\n border: none;\n border-radius: 8px;\n padding: 20px 50px;\n font-size: 24px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n.start-btn:hover:not(:disabled) {\n background-color: #555;\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);\n}\n.start-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n transform: none;\n}\n.category-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 5px;\n}\n.checkmark {\n color: #333;\n font-size: 18px;\n font-weight: bold;\n}\n.results-sections {\n margin: 30px 0;\n width: 100%;\n}\n.results-section {\n margin-bottom: 20px;\n border-radius: 8px;\n overflow: hidden;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n border: 1px solid #ddd;\n}\n.section-header {\n width: 100%;\n padding: 15px 20px;\n border: none;\n font-size: 18px;\n font-weight: 600;\n cursor: pointer;\n display: flex;\n justify-content: space-between;\n align-items: center;\n transition: all 0.2s ease;\n background-color: #f8f8f8;\n color: #333;\n border-bottom: 1px solid #ddd;\n}\n.wrong-header {\n background-color: #f8f8f8;\n color: #333;\n border-bottom: 1px solid #ddd;\n}\n.wrong-header:hover {\n background-color: #e0e0e0;\n}\n.right-header {\n background-color: #f8f8f8;\n color: #333;\n border-bottom: 1px solid #ddd;\n}\n.right-header:hover {\n background-color: #e0e0e0;\n}\n.expand-icon {\n transition: transform 0.2s ease;\n font-size: 14px;\n}\n.expand-icon.expanded {\n transform: rotate(180deg);\n}\n.questions-list {\n background-color: #ffffff;\n max-height: 400px;\n overflow-y: auto;\n}\n.question-result {\n padding: 20px;\n border-bottom: 1px solid #e0e0e0;\n}\n.question-result:last-child {\n border-bottom: none;\n}\n.wrong-result {\n border-left: 4px solid #666;\n}\n.right-result {\n border-left: 4px solid #666;\n}\n.result-question {\n font-size: 16px;\n font-weight: 600;\n color: #333;\n margin: 0 0 15px 0;\n line-height: 1.4;\n}\n.result-options {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.result-option {\n display: flex;\n align-items: center;\n padding: 10px 12px;\n border-radius: 6px;\n font-size: 14px;\n border: 1px solid #e0e0e0;\n background-color: #f8f8f8;\n}\n.result-option .option-letter {\n background-color: #666;\n color: #ffffff;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-weight: bold;\n margin-right: 12px;\n flex-shrink: 0;\n font-size: 12px;\n}\n.result-option .option-text {\n flex: 1;\n}\n.result-option .option-indicator {\n font-size: 12px;\n font-weight: 600;\n margin-left: 10px;\n}\n.correct-option {\n background-color: #e6f4ea;\n border-color: #4a7c59;\n color: #333;\n}\n.correct-option .option-letter {\n background-color: #4a7c59;\n}\n.correct-option .option-indicator {\n color: #4a7c59;\n}\n.wrong-option {\n background-color: #fbeaea;\n border-color: #b85c5c;\n color: #333;\n}\n.wrong-option .option-letter {\n background-color: #b85c5c;\n}\n.wrong-option .option-indicator {\n color: #b85c5c;\n}\n.no-questions {\n padding: 40px 20px;\n text-align: center;\n font-size: 18px;\n color: #666;\n font-style: italic;\n}\n@media (max-width: 768px) {\n .trivia-container {\n padding: 15px;\n }\n .landing-screen {\n padding: 30px 20px;\n margin-top: 10px;\n }\n .app-title {\n font-size: 36px;\n }\n .app-description {\n font-size: 18px;\n }\n .category-options {\n grid-template-columns: 1fr;\n }\n .start-btn {\n padding: 15px 40px;\n font-size: 20px;\n }\n .question {\n font-size: 24px;\n }\n .answer-option {\n padding: 15px;\n font-size: 16px;\n }\n .option-letter {\n width: 28px;\n height: 28px;\n margin-right: 12px;\n }\n .section-header {\n padding: 12px 15px;\n font-size: 16px;\n }\n .question-result {\n padding: 15px;\n }\n .result-question {\n font-size: 15px;\n }\n .result-option {\n padding: 8px 10px;\n font-size: 13px;\n }\n .result-option .option-letter {\n width: 20px;\n height: 20px;\n margin-right: 10px;\n font-size: 11px;\n }\n .questions-list {\n max-height: 300px;\n }\n}\n');
// src/KingsQuiz.tsx
import { useState as useState2 } from "react";
// src/types.ts
var categoryNamesMap = {
"successor": "Succession",
"kingdom": "Which Kingdom?",
"approval": "Good or Bad",
"prophetKing": "Who's your prophet?"
};
// src/components/shared/slider.css
styleInject(".slider-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 10px;\n}\n.question-slider {\n width: 100%;\n max-width: 300px;\n height: 8px;\n border-radius: 4px;\n background-color: #e0e0e0;\n outline: none;\n -webkit-appearance: none;\n appearance: none;\n}\n.question-slider::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background-color: #333;\n cursor: pointer;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);\n transition: all 0.2s ease;\n}\n.question-slider::-webkit-slider-thumb:hover {\n transform: scale(1.1);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);\n}\n.question-slider::-moz-range-thumb {\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background-color: #333;\n cursor: pointer;\n border: none;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);\n transition: all 0.2s ease;\n}\n.question-slider::-moz-range-thumb:hover {\n transform: scale(1.1);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);\n}\n.question-slider:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n.question-slider:disabled::-webkit-slider-thumb {\n cursor: not-allowed;\n}\n.question-slider:disabled::-moz-range-thumb {\n cursor: not-allowed;\n}\n.slider-labels {\n display: flex;\n justify-content: space-between;\n width: 100%;\n max-width: 300px;\n font-size: 14px;\n color: #666;\n padding: 0 12px;\n}\n");
// src/components/shared/Slider.tsx
import { jsx, jsxs } from "react/jsx-runtime";
var Slider = ({
value,
onChange,
min = 5,
max = 20,
step = 1,
disabled = false
}) => /* @__PURE__ */ jsxs("div", { className: "slider-container", children: [
/* @__PURE__ */ jsx(
"input",
{
type: "range",
min,
max,
step,
value,
onChange: (e) => onChange(Number(e.target.value)),
className: "question-slider",
disabled
}
),
/* @__PURE__ */ jsxs("div", { className: "slider-labels", children: [
/* @__PURE__ */ jsx("span", { children: min }),
/* @__PURE__ */ jsx("span", { children: max })
] })
] });
// src/components/Landing.tsx
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
function LandingPage(props) {
const {
selectedQuestionCount,
setSelectedQuestionCount,
selectedCategories,
handleCategoryChange,
startGame
} = props;
return /* @__PURE__ */ jsx2("div", { className: "trivia-container", children: /* @__PURE__ */ jsxs2("div", { className: "landing-screen", children: [
/* @__PURE__ */ jsx2("h1", { className: "app-title", children: "Trivia Challenge" }),
/* @__PURE__ */ jsx2("p", { className: "app-description", children: "Customize your trivia experience!" }),
/* @__PURE__ */ jsxs2("div", { className: "game-settings", children: [
/* @__PURE__ */ jsxs2("div", { className: "setting-group", children: [
/* @__PURE__ */ jsxs2("h3", { children: [
"Number of Questions: ",
selectedQuestionCount
] }),
/* @__PURE__ */ jsx2(
Slider,
{
value: selectedQuestionCount,
onChange: setSelectedQuestionCount,
min: 5,
max: 20,
step: 1
}
)
] }),
/* @__PURE__ */ jsxs2("div", { className: "setting-group", children: [
/* @__PURE__ */ jsx2("h3", { children: "Select Categories" }),
/* @__PURE__ */ jsx2("div", { className: "category-options", children: Object.entries(categoryNamesMap).map(([key, name]) => {
return /* @__PURE__ */ jsx2(
"button",
{
className: `category-option ${selectedCategories.includes(key) ? "selected" : ""}`,
onClick: () => handleCategoryChange(key),
children: /* @__PURE__ */ jsxs2("div", { className: "category-header", children: [
/* @__PURE__ */ jsx2("span", { className: "category-name", children: name }),
selectedCategories.includes(key) && /* @__PURE__ */ jsx2("span", { className: "checkmark", children: "\u2713" })
] })
},
key
);
}) })
] }),
/* @__PURE__ */ jsx2("div", { className: "game-info", children: /* @__PURE__ */ jsx2("div", { className: "info-summary", children: /* @__PURE__ */ jsxs2("p", { children: [
/* @__PURE__ */ jsx2("strong", { children: selectedCategories.length }),
" selected categories"
] }) }) })
] }),
/* @__PURE__ */ jsx2(
"button",
{
className: "start-btn",
onClick: startGame,
disabled: selectedCategories.length === 0,
children: "Start Game"
}
)
] }) });
}
// src/components/Results.tsx
import { useState } from "react";
import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
var Results = (props) => {
const {
score,
gameQuestions,
questionResults,
resetGame
} = props;
const [wrongAnswersExpanded, setWrongAnswersExpanded] = useState(true);
const [rightAnswersExpanded, setRightAnswersExpanded] = useState(false);
const wrongAnswers = questionResults.filter((result) => !result.isCorrect);
const rightAnswers = questionResults.filter((result) => result.isCorrect);
return /* @__PURE__ */ jsx3("div", { className: "trivia-container", children: /* @__PURE__ */ jsxs3("div", { className: "game-finished", children: [
/* @__PURE__ */ jsx3("h1", { children: "Game Complete!" }),
/* @__PURE__ */ jsxs3("div", { className: "final-score", children: [
/* @__PURE__ */ jsxs3("h2", { children: [
"Your Score: ",
score,
" / ",
gameQuestions.length
] }),
/* @__PURE__ */ jsxs3("p", { className: "score-percentage", children: [
Math.round(score / gameQuestions.length * 100),
"%"
] })
] }),
/* @__PURE__ */ jsxs3("div", { className: "results-sections", children: [
/* @__PURE__ */ jsxs3("div", { className: "results-section", children: [
/* @__PURE__ */ jsxs3(
"button",
{
className: "section-header wrong-header",
onClick: () => setWrongAnswersExpanded(!wrongAnswersExpanded),
children: [
/* @__PURE__ */ jsxs3("span", { children: [
"\u274C Questions You Got Wrong (",
wrongAnswers.length,
")"
] }),
/* @__PURE__ */ jsx3("span", { className: `expand-icon ${wrongAnswersExpanded ? "expanded" : ""}`, children: "\u25BC" })
]
}
),
wrongAnswersExpanded && /* @__PURE__ */ jsxs3("div", { className: "questions-list", children: [
wrongAnswers.map((result, index) => /* @__PURE__ */ jsxs3("div", { className: "question-result wrong-result", children: [
/* @__PURE__ */ jsx3("h4", { className: "result-question", children: result.question.question }),
/* @__PURE__ */ jsxs3("div", { className: "result-options", children: [
/* @__PURE__ */ jsxs3("div", { className: "result-option wrong-option", children: [
/* @__PURE__ */ jsx3("span", { className: "option-text", children: result.userAnswer }),
/* @__PURE__ */ jsx3("span", { className: "option-indicator", children: "\u2717 Your Answer" })
] }),
/* @__PURE__ */ jsxs3("div", { className: "result-option correct-option", children: [
/* @__PURE__ */ jsx3("span", { className: "option-text", children: result.question.correctAnswer }),
/* @__PURE__ */ jsx3("span", { className: "option-indicator", children: "\u2713 Correct" })
] })
] })
] }, `wrong-${index}`)),
wrongAnswers.length === 0 && /* @__PURE__ */ jsx3("div", { className: "no-questions", children: "\u{1F389} Perfect! You got all questions right!" })
] })
] }),
/* @__PURE__ */ jsxs3("div", { className: "results-section", children: [
/* @__PURE__ */ jsxs3(
"button",
{
className: "section-header right-header",
onClick: () => setRightAnswersExpanded(!rightAnswersExpanded),
children: [
/* @__PURE__ */ jsxs3("span", { children: [
"\u2705 Questions You Got Right (",
rightAnswers.length,
")"
] }),
/* @__PURE__ */ jsx3("span", { className: `expand-icon ${rightAnswersExpanded ? "expanded" : ""}`, children: "\u25BC" })
]
}
),
rightAnswersExpanded && /* @__PURE__ */ jsxs3("div", { className: "questions-list", children: [
rightAnswers.map((result, index) => /* @__PURE__ */ jsxs3("div", { className: "question-result right-result", children: [
/* @__PURE__ */ jsx3("h4", { className: "result-question", children: result.question.question }),
/* @__PURE__ */ jsx3("div", { className: "result-options", children: /* @__PURE__ */ jsxs3("div", { className: "result-option correct-option", children: [
/* @__PURE__ */ jsx3("span", { className: "option-text", children: result.userAnswer }),
/* @__PURE__ */ jsx3("span", { className: "option-indicator", children: "\u2713 Your Answer" })
] }) })
] }, `right-${index}`)),
rightAnswers.length === 0 && /* @__PURE__ */ jsx3("div", { className: "no-questions", children: "\u{1F614} No correct answers this time. Better luck next time!" })
] })
] })
] }),
/* @__PURE__ */ jsx3("button", { className: "play-again-btn", onClick: resetGame, children: "Play Again" })
] }) });
};
// src/api.ts
var URL = "https://8539852b27d737c54d69d5a15610e246.balena-devices.com/trivia";
var fetchQuestions = async (count, categories) => {
const url = new URLSearchParams();
url.append("type", "kings");
url.append("count", count.toString());
url.append("categories", categories.join(","));
const response = await fetch(`${URL}?${url.toString()}`);
const data = await response.json();
if (!response.ok) {
throw new Error(data.message || "Failed to fetch questions");
}
if (!Array.isArray(data)) {
throw new Error("Invalid response format");
}
return data;
};
// src/KingsQuiz.tsx
import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
function KingsQuiz() {
const [showResult, setShowResult] = useState2(false);
const [gameFinished, setGameFinished] = useState2(false);
const [gameStarted, setGameStarted] = useState2(false);
const [loadingQuestions, setLoadingQuestions] = useState2(false);
const [currentQuestionIndex, setCurrentQuestionIndex] = useState2(0);
const [selectedAnswer, setSelectedAnswer] = useState2(null);
const [score, setScore] = useState2(0);
const [selectedCategories, setSelectedCategories] = useState2(["successor", "kingdom", "approval", "prophetKing"]);
const [selectedQuestionCount, setSelectedQuestionCount] = useState2(10);
const [gameQuestions, setGameQuestions] = useState2([]);
const [questionResults, setQuestionResults] = useState2([]);
const currentQuestion = gameQuestions[currentQuestionIndex];
const handleAnswerSelect = (answer) => {
if (showResult) return;
setSelectedAnswer(answer);
const isCorrect = answer === currentQuestion.correctAnswer;
if (isCorrect) {
setScore(score + 1);
}
const result = {
question: currentQuestion,
userAnswer: answer,
isCorrect
};
setQuestionResults((prev) => [...prev, result]);
setShowResult(true);
setTimeout(() => {
if (currentQuestionIndex < gameQuestions.length - 1) {
setCurrentQuestionIndex(currentQuestionIndex + 1);
setSelectedAnswer(null);
setShowResult(false);
} else {
setGameFinished(true);
}
}, 1e3);
};
const handleCategoryToggle = (categoryId) => {
setSelectedCategories((prev) => {
if (prev.includes(categoryId)) {
return prev.filter((id) => id !== categoryId);
} else {
return [...prev, categoryId];
}
});
};
const startGame = async () => {
setLoadingQuestions(true);
const fetchedQuestions = await fetchQuestions(selectedQuestionCount, selectedCategories);
const shuffled = [...fetchedQuestions].sort(() => Math.random() - 0.5);
setGameQuestions(shuffled);
setLoadingQuestions(false);
setGameStarted(true);
};
const resetGame = () => {
setCurrentQuestionIndex(0);
setSelectedAnswer(null);
setScore(0);
setShowResult(false);
setGameFinished(false);
setGameStarted(false);
setGameQuestions([]);
setQuestionResults([]);
};
if (loadingQuestions) {
return /* @__PURE__ */ jsx4("div", { className: "loading", children: "Loading questions..." });
}
if (gameFinished) {
return /* @__PURE__ */ jsx4(
Results,
{
score,
gameQuestions,
questionResults,
resetGame
}
);
}
if (!gameStarted) {
return /* @__PURE__ */ jsx4(
LandingPage,
{
selectedQuestionCount,
setSelectedQuestionCount,
selectedCategories,
handleCategoryChange: handleCategoryToggle,
startGame
}
);
}
return /* @__PURE__ */ jsxs4("div", { className: "trivia-container", children: [
/* @__PURE__ */ jsxs4("div", { className: "trivia-header", children: [
/* @__PURE__ */ jsx4("div", { className: "progress-bar", children: /* @__PURE__ */ jsx4(
"div",
{
className: "progress-fill",
style: { width: `${(currentQuestionIndex + 1) / gameQuestions.length * 100}%` }
}
) }),
/* @__PURE__ */ jsxs4("div", { className: "question-counter", children: [
"Question ",
currentQuestionIndex + 1,
" of ",
gameQuestions.length
] }),
/* @__PURE__ */ jsxs4("div", { className: "score", children: [
"Score: ",
score
] })
] }),
/* @__PURE__ */ jsx4("div", { className: "question-section", children: showResult ? /* @__PURE__ */ jsx4("div", { className: "result-message", children: selectedAnswer === currentQuestion.correctAnswer ? /* @__PURE__ */ jsx4("span", { className: "correct-message", children: "\u2713 Correct!" }) : /* @__PURE__ */ jsxs4("span", { className: "incorrect-message", children: [
"\u2717 Incorrect. The correct answer was ",
currentQuestion.correctAnswer,
"."
] }) }) : /* @__PURE__ */ jsx4("h1", { className: "question", children: currentQuestion.question }) }),
/* @__PURE__ */ jsx4("div", { className: "answers-section", children: currentQuestion.options.map((option, index) => /* @__PURE__ */ jsx4(
"button",
{
className: `answer-option ${selectedAnswer === option ? "selected" : ""} ${showResult ? option === currentQuestion.correctAnswer ? "correct" : selectedAnswer === option ? "incorrect" : "" : ""}`,
onClick: () => handleAnswerSelect(option),
disabled: showResult,
children: /* @__PURE__ */ jsx4("span", { className: "option-text", children: option })
},
index
)) })
] });
}
// src/index.tsx
var index_default = KingsQuiz;
export {
KingsQuiz,
index_default as default
};
//# sourceMappingURL=index.js.map