import { useServerSearch } from "@/apis/hooks"; import { uniqueId } from "lodash"; import { FunctionComponent, useCallback, useEffect, useMemo, useState, } from "react"; import { Dropdown, Form } from "react-bootstrap"; import { useNavigate } from "react-router-dom"; import { useThrottle } from "rooks"; function useSearch(query: string) { const { data } = useServerSearch(query, query.length > 0); return useMemo( () => data?.map((v) => { let link: string; let id: string; if (v.sonarrSeriesId) { link = `/series/${v.sonarrSeriesId}`; id = `series-${v.sonarrSeriesId}`; } else if (v.radarrId) { link = `/movies/${v.radarrId}`; id = `movie-${v.radarrId}`; } else { link = ""; id = uniqueId("unknown"); } return { name: `${v.title} (${v.year})`, link, id, }; }) ?? [], [data] ); } export interface SearchResult { id: string; name: string; link?: string; } interface Props { className?: string; onFocus?: () => void; onBlur?: () => void; } export const SearchBar: FunctionComponent = ({ onFocus, onBlur, className, }) => { const [display, setDisplay] = useState(""); const [query, setQuery] = useState(""); const [debounce] = useThrottle(setQuery, 500); useEffect(() => { debounce(display); }, [debounce, display]); const results = useSearch(query); const navigate = useNavigate(); const clear = useCallback(() => { setDisplay(""); setQuery(""); }, []); const items = useMemo(() => { const its = results.map((v) => ( {v.name} )); if (its.length === 0) { its.push(No Found); } return its; }, [results]); return ( { if (link) { clear(); navigate(link); } }} > setDisplay(e.currentTarget.value)} > {items} ); };