UNPKG

@adaptabletools/adaptable-cjs

Version:

Powerful data-agnostic HTML5 AG Grid extension which provides advanced, cutting-edge functionality to meet all DataGrid requirements

102 lines (101 loc) 3.62 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ReactResizeObserver = exports.useResizeObserver = exports.setupResizeObserver = void 0; const tslib_1 = require("tslib"); const React = tslib_1.__importStar(require("react")); const react_1 = require("react"); const getResizeObserverObject_1 = require("./getResizeObserverObject"); const setupResizeObserver = (node, callback) => { const RO = (0, getResizeObserverObject_1.getResizeObserverObject)(); if (!RO) { return () => { }; } const observer = new RO((entries) => { const entry = entries[0]; let { width, height } = entry.contentRect; if (entry.borderBoxSize?.[0]) { height = entry.borderBoxSize[0].blockSize; width = entry.borderBoxSize[0].inlineSize; } else { // this is needed for Safari and other browsers that don't have borderBoxSize on the entry object const rect = node.getBoundingClientRect(); height = rect.height; width = rect.width; } callback({ width, height }); }); observer.observe(node); return () => { observer.disconnect(); }; }; exports.setupResizeObserver = setupResizeObserver; /** * A hook that notifies you when a certain DOM element has changed it's size * * @param ref A React ref to a DOM element * @param callback The function to be called when the element is resized. */ const useResizeObserver = (ref, callback, config = { earlyAttach: false }) => { const sizeRef = (0, react_1.useRef)({ width: 0, height: 0, }); const effectFn = (callback) => { let disconnect; if (ref.current) { disconnect = (0, exports.setupResizeObserver)(ref.current, (size) => { size = { width: Math.round(size.width), height: Math.round(size.height), }; const prevSize = sizeRef.current; if (prevSize.width !== size.width || prevSize.height !== size.height) { sizeRef.current = size; callback(size); } }); } return () => { if (disconnect) { disconnect(); } }; }; (0, react_1.useEffect)(() => { if (!config.earlyAttach) { return effectFn(callback); } return () => { }; }, [ref.current, callback, config.earlyAttach]); (0, react_1.useLayoutEffect)(() => { if (config.earlyAttach) { return effectFn(callback); } return () => { }; }, [ref.current, callback, config.earlyAttach]); }; exports.useResizeObserver = useResizeObserver; const ReactResizeObserver = ({ notifyOnMount = true, earlyAttach = false, ...props }) => { const style = (0, react_1.useMemo)(() => ({ position: 'absolute', top: 0, left: 0, width: '100%', height: '100%', boxSizing: 'border-box', }), []); const firstTime = (0, react_1.useRef)(true); const ref = (0, react_1.useRef)(null); const onResize = (0, react_1.useCallback)((size) => { if (firstTime.current && !notifyOnMount) { firstTime.current = false; return; } props.onResize(size); }, [props.onResize]); (0, exports.useResizeObserver)(ref, onResize, { earlyAttach: earlyAttach || false }); return React.createElement("div", { ref: ref, style: style }); }; exports.ReactResizeObserver = ReactResizeObserver;