Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(Webinar) - Locus API and DTO update for Webinar #3972

Open
wants to merge 23 commits into
base: next
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
eddcf83
feat(webinar): set panelist or attendee according to roles DTO
mickelr Oct 31, 2024
c8c80c7
feat(webinar): add roles in set mute all control
mickelr Oct 31, 2024
8c807dd
feat(webinar): view participants list panle control update
mickelr Nov 1, 2024
de1a436
Merge branch 'next' of https://github.com/mickelr/webex-js-sdk into w…
mickelr Nov 4, 2024
ad2df04
feat(webinar): get webcast instance url from DTO
mickelr Nov 4, 2024
46831bc
feat(webinar): handle webcast control from DTO
mickelr Nov 4, 2024
3c6b54f
feat(webinar): new webcast display hint
mickelr Nov 5, 2024
b9f5a5d
feat(webinar): handle meeting full control from DTO
mickelr Nov 5, 2024
bebcc13
Merge branch 'next' of https://github.com/mickelr/webex-js-sdk into w…
mickelr Nov 5, 2024
4dad0f1
Merge branch 'next' of https://github.com/mickelr/webex-js-sdk into w…
mickelr Nov 7, 2024
9c48a68
feat(webinar): handle practice session control from DTO
mickelr Nov 8, 2024
93c4121
feat(webinar): new display hints for plist control in webinar
mickelr Nov 8, 2024
9d982ee
Merge branch 'next' of https://github.com/mickelr/webex-js-sdk into w…
mickelr Nov 11, 2024
b32b5ad
feat(webinar): add unit test for new code
mickelr Nov 12, 2024
1388e86
Merge branch 'next' into webinar
JudyZhuHz Nov 13, 2024
2d8ac63
Merge branch 'next' of https://github.com/mickelr/webex-js-sdk into w…
mickelr Nov 13, 2024
fb00d2a
feat(webinar): add unit test for new code
mickelr Nov 13, 2024
df719cb
Merge remote-tracking branch 'origin/webinar' into webinar
mickelr Nov 13, 2024
e172fb2
feat(webinar): fix issues found by coderabbitai
mickelr Nov 13, 2024
aebbbc7
feat(webinar): fix issues found by coderabbitai
mickelr Nov 13, 2024
2a24f75
feat(webinar): fix issues found by coderabbitai
mickelr Nov 14, 2024
a3b447d
feat(webinar): update lower hand API and unit test
mickelr Nov 14, 2024
952c520
feat(webinar): update readme
mickelr Nov 15, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion packages/@webex/plugin-meetings/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -857,7 +857,8 @@ meeting.members.raiseOrLowerHand(memberId);

// You can lower all hands in a meeting
// use a memberId string to indicate who is requesting lowering all hands
meeting.members.lowerAllHands(requestingMemberId);
// (optional) use a roles array to indicate who should have their hands lowered, default to all roles
meeting.members.lowerAllHands(requestingMemberId, roles);

