UNPKG

@primer/react

Version:

An implementation of GitHub's Primer Design System using React

41 lines (40 loc) 1.52 kB
import useIsomorphicLayoutEffect from "../utils/useIsomorphicLayoutEffect.js"; import { useRef, useState } from "react"; //#region src/hooks/useResizeObserver.ts function useResizeObserver(callback, target, depsArray = [], enabled = true) { const [targetClientRect, setTargetClientRect] = useState(null); const savedCallback = useRef(callback); useIsomorphicLayoutEffect(() => { savedCallback.current = callback; }); useIsomorphicLayoutEffect(() => { if (!enabled) return; const targetEl = target && "current" in target ? target.current : document.documentElement; if (!targetEl) return; if (typeof ResizeObserver === "function") { const observer = new ResizeObserver((entries) => { savedCallback.current(entries); }); observer.observe(targetEl); return () => { observer.disconnect(); }; } else { const saveTargetDimensions = () => { const currTargetRect = targetEl.getBoundingClientRect(); if (currTargetRect.width !== (targetClientRect === null || targetClientRect === void 0 ? void 0 : targetClientRect.width) || currTargetRect.height !== targetClientRect.height) savedCallback.current([{ contentRect: currTargetRect }]); setTargetClientRect(currTargetRect); }; window.addEventListener("resize", saveTargetDimensions); return () => { window.removeEventListener("resize", saveTargetDimensions); }; } }, [ target === null || target === void 0 ? void 0 : target.current, enabled, ...depsArray ]); } //#endregion export { useResizeObserver };