Skip to content

Commit 4d3fc16

Browse files
committed
fix(utils): Slightly better tooltip behavior after clicking somewhere on the page
1 parent 8c65df6 commit 4d3fc16

File tree

1 file changed

+30
-16
lines changed

1 file changed

+30
-16
lines changed

packages/utils/src/hover/useHoverMode.ts

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
useState,
1010
} from "react";
1111

12-
import { useIsUserInteractionMode } from "../mode";
12+
import { useUserInteractionMode } from "../mode";
1313
import { useOnUnmount } from "../useOnUnmount";
1414
import { DEFAULT_HOVER_MODE_STICKY_EXIT_TIME } from "./constants";
1515
import { HoverModeActions, useHoverModeContext } from "./useHoverModeContext";
@@ -226,11 +226,12 @@ export function useHoverMode<E extends HTMLElement>({
226226
defaultVisible = false,
227227
exitVisibilityDelay = sticky ? DEFAULT_HOVER_MODE_STICKY_EXIT_TIME : 0,
228228
}: HoverModeOptions<E> = {}): HoverModeReturnValue<E> {
229-
const isTouch = useIsUserInteractionMode("touch");
229+
const mode = useUserInteractionMode();
230+
const isTouch = mode === "touch";
230231
const [visible, setVisible] = useState(defaultVisible);
231232
const [stuck, setStuck] = useState(false);
232-
const enterTimeoutRef = useRef<number>();
233-
const exitTimeoutRef = useRef<number>();
233+
const timeoutRef = useRef<number>();
234+
const skipReset = useRef(defaultVisible);
234235
const {
235236
visibleInTime,
236237
enableHoverMode,
@@ -246,15 +247,31 @@ export function useHoverMode<E extends HTMLElement>({
246247
}, [visible, sticky]);
247248

248249
useOnUnmount(() => {
249-
window.clearTimeout(enterTimeoutRef.current);
250-
window.clearTimeout(exitTimeoutRef.current);
250+
window.clearTimeout(timeoutRef.current);
251251
});
252252

253253
useEffect(() => {
254-
if (isTouch || disabled) {
254+
if (disabled) {
255+
return;
256+
}
257+
258+
const reset = (): void => {
259+
setVisible(false);
255260
disableHoverMode();
261+
window.clearTimeout(timeoutRef.current);
262+
};
263+
264+
// this is just used so the `defaultOption` can be used
265+
if (!skipReset.current) {
266+
reset();
256267
}
257-
}, [disableHoverMode, isTouch, disabled]);
268+
skipReset.current = false;
269+
270+
window.addEventListener("mousedown", reset);
271+
return () => {
272+
window.removeEventListener("mousedown", reset);
273+
};
274+
}, [disableHoverMode, mode, disabled]);
258275

259276
const onMouseEnter = useCallback(
260277
(event: MouseEvent<E>) => {
@@ -263,15 +280,14 @@ export function useHoverMode<E extends HTMLElement>({
263280
return;
264281
}
265282

266-
window.clearTimeout(enterTimeoutRef.current);
267-
window.clearTimeout(exitTimeoutRef.current);
283+
window.clearTimeout(timeoutRef.current);
268284
if (visibleInTime === 0) {
269285
enableHoverMode();
270286
setVisible(true);
271287
return;
272288
}
273289

274-
enterTimeoutRef.current = window.setTimeout(() => {
290+
timeoutRef.current = window.setTimeout(() => {
275291
enableHoverMode();
276292
setVisible(true);
277293
}, visibleInTime);
@@ -287,14 +303,13 @@ export function useHoverMode<E extends HTMLElement>({
287303
}
288304

289305
startDisableTimer();
290-
window.clearTimeout(enterTimeoutRef.current);
291-
window.clearTimeout(exitTimeoutRef.current);
306+
window.clearTimeout(timeoutRef.current);
292307
if (exitVisibilityDelay === 0) {
293308
setVisible(false);
294309
return;
295310
}
296311

297-
exitTimeoutRef.current = window.setTimeout(() => {
312+
timeoutRef.current = window.setTimeout(() => {
298313
setVisible(false);
299314
}, exitVisibilityDelay);
300315
},
@@ -316,8 +331,7 @@ export function useHoverMode<E extends HTMLElement>({
316331
}
317332

318333
startDisableTimer();
319-
window.clearTimeout(enterTimeoutRef.current);
320-
window.clearTimeout(exitTimeoutRef.current);
334+
window.clearTimeout(timeoutRef.current);
321335
},
322336
[disabled, propOnClick, startDisableTimer]
323337
);

0 commit comments

Comments
 (0)