Skip to content

Commit ed26998

Browse files
committed
refactor(hooks): use lazy function for useResize
1 parent 32fd556 commit ed26998

1 file changed

Lines changed: 38 additions & 24 deletions

File tree

packages/hooks/src/useResize.ts

Lines changed: 38 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,18 @@ import { isUndefined } from 'lodash';
22
import { useEffect, useRef } from 'react';
33
import { flushSync } from 'react-dom';
44

5+
let checkResize = (cb1: () => void, cb2: () => void, entry: any) => {
6+
if ('borderBoxSize' in entry) {
7+
checkResize = (cb1: () => void) => {
8+
cb1();
9+
};
10+
} else {
11+
checkResize = (cb1: () => void, cb2: () => void) => {
12+
cb2();
13+
};
14+
}
15+
};
16+
517
export function useResize(target: React.RefObject<Element | null>, cb?: ResizeObserverCallback, disabled = false, skipEmpty = true): void {
618
const dataRef = useRef<{
719
prevContentRect?: { width: number; height: number };
@@ -14,30 +26,32 @@ export function useResize(target: React.RefObject<Element | null>, cb?: ResizeOb
1426
useEffect(() => {
1527
if (target.current && !disabled) {
1628
const observer = new ResizeObserver((entries, observer) => {
17-
let entry = entries[0];
18-
19-
if ('borderBoxSize' in entry) {
20-
if (
21-
!isUndefined(dataRef.current.prevContentRect) &&
22-
!(skipEmpty && entry.borderBoxSize[0].blockSize === 0 && entry.borderBoxSize[0].inlineSize === 0) &&
23-
(dataRef.current.prevContentRect.width !== entry.borderBoxSize[0].inlineSize ||
24-
dataRef.current.prevContentRect.height !== entry.borderBoxSize[0].blockSize)
25-
) {
26-
flushSync(() => cb?.(entries, observer));
27-
}
28-
dataRef.current.prevContentRect = { width: entry.borderBoxSize[0].inlineSize, height: entry.borderBoxSize[0].blockSize };
29-
} else {
30-
entry = entries[0];
31-
if (
32-
!isUndefined(dataRef.current.prevContentRect) &&
33-
!(skipEmpty && entry.contentRect.width === 0 && entry.contentRect.height === 0) &&
34-
(dataRef.current.prevContentRect.width !== entry.contentRect.width ||
35-
dataRef.current.prevContentRect.height !== entry.contentRect.height)
36-
) {
37-
flushSync(() => cb?.(entries, observer));
38-
}
39-
dataRef.current.prevContentRect = { width: entry.contentRect.width, height: entry.contentRect.height };
40-
}
29+
const entry = entries[0];
30+
checkResize(
31+
() => {
32+
if (
33+
!isUndefined(dataRef.current.prevContentRect) &&
34+
!(skipEmpty && entry.borderBoxSize[0].blockSize === 0 && entry.borderBoxSize[0].inlineSize === 0) &&
35+
(dataRef.current.prevContentRect.width !== entry.borderBoxSize[0].inlineSize ||
36+
dataRef.current.prevContentRect.height !== entry.borderBoxSize[0].blockSize)
37+
) {
38+
flushSync(() => cb?.(entries, observer));
39+
}
40+
dataRef.current.prevContentRect = { width: entry.borderBoxSize[0].inlineSize, height: entry.borderBoxSize[0].blockSize };
41+
},
42+
() => {
43+
if (
44+
!isUndefined(dataRef.current.prevContentRect) &&
45+
!(skipEmpty && entry.contentRect.width === 0 && entry.contentRect.height === 0) &&
46+
(dataRef.current.prevContentRect.width !== entry.contentRect.width ||
47+
dataRef.current.prevContentRect.height !== entry.contentRect.height)
48+
) {
49+
flushSync(() => cb?.(entries, observer));
50+
}
51+
dataRef.current.prevContentRect = { width: entry.contentRect.width, height: entry.contentRect.height };
52+
},
53+
entry
54+
);
4155
});
4256
observer.observe(target.current);
4357
return () => {

0 commit comments

Comments
 (0)