diff --git a/src/public/js/reducers/show.js b/src/public/js/reducers/show.js index 178c5ef..8273de0 100644 --- a/src/public/js/reducers/show.js +++ b/src/public/js/reducers/show.js @@ -1,4 +1,4 @@ -import { OrderedMap, Map, List, fromJS } from 'immutable' +import { OrderedMap, Map, fromJS } from "immutable" const defaultState = Map({ loading: false, @@ -7,88 +7,72 @@ const defaultState = Map({ }), }); -export default function showStore(state = defaultState, action) { - switch (action.type) { - case 'SHOW_FETCH_DETAILS_PENDING': - return state.set('loading', true) - case 'SHOW_FETCH_DETAILS_FULFILLED': - return sortEpisodes(state, action.payload.response.data); - case 'SHOW_UPDATE_STORE_WISHLIST': - let season = action.payload.season; - let episode = action.payload.episode; - if (action.payload.wishlisted && season === null) { - season = 0; - episode = 0; +const handlers = { + "SHOW_FETCH_DETAILS_PENDING": state => state.set("loading", true), + "SHOW_FETCH_DETAILS_FULFILLED": (state, action) => sortEpisodes(state, action.payload.response.data), + "SHOW_UPDATE_STORE_WISHLIST": (state, action) => { + let season = action.payload.season; + let episode = action.payload.episode; + if (action.payload.wishlisted && season === null) { + season = 0; + episode = 0; + } + return state.mergeDeep(fromJS({ + "show": { + "tracked_season": season, + "tracked_episode": episode, } - return state.mergeDeep(fromJS({ - 'show': { - 'tracked_season': season, - 'tracked_episode': episode, - } - })); - case 'EPISODE_GET_DETAILS_PENDING': - return state.setIn(['show', 'seasons', action.payload.main.season, action.payload.main.episode, 'fetching'], true); - case 'EPISODE_GET_DETAILS_FULFILLED': - let data = action.payload.response.data; - if (!data) { return state } - data.fetching = false; - return state.setIn(['show', 'seasons', data.season, data.episode], fromJS(data)); - case 'EPISODE_SUBTITLES_UPDATE_PENDING': - return state.setIn(['show', 'seasons', action.payload.main.season, action.payload.main.episode, 'fetchingSubtitles'], true); - case 'EPISODE_SUBTITLES_UPDATE_FULFILLED': - let epId = ['show', 'seasons', action.payload.main.season, action.payload.main.episode]; - let ep = state.getIn(epId); - ep = ep.set('subtitles', fromJS(action.payload.response.data)).set('fetchingSubtitles', false); - return state.setIn(epId, ep); - default: - return state - } + }))}, + "EPISODE_GET_DETAILS_PENDING": (state, action) => state.setIn(["show", "seasons", action.payload.main.season, action.payload.main.episode, "fetching"], true), + "EPISODE_GET_DETAILS_FULFILLED": (state, action) => { + let data = action.payload.response.data; + if (!data) { return state } + data.fetching = false; + return state.setIn(["show", "seasons", data.season, data.episode], fromJS(data)); + }, + "EPISODE_SUBTITLES_UPDATE_PENDING": (state, action) => state.setIn(["show", "seasons", action.payload.main.season, action.payload.main.episode, "fetchingSubtitles"], true), + "EPISODE_SUBTITLES_UPDATE_FULFILLED": (state, action) => { + let epId = ["show", "seasons", action.payload.main.season, action.payload.main.episode]; + let ep = state.getIn(epId); (state, action) => + ep = ep.set("subtitles", fromJS(action.payload.response.data)).set("fetchingSubtitles", false); + return state.setIn(epId, ep); + }, } -function updateEpisode(state, fetching, data = null) { - if (data === null) { - return state; - } - - if (!state.hasIn(['show', 'season', data.season, data.episode])) { - return show; - } - - data.fetching = fetching - return show.updateIn(['show', 'seasons', data.season, data.episode], fromJS(data)); -} - -function sortEpisodes(state, show) { +const sortEpisodes = (state, show) => { let episodes = show.episodes; delete show["episodes"]; - let ret = state.set('loading', false); + let ret = state.set("loading", false); if (episodes.length == 0) { return ret; } // Set the show data - ret = ret.set('show', fromJS(show)); + ret = ret.set("show", fromJS(show)); // Set the show episodes for (let ep of episodes) { ep.fetching = false; - ret = ret.setIn(['show', 'seasons', ep.season, ep.episode], fromJS(ep)); + ret = ret.setIn(["show", "seasons", ep.season, ep.episode], fromJS(ep)); } // Sort the episodes - ret = ret.updateIn(['show', 'seasons'], function(seasons) { + ret = ret.updateIn(["show", "seasons"], function(seasons) { return seasons.map(function(episodes) { - return episodes.sort((a,b) => a.get('episode') - b.get('episode')); + return episodes.sort((a,b) => a.get("episode") - b.get("episode")); }); }); // Sort the seasons - ret = ret.updateIn(['show', 'seasons'], function(seasons) { + ret = ret.updateIn(["show", "seasons"], function(seasons) { return seasons.sort(function(a,b) { - return a.first().get('season') - b.first().get('season'); + return a.first().get("season") - b.first().get("season"); }); }); return ret } + +export default (state = defaultState, action) => + handlers[action.type] ? handlers[action.type](state, action) : state;