diff --git a/package.json b/package.json index 082f1e6..c16a967 100644 --- a/package.json +++ b/package.json @@ -14,15 +14,15 @@ "author": "Olesia Serban", "license": "ISC", "dependencies": { - "@fortawesome/react-fontawesome": "^0.1.16", "axios": "^0.24.0", "font-awesome": "^4.7.0", + "formik": "^2.2.9", "react": "^17.0.2", "react-dom": "^17.0.2", - "react-hook-form": "^7.21.0", "react-redux": "^7.2.6", "redux": "^4.1.2", - "redux-thunk": "^2.4.1" + "redux-thunk": "^2.4.1", + "yup": "^0.32.11" }, "devDependencies": { "@babel/core": "^7.16.0", diff --git a/src/components/UpsertMovieModal.css b/src/components/UpsertMovieModal.css index 4ae7110..c70882a 100644 --- a/src/components/UpsertMovieModal.css +++ b/src/components/UpsertMovieModal.css @@ -65,6 +65,7 @@ .form-input{ display: flex; flex-direction: column; + color: yellow; } .form-input input, .form-input select, .form-input textarea { diff --git a/src/components/UpsertMovieModal.js b/src/components/UpsertMovieModal.js index 24beb60..478c980 100644 --- a/src/components/UpsertMovieModal.js +++ b/src/components/UpsertMovieModal.js @@ -1,10 +1,29 @@ import "./UpsertMovieModal.css"; import React from "react"; -import { useForm } from "react-hook-form"; import GenresRepo from "../services/GenreRepo"; import { useDispatch } from "react-redux"; import { bindActionCreators } from "redux"; import { actionCreators } from "../store"; +import { useFormik } from "formik"; +import * as Yup from "yup"; + +const MovieSchema = Yup.object().shape({ + title: Yup.string().required(), + url: Yup.string().required(), + releaseDate: Yup.string().required(), + rating: Yup.number() + .required() + .test("is more the 0 less then 10", + "Rating must be from 0 to 10 ", (val)=>{ + return val >= 0 && val <= 10 + }), + runtime: Yup.number() + .required() + .test("more then 0", "runtime should be positive", val=>{ + return val >= 0 + }), + overview: Yup.string().required() +}) export default function UpsertMovieModal({header, movie, handleCloseModal}){ @@ -14,25 +33,37 @@ export default function UpsertMovieModal({header, movie, handleCloseModal}){ const genreRepo = new GenresRepo(); const genres = genreRepo.getAllGenres(); - - const { register, handleSubmit } = useForm(); - const onSubmit = (data, e) => { - if (movie === undefined){ - handleCreate(data); - } else { - handleUpdate(movie, data); - } + const defaultFormData = {} - handleCloseModal(); - }; - const onError = (errors, e) => console.log(errors, e); + if(movie !== undefined) { + defaultFormData.title = movie.title; + defaultFormData.url = movie.poster_path; + defaultFormData.rating = movie.vote_average; + defaultFormData.runtime = movie.runtime; + defaultFormData.overview = movie.overview; + defaultFormData.releaseDate = movie.release_date; + } + + const formik = useFormik({ + initialValues: defaultFormData, + validationSchema: MovieSchema, + onSubmit: values => { + console.log(values) + if (movie === undefined){ + handleCreate(values); + } else { + handleUpdate(movie, values); + } + handleCloseModal(); + } + }) const handleUpdate = (movie, formData)=>{ if(formData.title){ movie.title = formData.title; } if(formData.genre && formData.genre !== "All"){ - movie.genres = [{name: formData.genre}]; + movie.genres = [formData.genre]; } if(formData.url){ @@ -50,6 +81,10 @@ export default function UpsertMovieModal({header, movie, handleCloseModal}){ movie.overview = formData.overview; } + if(formData.releaseDate){ + movie.release_date = formData.releaseDate; + } + updateMovie(movie) }; @@ -62,60 +97,108 @@ export default function UpsertMovieModal({header, movie, handleCloseModal}){ newMovie.vote_average = Number(formData.rating); newMovie.runtime = Number(formData.runtime); newMovie.overview = formData.overview; + newMovie.release_date = formData.releaseDate; createMovie(newMovie) }; - - const defaultFormData = {} - - if(movie !== undefined) { - defaultFormData.title = movie.title; - defaultFormData.url = movie.poster_path; - defaultFormData.rating = movie.vote_average; - defaultFormData.runtime = movie.runtime; - defaultFormData.overview = movie.overview; - } + return ( <>