refactored Search component

This commit is contained in:
andres alcocer
2021-10-08 18:32:51 -04:00
parent d952c89719
commit 09318b3134
6 changed files with 57 additions and 104 deletions

View File

@@ -1,37 +1,45 @@
import React from 'react';
import Aux from '../hoc/Aux';
import AddIcon from '../static/images/add.svg';
import PlayIcon from '../static/images/play-button.svg';
import React from 'react' import React from 'react'
export default function ModalMovieDetails(props) { import AddIcon from '../static/images/add.svg'
import PlayIcon from '../static/images/play-button.svg'
const MovieDetails = ({
movie: {
title,
name,
vote_average,
release_date,
first_air_date,
runtime,
episode_run_time,
number_of_episodes,
number_of_seasons,
overview,
},
}) => {
return ( return (
<Aux> <div className='modal__container'>
<div className="modal__container"> <h1 className='modal__title'>{title || name}</h1>
<h1 className="modal__title"> <p className='modal__info'>
{props.movie.title || props.movie.name} <span className='modal__rating'>Rating: {vote_average * 10}% </span>
</h1> Release date: {release_date || first_air_date} Runtime:{' '}
<p className="modal__info"> {runtime || episode_run_time}m
<span className="modal__rating"> </p>
Rating: {props.movie.vote_average * 10}%{" "} <p className='modal__episode'>
</span> {number_of_episodes ? ' Episodes: ' + number_of_episodes : ''}
Release date: {props.movie.release_date || props.movie.first_air_date} Runtime: {props.movie.runtime || props.movie.episode_run_time}m {number_of_seasons ? ' Seasons: ' + number_of_seasons : ''}
</p> </p>
<p className="modal__episode"> <p className='modal__overview'>{overview}</p>
{props.movie.number_of_episodes ? " Episodes: " + props.movie.number_of_episodes : ""} <button className='modal__btn modal__btn--red'>
{props.movie.number_of_seasons ? " Seasons: " + props.movie.number_of_seasons : ""} <PlayIcon className='modal__btn--icon' />
</p> Play
<p className="modal__overview">{props.movie.overview}</p> </button>
<button className="modal__btn modal__btn--red"> <button className='modal__btn'>
<PlayIcon className="modal__btn--icon" /> <AddIcon className='modal__btn--icon' />
Play My List
</button> </button>
<button className="modal__btn"> </div>
<AddIcon className="modal__btn--icon" /> )
My List }
</button>
</div> export default MovieDetails
</Aux>
);
}

View File

@@ -1,45 +0,0 @@
import React from 'react'
import AddIcon from '../../static/images/add.svg'
import PlayIcon from '../../static/images/play-button.svg'
export default function MovieDetails({
movie: {
title,
name,
vote_average,
release_date,
first_air_date,
runtime,
episode_run_time,
number_of_episodes,
number_of_seasons,
overview,
},
}) {
return (
<div>
<div className='modal__container'>
<h1 className='modal__title'>{title || name}</h1>
<p className='modal__info'>
<span className='modal__rating'>Rating: {vote_average * 10}% </span>
Release date: {release_date || first_air_date} Runtime:{' '}
{runtime || episode_run_time}m
</p>
<p className='modal__episode'>
{number_of_episodes ? ' Episodes: ' + number_of_episodes : ''}
{number_of_seasons ? ' Seasons: ' + number_of_seasons : ''}
</p>
<p className='modal__overview'>{overview}</p>
<button className='modal__btn modal__btn--red'>
<PlayIcon className='modal__btn--icon' />
Play
</button>
<button className='modal__btn'>
<AddIcon className='modal__btn--icon' />
My List
</button>
</div>
</div>
)
}

View File

