// islands/QuizConfigure.tsx import { useEffect } from "preact/hooks"; import { KvObj, QuizConfig } from "../utils/types.ts"; import { Signal } from "@preact/signals"; import { AsyncYesNoPop } from "./AsyncYesNoPop.tsx"; import { User } from "../db/interfaces.ts"; export interface AdminProps { allUsers: User[]; allQuizs: KvObj[]; } export default function AdminPage( { allUsers, allQuizs }: AdminProps, ) { // Theme classes are defined in styles.css with @media (prefers-color-scheme: dark) const [ask, popupElement] = AsyncYesNoPop(); const changeMode = new Signal<{ mode: string } | null>(null); const users = new Signal(allUsers); const nameError = new Signal(false); const randomOrder = new Signal(true); const modeType = new Signal("photo-see-bisaya"); const userContext = new Signal((() => { if (allUsers && allUsers.length) { return allUsers[0].id; } else { return ""; } })()); //const [isLoading, setIsLoading] = useState(true); const count = new Signal(0); // const handlePop = async () => { // const answer = await ask("Do you want to continue?"); // if (answer) { // alert("You chose YES!"); // // ...continue logic // } else { // alert("You chose NO!"); // // ...alternative logic // } // }; const handleClick = () => { const newCount = count.value + 1; count.value = newCount; }; useEffect(() => { //console.log("allUsers",allUsers.length); }, []); const uploadFile = () => { const input = document.createElement("input"); input.type = "file"; input.accept = ".txt"; // Safari fix: input must be in DOM for change event to fire reliably input.style.position = "absolute"; input.style.left = "-9999px"; input.style.opacity = "0"; document.body.appendChild(input); const cleanup = () => { if (input.parentNode) { document.body.removeChild(input); } }; input.addEventListener("change", async (e) => { console.log("uploading file"); const file = (e.target as HTMLInputElement).files?.[0]; console.log("file", file); if (file) { const filePeaces = (file.name as string)?.split(".txt")[0]?.trim() .split(" "); const newQuizName = filePeaces[0]; //console.log("context id", userContext.value); const text = (await file.text())?.trim(); if (userContext.value && text && text.length > 0) { const obj: KvObj = JSON.parse(text) as KvObj; console.log(obj.value?.quiz_name); obj.key[0] = "quiz_configs"; obj.key[1] = "" + userContext.value; obj.key[2] = crypto.randomUUID(); if (obj.value) { obj.value.owner_id = obj.key[1]; obj.value.quiz_config_id = obj.key[2]; if (obj.value.questions) { obj.value.questions.forEach((question) => { question.owner_id = obj.key[1]; question.quiz_id = obj.key[2]; }); } // const textToQuiz = new TextToQuizTranslations(quizData); // const parsedQuizData = textToQuiz.parseText(text); try { const response = await fetch("/api/quiz-up", { method: "POST", body: JSON.stringify(obj), }); if (!response.ok) { throw new Error("Upload failed"); } const data = await response.json(); } catch (err) { console.error(err); console.log("Failed to fetch create quiz."); } } } } cleanup(); }); // Cleanup if user cancels file dialog (focus returns to window) const handleFocus = () => { setTimeout(cleanup, 300); globalThis.removeEventListener("focus", handleFocus); }; globalThis.addEventListener("focus", handleFocus); input.click(); }; const downloadFile = async () => { allQuizs.forEach((quiz) => { let quizName = `${JSON.stringify(quiz.key)}.txt`; if (quiz.value) { quizName = `${quiz.value.quiz_name} ${quizName}.txt`; } const userConfirmed = globalThis.confirm(`Download? ${quizName}`); if (userConfirmed) { const content = JSON.stringify(quiz); const blob = new Blob([content], { type: "text/plain" }); const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = quizName; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); } }); }; return ( <> {popupElement}

Configure Quiz

{ /* */ }
); }