'use client'; import { useState, useEffect, useRef } from 'react'; import { Combobox, Dialog, DialogBackdrop, DialogPanel } from '@headlessui/react'; import { MagnifyingGlassIcon } from '@heroicons/react/24/outline'; import { useRouter } from 'next/navigation'; import { HomeIcon, RocketLaunchIcon, ChartBarIcon, BriefcaseIcon, LifebuoyIcon, CreditCardIcon, DocumentTextIcon, FolderIcon, ShareIcon, Cog6ToothIcon, PlusIcon, ArrowRightIcon } from '@heroicons/react/24/outline'; interface CommandPaletteProps { isOpen: boolean; setIsOpen: (isOpen: boolean) => void; } export default function CommandPalette({ isOpen, setIsOpen }: CommandPaletteProps) { const [query, setQuery] = useState(''); const router = useRouter(); const inputRef = useRef(null); // Atalho de teclado (Ctrl+K ou Cmd+K) useEffect(() => { const onKeydown = (event: KeyboardEvent) => { if (event.key === 'k' && (event.metaKey || event.ctrlKey)) { event.preventDefault(); setIsOpen(true); } }; window.addEventListener('keydown', onKeydown); return () => { window.removeEventListener('keydown', onKeydown); }; }, [setIsOpen]); const navigation = [ { name: 'Visão Geral', href: '/dashboard', icon: HomeIcon, category: 'Navegação' }, { name: 'CRM (Mission Control)', href: '/crm', icon: RocketLaunchIcon, category: 'Navegação' }, { name: 'ERP', href: '/erp', icon: ChartBarIcon, category: 'Navegação' }, { name: 'Projetos', href: '/projetos', icon: BriefcaseIcon, category: 'Navegação' }, { name: 'Helpdesk', href: '/helpdesk', icon: LifebuoyIcon, category: 'Navegação' }, { name: 'Pagamentos', href: '/pagamentos', icon: CreditCardIcon, category: 'Navegação' }, { name: 'Contratos', href: '/contratos', icon: DocumentTextIcon, category: 'Navegação' }, { name: 'Documentos', href: '/documentos', icon: FolderIcon, category: 'Navegação' }, { name: 'Redes Sociais', href: '/social', icon: ShareIcon, category: 'Navegação' }, { name: 'Configurações', href: '/configuracoes', icon: Cog6ToothIcon, category: 'Navegação' }, // Ações { name: 'Novo Projeto', href: '/projetos/novo', icon: PlusIcon, category: 'Ações' }, { name: 'Novo Chamado', href: '/helpdesk/novo', icon: PlusIcon, category: 'Ações' }, { name: 'Novo Contrato', href: '/contratos/novo', icon: PlusIcon, category: 'Ações' }, ]; const filteredItems = query === '' ? navigation : navigation.filter((item) => { return item.name.toLowerCase().includes(query.toLowerCase()); }); // Agrupar itens por categoria const groups = filteredItems.reduce((acc, item) => { if (!acc[item.category]) { acc[item.category] = []; } acc[item.category].push(item); return acc; }, {} as Record); const handleSelect = (item: typeof navigation[0] | null) => { if (!item) return; setIsOpen(false); router.push(item.href); setQuery(''); }; return (
{filteredItems.length > 0 && ( {Object.entries(groups).map(([category, items]) => (
{category}
{items.map((item) => ( `cursor-pointer select-none px-4 py-2.5 transition-colors ${active ? '[background:var(--gradient)] text-white' : '' }` } > {({ active }) => (
{item.name} {active && ( )}
)}
))}
))}
)} {query !== '' && filteredItems.length === 0 && (
)}
Selecionar Navegar
Esc Fechar
); }