Skip to content
12 changes: 12 additions & 0 deletions src/actions/favoriteActions.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
export const TOGGLE_FAVORITES = "TOGGLE_FAVORITES";
export const ADD_FAVORITE = "ADD_FAVORITE";
export const REMOVE_FAVORITE = "REMOVE_FAVORITE";
export const toggleFavorites = () => {
return({type: TOGGLE_FAVORITES});
}
export const addFavorite = (movie) => {
return({type: ADD_FAVORITE, payload:movie});
}
export const removeFavorite = (id) => {
return({type: REMOVE_FAVORITE, payload:id});
}
7 changes: 6 additions & 1 deletion src/actions/movieActions.js
Original file line number Diff line number Diff line change
@@ -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});

}
5 changes: 4 additions & 1 deletion src/components/AddMovieForm.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ const AddMovieForm = (props) => {
}

const handleSubmit = (e) => {
e.preventDefault();
props.addMovie(movie);
push('/movies');
}

const { title, director, genre, metascore, description } = movie;
Expand Down Expand Up @@ -67,4 +70,4 @@ const AddMovieForm = (props) => {
</div>);
}

export default AddMovieForm;
export default connect(null, { addMovie })(AddMovieForm);
10 changes: 7 additions & 3 deletions src/components/App.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import AddMovieForm from './AddMovieForm';
import FavoriteMovieList from './FavoriteMovieList';

const App = props => {
const displayFavorites = true;
const { displayFavorites } = props;

return (
<div>
Expand Down Expand Up @@ -47,5 +47,9 @@ const App = props => {
</div>
);
};

export default App;
const mapStateToProps = (state) => {
return {
displayFavorites: state.favoritesReducer.displayFavorites
}
}
export default connect(mapStateToProps) (App);
19 changes: 13 additions & 6 deletions src/components/FavoriteMovieList.js
Original file line number Diff line number Diff line change
@@ -1,25 +1,32 @@
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 (<div className="col-xs savedContainer">
<h5>Favorite Movies</h5>
{
favorites.map(movie=>{
return <div key={movie.id}>
<Link className="btn btn-light savedButton" to={`/movies/${movie.id}`}>
{movie.title}
<span><span class="material-icons">remove_circle</span></span>
<span onClick={()=>{handleClick(movie.id)}}><span class="material-icons">remove_circle</span></span>
</Link>
</div>
})
}
</div>);
}


export default FavoriteMovieList;
const mapStateToProps = (state) => {
return{
favorites: state.favoritesReducer.favorites
}
}
export default connect(mapStateToProps, { removeFavorite })(FavoriteMovieList);
26 changes: 20 additions & 6 deletions src/components/Movie.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,22 @@
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(<div className="modal-page col">
<div className="modal-dialog">
<div className="modal-content">
Expand Down Expand Up @@ -37,14 +46,19 @@ const Movie = (props) => {
</section>

<section>
<span className="m-2 btn btn-dark">Favorite</span>
<span className="delete"><input type="button" className="m-2 btn btn-danger" value="Delete"/></span>
{displayFavorites && <span onClick={handleFavoriteClick} className="m-2 btn btn-dark">Favorite</span>}
<span className="delete" onClick={handleDeleteClick}><input type="button" className="m-2 btn btn-danger" value="Delete"/></span>
</section>
</div>
</div>
</div>
</div>
</div>);
}

export default Movie;
const mapStateToProps = (state) => {
return({
displayFavorites: state.favoritesReducer.displayFavorites,
movies:state.movieReducer.movies
});
}
export default connect(mapStateToProps, {deleteMovie, addFavorite})(Movie);
19 changes: 14 additions & 5 deletions src/components/MovieHeader.js
Original file line number Diff line number Diff line change
@@ -1,22 +1,31 @@
import React from 'react';
import { connect } from 'react-redux';
import { toggleFavorites } from './../actions/favoritesActions';
import { Link } from 'react-router-dom';

const MovieHeader = (props) => {
const appTitle = "";
const displayFavorites = true;
const { appTitle, displayFavorites, toggleFavorites } = props;
const handleClick = () => {
toggleFavorites();
}

return(<div className="table-title">
<div className="row">
<div className="col-sm-6">
<h2>{appTitle}</h2>
</div>
<div className="col-sm-6 headerBar">
<div className="btn btn-sm btn-primary"><span>{ displayFavorites ? "Hide" : "Show"} Favorites</span></div>
<div onClick={handleClick}className="btn btn-sm btn-primary"><span>{ displayFavorites ? "Hide" : "Show"} Favorites</span></div>
<Link to="/movies" className="btn btn-sm btn-primary">View All Movies</Link>
<Link to="/movies/add" className="btn btn-sm btn-success"><i className="material-icons">&#xE147;</i> <span>Add New Movie</span></Link>
</div>
</div>
</div>);
}

export default MovieHeader;
const mapStateToProps = (state) => {
return({
displayFavorites: state.favoritesReducer.displayFavorites,
appTitle: state.movieReducer.appTitle
});
}
export default connect(mapStateToProps, {toggleFavorites})(MovieHeader);
12 changes: 8 additions & 4 deletions src/components/MovieList.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
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 (
<div className="col">
Expand All @@ -30,5 +30,9 @@ const MovieList = (props)=> {
</div>
);
}

export default MovieList;
const mapStateToProps = (state) => {
return({
movies:state.movieReducer.movies
})
}
export default connect(mapStateToProps)(MovieList);
6 changes: 5 additions & 1 deletion src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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(
<Provider store={store}>
<Router>
<App />
</Router>,
</Router>
</Provider>,
document.getElementById('root')
);
31 changes: 31 additions & 0 deletions src/reducers/favoritesReducer.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { TOGGLE_FAVORITES, ADD_FAVORITE, REMOVE_FAVORITE } 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 {
fravorites: state.favorites.filter(item=>(item.id !== action.payload))
}
}
default:
return(state);
}
}

export default favoritesReducer;
8 changes: 6 additions & 2 deletions src/reducers/index.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
import { combineReducers } from 'redux';

import movieReducer from './movieReducer';

export default movieReducer;
import favoritesReducer from './favoritesReducer';
const rootReducer = combineReducers({
movieReducer,
favoritesReducer
});
export default rootReducer;
12 changes: 11 additions & 1 deletion src/reducers/movieReducer.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,22 @@ const initialState = {
appTitle: "IMDB Movie Database"
}

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,
movie: [...state.movies, newMovie]
}
default:
return state;
}
Expand Down