@@ -1,6 +1,7 @@
1−import { useCallback, useRef, useState } from "react";
1+import { useCallback, useRef, useState, useEffect } from "react";
2import { glossary } from "../lib/glossary";
2import { glossary } from "../lib/glossary";
3import Link from "next/link";
3import Link from "next/link";
4+import { useRouter } from "next/router";
5const glossarySearch = (query) => {
6const glossarySearch = (query) => {
6 return glossary.filter((entry) => {
7 return glossary.filter((entry) => {
@@ -10,15 +11,31 @@ const glossarySearch = (query) => {
11export default function Search(props) {
12export default function Search(props) {
12 const searchRef = useRef(null);
13 const searchRef = useRef(null);
13− const [query, SetQuery] = useState("");
14+ const [query, setQuery] = useState("");
14 const [active, setActive] = useState(false);
15 const [active, setActive] = useState(false);
15 const [results, setResults] = useState([]);
16 const [results, setResults] = useState([]);
16 const searchEndpoint = (query) => `/api/search?q=${query}`;
17 const searchEndpoint = (query) => `/api/search?q=${query}`;
19+ const router = useRouter();
22+ router.events.on("routeChangeComplete", handleRouteChange);
24+ router.events.off("routeChangeComplete", handleRouteChange);
28+ const handleRouteChange = () => {
18 const onChange = useCallback((event) => {
35 const onChange = useCallback((event) => {
19 const query = event.target.value;
36 const query = event.target.value;
21− SetQuery(query);
38+ setQuery(query);
22 if (query.length) {
39 if (query.length) {
23 fetch(searchEndpoint(query))
40 fetch(searchEndpoint(query))
24 .then((res) => res.json())
41 .then((res) => res.json())
@@ -50,7 +67,7 @@ export default function Search(props) {
51 const clear = useCallback((e) => {
68 const clear = useCallback((e) => {
52 e.stopPropagation();
69 e.stopPropagation();
53− SetQuery("");
70+ setQuery("");
56 // Locks document scrolling when search is open
73 // Locks document scrolling when search is open
@@ -64,9 +81,12 @@ export default function Search(props) {
65 if (props.showSearch) {
82 if (props.showSearch) {
85+ onClick={props.closeSearch}
67− <div className="fixed w-screen h-screen bg-washedWall z-50 flex flex-col items-center">
86+ className="fixed w-screen h-screen bg-washedWall z-50 flex flex-col items-center"
69− className="relative my-32 flex flex-col max-w-screen-lg w-10/12 md:w-10/12 lg:w-8/12 xl:w-6/12 rounded-xl bg-white min-h-0"
89+ className="relative flex flex-col max-w-screen-lg w-12/12 m-4 md:my-32 md:w-10/12 lg:w-8/12 xl:w-6/12 rounded-xl bg-white min-h-0"
70 ref={searchRef}
90 ref={searchRef}
72 <div className="">
92 <div className="">
@@ -77,12 +97,13 @@ export default function Search(props) {
77 placeholder="Search..."
97 placeholder="Search..."
78 type="text"
98 type="text"
79 value={query}
99 value={query}
100+ onClick={(e) => e.stopPropagation()}
80 autoFocus={true}
101 autoFocus={true}
84 onClick={props.toggleSearch}
105 onClick={props.toggleSearch}
85− className="absolute right-2 top-2 cursor-pointer"
106+ className="absolute right-2.5 top-2.5 cursor-pointer"
87 <p className="px-2 h-8 bg-wall flex items-center justify-center text-sm rounded">
108 <p className="px-2 h-8 bg-wall flex items-center justify-center text-sm rounded">
@@ -91,75 +112,75 @@ export default function Search(props) {
95− "overflow-scroll min-h-0 pb-2" +
96− (query.length > 0 ? "" : "hidden")
115+ className={"overflow-y-scroll" + (query.length > 0 ? "" : "hidden")}
99− {active &&
118+ {active &&
100− results.length === 0 &&
119+ results.length === 0 &&
101− glossaryResults.length === 0 &&
120+ glossaryResults.length === 0 &&
102− query !== "" ? (
121+ query !== "" ? (
103− <div className="flex font-semibold text-sm p-3 py-8 w-full">
122+ <div className="flex font-semibold text-sm p-3 py-8 w-full">
104− <p className="mr-2 text-gray">No Results found for</p>
123+ <p className="mr-2 text-gray">No Results found for</p>
105− <p className="font-semibold">"{query}"</p>
124+ <p className="font-semibold">"{query}"</p>
108− {active && glossaryResults.length > 0 ? (
110− <div className="flex font-semibold text-sm p-3 py-1 w-full bg-ultraDeepWall text-white">
111− <p className="font-semibold text-sm">Glossary</p>
127+ {active && glossaryResults.length > 0 ? (
129+ <div className="sticky top-0 flex font-semibold text-sm p-3 py-1 w-full bg-ultraDeepWall text-white">
130+ <p className="font-semibold text-sm">Glossary</p>
114− {glossaryResults.map(({ name, link, desc, symbol }) => {
133+ {glossaryResults.map(({ name, link, desc, symbol }) => {
116− <Link href={link} as={link} key={link}>
117− <div className="cursor-pointer hover:bg-wall">
118− <div className="font-semibold p-3">
119− {symbol.length > 0 && (
120− <code className="mr-1 bg-wall rounded px-1 py-0.5">
125− <p className="font-normal text-base mt-1">{desc}</p>
133− {active && results.length > 0 && (
136− <p className="font-semibold text-sm p-3 py-1 bg-ultraDeepWall text-white">
137− {results.length} results for "{query}"
141− .filter((e) => e.parent !== "Glossary")
142− .map(({ title, slug, content, parent }) => {
144− <li
135+ <Link href={link} as={link} key={link}>
146− className="cursor-pointer hover:bg-wall p-3"
136+ <div className="cursor-pointer hover:bg-wall">
148− <Link href={slug} as={slug}>
150− <p className="font-medium text-base">
137+ <div className="font-semibold p-3">
151− {parent} / {title}
138+ {symbol.length > 0 && (
152− </p>
139+ <code className="mr-1 bg-wall rounded px-1 py-0.5">
153− <p className="text-base font-regular text-small text-gray">
144+ <p className="font-normal text-base mt-1">{desc}</p>
152+ {active && results.length > 0 && (
154+ <div className="sticky top-0 flex font-semibold text-sm p-3 py-1 w-full bg-ultraDeepWall text-white">
155+ <p className="font-semibold text-sm">
156+ {results.length} results for "{query}"
161+ .filter((e) => e.parent !== "Glossary")
162+ .map(({ title, slug, content, parent }) => {
166+ className="cursor-pointer hover:bg-wall p-3"
168+ <Link href={slug} as={slug}>
170+ <p className="font-medium text-base">
173+ <p className="text-base font-regular text-small text-gray">