'use client'; import Link from 'next/link'; import { usePathname, useRouter, useSearchParams } from 'next/navigation'; import { useEffect, useRef, useState } from 'react'; import { MagnifyingGlassIcon } from '@heroicons/react/24/outline'; import { Results } from '@orama/orama'; import { orama, trimDescription } from 'lib/orama'; import { createUrl } from 'lib/utils'; import { useOutsideClick } from './useOutsideClick'; export default function Search() { const router = useRouter(); const searchParams = useSearchParams(); const [searchValue, setSearchValue] = useState(''); const [searchResults, setSearchResults] = useState(); const isSearchPage = usePathname() === '/search' useEffect(() => { setSearchValue(searchParams?.get('q') || ''); }, [searchParams, setSearchValue]); useEffect(() => { if (isSearchPage) { router.push(createUrl('/search', new URLSearchParams({ q: searchValue }))) } else { orama.search({ term: searchValue, limit: 5, threshold: 0, boost: { title: 2, } }) .then(setSearchResults) .catch(console.log); } }, [searchValue]); function onSubmit(e: React.FormEvent) { e.preventDefault(); const val = e.target as HTMLFormElement; const search = val.search as HTMLInputElement; const newParams = new URLSearchParams(searchParams.toString()); if (search.value) { newParams.set('q', search.value); } else { newParams.delete('q'); } router.push(createUrl('/search', newParams)); } const searchResultsRef = useRef(null); useOutsideClick(searchResultsRef.current, () => { setSearchValue(''); }); const showSearchResults = searchValue.length > 0 && !!searchResults && !isSearchPage; return (
setSearchValue(e.target.value)} className="w-full rounded-lg border bg-white px-4 py-2 text-sm text-black placeholder:text-neutral-500 dark:border-neutral-800 dark:bg-transparent dark:text-white dark:placeholder:text-neutral-400" />
{ showSearchResults && (
    { searchResults.count ? ( searchResults?.hits?.map((product) => (
  • {product.document.title as string}
    {trimDescription((product.document.description || product.document.title) as string)}
  • )) ) : (
  • No results found for "{searchValue}"
  • ) }
) }
); }