"use client"; import { FormEvent, useEffect, useRef, useState } from "react"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { Search } from "lucide-react"; import { Placeholder } from "@/components/Placeholder"; import { formatPrice } from "@/lib/format"; import { variantTitle, type StoreVariant } from "@/lib/store"; export function InstantSearch({ compact = false, className = "" }: { compact?: boolean; className?: string }) { const router = useRouter(); const [query, setQuery] = useState(""); const [items, setItems] = useState([]); const [open, setOpen] = useState(false); const [loading, setLoading] = useState(false); const box = useRef(null); useEffect(() => { const onClick = (event: MouseEvent) => { if (!box.current?.contains(event.target as Node)) setOpen(false); }; document.addEventListener("mousedown", onClick); return () => document.removeEventListener("mousedown", onClick); }, []); useEffect(() => { const value = query.trim(); if (value.length <= 2) { setItems([]); setOpen(false); setLoading(false); return; } const timer = setTimeout(async () => { setLoading(true); try { const response = await fetch(`/api/search?q=${encodeURIComponent(value)}`); const data = (await response.json()) as { items?: StoreVariant[] }; setItems(data.items ?? []); setOpen(true); } catch { setItems([]); } finally { setLoading(false); } }, 250); return () => clearTimeout(timer); }, [query]); const goToProducts = (event?: FormEvent) => { event?.preventDefault(); const value = query.trim(); if (value.length <= 2) return; setOpen(false); router.push(`/products?q=${encodeURIComponent(value)}`); }; return (
setQuery(event.target.value)} onFocus={() => { if (query.trim().length > 2) setOpen(true); }} placeholder={compact ? "جستجوی محصول..." : "جستجوی محصول و قطعه..."} className="h-11 w-full rounded-xl bg-paper pe-4 ps-10 text-[13px] outline-none placeholder:text-muted/70 focus:bg-white focus:ring-1 focus:ring-brand" /> {open ? (
{loading ? (

در حال جستجو...

) : items.length === 0 ? (

نتیجه‌ای پیدا نشد.

) : ( <>
    {items.map((item) => { const price = item.discountedPrice ?? item.price; return (
  • setOpen(false)} > {variantTitle(item)} {price != null ? `${formatPrice(price)} تومان` : "تماس بگیرید"}
  • ); })}
)}
) : null}
); }