'use client'; import Link from 'next/link'; import { useRouter, useSearchParams } from 'next/navigation'; import { ReactNode, useEffect, useState } from 'react'; import { MagnifyingGlassIcon } from '@heroicons/react/24/outline'; import { createUrl } from 'lib/utils'; export default function Search() { const router = useRouter(); const searchParams = useSearchParams(); const [searchValue, setSearchValue] = useState(''); const [searchResults, setSearchResults] = useState(null); const [showResults, setShowResults] = useState(false); useEffect(() => { setSearchValue(searchParams?.get('q') || ''); }, [searchParams, setSearchValue]); useEffect(() => { fetch(`/api/search?q=${searchValue}`) .then((res) => res.json()) .then((data) => setSearchResults(data)); }, [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)); } return ( <>
setShowResults(true)} onBlur={() => setShowResults(false)} onChange={(e) => 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" />
); } function SearchWindowContainer({ children }: { children: ReactNode }) { return (
{children}
); } function SearchResults({ searchResults, query, show }) { function breakSentence(sentence: string) { if (sentence.length > 50) { return sentence.slice(0, 50) + '...'; } return sentence; } const shouldShow = show && searchResults?.count; if (!shouldShow) return null; if (searchResults?.count) return ( {searchResults?.count && searchResults.groups.map((group) => (
{' '} {group.values?.[0]}{' '}
{group.result.map(({ document }) => (
{document.title}
{' '} {breakSentence(document.description)}{' '}
))}
))}
); if (!searchResults?.count) { return (
No results found for "{query}"
); } }