@@ -18,7 +18,7 @@ const startPositions: WeakMap<ImageCropElement, {startX: number; startY: number}
1818const dragStartPositions : WeakMap < ImageCropElement , { dragStartX : number ; dragStartY : number } > = new WeakMap ( )
1919const constructedElements : WeakMap < ImageCropElement , { image : HTMLImageElement ; box : HTMLElement } > = new WeakMap ( )
2020
21- function moveCropArea ( event : MouseEvent | KeyboardEvent ) {
21+ function moveCropArea ( event : TouchEvent | MouseEvent | KeyboardEvent ) {
2222 const el = event . currentTarget
2323 if ( ! ( el instanceof ImageCropElement ) ) return
2424 const { box, image} = constructedElements . get ( el ) || { }
@@ -37,10 +37,16 @@ function moveCropArea(event: MouseEvent | KeyboardEvent) {
3737 deltaX = 1
3838 }
3939 } else if ( dragStartPositions . has ( el ) && event instanceof MouseEvent ) {
40- const pos = dragStartPositions . get ( el )
41- if ( ! pos ) return
40+ const pos = dragStartPositions . get ( el ) !
4241 deltaX = event . pageX - pos . dragStartX
4342 deltaY = event . pageY - pos . dragStartY
43+ } else if ( dragStartPositions . has ( el ) && event instanceof TouchEvent ) {
44+ // Only support a single touch at a time
45+ const { pageX, pageY} = event . changedTouches [ 0 ]
46+
47+ const { dragStartX, dragStartY} = dragStartPositions . get ( el ) !
48+ deltaX = pageX - dragStartX
49+ deltaY = pageY - dragStartY
4450 }
4551
4652 if ( deltaX !== 0 || deltaY !== 0 ) {
@@ -57,10 +63,17 @@ function moveCropArea(event: MouseEvent | KeyboardEvent) {
5763 dragStartX : event . pageX ,
5864 dragStartY : event . pageY
5965 } )
66+ } else if ( event instanceof TouchEvent ) {
67+ // Only support a single touch at a time
68+ const { pageX, pageY} = event . changedTouches [ 0 ]
69+ dragStartPositions . set ( el , {
70+ dragStartX : pageX ,
71+ dragStartY : pageY
72+ } )
6073 }
6174}
6275
63- function updateCropArea ( event : MouseEvent | KeyboardEvent ) {
76+ function updateCropArea ( event : TouchEvent | MouseEvent | KeyboardEvent ) {
6477 const target = event . target
6578 if ( ! ( target instanceof HTMLElement ) ) return
6679
@@ -84,12 +97,17 @@ function updateCropArea(event: MouseEvent | KeyboardEvent) {
8497 if ( ! pos ) return
8598 deltaX = event . pageX - pos . startX - rect . left - window . pageXOffset
8699 deltaY = event . pageY - pos . startY - rect . top - window . pageYOffset
100+ } else if ( event instanceof TouchEvent ) {
101+ const pos = startPositions . get ( el )
102+ if ( ! pos ) return
103+ deltaX = event . changedTouches [ 0 ] . pageX - pos . startX - rect . left - window . pageXOffset
104+ deltaY = event . changedTouches [ 0 ] . pageY - pos . startY - rect . top - window . pageYOffset
87105 }
88106
89107 if ( deltaX && deltaY ) updateDimensions ( el , deltaX , deltaY , ! ( event instanceof KeyboardEvent ) )
90108}
91109
92- function startUpdate ( event : MouseEvent ) {
110+ function startUpdate ( event : TouchEvent | MouseEvent ) {
93111 const currentTarget = event . currentTarget
94112 if ( ! ( currentTarget instanceof HTMLElement ) ) return
95113
@@ -105,6 +123,7 @@ function startUpdate(event: MouseEvent) {
105123 const direction = target . getAttribute ( 'data-direction' ) || ''
106124 // Change crop area
107125 el . addEventListener ( 'mousemove' , updateCropArea )
126+ el . addEventListener ( 'touchmove' , updateCropArea )
108127 if ( [ 'nw' , 'se' ] . indexOf ( direction ) >= 0 ) el . classList . add ( 'nwse' )
109128 if ( [ 'ne' , 'sw' ] . indexOf ( direction ) >= 0 ) el . classList . add ( 'nesw' )
110129 startPositions . set ( el , {
@@ -115,6 +134,7 @@ function startUpdate(event: MouseEvent) {
115134 } else {
116135 // Move crop area
117136 el . addEventListener ( 'mousemove' , moveCropArea )
137+ el . addEventListener ( 'touchmove' , moveCropArea )
118138 }
119139}
120140
@@ -164,14 +184,16 @@ function setInitialPosition(el: ImageCropElement) {
164184 updateDimensions ( el , side , side )
165185}
166186
167- function stopUpdate ( event : MouseEvent ) {
187+ function stopUpdate ( event : TouchEvent | MouseEvent ) {
168188 const el = event . currentTarget
169189 if ( ! ( el instanceof ImageCropElement ) ) return
170190
171191 dragStartPositions . delete ( el )
172192 el . classList . remove ( 'nwse' , 'nesw' )
173193 el . removeEventListener ( 'mousemove' , updateCropArea )
174194 el . removeEventListener ( 'mousemove' , moveCropArea )
195+ el . removeEventListener ( 'touchmove' , updateCropArea )
196+ el . removeEventListener ( 'touchmove' , moveCropArea )
175197}
176198
177199interface Result {
@@ -208,8 +230,10 @@ class ImageCropElement extends HTMLElement {
208230
209231 image . addEventListener ( 'load' , imageReady )
210232 this . addEventListener ( 'mouseleave' , stopUpdate )
233+ this . addEventListener ( 'touchend' , stopUpdate )
211234 this . addEventListener ( 'mouseup' , stopUpdate )
212235 box . addEventListener ( 'mousedown' , startUpdate )
236+ box . addEventListener ( 'touchstart' , startUpdate )
213237 this . addEventListener ( 'keydown' , moveCropArea )
214238 this . addEventListener ( 'keydown' , updateCropArea )
215239
0 commit comments