From 2994a05de6d6a856c0854f485ff3b769a91943a0 Mon Sep 17 00:00:00 2001 From: CRIMX Date: Fri, 16 Sep 2022 13:34:34 +0800 Subject: [PATCH] fix(classroom): enable device base on preferences when on stage (#1696) --- .../flat-stores/src/classroom-store/index.ts | 38 ++++++++++++++++--- service-providers/fastboard/src/index.ts | 2 +- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/packages/flat-stores/src/classroom-store/index.ts b/packages/flat-stores/src/classroom-store/index.ts index de4b37fed19..9b6a36e1b47 100644 --- a/packages/flat-stores/src/classroom-store/index.ts +++ b/packages/flat-stores/src/classroom-store/index.ts @@ -1,4 +1,4 @@ -import type { Storage } from "@netless/fastboard"; +import type { Diff, Storage } from "@netless/fastboard"; import { SideEffectManager } from "side-effect-manager"; import { action, autorun, makeAutoObservable, observable, reaction, runInAction } from "mobx"; @@ -375,7 +375,9 @@ export class ClassroomStore { }), ); - const updateUserStagingState = async (): Promise => { + const updateUserStagingState = async ( + diff?: Diff, + ): Promise => { const onStageUsers = Object.keys(onStageUsersStorage.state).filter( userUUID => onStageUsersStorage.state[userUUID], ); @@ -406,9 +408,33 @@ export class ClassroomStore { }); if (!this.isCreator) { - this.whiteboardStore.updateWritable( - Boolean(onStageUsersStorage.state[this.userUUID]), - ); + const isJoinerOnStage = Boolean(onStageUsersStorage.state[this.userUUID]); + await this.whiteboardStore.updateWritable(isJoinerOnStage); + + // @FIXME add reliable way to ensure writable is set + if (isJoinerOnStage && !fastboard.syncedStore.isRoomWritable) { + await new Promise(resolve => { + const disposer = fastboard.syncedStore.addRoomWritableChangeListener( + isWritable => { + if (isWritable) { + disposer(); + resolve(); + } + }, + ); + }); + } + + if ( + isJoinerOnStage && + (diff?.[this.userUUID] || !deviceStateStorage.state[this.userUUID]) + ) { + this.updateDeviceState( + this.userUUID, + preferencesStore.autoCameraOn, + preferencesStore.autoMicOn, + ); + } } }; updateUserStagingState(); @@ -607,7 +633,7 @@ export class ClassroomStore { this.onStageUsersStorage.setState({ [userUUID]: false }); } } - if (!this.isCreator && !onStage) { + if (!onStage && (!this.isCreator || userUUID !== this.userUUID)) { this.updateDeviceState(userUUID, false, false); } }; diff --git a/service-providers/fastboard/src/index.ts b/service-providers/fastboard/src/index.ts index 253e379ac61..5b9daf294b5 100644 --- a/service-providers/fastboard/src/index.ts +++ b/service-providers/fastboard/src/index.ts @@ -139,7 +139,7 @@ export class Fastboard extends IServiceWhiteboard { }; }, "setWritable"); } - }), + }, true), this._el$.subscribe(el => { if (el) { this.ui.mount(el, {