diff --git a/README.md b/README.md index a9b8b36a..35fbd581 100644 --- a/README.md +++ b/README.md @@ -783,6 +783,10 @@ One other thing is that the type of the return is precisely the same type requir - panel: - open: this function will open the sidekick options panel automatically; - close: this function will close the sidekick options panel automatically (and also the sidebar content if open, to avoid inconsistencies in ui); + - panel: + - open: this function will open a generic content sidekick area panel. It optionally takes the ID of that area (as returned by `setGenericContentItems`) to select which one to open; + - openCorePanel: this function will open one of the core panels, such as Polls, described by the `SidekickAreaCorePanelEnum`. Polls, Timer and Breakout are ignored unless the user could already open them from the sidebar navigation; + - close: this function will close the panel currently displayed in the sidekick area; - sidekick-options-container: - open: this function will open the sidekick options panel automatically; - close: this function will close the sidekick options panel automatically (and also the sidebar content if open, to avoid inconsistencies in ui); @@ -837,6 +841,14 @@ One other thing is that the type of the return is precisely the same type requir 'New Section Name' ); + // Open a specific sidekick panel + pluginApi.uiCommands.sidekickArea.panel.open('my-content-id'); + + // Open a core panel + pluginApi.uiCommands.sidekickArea.panel.openCorePanel( + SidekickAreaCorePanelEnum.POLL + ); + // Camera commands pluginApi.uiCommands.camera.setSelfViewDisableAllDevices(true); pluginApi.uiCommands.camera.setSelfViewDisable('camera-stream-id', false); diff --git a/src/ui-commands/index.ts b/src/ui-commands/index.ts index d20ff9ff..8e6ce22d 100644 --- a/src/ui-commands/index.ts +++ b/src/ui-commands/index.ts @@ -3,3 +3,4 @@ export { ChangeEnforcedLayoutTypeEnum, EnforcedLayoutTypeEnum } from './layout/e export { CaptionsLanguageEnum } from './captions/enums'; export { ChatUiCommandsEnum } from './chat/enums'; export { ScreenshareCommandsEnum } from './screenshare/enums'; +export { SidekickAreaCorePanelEnum } from './sidekick-area/panel/enums'; diff --git a/src/ui-commands/sidekick-area/commands.ts b/src/ui-commands/sidekick-area/commands.ts index f8a69b3d..a8737189 100644 --- a/src/ui-commands/sidekick-area/commands.ts +++ b/src/ui-commands/sidekick-area/commands.ts @@ -1,6 +1,8 @@ import { sidekickAreaOptions } from './options/commands'; +import { sidekickAreaPanel } from './panel/commands'; import { UiCommandsSidekickArea } from './types'; export const sidekickArea: UiCommandsSidekickArea = { options: sidekickAreaOptions, + panel: sidekickAreaPanel, }; diff --git a/src/ui-commands/sidekick-area/panel/commands.ts b/src/ui-commands/sidekick-area/panel/commands.ts new file mode 100644 index 00000000..00e3ba55 --- /dev/null +++ b/src/ui-commands/sidekick-area/panel/commands.ts @@ -0,0 +1,49 @@ +import { SidekickAreaCorePanelEnum, SidekickAreaPanelEnum } from './enums'; +import { + OpenSidekickAreaCorePanelCommandArguments, + OpenSidekickAreaPanelCommandArguments, + UiCommandsSidekickAreaPanelObject, +} from './types'; + +export const sidekickAreaPanel: UiCommandsSidekickAreaPanelObject = { + /** + * Opens a generic content sidekick area panel. + * + * @param id Id of the generic content sidekick area, as returned by + * `pluginApi.setGenericContentItems`. When omitted, no panel is selected. + */ + open: (id?: string) => { + window.dispatchEvent(new CustomEvent( + SidekickAreaPanelEnum.OPEN, + { + detail: { + id, + }, + }, + )); + }, + + /** + * Opens one of the core panels, such as Polls. + * + * @param panel Core panel to be opened. Polls, Timer and Breakout are ignored + * unless the user could already open them from the sidebar navigation. + */ + openCorePanel: (panel: SidekickAreaCorePanelEnum) => { + window.dispatchEvent(new CustomEvent( + SidekickAreaPanelEnum.OPEN_CORE_PANEL, + { + detail: { + panel, + }, + }, + )); + }, + + /** + * Closes the panel currently displayed in the sidekick area. + */ + close: () => { + window.dispatchEvent(new Event(SidekickAreaPanelEnum.CLOSE)); + }, +}; diff --git a/src/ui-commands/sidekick-area/panel/enums.ts b/src/ui-commands/sidekick-area/panel/enums.ts new file mode 100644 index 00000000..101415b9 --- /dev/null +++ b/src/ui-commands/sidekick-area/panel/enums.ts @@ -0,0 +1,19 @@ +export enum SidekickAreaPanelEnum { + OPEN = 'OPEN_SIDEKICK_AREA_PANEL_COMMAND', + OPEN_CORE_PANEL = 'OPEN_SIDEKICK_AREA_CORE_PANEL_COMMAND', + CLOSE = 'CLOSE_SIDEKICK_AREA_PANEL_COMMAND', +} + +/** + * Core panels a plugin is allowed to open. Polls, Timer and Breakout are only + * opened when the user could already open them from the sidebar navigation. + */ +export enum SidekickAreaCorePanelEnum { + CHAT = 'chat', + USER_LIST = 'userlist', + SHARED_NOTES = 'shared-notes', + APPS_GALLERY = 'apps-gallery', + POLL = 'poll', + TIMER = 'timer', + BREAKOUT = 'breakoutroom', +} diff --git a/src/ui-commands/sidekick-area/panel/types.ts b/src/ui-commands/sidekick-area/panel/types.ts new file mode 100644 index 00000000..20e374e5 --- /dev/null +++ b/src/ui-commands/sidekick-area/panel/types.ts @@ -0,0 +1,15 @@ +import { SidekickAreaCorePanelEnum } from './enums'; + +export interface UiCommandsSidekickAreaPanelObject { + open: (id?: string) => void; + openCorePanel: (panel: SidekickAreaCorePanelEnum) => void; + close: () => void; +} + +export interface OpenSidekickAreaPanelCommandArguments { + id?: string; +} + +export interface OpenSidekickAreaCorePanelCommandArguments { + panel: SidekickAreaCorePanelEnum; +} diff --git a/src/ui-commands/sidekick-area/types.ts b/src/ui-commands/sidekick-area/types.ts index d8748487..186de5e4 100644 --- a/src/ui-commands/sidekick-area/types.ts +++ b/src/ui-commands/sidekick-area/types.ts @@ -1,5 +1,7 @@ import { UiCommandsSidekickAreaOptionsObject } from './options/types'; +import { UiCommandsSidekickAreaPanelObject } from './panel/types'; export interface UiCommandsSidekickArea { options: UiCommandsSidekickAreaOptionsObject; + panel: UiCommandsSidekickAreaPanelObject; }