1
- import React , { createRef , useEffect , useMemo } from 'react' ;
1
+ import React , { createRef , useEffect , useCallback , useMemo } from 'react' ;
2
2
import PropTypes from 'prop-types' ;
3
3
4
+ // Debounce 50 ms
5
+ const DELAY = 50 ;
6
+
7
+ let resizeTimeout ;
8
+
4
9
const ResizeDetector = props => {
5
- const { onResize, autosize , children, targets} = props ;
10
+ const { onResize, children, targets} = props ;
6
11
const ref = createRef ( ) ;
7
12
13
+ const debouncedResizeHandler = useCallback ( ( ) => {
14
+ if ( resizeTimeout ) {
15
+ clearTimeout ( resizeTimeout ) ;
16
+ }
17
+ resizeTimeout = setTimeout ( ( ) => {
18
+ onResize ( true ) ; // Force on resize.
19
+ } , DELAY ) ;
20
+ } , [ onResize ] ) ;
21
+
8
22
const observer = useMemo (
9
- ( ) =>
10
- new ResizeObserver ( ( ) => {
11
- onResize ( ) ;
12
- } ) ,
23
+ ( ) => new ResizeObserver ( debouncedResizeHandler ) ,
13
24
[ onResize ]
14
25
) ;
15
26
@@ -19,30 +30,15 @@ const ResizeDetector = props => {
19
30
}
20
31
targets . forEach ( target => observer . observe ( target . current ) ) ;
21
32
observer . observe ( ref . current ) ;
22
- const windowResizedHandled = - 1 ;
23
- // if (autosize) {
24
- // windowResizedHandled = window.addEventListener(
25
- // 'resize',
26
- // onResize
27
- // );
28
- // }
29
33
return ( ) => {
30
34
observer . disconnect ( ) ;
31
- if ( autosize ) {
32
- window . removeEventListener ( windowResizedHandled ) ;
33
- }
34
35
} ;
35
36
} , [ ref . current ] ) ;
36
37
37
- return (
38
- < div ref = { ref } style = { { width : '100%' } } >
39
- { children }
40
- </ div >
41
- ) ;
38
+ return < div ref = { ref } > { children } </ div > ;
42
39
} ;
43
40
44
41
ResizeDetector . propTypes = {
45
- autosize : PropTypes . bool ,
46
42
onResize : PropTypes . func ,
47
43
children : PropTypes . node ,
48
44
targets : PropTypes . any ,
0 commit comments