'use client'; import React, { useState, useEffect, useCallback } from 'react'; import Link from 'next/link'; import { useSearchParams } from 'next/navigation'; import { formatCurrency } from '@/lib/utils'; import { Search, Loader2, FileText, Users, Building2, BookOpen, CreditCard, Landmark, DollarSign, ChevronRight, } from 'lucide-react'; interface SearchResult { id: string; title: string; subtitle: string; category: string; href: string; badge?: string; badgeColor?: string; amount?: number; } const CATEGORY_ICONS: Record = { 'Accounts Payable': , 'Accounts Receivable': , 'Vendors': , 'Customers': , 'Chart of Accounts': , 'Journal Entries': , 'Payments': , 'Bank Accounts': , }; const BADGE_COLORS: Record = { emerald: 'bg-emerald-900/25 text-emerald-700', red: 'bg-red-900/25 text-red-700', blue: 'bg-blue-900/25 text-blue-700', amber: 'bg-amber-900/25 text-amber-700', slate: 'bg-[#1A1A1F] text-[#8B8B9E]', }; export default function SearchPage() { const searchParams = useSearchParams(); const initialQuery = searchParams.get('q') || ''; const [query, setQuery] = useState(initialQuery); const [grouped, setGrouped] = useState>({}); const [totalCount, setTotalCount] = useState(0); const [loading, setLoading] = useState(false); const [searched, setSearched] = useState(false); const doSearch = useCallback(async (q: string) => { if (q.trim().length < 2) { setGrouped({}); setTotalCount(0); return; } setLoading(true); try { const res = await fetch(`/api/search?q=${encodeURIComponent(q)}`); const data = await res.json(); setGrouped(data.grouped || {}); setTotalCount(data.totalCount || 0); setSearched(true); } catch { console.error('Search failed'); } finally { setLoading(false); } }, []); useEffect(() => { if (initialQuery) doSearch(initialQuery); }, [initialQuery, doSearch]); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); doSearch(query); }; const categories = Object.keys(grouped); return (
{/* Search Header */}

Search

Search across all modules — invoices, vendors, customers, accounts, and more

{/* Search Input */}
setQuery(e.target.value)} placeholder="Search invoices, vendors, customers, accounts, payments..." className="flex-1 text-base outline-none text-[#F0F0F3] placeholder-[#5A5A6E]" autoFocus /> {loading && }
{/* Results */} {searched && !loading && totalCount === 0 && (

No results found for "{query}"

Try a different search term

)} {totalCount > 0 && (

{totalCount} result{totalCount !== 1 ? 's' : ''} across {categories.length} categor{categories.length !== 1 ? 'ies' : 'y'}

)} {categories.map((category) => (
{/* Category Header */}
{CATEGORY_ICONS[category] || }

{category}

{grouped[category].length}
{/* Results */}
{grouped[category].map((result) => (

{result.title}

{result.badge && ( {result.badge.replace(/_/g, ' ')} )}

{result.subtitle}

{result.amount !== undefined && (

{formatCurrency(result.amount).replace('$', '')}

)} ))}
))}
); }