import React, { createContext, useCallback, useContext, useEffect, useMemo, useState, } from 'react'; type SidebarContextValue = { /** Desktop icon-only rail vs. full-width sidebar. */ collapsed: boolean; toggleCollapsed: () => void; setCollapsed: (value: boolean) => void; /** Off-canvas drawer visibility on small screens. */ mobileOpen: boolean; setMobileOpen: (value: boolean) => void; }; const SidebarContext = createContext( undefined ); const STORAGE_KEY = 'recomaze.sidebar.collapsed'; export const SidebarProvider = ({ children, }: { children: React.ReactNode; }): JSX.Element => { const [collapsed, setCollapsedState] = useState(false); const [mobileOpen, setMobileOpen] = useState(false); // Restore the persisted collapse preference once on mount. useEffect(() => { if (typeof window === 'undefined') return; setCollapsedState(window.localStorage.getItem(STORAGE_KEY) === '1'); }, []); const setCollapsed = useCallback((value: boolean) => { setCollapsedState(value); if (typeof window !== 'undefined') { window.localStorage.setItem(STORAGE_KEY, value ? '1' : '0'); } }, []); const toggleCollapsed = useCallback( () => setCollapsed(!collapsed), [collapsed, setCollapsed] ); const value = useMemo( () => ({ collapsed, toggleCollapsed, setCollapsed, mobileOpen, setMobileOpen, }), [collapsed, toggleCollapsed, setCollapsed, mobileOpen] ); return ( {children} ); }; export const useSidebar = (): SidebarContextValue => { const ctx = useContext(SidebarContext); if (!ctx) { throw new Error('useSidebar must be used within a SidebarProvider'); } return ctx; };