import Immutable from 'seamless-immutable' export const types = { UPDATE_GAMES: 'GAME/UPDATE_GAMES', REQUEST_CREATE_GAME: 'GAME/REQUEST_CREATE_GAME', REQUEST_JOIN_GAME: 'GAME/REQUEST_JOIN_GAME', REQUEST_START_GAME: 'GAME/REQUEST_JOIN_GAME', ENTER_LOBBY: 'GAME/ENTER_LOBBY', ENTER_GAME: 'GAME/ENTER_GAME', } export const actions = { updateGames: (games) => ({ type: types.UPDATE_GAMES, games: Immutable(games) }), requestJoinGame: (gameId) => ({ type: types.REQUEST_JOIN_GAME, gameId }), requestCreateGame: (gameName) => ({ type: types.REQUEST_CREATE_GAME, gameName }), requestStartGame: () => ({ type: types.REQUEST_START_GAME }), enterLobby: (lobby) => ({ type: types.ENTER_LOBBY, lobby: Immutable(lobby) }), enterGame: () => ({ type: types.ENTER_GAME }), } const initialState = Immutable.from({ all: {}, current: '' }) export default (state = initialState, action) => { switch (action.type) { case types.UPDATE_GAMES: return Immutable.merge(state, {all: action.games}, {deep: true}) case types.ENTER_LOBBY: return state.set('current', action.lobby.id) default: return state } } export const getAllGamesById = state => state.games.all export const getAllGames = state => { let gamesById = getAllGamesById(state) return Object.keys(gamesById).map(k => gamesById[k]); } export const getGame = (state, id) => getAllGamesById(state)[id] export const getCurrentGame = state => getGame(state, state.games.current)