// islands/TranslationList.tsx import { useEffect, useState } from "preact/hooks"; import { QuizToTextFile } from "../utils/QuizToTextFile.ts"; import { TextToQuizTranslations } from "../utils/TextToQuizTranslations.ts"; import { QuizConfig } from "../utils/types.ts"; //import { QuizData } from "../utils/database.ts"; import { AsyncYesNoPop } from "./AsyncYesNoPop.tsx"; export interface Translation { id: number; quiz_id: number; owner_id: string; question_text: string; meaning_text: string; order_num: number; } interface TranslationListProps { quiz: QuizConfig; userName: string; } export default function TranslationList( { quiz, userName }: TranslationListProps, ) { // Theme classes are defined in styles.css with @media (prefers-color-scheme: dark) const [ask, popupElement] = AsyncYesNoPop(); const [quizData, setQuizData] = useState(quiz); const [quizConfigDataStr, setQuizConfigDataStr] = useState( JSON.stringify(quiz), ); const [quizNameStr, setQuizNameStr] = useState(quiz.quiz_name); const [text1Str, setText1Str] = useState(""); const [text2Str, setText2Str] = useState(""); const [deleteIndexStr, setDeleteIndexStr] = useState(""); //const [fileContent, setFileContent] = useState(""); const [quiz_nameError, setquiz_nameError] = useState(false); const [questionsError, setQuestionsError] = useState(false); useEffect(() => { const lockRoute = localStorage.getItem("lock-route"); if (lockRoute) { globalThis.location.href = lockRoute; } //fetchQuizData(); }, []); const justClear = async () => { const clearQuiz = { active_date: Date.now(), quiz_mode: "", owner_id: quiz.owner_id, quiz_config_id: crypto.randomUUID(), quiz_name: "", questions: [], results: [], }; setQuizData(clearQuiz); setQuizConfigDataStr(JSON.stringify(clearQuiz)); setQuizNameStr(""); setText1Str(""); setText2Str(""); setDeleteIndexStr(""); }; const handleSaveNewQuiz = async () => { }; const handleUpdateTranslation = async (translation: Translation) => { }; const handleAddTranslation = async () => { }; const handleDeleteTranslation = async (translationId: number) => { }; const uploadFile = () => { setquiz_nameError(false); const input = document.createElement("input"); input.type = "file"; input.accept = ".txt"; input.onchange = async (e) => { const file = (e.target as HTMLInputElement).files?.[0]; if (file) { const newQuizName = (file.name as string)?.split(".txt")[0] ?.trim(); if (!quizNameStr && !newQuizName) { setquiz_nameError(true); return; } if ( !quizNameStr && newQuizName && newQuizName.length > 0 ) { setQuizNameStr(newQuizName); } const text = (await file.text())?.trim(); if (text && text.length > 0) { const textToQuiz = new TextToQuizTranslations(quizData); const parsedQuizData = textToQuiz.parseText(text); setQuizData(parsedQuizData); setQuizConfigDataStr(JSON.stringify(parsedQuizData)); } } }; input.click(); }; const downloadFile = async () => { if (quizData.questions.length === 0) { setQuestionsError(true); return; } if (!quizNameStr || quizNameStr.length === 0) { setquiz_nameError(true); return; } setQuestionsError(false); const quizToText = new QuizToTextFile(quizData); const content = quizToText.generateTextContent(); const blob = new Blob([content], { type: "text/plain" }); const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = `${quizNameStr}.txt`; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); }; const handleSaveAddQuiz = async (event: Event) => { event.preventDefault(); const form = event.currentTarget as HTMLFormElement; if (deleteIndexStr) { const userConfirmed = await ask( "Are you sure you want to delete?", Date.now(), ); if (userConfirmed) { form.submit(); } } else { if (!quizNameStr || quizNameStr.length === 0) { setquiz_nameError(true); } else { form.submit(); } } }; return ( <> {popupElement}
{ const target = (e.target as HTMLInputElement).value.trim(); if (!target) { setQuizNameStr(quizNameStr); } else { setQuizNameStr(target); } }} onKeyDown={() => setquiz_nameError(false)} placeholder="Quiz Name" className={`w-full p-2 border rounded theme-input ${ quiz_nameError ? "border-red-500" : "" }`} />

Add New Translation

{ const target = (e.target as HTMLInputElement).value.trim(); setText1Str(target); }} placeholder="Bisaya" onKeyDown={() => setQuestionsError(false)} className={`flex-1 p-2 border rounded theme-input ${ questionsError ? "border-red-500" : "" }`} /> { const target = (e.target as HTMLInputElement).value.trim(); setText2Str(target); }} placeholder="English" onKeyDown={() => setQuestionsError(false)} className={`flex-1 p-2 border rounded theme-input ${ questionsError ? "border-red-500" : "" }`} />
    {quizData.questions.map((translation: any, index: number) => (
  • {translation.text_1}
    {translation.text_2}
    {!(!!translation.audio_file_1 || !!translation.audio_file_2 || !!translation.video_file || !!translation.video_file_data || !!translation.background_file || !!translation.background_image_data) ? ( ) : ( )}
  • ))}
); } async function makeQuizWithName( owner_id: string, quiz_name: string, ): Promise { try { const response = await fetch("/api/quiz", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ owner_id, quiz_name, }), }); if (!response.ok) { const errorData = await response.json(); console.error("Error creating quiz:", errorData.error); return 0; } const result = await response.json(); return result.quiz_id; } catch (error) { console.error("Network error when creating quiz:", error); return 0; } }