"use client" import { Search } from "lucide-react" import { useRouter, useSearchParams } from "next/navigation" import { useEffect, useState, useRef } from "react" import { useDebounce } from "@/hooks/use-debounce" import { searchAdts } from "@/app/actions/search" import Link from "next/link" import { AdtWithRelations } from "@/@types/prisma" export function SearchBar() { const router = useRouter() const searchParams = useSearchParams() const [value, setValue] = useState(searchParams.get('q') || '') const [suggestions, setSuggestions] = useState([]) const [isOpen, setIsOpen] = useState(false) const debouncedValue = useDebounce(value, 300) const wrapperRef = useRef(null) useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (wrapperRef.current && !wrapperRef.current.contains(event.target as Node)) { setIsOpen(false) } } document.addEventListener('mousedown', handleClickOutside) return () => { document.removeEventListener('mousedown', handleClickOutside) } }, []) useEffect(() => { const getSuggestions = async () => { if (debouncedValue.length < 1) { setSuggestions([]) return } const results = await searchAdts(debouncedValue) setSuggestions(results) setIsOpen(true) } getSuggestions() }, [debouncedValue]) const handleSubmit = (e: React.FormEvent) => { e.preventDefault() if (value.trim()) { router.push(`/search?q=${encodeURIComponent(value.trim())}`) setIsOpen(false) } } const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === 'Escape') { setIsOpen(false) } } return (
setValue(e.target.value)} onKeyDown={handleKeyDown} onFocus={() => value.length >= 1 && setIsOpen(true)} placeholder="Поиск объявлений..." className="w-full pl-10 pr-4 py-2 rounded-lg border border-gray-200 focus:border-indigo-500 focus:ring-1 focus:ring-indigo-500" />
{/* Выпадающий список с предложениями */} {isOpen && (
{suggestions.length > 0 ? ( suggestions.map((adt) => ( { setIsOpen(false) setValue('') }} className="block px-4 py-2 hover:bg-gray-100 cursor-pointer" >
{adt.image && ( {adt.title} )}
{adt.title}
{adt.price ? `${adt.price} ₽` : 'Цена не указана'}
)) ) : (
Ничего не найдено
)}
)}
) }