@@ -2,6 +2,18 @@ import { isUndefined } from 'lodash';
22import { useEffect , useRef } from 'react' ;
33import { 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+
517export 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