diff --git a/src/App.tsx b/src/App.tsx index 521593b..580fb31 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,33 +1,48 @@ -import { usePopMovies, useCurMovies } from './hooks/useMovies'; +import { useState } from 'react'; +import { usePopMovies, useCurMovies, useSearchMovies } from './hooks/useMovies'; import { usePopularPeople } from './hooks/usePeople'; import { Sidebar } from './components/sidebar'; import { Section } from './components/Section'; import MovieList from './components/MovieList'; import { PersonList } from './components/PersonList'; import './App.css'; +import { useDebouncedValue } from './hooks/useDebouncedValue'; function App() { + const [query, setQuery] = useState(''); + const popular = usePopMovies() const current = useCurMovies() const people = usePopularPeople() + const debouncedQuery = useDebouncedValue(query, 400); + const search = useSearchMovies(debouncedQuery) + const isSearching = query.trim().length > 0; return (
- +
-
- {popular.data && } -
- -
- {current.data && } -
- -
- {people.data && } -
+ {isSearching ? ( +
+ {search.data && } +
+ ) : ( + <> +
+ {popular.data && } +
+ +
+ {current.data && } +
+ +
+ {people.data && } +
+ + )}
diff --git a/src/api/tmdb.ts b/src/api/tmdb.ts index af9db24..9a2df84 100644 --- a/src/api/tmdb.ts +++ b/src/api/tmdb.ts @@ -33,9 +33,13 @@ export function fetchPopularPeople(): Promise> { return tmdbFetch('/person/popular?language=en-US&page=1', 'Klarte ikke hente skuespillere...'); } +export function fetchSearchMovies(query: string): Promise> { + return tmdbFetch(`/search/movie?query=${encodeURIComponent(query)}&language=en-US&page=1`, 'Søket feilet...'); +} + export function fetchMovieCredits(movieId: number): Promise { return tmdbFetch( `/movie/${movieId}/credits?language=en-US`, 'Klarte ikke hente skuespillere...', ); -} \ No newline at end of file +} diff --git a/src/components/sidebar.tsx b/src/components/sidebar.tsx index b9ba39e..b9e7248 100644 --- a/src/components/sidebar.tsx +++ b/src/components/sidebar.tsx @@ -3,6 +3,7 @@ import './sidebar.css'; type SidebarProps = { onSearch?: (query: string) => void; + searchValue?: string; }; //under kommer seksjonene i midtkolonnen som sidebaren skal kunne hoppe mellom @@ -12,7 +13,7 @@ const sections = [ { id: "skuespillere", label: "Skuespillere"}, ]; -export function Sidebar({onSearch}: SidebarProps) { +export function Sidebar({onSearch, searchValue}: SidebarProps) { return (
@@ -32,9 +34,19 @@ export function Sidebar({onSearch}: SidebarProps) { diff --git a/src/hooks/useDebouncedValue.ts b/src/hooks/useDebouncedValue.ts new file mode 100644 index 0000000..2b002fa --- /dev/null +++ b/src/hooks/useDebouncedValue.ts @@ -0,0 +1,15 @@ +import { useState, useEffect } from 'react'; + +export function useDebouncedValue(value: T, delay: number): T { + const [debouncedValue, setDebouncedValue] = useState(value); + + useEffect(() => { + const timeoutId = setTimeout(() => { + setDebouncedValue(value); + }, delay); + + return () => clearTimeout(timeoutId); + }, [value, delay]); + + return debouncedValue; +} \ No newline at end of file diff --git a/src/hooks/useMovies.ts b/src/hooks/useMovies.ts index 50912a7..6a59a98 100644 --- a/src/hooks/useMovies.ts +++ b/src/hooks/useMovies.ts @@ -1,6 +1,6 @@ // hooks/useMovies.ts import { useQuery } from '@tanstack/react-query' -import { fetchCurrentMovies, fetchPopularMovies } from '../api/tmdb' +import { fetchCurrentMovies, fetchPopularMovies, fetchSearchMovies } from '../api/tmdb' export function usePopMovies() { return useQuery({ @@ -15,4 +15,12 @@ export function useCurMovies() { queryFn: fetchCurrentMovies, }) +} + +export function useSearchMovies(query: string) { + return useQuery({ + queryKey: ['movies', 'search', query], + queryFn: () => fetchSearchMovies(query), + enabled: query.trim().length > 0, + }) } \ No newline at end of file