Skip to content

Instantly share code, notes, and snippets.

@dagstuan
Created September 5, 2019 08:02
Show Gist options
  • Save dagstuan/a03fd395f173a06c9257cd0f9465efd0 to your computer and use it in GitHub Desktop.
Save dagstuan/a03fd395f173a06c9257cd0f9465efd0 to your computer and use it in GitHub Desktop.
import { useState, useEffect, RefObject } from 'react';
import ResizeObserver from 'resize-observer-polyfill';
export interface IDOMRectReadOnly {
readonly width: number;
readonly height: number;
readonly top: number;
readonly left: number;
readonly right: number;
readonly bottom: number;
}
export function useMeasure<T extends HTMLElement>(ref: RefObject<T>) {
const [bounds, set] = useState({
width: 0,
height: 0,
left: 0,
top: 0,
right: 0,
bottom: 0,
});
const [resizeObserver] = useState(
() => new ResizeObserver(([entry]) => set(entry.contentRect)),
);
useEffect(() => {
if (ref.current) {
resizeObserver.observe(ref.current!);
}
return () => resizeObserver.disconnect();
}, [ref]);
return bounds;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment