import React, { useEffect, useMemo, useState } from "react"; import { styles } from "../styles/styles"; import { stylesTokens } from "../styles/theme"; import { useLanguage } from "../i18n"; export default function NewGameModal({ open, onClose, onCreate, onJoin, // ✅ neu: currentCode = "", gameFinished = false, hasGame = false, }) { const { language, t } = useLanguage(); // modes: running | choice | create | join const [mode, setMode] = useState("choice"); const [joinCode, setJoinCode] = useState(""); const [err, setErr] = useState(""); const [created, setCreated] = useState(null); // { code } const [toast, setToast] = useState(""); const canJoin = useMemo(() => joinCode.trim().length >= 4, [joinCode]); // ✅ wichtig: beim Öffnen entscheidet der Modus anhand "läuft vs beendet" useEffect(() => { if (!open) return; setErr(""); setToast(""); setJoinCode(""); setCreated(null); // Wenn ein Spiel läuft (und nicht finished) -> nur Code anzeigen if (hasGame && !gameFinished) { setMode("running"); } else { setMode("choice"); } }, [open, hasGame, gameFinished]); if (!open) return null; const showToast = (msg) => { setToast(msg); setTimeout(() => setToast(""), 1100); }; const doCreate = async () => { setErr(""); try { const res = await onCreate(); setCreated({ code: res.code }); setMode("create"); } catch (e) { setErr("❌ " + (language === "en" ? "Error: " : "Fehler: ") + (e?.message || "unknown")); } }; const doJoin = async () => { setErr(""); try { await onJoin(joinCode.trim().toUpperCase()); onClose(); } catch (e) { setErr("❌ " + (language === "en" ? "Error: " : "Fehler: ") + (e?.message || "unknown")); } }; const copyText = async (text, okMsg = language === "en" ? "✅ Code copied" : "✅ Code kopiert") => { try { await navigator.clipboard.writeText(text || ""); showToast(okMsg); } catch { showToast(language === "en" ? "❌ Copy failed" : "❌ Copy nicht möglich"); } }; const codeToShow = (created?.code || "").trim() || (currentCode || "").trim(); return (
e.stopPropagation()}>
{t("game")}
{/* Toast */} {toast && (
{toast}
)}
{/* ✅ RUNNING: Nur Code anzeigen, keine Choice */} {mode === "running" && ( <>
{language === "en" ? <>The game is in progress. Here is the join code: : <>Das Spiel läuft noch. Hier ist der Join-Code:}
{t("gameCode")}
{codeToShow || "—"}
{language === "en" ? "Once a winner is selected, you can create or join a new game here." : "Sobald ein Sieger gesetzt wurde, kannst du hier ein neues Spiel erstellen oder beitreten."}
)} {/* ✅ CHOICE: nur wenn Spiel beendet oder kein Spiel selected */} {mode === "choice" && ( <>
{language === "en" ? <>Would you like to create a game or join one? : <>Willst du ein Spiel erstellen oder einem Spiel beitreten?}
)} {mode === "join" && ( <>
{language === "en" ? <>Enter the code: : <>Gib den Code ein:}
setJoinCode(e.target.value.toUpperCase())} placeholder="z.B. 8K3MZQ" style={styles.input} autoFocus />
)} {mode === "create" && created && ( <>
{language === "en" ? "Your game was created. This code will remain visible in your old games:" : "Dein Spiel wurde erstellt. Dieser Code bleibt auch bei „Alte Spiele“ sichtbar:"}
{t("gameCode")}
{created.code}
)} {err &&
{err}
}
); }