102 lines
2.7 KiB
TypeScript
102 lines
2.7 KiB
TypeScript
|
import { Injectable } from '@angular/core';
|
||
|
|
||
|
import { Actions, createEffect, ofType } from '@ngrx/effects';
|
||
|
|
||
|
import { Store } from '@ngrx/store';
|
||
|
|
||
|
import { NGXLogger } from 'ngx-logger';
|
||
|
|
||
|
import { of } from 'rxjs';
|
||
|
import { tap, switchMap, map, catchError } from 'rxjs/operators';
|
||
|
import {
|
||
|
RoomInfo,
|
||
|
UserInfoShort,
|
||
|
UserInfo,
|
||
|
RoomProtocolService,
|
||
|
SSVC_TYPE_ROOM_INFO_ROOM,
|
||
|
InfoData,
|
||
|
SSVC_TYPE_ROOM_INFO_USER,
|
||
|
SSVC_TYPE_ROOM_INFO_USER2,
|
||
|
SSVC_TYPE_ROOM_INFO_RES,
|
||
|
UserShortData,
|
||
|
UserData
|
||
|
} from '@ucap-webmessenger/protocol-room';
|
||
|
|
||
|
import * as ChatStore from '@app/store/messenger/chat';
|
||
|
|
||
|
import { info, infoSuccess, infoFailure } from './actions';
|
||
|
import { SessionStorageService } from '@ucap-webmessenger/web-storage';
|
||
|
import { LoginInfo, KEY_LOGIN_INFO } from '@app/types';
|
||
|
|
||
|
@Injectable()
|
||
|
export class Effects {
|
||
|
selectedRoomForInfo$ = createEffect(() =>
|
||
|
this.actions$.pipe(
|
||
|
ofType(ChatStore.selectedRoom),
|
||
|
map(action => {
|
||
|
const loginInfo = this.sessionStorageService.get<LoginInfo>(
|
||
|
KEY_LOGIN_INFO
|
||
|
);
|
||
|
return info({
|
||
|
roomSeq: action.roomSeq,
|
||
|
isDetail: true,
|
||
|
localeCode: loginInfo.localeCode
|
||
|
});
|
||
|
})
|
||
|
)
|
||
|
);
|
||
|
|
||
|
info$ = createEffect(
|
||
|
() => {
|
||
|
let roomInfo: RoomInfo;
|
||
|
let userInfoShortList: UserInfoShort[];
|
||
|
let userInfoList: UserInfo[];
|
||
|
|
||
|
return this.actions$.pipe(
|
||
|
ofType(info),
|
||
|
tap(() => {
|
||
|
roomInfo = null;
|
||
|
userInfoShortList = [];
|
||
|
userInfoList = [];
|
||
|
}),
|
||
|
switchMap(req => {
|
||
|
return this.roomProtocolService.info(req).pipe(
|
||
|
map(res => {
|
||
|
switch (res.Type) {
|
||
|
case SSVC_TYPE_ROOM_INFO_ROOM:
|
||
|
roomInfo = (res as InfoData).roomInfo;
|
||
|
break;
|
||
|
case SSVC_TYPE_ROOM_INFO_USER:
|
||
|
userInfoShortList.push(...(res as UserShortData).userInfos);
|
||
|
break;
|
||
|
case SSVC_TYPE_ROOM_INFO_USER2:
|
||
|
userInfoList.push(...(res as UserData).userInfos);
|
||
|
break;
|
||
|
case SSVC_TYPE_ROOM_INFO_RES:
|
||
|
this.store.dispatch(
|
||
|
infoSuccess({
|
||
|
roomInfo,
|
||
|
userInfoShortList,
|
||
|
userInfoList
|
||
|
})
|
||
|
);
|
||
|
break;
|
||
|
}
|
||
|
}),
|
||
|
catchError(error => of(infoFailure({ error })))
|
||
|
);
|
||
|
})
|
||
|
);
|
||
|
},
|
||
|
{ dispatch: false }
|
||
|
);
|
||
|
|
||
|
constructor(
|
||
|
private actions$: Actions,
|
||
|
private store: Store<any>,
|
||
|
private roomProtocolService: RoomProtocolService,
|
||
|
private sessionStorageService: SessionStorageService,
|
||
|
private logger: NGXLogger
|
||
|
) {}
|
||
|
}
|