diff --git a/src/components/layouts/MainLayout.tsx b/src/components/layouts/MainLayout.tsx index 40db3c2..2d9d50a 100644 --- a/src/components/layouts/MainLayout.tsx +++ b/src/components/layouts/MainLayout.tsx @@ -1,4 +1,4 @@ -import React, { useState, Fragment, useEffect } from "react"; +import React, { useState, Fragment, useEffect, useRef } from "react"; import { Outlet, Link, useLocation } from "react-router-dom"; import { useAuth } from "../../contexts/AuthContext"; import { @@ -34,6 +34,8 @@ export const MainLayout: React.FC = () => { 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(() => { @@ -114,6 +116,46 @@ export const MainLayout: React.FC = () => { 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 */} @@ -127,7 +169,10 @@ export const MainLayout: React.FC = () => { + + {/* 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 */}