import React, { type ReactNode, useState, useEffect } from 'react'; import { Box, AppBar, Toolbar, Typography, Tabs, Tab, Paper, IconButton, Menu, MenuItem, ListItemIcon, ListItemText, Divider // Nuevas importaciones } from '@mui/material'; import AccountCircle from '@mui/icons-material/AccountCircle'; // Icono de usuario import LockResetIcon from '@mui/icons-material/LockReset'; // Icono para cambiar contraseña import LogoutIcon from '@mui/icons-material/Logout'; // Icono para cerrar sesión import { useAuth } from '../contexts/AuthContext'; import ChangePasswordModal from '../components/Modals/Usuarios/ChangePasswordModal'; import { useNavigate, useLocation } from 'react-router-dom'; interface MainLayoutProps { children: ReactNode; } const modules = [ { label: 'Inicio', path: '/' }, { label: 'Distribución', path: '/distribucion' }, { label: 'Contables', path: '/contables' }, { label: 'Impresión', path: '/impresion' }, { label: 'Reportes', path: '/reportes' }, { label: 'Radios', path: '/radios' }, { label: 'Usuarios', path: '/usuarios' }, ]; const MainLayout: React.FC = ({ children }) => { const { user, logout, isAuthenticated, isPasswordChangeForced, showForcedPasswordChangeModal, setShowForcedPasswordChangeModal, passwordChangeCompleted } = useAuth(); const navigate = useNavigate(); const location = useLocation(); const [selectedTab, setSelectedTab] = useState(false); const [anchorElUserMenu, setAnchorElUserMenu] = useState(null); // Estado para el menú de usuario useEffect(() => { const currentModulePath = modules.findIndex(module => location.pathname === module.path || (module.path !== '/' && location.pathname.startsWith(module.path + '/')) ); if (currentModulePath !== -1) { setSelectedTab(currentModulePath); } else if (location.pathname === '/') { setSelectedTab(0); // Asegurar que la pestaña de Inicio se seleccione para la ruta raíz } else { setSelectedTab(false); // Ninguna pestaña seleccionada si no coincide } }, [location.pathname]); const handleOpenUserMenu = (event: React.MouseEvent) => { setAnchorElUserMenu(event.currentTarget); }; const handleCloseUserMenu = () => { setAnchorElUserMenu(null); }; const handleChangePasswordClick = () => { setShowForcedPasswordChangeModal(true); handleCloseUserMenu(); }; const handleLogoutClick = () => { logout(); handleCloseUserMenu(); // Cierra el menú antes de desloguear completamente }; const handleModalClose = (passwordChangedSuccessfully: boolean) => { if (passwordChangedSuccessfully) { passwordChangeCompleted(); } else { if (isPasswordChangeForced) { logout(); } else { setShowForcedPasswordChangeModal(false); } } }; const handleTabChange = (_event: React.SyntheticEvent, newValue: number) => { setSelectedTab(newValue); navigate(modules[newValue].path); }; // Determinar si el módulo actual es el de Reportes const isReportesModule = location.pathname.startsWith('/reportes'); if (showForcedPasswordChangeModal && isPasswordChangeForced) { return ( ); } return ( navigate('/')}> Sistema de Gestión - El Día {user && ( Hola, {user.nombreCompleto} )} {isAuthenticated && ( <> {user && ( // Mostrar info del usuario en el menú {user.nombreCompleto} {user.username} )} {user && } {!isPasswordChangeForced && ( // No mostrar si ya está forzado a cambiarla Cambiar Contraseña )} Cerrar Sesión )} {modules.map((module) => ( ))} {children} `1px solid ${theme.palette.divider}` }}> {/* Puedes usar caption para un texto más pequeño en el footer */} Usuario: {user?.username} | Acceso: {user?.esSuperAdmin ? 'Super Administrador' : (user?.perfil || `ID ${user?.idPerfil}`)} handleModalClose(false)} // Asumir que si se cierra sin cambiar, no fue exitoso isFirstLogin={false} // Este modal no es para el primer login forzado /> ); }; export default MainLayout;