From 398290cd9e4aff4f86601ef837874293b6228e24 Mon Sep 17 00:00:00 2001 From: Tyrel Souza Date: Mon, 26 Sep 2022 16:44:24 -0400 Subject: [PATCH] from course, placeholder files --- http-sw/src/App.js | 113 +++++++++++---------- http-sw/src/components/AddMovie.js | 43 ++++++++ http-sw/src/components/AddMovie.module.css | 26 +++++ 3 files changed, 130 insertions(+), 52 deletions(-) create mode 100644 http-sw/src/components/AddMovie.js create mode 100644 http-sw/src/components/AddMovie.module.css diff --git a/http-sw/src/App.js b/http-sw/src/App.js index 966e84e..817b3f6 100644 --- a/http-sw/src/App.js +++ b/http-sw/src/App.js @@ -1,64 +1,73 @@ -import React, { useState } from "react" +import React, { useState, useEffect, useCallback } from 'react'; -import MoviesList from "./components/MoviesList" -import "./App.css" +import MoviesList from './components/MoviesList'; +import AddMovie from './components/AddMovie'; +import './App.css'; function App() { - const [movies, setMovies] = useState([]) - const [isLoading, setIsLoading] = useState(false) - const [error, setError] = useState(null) + const [movies, setMovies] = useState([]); + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); - const fetchMoviesHandler = async () => { - setIsLoading(true) - setError(null) + const fetchMoviesHandler = useCallback(async () => { + setIsLoading(true); + setError(null); + try { + const response = await fetch('https://swapi.dev/api/films/'); + if (!response.ok) { + throw new Error('Something went wrong!'); + } - try { - const response = await fetch("https://swapi.dev/api/films/") - if (!response.ok) { - throw new Error(`something went wrong ${response.status}`) - } - const data = await response.json() + const data = await response.json(); - setIsLoading(false) - - const transformedMovies = data.results.map((movieData) => { - return { - id: movieData.episode_id, - title: movieData.title, - openingText: movieData.opening_crawl, - releaseDate: movieData.release_date, - } - }) - - setMovies(transformedMovies) - } catch (error) { - setError(error.message) - } - setIsLoading(false) + const transformedMovies = data.results.map((movieData) => { + return { + id: movieData.episode_id, + title: movieData.title, + openingText: movieData.opening_crawl, + releaseDate: movieData.release_date, + }; + }); + setMovies(transformedMovies); + } catch (error) { + setError(error.message); } + setIsLoading(false); + }, []); - let content =

Found no movies.

- if (movies.length > 0) { - content = - } - if (error) { - content =

{error}

- } + useEffect(() => { + fetchMoviesHandler(); + }, [fetchMoviesHandler]); - if (isLoading) { - content =

Loading...

- } + function addMovieHandler(movie) { + console.log(movie); + } - return ( - -
- -
-
- {content} -
-
- ) + let content =

Found no movies.

; + + if (movies.length > 0) { + content = ; + } + + if (error) { + content =

{error}

; + } + + if (isLoading) { + content =

Loading...

; + } + + return ( + +
+ +
+
+ +
+
{content}
+
+ ); } -export default App +export default App; diff --git a/http-sw/src/components/AddMovie.js b/http-sw/src/components/AddMovie.js new file mode 100644 index 0000000..7e24574 --- /dev/null +++ b/http-sw/src/components/AddMovie.js @@ -0,0 +1,43 @@ +import React, { useRef } from 'react'; + +import classes from './AddMovie.module.css'; + +function AddMovie(props) { + const titleRef = useRef(''); + const openingTextRef = useRef(''); + const releaseDateRef = useRef(''); + + function submitHandler(event) { + event.preventDefault(); + + // could add validation here... + + const movie = { + title: titleRef.current.value, + openingText: openingTextRef.current.value, + releaseDate: releaseDateRef.current.value, + }; + + props.onAddMovie(movie); + } + + return ( +
+
+ + +
+
+ + +
+
+ + +
+ +
+ ); +} + +export default AddMovie; diff --git a/http-sw/src/components/AddMovie.module.css b/http-sw/src/components/AddMovie.module.css new file mode 100644 index 0000000..9649aa7 --- /dev/null +++ b/http-sw/src/components/AddMovie.module.css @@ -0,0 +1,26 @@ +.control { + margin: 1rem 0; +} + +.control label { + display: block; + font-weight: bold; + margin-bottom: 0.5rem; + text-align: left; +} + +.control input, +.control textarea { + display: block; + width: 100%; + font: inherit; + padding: 0.2rem; + border-radius: 12px; + border: 1px solid #ccc; +} + +.control input:focus, +.control textarea:focus { + outline: none; + border-color: #230052; +} \ No newline at end of file