import { useState, useEffect } from "react"; import { KeyRound, CheckCircle2, XCircle, Menu, Search, Sparkles, X, ArrowRight, Megaphone, Users, Mail, Inbox, ShieldCheck, LayoutDashboard, CreditCard, Settings, Webhook, BarChart2, Building2, Flame } from "lucide-react"; import { useApiKey } from "../context/ApiKeyContext"; import { useTheme } from "../context/ThemeContext"; import { Link, useNavigate } from "react-router-dom"; import { useQuery } from "@tanstack/react-query"; import { apiClient } from "../lib/apiClient"; import { MODULES, ModuleId, moduleHref } from "../modules/registry"; interface SearchItem { title: string; category: string; link: string; icon: any; shortcut?: string; detail?: string; } export default function TopBar({ onMenuClick, module = "e" }: { onMenuClick?: () => void; module?: ModuleId }) { const { apiKeys, activeKeyId, setActiveKeyId, activeKey } = useApiKey(); const moduleDef = MODULES[module]; const base = moduleDef.basePath; const { config } = useTheme(); const [isSearchOpen, setIsSearchOpen] = useState(false); const [searchQuery, setSearchQuery] = useState(""); const navigate = useNavigate(); // Fetch real data for dynamic search const { data: campaigns = [] } = useQuery({ queryKey: ["campaigns"], queryFn: async () => { const res = await apiClient.get("/campaigns"); return res.data || []; }, enabled: isSearchOpen, }); const { data: leads = [] } = useQuery({ queryKey: ["leads-search-topbar"], queryFn: async () => { const res = await apiClient.get("/leads/search"); return res.data || []; }, enabled: isSearchOpen, }); const { data: emailAccounts = [] } = useQuery({ queryKey: ["email-accounts-topbar"], queryFn: async () => { const res = await apiClient.get("/email-accounts"); return res.data || []; }, enabled: isSearchOpen, }); // Keyboard shortcut handlers: Cmd/Ctrl+K, Cmd/Ctrl+Shift+D (Dashboard), Cmd/Ctrl+Shift+I (Inbox), etc. useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { const isCmdOrCtrl = e.metaKey || e.ctrlKey; if (isCmdOrCtrl && e.key.toLowerCase() === "k") { e.preventDefault(); setIsSearchOpen((prev) => !prev); return; } if (e.key === "Escape") { setIsSearchOpen(false); return; } // Quick navigation shortcuts when not typing in an input const targetTag = (e.target as HTMLElement)?.tagName?.toLowerCase(); const isInput = targetTag === "input" || targetTag === "textarea" || targetTag === "select"; if (!isInput) { if (isCmdOrCtrl && e.shiftKey && e.key.toLowerCase() === "d") { e.preventDefault(); navigate(base); } else if (isCmdOrCtrl && e.shiftKey && e.key.toLowerCase() === "i") { e.preventDefault(); navigate(moduleHref(module, "inbox")); } else if (isCmdOrCtrl && e.shiftKey && e.key.toLowerCase() === "l") { e.preventDefault(); navigate(moduleHref(module, "leads")); } else if (isCmdOrCtrl && e.shiftKey && e.key.toLowerCase() === "c") { e.preventDefault(); navigate(moduleHref(module, "campaigns")); } } }; window.addEventListener("keydown", handleKeyDown); return () => window.removeEventListener("keydown", handleKeyDown); }, [navigate, base, module]); // Static navigation routes const navItems: SearchItem[] = [ { title: `${moduleDef.label} Dashboard`, category: "Core Navigation", link: base, icon: LayoutDashboard, shortcut: "⌘⇧D" }, { title: "Unified Inbox", category: "Core Navigation", link: moduleHref(module, "inbox"), icon: Inbox, shortcut: "⌘⇧I" }, { title: "Lead Intelligence", category: "Core Navigation", link: moduleHref(module, "leads"), icon: Users, shortcut: "⌘⇧L" }, { title: "Outbound Campaigns", category: "Core Navigation", link: moduleHref(module, "campaigns"), icon: Megaphone, shortcut: "⌘⇧C" }, { title: "Email Accounts & Domains", category: "Core Navigation", link: moduleHref(module, "email-accounts"), icon: Mail }, { title: "Autonomous Warmup Radar", category: "Core Navigation", link: moduleHref(module, "warmup"), icon: Flame }, { title: "Deliverability Analytics", category: "Core Navigation", link: moduleHref(module, "analytics"), icon: BarChart2 }, { title: "Agency Clients", category: "Core Navigation", link: moduleHref(module, "clients"), icon: Building2 }, { title: "Credits & Billing", category: "Core Navigation", link: moduleHref(module, "pricing"), icon: CreditCard }, { title: "Webhook Dispatcher", category: "Core Navigation", link: moduleHref(module, "webhooks"), icon: Webhook }, { title: "System Settings", category: "Core Navigation", link: moduleHref(module, "settings"), icon: Settings }, ]; // Dynamic items from backend APIs const realCampaignItems: SearchItem[] = (Array.isArray(campaigns) ? campaigns : []).map((c: any) => ({ title: c.name || "Campaign", category: "Campaigns", link: moduleHref(module, `campaigns/${c.id}`), icon: Megaphone, detail: `${c.lead_count || 0} leads • ${c.sent_count || 0} sent` })); const realLeadItems: SearchItem[] = (Array.isArray(leads) ? leads : []).slice(0, 8).map((l: any) => ({ title: `${l.first_name || ""} ${l.last_name || ""}`.trim() || l.email, category: "Leads", link: moduleHref(module, "leads"), icon: Users, detail: `${l.company_name || ""} • ${l.email || ""}` })); const realInboxItems: SearchItem[] = (Array.isArray(emailAccounts) ? emailAccounts : []).map((e: any) => ({ title: e.email || "Email Account", category: "Inboxes", link: moduleHref(module, "email-accounts"), icon: Mail, detail: `Status: ${e.status || "active"}` })); const allSearchItems: SearchItem[] = [ ...navItems, ...realCampaignItems, ...realLeadItems, ...realInboxItems, ]; const filteredItems = searchQuery ? allSearchItems.filter( (item) => item.title.toLowerCase().includes(searchQuery.toLowerCase()) || item.category.toLowerCase().includes(searchQuery.toLowerCase()) || (item.detail && item.detail.toLowerCase().includes(searchQuery.toLowerCase())) ) : allSearchItems; return (
{onMenuClick && ( )}
SYSTEM / {moduleDef.engineLabel}
{/* Global Search Button */} {/* Reputation Shield Indicator */}
Reputation 98.4%
{/* API Status Pill */}
{activeKey ? (
API Connected
) : (
Key Missing
)}
{/* User Profile Avatar */}
JM
{/* Key switcher */}
{/* Global Quick Search Modal */} {isSearchOpen && (
setIsSearchOpen(false)} >
e.stopPropagation()} >
setSearchQuery(e.target.value)} placeholder="Search campaigns, prospects, mailboxes, routes..." className="w-full bg-transparent text-sm text-white placeholder:text-zinc-500 focus:outline-none" /> {searchQuery && ( )} ESC
{filteredItems.length === 0 ? (
No matching telemetry found for "{searchQuery}"
) : ( filteredItems.map((item, idx) => ( )) )}
)}
); }