Identify manual scrolling to cancel scroll to top reset on mouse idle (#9245)
parent
3472950cea
commit
59ecfbd28c
|
@ -59,6 +59,13 @@ export default class ScrollableList extends PureComponent {
|
|||
} else if (this.props.onScroll) {
|
||||
this.props.onScroll();
|
||||
}
|
||||
|
||||
if (!this.lastScrollWasSynthetic) {
|
||||
// If the last scroll wasn't caused by setScrollTop(), assume it was
|
||||
// intentional and cancel any pending scroll reset on mouse idle
|
||||
this.scrollToTopOnMouseIdle = false;
|
||||
}
|
||||
this.lastScrollWasSynthetic = false;
|
||||
}
|
||||
}, 150, {
|
||||
trailing: true,
|
||||
|
@ -66,8 +73,16 @@ export default class ScrollableList extends PureComponent {
|
|||
|
||||
mouseIdleTimer = null;
|
||||
mouseMovedRecently = false;
|
||||
lastScrollWasSynthetic = false;
|
||||
scrollToTopOnMouseIdle = false;
|
||||
|
||||
setScrollTop = newScrollTop => {
|
||||
if (this.node.scrollTop !== newScrollTop) {
|
||||
this.lastScrollWasSynthetic = true;
|
||||
this.node.scrollTop = newScrollTop;
|
||||
}
|
||||
};
|
||||
|
||||
clearMouseIdleTimer = () => {
|
||||
if (this.mouseIdleTimer === null) {
|
||||
return;
|
||||
|
@ -99,7 +114,7 @@ export default class ScrollableList extends PureComponent {
|
|||
|
||||
handleMouseIdle = () => {
|
||||
if (this.scrollToTopOnMouseIdle) {
|
||||
this.node.scrollTop = 0;
|
||||
this.setScrollTop(0);
|
||||
}
|
||||
|
||||
this.mouseMovedRecently = false;
|
||||
|
@ -132,11 +147,7 @@ export default class ScrollableList extends PureComponent {
|
|||
// Reset the scroll position when a new child comes in in order not to
|
||||
// jerk the scrollbar around if you're already scrolled down the page.
|
||||
if (snapshot !== null) {
|
||||
const newScrollTop = this.node.scrollHeight - snapshot;
|
||||
|
||||
if (this.node.scrollTop !== newScrollTop) {
|
||||
this.node.scrollTop = newScrollTop;
|
||||
}
|
||||
this.setScrollTop(this.node.scrollHeight - snapshot);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue