diff --git a/packages/lib/src/vis/line/DataCurve.tsx b/packages/lib/src/vis/line/DataCurve.tsx index 29e0c4f81..9af2fa2d0 100644 --- a/packages/lib/src/vis/line/DataCurve.tsx +++ b/packages/lib/src/vis/line/DataCurve.tsx @@ -1,11 +1,11 @@ import { type IgnoreValue, type NumArray } from '@h5web/shared/vis-models'; import { type ThreeEvent } from '@react-three/fiber'; -import { useCallback } from 'react'; import ErrorBars from './ErrorBars'; import Glyphs from './Glyphs'; import Line from './Line'; import { CurveType, GlyphType } from './models'; +import { useEventHandler } from './utils'; interface Props { abscissas: NumArray; @@ -17,6 +17,9 @@ interface Props { glyphType?: GlyphType; glyphSize?: number; visible?: boolean; + onLineClick?: (index: number, event: ThreeEvent) => void; + onLineEnter?: (index: number, event: ThreeEvent) => void; + onLineLeave?: (index: number, event: ThreeEvent) => void; onDataPointClick?: (index: number, evt: ThreeEvent) => void; onDataPointEnter?: (index: number, evt: ThreeEvent) => void; onDataPointLeave?: (index: number, evt: ThreeEvent) => void; @@ -34,45 +37,15 @@ function DataCurve(props: Props) { glyphType = GlyphType.Cross, glyphSize = 6, visible = true, + onLineClick, + onLineEnter, + onLineLeave, onDataPointClick, onDataPointEnter, onDataPointLeave, ignoreValue, } = props; - const handleClick = useCallback( - (evt: ThreeEvent) => { - const { index } = evt; - - if (onDataPointClick && index !== undefined) { - onDataPointClick(index, evt); - } - }, - [onDataPointClick], - ); - - const handlePointerEnter = useCallback( - (evt: ThreeEvent) => { - const { index } = evt; - - if (onDataPointEnter && index !== undefined) { - onDataPointEnter(index, evt); - } - }, - [onDataPointEnter], - ); - - const handlePointerLeave = useCallback( - (evt: ThreeEvent) => { - const { index } = evt; - - if (onDataPointLeave && index !== undefined) { - onDataPointLeave(index, evt); - } - }, - [onDataPointLeave], - ); - return ( <> {errors && ( ( + handler: ((index: number, evt: ThreeEvent) => void) | undefined, +): ((evt: ThreeEvent) => void) | undefined { + return useMemo(() => { + return ( + handler && + ((evt: ThreeEvent) => { + if (evt.index !== undefined) { + handler(evt.index, evt); + } + }) + ); + }, [handler]); +}