import React, { useState } from 'react'; import { NavLink, Outlet, useNavigate, Link } from 'react-router-dom'; import { LayoutDashboard, Building2, FolderKanban, Coins, ShieldAlert, Settings, LogOut, Menu, X, ChevronRight, ShieldCheck, Layers, Database, Home, User, } from 'lucide-react'; import { useAuth } from '../../auth/AuthProvider'; const navItems = [ { name: 'Executive Dashboard', path: '/dashboard', icon: LayoutDashboard, }, { name: 'Governance & Structure', path: '/governance', icon: Building2, }, { name: 'Projects & Milestones', path: '/projects', icon: FolderKanban, }, { name: 'Grant & Financials', path: '/grants', icon: Coins, }, { name: 'M&E, Evidence & Risks', path: '/monitoring', icon: ShieldAlert, }, { name: 'Settings & Communications', path: '/settings', icon: Settings, }, ]; export const AppLayout: React.FC = () => { const { user, claims, sub, logout } = useAuth(); const [sidebarOpen, setSidebarOpen] = useState(true); const [userMenuOpen, setUserMenuOpen] = useState(false); const navigate = useNavigate(); const handleLogout = async () => { await logout(); }; // Extract name and email directly from validated token claims const tokenUserName = user?.name || (claims.name as string) || (claims.preferred_username as string) || (claims.given_name ? `${claims.given_name} ${claims.family_name || ''}`.trim() : '') || 'Authorized User'; const tokenUserEmail = user?.email || (claims.email as string) || (claims['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress'] as string) || (claims.upn as string) || (sub ? `sub:${sub}` : ''); return (
{/* Sidebar */} {/* Main Content Area */}
{/* Top Header */}
{/* Clickable Home Link */} Home
Tenant: Department of Science, Innovation & Technology (DSI)
Authenticated Session
{/* User Name & Email derived from token, plus Identity Server signout */}

{tokenUserName}

{tokenUserEmail}

{/* Dropdown Menu */} {userMenuOpen && (
setUserMenuOpen(false)} >

{tokenUserName}

{tokenUserEmail}

{sub &&

sub: {sub}

}
setUserMenuOpen(false)} className="flex items-center gap-2 px-3 py-2 text-xs text-slate-300 hover:text-white hover:bg-slate-800/60 rounded-xl transition" > Go to Home Page
)}
{/* Viewport with Landing Page ambient dot grid and glow */}
{/* Bottom Status Footer */}
); };