Files
supabase/apps/studio/components/ui/Charts/useChartHighlight.tsx
Ali Waseem b04e54b38a fix: sentry errors (#40875)
* fix: SUPABASE-APP-90D

* fix: SUPABASE-APP-90C

* fix: SUPABASE-APP-6HC

* fix: SUPABASE-APP-A38

* fix: SUPABASE-APP-9JB

* Improve types for RowContextMenu.tsx

* Improve types for useChartHighlight

* Nit

---------

Co-authored-by: Joshen Lim <joshenlimek@gmail.com>
2025-11-28 19:17:07 +08:00

104 lines
2.9 KiB
TypeScript

import dayjs from 'dayjs'
import { useState } from 'react'
type ChartHighlightMouseEvent = {
activeLabel?: string
coordinates?: string
}
export interface ChartHighlight {
left: string | undefined
right: string | undefined
coordinates: { left?: string; right?: string }
isSelecting: boolean
popoverPosition: { x: number; y: number } | null
handleMouseDown: (e: ChartHighlightMouseEvent) => void
handleMouseMove: (e: ChartHighlightMouseEvent) => void
handleMouseUp: (e: { chartX?: number; chartY?: number }) => void
clearHighlight: () => void
}
export function useChartHighlight(): ChartHighlight {
const [left, setLeft] = useState<string | undefined>(undefined)
const [right, setRight] = useState<string | undefined>(undefined)
const [coordinates, setCoordinates] = useState<{ left?: string; right?: string }>({
left: undefined,
right: undefined,
})
const [isSelecting, setIsSelecting] = useState(false)
const [popoverPosition, setPopoverPosition] = useState<{ x: number; y: number } | null>(null)
const [initialPoint, setInitialPoint] = useState<string | undefined>(undefined)
const handleMouseDown = (e: ChartHighlightMouseEvent) => {
clearHighlight()
if (!e || !e.activeLabel) return
setIsSelecting(true)
setLeft(e.activeLabel)
setRight(e.activeLabel)
setInitialPoint(e.activeLabel)
setCoordinates({ left: e.coordinates, right: e.coordinates })
}
const handleMouseMove = (e: ChartHighlightMouseEvent) => {
if (!isSelecting || !e || !e.activeLabel) return
const currentTimestamp = dayjs(e.activeLabel)
const initialTimestamp = dayjs(initialPoint)
if (currentTimestamp.isBefore(initialTimestamp)) {
// If dragging left, update left and keep right as initial
setLeft(e.activeLabel)
setRight(initialPoint)
setCoordinates({
left: e.coordinates,
right: coordinates.right,
})
} else {
// If dragging right, update right and keep left as initial
setRight(e.activeLabel)
setLeft(initialPoint)
setCoordinates({
left: coordinates.left,
right: e.coordinates,
})
}
}
const handleMouseUp = (e: unknown) => {
if (!isSelecting) return
setIsSelecting(false)
setInitialPoint(undefined)
if (
typeof e === 'object' &&
e !== null &&
'chartX' in e &&
'chartY' in e &&
typeof e.chartX === 'number' &&
typeof e.chartY === 'number'
) {
setPopoverPosition({ x: e.chartX, y: e.chartY })
}
}
const clearHighlight = () => {
setLeft(undefined)
setRight(undefined)
setCoordinates({ left: undefined, right: undefined })
setPopoverPosition(null)
setInitialPoint(undefined)
}
return {
left,
right,
coordinates,
isSelecting,
popoverPosition,
handleMouseDown,
handleMouseMove,
handleMouseUp,
clearHighlight,
}
}