import { produce } from "immer"; import { formatTorrents } from "../utils"; import { formatSubtitle, formatSubtitles } from "./utils"; const defaultState = { loading: false, movies: new Map(), selectedImdbId: "", lastFetchUrl: "", exploreOptions: {}, }; const formatMovie = (movie) => { movie.fetchingDetails = false; movie.fetchingSubtitles = []; movie.torrents = formatTorrents(movie); movie.subtitles = formatSubtitles(movie.subtitles); return movie; }; const formatMovies = (movies = []) => { let allMoviesInPolochon = true; movies.map((movie) => { formatMovie(movie); if (movie.polochon_url === "") { allMoviesInPolochon = false; } }); movies.sort((a, b) => { if (!allMoviesInPolochon) { return b.year - a.year; } const dateA = new Date(a.date_added); const dateB = new Date(b.date_added); return dateA > dateB ? -1 : dateA < dateB ? 1 : 0; }); let m = new Map(); movies.forEach((movie) => { m.set(movie.imdb_id, movie); }); return m; }; export default (state = defaultState, action) => produce(state, (draft) => { switch (action.type) { case "MOVIE_LIST_FETCH_PENDING": draft.loading = true; break; case "MOVIE_LIST_FETCH_ERROR": draft.loading = false; break; case "MOVIE_LIST_FETCH_FULFILLED": draft.loading = false; draft.movies = formatMovies(action.payload.response.data); if (draft.movies.size > 0) { draft.selectedImdbId = draft.movies.keys().next().value; } break; case "MOVIE_GET_DETAILS_PENDING": draft.movies.get(action.payload.main.imdbId).fetchingDetails = true; break; case "MOVIE_GET_DETAILS_FULFILLED": draft.movies.set( action.payload.response.data.imdb_id, formatMovie(action.payload.response.data) ); break; case "MOVIE_UPDATE_STORE_WISHLIST": draft.movies.get(action.payload.imdbId).wishlisted = action.payload.wishlisted; break; case "MOVIE_GET_EXPLORE_OPTIONS_FULFILLED": draft.exploreOptions = action.payload.response.data; break; case "UPDATE_LAST_MOVIE_FETCH_URL": draft.lastFetchUrl = action.payload.url; break; case "MOVIE_SUBTITLES_UPDATE_PENDING": { let imdbId = action.payload.main.imdbId; let lang = action.payload.main.lang; draft.movies.get(imdbId).fetchingSubtitles.push(lang); if (draft.movies.get(imdbId).subtitles.get(lang)) { draft.movies.get(imdbId).subtitles.get(lang).searching = true; } break; } case "MOVIE_SUBTITLES_UPDATE_FULFILLED": { let imdbId = action.payload.main.imdbId; let lang = action.payload.main.lang; let data = action.payload.response.data; draft.movies.get(imdbId).fetchingSubtitles = draft.movies .get(imdbId) .fetchingSubtitles.filter((l) => l != lang); if (data) { draft.movies.get(imdbId).subtitles.set(lang, formatSubtitle(data)); } break; } case "SELECT_MOVIE": draft.selectedImdbId = action.payload.imdbId; break; default: return draft; } });