antd
Version:
An enterprise-class UI design language and React components implementation
31 lines (30 loc) • 1.32 kB
JavaScript
"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;