UNPKG

1.45 kBJavaScriptView Raw
1"use strict";
2
3exports.__esModule = true;
4exports.default = useResizeObserver;
5var _react = require("react");
6var _useIsomorphicEffect = _interopRequireDefault(require("./useIsomorphicEffect"));
7function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
8const targetMap = new WeakMap();
9let resizeObserver;
10function getResizeObserver() {
11 // eslint-disable-next-line no-return-assign
12 return resizeObserver = resizeObserver || new window.ResizeObserver(entries => {
13 entries.forEach(entry => {
14 const handler = targetMap.get(entry.target);
15 if (handler) handler(entry.contentRect);
16 });
17 });
18}
19
20/**
21 * Efficiently observe size changes on an element. Depends on the `ResizeObserver` api,
22 * and polyfills are needed in older browsers.
23 *
24 * ```ts
25 * const [ref, attachRef] = useCallbackRef(null);
26 *
27 * const rect = useResizeObserver(ref);
28 *
29 * return (
30 * <div ref={attachRef}>
31 * {JSON.stringify(rect)}
32 * </div>
33 * )
34 * ```
35 *
36 * @param element The DOM element to observe
37 */
38function useResizeObserver(element) {
39 const [rect, setRect] = (0, _react.useState)(null);
40 (0, _useIsomorphicEffect.default)(() => {
41 if (!element) return;
42 getResizeObserver().observe(element);
43 setRect(element.getBoundingClientRect());
44 targetMap.set(element, rect => {
45 setRect(rect);
46 });
47 return () => {
48 targetMap.delete(element);
49 };
50 }, [element]);
51 return rect;
52}
\No newline at end of file