"use client"; import { getSearchPath } from "@/lib/common"; import { useRouter } from "next/navigation"; import { type ReactNode, useEffect, useRef, useState, useTransition, } from "react"; import { useDebouncedCallback } from "use-debounce"; import { Icon } from "../general/Icon"; import { PageHeader } from "../general/PageHeader"; import styles from "./searchContainer.module.scss"; export function SearchShell({ initialQuery, children, }: { initialQuery: string; children: ReactNode; }) { const { replace } = useRouter(); const [inputValue, setInputValue] = useState(initialQuery); const [isPending, startTransition] = useTransition(); const lastPushedRef = useRef(initialQuery); const fetching = isPending || inputValue !== lastPushedRef.current; const pushQuery = useDebouncedCallback((next: string) => { lastPushedRef.current = next; startTransition(() => { replace(getSearchPath(next)); }); }, 300); useEffect(() => { if (initialQuery !== lastPushedRef.current) { lastPushedRef.current = initialQuery; setInputValue(initialQuery); } }, [initialQuery]); return (
{ e.preventDefault(); pushQuery.cancel(); lastPushedRef.current = inputValue; startTransition(() => { replace(getSearchPath(inputValue)); }); }} >
{ setInputValue(e.target.value); pushQuery(e.target.value); }} />
{children}
); }