수정 :: 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(
|
this.eventList$ = this.store.pipe(
|
||||||
select(AppStore.MessengerSelector.EventSelector.infoList)
|
select(AppStore.MessengerSelector.EventSelector.selectAllInfoList)
|
||||||
);
|
);
|
||||||
|
|
||||||
this.scrollToBottomForMessageBoxContainer();
|
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(
|
export const appendInfoList = createAction(
|
||||||
'[Messenger::Event] Append InfoList',
|
'[Messenger::Event] Append InfoList',
|
||||||
props<{
|
props<{
|
||||||
|
|
|
@ -39,7 +39,8 @@ import {
|
||||||
sendNotification,
|
sendNotification,
|
||||||
readNotification,
|
readNotification,
|
||||||
cancelNotification,
|
cancelNotification,
|
||||||
delNotification
|
delNotification,
|
||||||
|
recallInfoList
|
||||||
} from './actions';
|
} from './actions';
|
||||||
import { SessionStorageService } from '@ucap-webmessenger/web-storage';
|
import { SessionStorageService } from '@ucap-webmessenger/web-storage';
|
||||||
import { RoomInfo } from '@ucap-webmessenger/protocol-room';
|
import { RoomInfo } from '@ucap-webmessenger/protocol-room';
|
||||||
|
@ -194,8 +195,20 @@ export class Effects {
|
||||||
() => {
|
() => {
|
||||||
return this.actions$.pipe(
|
return this.actions$.pipe(
|
||||||
ofType(cancelNotification),
|
ofType(cancelNotification),
|
||||||
map(action => action.noti),
|
withLatestFrom(
|
||||||
tap(noti => {})
|
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 }
|
{ dispatch: false }
|
||||||
|
|
|
@ -1,7 +1,14 @@
|
||||||
import { createReducer, on } from '@ngrx/store';
|
import { createReducer, on } from '@ngrx/store';
|
||||||
import { initialState } from './state';
|
import { initialState, adapterInfoList } from './state';
|
||||||
import { infoSuccess, appendInfoList, info, infoFailure } from './actions';
|
import {
|
||||||
|
infoSuccess,
|
||||||
|
appendInfoList,
|
||||||
|
info,
|
||||||
|
infoFailure,
|
||||||
|
recallInfoList
|
||||||
|
} from './actions';
|
||||||
import * as AuthenticationStore from '@app/store/account/authentication';
|
import * as AuthenticationStore from '@app/store/account/authentication';
|
||||||
|
import { Info, EventType } from '@ucap-webmessenger/protocol-event';
|
||||||
|
|
||||||
export const reducer = createReducer(
|
export const reducer = createReducer(
|
||||||
initialState,
|
initialState,
|
||||||
|
@ -15,7 +22,9 @@ export const reducer = createReducer(
|
||||||
on(infoSuccess, (state, action) => {
|
on(infoSuccess, (state, action) => {
|
||||||
return {
|
return {
|
||||||
...state,
|
...state,
|
||||||
infoList: action.infoList,
|
infoList: adapterInfoList.addAll(action.infoList, {
|
||||||
|
...state.infoList
|
||||||
|
}),
|
||||||
infoStatus: action.res,
|
infoStatus: action.res,
|
||||||
infoListProcessing: false
|
infoListProcessing: false
|
||||||
};
|
};
|
||||||
|
@ -29,9 +38,38 @@ export const reducer = createReducer(
|
||||||
}),
|
}),
|
||||||
|
|
||||||
on(appendInfoList, (state, action) => {
|
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 {
|
return {
|
||||||
...state,
|
...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 { Selector, createSelector } from '@ngrx/store';
|
||||||
import { InfoResponse, Info } from '@ucap-webmessenger/protocol-event';
|
import { InfoResponse, Info } from '@ucap-webmessenger/protocol-event';
|
||||||
|
import { EntityState, createEntityAdapter } from '@ngrx/entity';
|
||||||
|
|
||||||
|
export interface InfoListState extends EntityState<Info> {}
|
||||||
|
|
||||||
export interface State {
|
export interface State {
|
||||||
infoListProcessing: boolean;
|
infoListProcessing: boolean;
|
||||||
infoList: Info[] | null;
|
infoList: InfoListState;
|
||||||
infoStatus: InfoResponse | null;
|
infoStatus: InfoResponse | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const adapterInfoList = createEntityAdapter<Info>({
|
||||||
|
selectId: info => info.seq
|
||||||
|
});
|
||||||
|
|
||||||
|
const infoListInitialState: InfoListState = adapterInfoList.getInitialState({});
|
||||||
|
|
||||||
export const initialState: State = {
|
export const initialState: State = {
|
||||||
infoListProcessing: false,
|
infoListProcessing: false,
|
||||||
infoList: null,
|
infoList: infoListInitialState,
|
||||||
infoStatus: null
|
infoStatus: null
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const {
|
||||||
|
selectAll: ngeSelectAllInfoList,
|
||||||
|
selectEntities: ngeSelectEntitiesInfoList,
|
||||||
|
selectIds: ngeSelectIdsInfoList,
|
||||||
|
selectTotal: ngeSelectTotalInfoList
|
||||||
|
} = adapterInfoList.getSelectors();
|
||||||
|
|
||||||
export function selectors<S>(selector: Selector<any, State>) {
|
export function selectors<S>(selector: Selector<any, State>) {
|
||||||
|
const selectInfoList = createSelector(
|
||||||
|
selector,
|
||||||
|
(state: State) => state.infoList
|
||||||
|
);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
infoListProcessing: createSelector(
|
infoListProcessing: createSelector(
|
||||||
selector,
|
selector,
|
||||||
|
@ -26,6 +47,21 @@ export function selectors<S>(selector: Selector<any, State>) {
|
||||||
infoStatus: createSelector(
|
infoStatus: createSelector(
|
||||||
selector,
|
selector,
|
||||||
(state: State) => state.infoStatus
|
(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