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 );