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) => {
- Favorite - + {props.displayFavorites && Favorite} +
@@ -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; }