import React, { useEffect, useState } from 'react' import { useLocation } from 'react-router-dom' import { useAppSelector, useAppDispatch } from '../store' import ModalMovieDetails from '../components/ModalMovieDetails' import Modal from '../components/Modal' import { useDebounce } from '../hooks/useDebounce' import * as searchSlice from '../store/slices/searchSlice' import * as movieDetailsSlice from '../store/slices/movieDetailsSlice' interface IMovie { id: string media_type?: string backdrop_path?: string } // A custom hook that builds on useLocation to parse // the query string for you. const useQuery = () => { return new URLSearchParams(useLocation().search) } const Search = () => { let query = useQuery() const debouncedSearchTerm = useDebounce(query.get('q'), 500) const [isToggleModal, setIsToggleModal] = useState(false) const { searchResults, isLoading } = useAppSelector( (state) => state.searchMovie ) const { movieDetails } = useAppSelector((state) => state.movieDetails) const dispatch = useAppDispatch() useEffect(() => { if (debouncedSearchTerm) { dispatch(searchSlice.searchItemsAsync(debouncedSearchTerm)) } }, [debouncedSearchTerm]) const onCloseModalHandler = () => { setIsToggleModal(false) } const onSelectMovieHandler = (movie: IMovie) => { dispatch( movieDetailsSlice.getMovieDetailsAsync({ mediaType: movie.media_type, mediaId: movie.id, }) ) setIsToggleModal(true) } const renderSearchResults = () => { return searchResults.length > 0 ? ( <>
Your search for "{debouncedSearchTerm}" did not have any matches.
Suggestions: