Skip to content
This repository has been archived by the owner on Sep 11, 2024. It is now read-only.

Commit

Permalink
Disconnect from video rooms when leaving (#8500)
Browse files Browse the repository at this point in the history
* Disconnect from video rooms when leaving

* Listen on the specific room

* Fix lints
  • Loading branch information
robintown authored May 4, 2022
1 parent 658ff4d commit f34b4f1
Showing 1 changed file with 11 additions and 1 deletion.
12 changes: 11 additions & 1 deletion src/stores/VideoChannelStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down Expand Up @@ -193,6 +194,7 @@ export default class VideoChannelStore extends AsyncStoreWithClient<null> {

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);
Expand All @@ -214,11 +216,13 @@ export default class VideoChannelStore extends AsyncStoreWithClient<null> {
};

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;
Expand All @@ -242,6 +246,8 @@ export default class VideoChannelStore extends AsyncStoreWithClient<null> {

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<IVideoChannelMemberContent>()?.devices ?? [];

Expand Down Expand Up @@ -280,4 +286,8 @@ export default class VideoChannelStore extends AsyncStoreWithClient<null> {
this.videoMuted = false;
this.ack(ev);
};

private onMyMembership = (room: Room, membership: string) => {
if (membership !== "join") this.setDisconnected();
};
}

0 comments on commit f34b4f1

Please sign in to comment.