From aead4762981b91f6b537044f79b7831f4a94fe9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Victor=20Ipiraj=C3=A1=20de=20Alencar?= Date: Fri, 26 Mar 2021 11:57:16 -0300 Subject: [PATCH] Solve challenge --- src/App.tsx | 93 ++++-------------------------------- src/components/Content.tsx | 22 ++++++++- src/components/MovieCard.tsx | 1 - src/components/SideBar.tsx | 27 ++++++++++- src/hooks/useMovies.tsx | 75 +++++++++++++++++++++++++++++ 5 files changed, 131 insertions(+), 87 deletions(-) create mode 100644 src/hooks/useMovies.tsx diff --git a/src/App.tsx b/src/App.tsx index ecc92da..be6c95b 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,95 +1,20 @@ -import { useEffect, useState } from 'react'; -import { Button } from './components/Button'; -import { MovieCard } from './components/MovieCard'; -// import { SideBar } from './components/SideBar'; -// import { Content } from './components/Content'; - -import { api } from './services/api'; +import { MoviesProvider } from './hooks/useMovies' +import { SideBar } from './components/SideBar'; +import { Content } from './components/Content'; import './styles/global.scss'; -import './styles/sidebar.scss'; -import './styles/content.scss'; - -interface GenreResponseProps { - id: number; - name: 'action' | 'comedy' | 'documentary' | 'drama' | 'horror' | 'family'; - title: string; -} - -interface MovieProps { - imdbID: string; - Title: string; - Poster: string; - Ratings: Array<{ - Source: string; - Value: string; - }>; - Runtime: string; -} - export function App() { - const [selectedGenreId, setSelectedGenreId] = useState(1); - - const [genres, setGenres] = useState([]); - - const [movies, setMovies] = useState([]); - const [selectedGenre, setSelectedGenre] = useState({} as GenreResponseProps); - - useEffect(() => { - api.get('genres').then(response => { - setGenres(response.data); - }); - }, []); - - useEffect(() => { - api.get(`movies/?Genre_id=${selectedGenreId}`).then(response => { - setMovies(response.data); - }); - - api.get(`genres/${selectedGenreId}`).then(response => { - setSelectedGenre(response.data); - }) - }, [selectedGenreId]); - - function handleClickButton(id: number) { - setSelectedGenreId(id); - } return ( -
- - -
-
- Categoria: {selectedGenre.title} -
- -
-
- {movies.map(movie => ( - - ))} -
-
+ +
+ +
-
+ + ) } \ No newline at end of file diff --git a/src/components/Content.tsx b/src/components/Content.tsx index 8dd7475..3976709 100644 --- a/src/components/Content.tsx +++ b/src/components/Content.tsx @@ -1,3 +1,23 @@ +import { useMovies } from '../hooks/useMovies'; +import { MovieCard } from './MovieCard'; + export function Content() { - // Complete aqui + + const { selectedGenre, movies } = useMovies(); + + return ( +
+
+ Categoria: {selectedGenre.title} +
+ +
+
+ {movies.map(movie => ( + + ))} +
+
+
+ ); } \ No newline at end of file diff --git a/src/components/MovieCard.tsx b/src/components/MovieCard.tsx index 51d7f37..ce21b37 100644 --- a/src/components/MovieCard.tsx +++ b/src/components/MovieCard.tsx @@ -1,5 +1,4 @@ import { Star, Clock } from 'react-feather'; - import '../styles/movie-card.scss'; interface MovieCardProps { diff --git a/src/components/SideBar.tsx b/src/components/SideBar.tsx index 54ee967..cc223a8 100644 --- a/src/components/SideBar.tsx +++ b/src/components/SideBar.tsx @@ -1,3 +1,28 @@ +import { useMovies } from "../hooks/useMovies"; +import '../styles/sidebar.scss'; +import '../styles/content.scss'; +import { Button } from './Button'; + export function SideBar() { - // Complete aqui + + const { genres, selectedGenreId, handleClickButton } = useMovies(); + + return ( + + ); } \ No newline at end of file diff --git a/src/hooks/useMovies.tsx b/src/hooks/useMovies.tsx new file mode 100644 index 0000000..fbd3598 --- /dev/null +++ b/src/hooks/useMovies.tsx @@ -0,0 +1,75 @@ +import { createContext, useEffect, useState, ReactNode, useContext } from 'react'; +import { api } from '../services/api'; + +interface GenreResponseProps { + id: number; + name: 'action' | 'comedy' | 'documentary' | 'drama' | 'horror' | 'family'; + title: string; +} + +interface MovieProps { + imdbID: string; + Title: string; + Poster: string; + Ratings: Array<{ + Source: string; + Value: string; + }>; + Runtime: string; +} + +interface MoviesProviderProps { + children: ReactNode; +} + +interface MoviesContextData { + movies: MovieProps[]; + genres: GenreResponseProps[]; + selectedGenreId: number; + selectedGenre: GenreResponseProps; + handleClickButton: (id: number) => void; +} + + +const MoviesContext = createContext( + {} as MoviesContextData +); + +export function MoviesProvider({ children }: MoviesProviderProps) { + const [selectedGenreId, setSelectedGenreId] = useState(1); + const [genres, setGenres] = useState([]); + const [movies, setMovies] = useState([]); + const [selectedGenre, setSelectedGenre] = useState({} as GenreResponseProps); + + useEffect(() => { + api.get('genres').then(response => { + setGenres(response.data); + }); + }, []); + + useEffect(() => { + api.get(`movies/?Genre_id=${selectedGenreId}`).then(response => { + setMovies(response.data); + }); + + api.get(`genres/${selectedGenreId}`).then(response => { + setSelectedGenre(response.data); + }) + }, [selectedGenreId]); + + function handleClickButton(id: number) { + setSelectedGenreId(id); + } + + return ( + + {children} + + ) + +} + +export function useMovies() { + const context = useContext(MoviesContext); + return context; +} \ No newline at end of file