-
Notifications
You must be signed in to change notification settings - Fork 0
/
use-resize-observer.jsx
79 lines (68 loc) · 2 KB
/
use-resize-observer.jsx
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import React, { useLayoutEffect } from "react";
export default function useResizeObserver(onResize, types = []) {
const ref = React.createRef();
let observer = null;
useLayoutEffect(() => {
observer = new ResizeObserver(entries => {
if (ref.current !== null) {
const contentRect = getContentRect(ref.current, types);
onResize({ ...contentRect, entry: entries[0].contentRect });
}
});
if (ref.current !== null) {
observer.observe(ref.current);
}
return () => {
observer !== null && observer.disconnect();
};
}, [onResize, types]);
return ref;
}
function getContentRect(element, types) {
const calculations = {};
if (types.indexOf("client") > -1) {
calculations.client = {
top: element.clientTop,
left: element.clientLeft,
width: element.clientWidth,
height: element.clientHeight
};
}
if (types.indexOf("offset") > -1) {
calculations.offset = {
top: element.offsetTop,
left: element.offsetLeft,
width: element.offsetWidth,
height: element.offsetHeight
};
}
if (types.indexOf("scroll") > -1) {
calculations.scroll = {
top: element.scrollTop,
left: element.scrollLeft,
width: element.scrollWidth,
height: element.scrollHeight
};
}
if (types.indexOf("bounds") > -1) {
const rect = element.getBoundingClientRect();
calculations.bounds = {
top: rect.top,
right: rect.right,
bottom: rect.bottom,
left: rect.left,
width: rect.width,
height: rect.height
};
}
if (types.indexOf("margin") > -1) {
const styles = getComputedStyle(element);
calculations.margin = {
top: styles && styles.marginTop ? parseInt(styles.marginTop) : 0,
right: styles && styles.marginRight ? parseInt(styles.marginRight) : 0,
bottom: styles && styles.marginBottom ? parseInt(styles.marginBottom) : 0,
left: styles && styles.marginLeft ? parseInt(styles.marginLeft) : 0
};
}
return calculations;
}