diff --git a/frontend/js/app.js b/frontend/js/app.js index c7179bb..6f6b4bd 100644 --- a/frontend/js/app.js +++ b/frontend/js/app.js @@ -28,12 +28,10 @@ import { AdminPanel } from "./components/admins/panel"; import { Notifications } from "./components/notifications/notifications"; import Alert from "./components/alerts/alert"; import MovieList from "./components/movies/list"; -import MoviesRoute from "./components/movies/route"; import NavBar from "./components/navbar"; import WsHandler from "./components/websocket"; import { ShowDetails } from "./components/shows/details"; import ShowList from "./components/shows/list"; -import ShowsRoute from "./components/shows/route"; import TorrentList from "./components/torrents/list"; import TorrentSearch from "./components/torrents/search"; import UserActivation from "./components/users/activation"; @@ -61,22 +59,18 @@ const App = () => ( exact component={TorrentSearch} /> - - - - + + + - - - - + + + { + 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 = (props) => { +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 (props.movies !== undefined && props.movies.has(props.selectedImdbId)) { - selectedMovie = props.movies.get(props.selectedImdbId); + 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 (
{}} + onKeyEnter={() => {}} + params={match.params} + loading={loading} /> - props.movieWishlistToggle( - selectedMovie.get("imdb_id"), - isWishlisted(selectedMovie) + dispatch( + movieWishlistToggle( + selectedMovie.get("imdb_id"), + isWishlisted(selectedMovie) + ) ) } > @@ -96,11 +126,6 @@ const MovieList = (props) => { ); }; MovieList.propTypes = { - movies: PropTypes.instanceOf(OrderedMap), - exploreOptions: PropTypes.instanceOf(Map), - selectedImdbId: PropTypes.string, - filter: PropTypes.string, - loading: PropTypes.bool, fetchMovies: PropTypes.func, getMovieExploreOptions: PropTypes.func, updateFilter: PropTypes.func, @@ -109,4 +134,4 @@ MovieList.propTypes = { match: PropTypes.object, }; -export default connect(mapStateToProps, mapDispatchToProps)(MovieList); +export default MovieList; diff --git a/frontend/js/components/movies/route.js b/frontend/js/components/movies/route.js deleted file mode 100644 index d3e9947..0000000 --- a/frontend/js/components/movies/route.js +++ /dev/null @@ -1,50 +0,0 @@ -import React from "react"; -import PropTypes from "prop-types"; -import { Route } from "react-router-dom"; -import { connect } from "react-redux"; -import { fetchMovies } from "../../actions/movies"; - -const MoviesRoute = ({ component: Component, fetchMovies, ...otherProps }) => { - return ( - { - 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);