@@ -4,25 +4,40 @@ import { flushSync } from 'react-dom';
44
55export 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