ucap-lg-web/src/app/pages/chat/components/sidenav.page.component.ts
Park Byung Eun 23bbfc4b63 0524 sync
2020-05-24 13:46:38 +09:00

176 lines
4.6 KiB
TypeScript

import { Component, ChangeDetectorRef, OnInit, OnDestroy } from '@angular/core';
import { LogService } from '@ucap/ng-logger';
import { Subject, of } from 'rxjs';
import { Store, select } from '@ngrx/store';
import { takeUntil, take, map, catchError } from 'rxjs/operators';
import { RoomSelector, RoomActions } from '@ucap/ng-store-chat';
import { RoomInfo, ExitAllRequest } from '@ucap/protocol-room';
import { MatDialog } from '@angular/material/dialog';
import {
ConfirmDialogComponent,
ConfirmDialogData,
ConfirmDialogResult
} from '@ucap/ng-ui';
import { I18nService } from '@ucap/ng-i18n';
@Component({
selector: 'app-pages-chat-sidenav',
templateUrl: './sidenav.page.component.html',
styleUrls: ['./sidenav.page.component.scss']
})
export class SidenavPageComponent implements OnInit, OnDestroy {
searchObj: any = {
isShowSearch: false,
searchWord: ''
};
checkable = false;
roomList: RoomInfo[];
selectedRoomList: RoomInfo[] = [];
searchResultList: RoomInfo[] = [];
private ngOnDestroySubject: Subject<boolean>;
constructor(
private store: Store<any>,
private dialog: MatDialog,
private i18nService: I18nService,
private logService: LogService,
private changeDetectorRef: ChangeDetectorRef
) {}
ngOnInit(): void {
this.ngOnDestroySubject = new Subject<boolean>();
this.store
.pipe(takeUntil(this.ngOnDestroySubject), select(RoomSelector.rooms))
.subscribe((rooms) => {
rooms = (rooms || []).filter((info) => info.isJoinRoom);
this.roomList = rooms;
});
}
ngOnDestroy(): void {
if (!!this.ngOnDestroySubject) {
this.ngOnDestroySubject.complete();
}
}
onToggleChackable(checkable: boolean): void {
if (!!checkable) {
if (!!this.selectedRoomList && this.selectedRoomList.length > 0) {
const dialogRef = this.dialog.open<
ConfirmDialogComponent,
ConfirmDialogData,
ConfirmDialogResult
>(ConfirmDialogComponent, {
data: {
title: this.i18nService.t('room.dialog.titleExitFromRoom'),
html: this.i18nService.t('room.dialog.confirmExitFromRoom')
}
});
dialogRef
.afterClosed()
.pipe(take(1))
.subscribe((result) => {
if (!!result && !!result.choice) {
this.store.dispatch(
RoomActions.delMulti({
req: {
roomIds: this.selectedRoomList.map(
(roomInfo) => roomInfo.roomId
)
} as ExitAllRequest
})
);
}
});
}
} else {
this.selectedRoomList = [];
}
this.checkable = checkable;
}
getCheckedAllItem(): boolean {
const targetRoomList = !!this.searchObj.isShowSearch
? this.searchResultList
: this.roomList;
if (
!targetRoomList ||
targetRoomList.length === 0 ||
targetRoomList.filter(
(item) =>
!(
this.selectedRoomList.filter((info) => info.roomId === item.roomId)
.length > 0
)
).length > 0
) {
return false;
} else {
return true;
}
}
onToggleAllItem(value: boolean): void {
if (!!value) {
const targetRoomList = !!this.searchObj.isShowSearch
? this.searchResultList
: this.roomList;
this.selectedRoomList = targetRoomList.slice();
} else {
this.selectedRoomList = [];
}
this.changeDetectorRef.detectChanges();
}
onToggleItem(event: { checked: boolean; roomInfo: RoomInfo }): void {
if (!!event.checked) {
if (
!this.selectedRoomList.some(
(info) => info.roomId === event.roomInfo.roomId
)
) {
this.selectedRoomList.push(event.roomInfo);
}
} else {
if (!!this.selectedRoomList && this.selectedRoomList.length > 0) {
const index = this.selectedRoomList.findIndex(
(info) => info.roomId === event.roomInfo.roomId
);
if (index > -1) {
this.selectedRoomList.splice(index, 1);
}
}
}
}
/** Searching */
onKeyDownSearch(params: { searchWord: string }) {
this.searchObj = {
isShowSearch: true,
searchWord: params.searchWord
};
this.changeDetectorRef.detectChanges();
}
/** Searching cancel */
onClickCancel() {
this.searchObj = {
isShowSearch: false,
searchWord: ''
};
this.changeDetectorRef.detectChanges();
}
onSearchResultList(searchResultList: RoomInfo[]) {
this.searchResultList = searchResultList;
}
}