Timer 대화방의 대화 자동 삭제 기능 추가.

This commit is contained in:
leejh 2019-11-01 13:43:49 +09:00
parent 86ee7dd515
commit bf9bcd967b
4 changed files with 62 additions and 6 deletions

View File

@ -102,6 +102,9 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewChecked {
files: File[];
fileItems: DataTransferItemList;
/** Timer 대화방의 대화 삭제를 위한 interval */
interval: any;
constructor(
private store: Store<any>,
private sessionStorageService: SessionStorageService,
@ -173,6 +176,12 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewChecked {
);
this.psChatContent.directiveRef.scrollToBottom(0, 0);
this.interval = setInterval(() => {
if (!!this.roomInfo.isTimeRoom) {
this.store.dispatch(EventStore.infoIntervalClear({}));
}
}, 1000);
}
ngOnDestroy(): void {
@ -185,6 +194,8 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewChecked {
if (!!this.userInfoListSubscription) {
this.userInfoListSubscription.unsubscribe();
}
clearInterval(this.interval);
}
ngAfterViewChecked(): void {

View File

@ -37,6 +37,11 @@ export const infoMoreSuccess = createAction(
}>()
);
export const infoIntervalClear = createAction(
'[Messenger::Event] Info Interval Clear',
props()
);
export const infoFailure = createAction(
'[Messenger::Event] Info Failure',
props<{ error: any }>()
@ -182,6 +187,6 @@ export const delNotification = createAction(
export const delInfoList = createAction(
'[Messenger::Event] Delete InfoList',
props<{
eventSeq: number;
eventSeqs: number[];
}>()
);

View File

@ -68,7 +68,8 @@ import {
forwardAfterRoomOpen,
sendMass,
sendMassFailure,
infoMoreSuccess
infoMoreSuccess,
infoIntervalClear
} from './actions';
import { SessionStorageService } from '@ucap-webmessenger/web-storage';
import {
@ -158,6 +159,45 @@ export class Effects {
{ dispatch: false }
);
infoIntervalClear$ = createEffect(
() => {
return this.actions$.pipe(
ofType(infoIntervalClear),
withLatestFrom(
this.store.pipe(
select((state: any) => state.messenger.room.roomInfo as RoomInfo)
),
this.store.pipe(
select(
(state: any) =>
state.messenger.event.infoList.entities as Dictionary<Info>
)
)
),
map(([action, roomInfo, eventList]) => {
if (roomInfo.isTimeRoom && roomInfo.timeRoomInterval > 0) {
const delEventSeq: number[] = [];
// tslint:disable-next-line: forin
for (const key in eventList) {
const event: Info = eventList[key];
if (
new Date().getTime() - new Date(event.sendDate).getTime() >=
roomInfo.timeRoomInterval * 1000
) {
delEventSeq.push(event.seq);
}
}
if (delEventSeq.length > 0) {
this.store.dispatch(delInfoList({ eventSeqs: delEventSeq }));
}
}
})
);
},
{ dispatch: false }
);
read$ = createEffect(() =>
this.actions$.pipe(
ofType(read),
@ -533,7 +573,7 @@ export class Effects {
tap(([noti, roomInfo]) => {
// 현재 방이 오픈되어 있으면 방내용 갱신
if (!!roomInfo && roomInfo.roomSeq === noti.roomSeq) {
this.store.dispatch(delInfoList({ eventSeq: noti.eventSeq }));
this.store.dispatch(delInfoList({ eventSeqs: [noti.eventSeq] }));
}
// 대화 > 리스트의 항목 갱신

View File

@ -97,11 +97,11 @@ export const reducer = createReducer(
}),
on(delInfoList, (state, action) => {
const eventSeq = action.eventSeq;
return {
...state,
infoList: adapterInfoList.removeOne(eventSeq, { ...state.infoList })
infoList: adapterInfoList.removeMany(action.eventSeqs, {
...state.infoList
})
};
}),