170 lines
4.3 KiB
TypeScript

import {
Component,
OnInit,
Input,
EventEmitter,
Output,
ViewChild,
ViewChildren,
QueryList
} from '@angular/core';
import { Info, EventType } 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 { SessionStorageService } from '@ucap-webmessenger/web-storage';
import { FileInfo } from '../models/file-info.json';
import { DatePipe } from '@angular/common';
import { MatMenu, MatMenuTrigger } from '@angular/material';
@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()
userInfos?: UserInfo[];
@Input()
sessionVerInfo: VersionInfo2Response;
@Output()
massDetail = new EventEmitter<number>();
@Output()
imageViewer = new EventEmitter<FileInfo>();
@Output()
save = new EventEmitter<{ fileInfo: FileInfo; type: string }>();
@ViewChildren(MatMenuTrigger) menuTriggerList: QueryList<MatMenuTrigger>;
@ViewChild('messageContextMenu', { static: true })
messageContextMenu: MatMenu;
messageContextMenuPosition = { x: '0px', y: '0px' };
EventType = EventType;
profileImageRoot: string;
constructor(
private logger: NGXLogger,
private sessionStorageService: SessionStorageService,
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 this.profileImageRoot + userInfo[0].profileImageFile;
}
return '';
}
/**
* 정보성 Event 인지 판단.
* @description 정보성 event 일 경우 프로필, 일시 를 표현하지 않는다.
*/
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;
}
isCopyableMessage(eventType: EventType): boolean {
return (
EventType.Character === eventType || EventType.Translation === eventType
);
}
isRecalledMessage(eventType: EventType): boolean {
return EventType.RecalledMessage === eventType;
}
isMine(message: Info): boolean {
return message.senderSeq === this.loginRes.userSeq;
}
/** [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, eventType: EventType, message: Info) {
event.preventDefault();
this.messageContextMenu.focusFirstItem('mouse');
this.messageContextMenuPosition.x = event.clientX + 'px';
this.messageContextMenuPosition.y = event.clientY + 'px';
const messageContextMenuTrigger = this.menuTriggerList.toArray()[0];
messageContextMenuTrigger.menuData = { eventType, message };
messageContextMenuTrigger.openMenu();
}
}