@webex/plugin-meetings 3.0.0-beta.108 → 3.0.0-beta.109

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +1 -1
  3. package/dist/constants.js +21 -2
  4. package/dist/constants.js.map +1 -1
  5. package/dist/controls-options-manager/enums.js +2 -0
  6. package/dist/controls-options-manager/enums.js.map +1 -1
  7. package/dist/controls-options-manager/types.js.map +1 -1
  8. package/dist/controls-options-manager/util.js +36 -0
  9. package/dist/controls-options-manager/util.js.map +1 -1
  10. package/dist/locus-info/controlsUtils.js +39 -1
  11. package/dist/locus-info/controlsUtils.js.map +1 -1
  12. package/dist/locus-info/index.js +55 -0
  13. package/dist/locus-info/index.js.map +1 -1
  14. package/dist/meeting/in-meeting-actions.js +9 -1
  15. package/dist/meeting/in-meeting-actions.js.map +1 -1
  16. package/dist/meeting/index.js +84 -14
  17. package/dist/meeting/index.js.map +1 -1
  18. package/dist/types/constants.d.ts +16 -0
  19. package/dist/types/controls-options-manager/enums.d.ts +2 -0
  20. package/dist/types/controls-options-manager/types.d.ts +7 -1
  21. package/dist/types/meeting/in-meeting-actions.d.ts +8 -0
  22. package/package.json +19 -19
  23. package/src/constants.ts +22 -0
  24. package/src/controls-options-manager/enums.ts +2 -0
  25. package/src/controls-options-manager/types.ts +10 -0
  26. package/src/controls-options-manager/util.ts +45 -0
  27. package/src/locus-info/controlsUtils.ts +54 -0
  28. package/src/locus-info/index.ts +55 -0
  29. package/src/meeting/in-meeting-actions.ts +16 -0
  30. package/src/meeting/index.ts +70 -0
  31. package/test/unit/spec/controls-options-manager/util.js +108 -7
  32. package/test/unit/spec/locus-info/controlsUtils.js +112 -0
  33. package/test/unit/spec/locus-info/index.js +84 -1
  34. package/test/unit/spec/meeting/in-meeting-actions.ts +8 -0
  35. package/test/unit/spec/meeting/index.js +108 -0
@@ -244,6 +244,12 @@ export declare const EVENT_TRIGGERS: {
244
244
  REMOTE_MEDIA_AUDIO_CREATED: string;
245
245
  REMOTE_MEDIA_SCREEN_SHARE_AUDIO_CREATED: string;
246
246
  REMOTE_MEDIA_VIDEO_LAYOUT_CHANGED: string;
247
+ MEETING_CONTROLS_MUTE_ON_ENTRY_UPDATED: string;
248
+ MEETING_CONTROLS_SHARE_CONTROL_UPDATED: string;
249
+ MEETING_CONTROLS_DISALLOW_UNMUTE_UPDATED: string;
250
+ MEETING_CONTROLS_REACTIONS_UPDATED: string;
251
+ MEETING_CONTROLS_VIEW_THE_PARTICIPANTS_LIST_UPDATED: string;
252
+ MEETING_CONTROLS_RAISE_HAND_UPDATED: string;
247
253
  };
