Skip to content

Commit f8fa759

Browse files
dotansimhadarkbasic
authored andcommitted
Step 6.18: Implement auto scroll
1 parent 682653e commit f8fa759

File tree

1 file changed

+45
-4
lines changed

1 file changed

+45
-4
lines changed

src/pages/messages/messages.ts

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Component, OnInit } from '@angular/core';
1+
import { Component, OnInit, OnDestroy, ElementRef } from '@angular/core';
22
import { NavParams } from 'ionic-angular';
33
import { Chat, Message, MessageType } from 'api/models';
44
import { Observable } from 'rxjs';
@@ -9,20 +9,39 @@ import { MeteorObservable } from 'meteor-rxjs';
99
selector: 'messages-page',
1010
templateUrl: 'messages.html'
1111
})
12-
export class MessagesPage implements OnInit {
12+
export class MessagesPage implements OnInit, OnDestroy {
1313
selectedChat: Chat;
1414
title: string;
1515
picture: string;
1616
messages: Observable<Message[]>;
1717
message: string = '';
18+
autoScroller: MutationObserver;
19+
scrollOffset = 0;
1820

19-
constructor(navParams: NavParams) {
21+
constructor(
22+
navParams: NavParams,
23+
private el: ElementRef
24+
) {
2025
this.selectedChat = <Chat>navParams.get('chat');
2126
this.title = this.selectedChat.title;
2227
this.picture = this.selectedChat.picture;
2328
}
2429

30+
private get messagesPageContent(): Element {
31+
return this.el.nativeElement.querySelector('.messages-page-content');
32+
}
33+
34+
private get messagesList(): Element {
35+
return this.messagesPageContent.querySelector('.messages');
36+
}
37+
38+
private get scroller(): Element {
39+
return this.messagesList.querySelector('.scroll-content');
40+
}
41+
2542
ngOnInit() {
43+
this.autoScroller = this.autoScroll();
44+
2645
let isEven = false;
2746

2847
this.messages = Messages.find(
@@ -38,8 +57,30 @@ export class MessagesPage implements OnInit {
3857
});
3958
}
4059

60+
ngOnDestroy() {
61+
this.autoScroller.disconnect();
62+
}
63+
64+
autoScroll(): MutationObserver {
65+
const autoScroller = new MutationObserver(this.scrollDown.bind(this));
66+
67+
autoScroller.observe(this.messagesList, {
68+
childList: true,
69+
subtree: true
70+
});
71+
72+
return autoScroller;
73+
}
74+
75+
scrollDown(): void {
76+
// Scroll down and apply specified offset
77+
this.scroller.scrollTop = this.scroller.scrollHeight - this.scrollOffset;
78+
// Zero offset for next invocation
79+
this.scrollOffset = 0;
80+
}
81+
4182
onInputKeypress({ keyCode }: KeyboardEvent): void {
42-
if (keyCode.charCode === 13) {
83+
if (keyCode === 13) {
4384
this.sendTextMessage();
4485
}
4586
}

0 commit comments

Comments
 (0)