@@ -11,16 +11,18 @@ interface IProps {
1111 height ?: number ,
1212 minimumAdjust : number ,
1313 maximumAdjust ?: number ,
14- onResize : ( adjustedSize : number ) => void
14+ onResize : ( adjustedSize : number ) => void ,
15+ onResizeStart ?: ( ) => void ,
16+ onResizeEnd ?: ( ) => void
1517}
1618
1719export const Resizable : React . FC < IProps > = ( props ) => {
1820 const resize = ( originalX : number , originalY : number , x : number , y : number ) => {
1921 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+ ) ;
2426 const adjustmentY =
2527 Math . min (
2628 Math . max ( props . type === ResizeType . Top ? originalY - y : y - originalY , props . minimumAdjust ) ,
@@ -36,27 +38,45 @@ export const Resizable : React.FC<IProps> = (props) => {
3638 const startTouchResize = ( e : React . TouchEvent < HTMLDivElement > ) => {
3739 const originalTouchX = props . type === ResizeType . Left ? e . touches [ 0 ] . pageX + props . adjustedSize : e . touches [ 0 ] . pageX - props . adjustedSize ;
3840 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 ;
3943
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 ) ;
4145 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+ } ;
4353 window . addEventListener ( 'touchmove' , withPreventDefault ) ;
44- window . addEventListener ( 'touchend' , ( ) => window . removeEventListener ( 'touchmove' , withPreventDefault ) ) ;
54+ window . addEventListener ( 'touchend' , removeListener ) ;
4555 e . preventDefault ( ) ;
4656 e . stopPropagation ( ) ;
57+ props . onResizeStart && props . onResizeStart ( ) ;
4758 }
4859
4960 const startResize = ( e : React . MouseEvent < HTMLDivElement , MouseEvent > ) => {
5061 const originalMouseX = props . type === ResizeType . Left ? e . pageX + props . adjustedSize : e . pageX - props . adjustedSize ;
5162 const originalMouseY = props . type === ResizeType . Top ? e . pageY + props . adjustedSize : e . pageY - props . adjustedSize ;
63+ let resizing = true ;
64+ let moved = false ;
5265
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 ) ;
5467 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+ } ;
5675 window . addEventListener ( 'mousemove' , withPreventDefault ) ;
57- window . addEventListener ( 'mouseup' , ( ) => window . removeEventListener ( 'mousemove' , withPreventDefault ) ) ;
76+ window . addEventListener ( 'mouseup' , removeListener ) ;
5877 e . preventDefault ( ) ;
5978 e . stopPropagation ( ) ;
79+ props . onResizeStart && props . onResizeStart ( ) ;
6080 }
6181
6282 return (
0 commit comments