-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathuse_resize_observer.ts
More file actions
39 lines (30 loc) · 996 Bytes
/
use_resize_observer.ts
File metadata and controls
39 lines (30 loc) · 996 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import { useCallback, useEffect, useRef, useState } from 'react';
export type UseResizeObserverCallback = (rect: DOMRect) => void;
export function useResizeObserver(callback?: UseResizeObserverCallback) {
const [size, setSize] = useState<DOMRect>();
const observerRef = useRef<ResizeObserver>(null);
const callbackRef = useRef(callback);
useEffect(() => {
callbackRef.current = callback;
}, [callback]);
const refCallback = useCallback((node: Element | null) => {
if (observerRef.current) {
observerRef.current.disconnect();
observerRef.current = null;
}
if (node) {
const updateSize = () => {
const rect = node.getBoundingClientRect();
callbackRef.current?.(rect);
setSize(rect);
};
updateSize();
const observer = new ResizeObserver(() => {
updateSize();
});
observer.observe(node);
observerRef.current = observer;
}
}, []);
return [refCallback, size] as const;
}