const q = s => document.querySelector(s); function qsParam(name){ const p = new URLSearchParams(window.location.search); return p.get(name); } const gameId = qsParam('game'); if(!gameId){ document.body.innerHTML = '
Game ID missing in URL
'; } else { // Query explicit backend first to avoid interpreting same-origin static 404 as game-deleted fetch(`http://localhost:4000/api/game/${gameId}`).then(r => { if(r.status === 404){ // game deleted — eject user to lobby and clear session state sessionStorage.removeItem(`playerId:${gameId}`); alert('La partie a été supprimée par l\'hôte. Retour au lobby.'); window.location.href = 'index.html'; throw new Error('game deleted'); } if(!r.ok) throw new Error('no api'); return r.json(); }).then(g => { q('#wait-game-id').textContent = g.name || ''; renderWaitingPlayers(g.players||[]); // display current player nick and color if we have a playerId const stored = sessionStorage.getItem(`playerId:${gameId}`); if(stored){ const me = (g.players||[]).find(p=>p.id===stored); if(me){ q('#player-nick').textContent = 'Vous'; q('#player-color').textContent = me.colorChoice || '-'; } } // owner-only start button const ownerId = g.players && g.players[0] && g.players[0].id; if(ownerId && stored && ownerId === stored){ q('#start-btn')?.classList.remove('hidden'); } else { q('#start-btn')?.classList.add('hidden'); } if(!g.started) startPolling(gameId); // try to connect socket.io for instant updates and identification tryConnectSocket(gameId); }).catch(()=>{ // fallback: attempt same-origin server, then localStorage fetch(`/api/game/${gameId}`).then(r=>{ if(r.status === 404){ sessionStorage.removeItem(`playerId:${gameId}`); alert('La partie a été supprimée par l\'hôte. Retour au lobby.'); window.location.href = 'index.html'; throw new Error('game deleted'); } if(!r.ok) throw new Error('no api'); return r.json(); }).then(g=>{ q('#wait-game-id').textContent = g.name || ''; renderWaitingPlayers(g.players||[]); const stored = sessionStorage.getItem(`playerId:${gameId}`); if(stored){ const me = (g.players||[]).find(p=>p.id===stored); if(me){ q('#player-nick').textContent = 'Vous'; q('#player-color').textContent = me.colorChoice || '-'; } } const ownerId = g.players && g.players[0] && g.players[0].id; if(ownerId && stored && ownerId === stored){ q('#start-btn')?.classList.remove('hidden'); } else { q('#start-btn')?.classList.add('hidden'); } if(!g.started) startPolling(gameId); tryConnectSocket(gameId); }).catch(()=>{ const all = JSON.parse(localStorage.getItem('games') || '[]'); const g = all.find(x=>x.id === gameId); if(g){ q('#wait-game-id').textContent = g.name || ''; renderWaitingPlayers(g.players || []); } else { startPolling(gameId); } }); }); } // Socket.IO wiring: connect to backend explicitly and join game room; send identify so server can map socket->player function tryConnectSocket(gameId){ if(typeof io === 'undefined') return; // socket lib not loaded // connect explicitly to backend to avoid same-origin static server 404 const sock = io('http://localhost:4000', { transports: ['websocket', 'polling'] }); sock.on('connect', () => { console.log('socket connected from waiting page', sock.id); sock.emit('join-game', gameId); const stored = sessionStorage.getItem(`playerId:${gameId}`) || (()=>{ const all = JSON.parse(localStorage.getItem('games') || '[]'); const g = all.find(x=>x.id===gameId); return g && g.players && g.players[0] && g.players[0].id; })(); if(stored) sock.emit('identify', { gameId, playerId: stored }); }); sock.on('game-deleted', (payload) => { if(payload && payload.gameId === gameId){ sessionStorage.removeItem(`playerId:${gameId}`); alert('La partie a été supprimée par l\'hôte. Retour au lobby.'); window.location.href = 'index.html'; } }); sock.on('player-update', (g) => { if(!g) return; renderWaitingPlayers(g.players||[]); }); sock.on('game-start', (g) => { if(!g) return; // redirect to game view (index) when started window.location.href = `index.html?game=${g.id}`; }); sock.on('connect_error', (err) => { console.warn('socket connect error', err); // leave polling as fallback }); } function renderWaitingPlayers(players){ const ul = q('#wait-players'); ul.innerHTML = ''; if(!players || players.length === 0) ul.innerHTML = '