mancala/src/MancalaApp.tsx

99 lines
3.6 KiB
TypeScript
Raw Normal View History

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';
2022-07-30 14:17:16 +03:00
import { Theme } from './theme/Theme';
import LobyPage from './routes/LobyPage';
const context = initContext();
const MancalaApp: FunctionComponent = () => {
2022-07-30 14:17:16 +03:00
const [userKey, setUserKey] = useState<string | undefined>(undefined);
const [connectionState, setConnetionState] = useState<ConnectionState>("connecting");
2022-07-30 14:17:16 +03:00
const [theme, setTheme] = useState<Theme>(context.themeManager.theme);
const onConnectionDone = () => {
setConnetionState("connected");
};
const onConnectionLost = () => {
2022-09-02 00:03:37 +03:00
setConnetionState("reconnecting");
connectToServer();
};
const onConnectionError = (event: Event) => {
setConnetionState("error");
2022-09-02 00:03:37 +03:00
connectToServer();
};
2022-09-02 00:03:37 +03:00
const onThemeChange = (theme: Theme) => {
setTheme(theme)
}
const connectToServer = async () => {
2022-07-30 16:32:13 +03:00
const userKey = await context.userKeyStore.getUserKey();
setUserKey(userKey);
2022-09-02 00:03:37 +03:00
(context.rtmt as RTMTWS).initWebSocket(userKey);
};
2022-09-02 00:03:37 +03:00
React.useEffect(() => {
2022-09-02 00:03:37 +03:00
context.rtmt.on("open", onConnectionDone);
context.rtmt.on("close", onConnectionLost);
context.rtmt.on("error", onConnectionError);
context.themeManager.on("themechange", onThemeChange);
setConnetionState("connecting");
connectToServer();
return () => {
2022-09-02 00:03:37 +03:00
context.rtmt.dispose();
context.themeManager.on("themechange", onThemeChange);
};
}, []);
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
);
2022-09-02 00:03:37 +03:00
if (!userKey) return <></>;
return (
<>
<BrowserRouter>
<Routes>
2022-07-30 14:17:16 +03:00
<Route index element={<Home context={context} theme={theme} userKey={userKey} />} />
<Route path="/" >
<Route path="game" >
2022-07-30 16:32:13 +03:00
<Route path=":gameId" element={<GamePage context={context} theme={theme} userKey={userKey} connectionState={connectionState} />} ></Route>
2022-07-30 14:17:16 +03:00
</Route>
<Route path="loby" element={<LobyPage context={context} theme={theme} userKey={userKey} />}>
</Route>
</Route>
</Routes>
</BrowserRouter>
<FloatingPanel context={context} color={floatingPanelColor} visible={showConnectionState}>
<span style={{ color: textColorOnBoard }}>{connectionStateText()}</span>
</FloatingPanel>
</>
);
}
export default MancalaApp;