-
{movie.title} Details
+ const { id } = useParams();
+ const { push } = useHistory();
+
+ const handleClick = () => {
+ props.deleteMovie(movie.id);
+ push("/movies");
+ };
+
+ const handleAdd = () => {
+ props.addFavorite(movie);
+ };
+
+ const displayFavorites = props.displayFavorites;
+
+ const movie = props.movies.find((movie) => movie.id === Number(id));
+ console.log(movie);
+ return (
+
+
+
+
+
{movie.title} Details
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
{movie.description}
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+ {movie.description}
+
+
+
+
+
+
-
);
-}
-
-export default Movie;
\ No newline at end of file
+
+
+ );
+};
+const mapStateToProps = (state) => {
+ return {
+ displayFavorites: state.favoritesReducer.displayFavorites,
+ movies: state.movieReducer.movies,
+ };
+};
+export default connect(mapStateToProps, { deleteMovie, addFavorite })(Movie);
diff --git a/src/components/MovieHeader.js b/src/components/MovieHeader.js
index e3443e5fb..dfcdad95c 100644
--- a/src/components/MovieHeader.js
+++ b/src/components/MovieHeader.js
@@ -1,22 +1,42 @@
-import React from 'react';
-import { Link } from 'react-router-dom';
+import React from "react";
+import { Link } from "react-router-dom";
+import { toggleFavorites } from "../actions/favoritesActions";
+import { connect } from "react-redux";
const MovieHeader = (props) => {
- const appTitle = "";
- const displayFavorites = true;
-
- return(
-
+ const appTitle = "";
+ const { displayFavorites, toggleFavorites } = props;
+
+ return (
+
+
-
{appTitle}
+ {props.appTitle}
-
{ displayFavorites ? "Hide" : "Show"} Favorites
-
View All Movies
-
Add New Movie
-
+
+
+ {displayFavorites ? "Hide" : "Show"} Favorites
+
+
+
+ View All Movies
+
+
+
{" "}
+
Add New Movie
+
-
);
-}
+
+
+ );
+};
+
+const mapStateToProps = (state) => {
+ return {
+ displayFavorites: state.favoritesReducer.displayFavorites,
+ appTitle: state.movieReducer.appTitle,
+ };
+};
-export default MovieHeader;
\ No newline at end of file
+export default connect(mapStateToProps, { toggleFavorites })(MovieHeader);
diff --git a/src/components/MovieList.js b/src/components/MovieList.js
index 268c78099..a9afb1830 100644
--- a/src/components/MovieList.js
+++ b/src/components/MovieList.js
@@ -1,34 +1,42 @@
-import React from 'react';
+import React from "react";
-import MovieListItem from './MovieListItem';
-import MovieFooter from './MovieFooter';
+import MovieListItem from "./MovieListItem";
+import MovieFooter from "./MovieFooter";
-const MovieList = (props)=> {
- const movies = [];
+import { connect } from "react-redux";
- return (
-
-
-
-
- | Title |
- Director |
- Genre |
- Metascore |
- |
-
-
+const MovieList = (props) => {
+ const movies = props.movies;
-
- {
- movies.map(movie=>)
- }
-
-
-
-
-
- );
-}
+ return (
+
+
+
+
+ | Title |
+ Director |
+ Genre |
+ Metascore |
+ |
+
+
-export default MovieList;
\ No newline at end of file
+
+ {movies.map((movie) => (
+
+ ))}
+
+
+
+
+
+ );
+};
+
+const mapStateToProps = (state) => {
+ console.log(state.movieReducer);
+ return {
+ movies: state.movieReducer.movies,
+ };
+};
+export default connect(mapStateToProps, {})(MovieList);
diff --git a/src/components/MovieListItem.js b/src/components/MovieListItem.js
index 11f13730e..b931739d0 100644
--- a/src/components/MovieListItem.js
+++ b/src/components/MovieListItem.js
@@ -1,20 +1,22 @@
-import React from 'react';
-import { Link } from 'react-router-dom';
+import React from "react";
+import { Link } from "react-router-dom";
-const MovieListItem = (props)=> {
- const { id, title, director, genre, metascore} = props.movie;
+const MovieListItem = (props) => {
+ const { id, title, director, genre, metascore } = props.movie;
- return(
+ return (
+
| {title} |
{director} |
{genre} |
{metascore} |
-
+
|
-
);
-}
+
+ );
+};
-export default MovieListItem;
\ No newline at end of file
+export default MovieListItem;
diff --git a/src/index.js b/src/index.js
index 227c0531b..be701b1f6 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,17 +1,21 @@
-import React from 'react';
-import ReactDOM from 'react-dom';
-import { createStore } from 'redux';
-import { Provider } from 'react-redux';
+import React from "react";
+import ReactDOM from "react-dom";
+import { createStore } from "redux";
+import { Provider } from "react-redux";
-import reducer from './reducers';
+import reducer from "./reducers";
-import App from './components/App';
-import { BrowserRouter as Router } from 'react-router-dom';
-import './index.css';
+import App from "./components/App";
+import { BrowserRouter as Router } from "react-router-dom";
+import "./index.css";
+
+const store = createStore(reducer);
ReactDOM.render(
-
+
+
- ,
- document.getElementById('root')
+
+ ,
+ document.getElementById("root")
);
diff --git a/src/reducers/favoritesReducer.js b/src/reducers/favoritesReducer.js
new file mode 100644
index 000000000..960cfefc6
--- /dev/null
+++ b/src/reducers/favoritesReducer.js
@@ -0,0 +1,38 @@
+import {
+ ADD_FAVORITE,
+ REMOVE_FAVORITE,
+ TOGGLE_FAVORITES,
+} from "../actions/favoritesActions";
+
+const initialState = {
+ favorites: [],
+ displayFavorites: true,
+};
+
+const favoritesReducer = (state = initialState, action) => {
+ switch (action.type) {
+ case TOGGLE_FAVORITES:
+ return {
+ ...state,
+ displayFavorites: !state.displayFavorites,
+ };
+
+ case ADD_FAVORITE:
+ return {
+ ...state,
+ favorites: [...state.favorites, action.payload],
+ };
+ case REMOVE_FAVORITE: {
+ return {
+ ...state,
+ favorites: state.favorites.filter((movie) => {
+ movie.id !== action.payload;
+ }),
+ };
+ }
+ default:
+ return state;
+ }
+};
+
+export default favoritesReducer;
diff --git a/src/reducers/index.js b/src/reducers/index.js
index 6629609ca..98b4a8130 100644
--- a/src/reducers/index.js
+++ b/src/reducers/index.js
@@ -1,5 +1,11 @@
-import { combineReducers } from 'redux';
+import { combineReducers } from "redux";
-import movieReducer from './movieReducer';
+import movieReducer from "./movieReducer";
+import favoritesReducer from "./favoritesReducer";
-export default movieReducer;
\ No newline at end of file
+const combinedReducers = combineReducers({
+ movieReducer,
+ favoritesReducer,
+});
+
+export default combinedReducers;
diff --git a/src/reducers/movieReducer.js b/src/reducers/movieReducer.js
index 16f33bcdd..73da7f6ed 100644
--- a/src/reducers/movieReducer.js
+++ b/src/reducers/movieReducer.js
@@ -1,20 +1,30 @@
-import { ADD_MOVIE, DELETE_MOVIE } from '../actions/movieActions.js';
-import movies from './../data.js';
+import { ADD_MOVIE, DELETE_MOVIE } from "../actions/movieActions.js";
+import movies from "./../data.js";
const initialState = {
- movies: movies,
- appTitle: "IMDB Movie Database"
-}
+ movies: movies,
+ appTitle: "IMDB Movie Database",
+};
-const reducer = (state, action) => {
- switch(action.type) {
- case DELETE_MOVIE:
- return {
- movies: state.movies.filter(item=>(action.payload !== item.id))
- }
- default:
- return state;
- }
-}
+const reducer = (state = initialState, action) => {
+ switch (action.type) {
+ case DELETE_MOVIE:
+ return {
+ ...state,
+ movies: state.movies.filter((item) => action.payload !== item.id),
+ };
+ case ADD_MOVIE:
+ const newMovie = {
+ ...action.payload,
+ id: Date.now(),
+ };
+ return {
+ ...state,
+ movies: [...state.movies, newMovie],
+ };
+ default:
+ return state;
+ }
+};
-export default reducer;
\ No newline at end of file
+export default reducer;