@webex/plugin-meetings 3.0.0-beta.201 → 3.0.0-beta.202

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 (33) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +1 -1
  3. package/dist/constants.js +10 -4
  4. package/dist/constants.js.map +1 -1
  5. package/dist/interpretation/index.js +1 -1
  6. package/dist/interpretation/siLanguage.js +1 -1
  7. package/dist/locus-info/index.js +2 -5
  8. package/dist/locus-info/index.js.map +1 -1
  9. package/dist/locus-info/infoUtils.js +7 -1
  10. package/dist/locus-info/infoUtils.js.map +1 -1
  11. package/dist/meeting/in-meeting-actions.js +3 -1
  12. package/dist/meeting/in-meeting-actions.js.map +1 -1
  13. package/dist/meeting/index.js +214 -178
  14. package/dist/meeting/index.js.map +1 -1
  15. package/dist/recording-controller/index.js +0 -1
  16. package/dist/recording-controller/index.js.map +1 -1
  17. package/dist/types/constants.d.ts +3 -0
  18. package/dist/types/locus-info/index.d.ts +1 -1
  19. package/dist/types/meeting/in-meeting-actions.d.ts +2 -0
  20. package/dist/types/meeting/index.d.ts +9 -0
  21. package/dist/types/recording-controller/index.d.ts +0 -1
  22. package/package.json +19 -19
  23. package/src/constants.ts +7 -0
  24. package/src/locus-info/index.ts +2 -3
  25. package/src/locus-info/infoUtils.ts +10 -2
  26. package/src/meeting/in-meeting-actions.ts +4 -0
  27. package/src/meeting/index.ts +247 -224
  28. package/src/recording-controller/index.ts +0 -1
  29. package/test/unit/spec/locus-info/index.js +69 -2
  30. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  31. package/test/unit/spec/meeting/in-meeting-actions.ts +2 -0
  32. package/test/unit/spec/meeting/index.js +255 -140
  33. package/test/unit/spec/meetings/index.js +1 -1
@@ -483,6 +483,7 @@ export default class Meeting extends StatelessWebexPlugin {
483
483
  userId: string;
484
484
  video: any;
485
485
  callEvents: any[];
486
+ datachannelUrl: string;
486
487
  deferJoin: Promise<any>;
487
488
  dialInDeviceStatus: string;
488
489
  dialInUrl: string;
@@ -525,6 +526,7 @@ export default class Meeting extends StatelessWebexPlugin {
525
526
  statsAnalyzer: StatsAnalyzer;
526
527
  transcription: Transcription;
527
528
  updateMediaConnections: (mediaConnections: any[]) => void;
529
+ userDisplayHints: any;
528
530
  endCallInitJoinReq: any;
529
531
  endJoinReqResp: any;
530
532
  endLocalSDPGenRemoteSDPRecvDelay: any;
@@ -1348,6 +1350,8 @@ export default class Meeting extends StatelessWebexPlugin {
1348
1350
  EVENT_TRIGGERS.MEETING_INFO_AVAILABLE
1349
1351
  );
1350
1352
 
1353
+ this.updateMeetingActions();
1354
+
1351
1355
  return Promise.resolve();
1352
1356
  } catch (err) {
1353
1357
  if (err instanceof MeetingInfoV2PolicyError) {
@@ -2393,6 +2397,16 @@ export default class Meeting extends StatelessWebexPlugin {
2393
2397
  this.locusId = this.locusUrl?.split('/').pop();
2394
2398
  this.recordingController.setLocusUrl(this.locusUrl);
2395
2399
  this.controlsOptionsManager.setLocusUrl(this.locusUrl);
2400
+
2401
+ Trigger.trigger(
2402
+ this,
2403
+ {
2404
+ file: 'meeting/index',
2405
+ function: 'setUpLocusSelfListener',
2406
+ },
2407
+ EVENT_TRIGGERS.MEETING_LOCUS_URL_UPDATE,
2408
+ {locusUrl: payload}
2409
+ );
2396
2410
  });
2397
2411
  }
2398
2412
 
@@ -2452,230 +2466,12 @@ export default class Meeting extends StatelessWebexPlugin {
2452
2466
  );
2453
2467
  }
2454
2468
  });