@@ -2,17 +2,10 @@ import React from 'react'
import Backdrop from './Backdrop' import Backdrop from './Backdrop'
const Modal = ({ const Modal = ({ show, modalClosed, children, backgroundImage }) => {
show,
modalClosed,
children,
movie: { backdrop_path, poster_path },
}) => {
const backgroundStyle = { const backgroundStyle = {
backgroundSize: 'cover', backgroundSize: 'cover',
backgroundImage: `url(https://image.tmdb.org/t/p/original/${ backgroundImage: `url(https://image.tmdb.org/t/p/original/${backgroundImage})`,
backdrop_path || poster_path
})`,
} }
return ( return (

View File

@@ -2,15 +2,15 @@ import React, { useState } from 'react'
import MainContent from '../components/MainContent' import MainContent from '../components/MainContent'
import Modal from '../components/UI/Modal' import Modal from '../components/UI/Modal'
import MovieDetails from '../components/Movie/MovieDetails' import ModalMovieDetails from '../components/ModalMovieDetails'
const Home = () => { const Home = () => {
const [toggleModal, setToggleModal] = useState(false) const [toggleModal, setToggleModal] = useState(false)
const [movieOverview, setMovieOverview] = useState({}) const [movieDetails, setMovieDetails] = useState({})
const selectMovieHandler = async (movie) => { const selectMovieHandler = async (movie) => {
setToggleModal(true) setToggleModal(true)
setMovieOverview(movie) setMovieDetails(movie)
} }
const closeModal = () => { const closeModal = () => {
@@ -25,9 +25,9 @@ const Home = () => {
<Modal <Modal
show={toggleModal} show={toggleModal}
modalClosed={closeModal} modalClosed={closeModal}
movie={movieOverview} backgroundImage={movieDetails.backdrop_path || movieDetails.poster_path}
> >
<MovieDetails movie={movieOverview} /> <ModalMovieDetails movie={movieDetails} />
</Modal> </Modal>
</> </>
) )

View File

@@ -5,8 +5,8 @@ import { useDispatch, useSelector } from 'react-redux'
import { useDebounce } from '../hooks/useDebounce' import { useDebounce } from '../hooks/useDebounce'
import * as movieActions from '../store/actions' import * as movieActions from '../store/actions'
import Modal from '../components/UI/Modal' import Modal from '../components/UI/Modal'
import MovieDetails from '../components/Movie/MovieDetails' import ModalMovieDetails from '../components/ModalMovieDetails'
import Movie from '../components/Movie/Movie' import Movie from '../components/Movie'
// A custom hook that builds on useLocation to parse // A custom hook that builds on useLocation to parse
// the query string for you. // the query string for you.
@@ -42,12 +42,10 @@ const Search = () => {
<> <>
<div className='search-container'> <div className='search-container'>
{searchResults.map((movie) => { {searchResults.map((movie) => {
let movieRows = []
let movieImageUrl
if (movie.poster_path !== null && movie.media_type !== 'person') { if (movie.poster_path !== null && movie.media_type !== 'person') {
movieImageUrl = const movieImageUrl =
'https://image.tmdb.org/t/p/w500' + movie.poster_path 'https://image.tmdb.org/t/p/w500' + movie.poster_path
const movieComponent = ( return (
<Movie <Movie
movieDetails={() => onSelectMovieHandler(movie)} movieDetails={() => onSelectMovieHandler(movie)}
key={movie.id} key={movie.id}
@@ -55,18 +53,17 @@ const Search = () => {
movie={movie} movie={movie}
/> />
) )
movieRows.push(movieComponent)
} }
return movieRows
})} })}
</div> </div>
<Modal <Modal
Modal
show={isToggleModal} show={isToggleModal}
modalClosed={onCloseModalHandler} modalClosed={onCloseModalHandler}
movie={movieDetails} backgroundImage={
movieDetails.backdrop_path || movieDetails.poster_path
}
> >
<MovieDetails movie={movieDetails} /> <ModalMovieDetails movie={movieDetails} />
</Modal> </Modal>
</> </>
) : ( ) : (