该插件基于 @netless/window-manager 的多窗口模式, 把app窗口(课件、插件)集成到主窗口中, app窗口可以随着主白板的页面切换而隐藏或显示.
npm install @netless/app-in-mainview-pluginFastboard full 包说明: 通过
@netless/fastboard-full或@netless/fastboard-react-full使用时,请安装@netless/app-in-mainview-plugin >= 0.0.10。fastboard full 会在内部加载@netless/app-in-mainview-plugin/bridge,业务代码继续使用enableAppInMainViewPlugin即可,不需要手动引入bridge。
// 对接 fastboard-react
import { useFastboard, Fastboard } from "@netless/fastboard-react";
const app = useFastboard(() => ({
sdkConfig: {
...
},
joinRoom: {
...
},
managerConfig: {
...
},
// 启用appInMainViewPlugin插件,
// 默认启用默认UI, 如果需要自定义UI, 可以传入enableDefaultUI: false
enableAppInMainViewPlugin: true || {
enableDefaultUI: true,
language: "en",
...
}
}));
// 对接 fastboard
import { createFastboard, createUI } from "@netless/fastboard";
const fastboard = await createFastboard({
sdkConfig: {
...
},
joinRoom: {
...
},
managerConfig: {
...
},
// 启用appInMainViewPlugin插件,
// 默认启用默认UI, 如果需要自定义UI, 可以传入enableDefaultUI: false
enableAppInMainViewPlugin: true || {
enableDefaultUI: true,
language: "en",
...
}
});import '@netless/window-manager/dist/style.css';
import '@netless/app-in-mainview-plugin/dist/style.css';
import { WhiteWebSdk } from "white-web-sdk";
import { WindowManager } from "@netless/window-manager";
import { AppInMainViewPlugin } from '@netless/app-in-mainview-plugin';
const whiteWebSdk = new WhiteWebSdk(...)
const room = await whiteWebSdk.joinRoom({
...
invisiblePlugins: [WindowManager, ApplianceMultiPlugin],
useMultiViews: true,
})
const manager = await WindowManager.mount({ room , container:elm, chessboard: true, cursor: true});
if (manager) {
const appInMainViewPlugin = await AppInMainViewPlugin.getInstance(manager as any, {
language: "en"
});
}注意 项目中需要引入css文件
import '@netless/app-in-mainview-plugin/dist/style.css';
getInstance(wm: WindowManager, options: AppInMainViewOptions)
- wm:
WindowManager。WindowManager的实例对象。 - options?: 配置参数. 可以为空, 为空则使用默认配置, 配置如下.
export type AppInMainViewOptions = { /** 是否启用默认UI */ enableDefaultUI?: boolean; /** 是否只显示隐藏的课件 */ onlyShowHidden?: boolean; /** 语言, 默认为'en' */ language?: Language; /** 主题, 默认为'light' */ theme?: 'light' | 'dark'; } // 默认配置参数 const DefaultAppInMainViewPluginOptions = { enableDefaultUI: true, onlyShowHidden: false, language: 'en', theme: 'light', };
- logger?: Logger; 非必填, 配置日志打印器对象. 不填写默认在本地console输出, 如果需要把日志上传到指定server, 则需要手动配置.
如需要上传到白板日志服务器,可以把room上的logger配置到该项目。
logger: room.logger
export type AppInMainViewInstance = {
/** 当前管理器实例 **/
readonly currentManager?: AppInMainViewManager;
/** 当前页面可见的app列表 */
readonly currentPageVisibleApps?: Set<AppId>;
/** 当前页面的app列表 */
readonly currentPageApps?: Map<AppId, AppStatus>;
/** 销毁 */
readonly destroy: () => void;
/** 添加监听器 */
readonly addListener: (eventName: PublicEvent, callback: PublicCallback<PublicEvent>) => void;
/** 移除监听器 */
readonly removeListener: (eventName: PublicEvent, callback: PublicCallback<PublicEvent>) => void;
/** 隐藏指定课件 */
readonly hideApp: (appId: AppId) => void;
/** 显示指定课件 */
readonly showApp: (appId: AppId) => void;
/** 显示当前页面所有课件 */
readonly showCurrentPageApps: () => void;
/** 隐藏当前页面所有课件 */
readonly hiddenCurrentPageApps: () => void;
}
// for example
const appInMainViewPlugin = await AppInMainViewPlugin.getInstance(...)
appInMainViewPlugin.currentManager;
appInMainViewPlugin.currentPageVisibleApps;
appInMainViewPlugin.currentPageHiddenApps;
appInMainViewPlugin.hideApp(...);
appInMainViewPlugin.showApp(...);
appInMainViewPlugin.showCurrentPageApps();
appInMainViewPlugin.hiddenCurrentPageApps();
appInMainViewPlugin.destroy();对接过程中如果想了解和跟踪插件内部状态,可以通过以下几个控制台指令,查看内部数据.
const appInMainViewPlugin = await AppInMainViewPlugin.getInstance(...)
appInMainViewPlugin.currentManager // 可以查看到包版本号,内部状态等- 隐藏默认UI { enableDefaultUI: false }
2. 初始化状态下获取当前页面中app数据
```js
appInMainViewPlugin.currentPageApps;
appInMainViewPlugin.currentPageVisibleApps;
- 监听appMeun变化
appInMainViewPlugin.addListener('appMenuChange', (appMeun) => {
// todo 更新UI
})具体参考:appMeun
