@@ -184,6 +184,7 @@ export const Tooltip = forwardRef(function Tooltip(
184
184
const tooltipId = useId ( )
185
185
const [ isOpen , setIsOpen ] = useDelayedState ( false )
186
186
const delayGroupContext = useTooltipDelayGroup ( )
187
+ const { setIsGroupActive, setOpenTooltipId} = delayGroupContext || { }
187
188
const showTooltip = isOpen || delayGroupContext ?. openTooltipId === tooltipId
188
189
189
190
const isInsideGroup = delayGroupContext !== null
@@ -200,15 +201,15 @@ export const Tooltip = forwardRef(function Tooltip(
200
201
if ( open ) {
201
202
const groupedOpenDelay = immediate ? 0 : openDelay
202
203
203
- delayGroupContext . setIsGroupActive ( open , groupedOpenDelay )
204
- delayGroupContext . setOpenTooltipId ( tooltipId , groupedOpenDelay )
204
+ setIsGroupActive ?. ( open , groupedOpenDelay )
205
+ setOpenTooltipId ?. ( tooltipId , groupedOpenDelay )
205
206
} else {
206
207
const minimumGroupDeactivateDelay = 200 // We should provide some delay to allow the user to reach the next tooltip.
207
208
const groupDeactivateDelay =
208
209
closeDelay > minimumGroupDeactivateDelay ? closeDelay : minimumGroupDeactivateDelay
209
210
210
- delayGroupContext . setIsGroupActive ( open , groupDeactivateDelay )
211
- delayGroupContext . setOpenTooltipId ( null , immediate ? 0 : closeDelay )
211
+ setIsGroupActive ?. ( open , groupDeactivateDelay )
212
+ setOpenTooltipId ?. ( null , immediate ? 0 : closeDelay )
212
213
}
213
214
} else {
214
215
const standaloneDelay = immediate ? 0 : open ? openDelay : closeDelay
@@ -217,7 +218,15 @@ export const Tooltip = forwardRef(function Tooltip(
217
218
setIsOpen ( open , standaloneDelay )
218
219
}
219
220
} ,
220
- [ isInsideGroup , delayGroupContext , openDelay , tooltipId , closeDelay , setIsOpen ] ,
221
+ [
222
+ isInsideGroup ,
223
+ openDelay ,
224
+ setIsGroupActive ,
225
+ setOpenTooltipId ,
226
+ tooltipId ,
227
+ closeDelay ,
228
+ setIsOpen ,
229
+ ] ,
221
230
)
222
231
223
232
const handleBlur = useCallback (
@@ -264,7 +273,7 @@ export const Tooltip = forwardRef(function Tooltip(
264
273
)
265
274
266
275
// Handle closing the tooltip when the mouse leaves the referenceElement
267
- useCloseOnMouseLeave ( { handleIsOpenChange, referenceElement, showTooltip} )
276
+ useCloseOnMouseLeave ( { handleIsOpenChange, referenceElement, showTooltip, isInsideGroup } )
268
277
269
278
// Close when `disabled` changes to `true`
270
279
useEffect ( ( ) => {
@@ -416,10 +425,12 @@ function useCloseOnMouseLeave({
416
425
handleIsOpenChange,
417
426
referenceElement,
418
427
showTooltip,
428
+ isInsideGroup,
419
429
} : {
420
430
handleIsOpenChange : ( open : boolean , immediate ?: boolean ) => void
421
431
referenceElement : HTMLElement | null
422
432
showTooltip : boolean
433
+ isInsideGroup : boolean
423
434
} ) {
424
435
// Since we don't want the `mouseevent` events to be attached and removed if the `referenceElement` is changed
425
436
// we use a "effect event" (https://19.react.dev/learn/separating-events-from-effects#reading-latest-props-and-state-with-effect-events)
@@ -441,7 +452,7 @@ function useCloseOnMouseLeave({
441
452
// necessary, because the tooltip might not always close as it should (e.g. when clicking
442
453
// the reference element triggers a CPU-heavy operation.)
443
454
useEffect ( ( ) => {
444
- if ( ! showTooltip ) return
455
+ if ( ! showTooltip || isInsideGroup ) return
445
456
446
457
const handleMouseMove = ( event : MouseEvent ) => {
447
458
onMouseMove ( event . target , ( ) => window . removeEventListener ( 'mousemove' , handleMouseMove ) )
@@ -450,5 +461,5 @@ function useCloseOnMouseLeave({
450
461
window . addEventListener ( 'mousemove' , handleMouseMove )
451
462
452
463
return ( ) => window . removeEventListener ( 'mousemove' , handleMouseMove )
453
- } , [ showTooltip ] )
464
+ } , [ isInsideGroup , showTooltip ] )
454
465
}
0 commit comments