수정 :: event info state 를 entity 처리 하도록 수정.
기능 구현 :: 대화 회수시 현재 대화방의 event 회수 처리 할 수 있도록 수정.
This commit is contained in:
parent
43f937e74c
commit
7ec9d2356b
|
@ -83,7 +83,7 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewChecked {
|
|||
);
|
||||
|
||||
this.eventList$ = this.store.pipe(
|
||||
select(AppStore.MessengerSelector.EventSelector.infoList)
|
||||
select(AppStore.MessengerSelector.EventSelector.selectAllInfoList)
|
||||
);
|
||||
|
||||
this.scrollToBottomForMessageBoxContainer();
|
||||
|
|
|
@ -37,6 +37,13 @@ export const newInfo = createAction(
|
|||
}>()
|
||||
);
|
||||
|
||||
export const recallInfoList = createAction(
|
||||
'[Messenger::Event] recall InfoList',
|
||||
props<{
|
||||
eventSeq: number;
|
||||
}>()
|
||||
);
|
||||
|
||||
export const appendInfoList = createAction(
|
||||
'[Messenger::Event] Append InfoList',
|
||||
props<{
|
||||
|
|
|
@ -39,7 +39,8 @@ import {
|
|||
sendNotification,
|
||||
readNotification,
|
||||
cancelNotification,
|
||||
delNotification
|
||||
delNotification,
|
||||
recallInfoList
|
||||
} from './actions';
|
||||
import { SessionStorageService } from '@ucap-webmessenger/web-storage';
|
||||
import { RoomInfo } from '@ucap-webmessenger/protocol-room';
|
||||
|
@ -194,8 +195,20 @@ export class Effects {
|
|||
() => {
|
||||
return this.actions$.pipe(
|
||||
ofType(cancelNotification),
|
||||
map(action => action.noti),
|
||||
tap(noti => {})
|
||||
withLatestFrom(
|
||||
this.store.pipe(
|
||||
select((state: any) => state.messenger.room.roomInfo as RoomInfo)
|
||||
)
|
||||
),
|
||||
tap(([action, roomInfo]) => {
|
||||
if (!!roomInfo && roomInfo.roomSeq === action.noti.roomSeq) {
|
||||
this.logger.debug('cancelNotification$', action, roomInfo);
|
||||
this.store.dispatch(
|
||||
recallInfoList({ eventSeq: action.noti.eventSeq })
|
||||
);
|
||||
// this.store.dispatch(ChatStore.newEventMessage(action));
|
||||
}
|
||||
})
|
||||
);
|
||||
},
|
||||
{ dispatch: false }
|
||||
|
|
|
@ -1,7 +1,14 @@
|
|||
import { createReducer, on } from '@ngrx/store';
|
||||
import { initialState } from './state';
|
||||
import { infoSuccess, appendInfoList, info, infoFailure } from './actions';
|
||||
import { initialState, adapterInfoList } from './state';
|
||||
import {
|
||||
infoSuccess,
|
||||
appendInfoList,
|
||||
info,
|
||||
infoFailure,
|
||||
recallInfoList
|
||||
} from './actions';
|
||||
import * as AuthenticationStore from '@app/store/account/authentication';
|
||||
import { Info, EventType } from '@ucap-webmessenger/protocol-event';
|
||||
|
||||
export const reducer = createReducer(
|
||||
initialState,
|
||||
|
@ -15,7 +22,9 @@ export const reducer = createReducer(
|
|||
on(infoSuccess, (state, action) => {
|
||||
return {
|
||||
...state,
|
||||
infoList: action.infoList,
|
||||
infoList: adapterInfoList.addAll(action.infoList, {
|
||||
...state.infoList
|
||||
}),
|
||||
infoStatus: action.res,
|
||||
infoListProcessing: false
|
||||
};
|
||||
|
@ -29,9 +38,38 @@ export const reducer = createReducer(
|
|||
}),
|
||||
|
||||
on(appendInfoList, (state, action) => {
|
||||
const eventinfo = action.info;
|
||||
|
||||
const statusEventInfo: Info = {
|
||||
...state.infoList.entities[eventinfo.seq],
|
||||
type: eventinfo.type,
|
||||
senderSeq: eventinfo.senderSeq,
|
||||
sendDate: eventinfo.sendDate,
|
||||
sentMessage: eventinfo.sentMessage,
|
||||
receiverCount: eventinfo.receiverCount
|
||||
};
|
||||
|
||||
return {
|
||||
...state,
|
||||
infoList: [...state.infoList, action.info]
|
||||
infoList: adapterInfoList.upsertOne(eventinfo, { ...state.infoList })
|
||||
};
|
||||
}),
|
||||
|
||||
on(recallInfoList, (state, action) => {
|
||||
const eventSeq = action.eventSeq;
|
||||
|
||||
const statusEventInfo: Info = {
|
||||
...state.infoList.entities[eventSeq],
|
||||
type: EventType.RecalledMessage,
|
||||
sentMessage: '회수된 메시지'
|
||||
};
|
||||
|
||||
return {
|
||||
...state,
|
||||
infoList: adapterInfoList.updateOne(
|
||||
{ id: eventSeq, changes: statusEventInfo },
|
||||
{ ...state.infoList }
|
||||
)
|
||||
};
|
||||
}),
|
||||
|
||||
|
|
|
@ -1,19 +1,40 @@
|
|||
import { Selector, createSelector } from '@ngrx/store';
|
||||
import { InfoResponse, Info } from '@ucap-webmessenger/protocol-event';
|
||||
import { EntityState, createEntityAdapter } from '@ngrx/entity';
|
||||
|
||||
export interface InfoListState extends EntityState<Info> {}
|
||||
|
||||
export interface State {
|
||||
infoListProcessing: boolean;
|
||||
infoList: Info[] | null;
|
||||
infoList: InfoListState;
|
||||
infoStatus: InfoResponse | null;
|
||||
}
|
||||
|
||||
export const adapterInfoList = createEntityAdapter<Info>({
|
||||
selectId: info => info.seq
|
||||
});
|
||||
|
||||
const infoListInitialState: InfoListState = adapterInfoList.getInitialState({});
|
||||
|
||||
export const initialState: State = {
|
||||
infoListProcessing: false,
|
||||
infoList: null,
|
||||
infoList: infoListInitialState,
|
||||
infoStatus: null
|
||||
};
|
||||
|
||||
const {
|
||||
selectAll: ngeSelectAllInfoList,
|
||||
selectEntities: ngeSelectEntitiesInfoList,
|
||||
selectIds: ngeSelectIdsInfoList,
|
||||
selectTotal: ngeSelectTotalInfoList
|
||||
} = adapterInfoList.getSelectors();
|
||||
|
||||
export function selectors<S>(selector: Selector<any, State>) {
|
||||
const selectInfoList = createSelector(
|
||||
selector,
|
||||
(state: State) => state.infoList
|
||||
);
|
||||
|
||||
return {
|
||||
infoListProcessing: createSelector(
|
||||
selector,
|
||||
|
@ -26,6 +47,21 @@ export function selectors<S>(selector: Selector<any, State>) {
|
|||
infoStatus: createSelector(
|
||||
selector,
|
||||
(state: State) => state.infoStatus
|
||||
),
|
||||
|
||||
selectAllInfoList: createSelector(
|
||||
selectInfoList,
|
||||
ngeSelectAllInfoList
|
||||
),
|
||||
selectEntitiesInfoList: createSelector(
|
||||
selectInfoList,
|
||||
ngeSelectEntitiesInfoList
|
||||
),
|
||||
selectInfoList: (seq: number) =>
|
||||
createSelector(
|
||||
selectInfoList,
|
||||
ngeSelectEntitiesInfoList,
|
||||
(_, entities) => (!!entities ? entities[seq] : undefined)
|
||||
)
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user