From f34b4f1182fad2c9a0fe5be2302d6cbbbb458e42 Mon Sep 17 00:00:00 2001 From: Robin Date: Wed, 4 May 2022 17:02:53 -0400 Subject: [PATCH] Disconnect from video rooms when leaving (#8500) * Disconnect from video rooms when leaving * Listen on the specific room * Fix lints --- src/stores/VideoChannelStore.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/stores/VideoChannelStore.ts b/src/stores/VideoChannelStore.ts index d32f748fb7..62e3571aa3 100644 --- a/src/stores/VideoChannelStore.ts +++ b/src/stores/VideoChannelStore.ts @@ -15,6 +15,7 @@ limitations under the License. */ import EventEmitter from "events"; +import { Room, RoomEvent } from "matrix-js-sdk/src/models/room"; import { ClientWidgetApi, IWidgetApiRequest } from "matrix-widget-api"; import defaultDispatcher from "../dispatcher/dispatcher"; @@ -193,6 +194,7 @@ export default class VideoChannelStore extends AsyncStoreWithClient { this.connected = true; messaging.once(`action:${ElementWidgetActions.HangupCall}`, this.onHangup); + this.matrixClient.getRoom(roomId).on(RoomEvent.MyMembership, this.onMyMembership); window.addEventListener("beforeunload", this.setDisconnected); this.emit(VideoChannelEvent.Connect, roomId); @@ -214,11 +216,13 @@ export default class VideoChannelStore extends AsyncStoreWithClient { }; public setDisconnected = async () => { + const roomId = this.roomId; + this.activeChannel.off(`action:${ElementWidgetActions.HangupCall}`, this.onHangup); this.activeChannel.off(`action:${ElementWidgetActions.CallParticipants}`, this.onParticipants); + this.matrixClient.getRoom(roomId).off(RoomEvent.MyMembership, this.onMyMembership); window.removeEventListener("beforeunload", this.setDisconnected); - const roomId = this.roomId; this.activeChannel = null; this.roomId = null; this.connected = false; @@ -242,6 +246,8 @@ export default class VideoChannelStore extends AsyncStoreWithClient { private updateDevices = async (roomId: string, fn: (devices: string[]) => string[]) => { const room = this.matrixClient.getRoom(roomId); + if (room.getMyMembership() !== "join") return; + const devicesState = room.currentState.getStateEvents(VIDEO_CHANNEL_MEMBER, this.matrixClient.getUserId()); const devices = devicesState?.getContent()?.devices ?? []; @@ -280,4 +286,8 @@ export default class VideoChannelStore extends AsyncStoreWithClient { this.videoMuted = false; this.ack(ev); }; + + private onMyMembership = (room: Room, membership: string) => { + if (membership !== "join") this.setDisconnected(); + }; }