diff --git a/src/contexts/SDKContext.ts b/src/contexts/SDKContext.ts index 4e7aa9e94f..bb59610771 100644 --- a/src/contexts/SDKContext.ts +++ b/src/contexts/SDKContext.ts @@ -25,6 +25,7 @@ import { WidgetPermissionStore } from "../stores/widgets/WidgetPermissionStore"; import { OidcClientStore } from "../stores/oidc/OidcClientStore"; import WidgetStore from "../stores/WidgetStore"; import ResizeNotifier from "../utils/ResizeNotifier"; +import { MultiRoomViewStore } from "../stores/MultiRoomViewStore"; // This context is available to components under MatrixChat, // the context must not be used by components outside a SdkContextClass tree. @@ -66,6 +67,7 @@ export class SdkContextClass { protected _UserProfilesStore?: UserProfilesStore; protected _OidcClientStore?: OidcClientStore; protected _ResizeNotifier?: ResizeNotifier; + protected _MultiRoomViewStore?: MultiRoomViewStore; /** * Automatically construct stores which need to be created eagerly so they can register with @@ -183,6 +185,13 @@ export class SdkContextClass { return this._ResizeNotifier; } + public get multiRoomViewStore(): MultiRoomViewStore { + if (!this._MultiRoomViewStore) { + this._MultiRoomViewStore = new MultiRoomViewStore(defaultDispatcher, this); + } + return this._MultiRoomViewStore; + } + public onLoggedOut(): void { this._UserProfilesStore = undefined; } diff --git a/src/stores/RoomViewStore.tsx b/src/stores/RoomViewStore.tsx index 50ca69eec3..50dfd47a07 100644 --- a/src/stores/RoomViewStore.tsx +++ b/src/stores/RoomViewStore.tsx @@ -157,6 +157,7 @@ export class RoomViewStore extends EventEmitter { public constructor( dis: MatrixDispatcher, private readonly stores: SdkContextClass, + private readonly lockedToRoomId?: string, ) { super(); this.resetDispatcher(dis); @@ -191,7 +192,7 @@ export class RoomViewStore extends EventEmitter { const lastRoomId = this.state.roomId; this.state = Object.assign(this.state, newState); - if (lastRoomId !== this.state.roomId) { + if (!this.lockedToRoomId && lastRoomId !== this.state.roomId) { if (lastRoomId) this.emitForRoom(lastRoomId, false); if (this.state.roomId) this.emitForRoom(this.state.roomId, true); @@ -208,6 +209,9 @@ export class RoomViewStore extends EventEmitter { } private onDispatch(payload: ActionPayload): void { + if (this.lockedToRoomId && payload.room_id && this.lockedToRoomId !== payload.room_id) { + return; + } // eslint-disable-line @typescript-eslint/naming-convention switch (payload.action) { // view_room: @@ -328,7 +332,7 @@ export class RoomViewStore extends EventEmitter { } } - private async viewRoom(payload: ViewRoomPayload): Promise { + public async viewRoom(payload: ViewRoomPayload): Promise { if (payload.room_id) { const room = MatrixClientPeg.safeGet().getRoom(payload.room_id);