Skip to content

Commit 5d57607

Browse files
committed
[tooltip] Cancel pending open on pointerdown
1 parent 02240e7 commit 5d57607

3 files changed

Lines changed: 23 additions & 16 deletions

File tree

packages/react/src/floating-ui-react/hooks/useHoverReferenceInteraction.ts

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -439,12 +439,6 @@ export function useHoverReferenceInteraction(
439439
function handleMouseMove() {
440440
instance.restTimeoutPending = false;
441441

442-
// A delayed hover open should not override a click-like open that happened
443-
// while the hover delay was pending.
444-
if (isClickLikeOpenEvent()) {
445-
return;
446-
}
447-
448442
const latestOpen = store.select('open');
449443

450444
if (!instance.blockMouseMove && (!latestOpen || isOverInactive) && checkShouldOpen()) {
@@ -467,14 +461,5 @@ export function useHoverReferenceInteraction(
467461
}
468462
},
469463
};
470-
}, [
471-
enabled,
472-
instance,
473-
isClickLikeOpenEvent,
474-
isOverInactiveTrigger,
475-
mouseOnly,
476-
store,
477-
restMsRef,
478-
checkShouldOpen,
479-
]);
464+
}, [enabled, instance, isOverInactiveTrigger, mouseOnly, store, restMsRef, checkShouldOpen]);
480465
}

packages/react/src/tooltip/root/TooltipRoot.test.tsx

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -821,6 +821,25 @@ describe('<Tooltip.Root />', () => {
821821
expect(screen.queryByText('Content')).toBe(null);
822822
});
823823

824+
it('should not open when the trigger receives pointerdown before delay duration', async () => {
825+
await render(<TestTooltip />);
826+
827+
const trigger = screen.getByRole('button', { name: 'Toggle' });
828+
829+
fireEvent.mouseEnter(trigger);
830+
fireEvent.mouseMove(trigger);
831+
832+
clock.tick(OPEN_DELAY / 2);
833+
834+
fireEvent.pointerDown(trigger, { pointerType: 'mouse' });
835+
836+
clock.tick(OPEN_DELAY / 2);
837+
838+
await flushMicrotasks();
839+
840+
expect(screen.queryByText('Content')).toBe(null);
841+
});
842+
824843
it('should open when the trigger was clicked before delay duration and closeOnClick is false', async () => {
825844
await render(<TestTooltip triggerProps={{ closeOnClick: false }} />);
826845

packages/react/src/tooltip/trigger/TooltipTrigger.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,9 @@ export const TooltipTrigger = fastComponentRef(function TooltipTrigger(
289289
onPointerDown(event: React.PointerEvent) {
290290
pointerTypeRef.current = event.pointerType;
291291
store.set('closeOnClick', closeOnClick);
292+
if (closeOnClick && !store.select('open')) {
293+
store.cancelPendingOpen(event.nativeEvent);
294+
}
292295
},
293296
onClick(event) {
294297
if (closeOnClick && !store.select('open')) {

0 commit comments

Comments
 (0)