message event is modified

This commit is contained in:
병준 박 2019-10-10 13:35:32 +09:00
parent e644979645
commit 0703e2807a
7 changed files with 75 additions and 112 deletions

View File

@ -13,6 +13,7 @@ import {
} from '@ucap-webmessenger/protocol-authentication'; } from '@ucap-webmessenger/protocol-authentication';
import * as AuthenticationStore from '@app/store/account/authentication'; import * as AuthenticationStore from '@app/store/account/authentication';
import * as EventStore from '@app/store/messenger/event';
import { NGXLogger } from 'ngx-logger'; import { NGXLogger } from 'ngx-logger';
import { import {
EventProtocolService, EventProtocolService,
@ -20,7 +21,8 @@ import {
SendNotification, SendNotification,
SSVC_TYPE_EVENT_READ_NOTI, SSVC_TYPE_EVENT_READ_NOTI,
SSVC_TYPE_EVENT_CANCEL_NOTI, SSVC_TYPE_EVENT_CANCEL_NOTI,
SSVC_TYPE_EVENT_DEL_RES SSVC_TYPE_EVENT_DEL_RES,
Info
} from '@ucap-webmessenger/protocol-event'; } from '@ucap-webmessenger/protocol-event';
import { import {
InfoProtocolService, InfoProtocolService,
@ -105,6 +107,22 @@ export class AppNotificationService {
'Notification::eventProtocolService::SendNotification', 'Notification::eventProtocolService::SendNotification',
noti 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
})
);
} }
break; break;
case SSVC_TYPE_EVENT_READ_NOTI: case SSVC_TYPE_EVENT_READ_NOTI:

View File

@ -25,6 +25,14 @@ export const infoFailure = createAction(
props<{ error: any }>() props<{ error: any }>()
); );
export const newInfo = createAction(
'[Messenger::Event] New Info',
props<{
roomSeq: string;
info: Info;
}>()
);
export const appendInfoList = createAction( export const appendInfoList = createAction(
'[Messenger::Event] Append InfoList', '[Messenger::Event] Append InfoList',
props<{ props<{

View File

@ -2,12 +2,19 @@ import { Injectable } from '@angular/core';
import { Actions, createEffect, ofType } from '@ngrx/effects'; import { Actions, createEffect, ofType } from '@ngrx/effects';
import { Store } from '@ngrx/store'; import { Store, select } from '@ngrx/store';
import { NGXLogger } from 'ngx-logger'; import { NGXLogger } from 'ngx-logger';
import { of } from 'rxjs'; import { of } from 'rxjs';
import { tap, switchMap, map, catchError, exhaustMap } from 'rxjs/operators'; import {
tap,
switchMap,
map,
catchError,
exhaustMap,
withLatestFrom
} from 'rxjs/operators';
import { import {
InfoData, InfoData,
Info, Info,
@ -27,9 +34,11 @@ import {
send, send,
sendSuccess, sendSuccess,
sendFailure, sendFailure,
appendInfoList appendInfoList,
newInfo
} from './actions'; } from './actions';
import { SessionStorageService } from '@ucap-webmessenger/web-storage'; import { SessionStorageService } from '@ucap-webmessenger/web-storage';
import { RoomInfo } from '@ucap-webmessenger/protocol-room';
@Injectable() @Injectable()
export class Effects { export class Effects {
@ -112,7 +121,28 @@ export class Effects {
receiverCount: res.receiverCount receiverCount: res.receiverCount
}; };
this.store.dispatch(appendInfoList({ info: appendInfo })); this.store.dispatch(
newInfo({ roomSeq: res.roomSeq, info: appendInfo })
);
})
);
},
{ dispatch: false }
);
newInfo$ = createEffect(
() => {
return this.actions$.pipe(
ofType(newInfo),
withLatestFrom(
this.store.pipe(
select((state: any) => state.messenger.room.roomInfo as RoomInfo)
)
),
tap(([action, roomInfo]) => {
if (roomInfo.roomSeq === action.roomSeq) {
this.store.dispatch(appendInfoList({ info: action.info }));
}
}) })
); );
}, },

View File

@ -8,7 +8,7 @@ export interface Info {
// 발신자SEQ // 발신자SEQ
senderSeq: number; senderSeq: number;
// 발신일시 // 발신일시
sendDate: Date; sendDate: string;
// 발신내용 // 발신내용
sentMessage: string; sentMessage: string;
// 수신자수 // 수신자수

View File

@ -63,7 +63,7 @@ export const decodeInfoData: ProtocolDecoder<InfoData> = (
seq: info[0], seq: info[0],
type: info[1] as EventType, type: info[1] as EventType,
senderSeq: Number(info[2]), senderSeq: Number(info[2]),
sendDate: new Date(info[3]), sendDate: info[3],
sentMessage: info[4], sentMessage: info[4],
receiverCount: Number(info[5]) receiverCount: Number(info[5])
}); });

View File

