diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-side.component.html b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-side.component.html index 6210fdc8..0b35a41b 100644 --- a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-side.component.html +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-side.component.html @@ -91,8 +91,8 @@
; badgeMessageInterval: any; /** 조직도에서 부서원 선택 */ @@ -109,7 +107,6 @@ export class LeftSideComponent implements OnInit, OnDestroy { private store: Store, private dialogService: DialogService, private sessionStorageService: SessionStorageService, - private messageApiService: MessageApiService, private logger: NGXLogger ) { this.sessionVerinfo = this.sessionStorageService.get( @@ -139,6 +136,11 @@ export class LeftSideComponent implements OnInit, OnDestroy { ) .subscribe(); + /** About Message Badge */ + this.badgeMessageUnReadCount$ = this.store.pipe( + select(AppStore.MessengerSelector.MessageSelector.unReadMessageCount) + ); + this.getMessageUnreadCount(); this.badgeMessageInterval = setInterval( () => this.getMessageUnreadCount(), @@ -153,9 +155,6 @@ export class LeftSideComponent implements OnInit, OnDestroy { if (!!this.badgeChatUnReadCountSubscription) { this.badgeChatUnReadCountSubscription.unsubscribe(); } - if (!!this.badgeMessageUnReadCountSubscription) { - this.badgeMessageUnReadCountSubscription.unsubscribe(); - } if (!!this.loginResSubscription) { this.loginResSubscription.unsubscribe(); } @@ -444,22 +443,7 @@ export class LeftSideComponent implements OnInit, OnDestroy { } getMessageUnreadCount(): void { - this.badgeMessageUnReadCountSubscription = this.messageApiService - .retrieveUnreadCount({ - userSeq: this.loginRes.userSeq, - deviceType: DeviceType.PC, - tokenKey: this.loginRes.tokenString - } as UnreadCountRequest) - .pipe( - map(res => { - if (res.responseCode === MessageStatusCode.Success) { - this.badgeMessageUnReadCount = res.unreadCount; - } else { - } - }), - catchError(error => of(this.logger.error(error))) - ) - .subscribe(); + this.store.dispatch(MessageStore.retrieveUnreadCount({})); } getMyProfileImageWidget(): string { diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/message.component.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/message.component.ts index 906a6f31..fceb5b62 100644 --- a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/message.component.ts +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/message.component.ts @@ -8,9 +8,9 @@ import { Input, AfterViewChecked } from '@angular/core'; -import { of, Observable } from 'rxjs'; +import { Observable, Subscription } from 'rxjs'; import { Store, select } from '@ngrx/store'; -import { map, catchError, take } from 'rxjs/operators'; +import { tap } from 'rxjs/operators'; import { NGXLogger } from 'ngx-logger'; import { VersionInfo2Response } from '@ucap-webmessenger/api-public'; @@ -23,12 +23,8 @@ import { MessageType, MessageList, MessageSearchType, - DetailRequest, - MessageDetailInfo, - DelRequest, - CancelReservationRequest + MessageDetailInfo } from '@ucap-webmessenger/api-message'; -import { DeviceType } from '@ucap-webmessenger/core'; import { MessageStatusCode } from '@ucap-webmessenger/api'; import { ContentType } from '@ucap-webmessenger/api-message'; import { FormGroup, FormBuilder } from '@angular/forms'; @@ -79,6 +75,8 @@ export class MessageBoxComponent messageReservationList$: Observable; messageSearchList$: Observable; + messageDetailInfo: Subscription; + currentTabIndex = 0; defaultPageSize = 1000; // default @@ -119,9 +117,12 @@ export class MessageBoxComponent searchMessageSearchType: [MessageSearchType.Name] }); - this.messageRetrieveList$ = this.store.pipe( - select(AppStore.MessengerSelector.MessageSelector.selectAllReceiveList) - ); + this.messageRetrieveList$ = this.store + .pipe( + select(AppStore.MessengerSelector.MessageSelector.selectAllReceiveList) + ) + .pipe(tap(info => console.log(info))); + this.messageSendList$ = this.store.pipe( select(AppStore.MessengerSelector.MessageSelector.selectAllSendList) ); @@ -134,6 +135,53 @@ export class MessageBoxComponent select(AppStore.MessengerSelector.MessageSelector.selectAllSearchList) ); + this.messageDetailInfo = this.store + .pipe( + select(AppStore.MessengerSelector.MessageSelector.detailMessageInfo) + ) + .subscribe(async info => { + if (!!info && info.responseCode === MessageStatusCode.Success) { + // Badge Refresh in case Receive Message.. + if (info.msgInfo.type === MessageType.Receive) { + this.doRefreshUnReadCount.emit(); + } + + // detail view.. + const result = await this.dialogService.open< + MessageDetailDialogComponent, + MessageDetailDialogData, + MessageDetailDialogResult + >(MessageDetailDialogComponent, { + width: '600px', + data: { + detail: info, + loginRes: this.loginRes, + environmentsInfo: this.environmentsInfo + } + }); + + if (!!result) { + // Clear detail Info in state + this.store.dispatch(MessageStore.detailMessageClear({})); + + switch (result.returnType) { + case 'DEL': + // 단건 삭제. + this.doMessageDelete([result.messageInfo]); + break; + case 'CANCEL_RESERVATION': + // 단건 발송취소(예약) + this.doMessageCancelReservation(result.messageInfo); + break; + case 'UPDATE': + // 예약 수정 + this.getRetrieveMessage(MessageType.Reservation, 0); + break; + } + } + } + }); + // 초기 검색은 수신함. this.getRetrieveMessage(MessageType.Receive, 0); @@ -149,7 +197,11 @@ export class MessageBoxComponent } } - ngOnDestroy(): void {} + ngOnDestroy(): void { + if (!!this.messageDetailInfo) { + this.messageDetailInfo.unsubscribe(); + } + } onSelectedIndexTab(value: number) { this.tabs.selectedIndex = value; @@ -231,110 +283,34 @@ export class MessageBoxComponent /** 쪽지 상세보기 */ onClickDetail(message: MessageList) { - this.messageApiService - .detailMessage({ - userSeq: this.loginRes.userSeq, - deviceType: DeviceType.PC, - tokenKey: this.loginRes.tokenString, - type: message.type, + this.store.dispatch( + MessageStore.detailMessage({ + messageType: message.type, msgId: message.msgId - } as DetailRequest) - .pipe( - take(1), - map(async res => { - if (res.responseCode === MessageStatusCode.Success) { - // Badge Refresh in case Receive Message.. - if (res.msgInfo.type === MessageType.Receive) { - this.doRefreshUnReadCount.emit(); - } - - // detail view.. - const result = await this.dialogService.open< - MessageDetailDialogComponent, - MessageDetailDialogData, - MessageDetailDialogResult - >(MessageDetailDialogComponent, { - width: '600px', - data: { - detail: res, - loginRes: this.loginRes, - environmentsInfo: this.environmentsInfo - } - }); - - if (!!result) { - switch (result.returnType) { - case 'DEL': - // 단건 삭제. - this.doMessageDelete([result.messageInfo]); - break; - case 'CANCEL_RESERVATION': - // 단건 발송취소(예약) - this.doMessageCancelReservation(result.messageInfo); - break; - case 'UPDATE': - // 예약 수정 - this.getRetrieveMessage(MessageType.Reservation, 0); - break; - } - } - } else { - } - }), - catchError(error => of(this.logger.error(error))) - ) - .subscribe(); + }) + ); } /** 쪽지(수신,발신) 삭제 */ doMessageDelete(messageInfo: MessageDetailInfo[]): void { const msgList: { msgId: number }[] = []; messageInfo.forEach(info => msgList.push({ msgId: info.msgId })); - this.messageApiService - .deleteMessage({ - userSeq: this.loginRes.userSeq, - deviceType: DeviceType.PC, - tokenKey: this.loginRes.tokenString, - type: messageInfo[0].type, + + this.store.dispatch( + MessageStore.deleteMessage({ + messageType: messageInfo[0].type, msgList - } as DelRequest) - .pipe( - take(1), - map(async res => { - if (res.responseCode === MessageStatusCode.Success) { - } else { - this.logger.error('message delete Error!'); - } - // 현재탭 재조회. - this.onSelectedIndexChange(this.currentTabIndex); - }), - catchError(error => of(this.logger.error(error))) - ) - .subscribe(); + }) + ); } /** 쪽지(예약) 삭제 */ doMessageCancelReservation(messageInfo: MessageDetailInfo): void { - this.messageApiService - .cancelReservationMessage({ - userSeq: this.loginRes.userSeq, - deviceType: DeviceType.PC, - tokenKey: this.loginRes.tokenString, - type: messageInfo.type, + this.store.dispatch( + MessageStore.cancelReservationMessage({ + messageType: messageInfo.type, msgId: messageInfo.msgId - } as CancelReservationRequest) - .pipe( - take(1), - map(async res => { - if (res.responseCode === MessageStatusCode.Success) { - } else { - this.logger.error('message(reservation) cancel Error!'); - } - // 현재탭 재조회. - this.onSelectedIndexChange(this.currentTabIndex); - }), - catchError(error => of(this.logger.error(error))) - ) - .subscribe(); + }) + ); } } diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/message/message-detail.dialog.component.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/message/message-detail.dialog.component.ts index f0a0c4b1..5dc46635 100644 --- a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/message/message-detail.dialog.component.ts +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/message/message-detail.dialog.component.ts @@ -122,9 +122,10 @@ export class MessageDetailDialogComponent implements OnInit { // contents 내 이미지 Thumnail 파일 정보 수집. this.getThumbImage(); - this.receivers = this.messageDetail.recvList.sort((a, b) => - a.userName < b.userName ? -1 : a.userName > b.userName ? 1 : 0 - ); + this.receivers = this.messageDetail.recvList; + // this.receivers = this.messageDetail.recvList.sort((a, b) => + // a.userName < b.userName ? -1 : a.userName > b.userName ? 1 : 0 + // ); } getSendReceiverNames(): string { diff --git a/projects/ucap-webmessenger-app/src/app/pages/messenger/components/main.page.component.ts b/projects/ucap-webmessenger-app/src/app/pages/messenger/components/main.page.component.ts index 0f636717..25f6495e 100644 --- a/projects/ucap-webmessenger-app/src/app/pages/messenger/components/main.page.component.ts +++ b/projects/ucap-webmessenger-app/src/app/pages/messenger/components/main.page.component.ts @@ -13,6 +13,7 @@ import { Store, select } from '@ngrx/store'; import * as AppStore from '@app/store'; import * as ChatStore from '@app/store/messenger/chat'; +import * as MessageStore from '@app/store/messenger/message'; import { Observable, Subscription, of } from 'rxjs'; import { UCAP_NATIVE_SERVICE, NativeService } from '@ucap-webmessenger/native'; @@ -150,49 +151,20 @@ export class MainPageComponent implements OnInit, OnDestroy { this.msgOpenMessageSubscription = this.nativeService .msgOpenMessage() .subscribe(messageSeq => { - console.log(messageSeq); + // unreadCount refresh.. + this.store.dispatch(MessageStore.retrieveUnreadCount({})); this.ngZone.run(() => { - this.messageApiService - .detailMessage({ - userSeq: this.loginRes.userSeq, - deviceType: this.environmentsInfo.deviceType, - tokenKey: this.loginRes.tokenString, - type: MessageType.Receive, + /** + * 쪽지 상세보기. + * state 를 구독하여 Message.component.ts 에서 팝업 띄움. + */ + this.store.dispatch( + MessageStore.detailMessage({ + messageType: MessageType.Receive, msgId: Number(messageSeq) - } as DetailRequest) - .pipe( - take(1), - map(async res => { - if (res.responseCode === MessageStatusCode.Success) { - // detail view.. - const result = await this.dialogService.open< - MessageDetailDialogComponent, - MessageDetailDialogData, - MessageDetailDialogResult - >(MessageDetailDialogComponent, { - width: '600px', - data: { - detail: res, - loginRes: this.loginRes, - environmentsInfo: this.environmentsInfo - } - }); - - if (!!result) { - switch (result.returnType) { - case 'DEL': - // 단건 삭제. - this.doMessageDelete([result.messageInfo]); - break; - } - } - } else { - } - }), - catchError(error => of(this.logger.error(error))) - ) - .subscribe(); + }) + ); }); }); @@ -385,29 +357,4 @@ export class MainPageComponent implements OnInit, OnDestroy { onCloseRightDrawer() { this.rightDrawer.close(); } - - /** 쪽지(수신,발신) 삭제 */ - doMessageDelete(messageInfo: MessageDetailInfo[]): void { - const msgList: { msgId: number }[] = []; - messageInfo.forEach(info => msgList.push({ msgId: info.msgId })); - this.messageApiService - .deleteMessage({ - userSeq: this.loginRes.userSeq, - deviceType: DeviceType.PC, - tokenKey: this.loginRes.tokenString, - type: messageInfo[0].type, - msgList - } as DelRequest) - .pipe( - take(1), - map(async res => { - if (res.responseCode === MessageStatusCode.Success) { - } else { - this.logger.error('message delete Error!'); - } - }), - catchError(error => of(this.logger.error(error))) - ) - .subscribe(); - } } diff --git a/projects/ucap-webmessenger-app/src/app/services/notification.service.ts b/projects/ucap-webmessenger-app/src/app/services/notification.service.ts index 57893ab4..6b0b7cf3 100644 --- a/projects/ucap-webmessenger-app/src/app/services/notification.service.ts +++ b/projects/ucap-webmessenger-app/src/app/services/notification.service.ts @@ -81,6 +81,7 @@ import { import * as AuthenticationStore from '@app/store/account/authentication'; import * as InfoStore from '@app/store/account/info'; import * as EventStore from '@app/store/messenger/event'; +import * as MessageStore from '@app/store/messenger/message'; import * as SyncStore from '@app/store/messenger/sync'; import * as RoomStore from '@app/store/messenger/room'; import * as StatusStore from '@app/store/messenger/status'; @@ -102,6 +103,7 @@ import { AppUserInfo, KEY_APP_USER_INFO } from '@app/types/app-user-info.type'; import { environment } from '../../environments/environment'; import { NotificationMethod } from '@ucap-webmessenger/core'; import { Dictionary } from '@ngrx/entity'; +import { MessageType } from '@ucap-webmessenger/api-message'; @Injectable() export class AppNotificationService { @@ -559,7 +561,17 @@ export class AppNotificationService { 'Notification::umgProtocolService::UmgNotiNotification', noti ); - console.log(noti); + + // unreadCount refresh.. + this.store.dispatch(MessageStore.retrieveUnreadCount({})); + + // Receive Message List refresh.. + this.store.dispatch( + MessageStore.retrieveMessage({ + messageType: MessageType.Receive + }) + ); + // notification.. const appUserInfo = this.localStorageService.encGet< AppUserInfo diff --git a/projects/ucap-webmessenger-app/src/app/store/messenger/message/actions.ts b/projects/ucap-webmessenger-app/src/app/store/messenger/message/actions.ts index b36671bc..47d782dc 100644 --- a/projects/ucap-webmessenger-app/src/app/store/messenger/message/actions.ts +++ b/projects/ucap-webmessenger-app/src/app/store/messenger/message/actions.ts @@ -2,9 +2,48 @@ import { createAction, props } from '@ngrx/store'; import { MessageType, RetrieveResponse, - MessageSearchType + MessageSearchType, + DelRequest, + DelResponse, + DetailResponse } from '@ucap-webmessenger/api-message'; +export const detailMessage = createAction( + '[Messenger::Message] Detail Message', + props<{ + messageType: MessageType; + msgId: number; + }>() +); +export const detailMessageSuccess = createAction( + '[Messenger::Message] Detail Message Success', + props<{ + res: DetailResponse; + }>() +); +export const detailMessageFailure = createAction( + '[Messenger::Message] Detail Message Failure', + props<{ error: any }>() +); + +export const detailMessageClear = createAction( + '[Messenger::Message] Detail Message', + props() +); + +export const retrieveUnreadCount = createAction( + '[Messenger::Message] RetrieveMessage UnreadCount', + props() +); +export const retrieveUnreadCountSuccess = createAction( + '[Messenger::Message] RetrieveMessage UnreadCount Success', + props<{ count: number }>() +); +export const retrieveUnreadCountFailure = createAction( + '[Messenger::Message] RetrieveMessage UnreadCount Failure', + props<{ error: any }>() +); + export const retrieveMessage = createAction( '[Messenger::Message] RetrieveMessage', props<{ @@ -40,3 +79,41 @@ export const searchMessageFailure = createAction( '[Messenger::Message] searchMessage Failure', props<{ error: any }>() ); + +export const deleteMessage = createAction( + '[Messenger::Message] Delete Message', + props<{ + messageType: MessageType; + msgList: { msgId: number }[]; + }>() +); +export const deleteMessageSuccess = createAction( + '[Messenger::Message] Delete Message Success', + props<{ + messageType: MessageType; + msgList: { msgId: number }[]; + }>() +); +export const deleteMessageFailure = createAction( + '[Messenger::Message] Delete Message Failure', + props<{ error: any }>() +); + +export const cancelReservationMessage = createAction( + '[Messenger::Message] Cancel Reservation Message', + props<{ + messageType: MessageType; + msgId: number; + }>() +); +export const cancelReservationMessageSuccess = createAction( + '[Messenger::Message] Cancel Reservation Message Success', + props<{ + messageType: MessageType; + msgId: number; + }>() +); +export const cancelReservationMessageFailure = createAction( + '[Messenger::Message] Cancel Reservation Message Failure', + props<{ error: any }>() +); diff --git a/projects/ucap-webmessenger-app/src/app/store/messenger/message/effects.ts b/projects/ucap-webmessenger-app/src/app/store/messenger/message/effects.ts index 7dbe4bfe..c8708cb6 100644 --- a/projects/ucap-webmessenger-app/src/app/store/messenger/message/effects.ts +++ b/projects/ucap-webmessenger-app/src/app/store/messenger/message/effects.ts @@ -27,10 +27,9 @@ import { SessionStorageService } from '@ucap-webmessenger/web-storage'; import { KEY_ENVIRONMENTS_INFO } from './../../../types/environment.type'; import { LoginInfo, KEY_LOGIN_INFO, EnvironmentsInfo } from '@app/types'; import { Dictionary } from '@ngrx/entity'; -import { openSuccess, openFailure } from '../room'; import { LoginResponse } from '@ucap-webmessenger/protocol-authentication'; import { KEY_LOGIN_RES_INFO } from '@app/types/login-res-info.type'; -import { StatusCode, MessageStatusCode } from '@ucap-webmessenger/api'; +import { MessageStatusCode } from '@ucap-webmessenger/api'; import { environment } from '../../../../environments/environment'; import { AlertDialogComponent, @@ -44,18 +43,124 @@ import { retrieveMessageSuccess, searchMessage, searchMessageSuccess, - searchMessageFailure + searchMessageFailure, + retrieveUnreadCount, + retrieveUnreadCountSuccess, + retrieveUnreadCountFailure, + deleteMessage, + deleteMessageSuccess, + deleteMessageFailure, + cancelReservationMessage, + cancelReservationMessageSuccess, + cancelReservationMessageFailure, + detailMessage, + detailMessageFailure, + detailMessageSuccess } from './actions'; import { MessageApiService, RetrieveRequest, MessageType, RetrieveSearchRequest, - MessageSearchType + MessageSearchType, + DelRequest, + CancelReservationRequest, + DetailRequest } from '@ucap-webmessenger/api-message'; +import { UnreadCountRequest } from 'projects/ucap-webmessenger-api-message/src/lib/apis/unread-count'; +import { + MessageDetailDialogComponent, + MessageDetailDialogResult, + MessageDetailDialogData +} from '@app/layouts/messenger/dialogs/message/message-detail.dialog.component'; @Injectable() export class Effects { + detailMessage$ = createEffect( + () => { + return this.actions$.pipe( + ofType(detailMessage), + withLatestFrom( + this.store.pipe( + select( + (state: any) => + state.account.authentication.loginRes as LoginResponse + ) + ) + ), + switchMap(([req, loginResInfo]) => { + const environmentsInfo = this.sessionStorageService.get< + EnvironmentsInfo + >(KEY_ENVIRONMENTS_INFO); + + const request: DetailRequest = { + userSeq: loginResInfo.userSeq, + deviceType: environmentsInfo.deviceType, + tokenKey: loginResInfo.tokenString, + type: req.messageType, + msgId: req.msgId + }; + return this.messageApiService.detailMessage(request).pipe( + map(res => { + if (res.responseCode === MessageStatusCode.Success) { + this.store.dispatch( + detailMessageSuccess({ + res + }) + ); + } + }), + catchError(error => of(detailMessageFailure({ error }))) + ); + }) + ); + }, + { dispatch: false } + ); + + retrieveUnreadCount$ = createEffect( + () => { + return this.actions$.pipe( + ofType(retrieveUnreadCount), + withLatestFrom( + this.store.pipe( + select( + (state: any) => + state.account.authentication.loginRes as LoginResponse + ) + ) + ), + switchMap(([req, loginResInfo]) => { + // const loginResInfo: LoginResponse = this.sessionStorageService.get< + // LoginResponse + // >(KEY_LOGIN_RES_INFO); + const environmentsInfo = this.sessionStorageService.get< + EnvironmentsInfo + >(KEY_ENVIRONMENTS_INFO); + + const request: UnreadCountRequest = { + userSeq: loginResInfo.userSeq, + deviceType: environmentsInfo.deviceType, + tokenKey: loginResInfo.tokenString + }; + return this.messageApiService.retrieveUnreadCount(request).pipe( + map(res => { + if (res.responseCode === MessageStatusCode.Success) { + this.store.dispatch( + retrieveUnreadCountSuccess({ + count: res.unreadCount + }) + ); + } + }), + catchError(error => of(retrieveUnreadCountFailure({ error }))) + ); + }) + ); + }, + { dispatch: false } + ); + retrieveMessage$ = createEffect( () => { return this.actions$.pipe( @@ -69,9 +174,6 @@ export class Effects { ) ), switchMap(([req, loginResInfo]) => { - // const loginResInfo: LoginResponse = this.sessionStorageService.get< - // LoginResponse - // >(KEY_LOGIN_RES_INFO); const environmentsInfo = this.sessionStorageService.get< EnvironmentsInfo >(KEY_ENVIRONMENTS_INFO); @@ -144,10 +246,6 @@ export class Effects { searchMessage$ = createEffect( () => { - const environmentsInfo = this.sessionStorageService.get( - KEY_ENVIRONMENTS_INFO - ); - return this.actions$.pipe( ofType(searchMessage), withLatestFrom( @@ -159,6 +257,10 @@ export class Effects { ) ), switchMap(([req, loginResInfo]) => { + const environmentsInfo = this.sessionStorageService.get< + EnvironmentsInfo + >(KEY_ENVIRONMENTS_INFO); + const request: RetrieveRequest = { userSeq: loginResInfo.userSeq, deviceType: environmentsInfo.deviceType, @@ -199,6 +301,94 @@ export class Effects { { dispatch: false } ); + deleteMessage$ = createEffect( + () => { + return this.actions$.pipe( + ofType(deleteMessage), + withLatestFrom( + this.store.pipe( + select( + (state: any) => + state.account.authentication.loginRes as LoginResponse + ) + ) + ), + switchMap(([action, loginResInfo]) => { + const environmentsInfo = this.sessionStorageService.get< + EnvironmentsInfo + >(KEY_ENVIRONMENTS_INFO); + + const request: DelRequest = { + userSeq: loginResInfo.userSeq, + deviceType: environmentsInfo.deviceType, + tokenKey: loginResInfo.tokenString, + type: action.messageType, + msgList: action.msgList + }; + + return this.messageApiService.deleteMessage(request).pipe( + map(res => { + if (res.responseCode === MessageStatusCode.Success) { + this.store.dispatch( + deleteMessageSuccess({ + messageType: action.messageType, + msgList: action.msgList + }) + ); + } + }), + catchError(error => of(deleteMessageFailure({ error }))) + ); + }) + ); + }, + { dispatch: false } + ); + + cancelReservationMessage$ = createEffect( + () => { + return this.actions$.pipe( + ofType(cancelReservationMessage), + withLatestFrom( + this.store.pipe( + select( + (state: any) => + state.account.authentication.loginRes as LoginResponse + ) + ) + ), + switchMap(([action, loginResInfo]) => { + const environmentsInfo = this.sessionStorageService.get< + EnvironmentsInfo + >(KEY_ENVIRONMENTS_INFO); + + const request: CancelReservationRequest = { + userSeq: loginResInfo.userSeq, + deviceType: environmentsInfo.deviceType, + tokenKey: loginResInfo.tokenString, + type: action.messageType, + msgId: action.msgId + }; + + return this.messageApiService.cancelReservationMessage(request).pipe( + map(res => { + if (res.responseCode === MessageStatusCode.Success) { + this.store.dispatch( + cancelReservationMessageSuccess({ + messageType: action.messageType, + msgId: action.msgId + }) + ); + } + }), + catchError(error => of(cancelReservationMessageFailure({ error }))) + ); + }) + ); + }, + { dispatch: false } + ); + constructor( private actions$: Actions, private store: Store, diff --git a/projects/ucap-webmessenger-app/src/app/store/messenger/message/reducers.ts b/projects/ucap-webmessenger-app/src/app/store/messenger/message/reducers.ts index cf60e690..3c163db6 100644 --- a/projects/ucap-webmessenger-app/src/app/store/messenger/message/reducers.ts +++ b/projects/ucap-webmessenger-app/src/app/store/messenger/message/reducers.ts @@ -11,13 +11,26 @@ import { retrieveMessageSuccess, retrieveMessage, searchMessage, - searchMessageSuccess + searchMessageSuccess, + retrieveUnreadCountSuccess, + deleteMessageSuccess, + cancelReservationMessageSuccess, + detailMessageSuccess, + detailMessageClear, + detailMessage } from './actions'; import { MessageType } from '@ucap-webmessenger/api-message'; export const reducer = createReducer( initialState, + on(retrieveUnreadCountSuccess, (state, action) => { + return { + ...state, + unReadMessageCount: action.count + }; + }), + on(retrieveMessage, (state, action) => { switch (action.messageType) { case MessageType.Receive: { @@ -92,6 +105,74 @@ export const reducer = createReducer( }; }), + on(deleteMessageSuccess, (state, action) => { + if (action.messageType === MessageType.Receive) { + return { + ...state, + receiveList: adapterReceiveList.removeMany( + action.msgList.map(item => item.msgId), + { + ...state.receiveList + } + ), + searchList: adapterSearchList.removeMany( + action.msgList.map(item => item.msgId), + { + ...state.searchList + } + ) + }; + } else if (action.messageType === MessageType.Send) { + return { + ...state, + sendList: adapterSendList.removeMany( + action.msgList.map(item => item.msgId), + { + ...state.sendList + } + ), + searchList: adapterSearchList.removeMany( + action.msgList.map(item => item.msgId), + { + ...state.searchList + } + ) + }; + } + }), + + on(cancelReservationMessageSuccess, (state, action) => { + return { + ...state, + reservationList: adapterReservationList.removeOne(action.msgId, { + ...state.reservationList + }), + searchList: adapterSearchList.removeOne(action.msgId, { + ...state.searchList + }) + }; + }), + + on(detailMessageSuccess, (state, action) => { + return { + ...state, + detailMessageInfo: action.res + }; + }), + + on(detailMessage, (state, action) => { + return { + ...state, + detailMessageInfo: null + }; + }), + on(detailMessageClear, (state, action) => { + return { + ...state, + detailMessageInfo: null + }; + }), + on(AuthenticationStore.logoutInitialize, (state, action) => { return { ...initialState diff --git a/projects/ucap-webmessenger-app/src/app/store/messenger/message/state.ts b/projects/ucap-webmessenger-app/src/app/store/messenger/message/state.ts index ef289c77..dafafa23 100644 --- a/projects/ucap-webmessenger-app/src/app/store/messenger/message/state.ts +++ b/projects/ucap-webmessenger-app/src/app/store/messenger/message/state.ts @@ -1,7 +1,7 @@ import { Selector, createSelector } from '@ngrx/store'; import { EntityState, createEntityAdapter } from '@ngrx/entity'; -import { MessageList } from '@ucap-webmessenger/api-message'; +import { MessageList, DetailResponse } from '@ucap-webmessenger/api-message'; import { InfoResponse, @@ -20,6 +20,7 @@ export interface FileInfoListState extends EntityState {} export interface FileInfoCheckListState extends EntityState {} export interface State { + // list [S] receiveListProcessing: boolean; receiveList: ReceiveListState; receiveTotalCount: number; @@ -39,6 +40,10 @@ export interface State { searchList: SearchListState; searchTotalCount: number; searchPage: number; + // list [E] + + unReadMessageCount: number; + detailMessageInfo: DetailResponse | null; } export const adapterReceiveList = createEntityAdapter({ @@ -96,7 +101,10 @@ export const initialState: State = { searchListProcessing: false, searchList: searchListInitialState, searchTotalCount: 0, - searchPage: 0 + searchPage: 0, + + unReadMessageCount: 0, + detailMessageInfo: null }; const { @@ -143,6 +151,11 @@ export function selectors(selector: Selector) { ); return { + unReadMessageCount: createSelector( + selector, + (state: State) => state.unReadMessageCount + ), + receiveListProcessing: createSelector( selector, (state: State) => state.receiveListProcessing @@ -213,6 +226,11 @@ export function selectors(selector: Selector) { selectSearchList, ngeSelectEntitiesSearchList, (_, entities) => (!!entities ? entities[seq] : undefined) - ) + ), + + detailMessageInfo: createSelector( + selector, + (state: State) => state.detailMessageInfo + ) }; }