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);