Skip to content

Commit b88fed6

Browse files
committed
[gephi-lite] Fine tunes tooltip interactions
This commit mimicks SideMenu behavior in the Tooltip code, so that when the mouse leaves the target one frame before entering the tooltip, the tooltip remains on screen.
1 parent 04dc6dd commit b88fed6

File tree

1 file changed

+21
-13
lines changed

1 file changed

+21
-13
lines changed

packages/gephi-lite/src/components/Tooltip.tsx

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,28 @@ const Tooltip = forwardRef<
2020
>
2121
>
2222
>(({ children: [target, content], targetClassName, hoverable, closeOnClickContent, ...tether }, ref) => {
23+
const [isHovered, setIsHovered] = useState(false);
2324
const [showTooltip, setShowTooltip] = useState<null | "click" | "hover">(null);
2425

2526
const targetWrapper = useRef<HTMLDivElement>(null);
2627
const tooltipWrapper = useRef<HTMLDivElement>(null);
2728

29+
useEffect(() => {
30+
if (isHovered) {
31+
if (!showTooltip) setShowTooltip("hover");
32+
return;
33+
}
34+
35+
if (showTooltip === "hover") {
36+
const id = setTimeout(() => {
37+
setShowTooltip(null);
38+
}, 100);
39+
return () => {
40+
clearTimeout(id);
41+
};
42+
}
43+
}, [isHovered, showTooltip]);
44+
2845
useEffect(() => {
2946
const value = {
3047
close: () => setShowTooltip(null),
@@ -39,14 +56,6 @@ const Tooltip = forwardRef<
3956
useEffect(() => {
4057
if (!showTooltip) return;
4158

42-
const handleMove = (e: MouseEvent) => {
43-
if (!tooltipWrapper.current || !targetWrapper.current) return;
44-
45-
const node = e.target as Node;
46-
if (showTooltip === "hover" && !tooltipWrapper.current.contains(node) && !targetWrapper.current.contains(node)) {
47-
setShowTooltip(null);
48-
}
49-
};
5059
const handleClickBody = (e: MouseEvent) => {
5160
if (!tooltipWrapper.current || !targetWrapper.current) return;
5261

@@ -60,11 +69,9 @@ const Tooltip = forwardRef<
6069
};
6170

6271
setTimeout(() => {
63-
document.body.addEventListener("mousemove", handleMove);
6472
document.body.addEventListener("click", handleClickBody);
6573
}, 0);
6674
return () => {
67-
document.body.removeEventListener("mousemove", handleMove);
6875
document.body.removeEventListener("click", handleClickBody);
6976
};
7077
}, [closeOnClickContent, showTooltip]);
@@ -83,9 +90,8 @@ const Tooltip = forwardRef<
8390
e.preventDefault();
8491
setShowTooltip("click");
8592
}}
86-
onMouseEnter={() => {
87-
if (!showTooltip && hoverable) setShowTooltip("hover");
88-
}}
93+
onMouseEnter={() => hoverable && setIsHovered(true)}
94+
onMouseLeave={() => setIsHovered(false)}
8995
className={targetClassName}
9096
>
9197
<div ref={targetWrapper}>{target}</div>
@@ -97,6 +103,8 @@ const Tooltip = forwardRef<
97103
show={showTooltip}
98104
mountTransition="fade-in 0.2s forwards"
99105
unmountTransition="fade-out 0.2s forwards"
106+
onMouseEnter={() => hoverable && setIsHovered(true)}
107+
onMouseLeave={() => setIsHovered(false)}
100108
>
101109
<div ref={tooltipWrapper}>{content}</div>
102110
</Transition>

0 commit comments

Comments
 (0)