Grégoire Delattre 9a37677d52
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
Update redux state management
Use immer with native javascript objects instead of immutablejs.
2020-04-07 18:08:47 +02:00

84 lines
2.1 KiB
JavaScript

import { produce } from "immer";
const defaultState = {
loading: false,
shows: new Map(),
selectedImdbId: "",
lastFetchUrl: "",
exploreOptions: {},
};
const formatShow = (show) => {
show.fetchingDetails = false;
show.fetchingSubtitles = false;
show.episodes = undefined;
return show;
};
const formatShows = (shows = []) => {
// Add defaults
shows.map((show) => formatShow(show));
// Sort by year
shows.sort((a, b) => b.year - a.year);
let s = new Map();
shows.forEach((show) => {
s.set(show.imdb_id, show);
});
return s;
};
export default (state = defaultState, action) =>
produce(state, (draft) => {
switch (action.type) {
case "SHOW_LIST_FETCH_PENDING":
draft.loading = true;
break;
case "SHOW_LIST_FETCH_FULFILLED":
draft.loading = false;
draft.shows = formatShows(action.payload.response.data);
if (draft.shows.size > 0) {
draft.selectedImdbId = draft.shows.keys().next().value;
}
break;
case "SHOW_GET_DETAILS_PENDING":
draft.shows.get(action.payload.main.imdbId).fetchingDetails = true;
break;
case "SHOW_GET_DETAILS_FULFILLED":
draft.shows.set(
action.payload.response.data.imdb_id,
formatShow(action.payload.response.data)
);
break;
case "SHOW_GET_EXPLORE_OPTIONS_FULFILLED":
draft.exploreOptions = action.payload.response.data;
break;
case "SHOW_UPDATE_STORE_WISHLIST":
// eslint-disable-next-line camelcase
draft.shows.get(action.payload.imdbId).tracked_season =
action.payload.season;
// eslint-disable-next-line camelcase
draft.shows.get(action.payload.imdbId).tracked_episode =
action.payload.episode; // eslint-disable-line camelcase
break;
case "UPDATE_LAST_SHOWS_FETCH_URL":
draft.lastFetchUrl = action.payload.url;
break;
case "SELECT_SHOW":
draft.selectedImdbId = action.payload.imdbId;
break;
default:
return draft;
}
});