import React, { useEffect, useMemo, useState } from "react"; import { styles } from "../styles/styles"; import { stylesTokens } from "../styles/theme"; export default function NewGameModal({ open, onClose, onCreate, onJoin, // ✅ neu: currentCode = "", gameFinished = false, hasGame = false, }) { // 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("❌ Fehler: " + (e?.message || "unknown")); } }; const doJoin = async () => { setErr(""); try { await onJoin(joinCode.trim().toUpperCase()); onClose(); } catch (e) { setErr("❌ Fehler: " + (e?.message || "unknown")); } }; const copyText = async (text, okMsg = "✅ Code kopiert") => { try { await navigator.clipboard.writeText(text || ""); showToast(okMsg); } catch { showToast("❌ Copy nicht möglich"); } }; const codeToShow = (created?.code || "").trim() || (currentCode || "").trim(); return (
e.stopPropagation()}>
Spiel
{/* Toast */} {toast && (
{toast}
)}
{/* ✅ RUNNING: Nur Code anzeigen, keine Choice */} {mode === "running" && ( <>
Das Spiel läuft noch. Hier ist der Join-Code:
Spiel-Code
{codeToShow || "—"}
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" && ( <>
Willst du ein Spiel erstellen oder einem Spiel beitreten?
)} {mode === "join" && ( <>
Gib den Code ein:
setJoinCode(e.target.value.toUpperCase())} placeholder="z.B. 8K3MZQ" style={styles.input} autoFocus />
)} {mode === "create" && created && ( <>
Dein Spiel wurde erstellt. Dieser Code bleibt auch bei „Alte Spiele“ sichtbar:
Spiel-Code
{created.code}
)} {err &&
{err}
}
); }