diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/group.component.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/group.component.ts index 6e8ca823..7e477bc5 100644 --- a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/group.component.ts +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/group.component.ts @@ -11,7 +11,13 @@ import { map, tap } from 'rxjs/operators'; import { Store, select } from '@ngrx/store'; -import { ucapAnimations, DialogService } from '@ucap-webmessenger/ui'; +import { + ucapAnimations, + DialogService, + ConfirmDialogData, + ConfirmDialogComponent, + ConfirmDialogResult +} from '@ucap-webmessenger/ui'; import { UserInfo, GroupDetailData } from '@ucap-webmessenger/protocol-sync'; import * as AppStore from '@app/store'; @@ -337,31 +343,21 @@ export class GroupComponent implements OnInit, OnDestroy { case 'DELETE': { const result = await this.dialogService.open< - DeleteGroupDialogComponent, - DeleteGroupDialogData, - DeleteGroupDialogResult - >(DeleteGroupDialogComponent, { + ConfirmDialogComponent, + ConfirmDialogData, + ConfirmDialogResult + >(ConfirmDialogComponent, { width: '220px', data: { - title: 'Logout', - message: 'Logout ?' - } - }); - } - break; - case 'EDIT_MEMBER': - { - const result = await this.dialogService.open< - EditGroupMemberDialogComponent, - EditGroupMemberDialogData, - EditGroupMemberDialogResult - >(EditGroupMemberDialogComponent, { - width: '220px', - data: { - title: 'Logout', - message: 'Logout ?' + title: 'Delete group', + html: `그룹(${group.name})을 삭제하시겠습니까?
그룹 멤버는 해당 그룹에서만 삭제됩니다.` } }); + + if (!!result && !!result.choice && result.choice) { + this.logger.debug('delete group', group); + this.store.dispatch(SyncStore.delGroup({ group })); + } } break; default: diff --git a/projects/ucap-webmessenger-app/src/app/store/messenger/sync/actions.ts b/projects/ucap-webmessenger-app/src/app/store/messenger/sync/actions.ts index ece508d3..53a528f2 100644 --- a/projects/ucap-webmessenger-app/src/app/store/messenger/sync/actions.ts +++ b/projects/ucap-webmessenger-app/src/app/store/messenger/sync/actions.ts @@ -17,7 +17,9 @@ import { Info } from '@ucap-webmessenger/protocol-event'; import { AddResponse as GroupAddResponse, UpdateRequest as GroupUpdateRequest, - UpdateResponse as GroupUpdateResponse + UpdateResponse as GroupUpdateResponse, + DelRequest as GroupDelRequest, + DelResponse as GroupDelResponse } from '@ucap-webmessenger/protocol-group'; import { AddRequest as BuddyAddRequest, @@ -115,24 +117,6 @@ export const updateUnreadCount = createAction( }>() ); -/** 새그룹(Only Group) 추가 */ -export const createGroup = createAction( - '[Messenger::Sync] Group Create', - props<{ - groupName: string; - }>() -); - -export const createGroupSuccess = createAction( - '[Messenger::Sync] Group Create Success', - props() -); - -export const createGroupFailure = createAction( - '[Messenger::Sync] Group Create Failure', - props<{ error: any }>() -); - /** 새그룹 추가 & 그룹원 추가 */ export const createGroupAndBuddy = createAction( '[Messenger::Sync] Group & Buddy Create', @@ -206,18 +190,46 @@ export const updateBuddyFailure = createAction( props<{ error: any }>() ); -/** 그룹원 업데이트 */ +/** 새그룹 추가 */ +export const createGroup = createAction( + '[Messenger::Sync] Group Create', + props<{ + groupName: string; + }>() +); +export const createGroupSuccess = createAction( + '[Messenger::Sync] Group Create Success', + props() +); +export const createGroupFailure = createAction( + '[Messenger::Sync] Group Create Failure', + props<{ error: any }>() +); +/** 그룹 업데이트 */ export const updateGroup = createAction( '[Messenger::Sync] Group Update', props() ); - export const updateGroupSuccess = createAction( '[Messenger::Sync] Group Update Success', props() ); - export const updateGroupFailure = createAction( '[Messenger::Sync] Group Update Failure', props<{ error: any }>() ); +/** 그룹 삭제 */ +export const delGroup = createAction( + '[Messenger::Sync] Group Del', + props<{ + group: GroupDetailData; + }>() +); +export const delGroupSuccess = createAction( + '[Messenger::Sync] Group Del Success', + props() +); +export const delGroupFailure = createAction( + '[Messenger::Sync] Group Del Failure', + props<{ error: any }>() +); diff --git a/projects/ucap-webmessenger-app/src/app/store/messenger/sync/effects.ts b/projects/ucap-webmessenger-app/src/app/store/messenger/sync/effects.ts index 7c9c07bc..42368032 100644 --- a/projects/ucap-webmessenger-app/src/app/store/messenger/sync/effects.ts +++ b/projects/ucap-webmessenger-app/src/app/store/messenger/sync/effects.ts @@ -1,3 +1,4 @@ +import { GroupProtocolService } from './../../../../../../ucap-webmessenger-protocol-group/src/lib/services/group-protocol.service'; import { Injectable } from '@angular/core'; import { Actions, ofType, createEffect } from '@ngrx/effects'; @@ -42,7 +43,10 @@ import { updateGroupFailure, updateGroupMember, updateBuddy, - delBuddySuccess + delBuddySuccess, + delGroup, + delGroupFailure, + delGroupSuccess } from './actions'; import { SessionStorageService } from '@ucap-webmessenger/web-storage'; import { LoginInfo, KEY_LOGIN_INFO } from '@app/types'; @@ -81,9 +85,9 @@ import { } from '@ucap-webmessenger/protocol-room'; import { LoginResponse } from '@ucap-webmessenger/protocol-authentication'; import { - GroupProtocolService, AddResponse as GroupAddResponse, - UpdateResponse as GroupUpdateResponse + UpdateResponse as GroupUpdateResponse, + DelResponse as GroupDelResponse } from '@ucap-webmessenger/protocol-group'; import { BuddyProtocolService, @@ -462,11 +466,9 @@ export class Effects { }); if (addBuddyList.length > 0) { - this.logger.debug('addBuddyList : ', addBuddyList); this.store.dispatch(addBuddy({ userSeqs: addBuddyList })); } - this.logger.debug('group buddy : ', action.trgtUserSeq); this.store.dispatch( updateGroup({ // 0: 동료그룹SEQ(n) @@ -534,12 +536,10 @@ export class Effects { }); if (addBuddyList.length > 0) { - this.logger.debug('addBuddyList : ', addBuddyList); this.store.dispatch(addBuddy({ userSeqs: addBuddyList })); } if (delBuddyInGroup.length > 0) { - this.logger.debug('delBuddyInGroup', delBuddyInGroup); // 즐겨찾기 해제. delBuddyInGroup.forEach(buddySeq => { this.buddyProtocolService @@ -568,6 +568,75 @@ export class Effects { { dispatch: false } ); + delGroup$ = createEffect( + () => { + return this.actions$.pipe( + ofType(delGroup), + withLatestFrom( + this.store.pipe( + select( + (state: any) => + state.messenger.sync.group2.entities as Dictionary< + GroupDetailData + > + ) + ) + ), + map(([action, groupList]) => { + // Del Buddy + const trgtBuddys = action.group.userSeqs; + // tslint:disable-next-line: no-shadowed-variable + const delBuddyList = trgtBuddys.filter(delBuddy => { + let exist = false; + // tslint:disable-next-line: forin + for (const key in groupList) { + const group: GroupDetailData = groupList[key]; + if ( + group.seq !== action.group.seq && + group.userSeqs.filter(v => v === delBuddy).length > 0 + ) { + exist = true; + break; + } + } + return !exist; + }); + + if (delBuddyList.length > 0) { + this.logger.debug('Del Buddy', delBuddyList); + // 즐겨찾기 해제. + delBuddyList.forEach(buddySeq => { + this.buddyProtocolService + .update({ + seq: buddySeq, + isFavorit: false + }) + .pipe(catchError(error => of(delBuddyFailure({ error })))); + }); + + // 동료 삭제 + this.store.dispatch(delBuddy({ userSeqs: delBuddyList })); + } + + return action.group; + }), + tap(group => { + this.groupProtocolService + .del({ + groupSeq: group.seq + }) + .pipe( + map((res: GroupDelResponse) => { + return delGroupSuccess(res); + }), + catchError(error => of(delGroupFailure({ error }))) + ); + }) + ); + }, + { dispatch: false } + ); + addBuddy$ = createEffect(() => this.actions$.pipe( ofType(addBuddy), diff --git a/projects/ucap-webmessenger-app/src/app/store/messenger/sync/reducers.ts b/projects/ucap-webmessenger-app/src/app/store/messenger/sync/reducers.ts index d5704cc5..599c9790 100644 --- a/projects/ucap-webmessenger-app/src/app/store/messenger/sync/reducers.ts +++ b/projects/ucap-webmessenger-app/src/app/store/messenger/sync/reducers.ts @@ -16,7 +16,8 @@ import { updateUnreadCount, createGroupSuccess, addBuddySuccess, - delBuddySuccess + delBuddySuccess, + delGroupSuccess } from './actions'; import { RoomUserDetailData, @@ -204,6 +205,15 @@ export const reducer = createReducer( }) }; }), + /** 새 그룹 삭제 */ + on(delGroupSuccess, (state, action) => { + return { + ...state, + group2: adapterGroup2.removeOne(action.groupSeq, { + ...state.group2 + }) + }; + }), on(delBuddySuccess, (state, action) => { return {