import * as React from 'react'; import { FunctionComponent, useState } from 'react'; import BoardView from './components/BoardView'; import { context } from './context' import { Board, GameMove, Hole, Store } from './mancala'; import { Game } from './mancala'; import { decodeText, encodeText } from './rtmt/byte_util'; import { Bytes } from './rtmt/rtmt'; import { RTMTWS } from './rtmt/rtmt_websocket'; import { channel_game_move, channel_leave_game, channel_on_game_update } from './channel_names'; import Button from './components/Button'; const testBoard = (): Board => { const board = new Board( [new Hole(0), new Hole(4), new Hole(4), new Hole(3), new Hole(2), new Hole(1)], [new Hole(4), new Hole(4), new Hole(4), new Hole(4), new Hole(4), new Hole(10)], new Store(0), new Store(0)) return board } const testGame = new Game("0", "1", testBoard(), "player2", "playing") type ConnectionState = "connecting" | "error" | "connected" | "reconnecting" const Home: FunctionComponent<{ initial?: number }> = ({ initial = 0 }) => { const [userKey, setUserKey] = useState(undefined); const [game, setGame] = useState(undefined) const [connectionState, setConnetionState] = useState("connecting") const onConnectionDone = () => { setConnetionState("connected") } const onConnectionLost = () => { connectToServer("reconnecting") } const onConnectionError = (event: Event) => { setConnetionState("error") } const connectToServer = (connectionState: ConnectionState) => { setConnetionState(connectionState) context.userKeyStore.getUserKey((userKey: string) => { setUserKey(userKey) const rtmtws = context.rtmt as RTMTWS if (rtmtws) { rtmtws.initWebSocket(userKey, onConnectionDone, onConnectionLost, onConnectionError) } else { console.log("context.rtmt is not RTMTWS"); } }) } const listenMessages = () => { context.rtmt.listenMessage(channel_on_game_update, (message: Bytes) => { const newGame: Game = JSON.parse(decodeText(message)) console.log("on game update"); console.log(newGame); setGame(new Game(newGame.player1, newGame.player2, newGame.board, newGame.turn, newGame.state)) }) context.rtmt.listenMessage(channel_on_game_update, (message: Bytes) => { const newGame: Game = JSON.parse(decodeText(message)) console.log("on game update"); console.log(newGame); setGame(new Game(newGame.player1, newGame.player2, newGame.board, newGame.turn, newGame.state)) }) context.rtmt.listenMessage("on_game_start", (message) => { const newGame: Game = JSON.parse(decodeText(message)) console.log("on_game_start"); console.log(newGame); setGame(new Game(newGame.player1, newGame.player2, newGame.board, newGame.turn, newGame.state)) }) } React.useEffect(() => { listenMessages() connectToServer("connecting") }, []) const newGameClick = () => { context.rtmt.sendMessage("new_game", new Uint8Array()) } const leaveGame = () => { context.rtmt.sendMessage(channel_leave_game, new Uint8Array()) } const onHoleSelect = (index: number, hole: Hole) => { const gameMove: GameMove = { index: index } context.rtmt.sendMessage(channel_game_move, encodeText(JSON.stringify(gameMove))) } const showConnectionState = connectionState != "connected" const connectionStateText = () => { let map: { [key: string]: string } = { "connecting": context.texts.Connecting, "connected": context.texts.Connected, "error": context.texts.CannotConnect, "reconnecting": context.texts.ConnectingAgain }; return map[connectionState] } return
{ showConnectionState &&
{connectionStateText()}
}

{context.texts.Mancala}

{ game && (
{game.state == "ended" &&
) } {!game &&
{game && ( <> {game.state == "ended" ?

{context.texts.GameEnded + " " + game.getWonPlayer() == userKey ? context.texts.YouWon : context.texts.YouLost}

:

{game.checkGameTurn(userKey) ? context.texts.YourTurn : context.texts.OpponentTurn}

} )}
} export default Home