UNPKG

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