'use client'; import { Fragment, useState, useEffect, useRef } from 'react'; import { Combobox, Dialog, Transition } from '@headlessui/react'; import { MagnifyingGlassIcon } from '@heroicons/react/24/outline'; import { useRouter } from 'next/navigation'; import { HomeIcon, BuildingOfficeIcon, LinkIcon, Cog6ToothIcon, PlusIcon, DocumentTextIcon, 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: 'Dashboard', href: '/superadmin', icon: HomeIcon, category: 'Navegação' }, { name: 'Agências', href: '/superadmin/agencies', icon: BuildingOfficeIcon, category: 'Navegação' }, { name: 'Templates', href: '/superadmin/signup-templates', icon: LinkIcon, category: 'Navegação' }, { name: 'Templates de Agência', href: '/superadmin/agency-templates', icon: DocumentTextIcon, category: 'Navegação' }, { name: 'Configurações', href: '/superadmin/settings', icon: Cog6ToothIcon, category: 'Navegação' }, { name: 'Nova Agência', href: '/superadmin/agencies/new', icon: PlusIcon, category: 'Ações' }, { name: 'Novo Template', href: '/superadmin/signup-templates/new', 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 ( setQuery('')}>
{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
); }