{
- let fetchUrl = "";
- switch (props.match.path) {
- case "/movies/polochon":
- fetchUrl = "/movies/polochon";
- break;
- case "/movies/wishlist":
- fetchUrl = "/wishlist/movies";
- break;
- case "/movies/search/:search":
- fetchUrl = "/movies/search/" + props.match.params.search;
- break;
- case "/movies/explore/:source/:category":
- fetchUrl =
- "/movies/explore?source=" +
- encodeURI(props.match.params.source) +
- "&category=" +
- encodeURI(props.match.params.category);
- break;
- default:
- break;
- }
-
- if (fetchUrl != "") {
- fetchMovies(fetchUrl);
- }
-
- return ;
- }}
- />
- );
-};
-MoviesRoute.propTypes = {
- component: PropTypes.object,
- match: PropTypes.object,
- fetchMovies: PropTypes.func.isRequired,
- getMovieExploreOptions: PropTypes.func.isRequired,
-};
-
-export default connect(null, { fetchMovies })(MoviesRoute);
diff --git a/frontend/js/components/shows/list.js b/frontend/js/components/shows/list.js
index 5177221..85703a6 100644
--- a/frontend/js/components/shows/list.js
+++ b/frontend/js/components/shows/list.js
@@ -1,11 +1,12 @@
-import React from "react";
+import React, { useEffect, useCallback } from "react";
import PropTypes from "prop-types";
import { Map } from "immutable";
-import { connect } from "react-redux";
+import { useSelector, useDispatch } from "react-redux";
+
import {
+ fetchShows,
selectShow,
showWishlistToggle,
- getShowDetails,
updateFilter,
getShowExploreOptions,
} from "../../actions/shows";
@@ -15,57 +16,90 @@ import { isWishlisted } from "../../utils";
import ListDetails from "../list/details";
import ListPosters from "../list/posters";
-function mapStateToProps(state) {
- return {
- loading: state.showsStore.get("loading"),
- shows: state.showsStore.get("shows"),
- filter: state.showsStore.get("filter"),
- selectedImdbId: state.showsStore.get("selectedImdbId"),
- exploreOptions: state.showsStore.get("exploreOptions"),
- };
-}
-const mapDispatchToProps = {
- selectShow,
- showWishlistToggle,
- getShowDetails,
- updateFilter,
- getShowExploreOptions,
+const fetchUrl = (match) => {
+ switch (match.path) {
+ case "/shows/polochon":
+ return "/shows/polochon";
+ case "/shows/wishlist":
+ return "/wishlist/shows";
+ case "/shows/search/:search":
+ return "/shows/search/" + match.params.search;
+ case "/shows/explore/:source/:category":
+ return (
+ "/shows/explore?source=" +
+ encodeURI(match.params.source) +
+ "&category=" +
+ encodeURI(match.params.category)
+ );
+ default:
+ return null;
+ }
};
-const ShowList = (props) => {
+const ShowList = ({ match, history }) => {
+ const dispatch = useDispatch();
+
+ useEffect(() => {
+ const url = fetchUrl(match);
+ if (url !== null) {
+ dispatch(fetchShows(url));
+ }
+ }, [dispatch, match]);
+
+ const loading = useSelector((state) => state.showsStore.get("loading"));
+ const shows = useSelector((state) => state.showsStore.get("shows"));
+ const filter = useSelector((state) => state.showsStore.get("filter"));
+ const selectedImdbId = useSelector((state) =>
+ state.showsStore.get("selectedImdbId")
+ );
+ const exploreOptions = useSelector((state) =>
+ state.showsStore.get("exploreOptions")
+ );
+
const showDetails = (imdbId) => {
- props.history.push("/shows/details/" + imdbId);
+ history.push("/shows/details/" + imdbId);
};
let selectedShow = Map();
- if (props.selectedImdbId !== "") {
- selectedShow = props.shows.get(props.selectedImdbId);
+ if (selectedImdbId !== "") {
+ selectedShow = shows.get(selectedImdbId);
}
+ const selectFunc = useCallback((id) => dispatch(selectShow(id)), [dispatch]);
+ const filterFunc = useCallback((filter) => dispatch(updateFilter(filter)), [
+ dispatch,
+ ]);
+ const exploreFetchOptions = useCallback(
+ () => dispatch(getShowExploreOptions()),
+ [dispatch]
+ );
+
return (
- props.showWishlistToggle(
- isWishlisted(selectedShow),
- selectedShow.get("imdb_id")
+ dispatch(
+ showWishlistToggle(
+ isWishlisted(selectedShow),
+ selectedShow.get("imdb_id")
+ )
)
}
>
@@ -85,15 +119,5 @@ const ShowList = (props) => {
ShowList.propTypes = {
match: PropTypes.object,
history: PropTypes.object,
- shows: PropTypes.instanceOf(Map),
- exploreOptions: PropTypes.instanceOf(Map),
- selectedImdbId: PropTypes.string,
- filter: PropTypes.string,
- loading: PropTypes.bool,
- showWishlistToggle: PropTypes.func,
- selectShow: PropTypes.func,
- getShowDetails: PropTypes.func,
- updateFilter: PropTypes.func,
- getShowExploreOptions: PropTypes.func,
};
-export default connect(mapStateToProps, mapDispatchToProps)(ShowList);
+export default ShowList;
diff --git a/frontend/js/components/shows/route.js b/frontend/js/components/shows/route.js
deleted file mode 100644
index 295f3ad..0000000
--- a/frontend/js/components/shows/route.js
+++ /dev/null
@@ -1,49 +0,0 @@
-import React from "react";
-import PropTypes from "prop-types";
-import { Route } from "react-router-dom";
-import { connect } from "react-redux";
-import { fetchShows } from "../../actions/shows";
-
-const ShowsRoute = ({ component: Component, fetchShows, ...otherProps }) => {
- return (
- {
- let fetchUrl = "";
- switch (props.match.path) {
- case "/shows/polochon":
- fetchUrl = "/shows/polochon";
- break;
- case "/shows/wishlist":
- fetchUrl = "/wishlist/shows";
- break;
- case "/shows/search/:search":
- fetchUrl = "/shows/search/" + props.match.params.search;
- break;
- case "/shows/explore/:source/:category":
- fetchUrl =
- "/shows/explore?source=" +
- encodeURI(props.match.params.source) +
- "&category=" +
- encodeURI(props.match.params.category);
- break;
- }
-
- if (fetchUrl != "") {
- fetchShows(fetchUrl);
- }
-
- return ;
- }}
- />
- );
-};
-ShowsRoute.propTypes = {
- component: PropTypes.object,
- match: PropTypes.object,
- fetchShows: PropTypes.func.isRequired,
-};
-
-export default connect(null, {
- fetchShows,
-})(ShowsRoute);