From 7ec9d2356b999a157d215ea37741ad6780807cb2 Mon Sep 17 00:00:00 2001 From: leejh Date: Tue, 15 Oct 2019 19:09:26 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=EC=88=98=EC=A0=95=20::=20event=20info=20st?= =?UTF-8?q?ate=20=EB=A5=BC=20entity=20=EC=B2=98=EB=A6=AC=20=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95.=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84=20::=20=EB=8C=80=ED=99=94=20=ED=9A=8C?= =?UTF-8?q?=EC=88=98=EC=8B=9C=20=ED=98=84=EC=9E=AC=20=EB=8C=80=ED=99=94?= =?UTF-8?q?=EB=B0=A9=EC=9D=98=20event=20=ED=9A=8C=EC=88=98=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=ED=95=A0=20=EC=88=98=20=EC=9E=88=EB=8F=84=EB=A1=9D?= =?UTF-8?q?=20=EC=88=98=EC=A0=95.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/messages.component.ts | 2 +- .../src/app/store/messenger/event/actions.ts | 7 +++ .../src/app/store/messenger/event/effects.ts | 19 ++++++-- .../src/app/store/messenger/event/reducers.ts | 46 +++++++++++++++++-- .../src/app/store/messenger/event/state.ts | 42 +++++++++++++++-- 5 files changed, 105 insertions(+), 11 deletions(-) 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 1bebf749..35f3b5ae 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 @@ -83,7 +83,7 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewChecked { ); this.eventList$ = this.store.pipe( - select(AppStore.MessengerSelector.EventSelector.infoList) + select(AppStore.MessengerSelector.EventSelector.selectAllInfoList) ); this.scrollToBottomForMessageBoxContainer(); 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 b095f29a..9edd9bc8 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 @@ -37,6 +37,13 @@ export const newInfo = createAction( }>() ); +export const recallInfoList = createAction( + '[Messenger::Event] recall InfoList', + props<{ + eventSeq: number; + }>() +); + export const appendInfoList = createAction( '[Messenger::Event] Append InfoList', props<{ 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 70e435dd..4dcaf2bc 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 @@ -39,7 +39,8 @@ import { sendNotification, readNotification, cancelNotification, - delNotification + delNotification, + recallInfoList } from './actions'; import { SessionStorageService } from '@ucap-webmessenger/web-storage'; import { RoomInfo } from '@ucap-webmessenger/protocol-room'; @@ -194,8 +195,20 @@ export class Effects { () => { return this.actions$.pipe( ofType(cancelNotification), - map(action => action.noti), - tap(noti => {}) + withLatestFrom( + this.store.pipe( + select((state: any) => state.messenger.room.roomInfo as RoomInfo) + ) + ), + tap(([action, roomInfo]) => { + if (!!roomInfo && roomInfo.roomSeq === action.noti.roomSeq) { + this.logger.debug('cancelNotification$', action, roomInfo); + this.store.dispatch( + recallInfoList({ eventSeq: action.noti.eventSeq }) + ); + // this.store.dispatch(ChatStore.newEventMessage(action)); + } + }) ); }, { dispatch: false } diff --git a/projects/ucap-webmessenger-app/src/app/store/messenger/event/reducers.ts b/projects/ucap-webmessenger-app/src/app/store/messenger/event/reducers.ts index 9b6fc5e2..5c6f8811 100644 --- a/projects/ucap-webmessenger-app/src/app/store/messenger/event/reducers.ts +++ b/projects/ucap-webmessenger-app/src/app/store/messenger/event/reducers.ts @@ -1,7 +1,14 @@ import { createReducer, on } from '@ngrx/store'; -import { initialState } from './state'; -import { infoSuccess, appendInfoList, info, infoFailure } from './actions'; +import { initialState, adapterInfoList } from './state'; +import { + infoSuccess, + appendInfoList, + info, + infoFailure, + recallInfoList +} from './actions'; import * as AuthenticationStore from '@app/store/account/authentication'; +import { Info, EventType } from '@ucap-webmessenger/protocol-event'; export const reducer = createReducer( initialState, @@ -15,7 +22,9 @@ export const reducer = createReducer( on(infoSuccess, (state, action) => { return { ...state, - infoList: action.infoList, + infoList: adapterInfoList.addAll(action.infoList, { + ...state.infoList + }), infoStatus: action.res, infoListProcessing: false }; @@ -29,9 +38,38 @@ export const reducer = createReducer( }), on(appendInfoList, (state, action) => { + const eventinfo = action.info; + + const statusEventInfo: Info = { + ...state.infoList.entities[eventinfo.seq], + type: eventinfo.type, + senderSeq: eventinfo.senderSeq, + sendDate: eventinfo.sendDate, + sentMessage: eventinfo.sentMessage, + receiverCount: eventinfo.receiverCount + }; + return { ...state, - infoList: [...state.infoList, action.info] + infoList: adapterInfoList.upsertOne(eventinfo, { ...state.infoList }) + }; + }), + + on(recallInfoList, (state, action) => { + const eventSeq = action.eventSeq; + + const statusEventInfo: Info = { + ...state.infoList.entities[eventSeq], + type: EventType.RecalledMessage, + sentMessage: '회수된 메시지' + }; + + return { + ...state, + infoList: adapterInfoList.updateOne( + { id: eventSeq, changes: statusEventInfo }, + { ...state.infoList } + ) }; }), diff --git a/projects/ucap-webmessenger-app/src/app/store/messenger/event/state.ts b/projects/ucap-webmessenger-app/src/app/store/messenger/event/state.ts index 42dcda6f..6e1fad19 100644 --- a/projects/ucap-webmessenger-app/src/app/store/messenger/event/state.ts +++ b/projects/ucap-webmessenger-app/src/app/store/messenger/event/state.ts @@ -1,19 +1,40 @@ import { Selector, createSelector } from '@ngrx/store'; import { InfoResponse, Info } from '@ucap-webmessenger/protocol-event'; +import { EntityState, createEntityAdapter } from '@ngrx/entity'; + +export interface InfoListState extends EntityState {} export interface State { infoListProcessing: boolean; - infoList: Info[] | null; + infoList: InfoListState; infoStatus: InfoResponse | null; } +export const adapterInfoList = createEntityAdapter({ + selectId: info => info.seq +}); + +const infoListInitialState: InfoListState = adapterInfoList.getInitialState({}); + export const initialState: State = { infoListProcessing: false, - infoList: null, + infoList: infoListInitialState, infoStatus: null }; +const { + selectAll: ngeSelectAllInfoList, + selectEntities: ngeSelectEntitiesInfoList, + selectIds: ngeSelectIdsInfoList, + selectTotal: ngeSelectTotalInfoList +} = adapterInfoList.getSelectors(); + export function selectors(selector: Selector) { + const selectInfoList = createSelector( + selector, + (state: State) => state.infoList + ); + return { infoListProcessing: createSelector( selector, @@ -26,6 +47,21 @@ export function selectors(selector: Selector) { infoStatus: createSelector( selector, (state: State) => state.infoStatus - ) + ), + + selectAllInfoList: createSelector( + selectInfoList, + ngeSelectAllInfoList + ), + selectEntitiesInfoList: createSelector( + selectInfoList, + ngeSelectEntitiesInfoList + ), + selectInfoList: (seq: number) => + createSelector( + selectInfoList, + ngeSelectEntitiesInfoList, + (_, entities) => (!!entities ? entities[seq] : undefined) + ) }; } From a679f4b2b9d0044f267afe43cbbd0d6af876e4df Mon Sep 17 00:00:00 2001 From: leejh Date: Wed, 16 Oct 2019 09:01:03 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=EC=88=98=EC=A0=95=20::=20=EB=8C=80?= =?UTF-8?q?=ED=99=94=20>=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=EC=9D=98=20finalEve?= =?UTF-8?q?ntMessage=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lib/components/list-item.component.html | 3 +- .../src/lib/components/list-item.component.ts | 66 ++++++++++++++++++- 2 files changed, 66 insertions(+), 3 deletions(-) diff --git a/projects/ucap-webmessenger-ui-room/src/lib/components/list-item.component.html b/projects/ucap-webmessenger-ui-room/src/lib/components/list-item.component.html index 5d48007e..9627bd11 100644 --- a/projects/ucap-webmessenger-ui-room/src/lib/components/list-item.component.html +++ b/projects/ucap-webmessenger-ui-room/src/lib/components/list-item.component.html @@ -1,5 +1,6 @@
{{ getRoomName(roomInfo) }}
{{ roomInfo.finalEventDate }}
-
{{ roomInfo.finalEventMessage }}
+
{{ finalEventMessage }}
+
noReadCnt : {{ roomInfo.noReadCnt }}
diff --git a/projects/ucap-webmessenger-ui-room/src/lib/components/list-item.component.ts b/projects/ucap-webmessenger-ui-room/src/lib/components/list-item.component.ts index c351e8f3..c98acf73 100644 --- a/projects/ucap-webmessenger-ui-room/src/lib/components/list-item.component.ts +++ b/projects/ucap-webmessenger-ui-room/src/lib/components/list-item.component.ts @@ -2,10 +2,18 @@ import { Component, OnInit, Input } from '@angular/core'; import { RoomInfo, UserInfoShort, - UserInfo as RoomUserInfo + UserInfo as RoomUserInfo, + RoomType } from '@ucap-webmessenger/protocol-room'; import { NGXLogger } from 'ngx-logger'; import { VersionInfo2Response } from '@ucap-webmessenger/api-public'; +import { EventType } from '@ucap-webmessenger/protocol-event'; +import { + FileInfo, + StickerInfo, + MassTextInfo +} from '@ucap-webmessenger/ui-chat'; +import { FileType } from '@ucap-webmessenger/protocol-file'; @Component({ selector: 'ucap-room-list-item', @@ -20,10 +28,60 @@ export class ListItemComponent implements OnInit { @Input() sessionVerinfo: VersionInfo2Response; + finalEventMessage: string; + constructor(private logger: NGXLogger) {} ngOnInit() { - // this.logger.debug(this.roomInfo); + if (this.roomInfo.isTimeRoom) { + this.finalEventMessage = '비밀 대화방입니다.'; + } else { + try { + switch (this.roomInfo.finalEventType) { + case EventType.File: + { + let msg = 'Attach File'; + const contentJson: FileInfo = JSON.parse( + this.roomInfo.finalEventMessage + ); + if (contentJson.FileType === FileType.File) { + msg = '첨부파일'; + } else if (contentJson.FileType === FileType.Image) { + msg = '이미지'; + } else if (contentJson.FileType === FileType.Video) { + msg = '동영상'; + } + this.finalEventMessage = msg; + } + break; + case EventType.Sticker: + { + let msg = '스티커'; + const contentJson: StickerInfo = JSON.parse( + this.roomInfo.finalEventMessage + ); + if (contentJson.chat) { + msg += ' ' + contentJson.chat; + } + this.finalEventMessage = msg; + } + break; + case EventType.MassText: + { + const contentJson: MassTextInfo = JSON.parse( + this.roomInfo.finalEventMessage + ); + this.finalEventMessage = contentJson.Content; + } + break; + default: + this.finalEventMessage = this.roomInfo.finalEventMessage; + } + } catch (e) { + this.logger.error(e); + this.finalEventMessage = this.roomInfo.finalEventMessage; + } + } } getRoomName(roomInfo: RoomInfo): string { @@ -31,6 +89,10 @@ export class ListItemComponent implements OnInit { return roomInfo.roomName; } + if (roomInfo.roomType === RoomType.Mytalk) { + return 'MyTalk'; + } + if (!!this.roomUserInfo && 0 < this.roomUserInfo.length) { let roomName = ''; this.roomUserInfo.forEach((roomUserInfo, index) => {