From fa48dcac5d8e31caa6bb79f0f1a31422d91ffa49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Delattre?= Date: Wed, 23 Nov 2016 21:03:50 +0100 Subject: [PATCH] Add button to refresh the movie details --- src/public/js/actions/actionCreators.js | 7 ++++ src/public/js/components/movies/list.js | 52 +++++++++++++++++++++---- src/public/js/reducers/movies.js | 34 +++++++++++++--- 3 files changed, 81 insertions(+), 12 deletions(-) diff --git a/src/public/js/actions/actionCreators.js b/src/public/js/actions/actionCreators.js index 1de4db5..c9ba18c 100644 --- a/src/public/js/actions/actionCreators.js +++ b/src/public/js/actions/actionCreators.js @@ -69,6 +69,13 @@ export function getUserInfos() { ) } +export function getMovieDetails(imdb_id) { + return request( + 'MOVIE_GET_DETAILS', + configureAxios().get(`/movies/${imdb_id}/get_details`) + ) +} + export function fetchMovies(url) { return request( 'MOVIE_LIST_FETCH', diff --git a/src/public/js/components/movies/list.js b/src/public/js/components/movies/list.js index 889b760..23a86ec 100644 --- a/src/public/js/components/movies/list.js +++ b/src/public/js/components/movies/list.js @@ -64,29 +64,63 @@ function MovieDetails(props) { return (
-

{props.data.title}

-

{props.data.title}

+

{props.movie.title}

+

{props.movie.title}

- {props.data.runtime} min + {props.movie.runtime} min

- {props.data.rating} ({props.data.votes} counts) + {props.movie.rating} ({props.movie.votes} counts)

-

{props.data.plot}

+

{props.movie.plot}

+
); } +class MovieButtons extends React.Component { + constructor(props) { + super(props); + this.handleClick = this.handleClick.bind(this); + } + handleClick(e) { + e.preventDefault(); + this.props.getMovieDetails(this.props.movie.imdb_id); + } + render() { + const imdb_link = 'http://www.imdb.com/title/' + this.props.movie.imdb_id; + return ( +
+ + {this.props.fetching || + + Refresh + + } + {this.props.fetching && + + Refreshing + + } + + + IMDB + +
+ ); + } +} + export default class MovieList extends React.Component { componentWillMount() { this.props.fetchMovies(this.props.moviesUrl); } render() { const movies = this.props.movieStore.movies; - const index = this.props.movieStore.selectedMovieIndex; + const index = this.props.movieStore.selectedMovie.index; const selectedMovie = movies[index]; return (
@@ -96,7 +130,11 @@ export default class MovieList extends React.Component { onClick={this.props.selectMovie} /> {selectedMovie && - + }
); diff --git a/src/public/js/reducers/movies.js b/src/public/js/reducers/movies.js index 716a71c..be83b97 100644 --- a/src/public/js/reducers/movies.js +++ b/src/public/js/reducers/movies.js @@ -1,6 +1,9 @@ const defaultState = { movies: [], - selectedMovieIndex: 0, + selectedMovie: { + index: 0, + fetchingDetails: false, + }, }; export default function movieStore(state = defaultState, action) { @@ -9,11 +12,32 @@ export default function movieStore(state = defaultState, action) { return Object.assign({}, state, { movies: action.payload.data, }) - case 'MOVIE_LIST_FETCH_PENDING': - return state - case 'SELECT_MOVIE': + case 'MOVIE_GET_DETAILS_PENDING': return Object.assign({}, state, { - selectedMovieIndex: action.index, + selectedMovie: Object.assign({}, state.selectedMovie, { + fetchingDetails: true, + }), + }) + case 'MOVIE_GET_DETAILS_FULFILLED': + let movies = state.movies.slice(); + movies[state.selectedMovie.index] = action.payload.data; + return Object.assign({}, state, { + movies: movies, + selectedMovie: Object.assign({}, state.selectedMovie, { + fetchingDetails: false, + }), + }) + case 'SELECT_MOVIE': + // Don't select the movie if we're fetching another movie's details + if (state.selectedMovie.fetchingDetails) { + return state + } + + const selectedMovie = Object.assign({}, state.selectedMovie, { + index: action.index, + }) + return Object.assign({}, state, { + selectedMovie: selectedMovie, }) default: return state