Skip to content

Commit e79482a

Browse files
authored
fix(scroll enablement): fix scrolling issue on scroll & mobile (#1557)
1 parent bccf03b commit e79482a

File tree

1 file changed

+35
-2
lines changed

1 file changed

+35
-2
lines changed

packages/base/src/delegate/ScrollEnablement.js

+35-2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,16 @@ class ScrollEnablement extends EventProvider {
1515

1616
this.isPhone = isPhone();
1717

18+
// On Android devices touchmove is thrown one more time than neccessary (together with touchend)
19+
// so we have to cache the previus coordinates in order to provide correct parameters in the
20+
// event for Android
21+
this.cachedValue = {};
22+
23+
// In components like Carousel you need to know if the user has clicked on something or swiped
24+
// in order to throw the needed event or not
25+
this.startX = 0;
26+
this.startY = 0;
27+
1828
if (this.isPhone) {
1929
containerComponent.addEventListener("touchstart", this.touchStart, { passive: true });
2030
containerComponent.addEventListener("touchmove", this.mouseMove, { passive: true });
@@ -68,6 +78,10 @@ class ScrollEnablement extends EventProvider {
6878
if (!this.isPhone) {
6979
document.addEventListener("mouseup", this.mouseUp, { passive: true });
7080
document.addEventListener("mousemove", this.mouseMove, { passive: true });
81+
} else {
82+
// Needed only on mobile
83+
this.startX = touch.pageX;
84+
this.startY = touch.pageY;
7185
}
7286

7387
this._prevDragX = this.isPhone ? touch.pageX : event.x;
@@ -94,9 +108,24 @@ class ScrollEnablement extends EventProvider {
94108
isLeft: dragX > this._prevDragX,
95109
isRight: dragX < this._prevDragX,
96110
});
111+
112+
this.cachedValue.dragX = this._prevDragX;
113+
this.cachedValue.dragY = this._prevDragY;
114+
115+
this._prevDragX = dragX;
116+
this._prevDragY = dragY;
97117
}
98118

99119
ontouchend(event) {
120+
if (this.isPhone) {
121+
const deltaX = Math.abs(event.changedTouches[0].pageX - this.startX);
122+
const deltaY = Math.abs(event.changedTouches[0].pageY - this.startY);
123+
124+
if (deltaX < 10 && deltaY < 10) {
125+
return;
126+
}
127+
}
128+
100129
if (!this._canScroll) {
101130
return;
102131
}
@@ -108,9 +137,13 @@ class ScrollEnablement extends EventProvider {
108137
container.scrollLeft += this._prevDragX - dragX;
109138
container.scrollTop += this._prevDragY - dragY;
110139

140+
const useCachedValues = dragX === this._prevDragX;
141+
const _dragX = useCachedValues ? this.cachedValue.dragX : dragX;
142+
// const _dragY = useCachedValues ? this.cachedValue.dragY : dragY; add if needed
143+
111144
this.fireEvent(touchEndEventName, {
112-
isLeft: dragX > this._prevDragX,
113-
isRight: dragX < this._prevDragX,
145+
isLeft: _dragX < this._prevDragX,
146+
isRight: _dragX > this._prevDragX,
114147
});
115148

116149
this._prevDragX = dragX;

0 commit comments

Comments
 (0)