import { UserSelectDialogType } from './../../../types/userselect.dialog.type'; import { Component, OnInit, Output, EventEmitter } from '@angular/core'; import { NGXLogger } from 'ngx-logger'; import { ucapAnimations, DialogService } from '@ucap-webmessenger/ui'; import { CreateChatDialogComponent, CreateChatDialogData, CreateChatDialogResult } from '@app/layouts/messenger/dialogs/chat/create-chat.dialog.component'; import { Observable } from 'rxjs'; import { Store, select } from '@ngrx/store'; import * as AppStore from '@app/store'; import * as ChatStore from '@app/store/messenger/chat'; import * as SyncStore from '@app/store/messenger/sync'; import { UserInfo } from '@ucap-webmessenger/protocol-sync'; import { UserInfoSS, UserInfoF, UserInfoDN } from '@ucap-webmessenger/protocol-query'; import { MatTabChangeEvent, MatTabGroup } from '@angular/material'; import { RightDrawer } from '@app/types'; export enum MainMenu { Group = 'GROUP', Chat = 'CAHT', Organization = 'ORGANIZATION', Call = 'CALL', Conversation = 'CONVERSATION' } @Component({ selector: 'app-layout-messenger-left-side', templateUrl: './left-side.component.html', styleUrls: ['./left-side.component.scss'], animations: ucapAnimations }) export class LeftSideComponent implements OnInit { @Output() openProfile = new EventEmitter< UserInfo | UserInfoSS | UserInfoF | UserInfoDN >(); badgeChatUnReadCount$: Observable; /** 조직도에서 부서원 선택 */ selectedUserList: (UserInfo | UserInfoSS | UserInfoF | UserInfoDN)[] = []; /** FAB */ fabButtonShow = true; fabButtons: { icon: string; tooltip?: string; divisionType?: string }[]; MainMenu = MainMenu; constructor( private store: Store, private dialogService: DialogService, private logger: NGXLogger ) {} ngOnInit() { this.badgeChatUnReadCount$ = this.store.pipe( select(AppStore.MessengerSelector.SyncSelector.selectChatUnreadCount) ); this.setFabInitial(MainMenu.Group); } async onClickNewChat(type: string = 'NORMAL') { const result = await this.dialogService.open< CreateChatDialogComponent, CreateChatDialogData, CreateChatDialogResult >(CreateChatDialogComponent, { width: '600px', data: { type: UserSelectDialogType.NewChat, title: type === 'TIMER' ? 'New Timer Chat' : 'New Chat' } }); if (!!result && !!result.choice && result.choice) { if (!!result.selectedUserList && result.selectedUserList.length > 0) { const userSeqs: number[] = []; result.selectedUserList.map(user => userSeqs.push(user.seq)); if (type === 'NORMAL') { this.store.dispatch(ChatStore.openRoom({ userSeqList: userSeqs })); } else if (type === 'TIMER') { this.store.dispatch( ChatStore.openRoom({ userSeqList: userSeqs, isTimeRoom: true }) ); } } } } async onClickNewGroupAndMember() { const result = await this.dialogService.open< CreateChatDialogComponent, CreateChatDialogData, CreateChatDialogResult >(CreateChatDialogComponent, { width: '600px', data: { type: UserSelectDialogType.NewGroup, title: 'New Group' } }); if (!!result && !!result.choice && result.choice) { if ( !!result.selectedUserList && result.selectedUserList.length > 0 && result.groupName.trim().length > 0 ) { const userSeqs: number[] = []; result.selectedUserList.map(user => userSeqs.push(user.seq)); this.store.dispatch( SyncStore.createGroupAndBuddy({ groupName: result.groupName, trgtUserSeq: userSeqs }) ); } } } onClickOpenProfile(userInfo: UserInfo | UserInfoSS | UserInfoF | UserInfoDN) { this.openProfile.emit(userInfo); } onSelectedTabChange(event: MatTabChangeEvent) { this.setFabInitial(event.tab.ariaLabel); } setFabInitial(type: string) { switch (type) { case MainMenu.Group: { this.fabButtonShow = true; this.fabButtons = [ { icon: 'add', tooltip: 'New Group Add', divisionType: 'GROUP_NEW_ADD' }, { icon: 'sms', tooltip: 'Message', divisionType: 'MESSAGE' } ]; } break; case MainMenu.Chat: { this.fabButtonShow = true; this.fabButtons = [ { icon: 'timer', tooltip: 'New Timer Chat', divisionType: 'CHAT_NEW_TIMER_ADD' }, { icon: 'chat', tooltip: 'New Chat', divisionType: 'CAHT_NEW_ADD' } ]; } break; // case MainMenu.Organization: // { // } // break; // case MainMenu.Call: // { // } // break; default: { this.fabButtonShow = false; } } } onCheckAllUser(params: { isChecked: boolean; userInfos: (UserInfo | UserInfoSS | UserInfoF | UserInfoDN)[]; }) { params.userInfos.forEach(userInfo => { if (params.isChecked) { if ( this.selectedUserList.filter(user => user.seq === userInfo.seq) .length === 0 ) { this.selectedUserList = [...this.selectedUserList, userInfo]; } } else { this.selectedUserList = this.selectedUserList.filter( user => user.seq !== userInfo.seq ); } }); } /** 조직도>부서원 :: 리스트의 checkbox 의 이벤트를 받아 선택된 유저리스트를 수집. */ onCheckUser(params: { isChecked: boolean; userInfo: UserInfo | UserInfoSS | UserInfoF | UserInfoDN; }) { if (params.isChecked) { if ( params.userInfo && this.selectedUserList.filter(user => user.seq === params.userInfo.seq) .length === 0 ) { this.selectedUserList = [...this.selectedUserList, params.userInfo]; } } else { this.selectedUserList = this.selectedUserList.filter( user => user.seq !== params.userInfo.seq ); } } /** FAB */ onClickFab(params: { btn: any }) { const btn = params.btn as { icon: string; tooltip?: string; divisionType?: string; }; switch (btn.divisionType) { case 'GROUP_NEW_ADD': { this.onClickNewGroupAndMember(); } break; case 'CAHT_NEW_ADD': { this.onClickNewChat('NORMAL'); } break; case 'CHAT_NEW_TIMER_ADD': { this.onClickNewChat('TIMER'); } break; case 'MESSAGE': { this.store.dispatch( ChatStore.selectedRightDrawer({ req: RightDrawer.Message }) ); } break; } } }