From 37691a565f802fb206c10cdf7f71dae0b6aa0ad9 Mon Sep 17 00:00:00 2001 From: Richard Park Date: Fri, 11 Oct 2019 14:01:43 +0900 Subject: [PATCH 1/4] effects of notification are added --- .../src/app/services/notification.service.ts | 29 +++++---- .../src/app/store/account/index.ts | 17 ++++- .../src/app/store/account/info/actions.ts | 8 +++ .../src/app/store/account/info/effects.ts | 29 +++++++++ .../src/app/store/account/info/index.ts | 4 ++ .../src/app/store/account/info/reducers.ts | 4 ++ .../src/app/store/account/info/state.ts | 18 ++++++ .../src/app/store/messenger/event/actions.ts | 26 +++++++- .../src/app/store/messenger/event/effects.ts | 63 ++++++++++++++++++- .../src/app/store/messenger/room/actions.ts | 26 +++++++- .../src/app/store/messenger/room/effects.ts | 51 ++++++++++++++- .../src/app/store/messenger/status/actions.ts | 8 ++- .../src/app/store/messenger/status/effects.ts | 18 +++++- 13 files changed, 281 insertions(+), 20 deletions(-) create mode 100644 projects/ucap-webmessenger-app/src/app/store/account/info/actions.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/account/info/effects.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/account/info/index.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/account/info/reducers.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/account/info/state.ts 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 d07d3af2..d0043df8 100644 --- a/projects/ucap-webmessenger-app/src/app/services/notification.service.ts +++ b/projects/ucap-webmessenger-app/src/app/services/notification.service.ts @@ -108,19 +108,9 @@ export class AppNotificationService { noti ); - const appendInfo: Info = { - seq: noti.seq, - type: noti.eventType, - senderSeq: noti.SENDER_SEQ, - sendDate: noti.sendDate, - sentMessage: noti.message, - receiverCount: noti.receiverCount - }; - this.store.dispatch( - EventStore.newInfo({ - roomSeq: noti.roomSeq, - info: appendInfo + EventStore.sendNotification({ + noti }) ); } @@ -133,6 +123,11 @@ export class AppNotificationService { 'Notification::eventProtocolService::ReadNotification', noti ); + this.store.dispatch( + EventStore.readNotification({ + noti + }) + ); } break; case SSVC_TYPE_EVENT_CANCEL_NOTI: @@ -142,6 +137,11 @@ export class AppNotificationService { 'Notification::eventProtocolService::CancelNotification', noti ); + this.store.dispatch( + EventStore.cancelNotification({ + noti + }) + ); } break; case SSVC_TYPE_EVENT_DEL_RES: @@ -151,6 +151,11 @@ export class AppNotificationService { 'Notification::eventProtocolService::DelNotification', noti ); + this.store.dispatch( + EventStore.delNotification({ + noti + }) + ); } break; default: diff --git a/projects/ucap-webmessenger-app/src/app/store/account/index.ts b/projects/ucap-webmessenger-app/src/app/store/account/index.ts index 13adc103..208c7ea7 100644 --- a/projects/ucap-webmessenger-app/src/app/store/account/index.ts +++ b/projects/ucap-webmessenger-app/src/app/store/account/index.ts @@ -2,16 +2,22 @@ import { Type } from '@angular/core'; import { Action, combineReducers, Selector, createSelector } from '@ngrx/store'; import * as AuthenticationStore from './authentication'; +import * as InfoStore from './info'; export interface State { authentication: AuthenticationStore.State; + info: InfoStore.State; } -export const effects: Type[] = [AuthenticationStore.Effects]; +export const effects: Type[] = [ + AuthenticationStore.Effects, + InfoStore.Effects +]; export function reducers(state: State | undefined, action: Action) { return combineReducers({ - authentication: AuthenticationStore.reducer + authentication: AuthenticationStore.reducer, + info: InfoStore.reducer })(state, action); } @@ -22,6 +28,13 @@ export function selectors(selector: Selector) { selector, (state: State) => state.authentication ) + ), + + InfoSelector: InfoStore.selectors( + createSelector( + selector, + (state: State) => state.info + ) ) }; } diff --git a/projects/ucap-webmessenger-app/src/app/store/account/info/actions.ts b/projects/ucap-webmessenger-app/src/app/store/account/info/actions.ts new file mode 100644 index 00000000..50a28554 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/store/account/info/actions.ts @@ -0,0 +1,8 @@ +import { createAction, props } from '@ngrx/store'; + +import { UserNotification } from '@ucap-webmessenger/protocol-info'; + +export const userNotification = createAction( + '[Account::Info] User Notification', + props<{ noti: UserNotification }>() +); diff --git a/projects/ucap-webmessenger-app/src/app/store/account/info/effects.ts b/projects/ucap-webmessenger-app/src/app/store/account/info/effects.ts new file mode 100644 index 00000000..57c12f8b --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/store/account/info/effects.ts @@ -0,0 +1,29 @@ +import { Injectable } from '@angular/core'; + +import { Actions, createEffect, ofType } from '@ngrx/effects'; + +import { Store } from '@ngrx/store'; + +import { NGXLogger } from 'ngx-logger'; +import { userNotification } from './actions'; +import { map, tap } from 'rxjs/operators'; + +@Injectable() +export class Effects { + userNotification$ = createEffect( + () => { + return this.actions$.pipe( + ofType(userNotification), + map(action => action.noti), + tap(noti => {}) + ); + }, + { dispatch: false } + ); + + constructor( + private actions$: Actions, + private store: Store, + private logger: NGXLogger + ) {} +} diff --git a/projects/ucap-webmessenger-app/src/app/store/account/info/index.ts b/projects/ucap-webmessenger-app/src/app/store/account/info/index.ts new file mode 100644 index 00000000..2663cade --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/store/account/info/index.ts @@ -0,0 +1,4 @@ +export * from './actions'; +export * from './effects'; +export * from './reducers'; +export * from './state'; diff --git a/projects/ucap-webmessenger-app/src/app/store/account/info/reducers.ts b/projects/ucap-webmessenger-app/src/app/store/account/info/reducers.ts new file mode 100644 index 00000000..70e7e209 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/store/account/info/reducers.ts @@ -0,0 +1,4 @@ +import { createReducer, on } from '@ngrx/store'; +import { initialState } from './state'; + +export const reducer = createReducer(initialState); diff --git a/projects/ucap-webmessenger-app/src/app/store/account/info/state.ts b/projects/ucap-webmessenger-app/src/app/store/account/info/state.ts new file mode 100644 index 00000000..24114eb8 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/store/account/info/state.ts @@ -0,0 +1,18 @@ +import { Selector, createSelector } from '@ngrx/store'; + +export interface State { + selectedRoom: string | null; +} + +export const initialState: State = { + selectedRoom: null +}; + +export function selectors(selector: Selector) { + return { + selectedRoom: createSelector( + selector, + (state: State) => state.selectedRoom + ) + }; +} diff --git a/projects/ucap-webmessenger-app/src/app/store/messenger/event/actions.ts b/projects/ucap-webmessenger-app/src/app/store/messenger/event/actions.ts index 25947104..b095f29a 100644 --- a/projects/ucap-webmessenger-app/src/app/store/messenger/event/actions.ts +++ b/projects/ucap-webmessenger-app/src/app/store/messenger/event/actions.ts @@ -4,7 +4,11 @@ import { Info, InfoResponse, SendResponse, - SendRequest + SendRequest, + SendNotification, + ReadNotification, + CancelNotification, + DelNotification } from '@ucap-webmessenger/protocol-event'; export const info = createAction( @@ -57,3 +61,23 @@ export const sendFailure = createAction( '[Messenger::Event] Send Failure', props<{ error: any }>() ); + +export const sendNotification = createAction( + '[Messenger::Event] Send Notification', + props<{ noti: SendNotification }>() +); + +export const readNotification = createAction( + '[Messenger::Event] Read Notification', + props<{ noti: ReadNotification }>() +); + +export const cancelNotification = createAction( + '[Messenger::Event] Cancel Notification', + props<{ noti: CancelNotification }>() +); + +export const delNotification = createAction( + '[Messenger::Event] Delete Notification', + props<{ noti: DelNotification }>() +); diff --git a/projects/ucap-webmessenger-app/src/app/store/messenger/event/effects.ts b/projects/ucap-webmessenger-app/src/app/store/messenger/event/effects.ts index 09a9448c..70e435dd 100644 --- a/projects/ucap-webmessenger-app/src/app/store/messenger/event/effects.ts +++ b/projects/ucap-webmessenger-app/src/app/store/messenger/event/effects.ts @@ -35,7 +35,11 @@ import { sendSuccess, sendFailure, appendInfoList, - newInfo + newInfo, + sendNotification, + readNotification, + cancelNotification, + delNotification } from './actions'; import { SessionStorageService } from '@ucap-webmessenger/web-storage'; import { RoomInfo } from '@ucap-webmessenger/protocol-room'; @@ -130,6 +134,30 @@ export class Effects { { dispatch: false } ); + sendNotification$ = createEffect( + () => { + return this.actions$.pipe( + ofType(sendNotification), + map(action => action.noti), + tap(noti => { + const appendInfo: Info = { + seq: noti.seq, + type: noti.eventType, + senderSeq: noti.SENDER_SEQ, + sendDate: noti.sendDate, + sentMessage: noti.message, + receiverCount: noti.receiverCount + }; + + this.store.dispatch( + newInfo({ roomSeq: noti.roomSeq, info: appendInfo }) + ); + }) + ); + }, + { dispatch: false } + ); + newInfo$ = createEffect( () => { return this.actions$.pipe( @@ -151,6 +179,39 @@ export class Effects { { dispatch: false } ); + readNotification$ = createEffect( + () => { + return this.actions$.pipe( + ofType(readNotification), + map(action => action.noti), + tap(noti => {}) + ); + }, + { dispatch: false } + ); + + cancelNotification$ = createEffect( + () => { + return this.actions$.pipe( + ofType(cancelNotification), + map(action => action.noti), + tap(noti => {}) + ); + }, + { dispatch: false } + ); + + delNotification$ = createEffect( + () => { + return this.actions$.pipe( + ofType(delNotification), + map(action => action.noti), + tap(noti => {}) + ); + }, + { dispatch: false } + ); + constructor( private actions$: Actions, private store: Store, diff --git a/projects/ucap-webmessenger-app/src/app/store/messenger/room/actions.ts b/projects/ucap-webmessenger-app/src/app/store/messenger/room/actions.ts index c2668f19..1b6fcb4b 100644 --- a/projects/ucap-webmessenger-app/src/app/store/messenger/room/actions.ts +++ b/projects/ucap-webmessenger-app/src/app/store/messenger/room/actions.ts @@ -3,7 +3,11 @@ import { InfoRequest, RoomInfo, UserInfoShort, - UserInfo + UserInfo, + InviteNotification, + ExitNotification, + ExitForcingNotification, + UpdateFontNotification } from '@ucap-webmessenger/protocol-room'; export const info = createAction( @@ -24,3 +28,23 @@ export const infoFailure = createAction( '[Messenger::Room] Info Failure', props<{ error: any }>() ); + +export const inviteNotification = createAction( + '[Messenger::Room] Invite Notification', + props<{ noti: InviteNotification }>() +); + +export const exitNotification = createAction( + '[Messenger::Room] Exit Notification', + props<{ noti: ExitNotification }>() +); + +export const exitForcingNotification = createAction( + '[Messenger::Room] Exit Forcing Notification', + props<{ noti: ExitForcingNotification }>() +); + +export const updateFontNotification = createAction( + '[Messenger::Room] Update Font Notification', + props<{ noti: UpdateFontNotification }>() +); diff --git a/projects/ucap-webmessenger-app/src/app/store/messenger/room/effects.ts b/projects/ucap-webmessenger-app/src/app/store/messenger/room/effects.ts index 6c1d1228..9c76f45d 100644 --- a/projects/ucap-webmessenger-app/src/app/store/messenger/room/effects.ts +++ b/projects/ucap-webmessenger-app/src/app/store/messenger/room/effects.ts @@ -24,7 +24,15 @@ import { import * as ChatStore from '@app/store/messenger/chat'; -import { info, infoSuccess, infoFailure } from './actions'; +import { + info, + infoSuccess, + infoFailure, + inviteNotification, + exitNotification, + exitForcingNotification, + updateFontNotification +} from './actions'; import { SessionStorageService } from '@ucap-webmessenger/web-storage'; import { LoginInfo, KEY_LOGIN_INFO } from '@app/types'; @@ -91,6 +99,47 @@ export class Effects { { dispatch: false } ); + inviteNotification$ = createEffect( + () => { + return this.actions$.pipe( + ofType(inviteNotification), + map(action => action.noti), + tap(noti => {}) + ); + }, + { dispatch: false } + ); + exitNotification$ = createEffect( + () => { + return this.actions$.pipe( + ofType(exitNotification), + map(action => action.noti), + tap(noti => {}) + ); + }, + { dispatch: false } + ); + exitForcingNotification$ = createEffect( + () => { + return this.actions$.pipe( + ofType(exitForcingNotification), + map(action => action.noti), + tap(noti => {}) + ); + }, + { dispatch: false } + ); + updateFontNotification$ = createEffect( + () => { + return this.actions$.pipe( + ofType(updateFontNotification), + map(action => action.noti), + tap(noti => {}) + ); + }, + { dispatch: false } + ); + constructor( private actions$: Actions, private store: Store, diff --git a/projects/ucap-webmessenger-app/src/app/store/messenger/status/actions.ts b/projects/ucap-webmessenger-app/src/app/store/messenger/status/actions.ts index 4dc37685..fb0a082f 100644 --- a/projects/ucap-webmessenger-app/src/app/store/messenger/status/actions.ts +++ b/projects/ucap-webmessenger-app/src/app/store/messenger/status/actions.ts @@ -1,7 +1,8 @@ import { createAction, props } from '@ngrx/store'; import { BulkInfoRequest, - StatusBulkInfo + StatusBulkInfo, + StatusNotification } from '@ucap-webmessenger/protocol-status'; export const bulkInfo = createAction( @@ -18,3 +19,8 @@ export const bulkInfoFailure = createAction( '[Messenger::Status] Bulk Info Failure', props<{ error: any }>() ); + +export const statusNotification = createAction( + '[Messenger::Status] Status Notification', + props<{ noti: StatusNotification }>() +); diff --git a/projects/ucap-webmessenger-app/src/app/store/messenger/status/effects.ts b/projects/ucap-webmessenger-app/src/app/store/messenger/status/effects.ts index c040ed71..73ebc590 100644 --- a/projects/ucap-webmessenger-app/src/app/store/messenger/status/effects.ts +++ b/projects/ucap-webmessenger-app/src/app/store/messenger/status/effects.ts @@ -6,7 +6,12 @@ import { Store } from '@ngrx/store'; import { NGXLogger } from 'ngx-logger'; import * as SyncStore from '@app/store/messenger/sync'; -import { bulkInfo, bulkInfoSuccess, bulkInfoFailure } from './actions'; +import { + bulkInfo, + bulkInfoSuccess, + bulkInfoFailure, + statusNotification +} from './actions'; import { tap, switchMap, map, catchError } from 'rxjs/operators'; import { StatusProtocolService, @@ -68,6 +73,17 @@ export class Effects { { dispatch: false } ); + statusNotification$ = createEffect( + () => { + return this.actions$.pipe( + ofType(statusNotification), + map(action => action.noti), + tap(noti => {}) + ); + }, + { dispatch: false } + ); + constructor( private actions$: Actions, private store: Store, From 9b0106a4bef04461ac4e90261d6a8f289be408e4 Mon Sep 17 00:00:00 2001 From: Richard Park Date: Fri, 11 Oct 2019 15:55:27 +0900 Subject: [PATCH 2/4] receive alarm is implemented --- .../components/messages.component.html | 38 ++++++++++++-- .../components/messages.component.ts | 5 ++ .../components/template.page.component.ts | 2 +- .../src/app/store/messenger/room/actions.ts | 26 +++++++++- .../src/app/store/messenger/room/effects.ts | 52 +++++++++++++++++-- .../src/app/store/messenger/room/reducers.ts | 13 ++++- .../src/app/store/messenger/sync/reducers.ts | 18 +++++++ .../src/lib/models/room-info.ts | 28 +++++----- .../src/lib/protocols/info.ts | 2 +- .../src/lib/protocols/update.ts | 32 ++++++------ .../src/lib/protocols/room.ts | 2 +- .../src/lib/components/messages.component.ts | 8 +++ 12 files changed, 183 insertions(+), 43 deletions(-) diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.html b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.html index c2cf30a0..95ec3ac8 100644 --- a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.html +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.html @@ -5,14 +5,37 @@
-
- + + @@ -25,11 +48,18 @@
- +
- +
diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.ts index 25deb750..a81ff6da 100644 --- a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.ts +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.ts @@ -14,6 +14,7 @@ import { Info, EventType } from '@ucap-webmessenger/protocol-event'; import * as AppStore from '@app/store'; import * as EventStore from '@app/store/messenger/event'; +import * as RoomStore from '@app/store/messenger/room'; import { LoginResponse } from '@ucap-webmessenger/protocol-authentication'; import { SessionStorageService } from '@ucap-webmessenger/web-storage'; import { LoginInfo, KEY_LOGIN_INFO } from '@app/types'; @@ -108,6 +109,10 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewChecked { ); } + onClickReceiveAlarm() { + this.store.dispatch(RoomStore.updateOnlyAlarm({ roomInfo: this.roomInfo })); + } + private scrollToBottomForMessageBoxContainer(): void { try { this.messageBoxContainer.nativeElement.scrollTop = this.messageBoxContainer.nativeElement.scrollHeight; diff --git a/projects/ucap-webmessenger-app/src/app/pages/template/components/template.page.component.ts b/projects/ucap-webmessenger-app/src/app/pages/template/components/template.page.component.ts index 407db74b..241765e5 100644 --- a/projects/ucap-webmessenger-app/src/app/pages/template/components/template.page.component.ts +++ b/projects/ucap-webmessenger-app/src/app/pages/template/components/template.page.component.ts @@ -106,7 +106,7 @@ const roomInfo: RoomInfo = { finalEventDate: '2019-09-30 13:57:06', joinUserCount: 2, noReadCnt: 0, - isAlarm: true, + receiveAlarm: true, isJoinRoom: true, expiredFileStdSeq: 0, isTimeRoom: true, diff --git a/projects/ucap-webmessenger-app/src/app/store/messenger/room/actions.ts b/projects/ucap-webmessenger-app/src/app/store/messenger/room/actions.ts index 1b6fcb4b..39e0df30 100644 --- a/projects/ucap-webmessenger-app/src/app/store/messenger/room/actions.ts +++ b/projects/ucap-webmessenger-app/src/app/store/messenger/room/actions.ts @@ -7,7 +7,9 @@ import { InviteNotification, ExitNotification, ExitForcingNotification, - UpdateFontNotification + UpdateFontNotification, + UpdateResponse, + UpdateRequest } from '@ucap-webmessenger/protocol-room'; export const info = createAction( @@ -48,3 +50,25 @@ export const updateFontNotification = createAction( '[Messenger::Room] Update Font Notification', props<{ noti: UpdateFontNotification }>() ); + +export const updateOnlyAlarm = createAction( + '[Messenger::Room] Update Only Alarm', + props<{ roomInfo: RoomInfo }>() +); + +export const update = createAction( + '[Messenger::Room] Update', + props<{ req: UpdateRequest }>() +); + +export const updateSuccess = createAction( + '[Messenger::Room] Update Success', + props<{ + res: UpdateResponse; + }>() +); + +export const updateFailure = createAction( + '[Messenger::Room] Update Failure', + props<{ error: any }>() +); diff --git a/projects/ucap-webmessenger-app/src/app/store/messenger/room/effects.ts b/projects/ucap-webmessenger-app/src/app/store/messenger/room/effects.ts index 9c76f45d..8b91b6ea 100644 --- a/projects/ucap-webmessenger-app/src/app/store/messenger/room/effects.ts +++ b/projects/ucap-webmessenger-app/src/app/store/messenger/room/effects.ts @@ -2,12 +2,19 @@ import { Injectable } from '@angular/core'; import { Actions, createEffect, ofType } from '@ngrx/effects'; -import { Store } from '@ngrx/store'; +import { Store, select } from '@ngrx/store'; import { NGXLogger } from 'ngx-logger'; import { of } from 'rxjs'; -import { tap, switchMap, map, catchError } from 'rxjs/operators'; +import { + tap, + switchMap, + map, + catchError, + exhaustMap, + withLatestFrom +} from 'rxjs/operators'; import { RoomInfo, UserInfoShort, @@ -19,7 +26,8 @@ import { SSVC_TYPE_ROOM_INFO_USER2, SSVC_TYPE_ROOM_INFO_RES, UserShortData, - UserData + UserData, + UpdateResponse } from '@ucap-webmessenger/protocol-room'; import * as ChatStore from '@app/store/messenger/chat'; @@ -31,7 +39,11 @@ import { inviteNotification, exitNotification, exitForcingNotification, - updateFontNotification + updateFontNotification, + updateOnlyAlarm, + update, + updateSuccess, + updateFailure } from './actions'; import { SessionStorageService } from '@ucap-webmessenger/web-storage'; import { LoginInfo, KEY_LOGIN_INFO } from '@app/types'; @@ -99,6 +111,38 @@ export class Effects { { dispatch: false } ); + update$ = createEffect(() => + this.actions$.pipe( + ofType(update), + map(action => action.req), + exhaustMap(req => { + return this.roomProtocolService.update(req).pipe( + map((res: UpdateResponse) => { + return updateSuccess({ res }); + }), + catchError(error => of(updateFailure({ error }))) + ); + }) + ) + ); + + updateOnlyAlarm$ = createEffect(() => + this.actions$.pipe( + ofType(updateOnlyAlarm), + map(action => action.roomInfo), + map(roomInfo => + update({ + req: { + roomSeq: roomInfo.roomSeq, + roomName: roomInfo.roomName, + receiveAlarm: !roomInfo.receiveAlarm, + syncAll: false + } + }) + ) + ) + ); + inviteNotification$ = createEffect( () => { return this.actions$.pipe( diff --git a/projects/ucap-webmessenger-app/src/app/store/messenger/room/reducers.ts b/projects/ucap-webmessenger-app/src/app/store/messenger/room/reducers.ts index ac717cab..f963adb6 100644 --- a/projects/ucap-webmessenger-app/src/app/store/messenger/room/reducers.ts +++ b/projects/ucap-webmessenger-app/src/app/store/messenger/room/reducers.ts @@ -1,6 +1,6 @@ import { createReducer, on } from '@ngrx/store'; import { initialState } from './state'; -import { infoSuccess } from './actions'; +import { infoSuccess, updateSuccess } from './actions'; import * as AuthenticationStore from '@app/store/account/authentication'; @@ -15,6 +15,17 @@ export const reducer = createReducer( }; }), + on(updateSuccess, (state, action) => { + return { + ...state, + roomInfo: { + ...state.roomInfo, + roomName: action.res.roomName, + receiveAlarm: action.res.receiveAlarm + } + }; + }), + on(AuthenticationStore.logout, (state, action) => { return { ...initialState 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 2db0ae37..f9e02997 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 @@ -19,6 +19,8 @@ import { } from '@ucap-webmessenger/protocol-sync'; import * as AuthenticationStore from '@app/store/account/authentication'; +import * as RoomStore from '@app/store/messenger/room'; +import { RoomInfo } from '@ucap-webmessenger/protocol-room'; export const reducer = createReducer( initialState, @@ -95,6 +97,22 @@ export const reducer = createReducer( }; }), + on(RoomStore.updateSuccess, (state, action) => { + const roomInfo: RoomInfo = { + ...state.room.entities[action.res.roomSeq], + roomName: action.res.roomName, + receiveAlarm: action.res.receiveAlarm + }; + + return { + ...state, + room: adapterRoom.updateOne( + { id: action.res.roomSeq, changes: roomInfo }, + { ...state.room } + ) + }; + }), + on(AuthenticationStore.logout, (state, action) => { return { ...initialState diff --git a/projects/ucap-webmessenger-protocol-room/src/lib/models/room-info.ts b/projects/ucap-webmessenger-protocol-room/src/lib/models/room-info.ts index 412b89af..bfe878d5 100644 --- a/projects/ucap-webmessenger-protocol-room/src/lib/models/room-info.ts +++ b/projects/ucap-webmessenger-protocol-room/src/lib/models/room-info.ts @@ -2,30 +2,30 @@ import { RoomType } from '../types/room.type'; import { EventType } from '@ucap-webmessenger/protocol-event'; export interface RoomInfo { - // 0. 대화방SEQ + /** 0. 대화방SEQ */ roomSeq: string; - // 1. 대화방종류 + /** 1. 대화방종류 */ roomType: RoomType; - // 2. 대화방명 + /** 2. 대화방명 */ roomName: string; - // 3. 최종타입 + /** 3. 최종타입 */ finalEventType: EventType; - // 4. 최종대화 + /** 4. 최종대화 */ finalEventMessage: string; - // 5. 최종시간 + /** 5. 최종시간 */ finalEventDate: string; - // 6. 참여인원수 + /** 6. 참여인원수 */ joinUserCount: number; - // 7. 안읽은수 + /** 7. 안읽은수 */ noReadCnt: number; - // 8. 알람여부 - isAlarm: boolean; - // 9. 참여여부 + /** 8. 알람여부 */ + receiveAlarm: boolean; + /** 9. 참여여부 */ isJoinRoom: boolean; - // 10. 유효한파일 이벤트 기준 SEQ + /** 10. 유효한파일 이벤트 기준 SEQ */ expiredFileStdSeq: number; - // 11. 타이머대화방여부YN + /** 11. 타이머대화방여부YN */ isTimeRoom: boolean; - // 12. 타이머시간(n) + /** 12. 타이머시간(n) */ timeRoomInterval: number; } diff --git a/projects/ucap-webmessenger-protocol-room/src/lib/protocols/info.ts b/projects/ucap-webmessenger-protocol-room/src/lib/protocols/info.ts index 253d7bee..4bfcbf5f 100644 --- a/projects/ucap-webmessenger-protocol-room/src/lib/protocols/info.ts +++ b/projects/ucap-webmessenger-protocol-room/src/lib/protocols/info.ts @@ -90,7 +90,7 @@ export const decodeInfoData: ProtocolDecoder = ( finalEventDate: info[5], joinUserCount: Number(info[6]), noReadCnt: Number(info[7]), - isAlarm: info[8] !== 'N' ? true : false, + receiveAlarm: info[8] !== 'N' ? true : false, isJoinRoom: info[9] === 'Y' ? true : false, expiredFileStdSeq: Number(info[10]), isTimeRoom: info[11] === 'Y' ? true : false, diff --git a/projects/ucap-webmessenger-protocol-room/src/lib/protocols/update.ts b/projects/ucap-webmessenger-protocol-room/src/lib/protocols/update.ts index a400ccde..d191ec6c 100644 --- a/projects/ucap-webmessenger-protocol-room/src/lib/protocols/update.ts +++ b/projects/ucap-webmessenger-protocol-room/src/lib/protocols/update.ts @@ -11,25 +11,25 @@ import { } from '@ucap-webmessenger/protocol'; export interface UpdateRequest extends ProtocolRequest { - // 대화방SEQ(s) + /** 대화방SEQ(s) */ roomSeq: string; - // 대화방제목(s) + /** 대화방제목(s) */ roomName: string; - // 알람여부(y) - isAlarm: boolean; - // 동기화여부(s) - isSyncAll: boolean; + /** 알람여부(y) */ + receiveAlarm: boolean; + /** 동기화여부(s) */ + syncAll: boolean; } export interface UpdateResponse extends ProtocolResponse { - // 대화방SEQ(s) + /** 대화방SEQ(s) */ roomSeq: string; - // 대화방제목(s) + /** 대화방제목(s) */ roomName: string; - // 알람여부(y) - isAlarm: boolean; - // 동기화여부(s) - isSyncAll: boolean; + /** 알람여부(y) */ + receiveAlarm: boolean; + /** 동기화여부(s) */ + syncAll: boolean; } export const encodeUpdate: ProtocolEncoder = ( @@ -41,11 +41,11 @@ export const encodeUpdate: ProtocolEncoder = ( bodyList.push({ type: PacketBodyValue.String, value: req.roomName }); bodyList.push({ type: PacketBodyValue.String, - value: req.isAlarm ? 'Y' : 'N' + value: req.receiveAlarm ? 'Y' : 'N' }); bodyList.push({ type: PacketBodyValue.String, - value: req.isSyncAll ? 'Y' : 'N' + value: req.syncAll ? 'Y' : 'N' }); return bodyList; }; @@ -56,8 +56,8 @@ export const decodeUpdate: ProtocolDecoder = ( return decodeProtocolMessage(message, { roomSeq: message.bodyList[0], roomName: message.bodyList[1], - isAlarm: message.bodyList[2] === 'Y' ? true : false, - isSyncAll: message.bodyList[3] === 'Y' ? true : false + receiveAlarm: message.bodyList[2] === 'Y' ? true : false, + syncAll: message.bodyList[3] === 'Y' ? true : false } as UpdateResponse); }; diff --git a/projects/ucap-webmessenger-protocol-sync/src/lib/protocols/room.ts b/projects/ucap-webmessenger-protocol-sync/src/lib/protocols/room.ts index 90249964..2fffe788 100644 --- a/projects/ucap-webmessenger-protocol-sync/src/lib/protocols/room.ts +++ b/projects/ucap-webmessenger-protocol-sync/src/lib/protocols/room.ts @@ -84,7 +84,7 @@ export const decodeRoomData: ProtocolDecoder = ( finalEventDate: info[5], joinUserCount: Number(info[6]), noReadCnt: Number(info[7]), - isAlarm: info[8] !== 'N' ? true : false, + receiveAlarm: info[8] !== 'N' ? true : false, isJoinRoom: info[9] === 'Y' ? true : false, expiredFileStdSeq: Number(info[10]), isTimeRoom: info[11] === 'Y' ? true : false, diff --git a/projects/ucap-webmessenger-ui-chat/src/lib/components/messages.component.ts b/projects/ucap-webmessenger-ui-chat/src/lib/components/messages.component.ts index 797d512e..639da6a2 100644 --- a/projects/ucap-webmessenger-ui-chat/src/lib/components/messages.component.ts +++ b/projects/ucap-webmessenger-ui-chat/src/lib/components/messages.component.ts @@ -36,6 +36,10 @@ export class MessagesComponent implements OnInit { } getUserName(seq: number): string { + if (!this.userInfos) { + return ''; + } + const userInfo: UserInfo[] = this.userInfos.filter( user => user.seq === seq ); @@ -45,6 +49,10 @@ export class MessagesComponent implements OnInit { return '(알수없는 사용자)'; } getUserProfile(seq: number): string { + if (!this.userInfos) { + return ''; + } + const userInfo: UserInfo[] = this.userInfos.filter( user => user.seq === seq ); From e9088572d5cbc229cb4a551fc618de5e1874d908 Mon Sep 17 00:00:00 2001 From: Richard Park Date: Fri, 11 Oct 2019 16:40:55 +0900 Subject: [PATCH 3/4] notification of status is implemented --- .../src/app/services/notification.service.ts | 38 ++++++++++++++++- .../src/app/store/messenger/status/effects.ts | 20 ++++----- .../app/store/messenger/status/reducers.ts | 32 +++++++++++++-- .../src/app/store/messenger/status/state.ts | 41 ++++++++++++++++--- .../src/lib/services/room-protocol.service.ts | 2 + 5 files changed, 112 insertions(+), 21 deletions(-) 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 d0043df8..e6a268f7 100644 --- a/projects/ucap-webmessenger-app/src/app/services/notification.service.ts +++ b/projects/ucap-webmessenger-app/src/app/services/notification.service.ts @@ -12,8 +12,6 @@ import { LogoutRemoteNotification } from '@ucap-webmessenger/protocol-authentication'; -import * as AuthenticationStore from '@app/store/account/authentication'; -import * as EventStore from '@app/store/messenger/event'; import { NGXLogger } from 'ngx-logger'; import { EventProtocolService, @@ -53,6 +51,12 @@ import { UpdateFontNotification } from '@ucap-webmessenger/protocol-room'; +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 RoomStore from '@app/store/messenger/room'; +import * as StatusStore from '@app/store/messenger/status'; + @Injectable() export class AppNotificationService { constructor( @@ -175,6 +179,11 @@ export class AppNotificationService { 'Notification::infoProtocolService::UserNotification', noti ); + this.store.dispatch( + InfoStore.userNotification({ + noti + }) + ); } break; default: @@ -194,6 +203,11 @@ export class AppNotificationService { 'Notification::roomProtocolService::InviteNotification', noti ); + this.store.dispatch( + RoomStore.inviteNotification({ + noti + }) + ); } break; case SSVC_TYPE_ROOM_EXIT_NOTI: @@ -203,6 +217,11 @@ export class AppNotificationService { 'Notification::roomProtocolService::ExitNotification', noti ); + this.store.dispatch( + RoomStore.exitNotification({ + noti + }) + ); } break; case SSVC_TYPE_ROOM_EXIT_FORCING_NOTI: @@ -212,6 +231,11 @@ export class AppNotificationService { 'Notification::roomProtocolService::ExitForcingNotification', noti ); + this.store.dispatch( + RoomStore.exitForcingNotification({ + noti + }) + ); } break; case SSVC_TYPE_ROOM_FONT_UPD_NOTI: @@ -221,6 +245,11 @@ export class AppNotificationService { 'Notification::roomProtocolService::UpdateFontNotification', noti ); + this.store.dispatch( + RoomStore.updateFontNotification({ + noti + }) + ); } break; default: @@ -240,6 +269,11 @@ export class AppNotificationService { 'Notification::statusProtocolService::StatusNotification', noti ); + this.store.dispatch( + StatusStore.statusNotification({ + noti + }) + ); } break; default: diff --git a/projects/ucap-webmessenger-app/src/app/store/messenger/status/effects.ts b/projects/ucap-webmessenger-app/src/app/store/messenger/status/effects.ts index 73ebc590..f8044353 100644 --- a/projects/ucap-webmessenger-app/src/app/store/messenger/status/effects.ts +++ b/projects/ucap-webmessenger-app/src/app/store/messenger/status/effects.ts @@ -73,16 +73,16 @@ export class Effects { { dispatch: false } ); - statusNotification$ = createEffect( - () => { - return this.actions$.pipe( - ofType(statusNotification), - map(action => action.noti), - tap(noti => {}) - ); - }, - { dispatch: false } - ); + // statusNotification$ = createEffect( + // () => { + // return this.actions$.pipe( + // ofType(statusNotification), + // map(action => action.noti), + // tap(noti => {}) + // ); + // }, + // { dispatch: false } + // ); constructor( private actions$: Actions, diff --git a/projects/ucap-webmessenger-app/src/app/store/messenger/status/reducers.ts b/projects/ucap-webmessenger-app/src/app/store/messenger/status/reducers.ts index 300d62a1..ffdb69c4 100644 --- a/projects/ucap-webmessenger-app/src/app/store/messenger/status/reducers.ts +++ b/projects/ucap-webmessenger-app/src/app/store/messenger/status/reducers.ts @@ -1,15 +1,41 @@ import { createReducer, on } from '@ngrx/store'; -import { initialState } from './state'; -import { bulkInfoSuccess } from './actions'; +import { initialState, State, adapterStatusBulkInfo } from './state'; +import { bulkInfoSuccess, statusNotification } from './actions'; import * as AuthenticationStore from '@app/store/account/authentication'; +import { StatusBulkInfo } from '@ucap-webmessenger/protocol-status'; export const reducer = createReducer( initialState, on(bulkInfoSuccess, (state, action) => { return { ...state, - statusBulkInfoList: action.statusBulkInfoList + statusBulkInfo: adapterStatusBulkInfo.addAll(action.statusBulkInfoList, { + ...state.statusBulkInfo + }) + } as State; + }), + + on(statusNotification, (state, action) => { + const noti = action.noti; + + const statusBulkInfoState: StatusBulkInfo = { + ...state.statusBulkInfo.entities[noti.userSeq], + conferenceStatus: noti.conferenceStatus, + imessengerStatus: noti.imessengerStatus, + mobileConferenceStatus: noti.mobileConferenceStatus, + mobileStatus: noti.mobileStatus, + pcStatus: noti.pcStatus, + phoneStatus: noti.phoneStatus, + statusMessage: noti.statusMessage + }; + + return { + ...state, + statusBulkInfo: adapterStatusBulkInfo.updateOne( + { id: noti.userSeq, changes: statusBulkInfoState }, + { ...state.statusBulkInfo } + ) }; }), diff --git a/projects/ucap-webmessenger-app/src/app/store/messenger/status/state.ts b/projects/ucap-webmessenger-app/src/app/store/messenger/status/state.ts index 3a0c1767..9038cc74 100644 --- a/projects/ucap-webmessenger-app/src/app/store/messenger/status/state.ts +++ b/projects/ucap-webmessenger-app/src/app/store/messenger/status/state.ts @@ -1,19 +1,48 @@ import { Selector, createSelector } from '@ngrx/store'; import { StatusBulkInfo } from '@ucap-webmessenger/protocol-status'; +import { EntityState, createEntityAdapter } from '@ngrx/entity'; + +export interface StatusBulkInfoState extends EntityState {} export interface State { - statusBulkInfoList: StatusBulkInfo[]; + statusBulkInfo: StatusBulkInfoState; } +export const adapterStatusBulkInfo = createEntityAdapter({ + selectId: statusBulkInfo => statusBulkInfo.userSeq +}); + +const statusBulkInfoInitialState: StatusBulkInfoState = adapterStatusBulkInfo.getInitialState( + {} +); + export const initialState: State = { - statusBulkInfoList: [] + statusBulkInfo: statusBulkInfoInitialState }; +const { + selectAll: ngeSelectAllStatusBulkInfo, + selectEntities: ngeSelectEntitiesStatusBulkInfo, + selectIds: ngeSelectIdsStatusBulkInfo, + selectTotal: ngeSelectTotalStatusBulkInfo +} = adapterStatusBulkInfo.getSelectors(); + export function selectors(selector: Selector) { + const selectStatusBulkInfo = createSelector( + selector, + (state: State) => state.statusBulkInfo + ); + return { - statusBulkInfoList: createSelector( - selector, - (state: State) => state.statusBulkInfoList - ) + selectAllStatusBulkInfo: createSelector( + selectStatusBulkInfo, + ngeSelectAllStatusBulkInfo + ), + selectStatusBulkInfo: (userSeq: number) => + createSelector( + selectStatusBulkInfo, + ngeSelectEntitiesStatusBulkInfo, + (_, entities) => entities[userSeq] + ) }; } diff --git a/projects/ucap-webmessenger-protocol-room/src/lib/services/room-protocol.service.ts b/projects/ucap-webmessenger-protocol-room/src/lib/services/room-protocol.service.ts index a8eface0..4172c13e 100644 --- a/projects/ucap-webmessenger-protocol-room/src/lib/services/room-protocol.service.ts +++ b/projects/ucap-webmessenger-protocol-room/src/lib/services/room-protocol.service.ts @@ -286,6 +286,7 @@ export class RoomProtocolService { }) ); } + public updateTimerSet( req: UpdateTimerSetRequest ): Observable { @@ -302,6 +303,7 @@ export class RoomProtocolService { }) ); } + public updateFont(req: UpdateFontRequest): Observable { return this.protocolService .call( From fee7aa70b035639557996ad64fae42934cf51fc3 Mon Sep 17 00:00:00 2001 From: Richard Park Date: Fri, 11 Oct 2019 17:52:00 +0900 Subject: [PATCH 4/4] content projection is applied --- .../left-sidenav/group.component.html | 13 ++++++-- .../left-sidenav/group.component.ts | 3 +- .../components/expansion-panel.component.html | 33 +++++++++++++++---- .../components/expansion-panel.component.ts | 11 ++++++- 4 files changed, 50 insertions(+), 10 deletions(-) diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/group.component.html b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/group.component.html index 9c1da020..27942a51 100644 --- a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/group.component.html +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/group.component.html @@ -36,8 +36,17 @@
- + + +
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 ca7d0830..364817b3 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 @@ -144,7 +144,8 @@ export class GroupComponent implements OnInit { } onSelectBuddy(buddy: UserInfo) { - this.store.dispatch(ChatStore.selectedRoom({ roomSeq: String(buddy.seq) })); + // this.store.dispatch(ChatStore.selectedRoom({ roomSeq: String(buddy.seq) })); + this.logger.debug('onSelectBuddy', buddy); } onKeyDownEnterOrganizationTenantSearch(params: { diff --git a/projects/ucap-webmessenger-ui-group/src/lib/components/expansion-panel.component.html b/projects/ucap-webmessenger-ui-group/src/lib/components/expansion-panel.component.html index f2608e58..6448fcf7 100644 --- a/projects/ucap-webmessenger-ui-group/src/lib/components/expansion-panel.component.html +++ b/projects/ucap-webmessenger-ui-group/src/lib/components/expansion-panel.component.html @@ -5,9 +5,20 @@ - - + + + + + + @@ -16,9 +27,19 @@ - - + + + + + diff --git a/projects/ucap-webmessenger-ui-group/src/lib/components/expansion-panel.component.ts b/projects/ucap-webmessenger-ui-group/src/lib/components/expansion-panel.component.ts index fa5823dc..d5de689d 100644 --- a/projects/ucap-webmessenger-ui-group/src/lib/components/expansion-panel.component.ts +++ b/projects/ucap-webmessenger-ui-group/src/lib/components/expansion-panel.component.ts @@ -4,13 +4,16 @@ import { Input, Output, EventEmitter, - ViewChild + ViewChild, + ContentChild, + TemplateRef } from '@angular/core'; import { ucapAnimations } from '@ucap-webmessenger/ui'; import { GroupDetailData, UserInfo } from '@ucap-webmessenger/protocol-sync'; import { MatAccordion } from '@angular/material'; +import { ExpansionPanelItemDirective } from '../directives/expansion-panel-item.directive'; @Component({ selector: 'ucap-group-expansion-panel', @@ -28,6 +31,12 @@ export class ExpansionPanelComponent implements OnInit { @Output() selectBuddy = new EventEmitter(); + @ContentChild(ExpansionPanelItemDirective, { + read: TemplateRef, + static: true + }) + expansionPanelItemTemplateRef: TemplateRef; + @ViewChild('groupAccordion', { static: true }) groupAccordion: MatAccordion; constructor() {}