]> cat aescling's git repositories - mastodon.git/commitdiff
Identify manual scrolling to cancel scroll to top reset on mouse idle (#9245)
authorLes Orchard <me@lmorchard.com>
Fri, 9 Nov 2018 17:06:43 +0000 (12:06 -0500)
committerEugen Rochko <eugen@zeonfederated.com>
Fri, 9 Nov 2018 17:06:43 +0000 (18:06 +0100)
app/javascript/mastodon/components/scrollable_list.js

index 91a895bce5e97eb2ba111a5917a1af5594f4fc67..7551d0b1fe4202e98b37945d8ac5329c2cd2dbb9 100644 (file)
@@ -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);
     }
   }