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( 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, private roomProtocolService: RoomProtocolService, private sessionStorageService: SessionStorageService, private logger: NGXLogger ) {} }