UNPKG

antd

Version:

An enterprise-class UI design language and React components implementation

31 lines (30 loc) • 1.32 kB
"use client"; import { useCallback, useRef, useState, useSyncExternalStore } from 'react'; import useResponsiveObserver from '../../_util/responsiveObserver'; function useBreakpoint(refreshOnChange = true, defaultScreens = {}) { const [initialScreens] = useState(defaultScreens); const screensRef = useRef(defaultScreens); const responsiveObserver = useResponsiveObserver(); const subscribe = useCallback(onStoreChange => { const token = responsiveObserver.subscribe(supportScreens => { screensRef.current = supportScreens; onStoreChange(); }); return () => { responsiveObserver.unsubscribe(token); }; }, [responsiveObserver]); const getSnapshot = useCallback(() => { if (refreshOnChange) { return responsiveObserver.getSnapshot?.() ?? initialScreens; } return initialScreens; }, [responsiveObserver, refreshOnChange, initialScreens]); const getServerSnapshot = useCallback(() => { return responsiveObserver.getServerSnapshot?.() ?? initialScreens; }, [responsiveObserver, initialScreens]); const screens = useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot); // Disabled refresh still exposes the latest breakpoints on the next parent render. return refreshOnChange ? screens : screensRef.current; } export default useBreakpoint;