import { useState, useEffect, useCallback } from 'react' import { Link, useLocation, useNavigate, Outlet } from 'react-router-dom' import { useAuthStore } from '@/store/authStore' import { usePermissions } from '@/hooks/usePermissions' import { ThemeToggle } from '@/components/common/ThemeToggle' import { BrandLogo } from '@/components/common/BrandLogo' import { BrandWordmark } from '@/components/common/BrandWordmark' import { Menu, X } from 'lucide-react' import { cn } from '@/lib/utils' export function AppLayout() { const location = useLocation() const navigate = useNavigate() const { user, logout } = useAuthStore() const { effectiveRole, isSuperAdmin } = usePermissions() const [mobileMenuOpen, setMobileMenuOpen] = useState(false) const handleLogout = async () => { setMobileMenuOpen(false) await logout() navigate('/login') } // Close mobile menu on route change - key-based reset const [prevPath, setPrevPath] = useState(location.pathname) if (prevPath !== location.pathname) { setPrevPath(location.pathname) if (mobileMenuOpen) setMobileMenuOpen(false) } // Close on Escape const handleKeyDown = useCallback((e: KeyboardEvent) => { if (e.key === 'Escape') setMobileMenuOpen(false) }, []) useEffect(() => { if (mobileMenuOpen) { document.addEventListener('keydown', handleKeyDown) document.body.style.overflow = 'hidden' } else { document.body.style.overflow = '' } return () => { document.removeEventListener('keydown', handleKeyDown) document.body.style.overflow = '' } }, [mobileMenuOpen, handleKeyDown]) const navItems = [ { path: '/', label: 'Home' }, { path: '/trees', label: 'Trees' }, { path: '/my-trees', label: 'My Trees' }, { path: '/sessions', label: 'Sessions' }, { path: '/account', label: 'Account' }, { path: '/settings', label: 'Settings' }, ...(isSuperAdmin ? [{ path: '/admin', label: 'Admin Panel' }] : []), ] return (
{/* Header */}
{/* Mobile hamburger */}
{user?.name || user?.email} {effectiveRole && effectiveRole !== 'engineer' && ( {effectiveRole === 'super_admin' ? 'Super Admin' : effectiveRole === 'owner' ? 'Owner' : 'Viewer'} )}
{/* Mobile Nav Drawer */} {mobileMenuOpen && (
{/* Backdrop */}
setMobileMenuOpen(false)} aria-hidden="true" /> {/* Drawer */}
)} {/* Main Content */}
) } export default AppLayout