Skip to content

Commit b87c660

Browse files
dotansimhadarkbasic
authored andcommitted
Step 10.4: Implement actual load more logic
1 parent aa9701c commit b87c660

File tree

1 file changed

+40
-1
lines changed

1 file changed

+40
-1
lines changed

src/pages/messages/messages.ts

+40-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { MeteorObservable } from 'meteor-rxjs';
66
import * as moment from 'moment';
77
import * as _ from 'lodash';
88
import { 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

Comments
 (0)