Skip to content

Commit 704b5c0

Browse files
committed
Primitive tooltip
1 parent bc80452 commit 704b5c0

1 file changed

Lines changed: 63 additions & 2 deletions

File tree

assets/js/dashboard/stats/graph/main-graph.tsx

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { ReactNode, useEffect, useRef } from 'react'
1+
import React, { ReactNode, useEffect, useRef, useState } from 'react'
22
import * as d3 from 'd3'
33
import { UIMode, useTheme } from '../../theme-context'
44
import {
@@ -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

Comments
 (0)