import React, { useState, Fragment, useEffect, useRef } from "react"; import { Outlet, Link, useLocation } from "react-router-dom"; import { useAuth } from "../../contexts/AuthContext"; import { BellIcon, ChevronDownIcon, MoonIcon, SunIcon, HomeIcon, ScaleIcon, UserGroupIcon, UserIcon, ClipboardDocumentCheckIcon, DocumentTextIcon, DocumentCheckIcon, ArrowUpTrayIcon, ShieldCheckIcon, CurrencyDollarIcon, CalculatorIcon, } from "@heroicons/react/24/outline"; import { Menu, Transition } from "@headlessui/react"; import api from "../../services/api"; import { useTheme } from "../../contexts/ThemeContext"; // Importando o ícone para cálculos judiciais import CalculateIcon from '@mui/icons-material/Calculate'; // Importar ícones específicos para subcategorias de cálculos import MoneyIcon from '@mui/icons-material/Money'; import ChildCareIcon from '@mui/icons-material/ChildCare'; export const MainLayout: React.FC = () => { const [isSidebarOpen, setSidebarOpen] = useState(true); const location = useLocation(); const { user, signOut } = useAuth(); const [userProfile, setUserProfile] = useState(null); const { isDarkMode, toggleDarkMode } = useTheme(); const [activeSubmenu, setActiveSubmenu] = useState(null); const submenuTimeoutRef = useRef(null); // Adicionar efeito para buscar perfil do usuário useEffect(() => { const getUserProfile = async () => { try { const response = await api.get("/auth/me"); // Removido o /api pois já está no baseURL console.log("Response data:", response.data); // Debug log setUserProfile(response.data); } catch (error) { console.error("Erro ao buscar perfil:", error); } }; getUserProfile(); }, []); // Console log para debug useEffect(() => { console.log("Perfil do usuário:", userProfile); }, [userProfile]); const menuItems = [ { path: "/dashboard", label: "Dashboard", icon: HomeIcon }, { path: "/processos", label: "Processos", icon: ScaleIcon }, { path: "/processos-administrativos", label: "Proc.Adm", icon: ScaleIcon }, { path: null, label: "Provas", icon: DocumentCheckIcon, subitems: [ { path: '/provas/upload', label: 'Upload', roles: [], icon: ArrowUpTrayIcon }, { path: '/provas/admin', label: 'Admin', roles: ['ADVOGADO_ADMIN'], icon: ShieldCheckIcon } ] }, { path: "/clientes", label: "Clientes", icon: UserGroupIcon }, { path: "/atendimentos", label: "Atendimentos", icon: UserIcon }, { path: "/tarefas", label: "Tarefas", icon: ClipboardDocumentCheckIcon }, { path: "/documentos", label: "Documentos", icon: DocumentTextIcon }, { path: null, label: "Cálculos", icon: CalculateIcon, roles: ['ADVOGADO_ADMIN', 'ADVOGADO', 'ASSISTENTE'], subitems: [ { path: '/calculos', label: 'Dashboard', roles: ['ADVOGADO_ADMIN', 'ADVOGADO', 'ASSISTENTE'], icon: HomeIcon }, { path: '/calculos/pensao-alimenticia', label: 'Pensão Alimentícia', roles: ['ADVOGADO_ADMIN', 'ADVOGADO', 'ASSISTENTE'], icon: ChildCareIcon }, { path: '/calculos/trabalhistas', label: 'Trabalhistas', roles: ['ADVOGADO_ADMIN', 'ADVOGADO', 'ASSISTENTE'], icon: MoneyIcon } ] } ]; // Função para verificar se o caminho atual corresponde ao item do menu const isCurrentPath = (path: string) => { return location.pathname.startsWith(path); }; // Função para lidar com hover no menu const handleMenuMouseEnter = (menuLabel: string) => { if (submenuTimeoutRef.current) { clearTimeout(submenuTimeoutRef.current); submenuTimeoutRef.current = null; } setActiveSubmenu(menuLabel); // Atualiza a posição vertical do submenu const menuItem = document.querySelector(`[data-menu-label="${menuLabel}"]`); if (menuItem) { const rect = menuItem.getBoundingClientRect(); document.documentElement.style.setProperty('--menu-item-top', `${rect.top}px`); } }; // Função para lidar com mouseleave do menu const handleMenuMouseLeave = () => { submenuTimeoutRef.current = setTimeout(() => { setActiveSubmenu(null); }, 300); // Atraso de 300ms antes de fechar o submenu }; // Função para lidar com mouseenter no submenu const handleSubmenuMouseEnter = () => { if (submenuTimeoutRef.current) { clearTimeout(submenuTimeoutRef.current); submenuTimeoutRef.current = null; } }; // Limpar timeout quando o componente é desmontado useEffect(() => { return () => { if (submenuTimeoutRef.current) { clearTimeout(submenuTimeoutRef.current); } }; }, []); return (
{/* Sidebar com barra de rolagem */}
{/* Logo - fixo no topo */}
A
{/* Menu de navegação vertical com scroll */} {/* Submenus renderizados fora da estrutura do menu principal */} {menuItems .filter(item => item.subitems) .map(item => (
{item.subitems .filter(subitem => !subitem.roles?.length || (userProfile?.perfil && subitem.roles.includes(userProfile.perfil)) ) .map((subitem) => (
{subitem.label}
))}
))}
{/* Main Content */}
{/* Header */}

{menuItems.find((item) => item.path === location.pathname) ?.label || "Dashboard"}

{/* Adicionar botão de toggle do tema antes do menu do usuário */} {/* Notificações */} {/* Menu do usuário */} {user?.nome}
{user?.nome}
{user?.cargo}
{({ active }) => ( Meu Perfil )} {/* Novo item - visível apenas para ADMIN */} {userProfile?.perfil === "ADVOGADO_ADMIN" && ( {({ active }) => ( Gerenciar Usuários )} )} {({ active }) => ( Configurações )} {({ active }) => ( )}
{/* Content */}
); };