import { OrderedMap, Map, fromJS } from "immutable" const defaultState = Map({ loading: false, show: Map({ seasons: OrderedMap(), }), }); 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) => { return state.mergeDeep(fromJS({ "show": { "tracked_season": action.payload.season, "tracked_episode": action.payload.episode, } }))}, "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) => state.setIn(["show", "seasons", action.payload.main.season, action.payload.main.episode, "subtitles"], fromJS(action.payload.response.data)) .setIn(["show", "seasons", action.payload.main.season, action.payload.main.episode, "fetchingSubtitles"], false), } const sortEpisodes = (state, show) => { let episodes = show.episodes; delete show["episodes"]; let ret = state.set("loading", false); if (episodes.length == 0) { return ret; } // Set the show data 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)); } // Sort the episodes ret = ret.updateIn(["show", "seasons"], function(seasons) { return seasons.map(function(episodes) { return episodes.sort((a,b) => a.get("episode") - b.get("episode")); }); }); // Sort the seasons ret = ret.updateIn(["show", "seasons"], function(seasons) { return seasons.sort(function(a,b) { 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;