1
+ import { useEffect } from "react" ;
1
2
import * as React from 'react' ;
2
3
import Paths , { SvgPath } from '../Paths' ;
3
4
import { CanvasPath , ExportImageType , Point } from '../types' ;
@@ -32,6 +33,7 @@ function getCanvasWithViewBox(canvas: HTMLDivElement) {
32
33
export interface CanvasProps {
33
34
paths : CanvasPath [ ] ;
34
35
isDrawing : boolean ;
36
+ scrollOnTouch : boolean ;
35
37
onPointerDown : ( point : Point ) => void ;
36
38
onPointerMove : ( point : Point ) => void ;
37
39
onPointerUp : ( ) => void ;
@@ -57,6 +59,7 @@ export const Canvas = React.forwardRef<CanvasRef, CanvasProps>((props, ref) => {
57
59
const {
58
60
paths,
59
61
isDrawing,
62
+ scrollOnTouch,
60
63
onPointerDown,
61
64
onPointerMove,
62
65
onPointerUp,
@@ -77,6 +80,7 @@ export const Canvas = React.forwardRef<CanvasRef, CanvasProps>((props, ref) => {
77
80
} = props ;
78
81
79
82
const canvasRef = React . useRef < HTMLDivElement > ( null ) ;
83
+ const currentPointerType = React . useRef < "pen" | "mouse" | "touch" | null > ( null ) ;
80
84
81
85
// Converts mouse coordinates to relative coordinate based on the absolute position of svg
82
86
const getCoordinates = (
@@ -104,8 +108,18 @@ export const Canvas = React.forwardRef<CanvasRef, CanvasProps>((props, ref) => {
104
108
const handlePointerDown = (
105
109
event : React . PointerEvent < HTMLDivElement >
106
110
) : void => {
107
- // Allow only chosen pointer type
111
+ currentPointerType . current = event . pointerType ;
108
112
113
+ if ( scrollOnTouch && event . pointerType === "touch" ) {
114
+ return ;
115
+ }
116
+
117
+ if ( event . pointerType === 'pen' ) {
118
+ event . preventDefault ( ) ;
119
+ event . stopPropagation ( ) ;
120
+ }
121
+
122
+ // Allow only chosen pointer type
109
123
if (
110
124
allowOnlyPointerType !== 'all' &&
111
125
event . pointerType !== allowOnlyPointerType
@@ -125,6 +139,10 @@ export const Canvas = React.forwardRef<CanvasRef, CanvasProps>((props, ref) => {
125
139
) : void => {
126
140
if ( ! isDrawing ) return ;
127
141
142
+ if ( scrollOnTouch && event . pointerType === "touch" ) {
143
+ return ;
144
+ }
145
+
128
146
// Allow only chosen pointer type
129
147
if (
130
148
allowOnlyPointerType !== 'all' &&
@@ -142,6 +160,9 @@ export const Canvas = React.forwardRef<CanvasRef, CanvasProps>((props, ref) => {
142
160
event : React . PointerEvent < HTMLDivElement > | PointerEvent
143
161
) : void => {
144
162
if ( event . pointerType === 'mouse' && event . button !== 0 ) return ;
163
+ if ( scrollOnTouch && event . pointerType === "touch" ) {
164
+ return ;
165
+ }
145
166
146
167
// Allow only chosen pointer type
147
168
if (
@@ -239,7 +260,7 @@ export const Canvas = React.forwardRef<CanvasRef, CanvasProps>((props, ref) => {
239
260
} ) ) ;
240
261
241
262
/* Add event listener to Mouse up and Touch up to
242
- release drawing even when point goes out of canvas */
263
+ release drawing even when point goes out of canvas */
243
264
React . useEffect ( ( ) => {
244
265
document . addEventListener ( 'pointerup' , handlePointerUp ) ;
245
266
return ( ) => {
@@ -267,18 +288,36 @@ release drawing even when point goes out of canvas */
267
288
[ [ ] ]
268
289
) ;
269
290
291
+ // avoid pen from scrolling if scrollOnTouch
292
+ useEffect ( ( ) => {
293
+ const listener = function (
294
+ this : HTMLDivElement ,
295
+ event : TouchEvent
296
+ ) : void {
297
+ if ( currentPointerType . current === "pen" ) {
298
+ event . preventDefault ( ) ;
299
+ event . stopPropagation ( ) ;
300
+ }
301
+ } ;
302
+
303
+ if ( scrollOnTouch ) {
304
+ canvasRef . current ?. addEventListener ( "touchstart" , listener , { passive : false } ) ;
305
+ }
306
+ return ( ) => canvasRef . current ?. removeEventListener ( "touchstart" , listener ) ;
307
+ } , [ ] ) ;
308
+
270
309
return (
271
310
< div
272
311
role = "presentation"
273
312
ref = { canvasRef }
274
313
className = { className }
275
314
style = { {
276
- touchAction : 'none' ,
315
+ touchAction : scrollOnTouch ? 'pan-y' : 'none' ,
277
316
width,
278
317
height,
279
318
...style ,
280
319
} }
281
- touch-action = " none"
320
+ touch-action = { scrollOnTouch ? 'pan-y' : ' none' }
282
321
onPointerDown = { handlePointerDown }
283
322
onPointerMove = { handlePointerMove }
284
323
onPointerUp = { handlePointerUp }
0 commit comments