2455
- this.locusInfo.on(LOCUSINFO.EVENTS.MEETING_INFO_UPDATED, (payload) => {
2456
- if (payload && payload.info) {
2457
- const changed = this.inMeetingActions.set({
2458
- canInviteNewParticipants: MeetingUtil.canInviteNewParticipants(
2459
- payload.info.userDisplayHints
2460
- ),
2461
- canAdmitParticipant: MeetingUtil.canAdmitParticipant(payload.info.userDisplayHints),
2462
- canLock: MeetingUtil.canUserLock(payload.info.userDisplayHints),
2463
- canUnlock: MeetingUtil.canUserUnlock(payload.info.userDisplayHints),
2464
- canSetDisallowUnmute: ControlsOptionsUtil.canSetDisallowUnmute(
2465
- payload.info.userDisplayHints
2466
- ),
2467
- canUnsetDisallowUnmute: ControlsOptionsUtil.canUnsetDisallowUnmute(
2468
- payload.info.userDisplayHints
2469
- ),
2470
- canSetMuteOnEntry: ControlsOptionsUtil.canSetMuteOnEntry(payload.info.userDisplayHints),
2471
- canUnsetMuteOnEntry: ControlsOptionsUtil.canUnsetMuteOnEntry(
2472
- payload.info.userDisplayHints
2473
- ),
2474
- canSetMuted: ControlsOptionsUtil.canSetMuted(payload.info.userDisplayHints),
2475
- canUnsetMuted: ControlsOptionsUtil.canUnsetMuted(payload.info.userDisplayHints),
2476
- canStartRecording: RecordingUtil.canUserStart(
2477
- payload.info.userDisplayHints,
2478
- this.selfUserPolicies
2479
- ),
2480
- canStopRecording: RecordingUtil.canUserStop(
2481
- payload.info.userDisplayHints,
2482
- this.selfUserPolicies
2483
- ),
2484
- canPauseRecording: RecordingUtil.canUserPause(
2485
- payload.info.userDisplayHints,
2486
- this.selfUserPolicies
2487
- ),
2488
- canResumeRecording: RecordingUtil.canUserResume(
2489
- payload.info.userDisplayHints,
2490
- this.selfUserPolicies
2491
- ),
2492
- canRaiseHand: MeetingUtil.canUserRaiseHand(payload.info.userDisplayHints),
2493
- canLowerAllHands: MeetingUtil.canUserLowerAllHands(payload.info.userDisplayHints),
2494
- canLowerSomeoneElsesHand: MeetingUtil.canUserLowerSomeoneElsesHand(
2495
- payload.info.userDisplayHints
2496
- ),
2497
- bothLeaveAndEndMeetingAvailable: MeetingUtil.bothLeaveAndEndMeetingAvailable(
2498
- payload.info.userDisplayHints
2499
- ),
2500
- canEnableClosedCaption: MeetingUtil.canEnableClosedCaption(payload.info.userDisplayHints),
2501
- canStartTranscribing: MeetingUtil.canStartTranscribing(payload.info.userDisplayHints),
2502
- canStopTranscribing: MeetingUtil.canStopTranscribing(payload.info.userDisplayHints),
2503
- isClosedCaptionActive: MeetingUtil.isClosedCaptionActive(payload.info.userDisplayHints),
2504
- isSaveTranscriptsEnabled: MeetingUtil.isSaveTranscriptsEnabled(
2505
- payload.info.userDisplayHints
2506
- ),
2507
- isWebexAssistantActive: MeetingUtil.isWebexAssistantActive(payload.info.userDisplayHints),
2508
- canViewCaptionPanel: MeetingUtil.canViewCaptionPanel(payload.info.userDisplayHints),
2509
- isRealTimeTranslationEnabled: MeetingUtil.isRealTimeTranslationEnabled(
2510
- payload.info.userDisplayHints
2511
- ),
2512
- canSelectSpokenLanguages: MeetingUtil.canSelectSpokenLanguages(
2513
- payload.info.userDisplayHints
2514
- ),
2515
- waitingForOthersToJoin: MeetingUtil.waitingForOthersToJoin(payload.info.userDisplayHints),
2516
- canSendReactions: MeetingUtil.canSendReactions(
2517
- this.inMeetingActions.canSendReactions,
2518
- payload.info.userDisplayHints
2519
- ),
2520
- canManageBreakout: MeetingUtil.canManageBreakout(payload.info.userDisplayHints),
2521
- canBroadcastMessageToBreakout: MeetingUtil.canBroadcastMessageToBreakout(
2522
- payload.info.userDisplayHints,
2523
- this.selfUserPolicies
2524
- ),
2525
- canAdmitLobbyToBreakout: MeetingUtil.canAdmitLobbyToBreakout(
2526
- payload.info.userDisplayHints
2527
- ),
2528
- isBreakoutPreassignmentsEnabled: MeetingUtil.isBreakoutPreassignmentsEnabled(
2529
- payload.info.userDisplayHints
2530
- ),
2531
- canUserAskForHelp: MeetingUtil.canUserAskForHelp(payload.info.userDisplayHints),
2532
- canUserRenameSelfAndObserved: MeetingUtil.canUserRenameSelfAndObserved(
2533
- payload.info.userDisplayHints
2534
- ),
2535
- canUserRenameOthers: MeetingUtil.canUserRenameOthers(payload.info.userDisplayHints),
2536
- canMuteAll: ControlsOptionsUtil.hasHints({
2537
- requiredHints: [DISPLAY_HINTS.MUTE_ALL],
2538
- displayHints: payload.info.userDisplayHints,
2539
- }),
2540
- canUnmuteAll: ControlsOptionsUtil.hasHints({
2541
- requiredHints: [DISPLAY_HINTS.UNMUTE_ALL],
2542
- displayHints: payload.info.userDisplayHints,
2543
- }),
2544
- canEnableHardMute: ControlsOptionsUtil.hasHints({
2545
- requiredHints: [DISPLAY_HINTS.ENABLE_HARD_MUTE],
2546
- displayHints: payload.info.userDisplayHints,
2547
- }),
2548
- canDisableHardMute: ControlsOptionsUtil.hasHints({
2549
- requiredHints: [DISPLAY_HINTS.DISABLE_HARD_MUTE],
2550
- displayHints: payload.info.userDisplayHints,
2551
- }),
2552
- canEnableMuteOnEntry: ControlsOptionsUtil.hasHints({
2553
- requiredHints: [DISPLAY_HINTS.ENABLE_MUTE_ON_ENTRY],
2554
- displayHints: payload.info.userDisplayHints,
2555
- }),
2556
- canDisableMuteOnEntry: ControlsOptionsUtil.hasHints({
2557
- requiredHints: [DISPLAY_HINTS.DISABLE_MUTE_ON_ENTRY],
2558
- displayHints: payload.info.userDisplayHints,
2559
- }),
2560
- canEnableReactions: ControlsOptionsUtil.hasHints({
2561
- requiredHints: [DISPLAY_HINTS.ENABLE_REACTIONS],
2562
- displayHints: payload.info.userDisplayHints,
2563
- }),
2564
- canDisableReactions: ControlsOptionsUtil.hasHints({
2565
- requiredHints: [DISPLAY_HINTS.DISABLE_REACTIONS],
2566
- displayHints: payload.info.userDisplayHints,
2567
- }),
2568
- canEnableReactionDisplayNames: ControlsOptionsUtil.hasHints({
2569
- requiredHints: [DISPLAY_HINTS.ENABLE_SHOW_DISPLAY_NAME],
2570
- displayHints: payload.info.userDisplayHints,
2571
- }),
2572
- canDisableReactionDisplayNames: ControlsOptionsUtil.hasHints({
2573
- requiredHints: [DISPLAY_HINTS.DISABLE_SHOW_DISPLAY_NAME],
2574
- displayHints: payload.info.userDisplayHints,
2575
- }),
2576
- canUpdateShareControl: ControlsOptionsUtil.hasHints({
2577
- requiredHints: [DISPLAY_HINTS.SHARE_CONTROL],
2578
- displayHints: payload.info.userDisplayHints,
2579
- }),
2580
- canEnableViewTheParticipantsList: ControlsOptionsUtil.hasHints({
2581
- requiredHints: [DISPLAY_HINTS.ENABLE_VIEW_THE_PARTICIPANT_LIST],
2582
- displayHints: payload.info.userDisplayHints,
2583
- }),
2584
- canDisableViewTheParticipantsList: ControlsOptionsUtil.hasHints({
2585
- requiredHints: [DISPLAY_HINTS.DISABLE_VIEW_THE_PARTICIPANT_LIST],
2586
- displayHints: payload.info.userDisplayHints,
2587
- }),
2588
- canEnableRaiseHand: ControlsOptionsUtil.hasHints({
2589
- requiredHints: [DISPLAY_HINTS.ENABLE_RAISE_HAND],
2590
- displayHints: payload.info.userDisplayHints,
2591
- }),
2592
- canDisableRaiseHand: ControlsOptionsUtil.hasHints({
2593
- requiredHints: [DISPLAY_HINTS.DISABLE_RAISE_HAND],
2594
- displayHints: payload.info.userDisplayHints,
2595
- }),
2596
- canEnableVideo: ControlsOptionsUtil.hasHints({
2597
- requiredHints: [DISPLAY_HINTS.ENABLE_VIDEO],
2598
- displayHints: payload.info.userDisplayHints,
2599
- }),
2600
- canDisableVideo: ControlsOptionsUtil.hasHints({
2601
- requiredHints: [DISPLAY_HINTS.DISABLE_VIDEO],
2602
- displayHints: payload.info.userDisplayHints,
2603
- }),
2604
- canShareFile:
2605
- ControlsOptionsUtil.hasHints({
2606
- requiredHints: [DISPLAY_HINTS.SHARE_FILE],
2607
- displayHints: payload.info.userDisplayHints,
2608
- }) &&
2609
- ControlsOptionsUtil.hasPolicies({
2610
- requiredPolicies: [SELF_POLICY.SUPPORT_FILE_SHARE],
2611
- policies: this.selfUserPolicies,
2612
- }),
2613
- canTransferFile: ControlsOptionsUtil.hasPolicies({
2614
- requiredPolicies: [SELF_POLICY.SUPPORT_FILE_TRANSFER],
2615
- policies: this.selfUserPolicies,
2616
- }),
2617
- canShareApplication:
2618
- (ControlsOptionsUtil.hasHints({
2619
- requiredHints: [DISPLAY_HINTS.SHARE_APPLICATION],
2620
- displayHints: payload.info.userDisplayHints,
2621
- }) &&
2622
- (ControlsOptionsUtil.hasPolicies({
2623
- requiredPolicies: [SELF_POLICY.SUPPORT_APP_SHARE],
2624
- policies: this.selfUserPolicies,
2625
- }) ||
2626
- // @ts-ignore
2627
- !this.config.experimental.enableUnifiedMeetings)) ||
2628
- this.isLocusCall(),
2629
- canShareCamera:
2630
- ControlsOptionsUtil.hasHints({
2631
- requiredHints: [DISPLAY_HINTS.SHARE_CAMERA],
2632
- displayHints: payload.info.userDisplayHints,
2633
- }) &&
2634
- ControlsOptionsUtil.hasPolicies({
2635
- requiredPolicies: [SELF_POLICY.SUPPORT_CAMERA_SHARE],
2636
- policies: this.selfUserPolicies,
2637
- }),
2638
- canShareDesktop:
2639
- (ControlsOptionsUtil.hasHints({
2640
- requiredHints: [DISPLAY_HINTS.SHARE_DESKTOP],
2641
- displayHints: payload.info.userDisplayHints,
2642
- }) &&
2643
- (ControlsOptionsUtil.hasPolicies({
2644
- requiredPolicies: [SELF_POLICY.SUPPORT_DESKTOP_SHARE],
2645
- policies: this.selfUserPolicies,
2646
- }) ||
2647
- // @ts-ignore
2648
- !this.config.experimental.enableUnifiedMeetings)) ||
2649
- this.isLocusCall(),
2650
- canShareContent:
2651
- ControlsOptionsUtil.hasHints({
2652
- requiredHints: [DISPLAY_HINTS.SHARE_CONTENT],
2653
- displayHints: payload.info.userDisplayHints,
2654
- }) || this.isLocusCall(),
2655
- canAnnotate: ControlsOptionsUtil.hasPolicies({
2656
- requiredPolicies: [SELF_POLICY.SUPPORT_ANNOTATION],
2657
- policies: this.selfUserPolicies,
2658
- }),
2659
- });
2660
-
2661
- this.recordingController.setDisplayHints(payload.info.userDisplayHints);
2662
- this.recordingController.setUserPolicy(this.selfUserPolicies);
2663
- this.controlsOptionsManager.setDisplayHints(payload.info.userDisplayHints);
2664
-
2665
- if (changed) {
2666
- Trigger.trigger(
2667
- this,
2668
- {
2669
- file: 'meeting/index',
2670
- function: 'setUpLocusInfoMeetingInfoListener',
2671
- },
2672
- EVENT_TRIGGERS.MEETING_ACTIONS_UPDATE,
2673
- this.inMeetingActions.get()
2674
- );
2675
- }
2676
-
2677
- this.handleDataChannelUrlChange(payload.info.datachannelUrl);
2678
- }
2469
+ this.locusInfo.on(LOCUSINFO.EVENTS.MEETING_INFO_UPDATED, () => {
2470
+ this.updateMeetingActions();
2471
+ this.recordingController.setDisplayHints(this.userDisplayHints);
2472
+ this.recordingController.setUserPolicy(this.selfUserPolicies);
2473
+ this.controlsOptionsManager.setDisplayHints(this.userDisplayHints);
2474
+ this.handleDataChannelUrlChange(this.datachannelUrl);
2679
2475
  });
2680
2476
  }
2681
2477
 
@@ -3234,6 +3030,233 @@ export default class Meeting extends StatelessWebexPlugin {
3234
3030
  MeetingUtil.parseInterpretationInfo(this, webexMeetingInfo);
3235
3031
  }
3236
3032
 
3033
+ /**
3034
+ * Updates the meeting actions (display hints), depends on locus display hints, user policy and app api info
3035
+ * @returns {undefined}
3036
+ * @private
3037
+ * @memberof Meeting
3038
+ */
3039
+ private updateMeetingActions() {
3040
+ let changed = false;
3041
+ changed = this.inMeetingActions.set({
3042
+ canUseVoip:
3043
+ ((this.userDisplayHints !== undefined
3044
+ ? ControlsOptionsUtil.hasHints({
3045
+ requiredHints: [DISPLAY_HINTS.VOIP_IS_ENABLED],
3046
+ displayHints: this.userDisplayHints,
3047
+ })
3048
+ : this.meetingInfo?.supportVoIP === true) &&
3049
+ ControlsOptionsUtil.hasPolicies({
3050
+ requiredPolicies: [SELF_POLICY.SUPPORT_VOIP],
3051
+ policies: this.selfUserPolicies,
3052
+ })) ||
3053
+ // @ts-ignore
3054
+ !this.config.experimental.enableUnifiedMeetings ||
3055
+ this.isLocusCall(),
3056
+ });
3057
+ if (this.userDisplayHints !== undefined) {
3058
+ changed =
3059
+ this.inMeetingActions.set({
3060
+ canInviteNewParticipants: MeetingUtil.canInviteNewParticipants(this.userDisplayHints),
3061
+ canAdmitParticipant: MeetingUtil.canAdmitParticipant(this.userDisplayHints),
3062
+ canLock: MeetingUtil.canUserLock(this.userDisplayHints),
3063
+ canUnlock: MeetingUtil.canUserUnlock(this.userDisplayHints),
3064
+ canSetDisallowUnmute: ControlsOptionsUtil.canSetDisallowUnmute(this.userDisplayHints),
3065
+ canUnsetDisallowUnmute: ControlsOptionsUtil.canUnsetDisallowUnmute(this.userDisplayHints),
3066
+ canSetMuteOnEntry: ControlsOptionsUtil.canSetMuteOnEntry(this.userDisplayHints),
3067
+ canUnsetMuteOnEntry: ControlsOptionsUtil.canUnsetMuteOnEntry(this.userDisplayHints),
3068
+ canSetMuted: ControlsOptionsUtil.canSetMuted(this.userDisplayHints),
3069
+ canUnsetMuted: ControlsOptionsUtil.canUnsetMuted(this.userDisplayHints),
3070
+ canStartRecording: RecordingUtil.canUserStart(
3071
+ this.userDisplayHints,
3072
+ this.selfUserPolicies
3073
+ ),
3074
+ canStopRecording: RecordingUtil.canUserStop(this.userDisplayHints, this.selfUserPolicies),
3075
+ canPauseRecording: RecordingUtil.canUserPause(
3076
+ this.userDisplayHints,
3077
+ this.selfUserPolicies
3078
+ ),
3079
+ canResumeRecording: RecordingUtil.canUserResume(
3080
+ this.userDisplayHints,
3081
+ this.selfUserPolicies
3082
+ ),
3083
+ canRaiseHand: MeetingUtil.canUserRaiseHand(this.userDisplayHints),
3084
+ canLowerAllHands: MeetingUtil.canUserLowerAllHands(this.userDisplayHints),
3085
+ canLowerSomeoneElsesHand: MeetingUtil.canUserLowerSomeoneElsesHand(this.userDisplayHints),
3086
+ bothLeaveAndEndMeetingAvailable: MeetingUtil.bothLeaveAndEndMeetingAvailable(
3087
+ this.userDisplayHints
3088
+ ),
3089
+ canEnableClosedCaption: MeetingUtil.canEnableClosedCaption(this.userDisplayHints),
3090
+ canStartTranscribing: MeetingUtil.canStartTranscribing(this.userDisplayHints),
3091
+ canStopTranscribing: MeetingUtil.canStopTranscribing(this.userDisplayHints),
3092
+ isClosedCaptionActive: MeetingUtil.isClosedCaptionActive(this.userDisplayHints),
3093
+ isSaveTranscriptsEnabled: MeetingUtil.isSaveTranscriptsEnabled(this.userDisplayHints),
3094
+ isWebexAssistantActive: MeetingUtil.isWebexAssistantActive(this.userDisplayHints),
3095
+ canViewCaptionPanel: MeetingUtil.canViewCaptionPanel(this.userDisplayHints),
3096
+ isRealTimeTranslationEnabled: MeetingUtil.isRealTimeTranslationEnabled(
3097
+ this.userDisplayHints
3098
+ ),
3099
+ canSelectSpokenLanguages: MeetingUtil.canSelectSpokenLanguages(this.userDisplayHints),
3100
+ waitingForOthersToJoin: MeetingUtil.waitingForOthersToJoin(this.userDisplayHints),
3101
+ canSendReactions: MeetingUtil.canSendReactions(
3102
+ this.inMeetingActions.canSendReactions,
3103
+ this.userDisplayHints
3104
+ ),
3105
+ canManageBreakout: MeetingUtil.canManageBreakout(this.userDisplayHints),
3106
+ canBroadcastMessageToBreakout: MeetingUtil.canBroadcastMessageToBreakout(
3107
+ this.userDisplayHints,
3108
+ this.selfUserPolicies
3109
+ ),
3110
+ canAdmitLobbyToBreakout: MeetingUtil.canAdmitLobbyToBreakout(this.userDisplayHints),
3111
+ isBreakoutPreassignmentsEnabled: MeetingUtil.isBreakoutPreassignmentsEnabled(
3112
+ this.userDisplayHints
3113
+ ),
3114
+ canUserAskForHelp: MeetingUtil.canUserAskForHelp(this.userDisplayHints),
3115
+ canUserRenameSelfAndObserved: MeetingUtil.canUserRenameSelfAndObserved(
3116
+ this.userDisplayHints
3117
+ ),
3118
+ canUserRenameOthers: MeetingUtil.canUserRenameOthers(this.userDisplayHints),
3119
+ canMuteAll: ControlsOptionsUtil.hasHints({
3120
+ requiredHints: [DISPLAY_HINTS.MUTE_ALL],
3121
+ displayHints: this.userDisplayHints,
3122
+ }),
3123
+ canUnmuteAll: ControlsOptionsUtil.hasHints({
3124
+ requiredHints: [DISPLAY_HINTS.UNMUTE_ALL],
3125
+ displayHints: this.userDisplayHints,
3126
+ }),
3127
+ canEnableHardMute: ControlsOptionsUtil.hasHints({
3128
+ requiredHints: [DISPLAY_HINTS.ENABLE_HARD_MUTE],
3129
+ displayHints: this.userDisplayHints,
3130
+ }),
3131
+ canDisableHardMute: ControlsOptionsUtil.hasHints({
3132
+ requiredHints: [DISPLAY_HINTS.DISABLE_HARD_MUTE],
3133
+ displayHints: this.userDisplayHints,
3134
+ }),
3135
+ canEnableMuteOnEntry: ControlsOptionsUtil.hasHints({
3136
+ requiredHints: [DISPLAY_HINTS.ENABLE_MUTE_ON_ENTRY],
3137
+ displayHints: this.userDisplayHints,
3138
+ }),
3139
+ canDisableMuteOnEntry: ControlsOptionsUtil.hasHints({
3140
+ requiredHints: [DISPLAY_HINTS.DISABLE_MUTE_ON_ENTRY],
3141
+ displayHints: this.userDisplayHints,
3142
+ }),
3143
+ canEnableReactions: ControlsOptionsUtil.hasHints({
3144
+ requiredHints: [DISPLAY_HINTS.ENABLE_REACTIONS],
3145
+ displayHints: this.userDisplayHints,
3146
+ }),
3147
+ canDisableReactions: ControlsOptionsUtil.hasHints({
3148
+ requiredHints: [DISPLAY_HINTS.DISABLE_REACTIONS],
3149
+ displayHints: this.userDisplayHints,
3150
+ }),
3151
+ canEnableReactionDisplayNames: ControlsOptionsUtil.hasHints({
3152
+ requiredHints: [DISPLAY_HINTS.ENABLE_SHOW_DISPLAY_NAME],
3153
+ displayHints: this.userDisplayHints,
3154
+ }),
3155
+ canDisableReactionDisplayNames: ControlsOptionsUtil.hasHints({
3156
+ requiredHints: [DISPLAY_HINTS.DISABLE_SHOW_DISPLAY_NAME],
3157
+ displayHints: this.userDisplayHints,
3158
+ }),
3159
+ canUpdateShareControl: ControlsOptionsUtil.hasHints({
3160
+ requiredHints: [DISPLAY_HINTS.SHARE_CONTROL],
3161
+ displayHints: this.userDisplayHints,
3162
+ }),
3163
+ canEnableViewTheParticipantsList: ControlsOptionsUtil.hasHints({
3164
+ requiredHints: [DISPLAY_HINTS.ENABLE_VIEW_THE_PARTICIPANT_LIST],
3165
+ displayHints: this.userDisplayHints,
3166
+ }),
3167
+ canDisableViewTheParticipantsList: ControlsOptionsUtil.hasHints({
3168
+ requiredHints: [DISPLAY_HINTS.DISABLE_VIEW_THE_PARTICIPANT_LIST],
3169
+ displayHints: this.userDisplayHints,
3170
+ }),
3171
+ canEnableRaiseHand: ControlsOptionsUtil.hasHints({
3172
+ requiredHints: [DISPLAY_HINTS.ENABLE_RAISE_HAND],
3173
+ displayHints: this.userDisplayHints,
3174
+ }),
3175
+ canDisableRaiseHand: ControlsOptionsUtil.hasHints({
3176
+ requiredHints: [DISPLAY_HINTS.DISABLE_RAISE_HAND],
3177
+ displayHints: this.userDisplayHints,
3178
+ }),
3179
+ canEnableVideo: ControlsOptionsUtil.hasHints({
3180
+ requiredHints: [DISPLAY_HINTS.ENABLE_VIDEO],
3181
+ displayHints: this.userDisplayHints,
3182
+ }),
3183
+ canDisableVideo: ControlsOptionsUtil.hasHints({
3184
+ requiredHints: [DISPLAY_HINTS.DISABLE_VIDEO],
3185
+ displayHints: this.userDisplayHints,
3186
+ }),
3187
+ canShareFile:
3188
+ (ControlsOptionsUtil.hasHints({
3189
+ requiredHints: [DISPLAY_HINTS.SHARE_FILE],
3190
+ displayHints: this.userDisplayHints,
3191
+ }) &&
3192
+ (ControlsOptionsUtil.hasPolicies({
3193
+ requiredPolicies: [SELF_POLICY.SUPPORT_FILE_SHARE],
3194
+ policies: this.selfUserPolicies,
3195
+ }) ||
3196
+ // @ts-ignore
3197
+ !this.config.experimental.enableUnifiedMeetings)) ||
3198
+ this.isLocusCall(),
3199
+ canTransferFile: ControlsOptionsUtil.hasPolicies({
3200
+ requiredPolicies: [SELF_POLICY.SUPPORT_FILE_TRANSFER],
3201
+ policies: this.selfUserPolicies,
3202
+ }),
3203
+ canShareApplication:
3204
+ (ControlsOptionsUtil.hasHints({
3205
+ requiredHints: [DISPLAY_HINTS.SHARE_APPLICATION],
3206
+ displayHints: this.userDisplayHints,
3207
+ }) &&
3208
+ (ControlsOptionsUtil.hasPolicies({
3209
+ requiredPolicies: [SELF_POLICY.SUPPORT_APP_SHARE],
3210
+ policies: this.selfUserPolicies,
3211
+ }) ||
3212
+ // @ts-ignore
3213
+ !this.config.experimental.enableUnifiedMeetings)) ||
3214
+ this.isLocusCall(),
3215
+ canShareCamera:
3216
+ ControlsOptionsUtil.hasHints({
3217
+ requiredHints: [DISPLAY_HINTS.SHARE_CAMERA],
3218
+ displayHints: this.userDisplayHints,
3219
+ }) &&
3220
+ ControlsOptionsUtil.hasPolicies({
3221
+ requiredPolicies: [SELF_POLICY.SUPPORT_CAMERA_SHARE],
3222
+ policies: this.selfUserPolicies,
3223
+ }),
3224
+ canShareDesktop:
3225
+ (ControlsOptionsUtil.hasHints({
3226
+ requiredHints: [DISPLAY_HINTS.SHARE_DESKTOP],
3227
+ displayHints: this.userDisplayHints,
3228
+ }) &&
3229
+ (ControlsOptionsUtil.hasPolicies({
3230
+ requiredPolicies: [SELF_POLICY.SUPPORT_DESKTOP_SHARE],
3231
+ policies: this.selfUserPolicies,
3232
+ }) ||
3233
+ // @ts-ignore
3234
+ !this.config.experimental.enableUnifiedMeetings)) ||
3235
+ this.isLocusCall(),
3236
+ canShareContent:
3237
+ ControlsOptionsUtil.hasHints({
3238
+ requiredHints: [DISPLAY_HINTS.SHARE_CONTENT],
3239
+ displayHints: this.userDisplayHints,
3240
+ }) || this.isLocusCall(),
3241
+ canAnnotate: ControlsOptionsUtil.hasPolicies({
3242
+ requiredPolicies: [SELF_POLICY.SUPPORT_ANNOTATION],
3243
+ policies: this.selfUserPolicies,
3244
+ }),
3245
+ }) || changed;
3246
+ }
3247
+ if (changed) {
3248
+ Trigger.trigger(
3249
+ this,
3250
+ {
3251
+ file: 'meeting/index',
3252
+ function: 'updateMeetingActions',
3253
+ },
3254
+ EVENT_TRIGGERS.MEETING_ACTIONS_UPDATE,
3255
+ this.inMeetingActions.get()
3256
+ );
3257
+ }
3258
+ }
3259
+
3237
3260
  /**
3238
3261
  * Sets the self user policies based on the contents of the permission token
3239
3262
  * @param {String} permissionToken
@@ -89,7 +89,6 @@ export default class RecordingController {
89
89
 
90
90
  /**
91
91
  * @param {MeetingRequest} request
92
- * @param {LocusInfo} info
93
92
  * @returns {void}
94
93
  * @private
95
94
  * @memberof RecordingController
@@ -1378,7 +1378,6 @@ describe('plugin-meetings', () => {
1378
1378
  function: 'updateMeetingInfo',
1379
1379
  },
1380
1380
  LOCUSINFO.EVENTS.MEETING_INFO_UPDATED,
1381
- {info: locusInfo.parsedLocus.info, self},
1382
1381
  ];
1383
1382
 
1384
1383
  if (expected) {
@@ -1407,7 +1406,7 @@ describe('plugin-meetings', () => {
1407
1406
  locusInfo.emitScoped.resetHistory();
1408
1407
  };
1409
1408
 
1410
- it('emits MEETING_INFO_UPDATED if the info changes', () => {
1409
+ it('emits MEETING_INFO_UPDATED and updates the meeting if the info changes', () => {
1411
1410
  const initialInfo = cloneDeep(meetingInfo);
1412
1411
 
1413
1412
  locusInfo.emitScoped = sinon.stub();
@@ -1417,6 +1416,21 @@ describe('plugin-meetings', () => {
1417
1416
 
1418
1417
  // since it was initially undefined, this should trigger the event
1419
1418
  checkMeetingInfoUpdatedCalled(true);
1419
+ assert.deepEqual(mockMeeting, {
1420
+ coHost: {
1421
+ LOWER_SOMEONE_ELSES_HAND: true,
1422
+ },
1423
+ isLocked: false,
1424
+ isUnlocked: true,
1425
+ moderator: {
1426
+ LOWER_SOMEONE_ELSES_HAND: true,
1427
+ },
1428
+ policy: {
1429
+ LOCK_STATUS_UNLOCKED: true,
1430
+ ROSTER_IN_MEETING: true,
1431
+ },
1432
+ userDisplayHints: ['ROSTER_IN_MEETING', 'LOCK_STATUS_UNLOCKED'],
1433
+ });
1420
1434
 
1421
1435
  const newInfo = cloneDeep(meetingInfo);
1422
1436
 
@@ -1426,12 +1440,44 @@ describe('plugin-meetings', () => {
1426
1440
  locusInfo.updateMeetingInfo(newInfo, self);
1427
1441
 
1428
1442
  checkMeetingInfoUpdatedCalled(true);
1443
+ assert.deepEqual(mockMeeting, {
1444
+ coHost: {
1445
+ LOWER_SOMEONE_ELSES_HAND: true,
1446
+ LOCK_CONTROL_LOCK: true,
1447
+ },
1448
+ isLocked: false,
1449
+ isUnlocked: true,
1450
+ moderator: {
1451
+ LOWER_SOMEONE_ELSES_HAND: true,
1452
+ },
1453
+ policy: {
1454
+ LOCK_STATUS_UNLOCKED: true,
1455
+ ROSTER_IN_MEETING: true,
1456
+ },
1457
+ userDisplayHints: ['ROSTER_IN_MEETING', 'LOCK_STATUS_UNLOCKED'],
1458
+ });
1429
1459
 
1430
1460
  // update it with the same info
1431
1461
  locusInfo.updateMeetingInfo(newInfo, self);
1432
1462
 
1433
1463
  // since the info is the same it should not call trigger the event
1434
1464
  checkMeetingInfoUpdatedCalled(false);
1465
+ assert.deepEqual(mockMeeting, {
1466
+ coHost: {
1467
+ LOWER_SOMEONE_ELSES_HAND: true,
1468
+ LOCK_CONTROL_LOCK: true,
1469
+ },
1470
+ isLocked: false,
1471
+ isUnlocked: true,
1472
+ moderator: {
1473
+ LOWER_SOMEONE_ELSES_HAND: true,
1474
+ },
1475
+ policy: {
1476
+ LOCK_STATUS_UNLOCKED: true,
1477
+ ROSTER_IN_MEETING: true,
1478
+ },
1479
+ userDisplayHints: ['ROSTER_IN_MEETING', 'LOCK_STATUS_UNLOCKED'],
1480
+ });
1435
1481
 
1436
1482
  // update it with the same info, but roles changed
1437
1483
  const updateSelf = cloneDeep(self);
@@ -1442,6 +1488,27 @@ describe('plugin-meetings', () => {
1442
1488
  locusInfo.updateMeetingInfo(newInfo, updateSelf);
1443
1489
  // since the info is the same but roles changed, it should call trigger the event
1444
1490
  checkMeetingInfoUpdatedCalledForRoles(true);
1491
+ assert.deepEqual(mockMeeting, {
1492
+ coHost: {
1493
+ LOWER_SOMEONE_ELSES_HAND: true,
1494
+ LOCK_CONTROL_LOCK: true,
1495
+ },
1496
+ isLocked: false,
1497
+ isUnlocked: true,
1498
+ moderator: {
1499
+ LOWER_SOMEONE_ELSES_HAND: true,
1500
+ },
1501
+ policy: {
1502
+ LOCK_STATUS_UNLOCKED: true,
1503
+ ROSTER_IN_MEETING: true,
1504
+ },
1505
+ userDisplayHints: [
1506
+ 'ROSTER_IN_MEETING',
1507
+ 'LOCK_STATUS_UNLOCKED',
1508
+ 'LOCK_CONTROL_LOCK',
1509
+ 'LOWER_SOMEONE_ELSES_HAND',
1510
+ ],
1511
+ });
1445
1512
  });
1446
1513
 
1447
1514
  it('gets roles from self if available', () => {