"use client"; import { useState, useEffect, useMemo } from "react"; import Link from "next/link"; import { Search } from "lucide-react"; import { useRouter } from "next/navigation"; import { cn } from "@/lib/utils"; type Asset = { id: string; code: string; name: string; category: string; supplier: string; }; export function GlobalSearch({ assets }: { assets: Asset[] }) { const [query, setQuery] = useState(""); const [open, setOpen] = useState(false); const router = useRouter(); const matches = useMemo(() => { const q = query.trim().toLowerCase(); if (q.length < 2) return []; return assets .filter( (a) => a.code.toLowerCase().includes(q) || a.name.toLowerCase().includes(q) || (a.supplier || "").toLowerCase().includes(q) ) .slice(0, 8); }, [query, assets]); return (
{ setQuery(e.target.value); setOpen(true); }} onFocus={() => setOpen(true)} onBlur={() => setTimeout(() => setOpen(false), 150)} onKeyDown={(e) => { if (e.key === "Enter" && matches[0]) { router.push(`/income?asset=${matches[0].id}`); setOpen(false); setQuery(""); } }} aria-label="Search plant, supplier or code" placeholder="Search plant…" className="w-full h-11 pl-9 pr-3 bg-gray-100 dark:bg-white/5 border border-transparent rounded-lg text-sm placeholder:text-gray-400 dark:placeholder:text-gray-500 focus:bg-white dark:focus:bg-white/10 focus:border-[#30638E] focus:outline-none transition" />
{open && matches.length > 0 && (
{matches.map((a) => ( { setOpen(false); setQuery(""); }} className={cn( "flex items-center gap-3 px-4 py-2.5 hover:bg-gray-50 dark:hover:bg-white/5 text-sm border-b border-gray-50 dark:border-border last:border-0" )} > {a.code ? ( {a.code} ) : ( no code )}
{a.name}
{a.supplier && (
{a.supplier}
)}
{a.category && ( {a.category} )} ))}
)}
); }