import React, { createContext, useContext, useState, useEffect, ReactNode, useMemo } from 'react'; interface ResponsiveContextType { isMobile: boolean; isDesktop: boolean; } const MOBILE_BREAKPOINT = 768; const ResponsiveContext = createContext(undefined); function getInitialState(): boolean { if (typeof window === 'undefined') { return false; } return window.innerWidth < MOBILE_BREAKPOINT; } export function ResponsiveProvider({ children }: { children: ReactNode }): React.ReactElement { const [isMobile, setIsMobile] = useState(getInitialState); useEffect(() => { if (typeof window === 'undefined') { return; } const mediaQuery = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`); const handleChange = (event: MediaQueryListEvent) => { setIsMobile(event.matches); }; setIsMobile(mediaQuery.matches); mediaQuery.addEventListener('change', handleChange); return () => { mediaQuery.removeEventListener('change', handleChange); }; }, []); const value = useMemo(() => ({ isMobile, isDesktop: !isMobile, }), [isMobile]); return {children}; } export function useResponsive(): ResponsiveContextType { const context = useContext(ResponsiveContext); if (context === undefined) { throw new Error('useResponsive must be used within a ResponsiveProvider'); } return context; }