"use client"; import { useEffect, useState, Fragment } from 'react'; import { useRouter } from 'next/navigation'; import dynamic from 'next/dynamic'; import { Menu, Transition } from '@headlessui/react'; import { Bars3Icon, XMarkIcon, MagnifyingGlassIcon, BellIcon, Cog6ToothIcon, UserCircleIcon, ArrowRightOnRectangleIcon, ChevronDownIcon, ChevronRightIcon, UserGroupIcon, BuildingOfficeIcon, FolderIcon, CreditCardIcon, DocumentTextIcon, LifebuoyIcon, DocumentCheckIcon, UsersIcon, UserPlusIcon, PhoneIcon, FunnelIcon, ChartBarIcon, HomeIcon, CubeIcon, ShoppingCartIcon, BanknotesIcon, DocumentDuplicateIcon, ShareIcon, DocumentMagnifyingGlassIcon, TrashIcon, RectangleStackIcon, CalendarIcon, UserGroupIcon as TeamIcon, ReceiptPercentIcon, CreditCardIcon as PaymentIcon, ChatBubbleLeftRightIcon, BookOpenIcon, ArchiveBoxIcon, PencilSquareIcon, } from '@heroicons/react/24/outline'; const ThemeToggle = dynamic(() => import('@/components/ThemeToggle'), { ssr: false }); const ThemeTester = dynamic(() => import('@/components/ThemeTester'), { ssr: false }); const DEFAULT_GRADIENT = 'linear-gradient(135deg, #ff3a05, #ff0080)'; const setGradientVariables = (gradient: string) => { document.documentElement.style.setProperty('--gradient-primary', gradient); document.documentElement.style.setProperty('--gradient', gradient); document.documentElement.style.setProperty('--gradient-text', gradient.replace('90deg', 'to right')); document.documentElement.style.setProperty('--color-gradient-brand', gradient.replace('90deg', 'to right')); }; export default function AgencyLayout({ children, }: { children: React.ReactNode; }) { const router = useRouter(); const [user, setUser] = useState(null); const [agencyName, setAgencyName] = useState(''); const [sidebarOpen, setSidebarOpen] = useState(true); const [searchOpen, setSearchOpen] = useState(false); const [activeSubmenu, setActiveSubmenu] = useState(null); const [selectedClient, setSelectedClient] = useState(null); // Mock de clientes - no futuro virá da API const clients = [ { id: 1, name: 'Todos os Clientes', avatar: null }, { id: 2, name: 'Empresa ABC Ltda', avatar: 'A' }, { id: 3, name: 'Tech Solutions Inc', avatar: 'T' }, { id: 4, name: 'Marketing Pro', avatar: 'M' }, { id: 5, name: 'Design Studio', avatar: 'D' }, ]; useEffect(() => { const token = localStorage.getItem('token'); const userData = localStorage.getItem('user'); if (!token || !userData) { router.push('/login'); return; } const parsedUser = JSON.parse(userData); setUser(parsedUser); if (parsedUser.role === 'SUPERADMIN') { router.push('/superadmin'); return; } const hostname = window.location.hostname; const hostSubdomain = hostname.split('.')[0] || 'default'; const themeKey = parsedUser?.subdomain || parsedUser?.tenantId || hostSubdomain; setAgencyName(parsedUser?.subdomain || hostSubdomain); const storedGradient = localStorage.getItem(`agency-theme:${themeKey}`); setGradientVariables(storedGradient || DEFAULT_GRADIENT); // Inicializar com "Todos os Clientes" setSelectedClient(clients[0]); // Atalho de teclado para abrir pesquisa (Ctrl/Cmd + K) const handleKeyDown = (e: KeyboardEvent) => { if ((e.ctrlKey || e.metaKey) && e.key === 'k') { e.preventDefault(); setSearchOpen(true); } if (e.key === 'Escape') { setSearchOpen(false); } }; window.addEventListener('keydown', handleKeyDown); return () => { window.removeEventListener('keydown', handleKeyDown); setGradientVariables(DEFAULT_GRADIENT); }; }, [router]); if (!user) { return null; } const menuItems = [ { icon: UserGroupIcon, label: 'CRM', href: '/crm', submenu: [ { icon: UsersIcon, label: 'Clientes', href: '/crm/clientes' }, { icon: UserPlusIcon, label: 'Leads', href: '/crm/leads' }, { icon: PhoneIcon, label: 'Contatos', href: '/crm/contatos' }, { icon: FunnelIcon, label: 'Funil de Vendas', href: '/crm/funil' }, { icon: ChartBarIcon, label: 'Relatórios', href: '/crm/relatorios' }, ] }, { icon: BuildingOfficeIcon, label: 'ERP', href: '/erp', submenu: [ { icon: HomeIcon, label: 'Dashboard', href: '/erp/dashboard' }, { icon: CubeIcon, label: 'Estoque', href: '/erp/estoque' }, { icon: ShoppingCartIcon, label: 'Compras', href: '/erp/compras' }, { icon: BanknotesIcon, label: 'Vendas', href: '/erp/vendas' }, { icon: ChartBarIcon, label: 'Financeiro', href: '/erp/financeiro' }, ] }, { icon: FolderIcon, label: 'Projetos', href: '/projetos', submenu: [ { icon: RectangleStackIcon, label: 'Todos Projetos', href: '/projetos/todos' }, { icon: RectangleStackIcon, label: 'Kanban', href: '/projetos/kanban' }, { icon: CalendarIcon, label: 'Calendário', href: '/projetos/calendario' }, { icon: TeamIcon, label: 'Equipes', href: '/projetos/equipes' }, ] }, { icon: CreditCardIcon, label: 'Pagamentos', href: '/pagamentos', submenu: [ { icon: DocumentTextIcon, label: 'Faturas', href: '/pagamentos/faturas' }, { icon: ReceiptPercentIcon, label: 'Recebimentos', href: '/pagamentos/recebimentos' }, { icon: PaymentIcon, label: 'Assinaturas', href: '/pagamentos/assinaturas' }, { icon: BanknotesIcon, label: 'Gateway', href: '/pagamentos/gateway' }, ] }, { icon: DocumentTextIcon, label: 'Documentos', href: '/documentos', submenu: [ { icon: FolderIcon, label: 'Meus Arquivos', href: '/documentos/arquivos' }, { icon: ShareIcon, label: 'Compartilhados', href: '/documentos/compartilhados' }, { icon: DocumentDuplicateIcon, label: 'Modelos', href: '/documentos/modelos' }, { icon: TrashIcon, label: 'Lixeira', href: '/documentos/lixeira' }, ] }, { icon: LifebuoyIcon, label: 'Suporte', href: '/suporte', submenu: [ { icon: DocumentMagnifyingGlassIcon, label: 'Tickets', href: '/suporte/tickets' }, { icon: BookOpenIcon, label: 'Base de Conhecimento', href: '/suporte/kb' }, { icon: ChatBubbleLeftRightIcon, label: 'Chat', href: '/suporte/chat' }, ] }, { icon: DocumentCheckIcon, label: 'Contratos', href: '/contratos', submenu: [ { icon: DocumentCheckIcon, label: 'Ativos', href: '/contratos/ativos' }, { icon: PencilSquareIcon, label: 'Rascunhos', href: '/contratos/rascunhos' }, { icon: ArchiveBoxIcon, label: 'Arquivados', href: '/contratos/arquivados' }, { icon: DocumentDuplicateIcon, label: 'Modelos', href: '/contratos/modelos' }, ] }, ]; const handleLogout = () => { localStorage.removeItem('token'); localStorage.removeItem('user'); router.push('/login'); }; return (
{/* Sidebar */} {/* Submenu Lateral */} {/* Main Content */}
{/* Header */}

Dashboard

{/* Seletor de Cliente */} {selectedClient?.avatar ? (
{selectedClient.avatar}
) : ( )} {selectedClient?.name || 'Selecionar Cliente'}
{clients.map((client) => ( {({ active }) => ( )} ))}
{/* Pesquisa */} {/* Notificações */}

Notificações

Nenhuma notificação no momento
{/* Configurações */}
{/* Page Content */}
{children}
{/* Modal de Pesquisa */}
setSearchOpen(false)} />

Digite para buscar...

↑↓ navegar selecionar
{/* Theme Tester - Temporário para desenvolvimento */}
); }