11import { type IgnoreValue , type NumArray } from '@h5web/shared/vis-models' ;
22import { type ThreeEvent } from '@react-three/fiber' ;
3- import { useCallback } from 'react' ;
43
54import ErrorBars from './ErrorBars' ;
65import Glyphs from './Glyphs' ;
76import Line from './Line' ;
87import { CurveType , GlyphType } from './models' ;
8+ import { useEventHandler } from './utils' ;
99
1010interface Props {
1111 abscissas : NumArray ;
@@ -17,6 +17,9 @@ interface Props {
1717 glyphType ?: GlyphType ;
1818 glyphSize ?: number ;
1919 visible ?: boolean ;
20+ onLineClick ?: ( index : number , event : ThreeEvent < MouseEvent > ) => void ;
21+ onLineEnter ?: ( index : number , event : ThreeEvent < PointerEvent > ) => void ;
22+ onLineLeave ?: ( index : number , event : ThreeEvent < PointerEvent > ) => void ;
2023 onDataPointClick ?: ( index : number , evt : ThreeEvent < MouseEvent > ) => void ;
2124 onDataPointEnter ?: ( index : number , evt : ThreeEvent < PointerEvent > ) => void ;
2225 onDataPointLeave ?: ( index : number , evt : ThreeEvent < PointerEvent > ) => void ;
@@ -34,45 +37,15 @@ function DataCurve(props: Props) {
3437 glyphType = GlyphType . Cross ,
3538 glyphSize = 6 ,
3639 visible = true ,
40+ onLineClick,
41+ onLineEnter,
42+ onLineLeave,
3743 onDataPointClick,
3844 onDataPointEnter,
3945 onDataPointLeave,
4046 ignoreValue,
4147 } = props ;
4248
43- const handleClick = useCallback (
44- ( evt : ThreeEvent < MouseEvent > ) => {
45- const { index } = evt ;
46-
47- if ( onDataPointClick && index !== undefined ) {
48- onDataPointClick ( index , evt ) ;
49- }
50- } ,
51- [ onDataPointClick ] ,
52- ) ;
53-
54- const handlePointerEnter = useCallback (
55- ( evt : ThreeEvent < PointerEvent > ) => {
56- const { index } = evt ;
57-
58- if ( onDataPointEnter && index !== undefined ) {
59- onDataPointEnter ( index , evt ) ;
60- }
61- } ,
62- [ onDataPointEnter ] ,
63- ) ;
64-
65- const handlePointerLeave = useCallback (
66- ( evt : ThreeEvent < PointerEvent > ) => {
67- const { index } = evt ;
68-
69- if ( onDataPointLeave && index !== undefined ) {
70- onDataPointLeave ( index , evt ) ;
71- }
72- } ,
73- [ onDataPointLeave ] ,
74- ) ;
75-
7649 return (
7750 < >
7851 < Line
@@ -81,6 +54,9 @@ function DataCurve(props: Props) {
8154 color = { color }
8255 ignoreValue = { ignoreValue }
8356 visible = { curveType !== CurveType . GlyphsOnly && visible }
57+ onClick = { useEventHandler ( onLineClick ) }
58+ onPointerEnter = { useEventHandler ( onLineEnter ) }
59+ onPointerLeave = { useEventHandler ( onLineLeave ) }
8460 />
8561 < Glyphs
8662 abscissas = { abscissas }
@@ -90,9 +66,9 @@ function DataCurve(props: Props) {
9066 size = { glyphSize }
9167 ignoreValue = { ignoreValue }
9268 visible = { curveType !== CurveType . LineOnly && visible }
93- onClick = { onDataPointClick && handleClick }
94- onPointerEnter = { onDataPointEnter && handlePointerEnter }
95- onPointerLeave = { onDataPointLeave && handlePointerLeave }
69+ onClick = { useEventHandler ( onDataPointClick ) }
70+ onPointerEnter = { useEventHandler ( onDataPointEnter ) }
71+ onPointerLeave = { useEventHandler ( onDataPointLeave ) }
9672 />
9773 { errors && (
9874 < ErrorBars
0 commit comments