import React, { useEffect, useRef, useState } 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 useRequireAuth from "../../hooks/useRequireAuth.jsx" import { useGameWebSocketContext } from "../../contexts/GameWebSocketContext" import { startGame } from "../../api/gameApi.js" const Lobby = () => { const [visible, setVisible] = useState(false) const [isStarting, setIsStarting] = useState(false) const sectionRef = useRef(null) const { goHome, goGame } = HandleNavigate() const location = useLocation() const [user, setUser] = useRequireAuth() // Get game code from location state or WebSocket const gameCodeFromState = location.state?.gameCode const gameToken = localStorage.getItem('gameToken') // Use the shared WebSocket context const { connect, isConnected, gameState, players, isGamemaster, gameStarted, pendingPlayers, approvalStatus, approvePlayer, rejectPlayer, } = useGameWebSocketContext() // Connect to WebSocket when component mounts useEffect(() => { if (gameToken) { connect(gameToken) } }, [gameToken, connect]) const gameCode = gameCodeFromState || gameState?.gameCode || 'Loading...' // Players list - gamemaster is separate, don't filter // Backend should handle this correctly const currentPlayers = players || [] // Debug logging useEffect(() => { if (import.meta.env.DEV) { console.log('🎮 Lobby state update:') console.log(' - isGamemaster:', isGamemaster) console.log(' - gameState:', gameState) console.log(' - players:', players) console.log(' - currentPlayers:', currentPlayers) console.log(' - pendingPlayers:', pendingPlayers) } }, [isGamemaster, gameState, players, currentPlayers, pendingPlayers]) useEffect(() => { const observer = new IntersectionObserver( ([entry]) => { if (entry.isIntersecting) setVisible(true) }, { threshold: 0.3 } ) if (sectionRef.current) observer.observe(sectionRef.current) return () => observer.disconnect() }, []) // Auto-navigate when game starts useEffect(() => { if (gameStarted) { console.log('🎮 Game started, navigating to /game') goGame() } }, [gameStarted, goGame]) // Handle approval status changes useEffect(() => { if (approvalStatus === 'denied') { alert('A gamemaster elutasította a csatlakozási kérelmedet.') localStorage.removeItem('gameToken') goHome() } else if (approvalStatus === 'approved') { console.log('✅ Join approved, you can now see the lobby') } }, [approvalStatus, goHome]) const handleExit = () => { if (window.confirm("Biztosan ki szeretnél lépni a lobbyból?")) { localStorage.removeItem('gameToken') goHome() } } const handleStartGame = async () => { // Prevent double-click if (isStarting) { console.log('⚠️ Game start already in progress, ignoring duplicate request') return } try { setIsStarting(true) // Get gameId from gameState const gameId = gameState?.gameId if (!gameId) { alert('Hiba: Játék azonosító nem található') return } console.log('Starting game with ID:', gameId) const response = await startGame(gameId) console.log('Game start response:', response) // Store boardData and updated game state for GameScreen if (response.boardData) { localStorage.setItem('boardData', JSON.stringify(response.boardData)) console.log('✅ boardData stored in localStorage') } // Navigate immediately after successful start (don't wait for WebSocket) console.log('🎮 Navigating to /game...') goGame() } catch (error) { console.error('Failed to start game:', error) // Check if game already started if (error.response?.status === 409) { console.log('Game already started, navigating to /game...') // Navigate anyway - game is already running goGame() } else { alert(`Nem sikerült elindítani a játékot: ${error.response?.data?.error || error.message}`) } } finally { setIsStarting(false) } } const copyGameCode = () => { navigator.clipboard.writeText(gameCode) alert('Játék kód vágólapra másolva: ' + gameCode) } const handleApprovePlayer = (playerName) => { if (approvePlayer(playerName)) { console.log(`✅ Player ${playerName} approved`) } } const handleRejectPlayer = (playerName) => { const reason = prompt(`Miért utasítod el ${playerName}-t?`, 'Nincs hely a játékban') if (reason !== null) { // User didn't cancel if (rejectPlayer(playerName, reason)) { console.log(`❌ Player ${playerName} rejected`) } } } const getInitials = (name) => { return name .split(" ") .map((n) => n[0]) .join("") .slice(0, 2) .toUpperCase() } return (
{/* Waiting for Approval Screen (Non-gamemaster, PRIVATE games) */} {!isGamemaster && approvalStatus === 'pending' && (
⏳

Várakozás jóváhagyásra

A gamemaster még nem hagyta jóvá a csatlakozásodat.

Kérjük, várj türelemmel, amíg a gamemaster elfogadja a kérelmedet.

Játék kód:

{gameCode}

)} {/* Normal Lobby View (Gamemaster or approved players) */} {(isGamemaster || approvalStatus !== 'pending') && (

Játék Lobby

{/* Game Code Display */}

Játék Kód:

{gameCode}

Oszd meg ezt a kódot másokkal, hogy csatlakozhassanak a játékhoz!

{/* Connection Status */}
{isConnected ? '🟢 Kapcsolódva' : '🔴 Kapcsolat megszakadt'}

Játékosok ({currentPlayers.length}):

{/* Pending Players Section (Gamemaster only, PRIVATE games) */} {isGamemaster && pendingPlayers && pendingPlayers.length > 0 && (

⏳ Jóváhagyásra váró játékosok ({pendingPlayers.length})

    {pendingPlayers.map((player, index) => (
  • {getInitials(player.playerName)}
    {player.playerName} {player.isAuthenticated && ( âś“ Bejelentkezve )}
  • ))}
)}
    {currentPlayers.length === 0 ? (
  • Várakozás játĂ©kosokra...
  • ) : ( currentPlayers.map((player, index) => (
  • {getInitials(player.name || `Player ${index + 1}`)}
    {player.name || `Player ${index + 1}`} {player.isReady && ( Kész )} {player.isOnline && ( 🟢 )}
  • )) )}
{/* Role indicator */}
{isGamemaster ? (

đź‘‘ Te vagy a Gamemaster!

Te nem játszol, csak indítod és moderálod a játékot.

) : (

🎮 Te vagy egy Játékos!

Várj, amíg a gamemaster elindítja a játékot.

)}
{isGamemaster ? ( /* Gamemaster view - can start game */ ) : ( /* Player view - cannot start game, just wait */

Várakozás a gamemaster-re...

Csak a gamemaster indíthatja el a játékot

)}
)}
) } export default Lobby