diff --git a/src/App.tsx b/src/App.tsx index 5edb8b9..d079d3d 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,9 +1,6 @@ -import { initContext } from './context/context'; -initContext(); - import * as React from 'react'; import { createRoot } from 'react-dom/client'; const container = document.getElementById('main'); const root = createRoot(container!); -import Home from './routes/Home'; -root.render(); \ No newline at end of file +import MancalaApp from './MancalaApp'; +root.render(); \ No newline at end of file diff --git a/src/MancalaApp.tsx b/src/MancalaApp.tsx new file mode 100644 index 0000000..80427d0 --- /dev/null +++ b/src/MancalaApp.tsx @@ -0,0 +1,92 @@ +import * as React from 'react'; +import { FunctionComponent, useState } from 'react'; +import { + BrowserRouter, + Routes, + Route, +} from "react-router-dom"; +import FloatingPanel from './components/FloatingPanel'; +import GamePage from './routes/GamePage'; +import Home from './routes/Home'; + +import { initContext } from './context/context'; +import { RTMTWS } from './rtmt/rtmt_websocket'; +import { getColorByBrightness } from './util/ColorUtil'; +import { ConnectionState } from './models/ConnectionState'; +const context = initContext(); + +const MancalaApp: FunctionComponent = () => { + const [userKey, setUserKey] = 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.error("context.rtmt is not RTMTWS"); + } + }); + }; + React.useEffect(() => { + connectToServer("connecting"); + return () => { + // todo: dispose rtmt.dispose + //context.rtmt.dispose(); + }; + }, []); + + const showConnectionState = connectionState != "connected"; + const floatingPanelColor = context.themeManager.theme.boardColor; + const connectionStateText = () => { + const map: { [key: string]: string } = { + connecting: context.texts.Connecting, + connected: context.texts.Connected, + error: context.texts.CannotConnect, + reconnecting: context.texts.ConnectingAgain, + }; + return map[connectionState]; + }; + const textColorOnBoard = getColorByBrightness( + context.themeManager.theme.boardColor, + context.themeManager.theme.textColor, + context.themeManager.theme.textLightColor + ); + return ( + <> + + + } /> + + + } > + + + + + + {connectionStateText()} + + + ); +} + +export default MancalaApp; \ No newline at end of file diff --git a/src/context/context.tsx b/src/context/context.tsx index 28d2485..4825b3c 100644 --- a/src/context/context.tsx +++ b/src/context/context.tsx @@ -11,7 +11,7 @@ export type Context = { themeManager: ThemeManager; }; -export const initContext = () => { +export const initContext = () : Context => { const rtmt = new RTMTWS(); const userKeyStore = new UserKeyStoreImpl(); const texts = TrTr; @@ -23,5 +23,3 @@ export const initContext = () => { themeManager, }; }; - -export const context: Context = initContext(); diff --git a/src/models/ConnectionState.ts b/src/models/ConnectionState.ts new file mode 100644 index 0000000..5010944 --- /dev/null +++ b/src/models/ConnectionState.ts @@ -0,0 +1 @@ +export type ConnectionState = "connecting" | "error" | "connected" | "reconnecting"; \ No newline at end of file diff --git a/src/routes/GamePage.tsx b/src/routes/GamePage.tsx new file mode 100644 index 0000000..8c02d4b --- /dev/null +++ b/src/routes/GamePage.tsx @@ -0,0 +1,18 @@ +import * as React from 'react'; +import { FunctionComponent } from 'react'; +import { useParams } from 'react-router'; +import { Context } from '../context/context'; + +const GamePage: FunctionComponent<{ context: Context }> = ({ context }) => { + let params = useParams<{gameId : string}>(); + return ( +
+ Game Route {params.gameId} + +
+ ); +} + +export default GamePage; \ No newline at end of file diff --git a/src/routes/Home.tsx b/src/routes/Home.tsx index 0485672..3ff6022 100644 --- a/src/routes/Home.tsx +++ b/src/routes/Home.tsx @@ -1,7 +1,6 @@ import * as React from "react"; import { FunctionComponent, useEffect, useState } from "react"; import BoardView from "../components/board/BoardView"; -import { context } from "../context/context"; import { RTMTWS } from "../rtmt/rtmt_websocket"; import { channel_game_move, @@ -21,7 +20,6 @@ import { v4 } from "uuid"; import { getColorByBrightness } from "../util/ColorUtil"; import { Theme } from "../theme/Theme"; import HeaderBar from "../components/headerbar/HeaderBar"; -import FloatingPanel from "../components/FloatingPanel"; import PageContainer from "../components/PageContainer"; import Row from "../components/Row"; import HeaderbarIcon from "../components/headerbar/HeaderbarIcon"; @@ -34,14 +32,14 @@ import Center from "../components/Center"; import CircularPanel from "../components/CircularPanel"; import useWindowDimensions from "../hooks/useWindowDimensions"; import { UserConnectionInfo } from "../models/UserConnectionInfo"; +import { Context } from "../context/context"; +import { ConnectionState } from "../models/ConnectionState"; -type ConnectionState = "connecting" | "error" | "connected" | "reconnecting"; - -const Home: FunctionComponent<{ initial?: number }> = ({ initial = 0 }) => { - const [userKey, setUserKey] = useState(undefined); - - const [connectionState, setConnetionState] = - useState("connecting"); +const Home: FunctionComponent<{ + context: Context, + userKey?: string, + connectionState: ConnectionState +}> = ({ context, userKey, connectionState }) => { const [searchingOpponent, setSearchingOpponent] = useState(false); @@ -67,36 +65,6 @@ const Home: FunctionComponent<{ initial?: number }> = ({ initial = 0 }) => { const [isOpponentOnline, setIsOpponentOnline] = useState(false); - 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.error("context.rtmt is not RTMTWS"); - } - }); - }; - const listenMessages = (pitAnimator: PitAnimator) => { context.rtmt.listenMessage(channel_on_game_start, (message: Object) => { const newGame: CommonMancalaGame = message as CommonMancalaGame; @@ -163,7 +131,6 @@ const Home: FunctionComponent<{ initial?: number }> = ({ initial = 0 }) => { const pitAnimator = new PitAnimator(context, updateBoardViewModel); setPitAnimator(pitAnimator); listenMessages(pitAnimator); - connectToServer("connecting"); return () => { pitAnimator.dispose(); }; @@ -204,19 +171,6 @@ const Home: FunctionComponent<{ initial?: number }> = ({ initial = 0 }) => { context.rtmt.sendMessage(channel_game_move, 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]; - }; - const textColorOnBoard = getColorByBrightness( context.themeManager.theme.boardColor, context.themeManager.theme.textColor, @@ -236,9 +190,6 @@ const Home: FunctionComponent<{ initial?: number }> = ({ initial = 0 }) => { return ( - - {connectionStateText()} -