Update the show reducer from switch to map

This commit is contained in:
Grégoire Delattre 2017-06-02 21:06:03 +02:00
parent e286f5d2da
commit 7014b3933d

View File

@ -1,4 +1,4 @@
import { OrderedMap, Map, List, fromJS } from 'immutable'
import { OrderedMap, Map, fromJS } from "immutable"
const defaultState = Map({
loading: false,
@ -7,13 +7,10 @@ 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':
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) {
@ -21,74 +18,61 @@ export default function showStore(state = defaultState, action) {
episode = 0;
}
return state.mergeDeep(fromJS({
'show': {
'tracked_season': season,
'tracked_episode': episode,
"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':
}))},
"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));
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(["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);
default:
return state
}
},
}
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;