@@ -425,31 +425,40 @@ export function useHistoryState(initialPresent = {}) {
425
425
426
426
export function useHover ( ) {
427
427
const [ hovering , setHovering ] = React . useState ( false ) ;
428
- const ref = React . useRef ( null ) ;
429
-
430
- React . useEffect ( ( ) => {
431
- const node = ref . current ;
428
+ const previousNode = React . useRef ( null ) ;
432
429
433
- if ( ! node ) return ;
430
+ const handleMouseEnter = React . useCallback ( ( ) => {
431
+ setHovering ( true ) ;
432
+ } , [ ] ) ;
434
433
435
- const handleMouseEnter = ( ) => {
436
- setHovering ( true ) ;
437
- } ;
434
+ const handleMouseLeave = React . useCallback ( ( ) => {
435
+ setHovering ( false ) ;
436
+ } , [ ] ) ;
438
437
439
- const handleMouseLeave = ( ) => {
440
- setHovering ( false ) ;
441
- } ;
438
+ const customRef = React . useCallback (
439
+ ( node ) => {
440
+ if ( previousNode . current instanceof HTMLElement ) {
441
+ previousNode . current . removeEventListener (
442
+ "mouseenter" ,
443
+ handleMouseEnter
444
+ ) ;
445
+ previousNode . current . removeEventListener (
446
+ "mouseleave" ,
447
+ handleMouseLeave
448
+ ) ;
449
+ }
442
450
443
- node . addEventListener ( "mouseenter" , handleMouseEnter ) ;
444
- node . addEventListener ( "mouseleave" , handleMouseLeave ) ;
451
+ if ( node instanceof HTMLElement ) {
452
+ node . addEventListener ( "mouseenter" , handleMouseEnter ) ;
453
+ node . addEventListener ( "mouseleave" , handleMouseLeave ) ;
454
+ }
445
455
446
- return ( ) => {
447
- node . removeEventListener ( "mouseenter" , handleMouseEnter ) ;
448
- node . removeEventListener ( "mouseleave" , handleMouseLeave ) ;
449
- } ;
450
- } , [ ] ) ;
456
+ previousNode . current = node ;
457
+ } ,
458
+ [ handleMouseEnter , handleMouseLeave ]
459
+ ) ;
451
460
452
- return [ ref , hovering ] ;
461
+ return [ customRef , hovering ] ;
453
462
}
454
463
455
464
export function useIdle ( ms = 1000 * 60 ) {
0 commit comments