@@ -6,7 +6,7 @@ import { MeteorObservable } from 'meteor-rxjs';
66import * as moment from 'moment' ;
77import * as _ from 'lodash' ;
88import { MessagesOptionsComponent } from './messages-options' ;
9- import { Subscription } from 'rxjs' ;
9+ import { Subscription , Observable , Subscriber } from 'rxjs' ;
1010
1111@Component ( {
1212 selector : 'messages-page' ,
@@ -51,6 +51,22 @@ export class MessagesPage implements OnInit, OnDestroy {
5151 ngOnInit ( ) {
5252 this . autoScroller = this . autoScroll ( ) ;
5353 this . subscribeMessages ( ) ;
54+
55+ // Get total messages count in database so we can have an indication of when to
56+ // stop the auto-subscriber
57+ MeteorObservable . call ( 'countMessages' ) . subscribe ( ( messagesCount : number ) => {
58+ Observable
59+ // Chain every scroll event
60+ . fromEvent ( this . scroller , 'scroll' )
61+ // Remove the scroll listener once all messages have been fetched
62+ . takeUntil ( this . autoRemoveScrollListener ( messagesCount ) )
63+ // Filter event handling unless we're at the top of the page
64+ . filter ( ( ) => ! this . scroller . scrollTop )
65+ // Prohibit parallel subscriptions
66+ . filter ( ( ) => ! this . loadingMessages )
67+ // Invoke the messages subscription once all the requirements have been met
68+ . forEach ( ( ) => this . subscribeMessages ( ) ) ;
69+ } ) ;
5470 }
5571
5672 ngOnDestroy ( ) {
@@ -86,6 +102,29 @@ export class MessagesPage implements OnInit, OnDestroy {
86102 } ) ;
87103 }
88104
105+ // Removes the scroll listener once all messages from the past were fetched
106+ autoRemoveScrollListener < T > ( messagesCount : number ) : Observable < T > {
107+ return Observable . create ( ( observer : Subscriber < T > ) => {
108+ Messages . find ( ) . subscribe ( {
109+ next : ( messages ) => {
110+ // Once all messages have been fetched
111+ if ( messagesCount !== messages . length ) {
112+ return ;
113+ }
114+
115+ // Signal to stop listening to the scroll event
116+ observer . next ( ) ;
117+
118+ // Finish the observation to prevent unnecessary calculations
119+ observer . complete ( ) ;
120+ } ,
121+ error : ( e ) => {
122+ observer . error ( e ) ;
123+ }
124+ } ) ;
125+ } ) ;
126+ }
127+
89128 showOptions ( ) : void {
90129 const popover = this . popoverCtrl . create ( MessagesOptionsComponent , {
91130 chat : this . selectedChat
0 commit comments