diff --git a/src/actions/movieActions.js b/src/actions/movieActions.js index 3fb8c9ddb..73036da00 100644 --- a/src/actions/movieActions.js +++ b/src/actions/movieActions.js @@ -1,5 +1,10 @@ export const DELETE_MOVIE = "DELETE_MOVIE"; +export const ADD_MOVIE = 'ADD_MOVIE'; export const deleteMovie = (id)=>{ return({type: DELETE_MOVIE, payload:id}); +} + +export const addMovie = (movie) => { + return ({type:ADD_MOVIE, payload: movie}) } \ No newline at end of file diff --git a/src/components/AddMovieForm.js b/src/components/AddMovieForm.js index d8a4d768c..1df5f7011 100644 --- a/src/components/AddMovieForm.js +++ b/src/components/AddMovieForm.js @@ -23,6 +23,9 @@ const AddMovieForm = (props) => { } const handleSubmit = (e) => { + e.preventDefault(); + props.addMovie(movie); + push('/movies') } const { title, director, genre, metascore, description } = movie; @@ -67,4 +70,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/App.js b/src/components/App.js index d2d276d38..8a23bccba 100644 --- a/src/components/App.js +++ b/src/components/App.js @@ -12,7 +12,7 @@ import AddMovieForm from './AddMovieForm'; import FavoriteMovieList from './FavoriteMovieList'; const App = props => { - const displayFavorites = true; + const {displayFavorites} = props; return (
@@ -48,4 +48,10 @@ const App = props => { ); }; -export default App; \ No newline at end of file +const mapStateToProps = (state) => { + return { + displayFavorites : state.favoritesReducer.displayFavorites + } +} + +export default connect(mapStateToProps)(App); \ No newline at end of file diff --git a/src/components/FavoriteMovieList.js b/src/components/FavoriteMovieList.js index 54f4383fa..288203119 100644 --- a/src/components/FavoriteMovieList.js +++ b/src/components/FavoriteMovieList.js @@ -1,11 +1,15 @@ import React from 'react'; - +import {connect} from 'react-redux' import { Link } from 'react-router-dom'; - +import { removeFavorite } from '../actions/favoritesActions'; const FavoriteMovieList = (props) => { - const favorites = []; + const {favorites, removeFavorite} = props; + const handleClick = (id) => { + removeFavorite(id); + } + return (
Favorite Movies
{ @@ -13,7 +17,7 @@ const FavoriteMovieList = (props) => { return
{movie.title} - remove_circle + (handleClick(movie.id))}>remove_circle
}) @@ -21,5 +25,10 @@ const FavoriteMovieList = (props) => {
); } +const mapStateToProps = (state) => { + return { + favorites: state.favoritesReducer.favorites + } +} -export default FavoriteMovieList; \ No newline at end of file +export default connect(mapStateToProps, {removeFavorite})(FavoriteMovieList); \ No newline at end of file diff --git a/src/components/Movie.js b/src/components/Movie.js index 373201e56..e928c30da 100644 --- a/src/components/Movie.js +++ b/src/components/Movie.js @@ -1,13 +1,23 @@ import React from 'react'; +import {connect} from 'react-redux' import { useParams, useHistory } from 'react-router-dom'; +import { deleteMovie } from '../actions/movieActions'; +import { addFavorite } from '../actions/favoritesActions'; const Movie = (props) => { const { id } = useParams(); const { push } = useHistory(); - const movies = []; + const {movies, displayFavorites,deleteMovie, addFavorite} = props; const movie = movies.find(movie=>movie.id===Number(id)); + const handleDeleteClick = () => { + deleteMovie(movie.id); + push('/movies') + } + const handleFavoriteClick = () => { + addFavorite(movie); + } return(
@@ -37,8 +47,8 @@ const Movie = (props) => {
- Favorite - + {displayFavorites && Favorite} +
@@ -46,5 +56,11 @@ const Movie = (props) => {
); } +const mapStateToProps = (state) => { + return ({ + displayFavorites: state.favoritesReducer.displayFavorites, + movies: state.movieReducer.movies + }); +} -export default Movie; \ No newline at end of file +export default connect(mapStateToProps, {deleteMovie, addFavorite})(Movie); \ No newline at end of file diff --git a/src/components/MovieHeader.js b/src/components/MovieHeader.js index e3443e5fb..50f9508bf 100644 --- a/src/components/MovieHeader.js +++ b/src/components/MovieHeader.js @@ -1,9 +1,14 @@ import React from 'react'; +import {connect} from 'react-redux' import { Link } from 'react-router-dom'; +import { toggleFavorites } from './../actions/favoritesActions'; const MovieHeader = (props) => { - const appTitle = ""; - const displayFavorites = true; + const { appTitle, displayFavorites, toggleFavorites } = props; + + const handleClick = () => { + toggleFavorites(); + } return(
@@ -11,7 +16,7 @@ const MovieHeader = (props) => {

{appTitle}

-
{ displayFavorites ? "Hide" : "Show"} Favorites
+
{ displayFavorites ? "Hide" : "Show"} Favorites
View All Movies Add New Movie
@@ -19,4 +24,11 @@ const MovieHeader = (props) => {
); } -export default MovieHeader; \ No newline at end of file +const mapStateToProps = (state) => { + return ({ + displayFavorites: state.favoritesReducer.displayFavorites, + appTitle: state.movieReducer.appTitle + }) +} + +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 268c78099..b0fd427bc 100644 --- a/src/components/MovieList.js +++ b/src/components/MovieList.js @@ -1,10 +1,11 @@ import React from 'react'; +import {connect} from 'react-redux' import MovieListItem from './MovieListItem'; import MovieFooter from './MovieFooter'; const MovieList = (props)=> { - const movies = []; + const {movies} = props; return (
@@ -31,4 +32,10 @@ const MovieList = (props)=> { ); } -export default MovieList; \ No newline at end of file +const mapStateToProps = (state) => { + return({ + movies: state.movieReducer.movies + }); +} + +export default connect(mapStateToProps)(MovieList); \ No newline at end of file diff --git a/src/index.js b/src/index.js index 227c0531b..bb8262057 100644 --- a/src/index.js +++ b/src/index.js @@ -9,9 +9,13 @@ 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') ); diff --git a/src/reducers/favoritesReducer.js b/src/reducers/favoritesReducer.js new file mode 100644 index 000000000..2c1e967d9 --- /dev/null +++ b/src/reducers/favoritesReducer.js @@ -0,0 +1,33 @@ +import {TOGGLE_FAVORITES, ADD_FAVORITE, REMOVE_FAVORITE} from './../actions/favoritesActions' + +const initialState = { + favorites: [{title: 'movie', id: 1}], + 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(item => (item.id !== action.payload)) + } + } + default: + return(state) + } +} + +export default favoritesReducer \ No newline at end of file diff --git a/src/reducers/index.js b/src/reducers/index.js index 6629609ca..a264ea143 100644 --- a/src/reducers/index.js +++ b/src/reducers/index.js @@ -1,5 +1,10 @@ import { combineReducers } from 'redux'; import movieReducer from './movieReducer'; +import favoritesReducer from './favoritesReducer' -export default movieReducer; \ No newline at end of file +const rootReducer = combineReducers({ + movieReducer, + favoritesReducer +}) +export default rootReducer; \ No newline at end of file diff --git a/src/reducers/movieReducer.js b/src/reducers/movieReducer.js index 16f33bcdd..a7bb10064 100644 --- a/src/reducers/movieReducer.js +++ b/src/reducers/movieReducer.js @@ -3,15 +3,25 @@ import movies from './../data.js'; const initialState = { movies: movies, - appTitle: "IMDB Movie Database" + appTitle: "IMDB Movie" } -const reducer = (state, action) => { +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; }