// src/layouts/AppLayout.jsx import { useState } from 'react'; import { Outlet, NavLink, useNavigate } from 'react-router-dom'; // ============================================================================ // COMPOSANT : MODAL DE CONFIRMATION DE DÉCONNEXION // ============================================================================ const ConfirmLogoutModal = ({ isOpen, onClose, onConfirm }) => { if (!isOpen) return null; return (

DÉCONNEXION DU TERMINAL

Êtes-vous sûr de vouloir fermer la session sécurisée et quitter l'environnement cloud ?

); }; // ============================================================================ // COMPOSANT PRINCIPAL : LAYOUT DU PORTAIL // ============================================================================ export default function AppLayout() { const navigate = useNavigate(); const [showLogoutModal, setShowLogoutModal] = useState(false); // Ouvre simplement le modal const handleLogoutClick = () => { setShowLogoutModal(true); }; // Exécute la vraie déconnexion const confirmLogout = () => { // Ici, tu pourras effacer les tokens (ex: localStorage.removeItem('token')) setShowLogoutModal(false); navigate('/login'); }; // --- DESIGN SYSTEM DU BUNKER --- const sidebarStyle = { width: '260px', backgroundColor: '#121212', // Gris blindage borderRight: '1px solid #222222', height: '100vh', display: 'flex', flexDirection: 'column', position: 'fixed', top: 0, left: 0, fontFamily: 'monospace' }; const mainContentStyle = { marginLeft: '260px', // Laisse la place à la sidebar minHeight: '100vh', backgroundColor: '#050505', // Fond abyssal color: '#E0E0E0', padding: '40px' }; // Fonction pour styliser le lien actif (en Cyan) const getNavLinkStyle = ({ isActive }) => ({ display: 'block', padding: '15px 25px', color: isActive ? '#00E5FF' : '#888', backgroundColor: isActive ? 'rgba(0, 229, 255, 0.05)' : 'transparent', textDecoration: 'none', borderLeft: isActive ? '4px solid #00E5FF' : '4px solid transparent', transition: 'all 0.2s', textTransform: 'uppercase', letterSpacing: '1px', fontSize: '0.9rem' }); return (
{/* ========================================== */} {/* BARRE LATÉRALE (SIDEBAR) */} {/* ========================================== */} {/* ========================================== */} {/* ZONE DE CONTENU DYNAMIQUE */} {/* ========================================== */}
{/* Le composant injecte le contenu de la page demandée sans recharger la sidebar */}
{/* MODAL DE DÉCONNEXION */} setShowLogoutModal(false)} onConfirm={confirmLogout} />
); }