import { createReducer, on } from '@ngrx/store'; import { initialState, adapterBuddy2, adapterGroup2, adapterRoom, adapterRoomUser, adapterRoomUserShort } from './state'; import { buddy2Success, group2Success, roomSuccess, updateRoomForNewEventMessage, refreshRoomSuccess } from './actions'; import { RoomUserDetailData, RoomUserData } from '@ucap-webmessenger/protocol-sync'; import * as AuthenticationStore from '@app/store/account/authentication'; import * as RoomStore from '@app/store/messenger/room'; import { RoomInfo } from '@ucap-webmessenger/protocol-room'; export const reducer = createReducer( initialState, on(buddy2Success, (state, action) => { return { ...state, buddy2: adapterBuddy2.addAll(action.buddyList, { ...state.buddy2, syncDate: action.syncDate }) }; }), on(group2Success, (state, action) => { return { ...state, group2: adapterGroup2.addAll(action.groupList, { ...state.group2, syncDate: action.syncDate }) }; }), on(roomSuccess, (state, action) => { const roomUserList: RoomUserDetailData[] = []; const roomUserShortList: RoomUserData[] = []; for (const key in action.roomUserInfoMap) { if (action.roomUserInfoMap.hasOwnProperty(key)) { const element = action.roomUserInfoMap[key]; if (!!element.userInfoList && 0 < element.userInfoList.length) { roomUserList.push({ roomSeq: key, userInfos: element.userInfoList }); } if ( !!element.userInfoShortList && 0 < element.userInfoShortList.length ) { roomUserShortList.push({ roomSeq: key, userInfos: element.userInfoShortList }); } } } return { ...state, room: adapterRoom.upsertMany(action.roomList, { ...state.room, syncDate: action.syncDate }), roomUser: adapterRoomUser.upsertMany(roomUserList, { ...state.roomUser }), roomUserShort: adapterRoomUserShort.upsertMany(roomUserShortList, { ...state.roomUserShort }) }; }), on(updateRoomForNewEventMessage, (state, action) => { const roomInfo = { ...state.room.entities[action.roomSeq], finalEventDate: action.info.sendDate, finalEventMessage: action.info.sentMessage }; return { ...state, room: adapterRoom.updateOne( { id: action.roomSeq, changes: roomInfo }, { ...state.room } ) }; }), on(RoomStore.updateSuccess, (state, action) => { const roomInfo: RoomInfo = { ...state.room.entities[action.res.roomSeq], roomName: action.res.roomName, receiveAlarm: action.res.receiveAlarm }; return { ...state, room: adapterRoom.updateOne( { id: action.res.roomSeq, changes: roomInfo }, { ...state.room } ) }; }), on(refreshRoomSuccess, (state, action) => { const roomUserList: RoomUserDetailData[] = []; const roomUserShortList: RoomUserData[] = []; if (action.userInfoList) { roomUserList.push({ roomSeq: action.roomInfo.roomSeq, userInfos: action.userInfoList }); } if (action.userInfoShortList) { roomUserShortList.push({ roomSeq: action.roomInfo.roomSeq, userInfos: action.userInfoShortList }); } return { ...state, room: adapterRoom.upsertOne(action.roomInfo, { ...state.room }), roomUser: adapterRoomUser.upsertMany(roomUserList, { ...state.roomUser }), roomUserShort: adapterRoomUserShort.upsertMany(roomUserShortList, { ...state.roomUserShort }) }; }), on(AuthenticationStore.logout, (state, action) => { return { ...initialState }; }) );