2022-03-09 12:31:36 +01:00
|
|
|
import { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, HostListener, OnInit, ViewChild } from '@angular/core';
|
2022-01-19 17:24:11 +01:00
|
|
|
import { Subscription } from 'rxjs';
|
2022-02-02 13:44:49 +01:00
|
|
|
import { ChatMessage } from '../../../models/chat.model';
|
|
|
|
import { MenuType } from '../../../models/menu.model';
|
|
|
|
import { ChatService } from '../../../services/chat/chat.service';
|
|
|
|
import { SidenavMenuService } from '../../../services/sidenav-menu/sidenav-menu.service';
|
2022-01-19 17:24:11 +01:00
|
|
|
|
|
|
|
@Component({
|
2022-01-26 11:30:30 +01:00
|
|
|
selector: 'ov-chat-panel',
|
|
|
|
templateUrl: './chat-panel.component.html',
|
2022-02-23 12:13:28 +01:00
|
|
|
styleUrls: ['./chat-panel.component.css'],
|
|
|
|
changeDetection: ChangeDetectionStrategy.OnPush
|
2022-01-19 17:24:11 +01:00
|
|
|
})
|
2022-01-26 11:30:30 +01:00
|
|
|
export class ChatPanelComponent implements OnInit, AfterViewInit {
|
2022-01-19 17:24:11 +01:00
|
|
|
@ViewChild('chatScroll') chatScroll: ElementRef;
|
|
|
|
@ViewChild('chatInput') chatInput: ElementRef;
|
|
|
|
message: string;
|
|
|
|
messageList: ChatMessage[] = [];
|
|
|
|
isMenuOpened: boolean;
|
|
|
|
|
|
|
|
private chatMessageSubscription: Subscription;
|
|
|
|
|
2022-03-09 12:31:36 +01:00
|
|
|
constructor(private chatService: ChatService, private menuService: SidenavMenuService, private cd: ChangeDetectorRef) {}
|
2022-01-19 17:24:11 +01:00
|
|
|
|
|
|
|
@HostListener('document:keydown.escape', ['$event'])
|
|
|
|
onKeydownHandler(event: KeyboardEvent) {
|
|
|
|
if (this.menuService.isMenuOpened()) {
|
|
|
|
this.close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ngOnInit() {
|
|
|
|
this.subscribeToMessages();
|
|
|
|
}
|
|
|
|
|
|
|
|
ngAfterViewInit() {
|
|
|
|
setTimeout(() => {
|
|
|
|
this.scrollToBottom();
|
|
|
|
this.chatInput.nativeElement.focus();
|
|
|
|
}, 100);
|
|
|
|
}
|
|
|
|
|
|
|
|
ngOnDestroy(): void {
|
|
|
|
if (this.chatMessageSubscription) this.chatMessageSubscription.unsubscribe();
|
|
|
|
}
|
|
|
|
|
|
|
|
eventKeyPress(event) {
|
|
|
|
// Pressed 'Enter' key
|
|
|
|
if (event && event.keyCode === 13) {
|
|
|
|
event.preventDefault();
|
|
|
|
this.sendMessage();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
sendMessage(): void {
|
2022-02-28 12:12:16 +01:00
|
|
|
if(!!this.message) {
|
|
|
|
this.chatService.sendMessage(this.message);
|
|
|
|
this.message = '';
|
|
|
|
}
|
2022-01-19 17:24:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
scrollToBottom(): void {
|
|
|
|
setTimeout(() => {
|
|
|
|
try {
|
|
|
|
this.chatScroll.nativeElement.scrollTop = this.chatScroll.nativeElement.scrollHeight;
|
|
|
|
} catch (err) {}
|
|
|
|
}, 20);
|
|
|
|
}
|
|
|
|
|
|
|
|
close() {
|
|
|
|
this.menuService.toggleMenu(MenuType.CHAT);
|
|
|
|
}
|
|
|
|
|
|
|
|
private subscribeToMessages() {
|
|
|
|
this.chatMessageSubscription = this.chatService.messagesObs.subscribe((messages: ChatMessage[]) => {
|
|
|
|
this.messageList = messages;
|
|
|
|
if (this.menuService.isMenuOpened()) {
|
|
|
|
this.scrollToBottom();
|
2022-03-09 12:31:36 +01:00
|
|
|
this.cd.markForCheck();
|
2022-01-19 17:24:11 +01:00
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|