import {canPlay, Card} from 'bsx-core'; import {useEffect, useState} from 'react'; import io from 'socket.io-client'; import CreateRoomForm from '../components/CreateRoomForm'; import JoinRoomForm from '../components/JoinRoomForm'; import LoginForm from '../components/LoginForm'; interface GameState { cards: Card[], players: {username: string, numCards: number, rank: number}[], lastPlayed: Card[] | null, lastPlayedPlayer: string | null, playerTurn: string } const rankStrs = ['', 'A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']; const suitChars = ['♣', '♦', '♥', '♠']; export default function Game() { const [socket, setSocket] = useState(null); const [connected, setConnected] = useState(false); const [loggedIn, setLoggedIn] = useState(false); const [username, setUsername] = useState(null); const [room, setRoom] = useState(null); const [roomUsers, setRoomUsers] = useState([]); const [roomHost, setRoomHost] = useState(''); const [gameState, setGameState] = useState(null); const [cardSelected, setCardSelected] = useState([]); useEffect(() => { const socket = io(process.env.NEXT_PUBLIC_BACK_HOST!); setSocket(socket); socket.on('connect', () => setConnected(true)); socket.on('disconnect', () => { setConnected(false); setLoggedIn(false); setRoom(null); setGameState(null); }); socket.on('joinRoom', (data: {name: string}) => setRoom(data.name)); socket.on('leaveRoom', () => { setRoom(null); setGameState(null); }); socket.on('roomUpdate', (data: {users: string[], host: string}) => { setRoomUsers(data.users); setRoomHost(data.host); }); socket.on('gameState', (data: GameState) => { setGameState(data); if (data.cards.length !== cardSelected.length) setCardSelected(new Array(data.cards.length).fill(false)); }); socket.on('endGame', () => setGameState(null)); return () => {socket.close()}; }, []); if (!socket) return null; if (!loggedIn) { return ( { setLoggedIn(true); setUsername(s); }} username={username} /> ); } if (!room) { return ( <>

Logged in as {username}



); } if (!gameState) { return ( <>

Room {room}

Users:

    {roomUsers.map(user =>
  • {user + (user === roomHost ? ' (Host)':'')}
  • )}
{username === roomHost && } ); } const selectedCards = gameState.cards.filter((_, i) => cardSelected[i]); return ( <>
    {gameState.players.map(p => (
  • {p.username + (p.rank ? ` (Rank ${p.rank})` : '') + (p.numCards ? ` (${p.numCards} cards)` : '')}
  • ))}

Last played:

{gameState.lastPlayed ? ( <> {gameState.lastPlayed.map((card, i) => {rankStrs[card.rank]+' '+suitChars[card.suit]+'|'})} {` by ${gameState.lastPlayedPlayer}`} ) : '(Nothing)'}
{`It's ${gameState.playerTurn}'s turn!`}

Your cards:

{gameState.cards.map((card, i) => ( ))}
); }