@azure/communication-react 1.3.3-alpha-202209220018.0 → 1.3.3-alpha-202210070024.0

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 (119) hide show
  1. package/dist/communication-react.d.ts +258 -12
  2. package/dist/dist-cjs/communication-react/index.js +323 -113
  3. package/dist/dist-cjs/communication-react/index.js.map +1 -1
  4. package/dist/dist-esm/acs-ui-common/src/identifier.d.ts +5 -0
  5. package/dist/dist-esm/acs-ui-common/src/identifier.js +10 -0
  6. package/dist/dist-esm/acs-ui-common/src/identifier.js.map +1 -1
  7. package/dist/dist-esm/acs-ui-common/src/index.d.ts +1 -1
  8. package/dist/dist-esm/acs-ui-common/src/index.js +1 -1
  9. package/dist/dist-esm/acs-ui-common/src/index.js.map +1 -1
  10. package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js +1 -1
  11. package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js.map +1 -1
  12. package/dist/dist-esm/calling-component-bindings/src/handlers/createHandlers.d.ts +7 -8
  13. package/dist/dist-esm/calling-component-bindings/src/handlers/createHandlers.js +12 -4
  14. package/dist/dist-esm/calling-component-bindings/src/handlers/createHandlers.js.map +1 -1
  15. package/dist/dist-esm/calling-component-bindings/src/hooks/usePropsFor.d.ts +2 -1
  16. package/dist/dist-esm/calling-component-bindings/src/hooks/usePropsFor.js +7 -0
  17. package/dist/dist-esm/calling-component-bindings/src/hooks/usePropsFor.js.map +1 -1
  18. package/dist/dist-esm/calling-component-bindings/src/index.d.ts +0 -1
  19. package/dist/dist-esm/calling-component-bindings/src/index.js.map +1 -1
  20. package/dist/dist-esm/calling-stateful-client/src/CallAgentDeclarative.js +21 -1
  21. package/dist/dist-esm/calling-stateful-client/src/CallAgentDeclarative.js.map +1 -1
  22. package/dist/dist-esm/calling-stateful-client/src/CallClientState.d.ts +1 -1
  23. package/dist/dist-esm/calling-stateful-client/src/CallClientState.js.map +1 -1
  24. package/dist/dist-esm/communication-react/src/index.d.ts +4 -1
  25. package/dist/dist-esm/communication-react/src/index.js +2 -0
  26. package/dist/dist-esm/communication-react/src/index.js.map +1 -1
  27. package/dist/dist-esm/react-components/src/components/BrowserPermissionDenied.d.ts +69 -0
  28. package/dist/dist-esm/react-components/src/components/BrowserPermissionDenied.js +35 -0
  29. package/dist/dist-esm/react-components/src/components/BrowserPermissionDenied.js.map +1 -0
  30. package/dist/dist-esm/react-components/src/components/BrowserPermissionDeniedIOS.d.ts +75 -0
  31. package/dist/dist-esm/react-components/src/components/BrowserPermissionDeniedIOS.js +57 -0
  32. package/dist/dist-esm/react-components/src/components/BrowserPermissionDeniedIOS.js.map +1 -0
  33. package/dist/dist-esm/react-components/src/components/CameraButton.js +3 -3
  34. package/dist/dist-esm/react-components/src/components/CameraButton.js.map +1 -1
  35. package/dist/dist-esm/react-components/src/components/DevicePermissionDropdown.d.ts +71 -0
  36. package/dist/dist-esm/react-components/src/components/DevicePermissionDropdown.js +26 -0
  37. package/dist/dist-esm/react-components/src/components/DevicePermissionDropdown.js.map +1 -0
  38. package/dist/dist-esm/react-components/src/components/DevicesButton.js +4 -2
  39. package/dist/dist-esm/react-components/src/components/DevicesButton.js.map +1 -1
  40. package/dist/dist-esm/react-components/src/components/DomainPermissions.d.ts +8 -0
  41. package/dist/dist-esm/react-components/src/components/DomainPermissions.js +4 -3
  42. package/dist/dist-esm/react-components/src/components/DomainPermissions.js.map +1 -1
  43. package/dist/dist-esm/react-components/src/components/HighContrastAwareIcon.d.ts +4 -4
  44. package/dist/dist-esm/react-components/src/components/HighContrastAwareIcon.js +2 -2
  45. package/dist/dist-esm/react-components/src/components/HighContrastAwareIcon.js.map +1 -1
  46. package/dist/dist-esm/react-components/src/components/HoldButton.js +3 -3
  47. package/dist/dist-esm/react-components/src/components/HoldButton.js.map +1 -1
  48. package/dist/dist-esm/react-components/src/components/MessageThread.js +2 -6
  49. package/dist/dist-esm/react-components/src/components/MessageThread.js.map +1 -1
  50. package/dist/dist-esm/react-components/src/components/MicrophoneButton.js +3 -3
  51. package/dist/dist-esm/react-components/src/components/MicrophoneButton.js.map +1 -1
  52. package/dist/dist-esm/react-components/src/components/ParticipantsButton.js +2 -2
  53. package/dist/dist-esm/react-components/src/components/ParticipantsButton.js.map +1 -1
  54. package/dist/dist-esm/react-components/src/components/ScreenShareButton.js +3 -3
  55. package/dist/dist-esm/react-components/src/components/ScreenShareButton.js.map +1 -1
  56. package/dist/dist-esm/react-components/src/components/VideoGallery.js +13 -4
  57. package/dist/dist-esm/react-components/src/components/VideoGallery.js.map +1 -1
  58. package/dist/dist-esm/react-components/src/components/index.d.ts +8 -0
  59. package/dist/dist-esm/react-components/src/components/index.js +6 -0
  60. package/dist/dist-esm/react-components/src/components/index.js.map +1 -1
  61. package/dist/dist-esm/react-components/src/components/styles/BrowserPermissionDenied.styles.d.ts +58 -0
  62. package/dist/dist-esm/react-components/src/components/styles/BrowserPermissionDenied.styles.js +144 -0
  63. package/dist/dist-esm/react-components/src/components/styles/BrowserPermissionDenied.styles.js.map +1 -0
  64. package/dist/dist-esm/react-components/src/components/styles/Dialpad.styles.js +5 -1
  65. package/dist/dist-esm/react-components/src/components/styles/Dialpad.styles.js.map +1 -1
  66. package/dist/dist-esm/react-components/src/components/styles/DomainPermissions.styles.d.ts +5 -1
  67. package/dist/dist-esm/react-components/src/components/styles/DomainPermissions.styles.js +12 -1
  68. package/dist/dist-esm/react-components/src/components/styles/DomainPermissions.styles.js.map +1 -1
  69. package/dist/dist-esm/react-components/src/localization/LocalizationProvider.d.ts +6 -0
  70. package/dist/dist-esm/react-components/src/localization/LocalizationProvider.js.map +1 -1
  71. package/dist/dist-esm/react-components/src/localization/locales/en-US/strings.json +24 -2
  72. package/dist/dist-esm/react-components/src/permissions/PermissionsProvider.d.ts +5 -0
  73. package/dist/dist-esm/react-components/src/permissions/PermissionsProvider.js +15 -2
  74. package/dist/dist-esm/react-components/src/permissions/PermissionsProvider.js.map +1 -1
  75. package/dist/dist-esm/react-components/src/theming/icons.d.ts +1 -0
  76. package/dist/dist-esm/react-components/src/theming/icons.js +12 -1
  77. package/dist/dist-esm/react-components/src/theming/icons.js.map +1 -1
  78. package/dist/dist-esm/react-composites/src/composites/CallComposite/Strings.d.ts +8 -0
  79. package/dist/dist-esm/react-composites/src/composites/CallComposite/Strings.js.map +1 -1
  80. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.d.ts +3 -3
  81. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.js +10 -9
  82. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.js.map +1 -1
  83. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/CallAdapter.d.ts +15 -4
  84. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/CallAdapter.js.map +1 -1
  85. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CallControls.d.ts +2 -0
  86. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CallControls.js +27 -17
  87. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CallControls.js.map +1 -1
  88. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CallPane.js +2 -1
  89. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CallPane.js.map +1 -1
  90. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/ConfigurationpageCameraDropdown.d.ts +15 -0
  91. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/ConfigurationpageCameraDropdown.js +28 -0
  92. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/ConfigurationpageCameraDropdown.js.map +1 -0
  93. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/ConfigurationpageMicDropdown.d.ts +15 -0
  94. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/ConfigurationpageMicDropdown.js +30 -0
  95. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/ConfigurationpageMicDropdown.js.map +1 -0
  96. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/LocalDeviceSettings.js +59 -29
  97. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/LocalDeviceSettings.js.map +1 -1
  98. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/buttons/Devices.js +10 -1
  99. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/buttons/Devices.js.map +1 -1
  100. package/dist/dist-esm/react-composites/src/composites/CallComposite/hooks/useHandlers.js +4 -0
  101. package/dist/dist-esm/react-composites/src/composites/CallComposite/hooks/useHandlers.js.map +1 -1
  102. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/CallWithChatPane.js +2 -1
  103. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/CallWithChatPane.js.map +1 -1
  104. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/AzureCommunicationCallWithChatAdapter.d.ts +3 -3
  105. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/AzureCommunicationCallWithChatAdapter.js +9 -3
  106. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/AzureCommunicationCallWithChatAdapter.js.map +1 -1
  107. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatAdapter.d.ts +13 -0
  108. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatAdapter.js.map +1 -1
  109. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatBackedCallAdapter.d.ts +3 -3
  110. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatBackedCallAdapter.js +11 -2
  111. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatBackedCallAdapter.js.map +1 -1
  112. package/dist/dist-esm/react-composites/src/composites/common/AddPeopleDropdown.js +4 -4
  113. package/dist/dist-esm/react-composites/src/composites/common/AddPeopleDropdown.js.map +1 -1
  114. package/dist/dist-esm/react-composites/src/composites/common/ModalLocalAndRemotePIP.d.ts +2 -5
  115. package/dist/dist-esm/react-composites/src/composites/common/ModalLocalAndRemotePIP.js +26 -12
  116. package/dist/dist-esm/react-composites/src/composites/common/ModalLocalAndRemotePIP.js.map +1 -1
  117. package/dist/dist-esm/react-composites/src/composites/common/icons.d.ts +1 -0
  118. package/dist/dist-esm/react-composites/src/composites/localization/locales/en-US/strings.json +2 -0
  119. package/package.json +10 -10
@@ -188,11 +188,21 @@ const fromFlatCommunicationIdentifier = (id) => {
188
188
  }
189
189
  return { id };
190
190
  };
191
+ /**
192
+ * Returns a CommunicationIdentifier.
193
+ * @internal
194
+ */
195
+ const _toCommunicationIdentifier = (id) => {
196
+ if (typeof id === 'string') {
197
+ return fromFlatCommunicationIdentifier(id);
198
+ }
199
+ return id;
200
+ };
191
201
 
192
202
  // Copyright (c) Microsoft Corporation.
193
203
  // Licensed under the MIT license.
194
204
  // GENERATED FILE. DO NOT EDIT MANUALLY.
195
- var telemetryVersion = '1.3.3-alpha-202209220018.0';
205
+ var telemetryVersion = '1.3.3-alpha-202210070024.0';
196
206
 
197
207
  // Copyright (c) Microsoft Corporation.
198
208
  /**
@@ -619,7 +629,6 @@ const createDefaultCallingHandlers = memoizeOne__default['default']((callClient,
619
629
  }
620
630
  }
621
631
  });
622
- // FIXME: onStartCall API should use string, not the underlying SDK types.
623
632
  const onStartCall = (participants, options) => {
624
633
  return callAgent ? callAgent.startCall(participants, options) : undefined;
625
634
  };
@@ -748,7 +757,8 @@ const createDefaultCallingHandlers = memoizeOne__default['default']((callClient,
748
757
  yield disposeAllLocalPreviewViews(callClient);
749
758
  });
750
759
  const onRemoveParticipant = (userId) => __awaiter$v(void 0, void 0, void 0, function* () {
751
- yield (call === null || call === void 0 ? void 0 : call.removeParticipant(fromFlatCommunicationIdentifier(userId)));
760
+ const participant = _toCommunicationIdentifier(userId);
761
+ yield (call === null || call === void 0 ? void 0 : call.removeParticipant(participant));
752
762
  });
753
763
  /* @conditional-compile-remove(PSTN-calls) */
