Skip to content

Commit ab24d8e

Browse files
committed
Use pointer events in Viewport.
1 parent 2fea726 commit ab24d8e

File tree

1 file changed

+63
-16
lines changed

1 file changed

+63
-16
lines changed

src/components/shared/chart/Viewport.js

Lines changed: 63 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)