11import { getArrowGeometry , getInlineLabelLayout } from "lib/arrowHelpers"
22import type * as Types from "lib/types"
3- import { useMemo , useState } from "react"
3+ import { useEffect , useMemo , useState } from "react"
44import { distToLineSegment } from "site/utils/distToLineSegment"
55import { safeLighten } from "site/utils/safeLighten"
66import { applyToPoint } from "transformation-matrix"
77import type { InteractiveState } from "./InteractiveState"
88import { defaultColors } from "./defaultColors"
9- import { Tooltip } from "./Tooltip"
109
1110export const Arrow = ( {
1211 arrow,
@@ -17,7 +16,7 @@ export const Arrow = ({
1716 index : number
1817 interactiveState : InteractiveState
1918} ) => {
20- const { realToScreen, onObjectClicked } = interactiveState
19+ const { realToScreen, onObjectClicked, setHoverTooltip } = interactiveState
2120 const [ isHovered , setIsHovered ] = useState ( false )
2221
2322 const geometry = useMemo ( ( ) => getArrowGeometry ( arrow ) , [ arrow ] )
@@ -68,6 +67,26 @@ export const Arrow = ({
6867 . join ( "\n" )
6968 const tooltipAnchor = arrow . label ? labelLayout : inlineLabelLayout
7069
70+ useEffect ( ( ) => {
71+ if ( ! isHovered || ! tooltipText ) return
72+
73+ setHoverTooltip ?.( {
74+ text : tooltipText ,
75+ x : tooltipAnchor . x ,
76+ y : tooltipAnchor . y ,
77+ } )
78+
79+ return ( ) => {
80+ setHoverTooltip ?.( null )
81+ }
82+ } , [
83+ isHovered ,
84+ setHoverTooltip ,
85+ tooltipAnchor . x ,
86+ tooltipAnchor . y ,
87+ tooltipText ,
88+ ] )
89+
7190 const handleMouseMove = ( e : React . MouseEvent < SVGSVGElement > ) => {
7291 const rect = e . currentTarget . getBoundingClientRect ( )
7392 const mouseX = e . clientX - rect . left
@@ -119,7 +138,10 @@ export const Arrow = ({
119138 pointerEvents : "auto" ,
120139 } }
121140 onMouseMove = { handleMouseMove }
122- onMouseLeave = { ( ) => setIsHovered ( false ) }
141+ onMouseLeave = { ( ) => {
142+ setIsHovered ( false )
143+ setHoverTooltip ?.( null )
144+ } }
123145 onClick = {
124146 isHovered
125147 ? ( event ) => {
@@ -147,19 +169,6 @@ export const Arrow = ({
147169 />
148170 ) ) }
149171 </ svg >
150- { isHovered && tooltipText && (
151- < div
152- style = { {
153- position : "absolute" ,
154- left : tooltipAnchor . x ,
155- top : tooltipAnchor . y - 8 ,
156- transform : "translate(-50%, -100%)" ,
157- pointerEvents : "none" ,
158- } }
159- >
160- < Tooltip text = { tooltipText } />
161- </ div >
162- ) }
163172 </ div >
164173 )
165174}
0 commit comments