1- import React , { ReactNode , useEffect , useRef } from 'react'
1+ import React , { ReactNode , useEffect , useRef , useState } from 'react'
22import * as d3 from 'd3'
33import { UIMode , useTheme } from '../../theme-context'
44import {
@@ -61,6 +61,11 @@ export const MainGraph = ({
6161 const { mode } = useTheme ( )
6262 const { primaryGradient, secondaryGradient } = paletteByTheme [ mode ]
6363 const svgRef = useRef < SVGSVGElement | null > ( null )
64+ const [ tooltip , setTooltip ] = useState < {
65+ x : number
66+ y : number
67+ datum : GraphDatum | null
68+ } > ( { x : 0 , y : 0 , datum : null } )
6469
6570 useEffect ( ( ) => {
6671 if ( ! svgRef . current ) {
@@ -294,7 +299,7 @@ export const MainGraph = ({
294299
295300 svg
296301 . on ( 'pointermove' , ( event ) => {
297- const [ xPointer ] = d3 . pointer ( event )
302+ const [ xPointer , yPointer ] = d3 . pointer ( event )
298303 const closestIndexToPointer = d3
299304 . bisector ( ( dataPoint : Point ) => dataPoint [ 0 ] )
300305 . center ( points , xPointer )
@@ -313,10 +318,20 @@ export const MainGraph = ({
313318 } else {
314319 comparisonDot . attr ( 'display' , 'none' )
315320 }
321+ setTooltip ( {
322+ datum : remappedData [ closestIndexToPointer ] ,
323+ x : xPointer ,
324+ y : yPointer
325+ } )
316326 } )
317327 . on ( 'pointerleave' , ( ) => {
318328 dot . attr ( 'display' , 'none' )
319329 comparisonDot . attr ( 'display' , 'none' )
330+ setTooltip ( {
331+ datum : null ,
332+ x : 0 ,
333+ y : 0
334+ } )
320335 } )
321336 . on ( 'touchstart' , ( event ) => event . preventDefault ( ) )
322337
@@ -335,6 +350,52 @@ export const MainGraph = ({
335350 viewBox = { `0 0 ${ width } ${ height } ` }
336351 className = "w-full h-auto"
337352 />
353+ { tooltip . datum !== null && (
354+ < GraphTooltip x = { tooltip . x } y = { tooltip . y } datum = { tooltip . datum } />
355+ ) }
356+ </ div >
357+ )
358+ }
359+
360+ const GraphTooltip = ( {
361+ x,
362+ y,
363+ datum
364+ } : {
365+ x : number
366+ y : number
367+ datum : GraphDatum
368+ } ) => {
369+ console . log ( { x, y, datum } )
370+ return (
371+ < div
372+ className = { classNames (
373+ 'absolute' ,
374+ 'z-50' ,
375+ 'p-2' ,
376+ 'translate-x-2' ,
377+ 'translate-y-2' ,
378+ 'pointer-events-none' ,
379+ 'rounded-sm' ,
380+ 'bg-white' ,
381+ 'dark:bg-gray-800' ,
382+ 'shadow' ,
383+ 'dark:border-gray-850' ,
384+ 'dark:text-gray-200' ,
385+ 'dark:shadow-gray-850' ,
386+ 'shadow-gray-200'
387+ ) }
388+ style = { {
389+ left : x ,
390+ top : y
391+ } }
392+ >
393+ < div className = "text-sm font-semibold" > { datum . timeLabel } </ div >
394+ < div className = "flex items-center gap-x-1 text-sm" >
395+ < strong className = "dark:text-indigo-400" > { datum . value } </ strong >
396+ { datum . comparisonValue }
397+ { datum . comparisonTimeLabel }
398+ </ div >
338399 </ div >
339400 )
340401}
0 commit comments