Throttle infinite scroller
authorChocobozzz <me@florianbigard.com>
Thu, 22 Feb 2018 15:41:02 +0000 (16:41 +0100)
committerChocobozzz <me@florianbigard.com>
Thu, 22 Feb 2018 15:41:02 +0000 (16:41 +0100)
client/src/app/shared/misc/utils.ts
client/src/app/shared/video/infinite-scroller.directive.ts

index 64bc69b0daf95a923c874017f7568e504bc695ab..d520b1a7b8f789a145c2166ef0bd9c61e04b5a7b 100644 (file)
@@ -59,14 +59,6 @@ function immutableAssign <A, B> (target: A, source: B) {
   return Object.assign({}, target, source)
 }
 
-function isInSmallView () {
-  return window.innerWidth < 600
-}
-
-function isInMobileView () {
-  return window.innerWidth < 500
-}
-
 // Thanks: https://gist.github.com/ghinda/8442a57f22099bdb2e34
 function objectToFormData (obj: any, form?: FormData, namespace?: string) {
   let fd = form || new FormData()
@@ -94,6 +86,18 @@ function lineFeedToHtml (obj: object, keyToNormalize: string) {
   })
 }
 
+// Try to cache a little bit window.innerWidth
+let windowInnerWidth = window.innerWidth
+setInterval(() => windowInnerWidth = window.innerWidth, 500)
+
+function isInSmallView () {
+  return windowInnerWidth < 600
+}
+
+function isInMobileView () {
+  return windowInnerWidth < 500
+}
+
 export {
   viewportHeight,
   getParameterByName,
index 1da02f60ffef497cb6e3d5a073c4fc5fdc4b110f..16e901c34f1208d7d978ffd9efbf7f6129547e4d 100644 (file)
@@ -5,6 +5,7 @@ import 'rxjs/add/operator/distinctUntilChanged'
 import 'rxjs/add/operator/filter'
 import 'rxjs/add/operator/map'
 import 'rxjs/add/operator/startWith'
+import 'rxjs/add/operator/throttleTime'
 import { fromEvent } from 'rxjs/observable/fromEvent'
 
 @Directive({
@@ -37,6 +38,7 @@ export class InfiniteScrollerDirective implements OnInit {
   initialize () {
     const scrollObservable = fromEvent(window, 'scroll')
       .startWith(true)
+      .throttleTime(200)
       .map(() => ({ current: window.scrollY, maximumScroll: document.body.clientHeight - window.innerHeight }))
 
     // Scroll Down
@@ -49,7 +51,6 @@ export class InfiniteScrollerDirective implements OnInit {
         return res
       })
       .filter(({ current, maximumScroll }) => maximumScroll <= 0 || (current / maximumScroll) > this.decimalLimit)
-      .debounceTime(200)
       .distinct()
       .subscribe(() => this.nearOfBottom.emit())
 
@@ -65,13 +66,11 @@ export class InfiniteScrollerDirective implements OnInit {
       .filter(({ current, maximumScroll }) => {
         return current !== 0 && (1 - (current / maximumScroll)) > this.decimalLimit
       })
-      .debounceTime(200)
       .distinct()
       .subscribe(() => this.nearOfTop.emit())
 
     // Page change
     scrollObservable
-      .debounceTime(500)
       .distinct()
       .map(({ current }) => Math.max(1, Math.round((current + InfiniteScrollerDirective.PAGE_VIEW_TOP_MARGIN) / this.pageHeight)))
       .distinctUntilChanged()