"use client"; import React, { useState } from "react"; import { Search } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Dialog, DialogContent, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { useRouter, useSearchParams, usePathname } from "next/navigation"; import { SearchIcon } from "@/components/icons"; interface SearchBarProps { isMobile: boolean; searchPlaceholder: string; isOpen?: boolean; onClose?: () => void; className?: string; locale?: string; } export default function SearchBar({ isMobile, searchPlaceholder, isOpen, onClose, className = "", locale = "ru", }: SearchBarProps) { const router = useRouter(); const searchParams = useSearchParams(); const pathname = usePathname(); const [searchValue, setSearchValue] = useState(""); React.useEffect(() => { // Sync URL param to input when URL changes if (pathname?.includes("/search")) { const q = searchParams?.get("q") || ""; if (q !== searchValue.trim()) { setSearchValue(q); } } else { setSearchValue(""); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [searchParams, pathname]); React.useEffect(() => { // Debounce updates to the URL query when typing on search page if (pathname?.includes("/search")) { const delayDebounceFn = setTimeout(() => { const q = searchParams?.get("q") || ""; const curVal = searchValue.trim(); if (curVal !== q && curVal !== "") { router.push(`/${locale}/search?q=${encodeURIComponent(curVal)}`); } else if (curVal === "" && q !== "") { router.push(`/${locale}/search`); } }, 500); return () => clearTimeout(delayDebounceFn); } }, [searchValue, pathname, router, locale, searchParams]); const performSearch = () => { if (searchValue.trim()) { router.push( `/${locale}/search?q=${encodeURIComponent(searchValue.trim())}`, ); if (onClose) onClose(); } }; const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === "Enter") { performSearch(); } }; const handleSearch = (value: string) => { setSearchValue(value); }; if (isMobile) { return ( {searchPlaceholder}
handleSearch(e.target.value)} onKeyDown={handleKeyDown} className="h-12 rounded-lg pl-12 pr-10 border-gray-200 focus:border-gray-900 focus-visible:border-gray-900 focus-visible:ring-0 transition-colors" autoFocus />
); } return (
handleSearch(e.target.value)} onKeyDown={handleKeyDown} className="border w-full rounded-lg h-11 border-gray-900 bg-white pl-12 pr-4 focus-visible:ring-2 focus-visible:ring-gray-300 transition-all" />
); }