Skip to content

Commit 13df709

Browse files
committed
fix(ui): fix ResizeObserver miss borderBoxSize with some browsers
1 parent f5d7c84 commit 13df709

1 file changed

Lines changed: 25 additions & 10 deletions

File tree

packages/hooks/src/useResize.ts

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,40 @@ import { flushSync } from 'react-dom';
44

55
export function useResize(target: React.RefObject<Element | null>, cb?: ResizeObserverCallback, disabled = false, skipEmpty = true): void {
66
const dataRef = useRef<{
7-
prevBorderBoxSize?: ResizeObserverSize;
7+
prevContentRect?: { width: number; height: number };
88
}>({});
99

1010
if (disabled) {
11-
dataRef.current.prevBorderBoxSize = undefined;
11+
dataRef.current.prevContentRect = undefined;
1212
}
1313

1414
useEffect(() => {
1515
if (target.current && !disabled) {
1616
const observer = new ResizeObserver((entries, observer) => {
17-
if (
18-
!isUndefined(dataRef.current.prevBorderBoxSize) &&
19-
!(skipEmpty && entries[0].borderBoxSize[0].blockSize === 0 && entries[0].borderBoxSize[0].inlineSize === 0) &&
20-
(dataRef.current.prevBorderBoxSize.blockSize !== entries[0].borderBoxSize[0].blockSize ||
21-
dataRef.current.prevBorderBoxSize.inlineSize !== entries[0].borderBoxSize[0].inlineSize)
22-
) {
23-
flushSync(() => cb?.(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 };
2440
}
25-
dataRef.current.prevBorderBoxSize = entries[0].borderBoxSize[0];
2641
});
2742
observer.observe(target.current);
2843
return () => {

0 commit comments

Comments
 (0)