effect for room sync is implemented

This commit is contained in:
병준 박 2019-10-02 15:49:25 +09:00
parent 7c54e6606e
commit a201536b02
6 changed files with 191 additions and 7 deletions

View File

@ -4,8 +4,14 @@ import {
GroupRequest, GroupRequest,
GroupDetailData, GroupDetailData,
GroupResponse, GroupResponse,
UserInfo UserInfo,
RoomRequest
} from '@ucap-webmessenger/protocol-sync'; } from '@ucap-webmessenger/protocol-sync';
import {
RoomInfo,
UserInfoShort,
UserInfo as RoomUserInfo
} from '@ucap-webmessenger/protocol-room';
export const buddy2 = createAction( export const buddy2 = createAction(
'[Messenger::Sync] Buddy2', '[Messenger::Sync] Buddy2',
@ -36,3 +42,27 @@ export const group2Failure = createAction(
'[Messenger::Sync] Group2 Failure', '[Messenger::Sync] Group2 Failure',
props<{ error: any }>() props<{ error: any }>()
); );
export const room = createAction(
'[Messenger::Sync] Room',
props<RoomRequest>()
);
export const roomSuccess = createAction(
'[Messenger::Sync] Room Success',
props<{
roomList: RoomInfo[];
roomUserInfoMap: {
[param: string]: {
userInfoShortList: UserInfoShort[];
userInfoList: RoomUserInfo[];
};
};
syncDate: string;
}>()
);
export const roomFailure = createAction(
'[Messenger::Sync] Room Failure',
props<{ error: any }>()
);

View File

@ -22,7 +22,10 @@ import {
buddy2Failure, buddy2Failure,
group2, group2,
group2Success, group2Success,
group2Failure group2Failure,
room,
roomFailure,
roomSuccess
} from './actions'; } from './actions';
import { SessionStorageService } from '@ucap-webmessenger/web-storage'; import { SessionStorageService } from '@ucap-webmessenger/web-storage';
@ -36,9 +39,23 @@ import {
GroupResponse, GroupResponse,
UserInfo, UserInfo,
SSVC_TYPE_SYNC_BUDDY2_RES, SSVC_TYPE_SYNC_BUDDY2_RES,
SSVC_TYPE_SYNC_GROUP_RES2 SSVC_TYPE_SYNC_GROUP_RES2,
SSVC_TYPE_SYNC_ROOM_DATA,
SSVC_TYPE_SYNC_ROOM_USER,
SSVC_TYPE_SYNC_ROOM_USER2,
SSVC_TYPE_SYNC_ROOM_RES,
RoomData,
RoomUserData,
RoomUserDetailData,
RoomResponse
} from '@ucap-webmessenger/protocol-sync'; } from '@ucap-webmessenger/protocol-sync';
import { regViewSuccess } from '@app/store/setting/option'; import { regViewSuccess } from '@app/store/setting/option';
import {
RoomInfo,
UserInfoShort,
UserInfo as RoomUserInfo
} from '@ucap-webmessenger/protocol-room';
import { LoginInfo, KEY_LOGIN_INFO } from '@app/types';
@Injectable() @Injectable()
export class Effects { export class Effects {
@ -110,6 +127,107 @@ export class Effects {
{ dispatch: false } { dispatch: false }
); );
buddy2SuccessPostRoom$ = createEffect(() =>
this.actions$.pipe(
ofType(buddy2Success),
map(action => {
const loginInfo = this.sessionStorageService.get<LoginInfo>(
KEY_LOGIN_INFO
);
return loginInfo.localeCode;
}),
withLatestFrom(
this.store.pipe(
select(state => {
return state.messenger.sync.roomSyncDate as string;
})
)
),
map(([localeCode, roomSyncDate]) =>
room({ syncDate: roomSyncDate, localeCode })
)
)
);
room$ = createEffect(
() => {
let roomList: RoomInfo[];
let roomUserInfoMap: {
[param: string]: {
userInfoShortList: UserInfoShort[];
userInfoList: RoomUserInfo[];
};
};
return this.actions$.pipe(
ofType(room),
tap(() => {
roomList = [];
roomUserInfoMap = {};
}),
switchMap(req => {
return this.syncProtocolService.room(req).pipe(
map(res => {
switch (res.Type) {
case SSVC_TYPE_SYNC_ROOM_DATA:
roomList.push(...(res as RoomData).roomInfos);
break;
case SSVC_TYPE_SYNC_ROOM_USER:
{
const roomUserData = res as RoomUserData;
if (!roomUserInfoMap[roomUserData.roomSeq]) {
roomUserInfoMap[roomUserData.roomSeq] = {
userInfoList: [],
userInfoShortList: []
};
}
roomUserInfoMap[
roomUserData.roomSeq
].userInfoShortList.push(...roomUserData.userInfos);
}
break;
case SSVC_TYPE_SYNC_ROOM_USER2:
{
const roomUserDetailData = res as RoomUserDetailData;
if (!roomUserInfoMap[roomUserDetailData.roomSeq]) {
roomUserInfoMap[roomUserDetailData.roomSeq] = {
userInfoList: [],
userInfoShortList: []
};
}
roomUserInfoMap[
roomUserDetailData.roomSeq
].userInfoList.push(...roomUserDetailData.userInfos);
}
break;
case SSVC_TYPE_SYNC_ROOM_RES:
{
this.logger.debug(
'roomList',
roomList,
'roomUserInfoMap',
roomUserInfoMap
);
this.store.dispatch(
roomSuccess({
roomList,
roomUserInfoMap,
syncDate: (res as RoomResponse).syncDate
})
);
}
break;
}
}),
catchError(error => of(roomFailure({ error })))
);
})
);
},
{ dispatch: false }
);
constructor( constructor(
private actions$: Actions, private actions$: Actions,
private store: Store<any>, private store: Store<any>,

View File

@ -1,6 +1,6 @@
import { createReducer, on } from '@ngrx/store'; import { createReducer, on } from '@ngrx/store';
import { initialState } from './state'; import { initialState } from './state';
import { buddy2Success, group2Success } from './actions'; import { buddy2Success, group2Success, roomSuccess } from './actions';
export const reducer = createReducer( export const reducer = createReducer(
initialState, initialState,
@ -18,5 +18,14 @@ export const reducer = createReducer(
groupList: action.groupList, groupList: action.groupList,
group2SyncDate: action.syncDate group2SyncDate: action.syncDate
}; };
}),
on(roomSuccess, (state, action) => {
return {
...state,
roomList: action.roomList,
roomUserInfoMap: action.roomUserInfoMap,
roomSyncDate: action.syncDate
};
}) })
); );

