@@ -6,7 +6,7 @@ import { MeteorObservable } from 'meteor-rxjs';
6
6
import * as moment from 'moment' ;
7
7
import * as _ from 'lodash' ;
8
8
import { MessagesOptionsComponent } from './messages-options' ;
9
- import { Subscription } from 'rxjs' ;
9
+ import { Subscription , Observable , Subscriber } from 'rxjs' ;
10
10
11
11
@Component ( {
12
12
selector : 'messages-page' ,
@@ -51,6 +51,22 @@ export class MessagesPage implements OnInit, OnDestroy {
51
51
ngOnInit ( ) {
52
52
this . autoScroller = this . autoScroll ( ) ;
53
53
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
+ } ) ;
54
70
}
55
71
56
72
ngOnDestroy ( ) {
@@ -86,6 +102,29 @@ export class MessagesPage implements OnInit, OnDestroy {
86
102
} ) ;
87
103
}
88
104
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
+
89
128
showOptions ( ) : void {
90
129
const popover = this . popoverCtrl . create ( MessagesOptionsComponent , {
91
130
chat : this . selectedChat
0 commit comments