import { Component, OnInit, Input, EventEmitter, Output, ViewEncapsulation } from '@angular/core'; import { Info, EventType, InfoResponse } from '@ucap-webmessenger/protocol-event'; import { LoginResponse, UserInfo } from '@ucap-webmessenger/protocol-authentication'; import { NGXLogger } from 'ngx-logger'; import { VersionInfo2Response } from '@ucap-webmessenger/api-public'; import { FileInfo } from '../models/file-info.json'; import { DatePipe } from '@angular/common'; @Component({ selector: 'ucap-chat-messages', templateUrl: './messages.component.html', styleUrls: ['./messages.component.scss'] }) export class MessagesComponent implements OnInit { @Input() loginRes: LoginResponse; @Input() messages: Info[]; @Input() eventInfoStatus?: InfoResponse; @Input() userInfos?: UserInfo[]; @Input() sessionVerInfo: VersionInfo2Response; @Output() massDetail = new EventEmitter(); @Output() imageViewer = new EventEmitter(); @Output() save = new EventEmitter<{ fileInfo: FileInfo; type: string }>(); @Output() contextMenu = new EventEmitter<{ event: MouseEvent; message: Info; }>(); EventType = EventType; profileImageRoot: string; constructor(private logger: NGXLogger, private datePipe: DatePipe) {} ngOnInit() { this.profileImageRoot = this.profileImageRoot || this.sessionVerInfo.profileRoot; } getUserName(seq: number): string { if (!this.userInfos) { return ''; } const userInfo: UserInfo[] = this.userInfos.filter( user => user.seq === seq ); if (!!userInfo && userInfo.length > 0) { return userInfo[0].name; } return '(알수없는 사용자)'; } getUserProfile(seq: number): string { if (!this.userInfos) { return ''; } const userInfo: UserInfo[] = this.userInfos.filter( user => user.seq === seq ); if (!!userInfo && userInfo.length > 0) { return userInfo[0].profileImageFile; } return ''; } /** * 정보성 Event 인지 판단. * @description 정보성 event 일 경우 프로필, 일시 를 표현하지 않는다. * Edit with reducers.ts / sync / updateRoomForNewEventMessage */ getIsInformation(info: Info) { if ( info.type === EventType.Join || info.type === EventType.Exit || info.type === EventType.RenameRoom || info.type === EventType.NotificationForTimerRoom || info.type === EventType.GuideForRoomTimerChanged ) { return true; } return false; } /** Date Splitter check */ getDateSplitter(curIndex: number): boolean { if (curIndex === 0) { return true; } if (curIndex > 0) { return ( this.datePipe.transform( this.messages[curIndex].sendDate, 'yyyyMMdd' ) !== this.datePipe.transform( this.messages[curIndex - 1].sendDate, 'yyyyMMdd' ) ); } return false; } /** [Event] MassTalk Detail View */ onMassDetail(value: number) { this.massDetail.emit(value); } /** [Event] Image Viewer */ onImageViewer(value: FileInfo) { this.imageViewer.emit(value); } /** [Event] Attach File Save & Save As */ onSave(value: { fileInfo: FileInfo; type: string }) { this.save.emit(value); } onContextMenuMessage(event: MouseEvent, message: Info) { this.contextMenu.emit({ event, message }); } }