From c783f0130ba4ea897288c6751bb09c1b62951114 Mon Sep 17 00:00:00 2001 From: Semen Sokolovskyi Date: Tue, 23 Jan 2024 16:14:51 +0200 Subject: [PATCH] add react form --- src/App.tsx | 12 ++- src/components/NewMovie/NewMovie.tsx | 116 ++++++++++++++++++++++++--- 2 files changed, 116 insertions(+), 12 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 34be670b0..9e7a86ddb 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,16 +1,24 @@ import './App.scss'; +import { useState } from 'react'; import { MoviesList } from './components/MoviesList'; import { NewMovie } from './components/NewMovie'; import moviesFromServer from './api/movies.json'; +import { Movie } from './types/Movie'; export const App = () => { + const [movies, setMovies] = useState(moviesFromServer); + + const addMovie = (newMovie:Movie) => { + setMovies(currentMovies => [...currentMovies, newMovie]); + }; + return (
- +
- {}} */ /> +
); diff --git a/src/components/NewMovie/NewMovie.tsx b/src/components/NewMovie/NewMovie.tsx index 34f22fb0a..acde51e81 100644 --- a/src/components/NewMovie/NewMovie.tsx +++ b/src/components/NewMovie/NewMovie.tsx @@ -1,45 +1,140 @@ -import { useState } from 'react'; +import React, { useState } from 'react'; import { TextField } from '../TextField'; +import { Movie } from '../../types/Movie'; -export const NewMovie = () => { +type Props = { + onAdd: (movie: Movie) => void; +}; + +export const NewMovie: React.FC = ({ onAdd }) => { // Increase the count after successful form submission // to reset touched status of all the `Field`s - const [count] = useState(0); + + // const [count, setCount] = useState(0); + + // const [title, setTitle] = useState(''); + // const [description, setDescription] = useState(''); + // const [imgUrl, setImgUrl] = useState(''); + // const [imdbUrl, setImdbUrl] = useState(''); + // const [imdbId, setImdbId] = useState(''); + + const [movieData, setMovieData] = useState({ + count: 0, + title: '', + description: '', + imgUrl: '', + imdbUrl: '', + imdbId: '', + }); + + const { + count, + title, + description, + imgUrl, + imdbUrl, + imdbId, + } = movieData; + + const reset = () => { + setMovieData((prevData) => ({ + ...prevData, + count: prevData.count + 1, + title: '', + description: '', + imgUrl: '', + imdbUrl: '', + imdbId: '', + })); + }; + + const handleAdd = (event: React.FormEvent) => { + event.preventDefault(); + onAdd({ + title, + description, + imgUrl, + imdbUrl, + imdbId, + }); + reset(); + }; + + const checkCorrect = !title.trim() + || !imgUrl.trim() + || !imdbUrl.trim() + || !imdbId.trim(); return ( -
+

Add a movie

{}} + value={title} + onChange={(newValue) => setMovieData( + { + ...movieData, + title: newValue, + }, + )} required /> setMovieData( + { + ...movieData, + description: newValue, + }, + )} /> setMovieData( + { + ...movieData, + imgUrl: newValue, + }, + )} + required /> setMovieData( + { + ...movieData, + imdbUrl: newValue, + }, + )} + required /> setMovieData( + { + ...movieData, + imdbId: newValue, + }, + )} + required />
@@ -48,6 +143,7 @@ export const NewMovie = () => { type="submit" data-cy="submit-button" className="button is-link" + disabled={checkCorrect} > Add