1
1
import { type IgnoreValue , type NumArray } from '@h5web/shared/vis-models' ;
2
2
import { type ThreeEvent } from '@react-three/fiber' ;
3
- import { useCallback } from 'react' ;
4
3
5
4
import ErrorBars from './ErrorBars' ;
6
5
import Glyphs from './Glyphs' ;
7
6
import Line from './Line' ;
8
7
import { CurveType , GlyphType } from './models' ;
8
+ import { useEventHandler } from './utils' ;
9
9
10
10
interface Props {
11
11
abscissas : NumArray ;
@@ -17,6 +17,9 @@ interface Props {
17
17
glyphType ?: GlyphType ;
18
18
glyphSize ?: number ;
19
19
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 ;
20
23
onDataPointClick ?: ( index : number , evt : ThreeEvent < MouseEvent > ) => void ;
21
24
onDataPointEnter ?: ( index : number , evt : ThreeEvent < PointerEvent > ) => void ;
22
25
onDataPointLeave ?: ( index : number , evt : ThreeEvent < PointerEvent > ) => void ;
@@ -34,45 +37,15 @@ function DataCurve(props: Props) {
34
37
glyphType = GlyphType . Cross ,
35
38
glyphSize = 6 ,
36
39
visible = true ,
40
+ onLineClick,
41
+ onLineEnter,
42
+ onLineLeave,
37
43
onDataPointClick,
38
44
onDataPointEnter,
39
45
onDataPointLeave,
40
46
ignoreValue,
41
47
} = props ;
42
48
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
-
76
49
return (
77
50
< >
78
51
< Line
@@ -81,6 +54,9 @@ function DataCurve(props: Props) {
81
54
color = { color }
82
55
ignoreValue = { ignoreValue }
83
56
visible = { curveType !== CurveType . GlyphsOnly && visible }
57
+ onClick = { useEventHandler ( onLineClick ) }
58
+ onPointerEnter = { useEventHandler ( onLineEnter ) }
59
+ onPointerLeave = { useEventHandler ( onLineLeave ) }
84
60
/>
85
61
< Glyphs
86
62
abscissas = { abscissas }
@@ -90,9 +66,9 @@ function DataCurve(props: Props) {
90
66
size = { glyphSize }
91
67
ignoreValue = { ignoreValue }
92
68
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 ) }
96
72
/>
97
73
{ errors && (
98
74
< ErrorBars
0 commit comments