Add auto selection of the first movie after fetching

This commit is contained in:
Grégoire Delattre 2016-11-29 21:53:04 +01:00
parent 980a7bf266
commit dca372eb69
2 changed files with 14 additions and 16 deletions

View File

@ -144,7 +144,7 @@ export default class MovieList extends React.Component {
} }
render() { render() {
const movies = this.props.movieStore.movies; const movies = this.props.movieStore.movies;
const selectedMovieId = this.props.movieStore.selectedMovie.imdbId; const selectedMovieId = this.props.movieStore.selectedImdbId;
let index = movies.map((el) => el.imdb_id).indexOf(selectedMovieId); let index = movies.map((el) => el.imdb_id).indexOf(selectedMovieId);
if (index === -1) { if (index === -1) {
index = 0; index = 0;
@ -162,7 +162,7 @@ export default class MovieList extends React.Component {
{selectedMovie && {selectedMovie &&
<MovieDetails <MovieDetails
movie={selectedMovie} movie={selectedMovie}
fetching={this.props.movieStore.selectedMovie.fetchingDetails} fetching={this.props.movieStore.fetchingDetails}
getMovieDetails={this.props.getMovieDetails} getMovieDetails={this.props.getMovieDetails}
/> />
} }

View File

@ -2,23 +2,25 @@ const defaultState = {
movies: [], movies: [],
filter: "", filter: "",
perPage: 30, perPage: 30,
selectedMovie: { selectedImdbId: "",
imdbId: "",
fetchingDetails: false, fetchingDetails: false,
},
}; };
export default function movieStore(state = defaultState, action) { export default function movieStore(state = defaultState, action) {
switch (action.type) { switch (action.type) {
case 'MOVIE_LIST_FETCH_FULFILLED': case 'MOVIE_LIST_FETCH_FULFILLED':
let selectedImdbId = "";
// Select the first movie
if (action.payload.data.length > 0) {
selectedImdbId = action.payload.data[0].imdb_id;
}
return Object.assign({}, state, { return Object.assign({}, state, {
movies: action.payload.data, movies: action.payload.data,
selectedImdbId: selectedImdbId,
}) })
case 'MOVIE_GET_DETAILS_PENDING': case 'MOVIE_GET_DETAILS_PENDING':
return Object.assign({}, state, { return Object.assign({}, state, {
selectedMovie: Object.assign({}, state.selectedMovie, {
fetchingDetails: true, fetchingDetails: true,
}),
}) })
case 'MOVIE_GET_DETAILS_FULFILLED': case 'MOVIE_GET_DETAILS_FULFILLED':
let movies = state.movies.slice(); let movies = state.movies.slice();
@ -26,20 +28,16 @@ export default function movieStore(state = defaultState, action) {
movies[index] = action.payload.data; movies[index] = action.payload.data;
return Object.assign({}, state, { return Object.assign({}, state, {
movies: movies, movies: movies,
selectedMovie: Object.assign({}, state.selectedMovie, {
fetchingDetails: false, fetchingDetails: false,
}),
}) })
case 'SELECT_MOVIE': case 'SELECT_MOVIE':
// Don't select the movie if we're fetching another movie's details // Don't select the movie if we're fetching another movie's details
if (state.selectedMovie.fetchingDetails) { if (state.fetchingDetails) {
return state return state
} }
return Object.assign({}, state, { return Object.assign({}, state, {
selectedMovie: Object.assign({}, state.selectedMovie, { selectedImdbId: action.imdbId,
imdbId: action.imdbId,
}),
}) })
default: default:
return state return state