@@ -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