"use client"; import { useEffect, useRef, useState } from "react"; import Link from "next/link"; 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 }: { compact?: boolean }) { 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]); return (
setQuery(event.target.value)} onFocus={() => { if (query.trim().length > 2) setOpen(true); }} placeholder={compact ? "جستجو..." : "جستجوی دارو، مکمل و محصولات بهداشتی..."} className="h-11 w-full rounded-xl border border-line bg-mist pr-4 pl-11 text-[13px] outline-none transition focus:border-primary focus:bg-white" /> {open ? (
{loading ? (

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

) : items.length === 0 ? (

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

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