import { OrderedMap, Map, fromJS } from "immutable" const defaultState = Map({ loading: false, movies: OrderedMap(), filter: "", selectedImdbId: "", lastFetchUrl: "", exploreOptions: Map(), }); const handlers = { "MOVIE_LIST_FETCH_PENDING": state => state.set("loading", true), "MOVIE_LIST_FETCH_ERROR": state => state.set("loading", false), "MOVIE_LIST_FETCH_FULFILLED": (state, action) => { let allMoviesInPolochon = true let movies = Map() action.payload.response.data.map(function (movie) { movie.fetchingDetails = false; movie.fetchingSubtitles = false; if (movie.polochon_url === "") { allMoviesInPolochon = false } movies = movies.set(movie.imdb_id, fromJS(movie)); }) // Select the first movie if the list is not empty let selectedImdbId = ""; if (movies.size > 0) { // Sort by year movies = movies.sort((a,b) => { if (!allMoviesInPolochon) { return b.get("year") - a.get("year") } const dateA = new Date(a.get("date_added")) const dateB = new Date(b.get("date_added")) return dateA > dateB ? -1 : dateA < dateB ? 1 : 0; }); selectedImdbId = movies.first().get("imdb_id"); } return state.delete("movies").merge(Map({ movies: movies, filter: "", loading: false, selectedImdbId: selectedImdbId, })) }, "MOVIE_GET_DETAILS_PENDING" : (state, action) => state.setIn(["movies", action.payload.main.imdbId, "fetchingDetails"], true), "MOVIE_GET_DETAILS_FULFILLED" : (state, action) => state.setIn(["movies", action.payload.response.data.imdb_id], fromJS(action.payload.response.data)) .setIn(["movies", action.payload.response.data.imdb_id, "fetchingDetails"], false) .setIn(["movies", action.payload.response.data.imdb_id, "fetchingSubtitles"], false), "MOVIE_UPDATE_STORE_WISHLIST" : (state, action) => state.setIn(["movies", action.payload.imdbId, "wishlisted"], action.payload.wishlisted), "MOVIE_GET_EXPLORE_OPTIONS_FULFILLED" : (state, action) => state.set("exploreOptions", fromJS(action.payload.response.data)), "UPDATE_LAST_MOVIE_FETCH_URL" : (state, action) => state.set("lastFetchUrl", action.payload.url), "MOVIE_SUBTITLES_UPDATE_PENDING" : (state, action) => state.setIn(["movies", action.payload.main.imdbId, "fetchingSubtitles"], true), "MOVIE_SUBTITLES_UPDATE_FULFILLED" : (state, action) => state.setIn(["movies", action.payload.main.imdbId, "fetchingSubtitles"], false) .setIn(["movies", action.payload.main.imdbId, "subtitles"], fromJS(action.payload.response.data)), "SELECT_MOVIE" : (state, action) => state.set("selectedImdbId", action.payload.imdbId), "MOVIE_UPDATE_FILTER" : (state, action) => state.set("filter", action.payload.filter), } export default (state = defaultState, action) => handlers[action.type] ? handlers[action.type](state, action) : state;