@ -30,7 +30,7 @@ export interface SendResponse extends ProtocolResponse {
// 이벤트타입(s) // 이벤트타입(s)
eventType: EventType; eventType: EventType;
// 발생일시(s) // 발생일시(s)
sendDate: Date; sendDate: string;
// 이벤트내용(s) // 이벤트내용(s)
message: string; message: string;
// 수신자수 // 수신자수
@ -44,27 +44,27 @@ export interface SendResponse extends ProtocolResponse {
} }
export interface SendNotification extends ProtocolNotification { export interface SendNotification extends ProtocolNotification {
// 대화방SEQ(s) /** 대화방SEQ(s) */
roomSeq: string; roomSeq: string;
// 이벤트SEQ(n) /** 이벤트SEQ(n) */
seq: number; seq: number;
// 이벤트타입(s) /** 이벤트타입(s) */
eventType: EventType; eventType: EventType;
// 발생일시(s) /** 발생일시(s) */
sendDate: string; sendDate: string;
// 이벤트내용(s) /** 이벤트내용(s) */
message: string; message: string;
// 수신자수 /** 수신자수 */
receiverCount: number; receiverCount: number;
// 알림상태(s) PC 경우에만 관여됨 N: 푸시를 보내지 않은 이벤트 S: 푸시를 보낸 이벤트 /** 알림상태(s) PC 경우에만 관여됨 N: 푸시를 보내지 않은 이벤트 S: 푸시를 보낸 이벤트 */
pushStatus: PushStatus; pushStatus: PushStatus;
// 강퇴 타입(s) /** 강퇴 타입(s) */
ForcedExitType: string; ForcedExitType: string;
// 요청자 이름(s) /** 요청자 이름(s) */
senderName: string; senderName: string;
// 사용자아이디(s) /** 사용자아이디(s) */
id?: string; id?: string;
// 회사코드(s) /** 회사코드(s) */
companyCode?: string; companyCode?: string;
} }

View File

@ -1,16 +1,6 @@
import { TestBed } from '@angular/core/testing'; import { TestBed } from '@angular/core/testing';
import { EnviromentUtilService } from './enviroment-util.service'; import { EnviromentUtilService } from './enviroment-util.service';
import { interval, fromEvent, concat, merge, race, of, zip } from 'rxjs';
import {
take,
map,
combineAll,
tap,
mapTo,
delay,
switchMap
} from 'rxjs/operators';
describe('EnviromentUtilService', () => { describe('EnviromentUtilService', () => {
beforeEach(() => TestBed.configureTestingModule({})); beforeEach(() => TestBed.configureTestingModule({}));
@ -19,87 +9,4 @@ describe('EnviromentUtilService', () => {
const service: EnviromentUtilService = TestBed.get(EnviromentUtilService); const service: EnviromentUtilService = TestBed.get(EnviromentUtilService);
expect(service).toBeTruthy(); expect(service).toBeTruthy();
}); });
// it('rxjs combineAll', () => {
// const source = interval(1000).pipe(take(2));
// const example = source.pipe(
// map(sv => {
// console.log('sv', sv, new Date());
// return interval(1000).pipe(
// tap(ev => {
// console.log('sv', sv, 'ev', ev, new Date());
// }),
// map(ev => `Result (${sv}): ${ev}`),
// take(3)
// );
// })
// );
// const result = example.pipe(combineAll());
// result.subscribe(x => console.log('x', x, new Date()));
// });
// it('rxjs merge', () => {
// // emit every 2.5 seconds
// const first = interval(2500);
// // emit every 2 seconds
// const second = interval(2000);
// // emit every 1.5 seconds
// const third = interval(1500);
// // emit every 1 second
// const fourth = interval(1000);
// // emit outputs from one observable
// const example = merge(
// first.pipe(mapTo('FIRST!')),
// second.pipe(mapTo('SECOND!')),
// third.pipe(mapTo('THIRD')),
// fourth.pipe(mapTo('FOURTH'))
// );
// // output: "FOURTH", "THIRD", "SECOND!", "FOURTH", "FIRST!", "THIRD", "FOURTH"
// const subscribe = example.subscribe(val => console.log(val));
// });
// it('rxjs race', () => {
// // take the first observable to emit
// const example = race(
// // emit every 1.5s
// interval(1500).pipe(mapTo('1.5s won!')),
// // emit every 1s
// interval(1000).pipe(mapTo('1s won!')),
// // emit every 2s
// interval(2000).pipe(mapTo('2s won!')),
// // emit every 2.5s
// interval(2500).pipe(mapTo('2.5s won!'))
// );
// // output: "1s won!"..."1s won!"...etc
// const subscribe = example.subscribe(val => console.log(val));
// });
// it('rxjs zip', () => {
// const sourceOne = of('Hello');
// const sourceTwo = of('World!');
// const sourceThree = of('Goodbye');
// const sourceFour = of('World!');
// // wait until all observables have emitted a value then emit all as an array
// const example = zip(
// sourceOne,
// sourceTwo.pipe(delay(2000)),
// sourceThree.pipe(delay(1000)),
// sourceFour.pipe(delay(3000))
// );
// // output: ["Hello", "World!", "Goodbye", "World!"]
// const subscribe = example.subscribe(val => console.log(val));
// });
it('rxjs zip', () => {
const switched = of(1, 2, 3).pipe(
switchMap((x: number) => {
console.log('x', x);
return of(x, x ** 2, x ** 3);
})
);
switched.subscribe(x => console.log(x));
});
}); });