import { useState } from 'react'; import { Outlet } from 'react-router-dom'; import { Menu } from 'lucide-react'; import { useTheme } from '@/hooks/useTheme'; import { usePrefetch } from '@/hooks/usePrefetch'; import { AlertsProvider } from '@/hooks/useAlerts'; import { LockProvider, useLock } from '@/hooks/useLock'; import { NotificationProvider } from '@/hooks/useNotifications'; import { Button } from '@/components/ui/button'; import Sidebar from './Sidebar'; import AppAmbientBackground from './AppAmbientBackground'; import LockOverlay from './LockOverlay'; import NotificationToaster from '@/components/notifications/NotificationToaster'; function AppContent({ mobileOpen, setMobileOpen }: { mobileOpen: boolean; setMobileOpen: (v: boolean) => void; }) { const { isLocked, isLockResolved } = useLock(); usePrefetch(isLockResolved && !isLocked); const [collapsed, setCollapsed] = useState(() => { try { return JSON.parse(localStorage.getItem('umbra-sidebar-collapsed') || 'false'); } catch { return false; } }); // Don't render any content until we know the lock state if (!isLockResolved || isLocked) { return ( <>
{isLockResolved && } ); } return ( <>
{ const next = !collapsed; setCollapsed(next); localStorage.setItem('umbra-sidebar-collapsed', JSON.stringify(next)); }} mobileOpen={mobileOpen} onMobileClose={() => setMobileOpen(false)} />
{/* Mobile header */}

UMBRA

); } export default function AppLayout() { useTheme(); const [mobileOpen, setMobileOpen] = useState(false); return ( ); }