@@ -428,7 +428,7 @@ export const withChartViewport: WithChartViewport<*, *> =
428428 //
429429 // [1] https://developer.chrome.com/blog/scrolling-intervention-2/
430430 // [2] https://bugzilla.mozilla.org/show_bug.cgi?id=1526725
431- _mouseWheelListener = ( event : WheelEvent ) => {
431+ _pointerWheelListener = ( event : WheelEvent ) => {
432432 // We handle the wheel event, so disable the browser's handling, such
433433 // as back/forward swiping or scrolling.
434434 event . preventDefault ( ) ;
@@ -586,19 +586,62 @@ export const withChartViewport: WithChartViewport<*, *> =
586586 ) ;
587587 } ;
588588
589- _mouseDownListener = ( event : SyntheticMouseEvent < > ) => {
589+ _pointerDownListener = ( event : SyntheticPointerEvent < > ) => {
590590 event. preventDefault ( ) ;
591- if ( this . _container ) {
592- this . _container . focus ( ) ;
593- }
594591
595- window . addEventListener ( 'mousemove' , this . _mouseMoveListener , true ) ;
596- window . addEventListener ( 'mouseup' , this . _mouseUpListener , true ) ;
592+ const container = this . _container ;
593+ if ( container ) {
594+ container . focus ( ) ;
595+ container . setPointerCapture ( ( event . pointerId :any ) ) ;
596+ container . addEventListener (
597+ 'pointermove' ,
598+ this . _pointerMoveListener ,
599+ true
600+ ) ;
601+ container . addEventListener (
602+ 'pointerup' ,
603+ this . _pointerUpListener ,
604+ true
605+ ) ;
606+ container . addEventListener (
607+ 'pointercancel' ,
608+ this . _pointerUpListener ,
609+ true
610+ ) ;
611+ }
597612 } ;
598613
599- _mouseMoveListener = ( event : MouseEvent ) => {
614+ _removePointerListeners ( ) {
615+ const container = this . _container ;
616+ if ( container ) {
617+ container . removeEventListener (
618+ 'pointermove' ,
619+ this . _pointerMoveListener ,
620+ true
621+ ) ;
622+ container . removeEventListener (
623+ 'pointerup' ,
624+ this . _pointerUpListener ,
625+ true
626+ ) ;
627+ container . removeEventListener (
628+ 'pointercancel' ,
629+ this . _pointerUpListener ,
630+ true
631+ ) ;
632+ }
633+ }
634+
635+ _pointerMoveListener = ( event : PointerEvent ) => {
600636 event . preventDefault ( ) ;
601637
638+ if ( ! event . isPrimary ) {
639+ // If two (or more) fingers are dragging, ignore everything but the
640+ // primary, so that our delta computation below doesn't get confused.
641+ // TODO: Implement pinch zooming
642+ return ;
643+ }
644+
602645 let { _dragX : dragX , _dragY : dragY } = this ;
603646 if ( ! this . state . isDragging ) {
604647 dragX = event . clientX ;
@@ -799,10 +842,14 @@ export const withChartViewport: WithChartViewport<*, *> =
799842 }
800843 } ;
801844
802- _mouseUpListener = ( event : MouseEvent ) = > {
845+ _pointerUpListener = ( event : PointerEvent ) = > {
803846 event . preventDefault ( ) ;
804- window . removeEventListener ( 'mousemove' , this . _mouseMoveListener , true ) ;
805- window . removeEventListener ( 'mouseup' , this . _mouseUpListener , true ) ;
847+ if ( ! event . isPrimary ) {
848+ // Keep dragging if the primary pointer is still down.
849+ return ;
850+ }
851+
852+ this . _removePointerListeners ( ) ;
806853 this . setState ( {
807854 isDragging : false ,
808855 } ) ;
@@ -817,22 +864,21 @@ export const withChartViewport: WithChartViewport<*, *> =
817864 if ( this . _container ) {
818865 const container = this . _container ;
819866 getResizeObserverWrapper ( ) . subscribe ( container , this . _setSize ) ;
820- container . addEventListener ( 'wheel' , this . _mouseWheelListener , {
867+ container . addEventListener ( 'wheel' , this . _pointerWheelListener , {
821868 passive : false ,
822869 } ) ;
823870 }
824871 }
825872
826873 componentWillUnmount ( ) {
827874 window . removeEventListener ( 'resize' , this . _setSizeNextFrame , false ) ;
828- window . removeEventListener ( 'mousemove' , this . _mouseMoveListener , true ) ;
829- window . removeEventListener ( 'mouseup' , this . _mouseUpListener , true ) ;
830875 const container = this . _container ;
831876 if ( container ) {
832877 getResizeObserverWrapper ( ) . unsubscribe ( container , this . _setSize ) ;
833- container . removeEventListener ( 'wheel' , this . _mouseWheelListener , {
878+ container . removeEventListener ( 'wheel' , this . _pointerWheelListener , {
834879 passive : false ,
835880 } ) ;
881+ this . _removePointerListeners ( ) ;
836882 }
837883 }
838884
@@ -882,7 +928,8 @@ export const withChartViewport: WithChartViewport<*, *> =
882928 return (
883929 < div
884930 className = { viewportClassName }
885- onMouseDown = { this . _mouseDownListener }
931+ style = { { 'touch-action' : 'none' } }
932+ onPointerDown = { this . _pointerDownListener }
886933 onKeyDown = { this . _keyDownListener }
887934 onKeyUp = { this . _keyUpListener }
888935 onBlur = { this . _onBlur }
0 commit comments