"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("");
}
}}
placeholder="Search plant, supplier, codeā¦"
className="w-full h-9 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-[#0f1419] 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-white/5 last:border-0"
)}
>
{a.code ? (
{a.code}
) : (
no code
)}
{a.name}
{a.supplier && (
{a.supplier}
)}
{a.category && (
{a.category}
)}
))}
)}
);
}