UNPKG

@restart/hooks

Version:

A set of utility and general-purpose React hooks.

52 lines (50 loc) 1.45 kB
"use strict"; exports.__esModule = true; exports.default = useResizeObserver; var _react = require("react"); var _useIsomorphicEffect = _interopRequireDefault(require("./useIsomorphicEffect")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const targetMap = new WeakMap(); let resizeObserver; function getResizeObserver() { // eslint-disable-next-line no-return-assign return resizeObserver = resizeObserver || new window.ResizeObserver(entries => { entries.forEach(entry => { const handler = targetMap.get(entry.target); if (handler) handler(entry.contentRect); }); }); } /** * Efficiently observe size changes on an element. Depends on the `ResizeObserver` api, * and polyfills are needed in older browsers. * * ```ts * const [ref, attachRef] = useCallbackRef(null); * * const rect = useResizeObserver(ref); * * return ( * <div ref={attachRef}> * {JSON.stringify(rect)} * </div> * ) * ``` * * @param element The DOM element to observe */ function useResizeObserver(element) { const [rect, setRect] = (0, _react.useState)(null); (0, _useIsomorphicEffect.default)(() => { if (!element) return; getResizeObserver().observe(element); setRect(element.getBoundingClientRect()); targetMap.set(element, rect => { setRect(rect); }); return () => { targetMap.delete(element); }; }, [element]); return rect; }