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 (
{tokenUserName}
{tokenUserEmail}
{tokenUserName}
{tokenUserEmail}
{sub &&sub: {sub}
}