import React, { useState, useEffect } from "react" import { useLocation } from "react-router-dom" import HandleNavigate from "../../utils/HandleNavigate/HandleNavigate" import Navbar from "../../components/Navbar/Navbar.jsx" import Background from "../../assets/backgrounds/Background.jsx" import Footer from "../../components/Footer/Footer.jsx" import useRequireAuth from "../../hooks/useRequireAuth.jsx" import ButtonGreen from "../../components/Buttons/ButtonGreen.jsx" import { motion } from "framer-motion" import { createGame, joinGame } from "../../api/gameApi.js" const GameLobbySetup = () => { const [username] = useRequireAuth({ key: "username", redirectTo: "/login" }) const { goLobby, goChooseDeck } = HandleNavigate() const location = useLocation() const deckIds = location.state?.deckIds || [] const [maxPlayers, setMaxPlayers] = useState(4) const [isPublic, setIsPublic] = useState(true) const [loading, setLoading] = useState(false) const [error, setError] = useState(null) const [createdGameCode, setCreatedGameCode] = useState("") const [showSuccess, setShowSuccess] = useState(false) const handleCreateLobby = async () => { setLoading(true) setError(null) try { const username = localStorage.getItem("username") console.log("Creating game - username:", username) if (!username) { setError("Kérlek jelentkezz be először!") setLoading(false) return } // Backend expects deckids (array), maxplayers (number), logintype (0=PUBLIC, 1=PRIVATE) const gameData = { deckids: deckIds, // Array of deck UUIDs maxplayers: maxPlayers, // Number logintype: isPublic ? 0 : 1, // 0=PUBLIC, 1=PRIVATE, 2=ORGANIZATION } console.log("Creating game with data:", gameData) const response = await createGame(gameData) console.log("Game created:", response) // Verify localStorage still has username console.log("After create - username:", localStorage.getItem("username")) // Backend returns game object directly const code = response.gamecode || response.gameCode if (code) { setCreatedGameCode(code) setShowSuccess(true) } // Creator needs to join their own game to get a gameToken // This allows the WebSocket to recognize them as the gamemaster try { const username = localStorage.getItem("username") const joinResponse = await joinGame({ gameCode: code, playerName: username, }) if (joinResponse.gameToken) { localStorage.setItem("gameToken", joinResponse.gameToken) console.log("Creator joined game as gamemaster, token stored") } } catch (joinError) { console.error("Failed to join game as creator:", joinError) // Continue anyway - the creator can still try to join manually } // Azonnali navigáció a lobbyhoz, amint létrejött a játék console.log("Navigating to lobby with code:", code) goLobby({ gameCode: code }) } catch (err) { console.error("Create game error:", err) console.error("Error response:", err.response?.data) console.error("Error status:", err.response?.status) setError( err.response?.data?.message || err.response?.data?.error || "Nem sikerült létrehozni a játékot" ) } finally { setLoading(false) } } if (deckIds.length === 0) { goChooseDeck() return null } return (
Lobby Beállítások {deckIds.length} pakli kiválasztva. Add meg a játék részleteit. {error &&
{error}
} {/* ...a kód kiírása törölve, lobbyban jelenik meg... */}
{/* Max Players */}
setMaxPlayers(parseInt(e.target.value) || 2)} className="w-full px-4 py-2 rounded-lg bg-[color:var(--color-card)] text-[color:var(--color-text)] border border-[color:var(--color-surface)] focus:ring-2 focus:ring-[color:var(--color-success)] outline-none" />
{/* Public/Private */}
{/* Action Buttons */}
goChooseDeck()} width="w-auto px-8" className="bg-gray-600 hover:bg-gray-700" disabled={loading} />
) } export default GameLobbySetup