From 6a6d92b1ecca1dfcf4b13f291553f2485814f730 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Thu, 8 Mar 2018 10:46:12 +0100 Subject: [PATCH] Fix infinite scroll --- client/src/app/shared/video/abstract-video-list.ts | 2 +- .../shared/video/infinite-scroller.directive.ts | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/client/src/app/shared/video/abstract-video-list.ts b/client/src/app/shared/video/abstract-video-list.ts index 16ff38558..abc9feb06 100644 --- a/client/src/app/shared/video/abstract-video-list.ts +++ b/client/src/app/shared/video/abstract-video-list.ts @@ -125,7 +125,7 @@ export abstract class AbstractVideoList implements OnInit { if (!this.pagination.totalItems) return true const maxPage = this.pagination.totalItems / this.pagination.itemsPerPage - return maxPage > this.pagination.currentPage + return maxPage > this.maxPageLoaded() } protected previousPage () { diff --git a/client/src/app/shared/video/infinite-scroller.directive.ts b/client/src/app/shared/video/infinite-scroller.directive.ts index 16e901c34..ed49a9e81 100644 --- a/client/src/app/shared/video/infinite-scroller.directive.ts +++ b/client/src/app/shared/video/infinite-scroller.directive.ts @@ -7,6 +7,7 @@ import 'rxjs/add/operator/map' import 'rxjs/add/operator/startWith' import 'rxjs/add/operator/throttleTime' import { fromEvent } from 'rxjs/observable/fromEvent' +import 'rxjs/add/operator/share' @Directive({ selector: '[myInfiniteScroller]' @@ -36,10 +37,14 @@ export class InfiniteScrollerDirective implements OnInit { } initialize () { + // Emit the last value + const throttleOptions = { leading: false, trailing: true } + const scrollObservable = fromEvent(window, 'scroll') .startWith(true) - .throttleTime(200) + .throttleTime(200, undefined, throttleOptions) .map(() => ({ current: window.scrollY, maximumScroll: document.body.clientHeight - window.innerHeight })) + .share() // Scroll Down scrollObservable @@ -51,7 +56,6 @@ export class InfiniteScrollerDirective implements OnInit { return res }) .filter(({ current, maximumScroll }) => maximumScroll <= 0 || (current / maximumScroll) > this.decimalLimit) - .distinct() .subscribe(() => this.nearOfBottom.emit()) // Scroll up @@ -66,15 +70,17 @@ export class InfiniteScrollerDirective implements OnInit { .filter(({ current, maximumScroll }) => { return current !== 0 && (1 - (current / maximumScroll)) > this.decimalLimit }) - .distinct() .subscribe(() => this.nearOfTop.emit()) // Page change scrollObservable .distinct() - .map(({ current }) => Math.max(1, Math.round((current + InfiniteScrollerDirective.PAGE_VIEW_TOP_MARGIN) / this.pageHeight))) + .map(({ current }) => this.calculateCurrentPage(current)) .distinctUntilChanged() .subscribe(res => this.pageChanged.emit(res)) } + private calculateCurrentPage (current: number) { + return Math.max(1, Math.round((current + InfiniteScrollerDirective.PAGE_VIEW_TOP_MARGIN) / this.pageHeight)) + } }