import { useCallback, useRef, useState, useEffect } from "react"; import { glossary } from "../lib/glossary"; import Link from "next/link"; import { useRouter } from "next/router"; const glossarySearch = (query) => { return glossary.filter((entry) => { return query.toLowerCase() === entry.name || entry.symbol === query; }); }; export default function Search(props) { const searchRef = useRef(null); const [query, setQuery] = useState(""); const [active, setActive] = useState(false); const [results, setResults] = useState([]); const searchEndpoint = (query) => `/api/search?q=${query}`; const router = useRouter(); useEffect(() => { router.events.on("routeChangeComplete", handleRouteChange); return () => { router.events.off("routeChangeComplete", handleRouteChange); }; }, [router.events]); const handleRouteChange = () => { setQuery(""); setResults([]); setActive(false); props.closeSearch(); }; const onChange = useCallback((event) => { const query = event.target.value; setQuery(query); if (query.length) { fetch(searchEndpoint(query)) .then((res) => res.json()) .then((res) => { setResults(res.results); }); } else { setResults([]); } }, []); const onFocus = useCallback(() => { setActive(true); window.addEventListener("click", onClick); }, []); const onClick = useCallback((event) => { if (searchRef.current && !searchRef.current.contains(event.target)) { setActive(false); window.removeEventListener("click", onClick); props.toggleSearch(); } }, []); let glossaryResults = []; if (query.length) { glossaryResults = glossarySearch(query); } const clear = useCallback((e) => { e.stopPropagation(); setQuery(""); }, []); // Locks document scrolling when search is open if (typeof document !== "undefined") { if (props.showSearch) { document.body.style.overflow = "hidden"; } else { document.body.style.overflow = "visible"; } } if (props.showSearch) { return (
e.stopPropagation()} autoFocus={true} />

ESC

0 ? "" : "hidden")} >
{active && results.length === 0 && glossaryResults.length === 0 && query !== "" ? (

No Results found for

"{query}"

) : null} {active && glossaryResults.length > 0 ? ( <>

Glossary

{glossaryResults.map(({ name, link, desc, symbol }) => { return (
{symbol.length > 0 && ( {symbol} )} {name}

{desc}

); })} ) : null} {active && results.length > 0 && ( <>

{results.length} results for "{query}"

{results .filter((e) => e.parent !== "Glossary") .map(({ title, slug, content, parent }) => { return (

{parent} / {title}

{content}

); })} )}
); } return null; }