View File

@ -1,5 +1,10 @@
import { Selector, createSelector } from '@ngrx/store'; import { Selector, createSelector } from '@ngrx/store';
import { UserInfo, GroupDetailData } from '@ucap-webmessenger/protocol-sync'; import { UserInfo, GroupDetailData } from '@ucap-webmessenger/protocol-sync';
import {
RoomInfo,
UserInfoShort,
UserInfo as RoomUserInfo
} from '@ucap-webmessenger/protocol-room';
export interface State { export interface State {
buddyInfoList: UserInfo[]; buddyInfoList: UserInfo[];
@ -7,13 +12,25 @@ export interface State {
groupList: GroupDetailData[]; groupList: GroupDetailData[];
group2SyncDate: string; group2SyncDate: string;
roomList: RoomInfo[];
roomUserInfoMap: {
[param: string]: {
userInfoShortList: UserInfoShort[];
userInfoList: RoomUserInfo[];
};
};
roomSyncDate: string;
} }
export const initialState: State = { export const initialState: State = {
buddyInfoList: [], buddyInfoList: [],
buddy2SyncDate: '', buddy2SyncDate: '',
groupList: [], groupList: [],
group2SyncDate: '' group2SyncDate: '',
roomList: [],
roomUserInfoMap: {},
roomSyncDate: ''
}; };
export function selectors<S>(selector: Selector<any, State>) { export function selectors<S>(selector: Selector<any, State>) {
@ -42,6 +59,14 @@ export function selectors<S>(selector: Selector<any, State>) {
buddyList: state.buddyInfoList buddyList: state.buddyInfoList
}; };
} }
),
roomList: createSelector(
selector,
(state: State) => state.roomList
),
roomSyncDate: createSelector(
selector,
(state: State) => state.roomSyncDate
) )
}; };
} }

View File

@ -70,8 +70,9 @@ export const decodeRoomData: ProtocolDecoder<RoomData> = (
message: ProtocolMessage message: ProtocolMessage
) => { ) => {
const roomInfos: RoomInfo[] = []; const roomInfos: RoomInfo[] = [];
if (message.bodyList.length > 1) {
const info = message.bodyList[1].split(BodyStringDivider); for (const body of message.bodyList) {
const info = body.split(BodyStringDivider);
if (info.length > 11) { if (info.length > 11) {
roomInfos.push({ roomInfos.push({
roomSeq: info[0], roomSeq: info[0],

View File

@ -3,6 +3,7 @@
*/ */
export * from './lib/models/buddy'; export * from './lib/models/buddy';
export * from './lib/models/group'; export * from './lib/models/group';
export * from './lib/models/room';
export * from './lib/services/sync-protocol.service'; export * from './lib/services/sync-protocol.service';