@@ -58,23 +58,6 @@ const Tooltip = ({
58
58
const [ anchorsBySelect , setAnchorsBySelect ] = useState < HTMLElement [ ] > ( [ ] )
59
59
const mounted = useRef ( false )
60
60
61
- useEffect ( ( ) => {
62
- let selector = anchorSelect
63
- if ( ! selector && id ) {
64
- selector = `[data-tooltip-id='${ id } ']`
65
- }
66
- if ( ! selector ) {
67
- return
68
- }
69
- try {
70
- const anchors = Array . from ( document . querySelectorAll < HTMLElement > ( selector ) )
71
- setAnchorsBySelect ( anchors )
72
- } catch {
73
- // warning was already issued in the controller
74
- setAnchorsBySelect ( [ ] )
75
- }
76
- } , [ anchorSelect , activeAnchor ] )
77
-
78
61
/**
79
62
* useLayoutEffect runs before useEffect,
80
63
* but should be used carefully because of caveats
@@ -347,11 +330,35 @@ const Tooltip = ({
347
330
} )
348
331
} )
349
332
350
- const parentObserverCallback : MutationCallback = ( mutationList ) => {
351
- let selector = anchorSelect ?? ''
352
- if ( ! selector && id ) {
353
- selector = `[data-tooltip-id='${ id } ']`
333
+ return ( ) => {
334
+ if ( events . find ( ( event : string ) => event === 'click' ) ) {
335
+ window . removeEventListener ( 'click' , handleClickOutsideAnchors )
336
+ }
337
+ if ( closeOnEsc ) {
338
+ window . removeEventListener ( 'keydown' , handleEsc )
339
+ }
340
+ if ( clickable ) {
341
+ tooltipRef . current ?. removeEventListener ( 'mouseenter' , handleMouseEnterTooltip )
342
+ tooltipRef . current ?. removeEventListener ( 'mouseleave' , handleMouseLeaveTooltip )
354
343
}
344
+ enabledEvents . forEach ( ( { event, listener } ) => {
345
+ elementRefs . forEach ( ( ref ) => {
346
+ ref . current ?. removeEventListener ( event , listener )
347
+ } )
348
+ } )
349
+ }
350
+ /**
351
+ * rendered is also a dependency to ensure anchor observers are re-registered
352
+ * since `tooltipRef` becomes stale after removing/adding the tooltip to the DOM
353
+ */
354
+ } , [ rendered , anchorRefs , anchorsBySelect , closeOnEsc , events ] )
355
+
356
+ useEffect ( ( ) => {
357
+ let selector = anchorSelect ?? ''
358
+ if ( ! selector && id ) {
359
+ selector = `[data-tooltip-id='${ id } ']`
360
+ }
361
+ const documentObserverCallback : MutationCallback = ( mutationList ) => {
355
362
mutationList . forEach ( ( mutation ) => {
356
363
if ( mutation . type !== 'childList' ) {
357
364
return
@@ -389,44 +396,13 @@ const Tooltip = ({
389
396
}
390
397
} )
391
398
}
392
-
393
- const parentObserver = new MutationObserver ( parentObserverCallback )
394
-
399
+ const documentObserver = new MutationObserver ( documentObserverCallback )
395
400
// watch for anchor being removed from the DOM
396
- parentObserver . observe ( document . body , { attributes : false , childList : true , subtree : true } )
397
-
401
+ documentObserver . observe ( document . body , { attributes : false , childList : true , subtree : true } )
398
402
return ( ) => {
399
- if ( events . find ( ( event : string ) => event === 'click' ) ) {
400
- window . removeEventListener ( 'click' , handleClickOutsideAnchors )
401
- }
402
- if ( closeOnEsc ) {
403
- window . removeEventListener ( 'keydown' , handleEsc )
404
- }
405
- if ( clickable ) {
406
- tooltipRef . current ?. removeEventListener ( 'mouseenter' , handleMouseEnterTooltip )
407
- tooltipRef . current ?. removeEventListener ( 'mouseleave' , handleMouseLeaveTooltip )
408
- }
409
- enabledEvents . forEach ( ( { event, listener } ) => {
410
- elementRefs . forEach ( ( ref ) => {
411
- ref . current ?. removeEventListener ( event , listener )
412
- } )
413
- } )
414
- parentObserver . disconnect ( )
403
+ documentObserver . disconnect ( )
415
404
}
416
- /**
417
- * rendered is also a dependency to ensure anchor observers are re-registered
418
- * since `tooltipRef` becomes stale after removing/adding the tooltip to the DOM
419
- */
420
- } , [
421
- rendered ,
422
- anchorRefs ,
423
- activeAnchor ,
424
- anchorsBySelect ,
425
- closeOnEsc ,
426
- events ,
427
- delayHide ,
428
- delayShow ,
429
- ] )
405
+ } , [ id , anchorSelect , activeAnchor ] )
430
406
431
407
useEffect ( ( ) => {
432
408
if ( position ) {
@@ -496,6 +472,23 @@ const Tooltip = ({
496
472
}
497
473
} , [ ] )
498
474
475
+ useEffect ( ( ) => {
476
+ let selector = anchorSelect
477
+ if ( ! selector && id ) {
478
+ selector = `[data-tooltip-id='${ id } ']`
479
+ }
480
+ if ( ! selector ) {
481
+ return
482
+ }
483
+ try {
484
+ const anchors = Array . from ( document . querySelectorAll < HTMLElement > ( selector ) )
485
+ setAnchorsBySelect ( anchors )
486
+ } catch {
487
+ // warning was already issued in the controller
488
+ setAnchorsBySelect ( [ ] )
489
+ }
490
+ } , [ id , anchorSelect ] )
491
+
499
492
const hasContentOrChildren = Boolean ( html || content || children )
500
493
const canShow = hasContentOrChildren && show && Object . keys ( inlineStyles ) . length > 0
501
494
0 commit comments