@@ -11,16 +11,18 @@ interface IProps {
11
11
height ?: number ,
12
12
minimumAdjust : number ,
13
13
maximumAdjust ?: number ,
14
- onResize : ( adjustedSize : number ) => void
14
+ onResize : ( adjustedSize : number ) => void ,
15
+ onResizeStart ?: ( ) => void ,
16
+ onResizeEnd ?: ( ) => void
15
17
}
16
18
17
19
export const Resizable : React . FC < IProps > = ( props ) => {
18
20
const resize = ( originalX : number , originalY : number , x : number , y : number ) => {
19
21
const adjustmentX =
20
- Math . min (
21
- Math . max ( props . type === ResizeType . Left ? originalX - x : x - originalX , props . minimumAdjust ) ,
22
- props . maximumAdjust || 999999
23
- ) ;
22
+ Math . min (
23
+ Math . max ( props . type === ResizeType . Left ? originalX - x : x - originalX , props . minimumAdjust ) ,
24
+ props . maximumAdjust || 999999
25
+ ) ;
24
26
const adjustmentY =
25
27
Math . min (
26
28
Math . max ( props . type === ResizeType . Top ? originalY - y : y - originalY , props . minimumAdjust ) ,
@@ -36,27 +38,45 @@ export const Resizable : React.FC<IProps> = (props) => {
36
38
const startTouchResize = ( e : React . TouchEvent < HTMLDivElement > ) => {
37
39
const originalTouchX = props . type === ResizeType . Left ? e . touches [ 0 ] . pageX + props . adjustedSize : e . touches [ 0 ] . pageX - props . adjustedSize ;
38
40
const originalTouchY = props . type === ResizeType . Top ? e . touches [ 0 ] . pageY + props . adjustedSize : e . touches [ 0 ] . pageY - props . adjustedSize ;
41
+ let resizing = true ;
42
+ let moved = false ;
39
43
40
- const touchResize = ( e : TouchEvent ) => resize ( originalTouchX , originalTouchY , e . touches [ 0 ] . pageX , e . touches [ 0 ] . pageY ) ;
44
+ const touchResize = ( e : TouchEvent ) => resizing && resize ( originalTouchX , originalTouchY , e . touches [ 0 ] . pageX , e . touches [ 0 ] . pageY ) ;
41
45
const debouncedTouchResize = debounce < typeof touchResize > ( touchResize , 10 ) ;
42
- const withPreventDefault = ( e : TouchEvent ) => { e . preventDefault ( ) ; e . stopImmediatePropagation ( ) ; debouncedTouchResize ( e ) ; } ;
46
+ const withPreventDefault = ( e : TouchEvent ) => { moved = true ; e . preventDefault ( ) ; e . stopImmediatePropagation ( ) ; debouncedTouchResize ( e ) ; } ;
47
+ const removeListener = ( ) => {
48
+ resizing = false ;
49
+ window . removeEventListener ( 'touchmove' , withPreventDefault ) ;
50
+ window . removeEventListener ( 'touchend' , removeListener ) ;
51
+ moved && props . onResizeEnd && props . onResizeEnd ( ) ;
52
+ } ;
43
53
window . addEventListener ( 'touchmove' , withPreventDefault ) ;
44
- window . addEventListener ( 'touchend' , ( ) => window . removeEventListener ( 'touchmove' , withPreventDefault ) ) ;
54
+ window . addEventListener ( 'touchend' , removeListener ) ;
45
55
e . preventDefault ( ) ;
46
56
e . stopPropagation ( ) ;
57
+ props . onResizeStart && props . onResizeStart ( ) ;
47
58
}
48
59
49
60
const startResize = ( e : React . MouseEvent < HTMLDivElement , MouseEvent > ) => {
50
61
const originalMouseX = props . type === ResizeType . Left ? e . pageX + props . adjustedSize : e . pageX - props . adjustedSize ;
51
62
const originalMouseY = props . type === ResizeType . Top ? e . pageY + props . adjustedSize : e . pageY - props . adjustedSize ;
63
+ let resizing = true ;
64
+ let moved = false ;
52
65
53
- const mouseResize = ( e : MouseEvent ) => resize ( originalMouseX , originalMouseY , e . pageX , e . pageY ) ;
66
+ const mouseResize = ( e : MouseEvent ) => resizing && resize ( originalMouseX , originalMouseY , e . pageX , e . pageY ) ;
54
67
const debouncedMouseResize = debounce < typeof mouseResize > ( mouseResize , 10 ) ;
55
- const withPreventDefault = ( e : MouseEvent ) => { e . preventDefault ( ) ; e . stopImmediatePropagation ( ) ; debouncedMouseResize ( e ) ; } ;
68
+ const withPreventDefault = ( e : MouseEvent ) => { moved = true ; e . preventDefault ( ) ; e . stopImmediatePropagation ( ) ; debouncedMouseResize ( e ) ; } ;
69
+ const removeListener = ( ) => {
70
+ resizing = false ;
71
+ window . removeEventListener ( 'mousemove' , withPreventDefault ) ;
72
+ window . removeEventListener ( 'mouseup' , removeListener ) ;
73
+ moved && props . onResizeEnd && props . onResizeEnd ( ) ;
74
+ } ;
56
75
window . addEventListener ( 'mousemove' , withPreventDefault ) ;
57
- window . addEventListener ( 'mouseup' , ( ) => window . removeEventListener ( 'mousemove' , withPreventDefault ) ) ;
76
+ window . addEventListener ( 'mouseup' , removeListener ) ;
58
77
e . preventDefault ( ) ;
59
78
e . stopPropagation ( ) ;
79
+ props . onResizeStart && props . onResizeStart ( ) ;
60
80
}
61
81
62
82
return (
0 commit comments