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