Skip to content

Commit a509b62

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

1 file changed

Lines changed: 58 additions & 16 deletions

File tree

src/components/shared/chart/Viewport.js

Lines changed: 58 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,9 @@ 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+
this._removePointerListeners();
806848
this.setState({
807849
isDragging: false,
808850
});
@@ -817,22 +859,21 @@ export const withChartViewport: WithChartViewport<*, *> =
817859
if (this._container) {
818860
const container = this._container;
819861
getResizeObserverWrapper().subscribe(container, this._setSize);
820-
container.addEventListener('wheel', this._mouseWheelListener, {
862+
container.addEventListener('wheel', this._pointerWheelListener, {
821863
passive: false,
822864
});
823865
}
824866
}
825867

826868
componentWillUnmount() {
827869
window.removeEventListener('resize', this._setSizeNextFrame, false);
828-
window.removeEventListener('mousemove', this._mouseMoveListener, true);
829-
window.removeEventListener('mouseup', this._mouseUpListener, true);
830870
const container = this._container;
831871
if (container) {
832872
getResizeObserverWrapper().unsubscribe(container, this._setSize);
833-
container.removeEventListener('wheel', this._mouseWheelListener, {
873+
container.removeEventListener('wheel', this._pointerWheelListener, {
834874
passive: false,
835875
});
876+
this._removePointerListeners();
836877
}
837878
}
838879

@@ -882,7 +923,8 @@ export const withChartViewport: WithChartViewport<*, *> =
882923
return (
883924
<div
884925
className={viewportClassName}
885-
onMouseDown={this._mouseDownListener}
926+
style={{ 'touch-action': 'none' }}
927+
onPointerDown={this._pointerDownListener}
886928
onKeyDown={this._keyDownListener}
887929
onKeyUp={this._keyUpListener}
888930
onBlur={this._onBlur}

0 commit comments

Comments
 (0)