754
764
  const onAddParticipant = (participant, options) => __awaiter$v(void 0, void 0, void 0, function* () {
@@ -764,6 +774,12 @@ const createDefaultCallingHandlers = memoizeOne__default['default']((callClient,
764
774
  });
765
775
  /* @conditional-compile-remove(dialpad) */ /* @conditional-compile-remove(PSTN-calls) */
766
776
  const onSendDtmfTone = (dtmfTone) => __awaiter$v(void 0, void 0, void 0, function* () { return yield (call === null || call === void 0 ? void 0 : call.sendDtmf(dtmfTone)); });
777
+ /* @conditional-compile-remove(call-readiness) */
778
+ const askDevicePermission = (constrain) => __awaiter$v(void 0, void 0, void 0, function* () {
779
+ if (deviceManager) {
780
+ yield (deviceManager === null || deviceManager === void 0 ? void 0 : deviceManager.askDevicePermission(constrain));
781
+ }
782
+ });
767
783
  return {
768
784
  onHangUp,
769
785
  /* @conditional-compile-remove(PSTN-calls) */
@@ -785,7 +801,9 @@ const createDefaultCallingHandlers = memoizeOne__default['default']((callClient,
785
801
  onStartLocalVideo,
786
802
  onDisposeRemoteStreamView,
787
803
  onDisposeLocalStreamView,
788
- /* @conditional-compile-remove(dialpad) */ /* @conditional-compile-remove(PSTN-calls) */ onSendDtmfTone
804
+ /* @conditional-compile-remove(dialpad) */ /* @conditional-compile-remove(PSTN-calls) */ onSendDtmfTone,
805
+ /* @conditional-compile-remove(call-readiness) */
806
+ askDevicePermission
789
807
  };
790
808
  });
791
809
  /**
@@ -978,7 +996,7 @@ const typingIndicatorStringStyle = react.mergeStyles({
978
996
  wordBreak: 'break-word'
979
997
  });
980
998
 
981
- var participantItem$d={isMeText:"(you)",menuTitle:"More Options",removeButtonLabel:"Remove",sharingIconLabel:"Sharing",mutedIconLabel:"Muted",displayNamePlaceholder:"Unnamed Participant",participantStateConnecting:"Calling...",participantStateRinging:"Calling...",participantStateHold:"On hold"};var typingIndicator$d={singleUser:"{user} is typing ...",multipleUsers:"{users} are typing ...",multipleUsersAbbreviateOne:"{users} and 1 other are typing ...",multipleUsersAbbreviateMany:"{users} and {numOthers} others are typing ...",delimiter:", "};var sendBox$d={placeholderText:"Enter a message",textTooLong:"Your message length is over the maximum limit.",sendButtonAriaLabel:"Send message",fileUploadsPendingError:"Uploading... Please wait.",removeFile:"Remove file",uploading:"Uploading",uploadCompleted:"Upload completed"};var messageStatusIndicator$d={deliveredAriaLabel:"Message sent",deliveredTooltipText:"Sent",seenAriaLabel:"Message seen by others",seenTooltipText:"Seen",readByTooltipText:"Read by {messageThreadReadCount} of {remoteParticipantsCount}",sendingAriaLabel:"Message sending",sendingTooltipText:"Sending",failedToSendAriaLabel:"Message failed to send",failedToSendTooltipText:"Failed to send"};var endCallButton$d={label:"Leave",tooltipContent:"Leave call"};var cameraButton$d={onLabel:"Turn off",offLabel:"Turn on",tooltipDisabledContent:"Camera is disabled",tooltipOnContent:"Turn off camera",tooltipOffContent:"Turn on camera",tooltipVideoLoadingContent:"Video is loading",cameraMenuTitle:"Camera",cameraMenuTooltip:"Choose camera",cameraButtonSplitRoleDescription:"Split button",onSplitButtonAriaLabel:"Turn off camera and camera options",offSplitButtonAriaLabel:"Turn on camera and camera options",cameraActionTurnedOnAnnouncement:"Your camera has been turned on",cameraActionTurnedOffAnnouncement:"Your camera has been turned off"};var microphoneButton$d={onLabel:"Mute",offLabel:"Unmute",tooltipDisabledContent:"Microphone is disabled",tooltipOnContent:"Mute microphone",tooltipOffContent:"Unmute microphone",microphoneMenuTitle:"Microphone",microphoneMenuTooltip:"Choose microphone",speakerMenuTitle:"Speaker",speakerMenuTooltip:"Choose speaker",microphoneButtonSplitRoleDescription:"Split button",onSplitButtonAriaLabel:"Mute microphone and audio options",offSplitButtonAriaLabel:"Unmute microphone and audio options",microphoneActionTurnedOnAnnouncement:"Your microphone has been turned on",microphoneActionTurnedOffAnnouncement:"Your microphone has been turned off"};var devicesButton$d={label:"Devices",tooltipContent:"Manage devices",cameraMenuTitle:"Camera",cameraMenuTooltip:"Choose camera",audioDeviceMenuTitle:"Audio Device",audioDeviceMenuTooltip:"Choose audio device",microphoneMenuTitle:"Microphone",microphoneMenuTooltip:"Choose microphone",speakerMenuTitle:"Speaker",speakerMenuTooltip:"Choose speaker"};var participantsButton$d={label:"People",tooltipContent:"Show participants",menuHeader:"In this call",participantsListButtonLabel:"{numParticipants} people",muteAllButtonLabel:"Mute all",copyInviteLinkButtonLabel:"Copy invite link"};var screenShareButton$d={onLabel:"Stop presenting",offLabel:"Present",tooltipDisabledContent:"Presenting is disabled",tooltipOnContent:"Presenting your screen",tooltipOffContent:"Present your screen"};var messageThread$d={yesterday:"Yesterday",sunday:"Sunday",monday:"Monday",tuesday:"Tuesday",wednesday:"Wednesday",thursday:"Thursday",friday:"Friday",saturday:"Saturday",participantJoined:"joined the chat.",participantLeft:"left the chat.",editMessage:"Edit",removeMessage:"Delete",resendMessage:"Try sending again",failToSendTag:"Failed to send",editedTag:"Edited",liveAuthorIntro:"{author} says",messageContentAriaText:"{author} said {message}",messageContentMineAriaText:"You said {message}",editBoxTextLimit:"Your message is over the limit of {limitNumber} characters",editBoxPlaceholderText:"Edit your message",newMessagesIndicator:"New messages",noDisplayNameSub:"No name",editBoxCancelButton:"Cancel",editBoxSubmitButton:"Submit",messageReadCount:"Read by {messageReadByCount} of {remoteParticipantsCount}",actionMenuMoreOptions:"More Options",downloadFile:"Download file"};var errorBar$d={unableToReachChatService:"You are offline",accessDenied:"Unable to access chat services - please check the user credentials provided",userNotInChatThread:"You are no longer in this chat thread",sendMessageNotInChatThread:"Failed to send message because you are no longer in this chat thread",sendMessageGeneric:"Failed to send message",callingNetworkFailure:"Troubling connecting call - you seem to be offline",startVideoGeneric:"Failed to start video",stopVideoGeneric:"Failed to stop video",muteGeneric:"Failed to mute microphone",unmuteGeneric:"Failed to unmute microphone",speakingWhileMuted:"Your microphone is muted",startScreenShareGeneric:"Failed to start screen sharing",stopScreenShareGeneric:"Failed to stop screen sharing",callNetworkQualityLow:"Network quality is low.",callNoSpeakerFound:"No speakers or headphones found. Connect an audio device to hear the call.",callNoMicrophoneFound:"No microphones found. Connect an audio input device.",callMicrophoneAccessDenied:"Unable to access microphone. Click the lock in the address bar to grant permission to this webpage.",callMicrophoneMutedBySystem:"You are muted by your system.",callMicrophoneUnmutedBySystem:"Your microphone recovered and you were unmuted by your system.",callMacOsMicrophoneAccessDenied:"Unable to access microphone. Grant microphone permission in your macOS privacy settings.",callLocalVideoFreeze:"Network bandwidth is poor. Your video may appear paused for others on the call.",callCameraAccessDenied:"Unable to access camera. Click the lock in the address bar to grant permission to this webpage.",callCameraAlreadyInUse:"Unable to access camera. It may already be in use by another application.",callVideoStoppedBySystem:"Your video has been stopped by your system.",callVideoRecoveredBySystem:"Your video has resumed.",callMacOsCameraAccessDenied:"MacOS is blocking access to your camera. Update your privacy settings to allow this browser to access your camera.",callMacOsScreenShareAccessDenied:"MacOS is blocking screen sharing. Update your privacy settings to allow this browser to record your screen.",dismissButtonAriaLabel:"Close",failedToJoinCallGeneric:"Failed to join call.",failedToJoinCallInvalidMeetingLink:"Unable to join Meeting. Invalid Link."};var videoGallery$d={screenIsBeingSharedMessage:"You are sharing your screen",screenShareLoadingMessage:"Loading {participant}'s screen",localVideoLabel:"You",localVideoCameraSwitcherLabel:"Switch camera",localVideoMovementLabel:"Movable Local Video Tile",localVideoSelectedDescription:"{cameraName} selected",displayNamePlaceholder:"Unnamed Participant"};var dialpad$d={placeholderText:"Enter phone number",deleteButtonAriaLabel:"Delete"};var holdButton={onLabel:"Resume",offLabel:"Hold",tooltipOnContent:"Resume call",tooltipOffContent:"Hold call"};var videoTile={participantStateConnecting:"Calling...",participantStateRinging:"Calling...",participantStateHold:"On hold"};var DomainPermissions$1={primaryText:"Allow {appName} to use your camera and microphone",secondaryText:"This is so participants can see and hear you.",linkText:"More help"};var UnsupportedBrowser$1={primaryText:"Browser not supported",secondaryText:"Please join this call using a compatible browser.",moreHelpLink:"More help"};var en_US$1 = {participantItem:participantItem$d,typingIndicator:typingIndicator$d,sendBox:sendBox$d,messageStatusIndicator:messageStatusIndicator$d,endCallButton:endCallButton$d,cameraButton:cameraButton$d,microphoneButton:microphoneButton$d,devicesButton:devicesButton$d,participantsButton:participantsButton$d,screenShareButton:screenShareButton$d,messageThread:messageThread$d,errorBar:errorBar$d,videoGallery:videoGallery$d,dialpad:dialpad$d,holdButton:holdButton,videoTile:videoTile,DomainPermissions:DomainPermissions$1,UnsupportedBrowser:UnsupportedBrowser$1};
999
+ var participantItem$d={isMeText:"(you)",menuTitle:"More Options",removeButtonLabel:"Remove",sharingIconLabel:"Sharing",mutedIconLabel:"Muted",displayNamePlaceholder:"Unnamed Participant",participantStateConnecting:"Calling...",participantStateRinging:"Calling...",participantStateHold:"On hold"};var typingIndicator$d={singleUser:"{user} is typing ...",multipleUsers:"{users} are typing ...",multipleUsersAbbreviateOne:"{users} and 1 other are typing ...",multipleUsersAbbreviateMany:"{users} and {numOthers} others are typing ...",delimiter:", "};var sendBox$d={placeholderText:"Enter a message",textTooLong:"Your message length is over the maximum limit.",sendButtonAriaLabel:"Send message",fileUploadsPendingError:"Uploading... Please wait.",removeFile:"Remove file",uploading:"Uploading",uploadCompleted:"Upload completed"};var messageStatusIndicator$d={deliveredAriaLabel:"Message sent",deliveredTooltipText:"Sent",seenAriaLabel:"Message seen by others",seenTooltipText:"Seen",readByTooltipText:"Read by {messageThreadReadCount} of {remoteParticipantsCount}",sendingAriaLabel:"Message sending",sendingTooltipText:"Sending",failedToSendAriaLabel:"Message failed to send",failedToSendTooltipText:"Failed to send"};var endCallButton$d={label:"Leave",tooltipContent:"Leave call"};var cameraButton$d={onLabel:"Turn off",offLabel:"Turn on",tooltipDisabledContent:"Camera is disabled",tooltipOnContent:"Turn off camera",tooltipOffContent:"Turn on camera",tooltipVideoLoadingContent:"Video is loading",cameraMenuTitle:"Camera",cameraMenuTooltip:"Choose camera",cameraButtonSplitRoleDescription:"Split button",onSplitButtonAriaLabel:"Turn off camera and camera options",offSplitButtonAriaLabel:"Turn on camera and camera options",cameraActionTurnedOnAnnouncement:"Your camera has been turned on",cameraActionTurnedOffAnnouncement:"Your camera has been turned off"};var microphoneButton$d={onLabel:"Mute",offLabel:"Unmute",tooltipDisabledContent:"Microphone is disabled",tooltipOnContent:"Mute microphone",tooltipOffContent:"Unmute microphone",microphoneMenuTitle:"Microphone",microphoneMenuTooltip:"Choose microphone",speakerMenuTitle:"Speaker",speakerMenuTooltip:"Choose speaker",microphoneButtonSplitRoleDescription:"Split button",onSplitButtonAriaLabel:"Mute microphone and audio options",offSplitButtonAriaLabel:"Unmute microphone and audio options",microphoneActionTurnedOnAnnouncement:"Your microphone has been turned on",microphoneActionTurnedOffAnnouncement:"Your microphone has been turned off"};var devicesButton$d={label:"Devices",tooltipContent:"Manage devices",cameraMenuTitle:"Camera",cameraMenuTooltip:"Choose camera",audioDeviceMenuTitle:"Audio Device",audioDeviceMenuTooltip:"Choose audio device",microphoneMenuTitle:"Microphone",microphoneMenuTooltip:"Choose microphone",speakerMenuTitle:"Speaker",speakerMenuTooltip:"Choose speaker"};var participantsButton$d={label:"People",tooltipContent:"Show participants",menuHeader:"In this call",participantsListButtonLabel:"{numParticipants} people",muteAllButtonLabel:"Mute all",copyInviteLinkButtonLabel:"Copy invite link"};var screenShareButton$d={onLabel:"Stop presenting",offLabel:"Present",tooltipDisabledContent:"Presenting is disabled",tooltipOnContent:"Presenting your screen",tooltipOffContent:"Present your screen"};var messageThread$d={yesterday:"Yesterday",sunday:"Sunday",monday:"Monday",tuesday:"Tuesday",wednesday:"Wednesday",thursday:"Thursday",friday:"Friday",saturday:"Saturday",participantJoined:"joined the chat.",participantLeft:"left the chat.",editMessage:"Edit",removeMessage:"Delete",resendMessage:"Try sending again",failToSendTag:"Failed to send",editedTag:"Edited",liveAuthorIntro:"{author} says",messageContentAriaText:"{author} said {message}",messageContentMineAriaText:"You said {message}",editBoxTextLimit:"Your message is over the limit of {limitNumber} characters",editBoxPlaceholderText:"Edit your message",newMessagesIndicator:"New messages",noDisplayNameSub:"No name",editBoxCancelButton:"Cancel",editBoxSubmitButton:"Submit",messageReadCount:"Read by {messageReadByCount} of {remoteParticipantsCount}",actionMenuMoreOptions:"More Options",downloadFile:"Download file"};var errorBar$d={unableToReachChatService:"You are offline",accessDenied:"Unable to access chat services - please check the user credentials provided",userNotInChatThread:"You are no longer in this chat thread",sendMessageNotInChatThread:"Failed to send message because you are no longer in this chat thread",sendMessageGeneric:"Failed to send message",callingNetworkFailure:"Troubling connecting call - you seem to be offline",startVideoGeneric:"Failed to start video",stopVideoGeneric:"Failed to stop video",muteGeneric:"Failed to mute microphone",unmuteGeneric:"Failed to unmute microphone",speakingWhileMuted:"Your microphone is muted",startScreenShareGeneric:"Failed to start screen sharing",stopScreenShareGeneric:"Failed to stop screen sharing",callNetworkQualityLow:"Network quality is low.",callNoSpeakerFound:"No speakers or headphones found. Connect an audio device to hear the call.",callNoMicrophoneFound:"No microphones found. Connect an audio input device.",callMicrophoneAccessDenied:"Unable to access microphone. Click the lock in the address bar to grant permission to this webpage.",callMicrophoneMutedBySystem:"You are muted by your system.",callMicrophoneUnmutedBySystem:"Your microphone recovered and you were unmuted by your system.",callMacOsMicrophoneAccessDenied:"Unable to access microphone. Grant microphone permission in your macOS privacy settings.",callLocalVideoFreeze:"Network bandwidth is poor. Your video may appear paused for others on the call.",callCameraAccessDenied:"Unable to access camera. Click the lock in the address bar to grant permission to this webpage.",callCameraAlreadyInUse:"Unable to access camera. It may already be in use by another application.",callVideoStoppedBySystem:"Your video has been stopped by your system.",callVideoRecoveredBySystem:"Your video has resumed.",callMacOsCameraAccessDenied:"MacOS is blocking access to your camera. Update your privacy settings to allow this browser to access your camera.",callMacOsScreenShareAccessDenied:"MacOS is blocking screen sharing. Update your privacy settings to allow this browser to record your screen.",dismissButtonAriaLabel:"Close",failedToJoinCallGeneric:"Failed to join call.",failedToJoinCallInvalidMeetingLink:"Unable to join Meeting. Invalid Link."};var videoGallery$d={screenIsBeingSharedMessage:"You are sharing your screen",screenShareLoadingMessage:"Loading {participant}'s screen",localVideoLabel:"You",localVideoCameraSwitcherLabel:"Switch camera",localVideoMovementLabel:"Movable Local Video Tile",localVideoSelectedDescription:"{cameraName} selected",displayNamePlaceholder:"Unnamed Participant"};var dialpad$d={placeholderText:"Enter phone number",deleteButtonAriaLabel:"Delete"};var holdButton={onLabel:"Resume",offLabel:"Hold",tooltipOnContent:"Resume call",tooltipOffContent:"Hold call"};var videoTile={participantStateConnecting:"Calling...",participantStateRinging:"Calling...",participantStateHold:"On hold"};var DomainPermissions$1={primaryText:"Allow {appName} to use your camera and microphone",secondaryText:"This is so participants can see and hear you.",linkText:"Need help? Get troubleshooting help",primaryButtonText:"Allow Access"};var UnsupportedBrowser$1={primaryText:"Browser not supported",secondaryText:"Please join this call using a compatible browser.",moreHelpLink:"Need help? Get troubleshooting help"};var BrowserPermissionDenied={primaryText:"Can't use your camera or microphone",secondaryText:"Your browser might not have access to your camera or microphone. To fix this, open System Preferences.",primaryButtonText:"Try again",linkText:"Need help? Get troubleshooting help"};var BrowserPermissionDeniedIOS={primaryText:"Allow microphone access to continue",secondaryText:"So other participants can hear you.",primaryButtonText:"Try again",imageAltText:"Microphone and camera device permission location for iOS",linkText:"Need help? Get troubleshooting help",step1Text:"Go to the Settings app",step2Text:"Scroll down to settings for this browser",step3Text:"Turn on Microphone (Camera optional)",step4Text:"Try joining the call again",step1DigitText:"1",step2DigitText:"2",step3DigitText:"3",step4DigitText:"4"};var en_US$1 = {participantItem:participantItem$d,typingIndicator:typingIndicator$d,sendBox:sendBox$d,messageStatusIndicator:messageStatusIndicator$d,endCallButton:endCallButton$d,cameraButton:cameraButton$d,microphoneButton:microphoneButton$d,devicesButton:devicesButton$d,participantsButton:participantsButton$d,screenShareButton:screenShareButton$d,messageThread:messageThread$d,errorBar:errorBar$d,videoGallery:videoGallery$d,dialpad:dialpad$d,holdButton:holdButton,videoTile:videoTile,DomainPermissions:DomainPermissions$1,UnsupportedBrowser:UnsupportedBrowser$1,BrowserPermissionDenied:BrowserPermissionDenied,BrowserPermissionDeniedIOS:BrowserPermissionDeniedIOS};
982
1000
 
983
1001
  var participantItem$c={isMeText:"(you)",menuTitle:"More Options",removeButtonLabel:"Remove",sharingIconLabel:"Sharing",mutedIconLabel:"Muted",displayNamePlaceholder:"Unnamed Participant"};var typingIndicator$c={singleUser:"{user} is typing ...",multipleUsers:"{users} are typing ...",multipleUsersAbbreviateOne:"{users} and 1 other are typing ...",multipleUsersAbbreviateMany:"{users} and {numOthers} others are typing ...",delimiter:", "};var sendBox$c={placeholderText:"Enter a message",textTooLong:"Your message length is over the maximum limit.",sendButtonAriaLabel:"Send message",fileUploadsPendingError:"Uploading... Please wait."};var messageStatusIndicator$c={deliveredAriaLabel:"Message sent",deliveredTooltipText:"Sent",seenAriaLabel:"Message seen by others",seenTooltipText:"Seen",readByTooltipText:"Read by {messageThreadReadCount} of {remoteParticipantsCount}",sendingAriaLabel:"Message sending",sendingTooltipText:"Sending",failedToSendAriaLabel:"Message failed to send",failedToSendTooltipText:"Failed to send"};var endCallButton$c={label:"Leave",tooltipContent:"Leave Call"};var cameraButton$c={onLabel:"Turn off",offLabel:"Turn on",tooltipDisabledContent:"Camera is disabled",tooltipOnContent:"Turn off camera",tooltipOffContent:"Turn on camera",tooltipVideoLoadingContent:"Video is loading",cameraMenuTitle:"Camera",cameraMenuTooltip:"Choose Camera",cameraButtonSplitRoleDescription:"Split button",onSplitButtonAriaLabel:"Turn off camera and camera options",offSplitButtonAriaLabel:"Turn on camera and camera options",cameraActionTurnedOnAnnouncement:"Your camera has been turned on",cameraActionTurnedOffAnnouncement:"Your camera has been turned off"};var microphoneButton$c={onLabel:"Mute",offLabel:"Unmute",tooltipDisabledContent:"Microphone is disabled",tooltipOnContent:"Mute microphone",tooltipOffContent:"Unmute microphone",microphoneMenuTitle:"Microphone",microphoneMenuTooltip:"Choose Microphone",speakerMenuTitle:"Speaker",speakerMenuTooltip:"Choose Speaker",microphoneButtonSplitRoleDescription:"Split button",onSplitButtonAriaLabel:"Mute microphone and audio options",offSplitButtonAriaLabel:"Unmute microphone and audio options",microphoneActionTurnedOnAnnouncement:"Your microphone has been turned on",microphoneActionTurnedOffAnnouncement:"Your microphone has been turned off"};var devicesButton$c={label:"Devices",tooltipContent:"Manage devices",cameraMenuTitle:"Camera",cameraMenuTooltip:"Choose Camera",audioDeviceMenuTitle:"Audio Device",audioDeviceMenuTooltip:"Choose Audio Device",microphoneMenuTitle:"Microphone",microphoneMenuTooltip:"Choose Microphone",speakerMenuTitle:"Speaker",speakerMenuTooltip:"Choose Speaker"};var participantsButton$c={label:"People",tooltipContent:"Show Participants",menuHeader:"In this call",participantsListButtonLabel:"{numParticipants} people",muteAllButtonLabel:"Mute all",copyInviteLinkButtonLabel:"Copy invite link"};var screenShareButton$c={onLabel:"Stop presenting",offLabel:"Present",tooltipDisabledContent:"Presenting is disabled",tooltipOnContent:"Presenting your screen",tooltipOffContent:"Present your screen"};var messageThread$c={yesterday:"Yesterday",sunday:"Sunday",monday:"Monday",tuesday:"Tuesday",wednesday:"Wednesday",thursday:"Thursday",friday:"Friday",saturday:"Saturday",participantJoined:"joined the chat.",participantLeft:"left the chat.",editMessage:"Edit",removeMessage:"Delete",resendMessage:"Try sending again",failToSendTag:"Failed to send",editedTag:"Edited",liveAuthorIntro:"{author} says",editBoxTextLimit:"Your message is over the limit of {limitNumber} characters",editBoxPlaceholderText:"Edit your message",newMessagesIndicator:"New messages",noDisplayNameSub:"No name",editBoxCancelButton:"Cancel",editBoxSubmitButton:"Submit",messageReadCount:"Read by {messageReadByCount} of {remoteParticipantsCount}",actionMenuMoreOptions:"More Options"};var errorBar$c={unableToReachChatService:"You are offline",accessDenied:"Unable to access chat services - please check the user credentials provided",userNotInChatThread:"You are no longer in this chat thread",sendMessageNotInChatThread:"Failed to send message because you are no longer in this chat thread",sendMessageGeneric:"Failed to send message",callingNetworkFailure:"Troubling connecting call - you seem to be offline",startVideoGeneric:"Failed to start video",stopVideoGeneric:"Failed to stop video",muteGeneric:"Failed to mute microphone",unmuteGeneric:"Failed to unmute microphone",speakingWhileMuted:"Your microphone is muted",startScreenShareGeneric:"Failed to start screen sharing",stopScreenShareGeneric:"Failed to stop screen sharing",callNetworkQualityLow:"Network quality is low.",callNoSpeakerFound:"No speakers or headphones found. Connect an audio device to hear the call.",callNoMicrophoneFound:"No microphones found. Connect an audio input device.",callMicrophoneAccessDenied:"Unable to access microphone. Click the lock in the address bar to grant permission to this webpage.",callMicrophoneMutedBySystem:"You are muted by your system.",callMacOsMicrophoneAccessDenied:"Unable to access microphone. Grant microphone permission in your macOS privacy settings.",callLocalVideoFreeze:"Network bandwidth is poor. Your video may appear paused for others on the call.",callCameraAccessDenied:"Unable to access camera. Click the lock in the address bar to grant permission to this webpage.",callCameraAlreadyInUse:"Unable to access camera. It may already be in use by another application.",callMacOsCameraAccessDenied:"MacOS is blocking access to your camera. Update your privacy settings to allow this browser to access your camera.",callMacOsScreenShareAccessDenied:"MacOS is blocking screen sharing. Update your privacy settings to allow this browser to record your screen.",dismissButtonAriaLabel:"Close",failedToJoinCallGeneric:"Failed to join call.",failedToJoinCallInvalidMeetingLink:"Unable to join Meeting. Invalid Link."};var videoGallery$c={screenIsBeingSharedMessage:"You are sharing your screen",screenShareLoadingMessage:"Loading {participant}'s screen",localVideoLabel:"You",localVideoCameraSwitcherLabel:"Switch camera",localVideoMovementLabel:"Movable Local Video Tile",localVideoSelectedDescription:"{cameraName} selected",displayNamePlaceholder:"Unnamed Participant"};var dialpad$c={placeholderText:"Enter a number"};var HoldButton$d={onLabel:"Resume",offLabel:"Hold",toolTipOnContent:"Resume call",toolTipOffContent:"Hold call"};var en_GB$1 = {participantItem:participantItem$c,typingIndicator:typingIndicator$c,sendBox:sendBox$c,messageStatusIndicator:messageStatusIndicator$c,endCallButton:endCallButton$c,cameraButton:cameraButton$c,microphoneButton:microphoneButton$c,devicesButton:devicesButton$c,participantsButton:participantsButton$c,screenShareButton:screenShareButton$c,messageThread:messageThread$c,errorBar:errorBar$c,videoGallery:videoGallery$c,dialpad:dialpad$c,HoldButton:HoldButton$d};
984
1002
 
@@ -1976,6 +1994,13 @@ const UnsupportedBrowserWarning = () => {
1976
1994
  React__default['default'].createElement("div", { className: react.mergeStyles(scaledIconStyles(theme)) },
1977
1995
  React__default['default'].createElement(reactIcons.Warning20Filled, null))));
1978
1996
  };
1997
+ /* @conditional-compile-remove(call-readiness) */
1998
+ const BrowserPermissionDenied20Filled = () => {
1999
+ const theme = useTheme();
2000
+ return (React__default['default'].createElement(react.Stack, { horizontalAlign: 'center', styles: { root: { borderRadius: '100%', background: theme.palette.themeLighterAlt, padding: '2rem' } } },
2001
+ React__default['default'].createElement("div", { className: react.mergeStyles(scaledIconStyles(theme)) },
2002
+ React__default['default'].createElement(reactIcons.Important20Filled, null))));
2003
+ };
1979
2004
  /**
1980
2005
  * The default set of icons that are available to use in the UI components.
1981
2006
  *
@@ -2050,7 +2075,9 @@ const DEFAULT_COMPONENT_ICONS = {
2050
2075
  /* @conditional-compile-remove(call-readiness) */
2051
2076
  DomainPermissionMic: React__default['default'].createElement(DomainPermissionMic20Filled, null),
2052
2077
  /* @conditional-compile-remove(unsupported-browser) */
2053
- UnsupportedBrowserWarning: React__default['default'].createElement(UnsupportedBrowserWarning, null)
2078
+ UnsupportedBrowserWarning: React__default['default'].createElement(UnsupportedBrowserWarning, null),
2079
+ /* @conditional-compile-remove(call-readiness) */
2080
+ BrowserPermissionDeniedError: React__default['default'].createElement(BrowserPermissionDenied20Filled, null)
2054
2081
  };
2055
2082
  /* @conditional-compile-remove(unsupported-browser) */
2056
2083
  const scaledIconStyles = (theme) => {
@@ -4085,7 +4112,6 @@ const MessageThread = (props) => {
4085
4112
  // Fetch message until scrollTop reach the threshold for fetching new message
4086
4113
  while (!isAllChatMessagesLoadedRef.current && chatScrollDivRef.current.scrollTop <= 500) {
4087
4114
  isAllChatMessagesLoadedRef.current = yield onLoadPreviousChatMessages(numberOfChatMessagesToReload);
4088
- // Release CPU resources for 200 milliseconds between each loop.
4089
4115
  yield delay(200);
4090
4116
  }
4091
4117
  isLoadingChatMessagesRef.current = false;
@@ -4113,11 +4139,8 @@ const MessageThread = (props) => {
4113
4139
  if (!chatScrollDivRef.current) {
4114
4140
  return;
4115
4141
  }
4116
- if (previousTopRef.current === 0) {
4117
- const currentHeight = chatScrollDivRef.current.scrollHeight;
4118
- chatScrollDivRef.current.scrollTop =
4119
- chatScrollDivRef.current.scrollTop + currentHeight - previousHeightRef.current;
4120
- }
4142
+ chatScrollDivRef.current.scrollTop =
4143
+ chatScrollDivRef.current.scrollHeight - (previousHeightRef.current - previousTopRef.current);
4121
4144
  }, [messages]);
4122
4145
  // Fetch more messages to make the scroll bar appear, infinity scroll is then handled in the handleScroll function.
4123
4146
  React.useEffect(() => {
@@ -4568,10 +4591,20 @@ const participantStateStringTrampoline$1 = (props, strings) => {
4568
4591
  };
4569
4592
 
4570
4593
  // Copyright (c) Microsoft Corporation.
4594
+ /**
4595
+ * @internal
4596
+ */
4597
+ const defaultPermissions = {
4598
+ cameraButton: true,
4599
+ microphoneButton: true,
4600
+ screenShare: true,
4601
+ removeParticipantButton: true
4602
+ };
4571
4603
  /**
4572
4604
  * @internal
4573
4605
  */
4574
4606
  const presenterPermissions = {
4607
+ role: 'Presenter',
4575
4608
  cameraButton: true,
4576
4609
  microphoneButton: true,
4577
4610
  screenShare: true,
@@ -4581,6 +4614,7 @@ const presenterPermissions = {
4581
4614
  * @internal
4582
4615
  */
4583
4616
  const consumerPermissions = {
4617
+ role: 'Consumer',
4584
4618
  cameraButton: false,
4585
4619
  microphoneButton: false,
4586
4620
  screenShare: false,
@@ -4590,6 +4624,7 @@ const consumerPermissions = {
4590
4624
  * @internal
4591
4625
  */
4592
4626
  const attendeePermissions = {
4627
+ role: 'Attendee',
4593
4628
  cameraButton: true,
4594
4629
  microphoneButton: true,
4595
4630
  screenShare: false,
@@ -4598,7 +4633,7 @@ const attendeePermissions = {
4598
4633
  /**
4599
4634
  * @internal
4600
4635
  */
4601
- const PermissionsContext = React.createContext(presenterPermissions);
4636
+ const PermissionsContext = React.createContext(defaultPermissions);
4602
4637
  /**
4603
4638
  * @internal
4604
4639
  */
@@ -4621,9 +4656,10 @@ const _getPermissions = (role) => {
4621
4656
  else if (role === 'Attendee') {
4622
4657
  return attendeePermissions;
4623
4658
  }
4624
- else {
4659
+ else if (role === 'Presenter') {
4625
4660
  return presenterPermissions;
4626
4661
  }
4662
+ return defaultPermissions;
4627
4663
  };
4628
4664
 
4629
4665
  // Copyright (c) Microsoft Corporation.
@@ -6384,11 +6420,17 @@ const VideoGallery = (props) => {
6384
6420
  lastVisibleParticipants: visibleAudioParticipants.current,
6385
6421
  maxDominantSpeakers: MAX_AUDIO_DOMINANT_SPEAKERS
6386
6422
  });
6423
+ /* @conditional-compile-remove(rooms) */
6424
+ const permissions = _usePermissions();
6387
6425
  /**
6388
6426
  * Utility function for memoized rendering of LocalParticipant.
6389
6427
  */
6390
6428
  const localVideoTile = React.useMemo(() => {
6391
6429
  var _a, _b;
6430
+ /* @conditional-compile-remove(rooms) */
6431
+ if (!permissions.cameraButton) {
6432
+ return undefined;
6433
+ }
6392
6434
  if (onRenderLocalVideoTile) {
6393
6435
  return onRenderLocalVideoTile(localParticipant);
6394
6436
  }
@@ -6416,7 +6458,8 @@ const VideoGallery = (props) => {
6416
6458
  strings.localVideoSelectedDescription,
6417
6459
  strings.displayNamePlaceholder,
6418
6460
  styles === null || styles === void 0 ? void 0 : styles.localVideo,
6419
- theme.effects.roundedCorner4
6461
+ theme.effects.roundedCorner4,
6462
+ /* @conditional-compile-remove(rooms) */ permissions.cameraButton
6420
6463
  ]);
6421
6464
  const defaultOnRenderVideoTile = React.useCallback((participant, isVideoParticipant) => {
6422
6465
  const remoteVideoStream = participant.videoStream;
@@ -6461,7 +6504,7 @@ const VideoGallery = (props) => {
6461
6504
  }
6462
6505
  };
6463
6506
  const horizontalGalleryTiles = createHorizontalGalleryTiles();
6464
- if (!shouldFloatLocalVideo && localParticipant) {
6507
+ if (!shouldFloatLocalVideo && localVideoTile) {
6465
6508
  gridTiles.push(localVideoTile);
6466
6509
  }
6467
6510
  const localScreenShareStreamComponent = React__default['default'].createElement(LocalScreenShare, { localParticipant: localParticipant });
@@ -6471,10 +6514,10 @@ const VideoGallery = (props) => {
6471
6514
  return (React__default['default'].createElement("div", { "data-ui-id": ids.videoGallery, ref: containerRef, className: react.mergeStyles(videoGalleryOuterDivStyle, styles === null || styles === void 0 ? void 0 : styles.root) },
6472
6515
  shouldFloatLocalVideo &&
6473
6516
  !shouldFloatNonDraggableLocalVideo &&
6474
- localParticipant &&
6517
+ localVideoTile &&
6475
6518
  (horizontalGalleryPresent ? (React__default['default'].createElement(react.Stack, { className: react.mergeStyles(localVideoTileContainerStyle(theme, isNarrow)) }, localVideoTile)) : (React__default['default'].createElement(_ModalClone, { isOpen: true, isModeless: true, dragOptions: DRAG_OPTIONS$1, styles: floatingLocalVideoModalStyle(theme, isNarrow), layerProps: { hostId: layerHostId }, maxDragPosition: modalMaxDragPosition, minDragPosition: modalMinDragPosition }, localVideoTile))),
6476
6519
  // When we use showCameraSwitcherInLocalPreview it disables dragging to allow keyboard navigation.
6477
- shouldFloatNonDraggableLocalVideo && localParticipant && remoteParticipants.length > 0 && (React__default['default'].createElement(react.Stack, { className: react.mergeStyles(localVideoTileWithControlsContainerStyle(theme, isNarrow), {
6520
+ shouldFloatNonDraggableLocalVideo && localVideoTile && remoteParticipants.length > 0 && (React__default['default'].createElement(react.Stack, { className: react.mergeStyles(localVideoTileWithControlsContainerStyle(theme, isNarrow), {
6478
6521
  boxShadow: theme.effects.elevation8,
6479
6522
  zIndex: LOCAL_VIDEO_TILE_ZINDEX
6480
6523
  }) }, localVideoTile)),
@@ -6697,9 +6740,9 @@ const ControlBarButton = (props) => {
6697
6740
  /**
6698
6741
  * This is a helper component to define and unify icon colors
6699
6742
  *
6700
- * @private
6743
+ * @internal
6701
6744
  */
6702
- const HighContrastAwareIcon = (props) => {
6745
+ const _HighContrastAwareIcon = (props) => {
6703
6746
  const { iconName, disabled } = props;
6704
6747
  const theme = useTheme();
6705
6748
  // setting colors for the icons using color from theme, so in dark mode or other accessibility modes, they have pre-defined contrast colors
@@ -6843,7 +6886,9 @@ const DevicesButton = (props) => {
6843
6886
  const localeStrings = useLocale$1().strings.devicesButton;
6844
6887
  const strings = Object.assign(Object.assign({}, localeStrings), props.strings);
6845
6888
  const devicesButtonMenu = (_a = props.menuProps) !== null && _a !== void 0 ? _a : generateDefaultDeviceMenuProps(Object.assign(Object.assign({}, props), { styles: (_b = props.styles) === null || _b === void 0 ? void 0 : _b.menuStyles }), strings);
6846
- const onRenderOptionsIcon = () => (React__default['default'].createElement(HighContrastAwareIcon, { disabled: props.disabled, iconName: "ControlButtonOptions" }));
6889
+ const onRenderOptionsIcon = () => {
6890
+ return React__default['default'].createElement(_HighContrastAwareIcon, { disabled: props.disabled, iconName: "ControlButtonOptions" });
6891
+ };
6847
6892
  return (React__default['default'].createElement(ControlBarButton, Object.assign({}, props, { menuProps: devicesButtonMenu, menuIconProps: { hidden: true }, onRenderIcon: onRenderIcon !== null && onRenderIcon !== void 0 ? onRenderIcon : onRenderOptionsIcon, strings: strings, labelKey: (_c = props.labelKey) !== null && _c !== void 0 ? _c : 'devicesButtonLabel' })));
6848
6893
  };
6849
6894
 
@@ -6877,8 +6922,8 @@ const CameraButton = (props) => {
6877
6922
  const strings = Object.assign(Object.assign({}, localeStrings), props.strings);
6878
6923
  const [announcerString, setAnnouncerString] = React.useState(undefined);
6879
6924
  const disabled = props.disabled || waitForCamera;
6880
- const onRenderCameraOnIcon = () => (React__default['default'].createElement(HighContrastAwareIcon, { disabled: disabled, iconName: "ControlButtonCameraOn" }));
6881
- const onRenderCameraOffIcon = () => (React__default['default'].createElement(HighContrastAwareIcon, { disabled: disabled, iconName: "ControlButtonCameraOff" }));
6925
+ const onRenderCameraOnIcon = () => (React__default['default'].createElement(_HighContrastAwareIcon, { disabled: disabled, iconName: "ControlButtonCameraOn" }));
6926
+ const onRenderCameraOffIcon = () => (React__default['default'].createElement(_HighContrastAwareIcon, { disabled: disabled, iconName: "ControlButtonCameraOff" }));
6882
6927
  if (waitForCamera && strings.tooltipVideoLoadingContent) {
6883
6928
  strings.tooltipDisabledContent = strings.tooltipVideoLoadingContent;
6884
6929
  }
@@ -7050,10 +7095,10 @@ const MicrophoneButton = (props) => {
7050
7095
  (isSplit && !((_c = props.microphones) === null || _c === void 0 ? void 0 : _c.length) && !((_d = props.speakers) === null || _d === void 0 ? void 0 : _d.length)) ||
7051
7096
  (!isSplit && props.microphones && ((_e = props.microphones) === null || _e === void 0 ? void 0 : _e.length) === 0);
7052
7097
  const onRenderMicOnIcon = () => {
7053
- return React__default['default'].createElement(HighContrastAwareIcon, { disabled: disabled, iconName: "ControlButtonMicOn" });
7098
+ return React__default['default'].createElement(_HighContrastAwareIcon, { disabled: disabled, iconName: "ControlButtonMicOn" });
7054
7099
  };
7055
7100
  const onRenderMicOffIcon = () => {
7056
- return React__default['default'].createElement(HighContrastAwareIcon, { disabled: disabled, iconName: "ControlButtonMicOff" });
7101
+ return React__default['default'].createElement(_HighContrastAwareIcon, { disabled: disabled, iconName: "ControlButtonMicOff" });
7057
7102
  };
7058
7103
  const isMicOn = props.checked;
7059
7104
  const splitButtonAriaString = isMicOn ? strings.onSplitButtonAriaLabel : strings.offSplitButtonAriaLabel;
@@ -7135,7 +7180,7 @@ const secondaryTextStyles$2 = {
7135
7180
  root: {
7136
7181
  margin: 'auto',
7137
7182
  fontWeight: 400,
7138
- paddingBottom: '0.5rem'
7183
+ paddingBottom: _pxToRem(22)
7139
7184
  }
7140
7185
  };
7141
7186
  /**
@@ -7148,11 +7193,22 @@ const linkTextStyles$1 = {
7148
7193
  textAlign: 'inherit'
7149
7194
  }
7150
7195
  };
7196
+ /**
7197
+ * @internal
7198
+ */
7199
+ const primaryButtonStyles = {
7200
+ root: {
7201
+ paddingTop: '1.5rem',
7202
+ paddingBottom: '1.5rem',
7203
+ borderRadius: '0.5rem',
7204
+ marginBottom: _pxToRem(22)
7205
+ }
7206
+ };
7151
7207
 
7152
7208
  // Copyright (c) Microsoft Corporation.
7153
7209
  /* @conditional-compile-remove(call-readiness) */
7154
7210
  const DomainPermissionsContainer = (props) => {
7155
- const { appName, onTroubleshootingClick, strings } = props;
7211
+ const { appName, onTroubleshootingClick, onAllowAccessClick, strings } = props;
7156
7212
  const theme = react.useTheme();
7157
7213
  return (React__default['default'].createElement(react.Stack, { style: { padding: '2rem', maxWidth: '25.375rem' } },
7158
7214
  React__default['default'].createElement(react.Stack, { horizontal: true, style: { paddingBottom: '1rem' }, horizontalAlign: 'space-between' },
@@ -7165,6 +7221,7 @@ const DomainPermissionsContainer = (props) => {
7165
7221
  React__default['default'].createElement(react.Stack, { styles: textContainerStyles },
7166
7222
  React__default['default'].createElement(react.Text, { styles: primaryTextStyles }, _formatString(strings.primaryText, { appName: appName })),
7167
7223
  React__default['default'].createElement(react.Text, { styles: secondaryTextStyles$2 }, strings.secondaryText),
7224
+ onAllowAccessClick && (React__default['default'].createElement(react.PrimaryButton, { styles: primaryButtonStyles, text: strings.primaryButtonText, onClick: onAllowAccessClick })),
7168
7225
  React__default['default'].createElement(react.Link, { styles: linkTextStyles$1, onClick: onTroubleshootingClick }, strings.linkText))));
7169
7226
  };
7170
7227
  /**
@@ -7196,7 +7253,7 @@ const ParticipantsButton = (props) => {
7196
7253
  var _a, _b, _c, _d;
7197
7254
  const { callInvitationURL, styles, onMuteAll, onRenderIcon, onRenderParticipantList, participants, myUserId, excludeMe, onRenderParticipant, onRenderAvatar, onRemoveParticipant, onFetchParticipantMenuItems, showParticipantOverflowTooltip } = props;
7198
7255
  const disabled = props.disabled;
7199
- const onRenderPeopleIcon = () => (React__default['default'].createElement(HighContrastAwareIcon, { disabled: disabled, iconName: "ControlButtonParticipants" }));
7256
+ const onRenderPeopleIcon = () => (React__default['default'].createElement(_HighContrastAwareIcon, { disabled: disabled, iconName: "ControlButtonParticipants" }));
7200
7257
  const ids = useIdentifiers();
7201
7258
  const onMuteAllCallback = React.useCallback(() => {
7202
7259
  if (onMuteAll) {
@@ -7339,8 +7396,8 @@ const ScreenShareButton = (props) => {
7339
7396
  const strings = Object.assign(Object.assign({}, localeStrings), props.strings);
7340
7397
  const theme = react.useTheme();
7341
7398
  const styles = screenshareButtonStyles(theme);
7342
- const onRenderScreenShareOnIcon = () => (React__default['default'].createElement(HighContrastAwareIcon, { disabled: props.disabled, iconName: "ControlButtonScreenShareStop" }));
7343
- const onRenderScreenShareOffIcon = () => (React__default['default'].createElement(HighContrastAwareIcon, { disabled: props.disabled, iconName: "ControlButtonScreenShareStart" }));
7399
+ const onRenderScreenShareOnIcon = () => (React__default['default'].createElement(_HighContrastAwareIcon, { disabled: props.disabled, iconName: "ControlButtonScreenShareStop" }));
7400
+ const onRenderScreenShareOffIcon = () => (React__default['default'].createElement(_HighContrastAwareIcon, { disabled: props.disabled, iconName: "ControlButtonScreenShareStart" }));
7344
7401
  return (React__default['default'].createElement(ControlBarButton, Object.assign({}, props, { className: react.mergeStyles(styles, props.styles), onClick: (_a = props.onToggleScreenShare) !== null && _a !== void 0 ? _a : props.onClick, onRenderOnIcon: (_b = props.onRenderOnIcon) !== null && _b !== void 0 ? _b : onRenderScreenShareOnIcon, onRenderOffIcon: (_c = props.onRenderOffIcon) !== null && _c !== void 0 ? _c : onRenderScreenShareOffIcon, strings: strings, labelKey: (_d = props.labelKey) !== null && _d !== void 0 ? _d : 'screenShareButtonLabel', disabled: props.disabled })));
7345
7402
  };
7346
7403
  const screenshareButtonStyles = (theme) => ({
@@ -7924,7 +7981,11 @@ const iconButtonStyles = (theme) => {
7924
7981
  color: `${theme.palette.black}`
7925
7982
  },
7926
7983
  icon: {
7927
- height: 'auto'
7984
+ height: 'auto',
7985
+ // Needed to keep the icon vertically centered.
7986
+ '> span': {
7987
+ display: 'flex'
7988
+ }
7928
7989
  }
7929
7990
  };
7930
7991
  };
@@ -8200,10 +8261,10 @@ const sanitizeInput = (input) => {
8200
8261
  const HoldButton = (props) => {
8201
8262
  const { onToggleHold, strings } = props;
8202
8263
  const onRenderHoldIcon = () => {
8203
- return React__default['default'].createElement(HighContrastAwareIcon, { disabled: props.disabled, iconName: "HoldCallButton" });
8264
+ return React__default['default'].createElement(_HighContrastAwareIcon, { disabled: props.disabled, iconName: "HoldCallButton" });
8204
8265
  };
8205
8266
  const onRenderResumeIcon = () => {
8206
- return React__default['default'].createElement(HighContrastAwareIcon, { disabled: props.disabled, iconName: "ResumeCall" });
8267
+ return React__default['default'].createElement(_HighContrastAwareIcon, { disabled: props.disabled, iconName: "ResumeCall" });
8207
8268
  };
8208
8269
  return (React__default['default'].createElement(ControlBarButton, Object.assign({}, props, { strings: strings, onClick: onToggleHold !== null && onToggleHold !== void 0 ? onToggleHold : props.onClick, onRenderOnIcon: onRenderResumeIcon, onRenderOffIcon: onRenderHoldIcon })));
8209
8270
  };
@@ -8283,6 +8344,29 @@ const UnsupportedBrowser = (props) => {
8283
8344
  return React__default['default'].createElement(UnsupportedBrowserContainer, Object.assign({}, props, { strings: strings }));
8284
8345
  };
8285
8346
 
8347
+ // Copyright (c) Microsoft Corporation.
8348
+ /**
8349
+ * A dropdown to trigger device permission prompt
8350
+ *
8351
+ * @internal
8352
+ */
8353
+ const _DevicePermissionDropdown = (props) => {
8354
+ const { icon, askDevicePermission, constrain, strings, options, styles } = props;
8355
+ const onRenderPlaceholder = () => {
8356
+ return (React__default['default'].createElement(react.Stack, { horizontal: true, verticalAlign: "center" },
8357
+ icon,
8358
+ React__default['default'].createElement(react.Text, null, strings === null || strings === void 0 ? void 0 : strings.placeHolderText)));
8359
+ };
8360
+ const onRenderCaretDown = () => {
8361
+ return React__default['default'].createElement(react.Text, null, strings === null || strings === void 0 ? void 0 : strings.actionButtonContent);
8362
+ };
8363
+ return (React__default['default'].createElement(react.Dropdown, { placeholder: strings === null || strings === void 0 ? void 0 : strings.placeHolderText, label: strings === null || strings === void 0 ? void 0 : strings.label, onRenderPlaceholder: onRenderPlaceholder, onRenderCaretDown: onRenderCaretDown, onClick: () => {
8364
+ if (askDevicePermission) {
8365
+ askDevicePermission(constrain !== null && constrain !== void 0 ? constrain : { video: true, audio: true });
8366
+ }
8367
+ }, options: options !== null && options !== void 0 ? options : [], styles: styles }));
8368
+ };
8369
+
8286
8370
  // Copyright (c) Microsoft Corporation.
8287
8371
  // Licensed under the MIT license.
8288
8372
  /**
@@ -8693,6 +8777,11 @@ const findSelector$1 = (component) => {
8693
8777
  if (component === Dialpad) {
8694
8778
  return emptySelector;
8695
8779
  }
8780
+ /* @conditional-compile-remove(call-readiness) */
8781
+ // _DevicePermissionDropdown only has handlers currently and doesn't require any props from the stateful layer so return the emptySelector
8782
+ if (component === _DevicePermissionDropdown) {
8783
+ return emptySelector;
8784
+ }
8696
8785
  switch (component) {
8697
8786
  case VideoGallery:
8698
8787
  return videoGallerySelector;
@@ -11503,6 +11592,16 @@ class IncomingCallSubscriber {
11503
11592
  }
11504
11593
 
11505
11594
  // Copyright (c) Microsoft Corporation.
11595
+ // Licensed under the MIT license.
11596
+ (window && window.__awaiter) || function (thisArg, _arguments, P, generator) {
11597
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
11598
+ return new (P || (P = Promise))(function (resolve, reject) {
11599
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
11600
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
11601
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
11602
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
11603
+ });
11604
+ };
11506
11605
  /**
11507
11606
  * ProxyCallAgent proxies CallAgent and saves any returned state in the given context. It will subscribe to all state
11508
11607
  * updates in the CallAgent and in the contained Calls and RemoteParticipants. When dispose is called it will
@@ -11656,10 +11755,10 @@ class ProxyCallAgent {
11656
11755
  };
11657
11756
  }
11658
11757
  case 'dispose': {
11758
+ /* @conditional-compile-remove(calling-beta-sdk) */
11659
11759
  return () => {
11660
- return target.dispose().then(() => {
11661
- this.unsubscribe();
11662
- });
11760
+ target.dispose();
11761
+ this.unsubscribe();
11663
11762
  };
11664
11763
  }
11665
11764
  /**
@@ -13030,7 +13129,7 @@ const CallCompositeIcon = (props) => (React__default['default'].createElement(re
13030
13129
  */
13031
13130
  const CallWithChatCompositeIcon = (props) => (React__default['default'].createElement(react.FontIcon, Object.assign({}, props)));
13032
13131
 
13033
- var call$d={cameraLabel:"Camera",cameraPermissionDenied:"Your browser is blocking access to your camera",cameraTurnedOff:"Your camera is turned off",chatButtonLabel:"Chat",close:"Close",complianceBannerNowOnlyRecording:"You are now only recording this meeting.",complianceBannerNowOnlyTranscription:"You are now only transcribing this meeting.",complianceBannerRecordingAndTranscriptionSaved:"Recording and transcription are being saved.",complianceBannerRecordingAndTranscriptionStarted:"Recording and transcription have started.",complianceBannerRecordingAndTranscriptionStopped:"Recording and transcription have stopped.",complianceBannerRecordingSaving:"Recording is being saved.",complianceBannerRecordingStarted:"Recording has started.",complianceBannerRecordingStopped:"Recording has stopped.",complianceBannerTranscriptionStarted:"Transcription has started.",complianceBannerTranscriptionConsent:"By joining, you are giving consent for this meeting to be transcribed.",complianceBannerTranscriptionSaving:"Transcription is being saved.",complianceBannerTranscriptionStopped:"Transcription has stopped.",configurationPageTitle:"Start a call",copyInviteLinkButtonLabel:"Copy invite link",copyInviteLinkActionedAriaLabel:"Invite link copied",defaultPlaceHolder:"Select an option",dismissSidePaneButtonLabel:"Close",failedToJoinCallDueToNoNetworkMoreDetails:"Call was disconnected due to a network issue. Check your connection and join again.",failedToJoinCallDueToNoNetworkTitle:"Call disconnected",failedToJoinTeamsMeetingReasonAccessDeniedMoreDetails:"You were not granted entry in the call. If this was a mistake, re-join the call.",failedToJoinTeamsMeetingReasonAccessDeniedTitle:"Dismissed from lobby",learnMore:"Learn more",leftCallMoreDetails:"If this was a mistake, re-join the call.",leftCallTitle:"You left the call",lobbyScreenConnectingToCallTitle:"Joining call",lobbyScreenWaitingToBeAdmittedTitle:"Waiting to be admitted",microphonePermissionDenied:"Your browser is blocking access to your microphone",microphoneToggleInLobbyNotAllowed:"Cannot mute or unmute while in lobby.",mutedMessage:"You're muted",networkReconnectMoreDetails:"Looks like something went wrong. We're trying to get back into the call.",networkReconnectTitle:"Hold on",deniedPermissionToRoomDetails:"You do not have permission to join this room.",deniedPermissionToRoomTitle:"Permission denied to room",peopleButtonLabel:"People",peoplePaneTitle:"People",peoplePaneSubTitle:"In this call",privacyPolicy:"Privacy policy",rejoinCallButtonLabel:"Re-join call",removedFromCallMoreDetails:"Another participant removed you from the call.",removedFromCallTitle:"You were removed",removeMenuLabel:"Remove",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back",roomNotFoundDetails:"Room ID provided is not valid.",roomNotFoundTitle:"Room not found",soundLabel:"Sound",startCallButtonLabel:"Start call",openDialpadButtonLabel:"Dial phone number",peoplePaneAddPeopleButtonLabel:"Add People",dialpadStartCallButtonLabel:"Call",dialpadModalTitle:"Dial Phone Number",dialpadModalAriaLabel:"Dialpad",dialpadCloseModalButtonAriaLabel:"Close dialpad",moreButtonCallingLabel:"More",resumeCallButtonLabel:"Resume",resumingCallButtonLabel:"Resuming...",resumeCallButtonAriaLabel:"Resume call",resumingCallButtonAriaLabel:"Resume call",holdScreenLabel:"You're on hold",openDtmfDialpadLabel:"Show dialpad",dtmfDialpadPlaceHolderText:"Enter number"};var chat$d={chatListHeader:"In this chat",uploadFile:"Upload File"};var callWithChat$d={chatButtonLabel:"Chat",chatButtonNewMessageNotificationLabel:"New Message",chatButtonTooltipClosedWithMessageCount:"Show chat ({unreadMessagesCount} unread)",chatButtonTooltipClose:"Hide chat",chatButtonTooltipOpen:"Show chat",chatPaneTitle:"Chat",copyInviteLinkButtonLabel:"Copy invite link",copyInviteLinkActionedAriaLabel:"Invite link copied",dismissSidePaneButtonLabel:"Close",moreDrawerAudioDeviceMenuTitle:"Audio Device",moreDrawerButtonLabel:"More options",moreDrawerButtonTooltip:"More options",moreDrawerMicrophoneMenuTitle:"Microphone",moreDrawerSpeakerMenuTitle:"Speaker",peopleButtonLabel:"People",peopleButtonTooltipOpen:"Show participants",peopleButtonTooltipClose:"Hide participants",peoplePaneSubTitle:"In this call",peoplePaneTitle:"People",pictureInPictureTileAriaLabel:"Video Feeds. Click to return to call screen.",removeMenuLabel:"Remove",openDialpadButtonLabel:"Dial phone number",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back",peoplePaneAddPeopleButtonLabel:"Add People",dialpadStartCallButtonLabel:"Call",dialpadModalTitle:"Dial Phone Number",dialpadModalAriaLabel:"Dialpad",dialpadCloseModalButtonAriaLabel:"Close dialpad",openDtmfDialpadLabel:"Show dialpad",dtmfDialpadPlaceHolderText:"Enter number"};var en_US = {call:call$d,chat:chat$d,callWithChat:callWithChat$d};
13132
+ var call$d={cameraLabel:"Camera",cameraPermissionDenied:"Your browser is blocking access to your camera",cameraTurnedOff:"Your camera is turned off",chatButtonLabel:"Chat",close:"Close",complianceBannerNowOnlyRecording:"You are now only recording this meeting.",complianceBannerNowOnlyTranscription:"You are now only transcribing this meeting.",complianceBannerRecordingAndTranscriptionSaved:"Recording and transcription are being saved.",complianceBannerRecordingAndTranscriptionStarted:"Recording and transcription have started.",complianceBannerRecordingAndTranscriptionStopped:"Recording and transcription have stopped.",complianceBannerRecordingSaving:"Recording is being saved.",complianceBannerRecordingStarted:"Recording has started.",complianceBannerRecordingStopped:"Recording has stopped.",complianceBannerTranscriptionStarted:"Transcription has started.",complianceBannerTranscriptionConsent:"By joining, you are giving consent for this meeting to be transcribed.",complianceBannerTranscriptionSaving:"Transcription is being saved.",complianceBannerTranscriptionStopped:"Transcription has stopped.",configurationPageTitle:"Start a call",copyInviteLinkButtonLabel:"Copy invite link",copyInviteLinkActionedAriaLabel:"Invite link copied",defaultPlaceHolder:"Select an option",dismissSidePaneButtonLabel:"Close",failedToJoinCallDueToNoNetworkMoreDetails:"Call was disconnected due to a network issue. Check your connection and join again.",failedToJoinCallDueToNoNetworkTitle:"Call disconnected",failedToJoinTeamsMeetingReasonAccessDeniedMoreDetails:"You were not granted entry in the call. If this was a mistake, re-join the call.",failedToJoinTeamsMeetingReasonAccessDeniedTitle:"Dismissed from lobby",learnMore:"Learn more",leftCallMoreDetails:"If this was a mistake, re-join the call.",leftCallTitle:"You left the call",lobbyScreenConnectingToCallTitle:"Joining call",lobbyScreenWaitingToBeAdmittedTitle:"Waiting to be admitted",microphonePermissionDenied:"Your browser is blocking access to your microphone",microphoneToggleInLobbyNotAllowed:"Cannot mute or unmute while in lobby.",mutedMessage:"You're muted",networkReconnectMoreDetails:"Looks like something went wrong. We're trying to get back into the call.",networkReconnectTitle:"Hold on",deniedPermissionToRoomDetails:"You do not have permission to join this room.",deniedPermissionToRoomTitle:"Permission denied to room",peopleButtonLabel:"People",peoplePaneTitle:"People",peopleButtonTooltipOpen:"Show participants",peopleButtonTooltipClose:"Hide participants",peoplePaneSubTitle:"In this call",privacyPolicy:"Privacy policy",rejoinCallButtonLabel:"Re-join call",removedFromCallMoreDetails:"Another participant removed you from the call.",removedFromCallTitle:"You were removed",removeMenuLabel:"Remove",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back",roomNotFoundDetails:"Room ID provided is not valid.",roomNotFoundTitle:"Room not found",soundLabel:"Sound",startCallButtonLabel:"Start call",openDialpadButtonLabel:"Dial phone number",peoplePaneAddPeopleButtonLabel:"Add People",dialpadStartCallButtonLabel:"Call",dialpadModalTitle:"Dial Phone Number",dialpadModalAriaLabel:"Dialpad",dialpadCloseModalButtonAriaLabel:"Close dialpad",moreButtonCallingLabel:"More",resumeCallButtonLabel:"Resume",resumingCallButtonLabel:"Resuming...",resumeCallButtonAriaLabel:"Resume call",resumingCallButtonAriaLabel:"Resume call",holdScreenLabel:"You're on hold",openDtmfDialpadLabel:"Show dialpad",dtmfDialpadPlaceHolderText:"Enter number"};var chat$d={chatListHeader:"In this chat",uploadFile:"Upload File"};var callWithChat$d={chatButtonLabel:"Chat",chatButtonNewMessageNotificationLabel:"New Message",chatButtonTooltipClosedWithMessageCount:"Show chat ({unreadMessagesCount} unread)",chatButtonTooltipClose:"Hide chat",chatButtonTooltipOpen:"Show chat",chatPaneTitle:"Chat",copyInviteLinkButtonLabel:"Copy invite link",copyInviteLinkActionedAriaLabel:"Invite link copied",dismissSidePaneButtonLabel:"Close",moreDrawerAudioDeviceMenuTitle:"Audio Device",moreDrawerButtonLabel:"More options",moreDrawerButtonTooltip:"More options",moreDrawerMicrophoneMenuTitle:"Microphone",moreDrawerSpeakerMenuTitle:"Speaker",peopleButtonLabel:"People",peopleButtonTooltipOpen:"Show participants",peopleButtonTooltipClose:"Hide participants",peoplePaneSubTitle:"In this call",peoplePaneTitle:"People",pictureInPictureTileAriaLabel:"Video Feeds. Click to return to call screen.",removeMenuLabel:"Remove",openDialpadButtonLabel:"Dial phone number",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back",peoplePaneAddPeopleButtonLabel:"Add People",dialpadStartCallButtonLabel:"Call",dialpadModalTitle:"Dial Phone Number",dialpadModalAriaLabel:"Dialpad",dialpadCloseModalButtonAriaLabel:"Close dialpad",openDtmfDialpadLabel:"Show dialpad",dtmfDialpadPlaceHolderText:"Enter number"};var en_US = {call:call$d,chat:chat$d,callWithChat:callWithChat$d};
13034
13133
 
13035
13134
  var call$c={cameraLabel:"Camera",cameraPermissionDenied:"Your browser is blocking access to your camera",cameraTurnedOff:"Your camera is turned off",close:"Close",complianceBannerNowOnlyRecording:"You are now only recording this meeting.",complianceBannerNowOnlyTranscription:"You are now only transcribing this meeting.",complianceBannerRecordingAndTranscriptionSaved:"Recording and transcription are being saved.",complianceBannerRecordingAndTranscriptionStarted:"Recording and transcription have started.",complianceBannerRecordingAndTranscriptionStopped:"Recording and transcription have stopped.",complianceBannerRecordingSaving:"Recording is being saved.",complianceBannerRecordingStarted:"Recording has started.",complianceBannerRecordingStopped:"Recording has stopped.",complianceBannerTranscriptionStarted:"Transcription has started.",complianceBannerTranscriptionConsent:"By joining, you are giving consent for this meeting to be transcribed.",complianceBannerTranscriptionSaving:"Transcription is being saved.",complianceBannerTranscriptionStopped:"Transcription has stopped.",configurationPageTitle:"Start a call",defaultPlaceHolder:"Select an option",failedToJoinCallDueToNoNetworkMoreDetails:"Call was disconnected due to a network issue. Check your connection and join again.",failedToJoinCallDueToNoNetworkTitle:"Call disconnected",failedToJoinTeamsMeetingReasonAccessDeniedMoreDetails:"You were not granted entry in the call. If this was a mistake, re-join the call.",failedToJoinTeamsMeetingReasonAccessDeniedTitle:"Dismissed from lobby",learnMore:"Learn more",leftCallMoreDetails:"If this was a mistake, re-join the call.",leftCallTitle:"You left the call",lobbyScreenConnectingToCallTitle:"Joining call",lobbyScreenWaitingToBeAdmittedTitle:"Waiting to be admitted",microphonePermissionDenied:"Your browser is blocking access to your microphone",mutedMessage:"You're muted",networkReconnectMoreDetails:"Looks like something went wrong. We're trying to get back into the call.",networkReconnectTitle:"Hold on",privacyPolicy:"Privacy policy",rejoinCallButtonLabel:"Re-join call",removedFromCallMoreDetails:"Another participant removed you from the call.",removedFromCallTitle:"You were removed",soundLabel:"Sound",startCallButtonLabel:"Start call",microphoneToggleInLobbyNotAllowed:"Cannot mute or unmute while in lobby."};var chat$c={chatListHeader:"In this chat"};var callWithChat$c={peopleButtonLabel:"People",peopleButtonTooltipOpen:"Show participants",peopleButtonTooltipClose:"Hide participants",chatButtonLabel:"Chat",chatButtonTooltipClosedWithMessageCount:"Show chat ({unreadMessagesCount} unread)",chatButtonTooltipOpen:"Show chat",chatButtonTooltipClose:"Hide chat",moreDrawerAudioDeviceMenuTitle:"Audio Device",moreDrawerMicrophoneMenuTitle:"Microphone",moreDrawerSpeakerMenuTitle:"Speaker",moreDrawerButtonLabel:"More options",moreDrawerButtonTooltip:"More options",peoplePaneTitle:"People",peoplePaneSubTitle:"In this call",chatPaneTitle:"Chat",chatButtonNewMessageNotificationLabel:"New Message",pictureInPictureTileAriaLabel:"Video Feeds. Click to return to call screen.",removeMenuLabel:"Remove",copyInviteLinkButtonLabel:"Copy invite link",dismissSidePaneButton:"Close",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back"};var en_GB = {call:call$c,chat:chat$c,callWithChat:callWithChat$c};
13036
13135
 
@@ -14989,6 +15088,10 @@ const createCompositeHandlers = memoizeOne__default['default']((adapter) => ({
14989
15088
  }),
14990
15089
  onDisposeRemoteStreamView: (userId) => __awaiter$a(void 0, void 0, void 0, function* () {
14991
15090
  return adapter.disposeStreamView(userId);
15091
+ }),
15092
+ /* @conditional-compile-remove(call-readiness) */
15093
+ askDevicePermission: (constrain) => __awaiter$a(void 0, void 0, void 0, function* () {
15094
+ return adapter.askDevicePermission(constrain);
14992
15095
  })
14993
15096
  }));
14994
15097
 
@@ -15151,13 +15254,21 @@ const Devices = (props) => {
15151
15254
  const permissions = _usePermissions();
15152
15255
  /* @conditional-compile-remove(rooms) */
15153
15256
  const locale = useLocale();
15257
+ /* @conditional-compile-remove(rooms) */
15258
+ const onlyManageSpeakers = !permissions.microphoneButton && !permissions.cameraButton;
15259
+ /* @conditional-compile-remove(rooms) */
15260
+ const onRenderDevicesIcon = () => {
15261
+ return React__default['default'].createElement(_HighContrastAwareIcon, { disabled: props.disabled, iconName: "OptionsSpeaker" });
15262
+ };
15154
15263
  return (React__default['default'].createElement(DevicesButton
15155
15264
  /* By setting `persistMenu?` to true, we prevent options menu from getting hidden every time a participant joins or leaves. */
15156
15265
  , Object.assign({
15157
15266
  /* By setting `persistMenu?` to true, we prevent options menu from getting hidden every time a participant joins or leaves. */
15158
15267
  persistMenu: true }, devicesButtonProps, { showLabel: props.displayType !== 'compact', styles: styles, "data-ui-id": "calling-composite-devices-button", disabled: props.disabled,
15159
15268
  /* @conditional-compile-remove(rooms) */
15160
- strings: getLabelFromPermissions(permissions, locale) })));
15269
+ strings: getLabelFromPermissions(permissions, locale),
15270
+ /* @conditional-compile-remove(rooms) */
15271
+ onRenderIcon: onlyManageSpeakers ? onRenderDevicesIcon : undefined })));
15161
15272
  };
15162
15273
  /* @conditional-compile-remove(rooms) */
15163
15274
  const getLabelFromPermissions = (permissions, locale) => {
@@ -15461,9 +15572,9 @@ const CallControls = (props) => {
15461
15572
  const localeStrings = useLocale();
15462
15573
  /* @conditional-compile-remove(one-to-n-calling) */
15463
15574
  const peopleButtonStrings = React.useMemo(() => ({
15464
- label: localeStrings.strings.callWithChat.peopleButtonLabel,
15465
- tooltipOffContent: localeStrings.strings.callWithChat.peopleButtonTooltipOpen,
15466
- tooltipOnContent: localeStrings.strings.callWithChat.peopleButtonTooltipClose
15575
+ label: localeStrings.strings.call.peopleButtonLabel,
15576
+ tooltipOffContent: localeStrings.strings.call.peopleButtonTooltipOpen,
15577
+ tooltipOnContent: localeStrings.strings.call.peopleButtonTooltipClose
15467
15578
  }), [localeStrings]);
15468
15579
  /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */
15469
15580
  const moreButtonStrings = React.useMemo(() => ({
@@ -15500,19 +15611,21 @@ const CallControls = (props) => {
15500
15611
  ['data-ui-id']: 'call-composite-more-menu-people-button'
15501
15612
  });
15502
15613
  }
15503
- items.push({
15504
- key: 'holdButtonKey',
15505
- text: localeStrings.component.strings.holdButton.tooltipOffContent,
15506
- onClick: () => {
15507
- holdButtonProps.onToggleHold();
15508
- },
15509
- iconProps: { iconName: 'HoldCallContextualMenuItem', styles: { root: { lineHeight: 0 } } },
15510
- itemProps: {
15511
- styles: buttonFlyoutIncreasedSizeStyles
15512
- },
15513
- disabled: isDisabled$2(options === null || options === void 0 ? void 0 : options.holdButton),
15514
- ['data-ui-id']: 'hold-button'
15515
- });
15614
+ if (!isRoomsCallTrampoline()) {
15615
+ items.push({
15616
+ key: 'holdButtonKey',
15617
+ text: localeStrings.component.strings.holdButton.tooltipOffContent,
15618
+ onClick: () => {
15619
+ holdButtonProps.onToggleHold();
15620
+ },
15621
+ iconProps: { iconName: 'HoldCallContextualMenuItem', styles: { root: { lineHeight: 0 } } },
15622
+ itemProps: {
15623
+ styles: buttonFlyoutIncreasedSizeStyles
15624
+ },
15625
+ disabled: isDisabled$2(options === null || options === void 0 ? void 0 : options.holdButton),
15626
+ ['data-ui-id']: 'hold-button'
15627
+ });
15628
+ }
15516
15629
  /* @conditional-compile-remove(PSTN-calls) */
15517
15630
  // dtmf tone sending only works for 1:1 PSTN call
15518
15631
  if (alternateCallerId) {
@@ -15569,11 +15682,18 @@ const CallControls = (props) => {
15569
15682
  React__default['default'].createElement(People, { checked: props.peopleButtonChecked, showLabel: (options === null || options === void 0 ? void 0 : options.displayType) !== 'compact', onClick: props.onPeopleButtonClicked, "data-ui-id": "call-composite-people-button", strings: peopleButtonStrings, disabled: isDisabled$2(options === null || options === void 0 ? void 0 : options.participantsButton) })),
15570
15683
  isEnabled$2(options === null || options === void 0 ? void 0 : options.devicesButton) && (React__default['default'].createElement(Devices, { displayType: options === null || options === void 0 ? void 0 : options.displayType, increaseFlyoutItemSize: props.increaseFlyoutItemSize, disabled: isDisabled$2(options === null || options === void 0 ? void 0 : options.devicesButton) })),
15571
15684
  /* @conditional-compile-remove(one-to-n-calling) */ /* @conditional-compile-remove(PSTN-calls) */
15572
- isEnabled$2(options === null || options === void 0 ? void 0 : options.moreButton) && (React__default['default'].createElement(MoreButton, { strings: moreButtonStrings, menuIconProps: { hidden: true }, menuProps: { items: moreButtonContextualMenuItems() }, showLabel: !props.isMobile })),
15685
+ isEnabled$2(options === null || options === void 0 ? void 0 : options.moreButton) && moreButtonContextualMenuItems().length > 0 && (React__default['default'].createElement(MoreButton, { strings: moreButtonStrings, menuIconProps: { hidden: true }, menuProps: { items: moreButtonContextualMenuItems() }, showLabel: !props.isMobile })),
15573
15686
  customButtons['primary'],
15574
15687
  isEnabled$2(options === null || options === void 0 ? void 0 : options.endCallButton) && React__default['default'].createElement(EndCall, { displayType: options === null || options === void 0 ? void 0 : options.displayType })))));
15575
15688
  };
15576
15689
  const isEnabled$2 = (option) => option !== false;
15690
+ /** @private */
15691
+ const isRoomsCallTrampoline = () => {
15692
+ /* @conditional-compile-remove(rooms) */
15693
+ const rolePermissions = _usePermissions();
15694
+ /* @conditional-compile-remove(rooms) */
15695
+ return !!rolePermissions.role;
15696
+ };
15577
15697
 
15578
15698
  // Copyright (c) Microsoft Corporation.
15579
15699
  /**
@@ -15938,12 +16058,34 @@ const DRAG_OPTIONS = {
15938
16058
  menu: react.ContextualMenu,
15939
16059
  keepInBounds: true
15940
16060
  };
15941
- const _ModalLocalAndRemotePIP = (props) => {
16061
+ /**
16062
+ * A wrapping component with a draggable {@link LocalAndRemotePIP} component that is bound to a LayerHost component with id
16063
+ * specified by `modalLayerHostId` prop
16064
+ * @private
16065
+ */
16066
+ const ModalLocalAndRemotePIP = (props) => {
15942
16067
  var _a;
15943
16068
  const rootStyles = props.hidden ? hiddenStyle : PIPContainerStyle;
16069
+ /* @conditional-compile-remove(rooms) */
16070
+ const rolePermissions = _usePermissions();
15944
16071
  const pictureInPictureProps = useSelector$1(localAndRemotePIPSelector);
15945
16072
  const pictureInPictureHandlers = useHandlers();
15946
- const localAndRemotePIP = React.useMemo(() => React__default['default'].createElement(LocalAndRemotePIP, Object.assign({}, pictureInPictureProps, pictureInPictureHandlers)), [pictureInPictureProps, pictureInPictureHandlers]);
16073
+ const localAndRemotePIP = React.useMemo(() => {
16074
+ var _a;
16075
+ /* @conditional-compile-remove(rooms) */
16076
+ if (!rolePermissions.cameraButton && ((_a = pictureInPictureProps.dominantRemoteParticipant) === null || _a === void 0 ? void 0 : _a.userId)) {
16077
+ return React__default['default'].createElement(_RemoteVideoTile, Object.assign({}, pictureInPictureProps.dominantRemoteParticipant));
16078
+ }
16079
+ return React__default['default'].createElement(LocalAndRemotePIP, Object.assign({}, pictureInPictureProps, pictureInPictureHandlers));
16080
+ }, [
16081
+ pictureInPictureProps,
16082
+ pictureInPictureHandlers,
16083
+ /* @conditional-compile-remove(rooms) */ rolePermissions.cameraButton
16084
+ ]);
16085
+ /* @conditional-compile-remove(rooms) */
16086
+ if (!rolePermissions.cameraButton && !pictureInPictureProps.dominantRemoteParticipant) {
16087
+ return null;
16088
+ }
15947
16089
  const modalStylesThemed = react.concatStyleSets(modalStyle, (_a = props.styles) === null || _a === void 0 ? void 0 : _a.modal);
15948
16090
  return (React__default['default'].createElement(react.Stack, { styles: rootStyles },
15949
16091
  React__default['default'].createElement(_ModalClone, { isOpen: true, isModeless: true, dragOptions: DRAG_OPTIONS, styles: modalStylesThemed, layerProps: { hostId: props.modalLayerHostId }, minDragPosition: props.minDragPosition, maxDragPosition: props.maxDragPosition },
@@ -15951,15 +16093,6 @@ const _ModalLocalAndRemotePIP = (props) => {
15951
16093
  // possession of the dominant remote participant video stream
15952
16094
  !props.hidden && localAndRemotePIP)));
15953
16095
  };
15954
- /**
15955
- * A wrapping component with a draggable {@link LocalAndRemotePIP} component that is bound to a LayerHost component with id
15956
- * specified by `modalLayerHostId` prop
15957
- * @private
15958
- */
15959
- const ModalLocalAndRemotePIP = (props) => {
15960
- return (React__default['default'].createElement(CallAdapterProvider, { adapter: props.callAdapter },
15961
- React__default['default'].createElement(_ModalLocalAndRemotePIP, Object.assign({}, props), props.children)));
15962
- };
15963
16096
 
15964
16097
  // Copyright (c) Microsoft Corporation.
15965
16098
  /**
@@ -16259,8 +16392,8 @@ const AddPeopleDropdown = (props) => {
16259
16392
  if (mobileView) {
16260
16393
  return (React__default['default'].createElement(react.Stack, null,
16261
16394
  React__default['default'].createElement(Announcer, { ariaLive: 'assertive', announcementString: announcerStrings }),
16262
- React__default['default'].createElement(react.Stack.Item, { styles: copyLinkButtonContainerStyles },
16263
- React__default['default'].createElement(react.PrimaryButton, { onClick: setDrawerMenuItemsForAddPeople, styles: copyLinkButtonStylesThemed, onRenderIcon: () => PeoplePaneAddPersonIconTrampoline(), text: strings.peoplePaneAddPeopleButtonLabel, "data-ui-id": "call-add-people-button" })),
16395
+ defaultMenuProps.items.length > 0 && (React__default['default'].createElement(react.Stack.Item, { styles: copyLinkButtonContainerStyles },
16396
+ React__default['default'].createElement(react.PrimaryButton, { onClick: setDrawerMenuItemsForAddPeople, styles: copyLinkButtonStylesThemed, onRenderIcon: () => PeoplePaneAddPersonIconTrampoline(), text: strings.peoplePaneAddPeopleButtonLabel, "data-ui-id": "call-add-people-button" }))),
16264
16397
  addPeopleDrawerMenuItems.length > 0 && (React__default['default'].createElement(react.Stack, { styles: drawerContainerStyles, "data-ui-id": "call-add-people-dropdown" },
16265
16398
  React__default['default'].createElement(_DrawerMenu, { onLightDismiss: () => setAddPeopleDrawerMenuItems([]), items: addPeopleDrawerMenuItems }))),
16266
16399
  alternateCallerId && (React__default['default'].createElement(CallingDialpad, { isMobile: true, strings: strings, showDialpad: showDialpad, onDismissDialpad: onDismissDialpad, onAddParticipant: onAddParticipant, alternateCallerId: alternateCallerId }))));
@@ -16268,8 +16401,8 @@ const AddPeopleDropdown = (props) => {
16268
16401
  return (React__default['default'].createElement(React__default['default'].Fragment, null, React__default['default'].createElement(react.Stack, null,
16269
16402
  React__default['default'].createElement(Announcer, { ariaLive: 'assertive', announcementString: announcerStrings }),
16270
16403
  alternateCallerId && (React__default['default'].createElement(CallingDialpad, { isMobile: false, strings: strings, showDialpad: showDialpad, onDismissDialpad: onDismissDialpad, onAddParticipant: onAddParticipant, alternateCallerId: alternateCallerId })),
16271
- React__default['default'].createElement(react.Stack, { styles: copyLinkButtonStackStyles },
16272
- React__default['default'].createElement(react.DefaultButton, { onRenderIcon: () => PeoplePaneAddPersonIconTrampoline(), text: strings.peoplePaneAddPeopleButtonLabel, menuProps: defaultMenuProps, styles: copyLinkButtonStylesThemed, "data-ui-id": "call-add-people-button" })))));
16404
+ defaultMenuProps.items.length > 0 && (React__default['default'].createElement(react.Stack, { styles: copyLinkButtonStackStyles },
16405
+ React__default['default'].createElement(react.DefaultButton, { onRenderIcon: () => PeoplePaneAddPersonIconTrampoline(), text: strings.peoplePaneAddPeopleButtonLabel, menuProps: defaultMenuProps, styles: copyLinkButtonStylesThemed, "data-ui-id": "call-add-people-button" }))))));
16273
16406
  };
16274
16407
  function PeoplePaneOpenDialpadIconNameTrampoline() {
16275
16408
  /* @conditional-compile-remove(PSTN-calls) */
@@ -16587,7 +16720,8 @@ const CallPane = (props) => {
16587
16720
  onAddParticipant: addParticipantToCall, setDrawerMenuItems: setDrawerMenuItems, strings: strings,
16588
16721
  /* @conditional-compile-remove(PSTN-calls) */
16589
16722
  alternateCallerId: alternateCallerId }))))))),
16590
- props.mobileView && (React__default['default'].createElement(ModalLocalAndRemotePIP, { callAdapter: props.callAdapter, modalLayerHostId: props.modalLayerHostId, hidden: !props.activePane, styles: pipStyles, minDragPosition: minMaxDragPosition.minDragPosition, maxDragPosition: minMaxDragPosition.maxDragPosition })),
16723
+ props.mobileView && (React__default['default'].createElement(CallAdapterProvider, { adapter: props.callAdapter },
16724
+ React__default['default'].createElement(ModalLocalAndRemotePIP, { modalLayerHostId: props.modalLayerHostId, hidden: !props.activePane, styles: pipStyles, minDragPosition: minMaxDragPosition.minDragPosition, maxDragPosition: minMaxDragPosition.maxDragPosition }))),
16591
16725
  drawerMenuItems.length > 0 && (React__default['default'].createElement(react.Stack, { styles: drawerContainerStyles },
16592
16726
  React__default['default'].createElement(_DrawerMenu, { onLightDismiss: () => setDrawerMenuItems([]), items: drawerMenuItems })))));
16593
16727
  };
@@ -17067,6 +17201,44 @@ const optionIconStyles = react.mergeStyles({
17067
17201
  verticalAlign: 'text-top'
17068
17202
  });
17069
17203
 
17204
+ // Copyright (c) Microsoft Corporation.
17205
+ /**
17206
+ * @private
17207
+ */
17208
+ const ConfigurationpageCameraDropdown = (props) => {
17209
+ /* @conditional-compile-remove(call-readiness) */
17210
+ const theme = useTheme();
17211
+ /* @conditional-compile-remove(call-readiness) */
17212
+ const devicePermissionDropdownStringsCamera = {
17213
+ placeHolderText: 'Enable Camera (optional)',
17214
+ actionButtonContent: 'Allow'
17215
+ };
17216
+ /* @conditional-compile-remove(call-readiness) */
17217
+ const cameraBlockedDropdown = (React__default['default'].createElement(_DevicePermissionDropdown, Object.assign({ styles: dropDownStyles(theme), constrain: { video: true, audio: false }, strings: devicePermissionDropdownStringsCamera, icon: React__default['default'].createElement(CallCompositeIcon, { iconName: "ControlButtonCameraOn", style: { height: '1.25rem', marginRight: '0.625rem' } }) }, props.dropdownProps)));
17218
+ /* @conditional-compile-remove(call-readiness) */
17219
+ return React__default['default'].createElement(React__default['default'].Fragment, null, props.cameraPermissionGranted ? props.cameraGrantedDropdown : cameraBlockedDropdown);
17220
+ };
17221
+
17222
+ // Copyright (c) Microsoft Corporation.
17223
+ /**
17224
+ * @private
17225
+ */
17226
+ const ConfigurationpageMicDropdown = (props) => {
17227
+ /* @conditional-compile-remove(call-readiness) */
17228
+ const theme = useTheme();
17229
+ /* @conditional-compile-remove(call-readiness) */
17230
+ const devicePermissionDropdownStringsMicrophone = {
17231
+ placeHolderText: 'Enable Microphone (required)',
17232
+ actionButtonContent: 'Allow'
17233
+ };
17234
+ /* @conditional-compile-remove(call-readiness) */
17235
+ const microphoneBlockedDropdown = (React__default['default'].createElement(_DevicePermissionDropdown, Object.assign({ styles: dropDownStyles(theme), constrain: { video: false, audio: true }, strings: devicePermissionDropdownStringsMicrophone, icon: React__default['default'].createElement(CallCompositeIcon, { iconName: "ControlButtonMicOn", style: { height: '1.25rem', marginRight: '0.625rem' } }) }, props.dropdownProps)));
17236
+ /* @conditional-compile-remove(call-readiness) */
17237
+ return React__default['default'].createElement(React__default['default'].Fragment, null,
17238
+ " ",
17239
+ props.micPermissionGranted ? props.micGrantedDropdown : microphoneBlockedDropdown);
17240
+ };
17241
+
17070
17242
  // Copyright (c) Microsoft Corporation.
17071
17243
  const getDropDownList = (list) => {
17072
17244
  // Remove duplicates
@@ -17114,46 +17286,68 @@ const LocalDeviceSettings = (props) => {
17114
17286
  var _a;
17115
17287
  const theme = useTheme();
17116
17288
  const locale = useLocale();
17289
+ /* @conditional-compile-remove(call-readiness) */
17290
+ const adapter = useAdapter();
17117
17291
  const defaultPlaceHolder = locale.strings.call.defaultPlaceHolder;
17118
17292
  const cameraLabel = locale.strings.call.cameraLabel;
17119
17293
  const soundLabel = locale.strings.call.soundLabel;
17120
- let isSelectCamEnabled = props.cameraPermissionGranted;
17121
- let isSelectMicEnabled = props.microphonePermissionGranted;
17294
+ const cameraPermissionGranted = props.cameraPermissionGranted;
17295
+ const micPermissionGranted = props.microphonePermissionGranted;
17296
+ let roleCanUseCamera = true;
17297
+ let roleCanUseMic = true;
17122
17298
  /* @conditional-compile-remove(rooms) */
17123
- const permissions = _usePermissions();
17299
+ const rolePermissions = _usePermissions();
17124
17300
  /* @conditional-compile-remove(rooms) */
17125
- isSelectCamEnabled = isSelectCamEnabled && permissions.cameraButton;
17301
+ roleCanUseCamera = rolePermissions.cameraButton;
17126
17302
  /* @conditional-compile-remove(rooms) */
17127
- isSelectMicEnabled = isSelectMicEnabled && permissions.microphoneButton;
17303
+ roleCanUseMic = rolePermissions.microphoneButton;
17128
17304
  // TODO: speaker permission is tied to microphone permission (when you request 'audio' permission using the SDK) its
17129
17305
  // actually granting access to query both microphone and speaker. However the browser popup asks you explicity for
17130
17306
  // 'microphone'. This needs investigation on how we want to handle this and maybe needs follow up with SDK team.
17307
+ /* @conditional-compile-remove(call-readiness) */
17308
+ React.useEffect(() => {
17309
+ if (cameraPermissionGranted) {
17310
+ adapter.queryCameras();
17311
+ }
17312
+ if (micPermissionGranted) {
17313
+ adapter.queryMicrophones();
17314
+ }
17315
+ adapter.querySpeakers();
17316
+ }, [adapter, cameraPermissionGranted, micPermissionGranted]);
17317
+ /* @conditional-compile-remove(call-readiness) */
17318
+ const dropdownProps = usePropsFor$1(_DevicePermissionDropdown);
17319
+ const cameraGrantedDropdown = (React__default['default'].createElement(react.Dropdown, { "data-ui-id": "call-composite-local-camera-settings", "aria-labelledby": 'call-composite-local-camera-settings-label', placeholder: defaultPlaceHolder, options: cameraPermissionGranted ? getDropDownList(props.cameras) : [{ key: 'deniedOrUnknown', text: '' }], styles: dropDownStyles(theme), disabled: !cameraPermissionGranted, errorMessage: props.cameraPermissionGranted === undefined || props.cameraPermissionGranted
17320
+ ? undefined
17321
+ : locale.strings.call.cameraPermissionDenied, defaultSelectedKey: micPermissionGranted
17322
+ ? props.selectedCamera
17323
+ ? props.selectedCamera.id
17324
+ : props.cameras
17325
+ ? (_a = props.cameras[0]) === null || _a === void 0 ? void 0 : _a.id
17326
+ : ''
17327
+ : 'deniedOrUnknown', onChange: (event, option, index) => {
17328
+ props.onSelectCamera(props.cameras[index !== null && index !== void 0 ? index : 0], localVideoViewOptions);
17329
+ }, onRenderTitle: (props) => onRenderTitle('Camera', props) }));
17330
+ const micGrantedDropdown = (React__default['default'].createElement(React__default['default'].Fragment, null, roleCanUseMic && (React__default['default'].createElement(react.Dropdown, { "aria-labelledby": 'call-composite-local-sound-settings-label', placeholder: defaultPlaceHolder, styles: dropDownStyles(theme), disabled: !micPermissionGranted, errorMessage: props.microphonePermissionGranted === undefined || props.microphonePermissionGranted
17331
+ ? undefined
17332
+ : locale.strings.call.microphonePermissionDenied, options: micPermissionGranted ? getDropDownList(props.microphones) : [{ key: 'deniedOrUnknown', text: '' }], defaultSelectedKey: micPermissionGranted
17333
+ ? props.selectedMicrophone
17334
+ ? props.selectedMicrophone.id
17335
+ : defaultDeviceId(props.microphones)
17336
+ : 'deniedOrUnknown', onChange: (event, option, index) => {
17337
+ props.onSelectMicrophone(props.microphones[index !== null && index !== void 0 ? index : 0]);
17338
+ }, onRenderTitle: (props) => onRenderTitle('Microphone', props) }))));
17131
17339
  return (React__default['default'].createElement(react.Stack, { "data-ui-id": "call-composite-device-settings", tokens: mainStackTokens },
17132
- isSelectCamEnabled && (React__default['default'].createElement(react.Stack, null,
17133
- React__default['default'].createElement(react.Label, { id: 'call-composite-local-camera-settings-label', className: react.mergeStyles(dropDownStyles(theme).label), disabled: !isSelectCamEnabled }, cameraLabel),
17134
- React__default['default'].createElement(react.Dropdown, { "data-ui-id": "call-composite-local-camera-settings", "aria-labelledby": 'call-composite-local-camera-settings-label', placeholder: defaultPlaceHolder, options: isSelectCamEnabled ? getDropDownList(props.cameras) : [{ key: 'deniedOrUnknown', text: '' }], styles: dropDownStyles(theme), errorMessage: props.cameraPermissionGranted === undefined || props.cameraPermissionGranted
17135
- ? undefined
17136
- : locale.strings.call.cameraPermissionDenied, defaultSelectedKey: isSelectMicEnabled
17137
- ? props.selectedCamera
17138
- ? props.selectedCamera.id
17139
- : props.cameras
17140
- ? (_a = props.cameras[0]) === null || _a === void 0 ? void 0 : _a.id
17141
- : ''
17142
- : 'deniedOrUnknown', onChange: (event, option, index) => {
17143
- props.onSelectCamera(props.cameras[index !== null && index !== void 0 ? index : 0], localVideoViewOptions);
17144
- }, onRenderTitle: (props) => onRenderTitle('Camera', props) }))),
17340
+ roleCanUseCamera && (React__default['default'].createElement(react.Stack, null,
17341
+ React__default['default'].createElement(react.Label, { id: 'call-composite-local-camera-settings-label', className: react.mergeStyles(dropDownStyles(theme).label), disabled: !cameraPermissionGranted }, cameraLabel),
17342
+ React__default['default'].createElement(ConfigurationpageCameraDropdown, { cameraGrantedDropdown: cameraGrantedDropdown, cameraPermissionGranted: cameraPermissionGranted !== null && cameraPermissionGranted !== void 0 ? cameraPermissionGranted : false,
17343
+ /* @conditional-compile-remove(call-readiness) */
17344
+ dropdownProps: dropdownProps }))),
17145
17345
  React__default['default'].createElement(react.Stack, null,
17146
- React__default['default'].createElement(react.Label, { id: 'call-composite-local-sound-settings-label', className: react.mergeStyles(dropDownStyles(theme).label), disabled: !isSelectMicEnabled }, soundLabel),
17346
+ React__default['default'].createElement(react.Label, { id: 'call-composite-local-sound-settings-label', className: react.mergeStyles(dropDownStyles(theme).label), disabled: !micPermissionGranted }, soundLabel),
17147
17347
  React__default['default'].createElement(react.Stack, { "data-ui-id": "call-composite-sound-settings", tokens: mainStackTokens },
17148
- isSelectMicEnabled && (React__default['default'].createElement(react.Dropdown, { "aria-labelledby": 'call-composite-local-sound-settings-label', placeholder: defaultPlaceHolder, styles: dropDownStyles(theme), errorMessage: props.microphonePermissionGranted === undefined || props.microphonePermissionGranted
17149
- ? undefined
17150
- : locale.strings.call.microphonePermissionDenied, options: isSelectMicEnabled ? getDropDownList(props.microphones) : [{ key: 'deniedOrUnknown', text: '' }], defaultSelectedKey: isSelectMicEnabled
17151
- ? props.selectedMicrophone
17152
- ? props.selectedMicrophone.id
17153
- : defaultDeviceId(props.microphones)
17154
- : 'deniedOrUnknown', onChange: (event, option, index) => {
17155
- props.onSelectMicrophone(props.microphones[index !== null && index !== void 0 ? index : 0]);
17156
- }, onRenderTitle: (props) => onRenderTitle('Microphone', props) })),
17348
+ React__default['default'].createElement(ConfigurationpageMicDropdown, { micGrantedDropdown: micGrantedDropdown, micPermissionGranted: micPermissionGranted !== null && micPermissionGranted !== void 0 ? micPermissionGranted : false,
17349
+ /* @conditional-compile-remove(call-readiness) */
17350
+ dropdownProps: dropdownProps }),
17157
17351
  React__default['default'].createElement(react.Dropdown, { "aria-labelledby": 'call-composite-local-sound-settings-label', placeholder: defaultPlaceHolder, styles: dropDownStyles(theme), disabled: props.speakers.length === 0, options: getDropDownList(props.speakers), defaultSelectedKey: props.selectedSpeaker ? props.selectedSpeaker.id : defaultDeviceId(props.speakers), onChange: (event, option, index) => {
17158
17352
  props.onSelectSpeaker(props.speakers[index !== null && index !== void 0 ? index : 0]);
17159
17353
  }, onRenderTitle: (props) => onRenderTitle('Speaker', props) })))));
@@ -18071,7 +18265,7 @@ class CallContext {
18071
18265
  this.emitter.off('callEnded', handler);
18072
18266
  }
18073
18267
  updateClientState(clientState) {
18074
- var _a, _b, _c;
18268
+ var _a;
18075
18269
  const call = this.callId ? clientState.calls[this.callId] : undefined;
18076
18270
  const latestEndedCall = findLatestEndedCall(clientState.callsEnded);
18077
18271
  // As the state is transitioning to a new state, trigger appropriate callback events.
@@ -18079,13 +18273,11 @@ class CallContext {
18079
18273
  const newPage = getCallCompositePage(call, latestEndedCall);
18080
18274
  if (!IsCallEndedPage(oldPage) && IsCallEndedPage(newPage)) {
18081
18275
  this.emitter.emit('callEnded', {
18082
- callId: this.callId,
18083
- callEndedCode: (_a = latestEndedCall === null || latestEndedCall === void 0 ? void 0 : latestEndedCall.callEndReason) === null || _a === void 0 ? void 0 : _a.code,
18084
- callEndedSubCode: (_b = latestEndedCall === null || latestEndedCall === void 0 ? void 0 : latestEndedCall.callEndReason) === null || _b === void 0 ? void 0 : _b.subCode
18276
+ callId: this.callId
18085
18277
  });
18086
18278
  }
18087
18279
  if (this.state.page) {
18088
- this.setState(Object.assign(Object.assign({}, this.state), { userId: clientState.userId, displayName: (_c = clientState.callAgent) === null || _c === void 0 ? void 0 : _c.displayName, call, page: newPage, endedCall: latestEndedCall, devices: clientState.deviceManager, latestErrors: clientState.latestErrors }));
18280
+ this.setState(Object.assign(Object.assign({}, this.state), { userId: clientState.userId, displayName: (_a = clientState.callAgent) === null || _a === void 0 ? void 0 : _a.displayName, call, page: newPage, endedCall: latestEndedCall, devices: clientState.deviceManager, latestErrors: clientState.latestErrors }));
18089
18281
  }
18090
18282
  }
18091
18283
  }
@@ -18400,10 +18592,10 @@ class AzureCommunicationCallAdapter {
18400
18592
  const idsToAdd = participants.map((participant) => {
18401
18593
  // FIXME: `onStartCall` does not allow a Teams user.
18402
18594
  // Need some way to return an error if a Teams user is provided.
18403
- const backendId = fromFlatCommunicationIdentifier(participant);
18595
+ const backendId = _toCommunicationIdentifier(participant);
18404
18596
  if (communicationCommon.isPhoneNumberIdentifier(backendId)) {
18405
18597
  if ((options === null || options === void 0 ? void 0 : options.alternateCallerId) === undefined) {
18406
- throw new Error('unable to start call, PSTN user present with no alternateCallerId.');
18598
+ throw new Error('Unable to start call, PSTN user present with no alternateCallerId.');
18407
18599
  }
18408
18600
  return backendId;
18409
18601
  }
@@ -18429,7 +18621,10 @@ class AzureCommunicationCallAdapter {
18429
18621
  }
18430
18622
  removeParticipant(userId) {
18431
18623
  return __awaiter$4(this, void 0, void 0, function* () {
18432
- this.handlers.onRemoveParticipant(userId);
18624
+ let participant = userId;
18625
+ /* @conditional-compile-remove(PSTN-calls) */
18626
+ participant = _toCommunicationIdentifier(userId);
18627
+ this.handlers.onRemoveParticipant(participant);
18433
18628
  });
18434
18629
  }
18435
18630
  /* @conditional-compile-remove(PSTN-calls) */
@@ -19212,7 +19407,10 @@ class CallWithChatBackedCallAdapter {
19212
19407
  };
19213
19408
  this.leaveCall = () => __awaiter$3(this, void 0, void 0, function* () { return yield this.callWithChatAdapter.leaveCall(); });
19214
19409
  this.startCall = (participants, options) => {
19215
- return this.callWithChatAdapter.startCall(participants, options);
19410
+ let communicationParticipants = participants;
19411
+ /* @conditional-compile-remove(PSTN-calls) */
19412
+ communicationParticipants = participants.map(_toCommunicationIdentifier);
19413
+ return this.callWithChatAdapter.startCall(communicationParticipants, options);
19216
19414
  };
19217
19415
  this.setCamera = (sourceId, options) => __awaiter$3(this, void 0, void 0, function* () { return yield this.callWithChatAdapter.setCamera(sourceId, options); });
19218
19416
  this.setMicrophone = (sourceId) => __awaiter$3(this, void 0, void 0, function* () { return yield this.callWithChatAdapter.setMicrophone(sourceId); });
@@ -19227,7 +19425,12 @@ class CallWithChatBackedCallAdapter {
19227
19425
  this.unmute = () => __awaiter$3(this, void 0, void 0, function* () { return yield this.callWithChatAdapter.unmute(); });
19228
19426
  this.startScreenShare = () => __awaiter$3(this, void 0, void 0, function* () { return yield this.callWithChatAdapter.startScreenShare(); });
19229
19427
  this.stopScreenShare = () => __awaiter$3(this, void 0, void 0, function* () { return yield this.callWithChatAdapter.stopScreenShare(); });
19230
- this.removeParticipant = (userId) => __awaiter$3(this, void 0, void 0, function* () { return yield this.callWithChatAdapter.removeParticipant(userId); });
19428
+ this.removeParticipant = (userId) => __awaiter$3(this, void 0, void 0, function* () {
19429
+ let participant = userId;
19430
+ /* @conditional-compile-remove(PSTN-calls) */
19431
+ participant = _toCommunicationIdentifier(userId);
19432
+ yield this.callWithChatAdapter.removeParticipant(participant);
19433
+ });
19231
19434
  this.createStreamView = (remoteUserId, options) => __awaiter$3(this, void 0, void 0, function* () { return yield this.callWithChatAdapter.createStreamView(remoteUserId, options); });
19232
19435
  this.disposeStreamView = (remoteUserId, options) => __awaiter$3(this, void 0, void 0, function* () { return yield this.callWithChatAdapter.disposeStreamView(remoteUserId, options); });
19233
19436
  /* @conditional-compile-remove(PSTN-calls) */
@@ -19621,7 +19824,8 @@ const CallWithChatPane = (props) => {
19621
19824
  React__default['default'].createElement(react.Stack.Item, { verticalFill: true, styles: scrollableContainerContents },
19622
19825
  React__default['default'].createElement(react.Stack, { styles: props.activePane === 'chat' ? availableSpaceStyles : hiddenStyles }, chatContent),
19623
19826
  React__default['default'].createElement(react.Stack, { styles: props.activePane === 'people' ? availableSpaceStyles : hiddenStyles }, peopleContent)))),
19624
- props.mobileView && (React__default['default'].createElement(ModalLocalAndRemotePIP, { callAdapter: props.callAdapter, modalLayerHostId: props.modalLayerHostId, hidden: hidden, styles: pipStyles, minDragPosition: minMaxDragPosition.minDragPosition, maxDragPosition: minMaxDragPosition.maxDragPosition })),
19827
+ props.mobileView && (React__default['default'].createElement(CallAdapterProvider, { adapter: props.callAdapter },
19828
+ React__default['default'].createElement(ModalLocalAndRemotePIP, { modalLayerHostId: props.modalLayerHostId, hidden: hidden, styles: pipStyles, minDragPosition: minMaxDragPosition.minDragPosition, maxDragPosition: minMaxDragPosition.maxDragPosition }))),
19625
19829
  drawerMenuItems.length > 0 && (React__default['default'].createElement(react.Stack, { styles: drawerContainerStyles$1 },
19626
19830
  React__default['default'].createElement(_DrawerMenu, { onLightDismiss: () => setDrawerMenuItems([]), items: drawerMenuItems })))));
19627
19831
  };
@@ -20039,7 +20243,10 @@ class AzureCommunicationCallWithChatAdapter {
20039
20243
  }
20040
20244
  /** Start a new Call. */
20041
20245
  startCall(participants, options) {
20042
- return this.callAdapter.startCall(participants, options);
20246
+ let communicationParticipants = participants;
20247
+ /* @conditional-compile-remove(PSTN-calls) */
20248
+ communicationParticipants = participants.map(_toCommunicationIdentifier);
20249
+ return this.callAdapter.startCall(communicationParticipants, options);
20043
20250
  }
20044
20251
  /**
20045
20252
  * Subscribe to state change events.
@@ -20069,8 +20276,10 @@ class AzureCommunicationCallWithChatAdapter {
20069
20276
  /** Remove a participant from the Call only. */
20070
20277
  removeParticipant(userId) {
20071
20278
  return __awaiter(this, void 0, void 0, function* () {
20072
- // Only remove the participant from the GroupCall. Contoso must manage access to Chat.
20073
- yield this.callAdapter.removeParticipant(userId);
20279
+ let participant = userId;
20280
+ /* @conditional-compile-remove(PSTN-calls) */
20281
+ participant = _toCommunicationIdentifier(userId);
20282
+ yield this.callAdapter.removeParticipant(participant);
20074
20283
  });
20075
20284
  }
20076
20285
  setCamera(device, options) {
@@ -20638,6 +20847,7 @@ exports.TypingIndicator = TypingIndicator;
20638
20847
  exports.UnsupportedBrowser = UnsupportedBrowser;
20639
20848
  exports.VideoGallery = VideoGallery;
20640
20849
  exports.VideoTile = VideoTile;
20850
+ exports._DevicePermissionDropdown = _DevicePermissionDropdown;
20641
20851
  exports._IdentifierProvider = _IdentifierProvider;
20642
20852
  exports.createAzureCommunicationCallAdapter = createAzureCommunicationCallAdapter;
20643
20853
  exports.createAzureCommunicationCallAdapterFromClient = createAzureCommunicationCallAdapterFromClient;