1- import { Component , OnInit } from '@angular/core' ;
1+ import { Component , OnInit , OnDestroy , ElementRef } from '@angular/core' ;
22import { NavParams } from 'ionic-angular' ;
33import { Chat , Message , MessageType } from 'api/models' ;
44import { 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