diff --git a/src/App.js b/src/App.js
index cb66bfe6..901c3f9d 100644
--- a/src/App.js
+++ b/src/App.js
@@ -1,7 +1,7 @@
import React from "react";
import { Route, Switch, Redirect } from "react-router-dom";
-import { connect } from 'react-redux';
+// import { connect } from 'react-redux';
import MovieList from './components/MovieList';
import Movie from './components/Movie';
diff --git a/src/actions/favoriteActions.js b/src/actions/favoriteActions.js
new file mode 100644
index 00000000..08fed340
--- /dev/null
+++ b/src/actions/favoriteActions.js
@@ -0,0 +1,15 @@
+export const ADD_FAVORITE = "ADD_FAVORITE";
+export const DELETE_FAVORITE = "DELETE_FAVORITE";
+export const TOGGLE_FAVORITE = "TOGGLE_FAVORITE";
+
+export const addFavorite = (movie) => {
+ return {type: ADD_FAVORITE, payload: movie}
+}
+
+export const deleteFavorite = (id) => {
+ return {type: DELETE_FAVORITE, payload: id}
+}
+
+export const toggleFavorites = (movie) => {
+ return {type: TOGGLE_FAVORITE}
+}
\ No newline at end of file
diff --git a/src/actions/movieActions.js b/src/actions/movieActions.js
index 3fb8c9dd..54f41fef 100644
--- a/src/actions/movieActions.js
+++ b/src/actions/movieActions.js
@@ -1,5 +1,9 @@
export const DELETE_MOVIE = "DELETE_MOVIE";
+export const ADD_MOVIE = "ADD_MOVIE";
export const deleteMovie = (id)=>{
return({type: DELETE_MOVIE, payload:id});
-}
\ No newline at end of file
+}
+
+export const addMovie = ({id, title, director, genre, metascore, description})=> {
+ return({type:ADD_MOVIE, payload:{id, title, director, genre, metascore, description}})}
\ No newline at end of file
diff --git a/src/components/AddMovieForm.js b/src/components/AddMovieForm.js
index d8a4d768..91906956 100644
--- a/src/components/AddMovieForm.js
+++ b/src/components/AddMovieForm.js
@@ -8,6 +8,7 @@ const AddMovieForm = (props) => {
const { push } = useHistory();
const [movie, setMovie] = useState({
+ id: "",
title: "",
director: "",
genre: "",
@@ -23,6 +24,9 @@ const AddMovieForm = (props) => {
}
const handleSubmit = (e) => {
+ e.preventDefault();
+ props.addMovie({...movie, id:Date.now()});
+ push("/movies");
}
const { title, director, genre, metascore, description } = movie;
@@ -67,4 +71,4 @@ const AddMovieForm = (props) => {
);
}
-export default AddMovieForm;
\ No newline at end of file
+export default connect(null, {addMovie})(AddMovieForm);
\ No newline at end of file
diff --git a/src/components/FavoriteMovieList.js b/src/components/FavoriteMovieList.js
index 54f4383f..7c1079d9 100644
--- a/src/components/FavoriteMovieList.js
+++ b/src/components/FavoriteMovieList.js
@@ -1,19 +1,21 @@
import React from 'react';
-
import { Link } from 'react-router-dom';
+import { connect } from 'react-redux';
+import { deleteFavorite } from '../actions/favoriteActions';
const FavoriteMovieList = (props) => {
- const favorites = [];
+ const handleRemove = (id) => {
+ props.deleteFavorite(id);
+ }
return (
Favorite Movies
- {
- favorites.map(movie=>{
+ {props.favorites.map(movie=>{
return
{movie.title}
- remove_circle
+ {handleRemove(movie.id)}}>remove_circle
})
@@ -22,4 +24,10 @@ const FavoriteMovieList = (props) => {
}
-export default FavoriteMovieList;
\ No newline at end of file
+const mapStateToProps = (state)=> {
+ return {
+ favorites: state.favoritesState.favorites,
+ }
+}
+
+export default connect(mapStateToProps, {deleteFavorite})(FavoriteMovieList);
\ No newline at end of file
diff --git a/src/components/Movie.js b/src/components/Movie.js
index 373201e5..d2405c5c 100644
--- a/src/components/Movie.js
+++ b/src/components/Movie.js
@@ -1,12 +1,24 @@
import React from 'react';
import { useParams, useHistory } from 'react-router-dom';
+import { connect } from 'react-redux';
+
+import { deleteMovie } from '../actions/movieActions';
+import { addFavorite } from '../actions/favoriteActions';
const Movie = (props) => {
const { id } = useParams();
const { push } = useHistory();
-
- const movies = [];
+ const movies = props.movies;
const movie = movies.find(movie=>movie.id===Number(id));
+
+ const handleDelete = (e) => {
+ props.deleteMovie(movie.id);
+ push("/movies");
+ }
+
+ const handleFavorite = (e) => {
+ props.addFavorite(movie)
+ }
return(
@@ -37,8 +49,8 @@ const Movie = (props) => {
@@ -47,4 +59,16 @@ const Movie = (props) => {
);
}
-export default Movie;
\ No newline at end of file
+const mapStateToProps = (state) => {
+ return ({
+ movies: state.moviesState.movies,
+ displayFavorites: state.favoritesState.displayFavorites
+ })
+}
+
+const mapActionToProps = {
+ deleteMovie: deleteMovie,
+ addFavorite: addFavorite
+}
+
+export default connect(mapStateToProps, mapActionToProps)(Movie);
\ No newline at end of file
diff --git a/src/components/MovieHeader.js b/src/components/MovieHeader.js
index e3443e5f..1a647c45 100644
--- a/src/components/MovieHeader.js
+++ b/src/components/MovieHeader.js
@@ -1,9 +1,15 @@
import React from 'react';
import { Link } from 'react-router-dom';
+import {connect} from 'react-redux';
+import { toggleFavorites } from '../actions/favoriteActions';
const MovieHeader = (props) => {
- const appTitle = "";
- const displayFavorites = true;
+ const appTitle = props.header;
+ const displayFavorites = props.displayFavorites;
+
+ const handleClick = () => {
+ props.toggleFavorites()
+ }
return(
@@ -11,7 +17,7 @@ const MovieHeader = (props) => {
{appTitle}
-
{ displayFavorites ? "Hide" : "Show"} Favorites
+
{ displayFavorites ? "Hide" : "Show"} Favorites
View All Movies
Add New Movie
@@ -19,4 +25,11 @@ const MovieHeader = (props) => {
);
}
-export default MovieHeader;
\ No newline at end of file
+const mapStateToProps = (state) => {
+ return {
+ header: state.moviesState.appTitle,
+ displayFavorites: state.favoritesState.displayFavorites
+ }
+}
+
+export default connect(mapStateToProps, {toggleFavorites})(MovieHeader);
\ No newline at end of file
diff --git a/src/components/MovieList.js b/src/components/MovieList.js
index 268c7809..01f2587e 100644
--- a/src/components/MovieList.js
+++ b/src/components/MovieList.js
@@ -1,11 +1,9 @@
import React from 'react';
-
+import { connect } from 'react-redux';
import MovieListItem from './MovieListItem';
import MovieFooter from './MovieFooter';
const MovieList = (props)=> {
- const movies = [];
-
return (
@@ -19,16 +17,19 @@ const MovieList = (props)=> {
-
- {
- movies.map(movie=>)
- }
+
+ {props.movies.map(movie=>)}
-
-
+
);
}
-export default MovieList;
\ No newline at end of file
+const mapStateToProps = (state) => {
+ return {
+ movies: state.moviesState.movies,
+ }
+}
+
+export default connect(mapStateToProps,{})(MovieList);
\ No newline at end of file
diff --git a/src/index.js b/src/index.js
index dfc70e99..877c58eb 100644
--- a/src/index.js
+++ b/src/index.js
@@ -3,15 +3,18 @@ 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 './App'
import { BrowserRouter as Router } from 'react-router-dom';
import './index.css';
+import combineReducer from './reducers/index';
ReactDOM.render(
-
-
- ,
+
+
+
+
+ ,
document.getElementById('root')
);
diff --git a/src/reducers/favoritesReducer.js b/src/reducers/favoritesReducer.js
new file mode 100644
index 00000000..67f4431b
--- /dev/null
+++ b/src/reducers/favoritesReducer.js
@@ -0,0 +1,32 @@
+import { ADD_FAVORITE } from "../actions/favoriteActions";
+import { DELETE_FAVORITE } from "../actions/favoriteActions";
+import { TOGGLE_FAVORITE } from "../actions/favoriteActions";
+
+const initialState = {
+ favorites : [],
+ displayFavorites : true
+}
+
+const favoriteReducer = (state = initialState, action) => {
+ switch(action.type) {
+ case ADD_FAVORITE:
+ return {
+ ...state,
+ favorites: [...state.favorites, action.payload]
+ }
+ case DELETE_FAVORITE:
+ return {
+ ...state,
+ favorites: state.favorites.filter(favorite => action.payload !== favorite.id)
+ }
+ case TOGGLE_FAVORITE:
+ return {
+ ...state,
+ displayFavorites: !state.displayFavorites
+ }
+ default:
+ return state;
+ }
+};
+
+export default favoriteReducer;
\ No newline at end of file
diff --git a/src/reducers/index.js b/src/reducers/index.js
index 6629609c..12d6f3c1 100644
--- a/src/reducers/index.js
+++ b/src/reducers/index.js
@@ -1,5 +1,11 @@
import { combineReducers } from 'redux';
import movieReducer from './movieReducer';
+import favoriteReducer from './favoritesReducer';
-export default movieReducer;
\ No newline at end of file
+const combineReducer = combineReducers({
+ favoritesState: favoriteReducer,
+ moviesState: movieReducer
+})
+
+export default combineReducer;
\ No newline at end of file
diff --git a/src/reducers/movieReducer.js b/src/reducers/movieReducer.js
index 16f33bcd..5f2793ec 100644
--- a/src/reducers/movieReducer.js
+++ b/src/reducers/movieReducer.js
@@ -6,12 +6,17 @@ const initialState = {
appTitle: "IMDB Movie Database"
}
-const reducer = (state, action) => {
+const reducer = (state = initialState, action) => {
switch(action.type) {
case DELETE_MOVIE:
return {
movies: state.movies.filter(item=>(action.payload !== item.id))
}
+ case ADD_MOVIE:
+ return {
+ ...state,
+ movies: [...state.movies, action.payload]
+ }
default:
return state;
}