import _ from 'lodash'; import PropTypes from 'prop-types'; import React, { Component } from 'react'; import { connect } from 'react-redux'; import { createSelector } from 'reselect'; import { push } from 'connected-react-router'; import getErrorMessage from 'Utilities/Object/getErrorMessage'; import PageContent from 'Components/Page/PageContent'; import PageContentBodyConnector from 'Components/Page/PageContentBodyConnector'; import LoadingIndicator from 'Components/Loading/LoadingIndicator'; import NotFound from 'Components/NotFound'; import MovieDetailsConnector from './MovieDetailsConnector'; import styles from './MovieDetails.css'; function createMapStateToProps() { return createSelector( (state, { match }) => match, (state) => state.movies, (match, movies) => { const titleSlug = match.params.titleSlug; const { isFetching, isPopulated, error, items } = movies; const movieIndex = _.findIndex(items, { titleSlug }); if (movieIndex > -1) { return { isFetching, isPopulated, titleSlug }; } return { isFetching, isPopulated, error }; } ); } const mapDispatchToProps = { push }; class MovieDetailsPageConnector extends Component { // // Lifecycle componentDidUpdate(prevProps) { if (!this.props.titleSlug) { this.props.push(`${window.Radarr.urlBase}/`); return; } } // // Render render() { const { titleSlug, isFetching, isPopulated, error } = this.props; if (isFetching && !isPopulated) { return ( ); } if (!isFetching && !!error) { return (
{getErrorMessage(error, 'Failed to load movie from API')}
); } if (!titleSlug) { return ( ); } return ( ); } } MovieDetailsPageConnector.propTypes = { titleSlug: PropTypes.string, isFetching: PropTypes.bool.isRequired, isPopulated: PropTypes.bool.isRequired, error: PropTypes.object, match: PropTypes.shape({ params: PropTypes.shape({ titleSlug: PropTypes.string.isRequired }).isRequired }).isRequired, push: PropTypes.func.isRequired }; export default connect(createMapStateToProps, mapDispatchToProps)(MovieDetailsPageConnector);