"use client"; import React, { useState, useEffect, useRef } from "react"; import { Search, X, Loader2 } 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 } from "next/navigation"; import { useSearchProducts } from "@/features/search/hooks/useSearch"; import Image from "next/image"; 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 [searchValue, setSearchValue] = useState(""); const [debouncedSearch, setDebouncedSearch] = useState(""); const [showResults, setShowResults] = useState(false); const searchRef = useRef(null); const { data, isLoading } = useSearchProducts({ q: debouncedSearch }); useEffect(() => { const timer = setTimeout(() => { setDebouncedSearch(searchValue); }, 300); return () => clearTimeout(timer); }, [searchValue]); useEffect(() => { if (debouncedSearch && data?.data && data.data.length > 0) { setShowResults(true); } else { setShowResults(false); } }, [debouncedSearch, data]); useEffect(() => { const handleClickOutside = (e: MouseEvent) => { if (searchRef.current && !searchRef.current.contains(e.target as Node)) { setShowResults(false); } }; document.addEventListener("mousedown", handleClickOutside); return () => document.removeEventListener("mousedown", handleClickOutside); }, []); const handleSearch = (value: string) => { setSearchValue(value); }; const handleProductClick = (productId: number) => { router.push(`/${locale}/product/${productId}`); setSearchValue(""); setShowResults(false); if (onClose) onClose(); }; const handleClearSearch = () => { setSearchValue(""); setShowResults(false); }; const SearchResults = () => { if (!showResults || !data?.data) return null; return (
{data.data.map((product) => ( ))}
); }; if (isMobile) { return ( {searchPlaceholder}
handleSearch(e.target.value)} className="h-10 rounded-xl focus:border-[#005bff] focus-visible:border-[#005bff] focus-visible:ring-0 active:border-[#005bff]" autoFocus /> {isLoading && ( )}
); } return (
handleSearch(e.target.value)} className="border-[#005bff] w-full rounded-xl border-2 focus-visible:ring-0 bg-white px-2" /> {isLoading && ( )}
); }