From 890c94d9b8f256b44032bd4eb177d59436c93cbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=20K=C3=A4sler?= <tom.kaesler@mni.thm.de> Date: Tue, 11 Jun 2019 15:32:39 +0200 Subject: [PATCH] Add event emitter Push RoomDeleted event when creator delets it. React to RoomDeleted event in RoomList. --- src/app/app.module.ts | 2 ++ .../_dialogs/room-edit/room-edit.component.ts | 8 +++++- .../shared/room-list/room-list.component.ts | 5 ++++ src/app/models/messages/room-deleted.ts | 13 +++++++++ src/app/services/util/event.service.ts | 27 +++++++++++++++++++ 5 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 src/app/models/messages/room-deleted.ts create mode 100644 src/app/services/util/event.service.ts diff --git a/src/app/app.module.ts b/src/app/app.module.ts index f4654b062..3c32c0b5a 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -12,6 +12,7 @@ import { AuthenticationGuard } from './guards/authentication.guard'; import { RoomService } from './services/http/room.service'; import { CommentService } from './services/http/comment.service'; import { DataStoreService } from './services/util/data-store.service'; +import { EventService } from './services/util/event.service'; import { ContentService } from './services/http/content.service'; import { ContentAnswerService } from './services/http/content-answer.service'; import { VoteService } from './services/http/vote.service'; @@ -77,6 +78,7 @@ export function initializeApp(appConfig: AppConfig) { AuthenticationService, AuthenticationGuard, DataStoreService, + EventService, RoomService, CommentService, ContentService, diff --git a/src/app/components/creator/_dialogs/room-edit/room-edit.component.ts b/src/app/components/creator/_dialogs/room-edit/room-edit.component.ts index e6a3c9f78..43033c702 100644 --- a/src/app/components/creator/_dialogs/room-edit/room-edit.component.ts +++ b/src/app/components/creator/_dialogs/room-edit/room-edit.component.ts @@ -9,8 +9,10 @@ import { Router } from '@angular/router'; import { RoomCreatorPageComponent } from '../../room-creator-page/room-creator-page.component'; import { DeleteCommentComponent } from '../delete-comment/delete-comment.component'; import { CommentService } from '../../../../services/http/comment.service'; +import { EventService } from '../../../../services/util/event.service'; import { CommentExportComponent } from '../comment-export/comment-export.component'; import { Comment } from '../../../../models/comment'; +import { RoomDeleted } from '../../../../models/messages/room-deleted'; @Component({ selector: 'app-room-edit', @@ -29,6 +31,7 @@ export class RoomEditComponent implements OnInit { protected roomService: RoomService, public router: Router, public commentService: CommentService, + public eventService: EventService, @Inject(MAT_DIALOG_DATA) public data: any) { } @@ -69,7 +72,10 @@ export class RoomEditComponent implements OnInit { this.translationService.get('room-page.deleted').subscribe(msg => { this.notificationService.show(room.name + msg); }); - this.roomService.deleteRoom(room.id).subscribe(); + this.roomService.deleteRoom(room.id).subscribe(result => { + const event = new RoomDeleted(room.id); + this.eventService.broadcast(event.type, event.payload); + }); this.dialogRef.close('delete'); this.router.navigate([`/creator`]); } diff --git a/src/app/components/shared/room-list/room-list.component.ts b/src/app/components/shared/room-list/room-list.component.ts index 008515724..4dbaa2838 100644 --- a/src/app/components/shared/room-list/room-list.component.ts +++ b/src/app/components/shared/room-list/room-list.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; import { Room } from '../../../models/room'; import { RoomService } from '../../../services/http/room.service'; +import { EventService } from '../../../services/util/event.service'; import { AuthenticationService } from '../../../services/http/authentication.service'; import { UserRole } from '../../../models/user-roles.enum'; @@ -17,12 +18,16 @@ export class RoomListComponent implements OnInit { constructor( private roomService: RoomService, + public eventService: EventService, protected authenticationService: AuthenticationService) { } ngOnInit() { this.getRooms(); this.getPath(); + this.eventService.on<any>('RoomDeleted').subscribe(payload => { + this.rooms = this.rooms.filter(r => r.id !== payload.id); + }); } getPath() { diff --git a/src/app/models/messages/room-deleted.ts b/src/app/models/messages/room-deleted.ts new file mode 100644 index 000000000..fb2a27947 --- /dev/null +++ b/src/app/models/messages/room-deleted.ts @@ -0,0 +1,13 @@ +export class RoomDeleted { + type: string; + payload: { + id: string; + }; + + constructor(id: string) { + this.type = 'RoomDeleted'; + this.payload = { + id: id + }; + } +} diff --git a/src/app/services/util/event.service.ts b/src/app/services/util/event.service.ts new file mode 100644 index 000000000..243726b1c --- /dev/null +++ b/src/app/services/util/event.service.ts @@ -0,0 +1,27 @@ +import { Subject } from 'rxjs/Subject'; +import { Observable } from 'rxjs/Observable'; +import { filter, map } from 'rxjs/operators'; + +interface BroadcastEvent { + key: any; + data?: any; +} + +export class EventService { + private _eventBus: Subject<BroadcastEvent>; + + constructor() { + this._eventBus = new Subject<BroadcastEvent>(); + } + + broadcast(key: any, data?: any) { + this._eventBus.next({ key, data }); + } + + on<T>(key: any): Observable<T> { + return this._eventBus.asObservable().pipe( + filter(event => event.key === key), + map(event => <T>event.data) + ); + } +} -- GitLab