248
254
  export declare const EVENT_TYPES: {
249
255
  SELF: string;
@@ -460,6 +466,12 @@ export declare const LOCUSINFO: {
460
466
  CONTROLS_MEETING_CONTAINER_UPDATED: string;
461
467
  CONTROLS_ENTRY_EXIT_TONE_UPDATED: string;
462
468
  CONTROLS_JOIN_BREAKOUT_FROM_MAIN: string;
469
+ CONTROLS_MUTE_ON_ENTRY_CHANGED: string;
470
+ CONTROLS_SHARE_CONTROL_CHANGED: string;
471
+ CONTROLS_DISALLOW_UNMUTE_CHANGED: string;
472
+ CONTROLS_REACTIONS_CHANGED: string;
473
+ CONTROLS_VIEW_THE_PARTICIPANTS_LIST_CHANGED: string;
474
+ CONTROLS_RAISE_HAND_CHANGED: string;
463
475
  SELF_UNADMITTED_GUEST: string;
464
476
  SELF_ADMITTED_GUEST: string;
465
477
  SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED: string;
@@ -661,6 +673,10 @@ export declare const DISPLAY_HINTS: {
661
673
  DISABLE_LOBBY_TO_BREAKOUT: string;
662
674
  DISABLE_VIEW_THE_PARTICIPANT_LIST: string;
663
675
  ENABLE_VIEW_THE_PARTICIPANT_LIST: string;
676
+ DISABLE_RAISE_HAND: string;
677
+ ENABLE_RAISE_HAND: string;
678
+ DISABLE_VIDEO: string;
679
+ ENABLE_VIDEO: string;
664
680
  };
665
681
  export declare const SELF_ROLES: {
666
682
  COHOST: string;
@@ -5,8 +5,10 @@ declare enum Setting {
5
5
  }
6
6
  declare enum Control {
7
7
  audio = "audio",
8
+ raiseHand = "raiseHand",
8
9
  reactions = "reactions",
9
10
  shareControl = "shareControl",
11
+ video = "video",
10
12
  viewTheParticipantList = "viewTheParticipantList"
11
13
  }
12
14
  export { Control, Setting };
@@ -14,6 +14,9 @@ export interface AudioProperties {
14
14
  disallowUnmute?: boolean;
15
15
  muteOnEntry?: boolean;
16
16
  }
17
+ export interface RaiseHandProperties {
18
+ enabled?: boolean;
19
+ }
17
20
  export interface ReactionsProperties {
18
21
  enabled?: boolean;
19
22
  showDisplayNameWithReactions?: boolean;
@@ -21,10 +24,13 @@ export interface ReactionsProperties {
21
24
  export interface ShareControlProperties {
22
25
  control?: 'ANYONE' | 'MODERATOR_PRESENTER';
23
26
  }
27
+ export interface VideoProperties {
28
+ enabled?: boolean;
29
+ }
24
30
  export interface ViewTheParticipantListProperties {
25
31
  enabled?: boolean;
26
32
  }
27
- export type Properties = AudioProperties | ReactionsProperties | ShareControlProperties | ViewTheParticipantListProperties;
33
+ export type Properties = AudioProperties | RaiseHandProperties | ReactionsProperties | ShareControlProperties | VideoProperties | ViewTheParticipantListProperties;
28
34
  export interface ControlConfig<Props = Properties> {
29
35
  /**
30
36
  * The scope of the control within this object.
@@ -57,6 +57,10 @@ interface IInMeetingActions {
57
57
  canUpdateShareControl?: boolean;
58
58
  canEnableViewTheParticipantsList?: boolean;
59
59
  canDisableViewTheParticipantsList?: boolean;
60
+ canEnableRaiseHand?: boolean;
61
+ canDisableRaiseHand?: boolean;
62
+ canEnableVideo?: boolean;
63
+ canDisableVideo?: boolean;
60
64
  }
61
65
  /**
62
66
  * @class InMeetingActions
@@ -114,6 +118,10 @@ export default class InMeetingActions implements IInMeetingActions {
114
118
  canUpdateShareControl: any;
115
119
  canEnableViewTheParticipantsList: any;
116
120
  canDisableViewTheParticipantsList: any;
121
+ canEnableRaiseHand: any;
122
+ canDisableRaiseHand: any;
123
+ canEnableVideo: any;
124
+ canDisableVideo: any;
117
125
  /**
118
126
  * Returns all meeting action options
119
127
  * @returns {Object}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webex/plugin-meetings",
3
- "version": "3.0.0-beta.108",
3
+ "version": "3.0.0-beta.109",
4
4
  "description": "",
5
5
  "license": "Cisco EULA (https://www.cisco.com/c/en/us/products/end-user-license-agreement.html)",
6
6
  "contributors": [
@@ -32,12 +32,12 @@
32
32
  "build": "yarn run -T tsc --declaration true --declarationDir ./dist/types"
33
33
  },
34
34
  "devDependencies": {
35
- "@webex/plugin-meetings": "3.0.0-beta.108",
36
- "@webex/test-helper-chai": "3.0.0-beta.108",
37
- "@webex/test-helper-mocha": "3.0.0-beta.108",
38
- "@webex/test-helper-mock-webex": "3.0.0-beta.108",
39
- "@webex/test-helper-retry": "3.0.0-beta.108",
40
- "@webex/test-helper-test-users": "3.0.0-beta.108",
35
+ "@webex/plugin-meetings": "3.0.0-beta.109",
36
+ "@webex/test-helper-chai": "3.0.0-beta.109",
37
+ "@webex/test-helper-mocha": "3.0.0-beta.109",
38
+ "@webex/test-helper-mock-webex": "3.0.0-beta.109",
39
+ "@webex/test-helper-retry": "3.0.0-beta.109",
40
+ "@webex/test-helper-test-users": "3.0.0-beta.109",
41
41
  "chai": "^4.3.4",
42
42
  "chai-as-promised": "^7.1.1",
43
43
  "jsdom-global": "3.0.2",
@@ -46,19 +46,19 @@
46
46
  "typescript": "^4.7.4"
47
47
  },
48
48
  "dependencies": {
49
- "@webex/common": "3.0.0-beta.108",
49
+ "@webex/common": "3.0.0-beta.109",
50
50
  "@webex/internal-media-core": "1.38.0",
51
- "@webex/internal-plugin-conversation": "3.0.0-beta.108",
52
- "@webex/internal-plugin-device": "3.0.0-beta.108",
53
- "@webex/internal-plugin-llm": "3.0.0-beta.108",
54
- "@webex/internal-plugin-mercury": "3.0.0-beta.108",
55
- "@webex/internal-plugin-metrics": "3.0.0-beta.108",
56
- "@webex/internal-plugin-support": "3.0.0-beta.108",
57
- "@webex/internal-plugin-user": "3.0.0-beta.108",
58
- "@webex/media-helpers": "3.0.0-beta.108",
59
- "@webex/plugin-people": "3.0.0-beta.108",
60
- "@webex/plugin-rooms": "3.0.0-beta.108",
61
- "@webex/webex-core": "3.0.0-beta.108",
51
+ "@webex/internal-plugin-conversation": "3.0.0-beta.109",
52
+ "@webex/internal-plugin-device": "3.0.0-beta.109",
53
+ "@webex/internal-plugin-llm": "3.0.0-beta.109",
54
+ "@webex/internal-plugin-mercury": "3.0.0-beta.109",
55
+ "@webex/internal-plugin-metrics": "3.0.0-beta.109",
56
+ "@webex/internal-plugin-support": "3.0.0-beta.109",
57
+ "@webex/internal-plugin-user": "3.0.0-beta.109",
58
+ "@webex/media-helpers": "3.0.0-beta.109",
59
+ "@webex/plugin-people": "3.0.0-beta.109",
60
+ "@webex/plugin-rooms": "3.0.0-beta.109",
61
+ "@webex/webex-core": "3.0.0-beta.109",
62
62
  "ampersand-collection": "^2.0.2",
63
63
  "bowser": "^2.11.0",
64
64
  "btoa": "^1.2.1",
package/src/constants.ts CHANGED
@@ -346,6 +346,14 @@ export const EVENT_TRIGGERS = {
346
346
  REMOTE_MEDIA_AUDIO_CREATED: 'media:remoteAudio:created',
347
347
  REMOTE_MEDIA_SCREEN_SHARE_AUDIO_CREATED: 'media:remoteScreenShareAudio:created',
348
348
  REMOTE_MEDIA_VIDEO_LAYOUT_CHANGED: 'media:remoteVideo:layoutChanged',
349
+ // Controls
350
+ MEETING_CONTROLS_MUTE_ON_ENTRY_UPDATED: 'meeting:controls:mute-on-entry:updated',
351
+ MEETING_CONTROLS_SHARE_CONTROL_UPDATED: 'meeting:controls:share-control:updated',
352
+ MEETING_CONTROLS_DISALLOW_UNMUTE_UPDATED: 'meeting:controls:disallow-unmute:updated',
353
+ MEETING_CONTROLS_REACTIONS_UPDATED: 'meeting:controls:reactions:updated',
354
+ MEETING_CONTROLS_VIEW_THE_PARTICIPANTS_LIST_UPDATED:
355
+ 'meeting:controls:view-the-participants-list:updated',
356
+ MEETING_CONTROLS_RAISE_HAND_UPDATED: 'meeting:controls:raise-hand:updated',
349
357
  };
350
358
 
351
359
  export const EVENT_TYPES = {
@@ -592,6 +600,12 @@ export const LOCUSINFO = {
592
600
  CONTROLS_MEETING_CONTAINER_UPDATED: 'CONTROLS_MEETING_CONTAINER_UPDATED',
593
601
  CONTROLS_ENTRY_EXIT_TONE_UPDATED: 'CONTROLS_ENTRY_EXIT_TONE_UPDATED',
594
602
  CONTROLS_JOIN_BREAKOUT_FROM_MAIN: 'CONTROLS_JOIN_BREAKOUT_FROM_MAIN',
603
+ CONTROLS_MUTE_ON_ENTRY_CHANGED: 'CONTROLS_MUTE_ON_ENTRY_CHANGED',
604
+ CONTROLS_SHARE_CONTROL_CHANGED: 'CONTROLS_SHARE_CONTROL_CHANGED',
605
+ CONTROLS_DISALLOW_UNMUTE_CHANGED: 'CONTROLS_DISALLOW_UNMUTE_CHANGED',
606
+ CONTROLS_REACTIONS_CHANGED: 'CONTROLS_REACTIONS_CHANGED',
607
+ CONTROLS_VIEW_THE_PARTICIPANTS_LIST_CHANGED: 'CONTROLS_VIEW_THE_PARTICIPANTS_LIST_CHANGED',
608
+ CONTROLS_RAISE_HAND_CHANGED: 'CONTROLS_RAISE_HAND_CHANGED',
595
609
  SELF_UNADMITTED_GUEST: 'SELF_UNADMITTED_GUEST',
596
610
  SELF_ADMITTED_GUEST: 'SELF_ADMITTED_GUEST',
597
611
  SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED: 'SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED',
@@ -831,6 +845,14 @@ export const DISPLAY_HINTS = {
831
845
  // participants list
832
846
  DISABLE_VIEW_THE_PARTICIPANT_LIST: 'DISABLE_VIEW_THE_PARTICIPANT_LIST',
833
847
  ENABLE_VIEW_THE_PARTICIPANT_LIST: 'ENABLE_VIEW_THE_PARTICIPANT_LIST',
848
+
849
+ // raise hand
850
+ DISABLE_RAISE_HAND: 'DISABLE_RAISE_HAND',
851
+ ENABLE_RAISE_HAND: 'ENABLE_RAISE_HAND',
852
+
853
+ // video
854
+ DISABLE_VIDEO: 'DISABLE_VIDEO',
855
+ ENABLE_VIDEO: 'ENABLE_VIDEO',
834
856
  };
835
857
 
836
858
  export const SELF_ROLES = {
@@ -6,8 +6,10 @@ enum Setting {
6
6
 
7
7
  enum Control {
8
8
  audio = 'audio',
9
+ raiseHand = 'raiseHand',
9
10
  reactions = 'reactions',
10
11
  shareControl = 'shareControl',
12
+ video = 'video',
11
13
  viewTheParticipantList = 'viewTheParticipantList',
12
14
  }
13
15
 
@@ -17,6 +17,10 @@ export interface AudioProperties {
17
17
  muteOnEntry?: boolean;
18
18
  }
19
19
 
20
+ export interface RaiseHandProperties {
21
+ enabled?: boolean;
22
+ }
23
+
20
24
  export interface ReactionsProperties {
21
25
  enabled?: boolean;
22
26
  showDisplayNameWithReactions?: boolean;
@@ -26,14 +30,20 @@ export interface ShareControlProperties {
26
30
  control?: 'ANYONE' | 'MODERATOR_PRESENTER';
27
31
  }
28
32
 
33
+ export interface VideoProperties {
34
+ enabled?: boolean;
35
+ }
36
+
29
37
  export interface ViewTheParticipantListProperties {
30
38
  enabled?: boolean;
31
39
  }
32
40
 
33
41
  export type Properties =
34
42
  | AudioProperties
43
+ | RaiseHandProperties
35
44
  | ReactionsProperties
36
45
  | ShareControlProperties
46
+ | VideoProperties
37
47
  | ViewTheParticipantListProperties;
38
48
 
39
49
  export interface ControlConfig<Props = Properties> {
@@ -3,8 +3,10 @@ import {Control} from './enums';
3
3
  import {
4
4
  ControlConfig,
5
5
  AudioProperties,
6
+ RaiseHandProperties,
6
7
  ReactionsProperties,
7
8
  ViewTheParticipantListProperties,
9
+ VideoProperties,
8
10
  } from './types';
9
11
 
10
12
  /**
@@ -122,6 +124,22 @@ class Utils {
122
124
  return Utils.hasHints({requiredHints, displayHints});
123
125
  }
124
126
 
127
+ public static canUpdateRaiseHand(
128
+ control: ControlConfig<RaiseHandProperties>,
129
+ displayHints: Array<string>
130
+ ) {
131
+ const requiredHints = [];
132
+
133
+ if (control.properties.enabled === true) {
134
+ requiredHints.push(DISPLAY_HINTS.ENABLE_RAISE_HAND);
135
+ }
136
+ if (control.properties.enabled === false) {
137
+ requiredHints.push(DISPLAY_HINTS.DISABLE_RAISE_HAND);
138
+ }
139
+
140
+ return Utils.hasHints({requiredHints, displayHints});
141
+ }
142
+
125
143
  /**
126
144
  * Validate if an reactions-scoped control is allowed to be sent to the service.
127
145
  *
@@ -184,6 +202,22 @@ class Utils {
184
202
  return Utils.hasHints({requiredHints, displayHints});
185
203
  }
186
204
 
205
+ public static canUpdateVideo(
206
+ control: ControlConfig<VideoProperties>,
207
+ displayHints: Array<string>
208
+ ) {
209
+ const requiredHints = [];
210
+
211
+ if (control.properties.enabled === true) {
212
+ requiredHints.push(DISPLAY_HINTS.ENABLE_VIDEO);
213
+ }
214
+ if (control.properties.enabled === false) {
215
+ requiredHints.push(DISPLAY_HINTS.DISABLE_VIDEO);
216
+ }
217
+
218
+ return Utils.hasHints({requiredHints, displayHints});
219
+ }
220
+
187
221
  /**
188
222
  * Validate that a control can be sent to the service based on the provided
189
223
  * display hints.
@@ -200,6 +234,13 @@ class Utils {
200
234
  determinant = Utils.canUpdateAudio(control as ControlConfig<AudioProperties>, displayHints);
201
235
  break;
202
236
 
237
+ case Control.raiseHand:
238
+ determinant = Utils.canUpdateRaiseHand(
239
+ control as ControlConfig<RaiseHandProperties>,
240
+ displayHints
241
+ );
242
+ break;
243
+
203
244
  case Control.reactions:
204
245
  determinant = Utils.canUpdateReactions(
205
246
  control as ControlConfig<ReactionsProperties>,
@@ -211,6 +252,10 @@ class Utils {
211
252
  determinant = Utils.canUpdateShareControl(displayHints);
212
253
  break;
213
254
 
255
+ case Control.video:
256
+ determinant = Utils.canUpdateVideo(control as ControlConfig<VideoProperties>, displayHints);
257
+ break;
258
+
214
259
  case Control.viewTheParticipantList:
215
260
  determinant = Utils.canUpdateViewTheParticipantsList(
216
261
  control as ControlConfig<ViewTheParticipantListProperties>,
@@ -53,6 +53,33 @@ ControlsUtils.parse = (controls: any) => {
53
53
  parsedControls.videoEnabled = controls.video.enabled;
54
54
  }
55
55
 
56
+ if (controls?.muteOnEntry) {
57
+ parsedControls.muteOnEntry = {enabled: controls.muteOnEntry.enabled};
58
+ }
59
+
60
+ if (controls?.shareControl) {
61
+ parsedControls.shareControl = {control: controls.shareControl.control};
62
+ }
63
+
64
+ if (controls?.disallowUnmute) {
65
+ parsedControls.disallowUnmute = {enabled: controls.disallowUnmute.enabled};
66
+ }
67
+
68
+ if (controls?.reactions) {
69
+ parsedControls.reactions = {
70
+ enabled: controls.reactions.enabled,
71
+ showDisplayNameWithReactions: controls.reactions.showDisplayNameWithReactions,
72
+ };
73
+ }
74
+
75
+ if (controls?.viewTheParticipantList) {
76
+ parsedControls.viewTheParticipantList = {enabled: controls.viewTheParticipantList.enabled};
77
+ }
78
+
79
+ if (controls?.raiseHand) {
80
+ parsedControls.raiseHand = {enabled: controls.raiseHand.enabled};
81
+ }
82
+
56
83
  return parsedControls;
57
84
  };
58
85
 
@@ -70,6 +97,33 @@ ControlsUtils.getControls = (oldControls: any, newControls: any) => {
70
97
  previous,
71
98
  current,
72
99
  updates: {
100
+ hasMuteOnEntryChanged:
101
+ current?.muteOnEntry?.enabled &&
102
+ current?.muteOnEntry?.enabled !== previous?.muteOnEntry?.enabled,
103
+
104
+ hasShareControlChanged:
105
+ current?.shareControl?.control &&
106
+ current?.shareControl?.control !== previous?.shareControl?.control,
107
+
108
+ hasDisallowUnmuteChanged:
109
+ current?.disallowUnmute?.enabled &&
110
+ current?.disallowUnmute?.enabled !== previous?.disallowUnmute?.enabled,
111
+
112
+ hasReactionsChanged:
113
+ current?.reactions?.enabled && current?.reactions?.enabled !== previous?.reactions?.enabled,
114
+
115
+ hasReactionDisplayNamesChanged:
116
+ current?.reactions?.showDisplayNameWithReactions &&
117
+ current?.reactions?.showDisplayNameWithReactions !==
118
+ previous?.reactions?.showDisplayNameWithReactions,
119
+
120
+ hasViewTheParticipantListChanged:
121
+ current?.viewTheParticipantList?.enabled &&
122
+ current?.viewTheParticipantList?.enabled !== previous?.viewTheParticipantList?.enabled,
123
+
124
+ hasRaiseHandChanged:
125
+ current?.raiseHand?.enabled && current?.raiseHand?.enabled !== previous?.raiseHand?.enabled,
126
+
73
127
  hasRecordingPausedChanged:
74
128
  current?.record &&
75
129
  !isEqual(previous?.record?.paused, current.record.paused) &&
@@ -700,10 +700,65 @@ export default class LocusInfo extends EventsScope {
700
700
  hasEntryExitToneChanged,
701
701
  hasBreakoutChanged,
702
702
  hasVideoEnabledChanged,
703
+ hasMuteOnEntryChanged,
704
+ hasShareControlChanged,
705
+ hasDisallowUnmuteChanged,
706
+ hasReactionsChanged,
707
+ hasReactionDisplayNamesChanged,
708
+ hasViewTheParticipantListChanged,
709
+ hasRaiseHandChanged,
703
710
  },
704
711
  current,
705
712
  } = ControlsUtils.getControls(this.controls, controls);
706
713
 
714
+ if (hasMuteOnEntryChanged) {
715
+ this.emitScoped(
716
+ {file: 'locus-info', function: 'updateControls'},
717
+ LOCUSINFO.EVENTS.CONTROLS_MUTE_ON_ENTRY_CHANGED,
718
+ {state: current.muteOnEntry}
719
+ );
720
+ }
721
+
722
+ if (hasShareControlChanged) {
723
+ this.emitScoped(
724
+ {file: 'locus-info', function: 'updateControls'},
725
+ LOCUSINFO.EVENTS.CONTROLS_SHARE_CONTROL_CHANGED,
726
+ {state: current.shareControl}
727
+ );
728
+ }
729
+
730
+ if (hasDisallowUnmuteChanged) {
731
+ this.emitScoped(
732
+ {file: 'locus-info', function: 'updateControls'},
733
+ LOCUSINFO.EVENTS.CONTROLS_DISALLOW_UNMUTE_CHANGED,
734
+ {state: current.disallowUnmute}
735
+ );
736
+ }
737
+
738
+ if (hasReactionsChanged || hasReactionDisplayNamesChanged) {
739
+ this.emitScoped(
740
+ {file: 'locus-info', function: 'updateControls'},
741
+ LOCUSINFO.EVENTS.CONTROLS_REACTIONS_CHANGED,
742
+ {state: current.reactions}
743
+ );
744
+ }
745
+
746
+ if (hasViewTheParticipantListChanged) {
747
+ this.emitScoped(
748
+ {file: 'locus-info', function: 'updateControls'},
749
+ LOCUSINFO.EVENTS.CONTROLS_VIEW_THE_PARTICIPANTS_LIST_CHANGED,
750
+ {state: current.viewTheParticipantList}
751
+ );
752
+ }
753
+
754
+ if (hasRaiseHandChanged) {
755
+ this.emitScoped(
756
+ {file: 'locus-info', function: 'updateControls'},
757
+ LOCUSINFO.EVENTS.CONTROLS_RAISE_HAND_CHANGED,
758
+ {state: current.raiseHand}
759
+ );
760
+ }
761
+
707
762
  if (hasRecordingChanged || hasRecordingPausedChanged) {
708
763
  let state = null;
709
764
 
@@ -60,6 +60,10 @@ interface IInMeetingActions {
60
60
  canUpdateShareControl?: boolean;
61
61
  canEnableViewTheParticipantsList?: boolean;
62
62
  canDisableViewTheParticipantsList?: boolean;
63
+ canEnableRaiseHand?: boolean;
64
+ canDisableRaiseHand?: boolean;
65
+ canEnableVideo?: boolean;
66
+ canDisableVideo?: boolean;
63
67
  }
64
68
 
65
69
  /**
@@ -170,6 +174,14 @@ export default class InMeetingActions implements IInMeetingActions {
170
174
 
171
175
  canDisableViewTheParticipantsList = null;
172
176
 
177
+ canEnableRaiseHand = null;
178
+
179
+ canDisableRaiseHand = null;
180
+
181
+ canEnableVideo = null;
182
+
183
+ canDisableVideo = null;
184
+
173
185
  /**
174
186
  * Returns all meeting action options
175
187
  * @returns {Object}
@@ -226,6 +238,10 @@ export default class InMeetingActions implements IInMeetingActions {
226
238
  canUpdateShareControl: this.canUpdateShareControl,
227
239
  canEnableViewTheParticipantsList: this.canEnableViewTheParticipantsList,
228
240
  canDisableViewTheParticipantsList: this.canDisableViewTheParticipantsList,
241
+ canEnableRaiseHand: this.canEnableRaiseHand,
242
+ canDisableRaiseHand: this.canDisableRaiseHand,
243
+ canEnableVideo: this.canEnableVideo,
244
+ canDisableVideo: this.canDisableVideo,
229
245
  });
230
246
 
231
247
  /**
@@ -2114,6 +2114,60 @@ export default class Meeting extends StatelessWebexPlugin {
2114
2114
  {entryExitTone}
2115
2115
  );
2116
2116
  });
2117
+
2118
+ this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_MUTE_ON_ENTRY_CHANGED, ({state}) => {
2119
+ Trigger.trigger(
2120
+ this,
2121
+ {file: 'meeting/index', function: 'setupLocusControlsListener'},
2122
+ EVENT_TRIGGERS.MEETING_CONTROLS_MUTE_ON_ENTRY_UPDATED,
2123
+ {state}
2124
+ );
2125
+ });
2126
+
2127
+ this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_SHARE_CONTROL_CHANGED, ({state}) => {
2128
+ Trigger.trigger(
2129
+ this,
2130
+ {file: 'meeting/index', function: 'setupLocusControlsListener'},
2131
+ EVENT_TRIGGERS.MEETING_CONTROLS_SHARE_CONTROL_UPDATED,
2132
+ {state}
2133
+ );
2134
+ });
2135
+
2136
+ this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_DISALLOW_UNMUTE_CHANGED, ({state}) => {
2137
+ Trigger.trigger(
2138
+ this,
2139
+ {file: 'meeting/index', function: 'setupLocusControlsListener'},
2140
+ EVENT_TRIGGERS.MEETING_CONTROLS_DISALLOW_UNMUTE_UPDATED,
2141
+ {state}
2142
+ );
2143
+ });
2144
+
2145
+ this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_REACTIONS_CHANGED, ({state}) => {
2146
+ Trigger.trigger(
2147
+ this,
2148
+ {file: 'meeting/index', function: 'setupLocusControlsListener'},
2149
+ EVENT_TRIGGERS.MEETING_CONTROLS_REACTIONS_UPDATED,
2150
+ {state}
2151
+ );
2152
+ });
2153
+
2154
+ this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_VIEW_THE_PARTICIPANTS_LIST_CHANGED, ({state}) => {
2155
+ Trigger.trigger(
2156
+ this,
2157
+ {file: 'meeting/index', function: 'setupLocusControlsListener'},
2158
+ EVENT_TRIGGERS.MEETING_CONTROLS_VIEW_THE_PARTICIPANTS_LIST_UPDATED,
2159
+ {state}
2160
+ );
2161
+ });
2162
+
2163
+ this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_RAISE_HAND_CHANGED, ({state}) => {
2164
+ Trigger.trigger(
2165
+ this,
2166
+ {file: 'meeting/index', function: 'setupLocusControlsListener'},
2167
+ EVENT_TRIGGERS.MEETING_CONTROLS_RAISE_HAND_UPDATED,
2168
+ {state}
2169
+ );
2170
+ });
2117
2171
  }
2118
2172
 
2119
2173
  /**
@@ -2553,6 +2607,22 @@ export default class Meeting extends StatelessWebexPlugin {
2553
2607
  requiredHints: [DISPLAY_HINTS.DISABLE_VIEW_THE_PARTICIPANT_LIST],
2554
2608
  displayHints: payload.info.userDisplayHints,
2555
2609
  }),
2610
+ canEnableRaiseHand: ControlsOptionsUtil.hasHints({
2611
+ requiredHints: [DISPLAY_HINTS.ENABLE_RAISE_HAND],
2612
+ displayHints: payload.info.userDisplayHints,
2613
+ }),
2614
+ canDisableRaiseHand: ControlsOptionsUtil.hasHints({
2615
+ requiredHints: [DISPLAY_HINTS.DISABLE_RAISE_HAND],
2616
+ displayHints: payload.info.userDisplayHints,
2617
+ }),
2618
+ canEnableVideo: ControlsOptionsUtil.hasHints({
2619
+ requiredHints: [DISPLAY_HINTS.ENABLE_VIDEO],
2620
+ displayHints: payload.info.userDisplayHints,
2621
+ }),
2622
+ canDisableVideo: ControlsOptionsUtil.hasHints({
2623
+ requiredHints: [DISPLAY_HINTS.DISABLE_VIDEO],
2624
+ displayHints: payload.info.userDisplayHints,
2625
+ }),
2556
2626
  });
2557
2627
 
2558
2628
  this.recordingController.setDisplayHints(payload.info.userDisplayHints);