import { useState, useCallback } from 'react' import { createRoot } from 'react-dom/client' import type { GameFactoryInput } from 'board-game-engine' import '../dist/board-game-engine-react.css' import { Game, useGameserverConnection } from 'board-game-engine-react' const GAME_OPTIONS = [ { value: 'tic-tac-toe', label: 'Tic Tac Toe' }, { value: 'connect-four', label: 'Connect Four' }, { value: 'reversi', label: 'Reversi' }, { value: 'eights', label: 'Crazy Eights' }, { value: 'checkers', label: 'Checkers' }, ] function Harness () { const [gameKey, setGameKey] = useState('tic-tac-toe') const [numPlayers, setNumPlayers] = useState(2) const [gameRules, setGameRules] = useState(null) const [loading, setLoading] = useState(false) const [error, setError] = useState(null) const startGame = useCallback(async () => { setError(null) setLoading(true) try { const res = await fetch(`/games/${gameKey}.json`) if (!res.ok) throw new Error(res.statusText) const rules = await res.json() as GameFactoryInput const n = Number(numPlayers) || rules.numPlayers || rules.maxPlayers || 2 setGameRules(rules) setNumPlayers(n) } catch (err) { setError(err instanceof Error ? err.message : String(err)) setGameRules(null) } finally { setLoading(false) } }, [gameKey, numPlayers]) const connection = useGameserverConnection({ gameRules: gameRules ?? undefined, gameName: gameKey, numPlayers, enabled: gameRules != null, }) const hasState = connection && 'getState' in connection ? connection.getState?.() : undefined return (

Board Game Engine React

{error &&

{error}

}
) } const root = document.getElementById('root') if (root) { createRoot(root).render() }