summaryrefslogtreecommitdiff
path: root/frontend/src/redux/games.ts
blob: 4df2f1da3ddc85bd42c1946ad202e7fc4052dba0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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 EMPTY_GAMES: GamesState = {
  all: Map(),
  current: 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