// You can transfer the host role to another member in the meeting, this is proxied by meeting.transfer
// use a memberId string and a moderator boolean to transfer or not, default to true
Expand Down
17 changes: 17 additions & 0 deletions packages/@webex/plugin-meetings/src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -356,6 +356,10 @@ export const EVENT_TRIGGERS = {
'meeting:controls:view-the-participants-list:updated',
MEETING_CONTROLS_RAISE_HAND_UPDATED: 'meeting:controls:raise-hand:updated',
MEETING_CONTROLS_VIDEO_UPDATED: 'meeting:controls:video:updated',
MEETING_CONTROLS_WEBCAST_UPDATED: 'meeting:controls:webcast:updated',
MEETING_CONTROLS_MEETING_FULL_UPDATED: 'meeting:controls:meeting-full:updated',
MEETING_CONTROLS_PRACTICE_SESSION_STATUS_UPDATED:
'meeting:controls:practice-session-status:updated',
// Locus URL changed
MEETING_LOCUS_URL_UPDATE: 'meeting:locus:locusUrl:update',
MEETING_STREAM_PUBLISH_STATE_CHANGED: 'meeting:streamPublishStateChanged',
Expand Down Expand Up @@ -671,6 +675,9 @@ export const LOCUSINFO = {
CONTROLS_REACTIONS_CHANGED: 'CONTROLS_REACTIONS_CHANGED',
CONTROLS_VIEW_THE_PARTICIPANTS_LIST_CHANGED: 'CONTROLS_VIEW_THE_PARTICIPANTS_LIST_CHANGED',
CONTROLS_RAISE_HAND_CHANGED: 'CONTROLS_RAISE_HAND_CHANGED',
CONTROLS_WEBCAST_CHANGED: 'CONTROLS_WEBCAST_CHANGED',
CONTROLS_MEETING_FULL_CHANGED: 'CONTROLS_MEETING_FULL_CHANGED',
CONTROLS_PRACTICE_SESSION_STATUS_UPDATED: 'CONTROLS_PRACTICE_SESSION_STATUS_UPDATED',
CONTROLS_VIDEO_CHANGED: 'CONTROLS_VIDEO_CHANGED',
SELF_UNADMITTED_GUEST: 'SELF_UNADMITTED_GUEST',
SELF_ADMITTED_GUEST: 'SELF_ADMITTED_GUEST',
Expand All @@ -697,6 +704,7 @@ export const LOCUSINFO = {
SELF_MEETING_INTERPRETATION_CHANGED: 'SELF_MEETING_INTERPRETATION_CHANGED',
MEDIA_INACTIVITY: 'MEDIA_INACTIVITY',
LINKS_SERVICES: 'LINKS_SERVICES',
LINKS_RESOURCES: 'LINKS_RESOURCES',
},
};

Expand Down Expand Up @@ -939,6 +947,11 @@ export const DISPLAY_HINTS = {
// participants list
DISABLE_VIEW_THE_PARTICIPANT_LIST: 'DISABLE_VIEW_THE_PARTICIPANT_LIST',
ENABLE_VIEW_THE_PARTICIPANT_LIST: 'ENABLE_VIEW_THE_PARTICIPANT_LIST',
// for webinar participants list
DISABLE_VIEW_THE_PARTICIPANT_LIST_PANELIST: 'DISABLE_VIEW_THE_PARTICIPANT_LIST_PANELIST',
ENABLE_VIEW_THE_PARTICIPANT_LIST_PANELIST: 'ENABLE_VIEW_THE_PARTICIPANT_LIST_PANELIST',
DISABLE_SHOW_ATTENDEE_COUNT: 'DISABLE_SHOW_ATTENDEE_COUNT',
ENABLE_SHOW_ATTENDEE_COUNT: 'ENABLE_SHOW_ATTENDEE_COUNT',

// raise hand
DISABLE_RAISE_HAND: 'DISABLE_RAISE_HAND',
Expand All @@ -958,6 +971,10 @@ export const DISPLAY_HINTS = {

// Voip (audio/video)
VOIP_IS_ENABLED: 'VOIP_IS_ENABLED',

// Webcast
WEBCAST_CONTROL_START: 'WEBCAST_CONTROL_START',
WEBCAST_CONTROL_STOP: 'WEBCAST_CONTROL_STOP',
};

export const INTERSTITIAL_DISPLAY_HINTS = [DISPLAY_HINTS.VOIP_IS_ENABLED];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ enum Setting {
disallowUnmute = 'DisallowUnmute',
muteOnEntry = 'MuteOnEntry',
muted = 'Muted',
roles = 'Roles',
}

enum Control {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,12 @@ export default class ControlsOptionsManager {
* @memberof ControlsOptionsManager
* @returns {Promise}
*/
private setControls(setting: {[key in Setting]?: boolean}): Promise<any> {
private setControls(setting: {
[Setting.muted]?: boolean;
[Setting.disallowUnmute]?: boolean;
[Setting.muteOnEntry]?: boolean;
[Setting.roles]?: Array<string>;
}): Promise<any> {
Comment on lines +180 to +185
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Consider adding a Role enum for type safety

While the type definition is more specific now, consider creating an enum for valid roles to prevent runtime errors from invalid role strings.

enum WebinarRole {
  HOST = 'HOST',
  PRESENTER = 'PRESENTER',
  ATTENDEE = 'ATTENDEE'
  // Add other valid roles
}

private setControls(setting: {
  [Setting.muted]?: boolean;
  [Setting.disallowUnmute]?: boolean;
  [Setting.muteOnEntry]?: boolean;
  [Setting.roles]?: Array<WebinarRole>;
}): Promise<any>;

LoggerProxy.logger.log(
`ControlsOptionsManager:index#setControls --> ${JSON.stringify(setting)}`
);
Expand All @@ -190,6 +195,7 @@ export default class ControlsOptionsManager {
Object.entries(setting).forEach(([key, value]) => {
if (
!shouldSkipCheckToMergeBody &&
value !== undefined &&
!Util?.[`${value ? CAN_SET : CAN_UNSET}${key}`](this.displayHints)
) {
error = new PermissionError(`${key} [${value}] not allowed, due to moderator property.`);
Expand Down Expand Up @@ -219,6 +225,14 @@ export default class ControlsOptionsManager {
}
break;

case Setting.roles:
if (Array.isArray(value)) {
body.audio = body.audio
? {...body.audio, [camelCase(key)]: value}
: {[camelCase(key)]: value};
}
break;
Comment on lines +228 to +234
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Add validation for role values

While the array check is good, consider adding validation for the role strings to prevent invalid roles from being processed.

 case Setting.roles:
   if (Array.isArray(value)) {
+    // Validate that all roles are valid strings
+    if (!value.every((role) => typeof role === 'string' && role.trim().length > 0)) {
+      error = new PermissionError('Invalid role value detected');
+      break;
+    }
     body.audio = body.audio
       ? {...body.audio, [camelCase(key)]: value}
       : {[camelCase(key)]: value};
   }
   break;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
case Setting.roles:
if (Array.isArray(value)) {
body.audio = body.audio
? {...body.audio, [camelCase(key)]: value}
: {[camelCase(key)]: value};
}
break;
case Setting.roles:
if (Array.isArray(value)) {
// Validate that all roles are valid strings
if (!value.every((role) => typeof role === 'string' && role.trim().length > 0)) {
error = new PermissionError('Invalid role value detected');
break;
}
body.audio = body.audio
? {...body.audio, [camelCase(key)]: value}
: {[camelCase(key)]: value};
}
break;


default:
error = new PermissionError(`${key} [${value}] not allowed, due to moderator property.`);
}
Expand Down Expand Up @@ -261,18 +275,21 @@ export default class ControlsOptionsManager {
* @param {boolean} mutedEnabled
* @param {boolean} disallowUnmuteEnabled
* @param {boolean} muteOnEntryEnabled
* @param {array} roles which should be muted
* @memberof ControlsOptionsManager
* @returns {Promise}
*/
public setMuteAll(
mutedEnabled: boolean,
disallowUnmuteEnabled: boolean,
muteOnEntryEnabled: boolean
muteOnEntryEnabled: boolean,
roles: Array<string>
): Promise<any> {
return this.setControls({
[Setting.muted]: mutedEnabled,
[Setting.disallowUnmute]: disallowUnmuteEnabled,
[Setting.muteOnEntry]: muteOnEntryEnabled,
[Setting.roles]: roles,
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ export interface VideoProperties {

export interface ViewTheParticipantListProperties {
enabled?: boolean;
panelistEnabled?: boolean;
attendeeCount?: boolean;
Comment on lines +39 to +40
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codebase verification

Missing test coverage for webinar control properties.

The properties panelistEnabled and attendeeCount are integrated with webinar functionality but lack corresponding tests to verify their behavior. Additionally, please ensure that FedRAMP documentation adequately covers these properties.

🔗 Analysis chain

Verify integration with webinar functionality and FedRAMP compliance.

Since these properties are part of webinar controls, let's verify their integration:

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check usage of new properties and related webinar functionality

# Check for usage of these properties in the codebase
echo "Checking usage of new properties..."
rg -t typescript "panelistEnabled|attendeeCount" packages/@webex/plugin-meetings/

# Check for webinar-related test coverage
echo "Checking test coverage..."
rg -t typescript "describe.*ViewTheParticipantList" packages/@webex/plugin-meetings/test/

# Check for FedRAMP compliance documentation
echo "Checking FedRAMP documentation..."
fd -t f "README|SECURITY" packages/@webex/plugin-meetings/

Length of output: 735


Script:

#!/bin/bash
# Description: Check usage of new properties and related webinar functionality with corrected file types

# Check for usage of these properties in the codebase
echo "Checking usage of new properties..."
rg --type-add 'ts=**/*.ts' --type-add 'tsx=**/*.tsx' -t ts -t tsx "panelistEnabled|attendeeCount" packages/@webex/plugin-meetings/

# Check for webinar-related test coverage
echo "Checking test coverage..."
rg --type-add 'ts=**/*.ts' --type-add 'tsx=**/*.tsx' -t ts -t tsx "describe.*ViewTheParticipantList" packages/@webex/plugin-meetings/test/

# Check for FedRAMP compliance documentation
echo "Checking FedRAMP documentation..."
fd -t f 'README|SECURITY' packages/@webex/plugin-meetings/

Length of output: 883


Script:

#!/bin/bash
# Description: Check usage of new properties and related webinar functionality by searching .ts and .tsx files

# Check for usage of these properties in the codebase
echo "Checking usage of new properties..."
rg "panelistEnabled|attendeeCount" packages/@webex/plugin-meetings/ --glob "*.ts" --glob "*.tsx"

# Check for webinar-related test coverage
echo "Checking test coverage..."
rg "describe.*ViewTheParticipantList" packages/@webex/plugin-meetings/test/ --glob "*.ts" --glob "*.tsx"

# Check for FedRAMP compliance documentation
echo "Checking FedRAMP documentation..."
fd -t f 'README|SECURITY' packages/@webex/plugin-meetings/

Length of output: 2319

}

export type Properties =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,18 @@ class Utils {
if (control.properties.enabled === false) {
requiredHints.push(DISPLAY_HINTS.DISABLE_VIEW_THE_PARTICIPANT_LIST);
}
if (control.properties.panelistEnabled === true) {
requiredHints.push(DISPLAY_HINTS.ENABLE_VIEW_THE_PARTICIPANT_LIST_PANELIST);
}
if (control.properties.panelistEnabled === false) {
requiredHints.push(DISPLAY_HINTS.DISABLE_VIEW_THE_PARTICIPANT_LIST_PANELIST);
}
if (control.properties.attendeeCount === true) {
requiredHints.push(DISPLAY_HINTS.ENABLE_SHOW_ATTENDEE_COUNT);
}
if (control.properties.attendeeCount === false) {
requiredHints.push(DISPLAY_HINTS.DISABLE_SHOW_ATTENDEE_COUNT);
}

return Utils.hasHints({requiredHints, displayHints});
}
Expand Down
46 changes: 44 additions & 2 deletions packages/@webex/plugin-meetings/src/locus-info/controlsUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,11 @@ ControlsUtils.parse = (controls: any) => {
}

if (controls?.viewTheParticipantList) {
parsedControls.viewTheParticipantList = {enabled: controls.viewTheParticipantList.enabled};
parsedControls.viewTheParticipantList = {
enabled: controls.viewTheParticipantList?.enabled ?? false,
panelistEnabled: controls.viewTheParticipantList?.panelistEnabled ?? false,
attendeeCount: controls.viewTheParticipantList?.attendeeCount ?? 0,
};
}

if (controls?.raiseHand) {
Expand All @@ -90,6 +94,23 @@ ControlsUtils.parse = (controls: any) => {
parsedControls.video = {enabled: controls.video.enabled};
}

if (controls?.webcastControl) {
parsedControls.webcastControl = {streaming: controls.webcastControl.streaming};
}

if (controls?.meetingFull) {
parsedControls.meetingFull = {
meetingFull: controls.meetingFull?.meetingFull ?? false,
meetingPanelistFull: controls.meetingFull?.meetingPanelistFull ?? false,
};
}

if (controls?.practiceSession) {
parsedControls.practiceSession = {
enabled: controls.practiceSession.enabled,
};
}

return parsedControls;
};

Expand Down Expand Up @@ -121,7 +142,11 @@ ControlsUtils.getControls = (oldControls: any, newControls: any) => {
previous?.reactions?.showDisplayNameWithReactions,

hasViewTheParticipantListChanged:
current?.viewTheParticipantList?.enabled !== previous?.viewTheParticipantList?.enabled,
current?.viewTheParticipantList?.enabled !== previous?.viewTheParticipantList?.enabled ||
current?.viewTheParticipantList?.panelistEnabled !==
previous?.viewTheParticipantList?.panelistEnabled ||
current?.viewTheParticipantList?.attendeeCount !==
previous?.viewTheParticipantList?.attendeeCount,

hasRaiseHandChanged: current?.raiseHand?.enabled !== previous?.raiseHand?.enabled,

Expand Down Expand Up @@ -167,6 +192,23 @@ ControlsUtils.getControls = (oldControls: any, newControls: any) => {
hasVideoEnabledChanged:
newControls.video?.enabled !== undefined &&
!isEqual(previous?.videoEnabled, current?.videoEnabled),

hasWebcastChanged: !isEqual(
previous?.webcastControl?.streaming,
current?.webcastControl?.streaming
),

hasMeetingFullChanged:
!isEqual(previous?.meetingFull?.meetingFull, current?.meetingFull?.meetingFull) ||
!isEqual(
previous?.meetingFull?.meetingPanelistFull,
current?.meetingFull?.meetingPanelistFull
),

hasPracticeSessionEnabledChanged: !isEqual(
previous?.practiceSession?.enabled,
current?.practiceSession?.enabled
),
},
};
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ FullState.parse = (fullState) => ({
type: fullState.type || FULL_STATE.UNKNOWN,
meetingState: fullState.state,
locked: fullState.locked,
attendeeCount: typeof fullState.attendeeCount === 'number' ? fullState.attendeeCount : 0,
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Consider improving type safety and default value handling.

While the type check for attendeeCount is good, there are several improvements that could be made:

  1. The default value of 0 might be misleading in error scenarios - consider using undefined or null to clearly indicate missing data.
  2. The property should be properly typed using TypeScript interfaces.

Consider applying these changes:

- const FullState: any = {};
+ interface FullStateData {
+   type: string;
+   state?: string;
+   locked?: boolean;
+   attendeeCount?: number;
+ }
+ 
+ interface ParsedFullState {
+   type: string;
+   meetingState: string | undefined;
+   locked: boolean | undefined;
+   attendeeCount: number | undefined;
+ }
+ 
+ const FullState = {
+   parse(fullState: FullStateData): ParsedFullState => ({
    type: fullState.type || FULL_STATE.UNKNOWN,
    meetingState: fullState.state,
    locked: fullState.locked,
-   attendeeCount: typeof fullState.attendeeCount === 'number' ? fullState.attendeeCount : 0,
+   attendeeCount: typeof fullState.attendeeCount === 'number' ? fullState.attendeeCount : undefined,
  });
+ };

Committable suggestion skipped: line range outside the PR's diff.

});

FullState.getFullState = (oldFullState, newFullState) => {
Expand Down
51 changes: 51 additions & 0 deletions packages/@webex/plugin-meetings/src/locus-info/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ export default class LocusInfo extends EventsScope {
replace: any;
url: any;
services: any;
resources: any;
mainSessionLocusCache: any;
/**
* Constructor
Expand Down Expand Up @@ -263,6 +264,7 @@ export default class LocusInfo extends EventsScope {
this.updateHostInfo(locus.host);
this.updateMediaShares(locus.mediaShares);
this.updateServices(locus.links?.services);
this.updateResources(locus.links?.resources);
}

/**
Expand Down Expand Up @@ -452,6 +454,7 @@ export default class LocusInfo extends EventsScope {
this.updateIdentifiers(locus.identities);
this.updateEmbeddedApps(locus.embeddedApps);
this.updateServices(locus.links?.services);
this.updateResources(locus.links?.resources);
this.compareAndUpdate();
// update which required to compare different objects from locus
}
Expand Down Expand Up @@ -805,6 +808,9 @@ export default class LocusInfo extends EventsScope {
hasRaiseHandChanged,
hasVideoChanged,
hasInterpretationChanged,
hasWebcastChanged,
hasMeetingFullChanged,
hasPracticeSessionEnabledChanged,
},
current,
} = ControlsUtils.getControls(this.controls, controls);
Expand Down Expand Up @@ -1008,6 +1014,30 @@ export default class LocusInfo extends EventsScope {
);
}

if (hasWebcastChanged) {
this.emitScoped(
{file: 'locus-info', function: 'updateControls'},
LOCUSINFO.EVENTS.CONTROLS_WEBCAST_CHANGED,
{state: current.webcastControl}
);
}

if (hasMeetingFullChanged) {
this.emitScoped(
{file: 'locus-info', function: 'updateControls'},
LOCUSINFO.EVENTS.CONTROLS_MEETING_FULL_CHANGED,
{state: current.meetingFull}
);
}

if (hasPracticeSessionEnabledChanged) {
this.emitScoped(
{file: 'locus-info', function: 'updateControls'},
LOCUSINFO.EVENTS.CONTROLS_PRACTICE_SESSION_STATUS_UPDATED,
{state: current.practiceSession}
);
}

this.controls = controls;
}
}
Expand Down Expand Up @@ -1064,6 +1094,27 @@ export default class LocusInfo extends EventsScope {
}
}

/**
* @param {Object} resources
* @returns {undefined}
* @memberof LocusInfo
*/
updateResources(resources: Record<'webcastInstance', {url: string}>) {
if (resources && !isEqual(this.resources, resources)) {
this.resources = resources;
this.emitScoped(
{
file: 'locus-info',
function: 'updateResources',
},
LOCUSINFO.EVENTS.LINKS_RESOURCES,
{
resources,
}
);
}
}

/**
* @param {Object} fullState
* @returns {undefined}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,10 @@ interface IInMeetingActions {
canUpdateShareControl?: boolean;
canEnableViewTheParticipantsList?: boolean;
canDisableViewTheParticipantsList?: boolean;
canEnableViewTheParticipantsListPanelist?: boolean;
canDisableViewTheParticipantsListPanelist?: boolean;
canEnableShowAttendeeCount?: boolean;
canDisableShowAttendeeCount?: boolean;
canEnableRaiseHand?: boolean;
canDisableRaiseHand?: boolean;
canEnableVideo?: boolean;
Expand All @@ -83,6 +87,8 @@ interface IInMeetingActions {
canShareWhiteBoard?: boolean;
enforceVirtualBackground?: boolean;
canPollingAndQA?: boolean;
canStartWebcast?: boolean;
canStopWebcast?: boolean;
}

/**
Expand Down Expand Up @@ -201,6 +207,14 @@ export default class InMeetingActions implements IInMeetingActions {

canDisableViewTheParticipantsList = null;

canEnableViewTheParticipantsListPanelist = null;

canDisableViewTheParticipantsListPanelist = null;

canEnableShowAttendeeCount = null;

canDisableShowAttendeeCount = null;

canEnableRaiseHand = null;

canDisableRaiseHand = null;
Expand Down Expand Up @@ -238,6 +252,10 @@ export default class InMeetingActions implements IInMeetingActions {
canShareWhiteBoard = null;

canPollingAndQA = null;

canStartWebcast = null;

canStopWebcast = null;
/**
* Returns all meeting action options
* @returns {Object}
Expand Down Expand Up @@ -298,6 +316,10 @@ export default class InMeetingActions implements IInMeetingActions {
canUpdateShareControl: this.canUpdateShareControl,
canEnableViewTheParticipantsList: this.canEnableViewTheParticipantsList,
canDisableViewTheParticipantsList: this.canDisableViewTheParticipantsList,
canEnableViewTheParticipantsListPanelist: this.canEnableViewTheParticipantsListPanelist,
canDisableViewTheParticipantsListPanelist: this.canDisableViewTheParticipantsListPanelist,
canEnableShowAttendeeCount: this.canEnableShowAttendeeCount,
canDisableShowAttendeeCount: this.canDisableShowAttendeeCount,
canEnableRaiseHand: this.canEnableRaiseHand,
canDisableRaiseHand: this.canDisableRaiseHand,
canEnableVideo: this.canEnableVideo,
Expand All @@ -317,6 +339,8 @@ export default class InMeetingActions implements IInMeetingActions {
supportHDV: this.supportHDV,
canShareWhiteBoard: this.canShareWhiteBoard,
canPollingAndQA: this.canPollingAndQA,
canStartWebcast: this.canStartWebcast,
canStopWebcast: this.canStopWebcast,
});

/**
Expand Down
Loading
Loading