138 lines
3.8 KiB
JavaScript
138 lines
3.8 KiB
JavaScript
import React, { useEffect, useCallback } from "react";
|
|
import PropTypes from "prop-types";
|
|
import { useSelector, useDispatch } from "react-redux";
|
|
import { Map } from "immutable";
|
|
|
|
import {
|
|
selectMovie,
|
|
updateFilter,
|
|
movieWishlistToggle,
|
|
fetchMovies,
|
|
getMovieExploreOptions,
|
|
} from "../../actions/movies";
|
|
|
|
import ListDetails from "../list/details";
|
|
import ListPosters from "../list/posters";
|
|
|
|
import { inLibrary, isWishlisted } from "../../utils";
|
|
|
|
import { ShowMore } from "../buttons/showMore";
|
|
|
|
import { MovieSubtitlesButton } from "./subtitlesButton";
|
|
import { MovieTorrentsButton } from "./torrentsButton";
|
|
|
|
const fetchUrl = (match) => {
|
|
switch (match.path) {
|
|
case "/movies/polochon":
|
|
return "/movies/polochon";
|
|
case "/movies/wishlist":
|
|
return "/wishlist/movies";
|
|
case "/movies/search/:search":
|
|
return "/movies/search/" + match.params.search;
|
|
case "/movies/explore/:source/:category":
|
|
return (
|
|
"/movies/explore?source=" +
|
|
encodeURI(match.params.source) +
|
|
"&category=" +
|
|
encodeURI(match.params.category)
|
|
);
|
|
default:
|
|
return null;
|
|
}
|
|
};
|
|
|
|
const MovieList = ({ match }) => {
|
|
const dispatch = useDispatch();
|
|
|
|
useEffect(() => {
|
|
const url = fetchUrl(match);
|
|
if (url !== null) {
|
|
dispatch(fetchMovies(url));
|
|
}
|
|
}, [dispatch, match]);
|
|
|
|
const loading = useSelector((state) => state.movieStore.get("loading"));
|
|
const movies = useSelector((state) => state.movieStore.get("movies"));
|
|
const filter = useSelector((state) => state.movieStore.get("filter"));
|
|
const selectedImdbId = useSelector((state) =>
|
|
state.movieStore.get("selectedImdbId")
|
|
);
|
|
const exploreOptions = useSelector((state) =>
|
|
state.movieStore.get("exploreOptions")
|
|
);
|
|
|
|
let selectedMovie = Map();
|
|
if (movies !== undefined && movies.has(selectedImdbId)) {
|
|
selectedMovie = movies.get(selectedImdbId);
|
|
}
|
|
|
|
const selectFunc = useCallback((id) => dispatch(selectMovie(id)), [dispatch]);
|
|
const filterFunc = useCallback((filter) => dispatch(updateFilter(filter)), [
|
|
dispatch,
|
|
]);
|
|
const exploreFetchOptions = useCallback(
|
|
() => dispatch(getMovieExploreOptions()),
|
|
[dispatch]
|
|
);
|
|
|
|
return (
|
|
<div className="row">
|
|
<ListPosters
|
|
data={movies}
|
|
type="movies"
|
|
placeHolder="Filter movies..."
|
|
exploreFetchOptions={exploreFetchOptions}
|
|
exploreOptions={exploreOptions}
|
|
selectedImdbId={selectedImdbId}
|
|
updateFilter={filterFunc}
|
|
filter={filter}
|
|
onClick={selectFunc}
|
|
onDoubleClick={() => {}}
|
|
onKeyEnter={() => {}}
|
|
params={match.params}
|
|
loading={loading}
|
|
/>
|
|
<ListDetails
|
|
data={selectedMovie}
|
|
loading={loading}
|
|
wishlist={() =>
|
|
dispatch(
|
|
movieWishlistToggle(
|
|
selectedMovie.get("imdb_id"),
|
|
isWishlisted(selectedMovie)
|
|
)
|
|
)
|
|
}
|
|
>
|
|
<ShowMore
|
|
id={selectedMovie.get("imdb_id")}
|
|
inLibrary={inLibrary(selectedMovie)}
|
|
>
|
|
<MovieTorrentsButton
|
|
torrents={selectedMovie.get("torrents")}
|
|
imdbId={selectedMovie.get("imdb_id")}
|
|
title={selectedMovie.get("title")}
|
|
searching={selectedMovie.get("fetchingDetails", false)}
|
|
/>
|
|
<MovieSubtitlesButton
|
|
subtitles={selectedMovie.get("subtitles")}
|
|
inLibrary={inLibrary(selectedMovie)}
|
|
imdbId={selectedMovie.get("imdb_id")}
|
|
searching={selectedMovie.get("fetchingSubtitles", false)}
|
|
/>
|
|
</ShowMore>
|
|
</ListDetails>
|
|
</div>
|
|
);
|
|
};
|
|
MovieList.propTypes = {
|
|
fetchMovies: PropTypes.func,
|
|
getMovieExploreOptions: PropTypes.func,
|
|
updateFilter: PropTypes.func,
|
|
movieWishlistToggle: PropTypes.func,
|
|
selectMovie: PropTypes.func,
|
|
match: PropTypes.object,
|
|
};
|
|
|
|
export default MovieList;
|