255 lines
6.1 KiB
TypeScript
Raw Normal View History

2019-12-19 14:23:11 +09:00
import { Component, OnInit, Input, EventEmitter, Output } from '@angular/core';
import {
Info,
EventType,
2019-11-06 13:48:06 +09:00
InfoResponse,
EventJson,
FileEventJson
} from '@ucap-webmessenger/protocol-event';
2019-10-30 16:22:49 +09:00
import { LoginResponse } from '@ucap-webmessenger/protocol-authentication';
2019-12-19 14:23:11 +09:00
import { UserInfo, RoomInfo, RoomType } from '@ucap-webmessenger/protocol-room';
2019-10-08 15:13:01 +09:00
import { NGXLogger } from 'ngx-logger';
import { VersionInfo2Response } from '@ucap-webmessenger/api-public';
import { FileInfo } from '../models/file-info.json';
2019-10-14 17:19:13 +09:00
import { DatePipe } from '@angular/common';
2019-11-13 16:30:15 +09:00
import moment from 'moment';
import { FileDownloadItem } from '@ucap-webmessenger/api';
2019-10-08 13:31:33 +09:00
@Component({
selector: 'ucap-chat-messages',
templateUrl: './messages.component.html',
styleUrls: ['./messages.component.scss']
})
export class MessagesComponent implements OnInit {
@Input()
2019-10-08 13:31:33 +09:00
loginRes: LoginResponse;
@Input()
2019-12-19 14:23:11 +09:00
roomInfo: RoomInfo;
@Input()
set eventList(elist: Info<EventJson>[]) {
if (!!elist && elist.length > 0) {
this.firstEventSeq = elist[0].seq;
}
this.messages = elist;
}
@Input()
2019-12-23 15:23:27 +09:00
searchedList: Info<EventJson>[];
@Input()
eventInfoStatus?: InfoResponse;
@Input()
eventRemain: boolean;
@Input()
userInfos?: UserInfo[];
@Input()
sessionVerInfo: VersionInfo2Response;
@Input()
isShowUnreadCount = true;
2019-12-19 14:23:11 +09:00
@Input()
clearReadHere: boolean;
@Input()
minShowReadHere = 10;
2019-12-31 14:36:32 +09:00
@Input()
initRoomLastEventSeq: number;
@Input()
2019-12-31 14:36:32 +09:00
translationSimpleview = false;
2019-11-08 13:35:39 +09:00
@Output()
openProfile = new EventEmitter<number>();
@Output()
moreEvent = new EventEmitter<number>();
2019-10-11 18:03:01 +09:00
@Output()
massDetail = new EventEmitter<number>();
@Output()
2020-01-02 08:44:16 +09:00
massTranslationDetail = new EventEmitter<{
contents: string;
contentsType: string;
}>();
@Output()
2019-11-07 15:46:02 +09:00
fileViewer = new EventEmitter<FileEventJson>();
@Output()
save = new EventEmitter<{
fileInfo: FileEventJson;
fileDownloadItem: FileDownloadItem;
type: string;
}>();
2019-10-16 16:33:19 +09:00
@Output()
contextMenu = new EventEmitter<{
event: MouseEvent;
2019-11-06 13:48:06 +09:00
message: Info<EventJson>;
2019-10-16 16:33:19 +09:00
}>();
2019-12-19 14:23:11 +09:00
messages: Info<EventJson>[];
2019-10-08 16:41:23 +09:00
EventType = EventType;
profileImageRoot: string;
2019-11-13 16:30:15 +09:00
moment = moment;
2019-10-08 16:41:23 +09:00
2019-12-19 14:23:11 +09:00
firstEventSeq = 0;
existReadHere = false;
2019-10-28 11:15:38 +09:00
constructor(private logger: NGXLogger, private datePipe: DatePipe) {}
2019-10-08 15:13:01 +09:00
ngOnInit() {
this.profileImageRoot =
this.profileImageRoot || this.sessionVerInfo.profileRoot;
}
2019-10-30 16:22:49 +09:00
/**
* UserInfo getter
*/
getUserName(seq: number): string {
2019-10-11 15:55:27 +09:00
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 {
2019-10-11 15:55:27 +09:00
if (!this.userInfos) {
return '';
}
const userInfo: UserInfo[] = this.userInfos.filter(
user => user.seq === seq
);
if (!!userInfo && userInfo.length > 0) {
2019-10-17 16:57:37 +09:00
return userInfo[0].profileImageFile;
}
return '';
2019-10-08 15:13:01 +09:00
}
2019-12-23 15:23:27 +09:00
getEventSearched(seq: number): boolean {
return (
!!this.searchedList &&
this.searchedList.filter(event => event.seq === seq).length > 0
);
}
2019-10-11 18:03:01 +09:00
2019-11-06 13:48:06 +09:00
getUnreadCount(message: Info<EventJson>): string | number {
2019-10-30 16:22:49 +09:00
const unreadCnt = this.userInfos.filter(user => {
if (message.senderSeq === user.seq) {
// 본인 글은 unreadCount 에 포함하지 않는다.
return false;
}
return user.lastReadEventSeq < message.seq;
}).length;
return unreadCnt === 0 ? '' : unreadCnt;
}
/**
* Event .
* @description event , .
* Edit with reducers.ts / sync / updateRoomForNewEventMessage
*/
2019-11-06 13:48:06 +09:00
getIsInformation(info: Info<EventJson>) {
if (
info.type === EventType.Join ||
info.type === EventType.Exit ||
info.type === EventType.ForcedExit ||
info.type === EventType.RenameRoom ||
info.type === EventType.NotificationForTimerRoom ||
info.type === EventType.GuideForRoomTimerChanged
) {
return true;
}
return false;
}
2019-10-30 16:22:49 +09:00
/** Date Splitter show check */
2019-10-14 17:19:13 +09:00
getDateSplitter(curIndex: number): boolean {
if (curIndex === 0) {
return true;
}
if (curIndex > 0) {
return (
this.datePipe.transform(
2019-11-13 16:30:15 +09:00
moment(this.messages[curIndex].sendDate).toDate(),
2019-10-14 17:19:13 +09:00
'yyyyMMdd'
) !==
this.datePipe.transform(
2019-11-13 16:30:15 +09:00
moment(this.messages[curIndex - 1].sendDate).toDate(),
2019-10-14 17:19:13 +09:00
'yyyyMMdd'
)
);
}
return false;
}
2019-12-19 14:23:11 +09:00
getReadHere(messageIndex: number): boolean {
if (
!!this.roomInfo &&
!!this.roomInfo.lastReadEventSeq &&
this.initRoomLastEventSeq - this.roomInfo.lastReadEventSeq >
this.minShowReadHere
2019-12-19 14:23:11 +09:00
) {
if (
this.roomInfo.roomType === RoomType.Single ||
this.roomInfo.roomType === RoomType.Multi
) {
if (!this.roomInfo.isTimeRoom) {
if (
this.messages[messageIndex].seq ===
this.roomInfo.lastReadEventSeq + 1
) {
this.existReadHere = true;
return true;
}
}
}
}
return false;
}
onClickOpenProfile(event: MouseEvent, userSeq: number) {
2019-11-08 13:35:39 +09:00
event.preventDefault();
event.stopPropagation();
this.openProfile.emit(userSeq);
2019-11-08 13:35:39 +09:00
}
onClickMore(event: any) {
event.preventDefault();
event.stopPropagation();
this.moreEvent.emit(this.messages[0].seq);
}
2019-10-14 17:19:13 +09:00
/** [Event] MassTalk Detail View */
2019-10-11 18:03:01 +09:00
onMassDetail(value: number) {
this.massDetail.emit(value);
}
2020-01-02 08:44:16 +09:00
onClickMassTranslationDetail(params: {
contents: string;
contentsType: string;
}) {
this.massTranslationDetail.emit(params);
}
2019-10-14 17:19:13 +09:00
/** [Event] Image Viewer */
2019-11-07 15:46:02 +09:00
onFileViewer(fileInfo: FileEventJson) {
this.fileViewer.emit(fileInfo);
}
2019-10-14 17:19:13 +09:00
/** [Event] Attach File Save & Save As */
onSave(value: {
fileInfo: FileEventJson;
fileDownloadItem: FileDownloadItem;
type: string;
}) {
this.save.emit(value);
}
2019-10-30 16:22:49 +09:00
/** [Event] Context Menu */
2019-11-06 13:48:06 +09:00
onContextMenuMessage(event: MouseEvent, message: Info<EventJson>) {
2019-10-16 16:33:19 +09:00
this.contextMenu.emit({ event, message });
}
}