@mantine/hooks
Version:
A collection of 50+ hooks for state and UI management
71 lines (67 loc) • 1.88 kB
JavaScript
'use client';
;
var React = require('react');
const defaultState = {
x: 0,
y: 0,
width: 0,
height: 0,
top: 0,
left: 0,
bottom: 0,
right: 0
};
function useResizeObserver(options) {
const frameID = React.useRef(0);
const ref = React.useRef(null);
const [rect, setRect] = React.useState(defaultState);
const observer = React.useMemo(
() => typeof window !== "undefined" ? new ResizeObserver((entries) => {
const entry = entries[0];
if (entry) {
cancelAnimationFrame(frameID.current);
frameID.current = requestAnimationFrame(() => {
if (ref.current) {
const boxSize = entry.borderBoxSize?.[0] || entry.contentBoxSize?.[0];
if (boxSize) {
const width = boxSize.inlineSize;
const height = boxSize.blockSize;
setRect({
width,
height,
x: entry.contentRect.x,
y: entry.contentRect.y,
top: entry.contentRect.top,
left: entry.contentRect.left,
bottom: entry.contentRect.bottom,
right: entry.contentRect.right
});
} else {
setRect(entry.contentRect);
}
}
});
}
}) : null,
[]
);
React.useEffect(() => {
if (ref.current) {
observer?.observe(ref.current, options);
}
return () => {
observer?.disconnect();
if (frameID.current) {
cancelAnimationFrame(frameID.current);
}
};
}, [ref.current]);
return [ref, rect];
}
function useElementSize(options) {
const [ref, { width, height }] = useResizeObserver(options);
return { ref, width, height };
}
exports.useElementSize = useElementSize;
exports.useResizeObserver = useResizeObserver;
//# sourceMappingURL=use-resize-observer.cjs.map