layout-context.tsx 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. 'use client';
  2. import { createContext, useContext, useState, ReactNode } from 'react';
  3. /**
  4. * Layout Context - Manages global layout state
  5. * Modern OOP pattern using Context API for shared state management
  6. */
  7. interface LayoutContextValue {
  8. sidebarCollapsed: boolean;
  9. toggleSidebar: () => void;
  10. setSidebarCollapsed: (collapsed: boolean) => void;
  11. }
  12. const LayoutContext = createContext<LayoutContextValue | undefined>(undefined);
  13. export function useLayout() {
  14. const context = useContext(LayoutContext);
  15. if (!context) {
  16. throw new Error('useLayout must be used within LayoutProvider');
  17. }
  18. return context;
  19. }
  20. interface LayoutProviderProps {
  21. children: ReactNode;
  22. }
  23. export function LayoutProvider({ children }: LayoutProviderProps) {
  24. const [sidebarCollapsed, setSidebarCollapsed] = useState(false);
  25. const toggleSidebar = () => {
  26. setSidebarCollapsed(prev => !prev);
  27. };
  28. const value: LayoutContextValue = {
  29. sidebarCollapsed,
  30. toggleSidebar,
  31. setSidebarCollapsed,
  32. };
  33. return (
  34. <LayoutContext.Provider value={value}>
  35. {children}
  36. </LayoutContext.Provider>
  37. );
  38. }