summaryrefslogtreecommitdiff
path: root/frontend/src/redux/games.ts
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/src/redux/games.ts')
-rw-r--r--frontend/src/redux/games.ts51
1 files changed, 51 insertions, 0 deletions
diff --git a/frontend/src/redux/games.ts b/frontend/src/redux/games.ts
new file mode 100644
index 00000000..5e21211a
--- /dev/null
+++ b/frontend/src/redux/games.ts
@@ -0,0 +1,51 @@
+import { List, Map } from 'immutable';
+import { combineReducers } from 'redux';
+import { ApiLobby } from '../api/model';
+import { GlobalState } from '../reducers';
+import { Action } from './actions/all';
+import { ENTER_LOBBY, UPDATE_GAMES } from './actions/lobby';
+
+export type GamesState = {
+ all: Map<string, ApiLobby>,
+ current: string | null
+};
+
+export const createGamesReducer = () => {
+ return combineReducers({
+ all: allGamesReducer,
+ current: currentGameIdReducer
+ })
+};
+
+export const allGamesReducer = (state: Map<string, ApiLobby> = Map(), action: Action) => {
+ switch (action.type) {
+ case UPDATE_GAMES:
+ const newGames = mapify(action.games);
+ return state.merge(newGames);
+ default:
+ return state;
+ }
+};
+
+function mapify(games: ApiLobby[]): Map<string, ApiLobby> {
+ let newGames: {[id:string]:ApiLobby} = {};
+ games.forEach(g => newGames[`${g.id}`] = g);
+ return Map(newGames);
+}
+
+export const currentGameIdReducer = (state: string | null = null, action: Action) => {
+ switch (action.type) {
+ case ENTER_LOBBY:
+ return `${action.gameId}`;
+ default:
+ return state;
+ }
+};
+
+export const getAllGames = (state: GlobalState): List<ApiLobby> => state.games.all.toList();
+export const getCurrentGame = (state: GlobalState): ApiLobby | null => {
+ if (state.games.current == null) {
+ return null;
+ }
+ return state.games.all.get(state.games.current) || null;
+};
bgstack15