import { useSyncExternalStore } from 'react'; const breakpoints = { narrow: 479, // Device width under which horizontal space is constrained openable: 759, // Device width at which the sidebar becomes an openable hamburger menu full: 1174, // Device width at which all 3 columns can be displayed }; type Breakpoint = keyof typeof breakpoints; export const useBreakpoint = (breakpoint: Breakpoint) => { const query = `(max-width: ${breakpoints[breakpoint]}px)`; const isMatching = useSyncExternalStore( (callback) => { const mediaWatcher = window.matchMedia(query); mediaWatcher.addEventListener('change', callback); return () => { mediaWatcher.removeEventListener('change', callback); }; }, () => window.matchMedia(query).matches, ); return isMatching; }; interface WithBreakpointType { matchesBreakpoint: boolean; } export function withBreakpoint

( Component: React.ComponentType

, breakpoint: Breakpoint = 'full', ) { const displayName = `withMobileLayout(${Component.displayName ?? Component.name})`; const ComponentWithBreakpoint = (props: P) => { const matchesBreakpoint = useBreakpoint(breakpoint); return ; }; ComponentWithBreakpoint.displayName = displayName; return ComponentWithBreakpoint; }