@@ -9,11 +9,19 @@ import { getOffsetCoordinates, isClickOnNode } from "../utils";
9
9
export const Canvas : FC = ( ) => {
10
10
const { drawTopography } = useHandlers ( ) ;
11
11
const {
12
- state : { canvasRef, canvasOffsetX, canvasOffsetY, canvasScale, topography } ,
12
+ state : {
13
+ canvasRef,
14
+ canvasOffsetX,
15
+ canvasOffsetY,
16
+ canvasScale,
17
+ topography,
18
+ currentNode,
19
+ } ,
13
20
dispatch,
14
21
} = useGraphContext ( ) ;
15
22
const isDragging = useRef ( false ) ;
16
23
const dragStart = useRef ( { x : 0 , y : 0 } ) ;
24
+ const pointerCapture = useRef < number > ( ) ;
17
25
18
26
useEffect ( ( ) => {
19
27
const canvas = canvasRef . current ;
@@ -29,7 +37,7 @@ export const Canvas: FC = () => {
29
37
height ,
30
38
canvasScale ,
31
39
) ;
32
-
40
+
33
41
dispatch ( {
34
42
type : "SET_CANVAS_PROPS" ,
35
43
payload : {
@@ -40,17 +48,16 @@ export const Canvas: FC = () => {
40
48
} , [ ] ) ;
41
49
42
50
const handleClick = useCallback (
43
- ( ev : MouseEvent ) => {
51
+ ( ev : PointerEvent ) => {
44
52
const canvas = canvasRef . current ;
45
- if ( ! canvas || ev . target !== canvas || isDragging . current ) {
53
+ if ( ! canvas || ev . target !== canvas ) {
46
54
return ;
47
55
}
48
56
49
57
const rect = canvas . getBoundingClientRect ( ) ;
50
58
const x = ev . clientX - rect . left ;
51
59
const y = ev . clientY - rect . top ;
52
- console . log ( canvasScale ) ;
53
- const { node } = isClickOnNode (
60
+ const { node, clicked } = isClickOnNode (
54
61
x ,
55
62
y ,
56
63
topography ,
@@ -60,9 +67,11 @@ export const Canvas: FC = () => {
60
67
canvasScale ,
61
68
) ;
62
69
63
- dispatch ( { type : "SET_CURRENT_NODE" , payload : node } ) ;
70
+ if ( clicked && node ) {
71
+ dispatch ( { type : "SET_CURRENT_NODE" , payload : currentNode === node ? undefined : node } ) ;
72
+ }
64
73
} ,
65
- [ canvasScale , canvasOffsetX , canvasOffsetY ] ,
74
+ [ canvasScale , currentNode , canvasOffsetX , canvasOffsetY ] ,
66
75
) ;
67
76
68
77
const handleWheel = useCallback (
@@ -95,17 +104,19 @@ export const Canvas: FC = () => {
95
104
[ canvasOffsetX , canvasOffsetY ] ,
96
105
) ;
97
106
98
- const handleMouseDown = useCallback ( ( ev : MouseEvent ) => {
107
+ const handlePointerDown = useCallback ( ( ev : PointerEvent ) => {
99
108
const canvas = canvasRef . current ;
100
- if ( ! canvas || ev . target !== canvas ) {
109
+ if ( ! canvas || ev . target !== canvas || ev . button !== 0 ) {
101
110
return ;
102
111
}
103
112
104
113
isDragging . current = true ;
114
+ canvas . setPointerCapture ( ev . pointerId ) ;
115
+ pointerCapture . current = ev . pointerId ;
105
116
dragStart . current = { x : ev . clientX , y : ev . clientY } ;
106
117
} , [ ] ) ;
107
118
108
- const handleMouseMove = useCallback ( ( ev : MouseEvent ) => {
119
+ const handlePointerMove = useCallback ( ( ev : PointerEvent ) => {
109
120
const canvas = canvasRef . current ;
110
121
if ( ! canvas || ev . target !== canvas || ! isDragging . current ) {
111
122
return ;
@@ -129,40 +140,45 @@ export const Canvas: FC = () => {
129
140
dragStart . current = { x : ev . clientX , y : ev . clientY } ;
130
141
} , [ ] ) ;
131
142
132
- const handleMouseUp = useCallback ( ( ev : MouseEvent ) => {
143
+ const handlePointerUp = useCallback ( ( ev : PointerEvent ) => {
133
144
const canvas = canvasRef . current ;
134
- if ( ! canvas || ev . target !== canvas ) {
145
+ if ( ! canvas || ev . target !== canvas || ev . button !== 0 ) {
135
146
return ;
136
147
}
137
148
138
149
isDragging . current = false ;
150
+ pointerCapture . current = undefined ;
151
+ canvas . releasePointerCapture ( ev . pointerId ) ;
139
152
} , [ ] ) ;
140
153
141
154
useEffect ( ( ) => {
142
155
drawTopography ( ) ;
143
-
144
- document . addEventListener ( "mousedown" , handleMouseDown ) ;
145
- document . addEventListener ( "mousemove" , handleMouseMove ) ;
146
- document . addEventListener ( "mouseup" , handleMouseUp ) ;
147
- document . addEventListener ( "click" , handleClick ) ;
148
- document . addEventListener ( "wheel" , handleWheel ) ;
156
+
157
+ const canvas = canvasRef . current ;
158
+ if ( ! canvas ) {
159
+ return ;
160
+ }
161
+
162
+ canvas . addEventListener ( "pointerdown" , handlePointerDown ) ;
163
+ canvas . addEventListener ( "pointermove" , handlePointerMove ) ;
164
+ canvas . addEventListener ( "pointerup" , handlePointerUp ) ;
165
+ canvas . addEventListener ( "pointerup" , handleClick ) ;
166
+ canvas . addEventListener ( "wheel" , handleWheel ) ;
149
167
150
168
const redraw = debounce ( drawTopography , 100 ) ;
151
169
document . addEventListener ( "resize" , redraw ) ;
152
170
153
171
return ( ) => {
154
172
document . removeEventListener ( "resize" , redraw ) ;
155
- document . removeEventListener ( "mousedown " , handleMouseDown ) ;
156
- document . removeEventListener ( "mousemove " , handleMouseMove ) ;
157
- document . removeEventListener ( "mouseup " , handleMouseUp ) ;
158
- document . removeEventListener ( "click " , handleClick ) ;
159
- document . removeEventListener ( "wheel" , handleWheel ) ;
173
+ canvas . removeEventListener ( "pointerdown " , handlePointerDown ) ;
174
+ canvas . removeEventListener ( "pointermove " , handlePointerMove ) ;
175
+ canvas . removeEventListener ( "pointerup " , handlePointerUp ) ;
176
+ canvas . removeEventListener ( "pointerup " , handleClick ) ;
177
+ canvas . removeEventListener ( "wheel" , handleWheel ) ;
160
178
} ;
161
179
} , [ drawTopography , handleClick , handleWheel ] ) ;
162
180
163
181
return (
164
- < div className = "h-[80vh] border-2 border-gray-200 rounded mb-8 w-2/3" >
165
- < canvas ref = { canvasRef } />
166
- </ div >
182
+ < canvas ref = { canvasRef } />
167
183
) ;
168
184
} ;
0 commit comments