@azure/communication-react 1.5.1-alpha-202301220014 → 1.5.1-alpha-202301260015

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 (25) hide show
  1. package/dist/communication-react.d.ts +8 -0
  2. package/dist/dist-cjs/communication-react/index.js +149 -37
  3. package/dist/dist-cjs/communication-react/index.js.map +1 -1
  4. package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js +1 -1
  5. package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js.map +1 -1
  6. package/dist/dist-esm/calling-component-bindings/src/errorBarSelector.js +11 -3
  7. package/dist/dist-esm/calling-component-bindings/src/errorBarSelector.js.map +1 -1
  8. package/dist/dist-esm/calling-stateful-client/src/Logger.d.ts +2 -0
  9. package/dist/dist-esm/calling-stateful-client/src/Logger.js +2 -0
  10. package/dist/dist-esm/calling-stateful-client/src/Logger.js.map +1 -1
  11. package/dist/dist-esm/calling-stateful-client/src/StreamUtils.js +54 -15
  12. package/dist/dist-esm/calling-stateful-client/src/StreamUtils.js.map +1 -1
  13. package/dist/dist-esm/react-components/src/components/RemoteVideoTile.d.ts +1 -0
  14. package/dist/dist-esm/react-components/src/components/RemoteVideoTile.js +3 -2
  15. package/dist/dist-esm/react-components/src/components/RemoteVideoTile.js.map +1 -1
  16. package/dist/dist-esm/react-components/src/components/VideoGallery/useVideoTileContextualMenuProps.d.ts +5 -0
  17. package/dist/dist-esm/react-components/src/components/VideoGallery/useVideoTileContextualMenuProps.js +34 -9
  18. package/dist/dist-esm/react-components/src/components/VideoGallery/useVideoTileContextualMenuProps.js.map +1 -1
  19. package/dist/dist-esm/react-components/src/components/VideoGallery.d.ts +8 -0
  20. package/dist/dist-esm/react-components/src/components/VideoGallery.js +26 -3
  21. package/dist/dist-esm/react-components/src/components/VideoGallery.js.map +1 -1
  22. package/dist/dist-esm/react-components/src/components/VideoTile.js +21 -3
  23. package/dist/dist-esm/react-components/src/components/VideoTile.js.map +1 -1
  24. package/dist/dist-esm/react-components/src/localization/locales/en-US/strings.json +5 -1
  25. package/package.json +8 -8
@@ -8343,6 +8343,14 @@ export declare interface VideoGalleryStrings {
8343
8343
  pinParticipantForMe: string;
8344
8344
  /** Menu text shown in Video Tile contextual menu for setting a remote participant's video tile */
8345
8345
  unpinParticipantForMe: string;
8346
+ /** Aria label for pin participant menu item of remote participant's video tile */
8347
+ pinParticipantMenuItemAriaLabel: string;
8348
+ /** Aria label for unpin participant menu item of remote participant's video tile */
8349
+ unpinParticipantMenuItemAriaLabel: string;
8350
+ /** Aria label to announce when remote participant's video tile is pinned */
8351
+ pinnedParticipantAnnouncementAriaLabel: string;
8352
+ /** Aria label to announce when remote participant's video tile is unpinned */
8353
+ unpinnedParticipantAnnouncementAriaLabel: string;
8346
8354
  }
8347
8355
 
8348
8356
  /**
@@ -159,7 +159,7 @@ const _toCommunicationIdentifier = (id) => {
159
159
  // Copyright (c) Microsoft Corporation.
160
160
  // Licensed under the MIT license.
161
161
  // GENERATED FILE. DO NOT EDIT MANUALLY.
162
- var telemetryVersion = '1.5.1-alpha-202301220014';
162
+ var telemetryVersion = '1.5.1-alpha-202301260015';
163
163
 
164
164
  // Copyright (c) Microsoft Corporation.
165
165
  /**
@@ -1120,7 +1120,9 @@ var EventNames;
1120
1120
  EventNames["LOCAL_STREAM_RENDERING"] = "LOCAL_STREAM_RENDERING";
1121
1121
  EventNames["REMOTE_STREAM_ALREADY_RENDERED"] = "REMOTE_STREAM_ALREADY_RENDERED";
1122
1122
  EventNames["REMOTE_STREAM_RENDERING"] = "REMOTE_STREAM_RENDERING";
1123
+ EventNames["REMOTE_STREAM_ALREADY_DISPOSED"] = "REMOTE_STREAM_ALREADY_DISPOSED";
1123
1124
  EventNames["REMOTE_STREAM_STOPPING"] = "REMOTE_STREAM_STOPPING";
1125
+ EventNames["REMOTE_CREATED_STREAM_STOPPING"] = "REMOTE_CREATED_STREAM_STOPPING";
1124
1126
  // Error
1125
1127
  EventNames["LOCAL_STREAM_NOT_FOUND"] = "LOCAL_STREAM_NOT_FOUND";
1126
1128
  EventNames["LOCAL_RENDER_INFO_NOT_FOUND"] = "LOCAL_RENDER_INFO_NOT_FOUND";
@@ -2039,8 +2041,15 @@ function createViewRemoteVideo(context, internalContext, callId, participantId,
2039
2041
  });
2040
2042
  return;
2041
2043
  }
2044
+ // "Stopping" only happens if the stream was in "rendering" but `disposeView` was called.
2045
+ // Now that `createView` has been re-called, we can flip the state back to "rendering".
2042
2046
  if (renderInfo.status === 'Stopping') {
2043
- console.warn('RemoteVideoStream is in the middle of stopping');
2047
+ _logEvent(callingStatefulLogger, {
2048
+ name: EventNames.REMOTE_STREAM_STOPPING,
2049
+ level: 'warning',
2050
+ message: 'RemoteVideoStream was marked as stopping by dispose view. Resetting state to "Rendering".'
2051
+ });
2052
+ internalContext.setRemoteRenderInfo(callId, participantKey, streamId, renderInfo.stream, 'Rendering', renderInfo.renderer);
2044
2053
  return;
2045
2054
  }
2046
2055
  const renderer = new communicationCalling.VideoStreamRenderer(renderInfo.stream);
@@ -2059,6 +2068,8 @@ function createViewRemoteVideo(context, internalContext, callId, participantId,
2059
2068
  internalContext.setRemoteRenderInfo(callId, participantKey, streamId, renderInfo.stream, 'NotRendered', undefined);
2060
2069
  throw e;
2061
2070
  }
2071
+ // Since render could take some time, we need to check if the stream is still valid and if we received a signal to
2072
+ // stop rendering.
2062
2073
  const refreshedRenderInfo = internalContext.getRemoteRenderInfoForParticipant(callId, participantKey, streamId);
2063
2074
  if (!refreshedRenderInfo) {
2064
2075
  // RenderInfo was removed. This should not happen unless stream was removed from the call so dispose the renderer
@@ -2066,7 +2077,7 @@ function createViewRemoteVideo(context, internalContext, callId, participantId,
2066
2077
  _logEvent(callingStatefulLogger, {
2067
2078
  name: EventNames.REMOTE_RENDER_INFO_NOT_FOUND,
2068
2079
  level: 'error',
2069
- message: '`Cannot find remote render info after create the view.',
2080
+ message: 'Cannot find remote render info after create the view.',
2070
2081
  data: streamLogInfo
2071
2082
  });
2072
2083
  renderer.dispose();
@@ -2076,21 +2087,29 @@ function createViewRemoteVideo(context, internalContext, callId, participantId,
2076
2087
  if (refreshedRenderInfo.status === 'Stopping') {
2077
2088
  // Stop render was called on this stream after we had started rendering. We will dispose this view and do not
2078
2089
  // put the view into the state.
2079
- renderer.dispose();
2080
- internalContext.setRemoteRenderInfo(callId, participantKey, streamId, refreshedRenderInfo.stream, 'NotRendered', undefined);
2081
- context.setRemoteVideoStreamRendererView(callId, participantKey, streamId, undefined);
2082
2090
  _logEvent(callingStatefulLogger, {
2083
- name: EventNames.REMOTE_VIEW_RENDER_SUCCEED,
2084
- level: 'info',
2085
- message: 'Successfully render the remote view.',
2091
+ name: EventNames.REMOTE_CREATED_STREAM_STOPPING,
2092
+ level: 'warning',
2093
+ message: 'Render info status is stopping, dispose renderer.',
2086
2094
  data: streamLogInfo
2087
2095
  });
2096
+ renderer.dispose();
2097
+ internalContext.setRemoteRenderInfo(callId, participantKey, streamId, refreshedRenderInfo.stream, 'NotRendered', undefined);
2098
+ context.setRemoteVideoStreamRendererView(callId, participantKey, streamId, undefined);
2088
2099
  return;
2089
2100
  }
2090
2101
  // Else the stream still exists and status is not telling us to stop rendering. Complete the render process by
2091
2102
  // updating the state.
2092
2103
  internalContext.setRemoteRenderInfo(callId, participantKey, streamId, refreshedRenderInfo.stream, 'Rendered', renderer);
2093
2104
  context.setRemoteVideoStreamRendererView(callId, participantKey, streamId, convertFromSDKToDeclarativeVideoStreamRendererView(view));
2105
+ _logEvent(callingStatefulLogger, {
2106
+ name: EventNames.REMOTE_VIEW_RENDER_SUCCEED,
2107
+ level: 'info',
2108
+ message: `Successfully render the remote view.`,
2109
+ data: {
2110
+ streamLogInfo
2111
+ }
2112
+ });
2094
2113
  return {
2095
2114
  renderer,
2096
2115
  view
@@ -2187,7 +2206,7 @@ function createViewLocalVideo(context, internalContext, callId, options) {
2187
2206
  _logEvent(callingStatefulLogger, {
2188
2207
  name: EventNames.LOCAL_CREATED_STREAM_STOPPING,
2189
2208
  level: 'warning',
2190
- message: 'Render info status is stopping, dispose renderer. ',
2209
+ message: 'Render info status is stopping, dispose renderer.',
2191
2210
  data: {
2192
2211
  callId
2193
2212
  }
@@ -2301,9 +2320,31 @@ function disposeViewRemoteVideo(context, internalContext, callId, participantId,
2301
2320
  });
2302
2321
  return;
2303
2322
  }
2304
- // Sets the status and also renderer. I think we need to always set renderer to undefined since in all status when
2305
- // cleaned up should have renderer as undefined. If the status is 'Rendered' and renderer is not defined it should
2306
- // be cleaned up below so we can set it to undefined here.
2323
+ // Nothing to dispose of or clean up -- we can safely exit early here.
2324
+ if (renderInfo.status === 'NotRendered') {
2325
+ _logEvent(callingStatefulLogger, {
2326
+ name: EventNames.REMOTE_STREAM_ALREADY_DISPOSED,
2327
+ level: 'info',
2328
+ message: 'RemoteVideoStream is already disposed.',
2329
+ data: streamLogInfo
2330
+ });
2331
+ return;
2332
+ }
2333
+ // Status is already marked as "stopping" so we can exit early here. This is because stopping only occurs
2334
+ // when the stream is being created in createView but hasn't been completed being created yet. The createView
2335
+ // method will see the "stopping" status and perform the cleanup
2336
+ if (renderInfo.status === 'Stopping') {
2337
+ _logEvent(callingStatefulLogger, {
2338
+ name: EventNames.REMOTE_STREAM_STOPPING,
2339
+ level: 'info',
2340
+ message: 'Remote stream is already stopping.',
2341
+ data: streamLogInfo
2342
+ });
2343
+ return;
2344
+ }
2345
+ // If the stream is in the middle of being rendered (i.e. has state "Rendering"), we need the status as
2346
+ // "stopping" without performing any cleanup. This will tell the `createView` method that it should stop
2347
+ // rendering and clean up the state once the view has finished being created.
2307
2348
  if (renderInfo.status === 'Rendering') {
2308
2349
  _logEvent(callingStatefulLogger, {
2309
2350
  name: EventNames.REMOTE_STREAM_STOPPING,
@@ -2312,10 +2353,10 @@ function disposeViewRemoteVideo(context, internalContext, callId, participantId,
2312
2353
  data: streamLogInfo
2313
2354
  });
2314
2355
  internalContext.setRemoteRenderInfo(callId, participantKey, streamId, renderInfo.stream, 'Stopping', undefined);
2356
+ return;
2315
2357
  }
2316
- else {
2317
- internalContext.setRemoteRenderInfo(callId, participantKey, streamId, renderInfo.stream, 'NotRendered', undefined);
2318
- }
2358
+ // Else the state must be in the "Rendered" state, so we can dispose the renderer and clean up the state.
2359
+ internalContext.setRemoteRenderInfo(callId, participantKey, streamId, renderInfo.stream, 'NotRendered', undefined);
2319
2360
  if (renderInfo.renderer) {
2320
2361
  _logEvent(callingStatefulLogger, {
2321
2362
  name: EventNames.DISPOSING_REMOTE_RENDERER,
@@ -3980,7 +4021,7 @@ const typingIndicatorStringStyle = react.mergeStyles({
3980
4021
  wordBreak: 'break-word'
3981
4022
  });
3982
4023
 
3983
- var participantItem$d={isMeText:"(you)",menuTitle:"More Options",removeButtonLabel:"Remove",sharingIconLabel:"Sharing",mutedIconLabel:"Muted",displayNamePlaceholder:"Unnamed participant",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",copyInviteLinkActionedAriaLabel:"Invite link copied"};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.",callMicrophoneAccessDeniedSafari:"Unable to access microphone. Refresh the page to allow permissions, or check this browser’s settings and verify permissions are enabled for this website.",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.",callCameraAccessDeniedSafari:"Unable to access camera. Refresh the page to allow permissions, or check this browser’s settings and verify permissions are enabled for this website.",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",fitRemoteParticipantToFrame:"Fit to frame",fillRemoteParticipantFrame:"Fill frame",pinParticipantForMe:"Pin for me",pinParticipantForMeLimitReached:"Pin (limit reached)",unpinParticipantForMe:"Unpin for me"};var dialpad$d={placeholderText:"Enter phone number",deleteButtonAriaLabel:"Delete"};var holdButton$d={onLabel:"Resume",offLabel:"Hold",tooltipOnContent:"Resume call",tooltipOffContent:"Hold call"};var videoTile$d={participantStateRinging:"Calling...",participantStateHold:"On hold"};var CameraAndMicrophoneSitePermissionsRequest={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:"Continue without camera and microphone",ariaLabel:"Allow camera and microphone access"};var CameraSitePermissionsRequest={primaryText:"Allow {appName} to use your camera",secondaryText:"This is so participants can see you.",linkText:"Need help? Get troubleshooting help",primaryButtonText:"Continue without camera",ariaLabel:"Allow camera access"};var MicrophoneSitePermissionsRequest={primaryText:"Allow {appName} to use your microphone",secondaryText:"This is so participants can hear you.",linkText:"Need help? Get troubleshooting help",primaryButtonText:"Continue without microphone",ariaLabel:"Allow microphone access"};var CameraAndMicrophoneSitePermissionsCheck={primaryText:"Checking for camera and microphone access",secondaryText:"Allow access if prompted. This is so participants can see and hear you.",linkText:"Need help? Get troubleshooting help",primaryButtonText:"Continue without camera and microphone",ariaLabel:"Checking for camera and microphone access. Allow access if prompted."};var CameraSitePermissionsCheck={primaryText:"Checking for camera access",secondaryText:"Allow access if prompted. This is so participants can see you.",linkText:"Need help? Get troubleshooting help",primaryButtonText:"Continue without camera",ariaLabel:"Checking for camera access. Allow access if prompted."};var MicrophoneSitePermissionsCheck={primaryText:"Checking for microphone access",secondaryText:"Allow access if prompted. This is so participants can hear you.",linkText:"Need help? Get troubleshooting help",primaryButtonText:"Continue without microphone",ariaLabel:"Checking for microphone access. Allow access if prompted."};var CameraAndMicrophoneSitePermissionsDenied={primaryText:"Unable to access camera and microphone",secondaryText:"Click the lock icon in the address bar to grant microphone permissions to this webpage. A page refresh may be required.",primaryButtonText:"Continue without camera and microphone",linkText:"Need help? Get troubleshooting help"};var CameraAndMicrophoneSitePermissionsDeniedSafari={primaryText:"Unable to access camera and microphone",secondaryText:"Refresh the page to allow permissions, or check this browser’s settings and verify permissions are enabled for this website.",primaryButtonText:"Continue without camera and microphone",linkText:"Need help? Get troubleshooting help"};var CameraSitePermissionsDenied={primaryText:"Unable to access camera",secondaryText:"Click the lock icon in the address bar to grant camera permissions to this webpage. A page refresh may be required.",primaryButtonText:"Continue without camera",linkText:"Need help? Get troubleshooting help"};var MicrophoneSitePermissionsDenied={primaryText:"Unable to access microphone",secondaryText:"Click the lock icon in the address bar to grant microphone permissions to this webpage. A page refresh may be required.",primaryButtonText:"Continue without microphone",linkText:"Need help? Get troubleshooting help"};var CameraSitePermissionsDeniedSafari={primaryText:"Unable to access camera",secondaryText:"Refresh the page to allow permissions, or check this browser’s settings and verify permissions are enabled for this website.",primaryButtonText:"Continue without camera",linkText:"Need help? Get troubleshooting help"};var MicrophoneSitePermissionsDeniedSafari={primaryText:"Unable to access microphone",secondaryText:"Refresh the page to allow permissions, or check this browser’s settings and verify permissions are enabled for this website.",primaryButtonText:"Continue without microphone",linkText:"Need help? Get troubleshooting help"};var UnsupportedBrowser$e={primaryText:"Browser not supported",secondaryText:"Please join this call using a compatible browser.",moreHelpLinkText:"See compatibility requirements"};var UnsupportedBrowserVersion$1={primaryText:"Browser update needed",secondaryText:"To ensure the best call possible, please update your browser and then try joining the call again.",moreHelpLinkText:"See compatibility requirements",continueAnywayButtonText:"Start call without updating"};var UnsupportedOperatingSystem$1={primaryText:"Operating system not supported",secondaryText:"Please join this call using a device with a compatible operating system.",moreHelpLinkText:"See compatibility requirements"};var BrowserPermissionDenied$d={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$d={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$d,videoTile:videoTile$d,CameraAndMicrophoneSitePermissionsRequest:CameraAndMicrophoneSitePermissionsRequest,CameraSitePermissionsRequest:CameraSitePermissionsRequest,MicrophoneSitePermissionsRequest:MicrophoneSitePermissionsRequest,CameraAndMicrophoneSitePermissionsCheck:CameraAndMicrophoneSitePermissionsCheck,CameraSitePermissionsCheck:CameraSitePermissionsCheck,MicrophoneSitePermissionsCheck:MicrophoneSitePermissionsCheck,CameraAndMicrophoneSitePermissionsDenied:CameraAndMicrophoneSitePermissionsDenied,CameraAndMicrophoneSitePermissionsDeniedSafari:CameraAndMicrophoneSitePermissionsDeniedSafari,CameraSitePermissionsDenied:CameraSitePermissionsDenied,MicrophoneSitePermissionsDenied:MicrophoneSitePermissionsDenied,CameraSitePermissionsDeniedSafari:CameraSitePermissionsDeniedSafari,MicrophoneSitePermissionsDeniedSafari:MicrophoneSitePermissionsDeniedSafari,UnsupportedBrowser:UnsupportedBrowser$e,UnsupportedBrowserVersion:UnsupportedBrowserVersion$1,UnsupportedOperatingSystem:UnsupportedOperatingSystem$1,BrowserPermissionDenied:BrowserPermissionDenied$d,BrowserPermissionDeniedIOS:BrowserPermissionDeniedIOS$d};
4024
+ var participantItem$d={isMeText:"(you)",menuTitle:"More Options",removeButtonLabel:"Remove",sharingIconLabel:"Sharing",mutedIconLabel:"Muted",displayNamePlaceholder:"Unnamed participant",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",copyInviteLinkActionedAriaLabel:"Invite link copied"};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.",callMicrophoneAccessDeniedSafari:"Unable to access microphone. Refresh the page to allow permissions, or check this browser’s settings and verify permissions are enabled for this website.",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.",callCameraAccessDeniedSafari:"Unable to access camera. Refresh the page to allow permissions, or check this browser’s settings and verify permissions are enabled for this website.",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",fitRemoteParticipantToFrame:"Fit to frame",fillRemoteParticipantFrame:"Fill frame",pinParticipantForMe:"Pin for me",pinParticipantForMeLimitReached:"Pin (limit reached)",unpinParticipantForMe:"Unpin",pinParticipantMenuItemAriaLabel:"Pin {participantName}",unpinParticipantMenuItemAriaLabel:"Unpin {participantName}",pinnedParticipantAnnouncementAriaLabel:"Pinned {participantName}",unpinnedParticipantAnnouncementAriaLabel:"Unpinned {participantName}"};var dialpad$d={placeholderText:"Enter phone number",deleteButtonAriaLabel:"Delete"};var holdButton$d={onLabel:"Resume",offLabel:"Hold",tooltipOnContent:"Resume call",tooltipOffContent:"Hold call"};var videoTile$d={participantStateRinging:"Calling...",participantStateHold:"On hold"};var CameraAndMicrophoneSitePermissionsRequest={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:"Continue without camera and microphone",ariaLabel:"Allow camera and microphone access"};var CameraSitePermissionsRequest={primaryText:"Allow {appName} to use your camera",secondaryText:"This is so participants can see you.",linkText:"Need help? Get troubleshooting help",primaryButtonText:"Continue without camera",ariaLabel:"Allow camera access"};var MicrophoneSitePermissionsRequest={primaryText:"Allow {appName} to use your microphone",secondaryText:"This is so participants can hear you.",linkText:"Need help? Get troubleshooting help",primaryButtonText:"Continue without microphone",ariaLabel:"Allow microphone access"};var CameraAndMicrophoneSitePermissionsCheck={primaryText:"Checking for camera and microphone access",secondaryText:"Allow access if prompted. This is so participants can see and hear you.",linkText:"Need help? Get troubleshooting help",primaryButtonText:"Continue without camera and microphone",ariaLabel:"Checking for camera and microphone access. Allow access if prompted."};var CameraSitePermissionsCheck={primaryText:"Checking for camera access",secondaryText:"Allow access if prompted. This is so participants can see you.",linkText:"Need help? Get troubleshooting help",primaryButtonText:"Continue without camera",ariaLabel:"Checking for camera access. Allow access if prompted."};var MicrophoneSitePermissionsCheck={primaryText:"Checking for microphone access",secondaryText:"Allow access if prompted. This is so participants can hear you.",linkText:"Need help? Get troubleshooting help",primaryButtonText:"Continue without microphone",ariaLabel:"Checking for microphone access. Allow access if prompted."};var CameraAndMicrophoneSitePermissionsDenied={primaryText:"Unable to access camera and microphone",secondaryText:"Click the lock icon in the address bar to grant microphone permissions to this webpage. A page refresh may be required.",primaryButtonText:"Continue without camera and microphone",linkText:"Need help? Get troubleshooting help"};var CameraAndMicrophoneSitePermissionsDeniedSafari={primaryText:"Unable to access camera and microphone",secondaryText:"Refresh the page to allow permissions, or check this browser’s settings and verify permissions are enabled for this website.",primaryButtonText:"Continue without camera and microphone",linkText:"Need help? Get troubleshooting help"};var CameraSitePermissionsDenied={primaryText:"Unable to access camera",secondaryText:"Click the lock icon in the address bar to grant camera permissions to this webpage. A page refresh may be required.",primaryButtonText:"Continue without camera",linkText:"Need help? Get troubleshooting help"};var MicrophoneSitePermissionsDenied={primaryText:"Unable to access microphone",secondaryText:"Click the lock icon in the address bar to grant microphone permissions to this webpage. A page refresh may be required.",primaryButtonText:"Continue without microphone",linkText:"Need help? Get troubleshooting help"};var CameraSitePermissionsDeniedSafari={primaryText:"Unable to access camera",secondaryText:"Refresh the page to allow permissions, or check this browser’s settings and verify permissions are enabled for this website.",primaryButtonText:"Continue without camera",linkText:"Need help? Get troubleshooting help"};var MicrophoneSitePermissionsDeniedSafari={primaryText:"Unable to access microphone",secondaryText:"Refresh the page to allow permissions, or check this browser’s settings and verify permissions are enabled for this website.",primaryButtonText:"Continue without microphone",linkText:"Need help? Get troubleshooting help"};var UnsupportedBrowser$e={primaryText:"Browser not supported",secondaryText:"Please join this call using a compatible browser.",moreHelpLinkText:"See compatibility requirements"};var UnsupportedBrowserVersion$1={primaryText:"Browser update needed",secondaryText:"To ensure the best call possible, please update your browser and then try joining the call again.",moreHelpLinkText:"See compatibility requirements",continueAnywayButtonText:"Start call without updating"};var UnsupportedOperatingSystem$1={primaryText:"Operating system not supported",secondaryText:"Please join this call using a device with a compatible operating system.",moreHelpLinkText:"See compatibility requirements"};var BrowserPermissionDenied$d={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$d={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$d,videoTile:videoTile$d,CameraAndMicrophoneSitePermissionsRequest:CameraAndMicrophoneSitePermissionsRequest,CameraSitePermissionsRequest:CameraSitePermissionsRequest,MicrophoneSitePermissionsRequest:MicrophoneSitePermissionsRequest,CameraAndMicrophoneSitePermissionsCheck:CameraAndMicrophoneSitePermissionsCheck,CameraSitePermissionsCheck:CameraSitePermissionsCheck,MicrophoneSitePermissionsCheck:MicrophoneSitePermissionsCheck,CameraAndMicrophoneSitePermissionsDenied:CameraAndMicrophoneSitePermissionsDenied,CameraAndMicrophoneSitePermissionsDeniedSafari:CameraAndMicrophoneSitePermissionsDeniedSafari,CameraSitePermissionsDenied:CameraSitePermissionsDenied,MicrophoneSitePermissionsDenied:MicrophoneSitePermissionsDenied,CameraSitePermissionsDeniedSafari:CameraSitePermissionsDeniedSafari,MicrophoneSitePermissionsDeniedSafari:MicrophoneSitePermissionsDeniedSafari,UnsupportedBrowser:UnsupportedBrowser$e,UnsupportedBrowserVersion:UnsupportedBrowserVersion$1,UnsupportedOperatingSystem:UnsupportedOperatingSystem$1,BrowserPermissionDenied:BrowserPermissionDenied$d,BrowserPermissionDeniedIOS:BrowserPermissionDeniedIOS$d};
3984
4025
 
3985
4026
  var participantItem$c={isMeText:"(you)",menuTitle:"More Options",removeButtonLabel:"Remove",sharingIconLabel:"Sharing",mutedIconLabel:"Muted",displayNamePlaceholder:"Unnamed participant",participantStateConnecting:"Calling...",participantStateRinging:"Calling...",participantStateHold:"On hold"};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.",removeFile:"Remove file",uploading:"Uploading",uploadCompleted:"Upload completed"};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",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$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.",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$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 phone number",deleteButtonAriaLabel:"Delete"};var holdButton$c={onLabel:"Resume",offLabel:"Hold",tooltipOnContent:"Resume call",tooltipOffContent:"Hold call"};var videoTile$c={participantStateConnecting:"Calling...",participantStateRinging:"Calling...",participantStateHold:"On hold"};var SitePermissions$c={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$d={primaryText:"Browser not supported",secondaryText:"Please join this call using a compatible browser.",moreHelpLink:"More help"};var BrowserPermissionDenied$c={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$c={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_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$c,videoTile:videoTile$c,SitePermissions:SitePermissions$c,UnsupportedBrowser:UnsupportedBrowser$d,BrowserPermissionDenied:BrowserPermissionDenied$c,BrowserPermissionDeniedIOS:BrowserPermissionDeniedIOS$c};
3986
4027
 
@@ -8128,7 +8169,7 @@ const useRemoteVideoStreamLifecycleMaintainer = (props) => {
8128
8169
  */
8129
8170
  const useVideoTileContextualMenuProps = (props) => {
8130
8171
  var _a;
8131
- const { view, strings, isPinned, onPinParticipant, onUnpinParticipant, disablePinMenuItem } = props;
8172
+ const { remoteParticipant, view, strings, isPinned, onPinParticipant, onUnpinParticipant, disablePinMenuItem, toggleAnnouncerString } = props;
8132
8173
  const scalingMode = React.useMemo(() => {
8133
8174
  var _a;
8134
8175
  /* @conditional-compile-remove(pinned-participants) */
@@ -8141,6 +8182,12 @@ const useVideoTileContextualMenuProps = (props) => {
8141
8182
  const items = [];
8142
8183
  if (isPinned !== undefined) {
8143
8184
  if (isPinned && onUnpinParticipant && (strings === null || strings === void 0 ? void 0 : strings.unpinParticipantForMe)) {
8185
+ let unpinActionString = undefined;
8186
+ if (toggleAnnouncerString && strings.unpinParticipantMenuItemAriaLabel && remoteParticipant.displayName) {
8187
+ unpinActionString = _formatString(strings === null || strings === void 0 ? void 0 : strings.unpinParticipantMenuItemAriaLabel, {
8188
+ participantName: remoteParticipant.displayName
8189
+ });
8190
+ }
8144
8191
  items.push({
8145
8192
  key: 'unpin',
8146
8193
  text: strings.unpinParticipantForMe,
@@ -8148,11 +8195,21 @@ const useVideoTileContextualMenuProps = (props) => {
8148
8195
  iconName: 'UnpinParticipant',
8149
8196
  styles: { root: { lineHeight: '1rem', textAlign: 'center' } }
8150
8197
  },
8151
- onClick: () => onUnpinParticipant === null || onUnpinParticipant === void 0 ? void 0 : onUnpinParticipant(props.remoteParticipant.userId),
8152
- 'data-ui-id': 'video-tile-unpin-participant-button'
8198
+ onClick: () => {
8199
+ onUnpinParticipant(remoteParticipant.userId);
8200
+ unpinActionString && (toggleAnnouncerString === null || toggleAnnouncerString === void 0 ? void 0 : toggleAnnouncerString(unpinActionString));
8201
+ },
8202
+ 'data-ui-id': 'video-tile-unpin-participant-button',
8203
+ ariaLabel: unpinActionString
8153
8204
  });
8154
8205
  }
8155
8206
  if (!isPinned && onPinParticipant && (strings === null || strings === void 0 ? void 0 : strings.pinParticipantForMe)) {
8207
+ let pinActionString = undefined;
8208
+ if (toggleAnnouncerString && strings.pinnedParticipantAnnouncementAriaLabel && remoteParticipant.displayName) {
8209
+ pinActionString = _formatString(strings === null || strings === void 0 ? void 0 : strings.pinnedParticipantAnnouncementAriaLabel, {
8210
+ participantName: remoteParticipant.displayName
8211
+ });
8212
+ }
8156
8213
  items.push({
8157
8214
  key: 'pin',
8158
8215
  text: disablePinMenuItem ? strings.pinParticipantForMeLimitReached : strings.pinParticipantForMe,
@@ -8160,9 +8217,13 @@ const useVideoTileContextualMenuProps = (props) => {
8160
8217
  iconName: 'PinParticipant',
8161
8218
  styles: { root: { lineHeight: '1rem', textAlign: 'center' } }
8162
8219
  },
8163
- onClick: () => onPinParticipant === null || onPinParticipant === void 0 ? void 0 : onPinParticipant(props.remoteParticipant.userId),
8220
+ onClick: () => {
8221
+ onPinParticipant(remoteParticipant.userId);
8222
+ pinActionString && (toggleAnnouncerString === null || toggleAnnouncerString === void 0 ? void 0 : toggleAnnouncerString(pinActionString));
8223
+ },
8164
8224
  'data-ui-id': 'video-tile-pin-participant-button',
8165
- disabled: disablePinMenuItem
8225
+ disabled: disablePinMenuItem,
8226
+ ariaLabel: pinActionString
8166
8227
  });
8167
8228
  }
8168
8229
  }
@@ -8178,7 +8239,8 @@ const useVideoTileContextualMenuProps = (props) => {
8178
8239
  onClick: () => {
8179
8240
  view === null || view === void 0 ? void 0 : view.updateScalingMode('Fit');
8180
8241
  },
8181
- 'data-ui-id': 'video-tile-fit-to-frame'
8242
+ 'data-ui-id': 'video-tile-fit-to-frame',
8243
+ ariaLabel: strings.fitRemoteParticipantToFrame
8182
8244
  });
8183
8245
  }
8184
8246
  else if (scalingMode === 'Fit' && (strings === null || strings === void 0 ? void 0 : strings.fillRemoteParticipantFrame)) {
@@ -8193,7 +8255,8 @@ const useVideoTileContextualMenuProps = (props) => {
8193
8255
  onClick: () => {
8194
8256
  view === null || view === void 0 ? void 0 : view.updateScalingMode('Crop');
8195
8257
  },
8196
- 'data-ui-id': 'video-tile-fill-frame'
8258
+ 'data-ui-id': 'video-tile-fill-frame',
8259
+ ariaLabel: strings.fillRemoteParticipantFrame
8197
8260
  });
8198
8261
  }
8199
8262
  }
@@ -8209,8 +8272,10 @@ const useVideoTileContextualMenuProps = (props) => {
8209
8272
  isPinned,
8210
8273
  onPinParticipant,
8211
8274
  onUnpinParticipant,
8212
- props.remoteParticipant.userId,
8213
- disablePinMenuItem
8275
+ remoteParticipant.userId,
8276
+ remoteParticipant.displayName,
8277
+ disablePinMenuItem,
8278
+ toggleAnnouncerString
8214
8279
  ]);
8215
8280
  return contextualMenuProps;
8216
8281
  };
@@ -8488,6 +8553,10 @@ const VideoTile = (props) => {
8488
8553
  isPinned, onRenderPlaceholder, renderElement, showLabel = true, showMuteIndicator = true, styles, userId, noVideoAvailableAriaLabel, isSpeaking, personaMinSize = DEFAULT_PERSONA_MIN_SIZE_PX, personaMaxSize = DEFAULT_PERSONA_MAX_SIZE_PX,
8489
8554
  /* @conditional-compile-remove(pinned-participants) */
8490
8555
  contextualMenu } = props;
8556
+ /* @conditional-compile-remove(pinned-participants) */
8557
+ const [isHovered, setIsHovered] = React.useState(false);
8558
+ /* @conditional-compile-remove(pinned-participants) */
8559
+ const [isFocused, setIsFocused] = React.useState(false);
8491
8560
  const [personaSize, setPersonaSize] = React.useState(100);
8492
8561
  const videoTileRef = React.useRef(null);
8493
8562
  const locale = useLocale$1();
@@ -8525,6 +8594,15 @@ const VideoTile = (props) => {
8525
8594
  /* @conditional-compile-remove(pinned-participants) */
8526
8595
  longPressHandlers
8527
8596
  ]);
8597
+ const hoverHandlers = React.useMemo(() => {
8598
+ /* @conditional-compile-remove(pinned-participants) */
8599
+ return {
8600
+ onMouseEnter: () => setIsHovered(true),
8601
+ onMouseLeave: () => setIsHovered(false),
8602
+ onFocus: () => setIsFocused(true),
8603
+ onBlur: () => setIsFocused(false)
8604
+ };
8605
+ }, []);
8528
8606
  const placeholderOptions = {
8529
8607
  userId,
8530
8608
  text: initialsName !== null && initialsName !== void 0 ? initialsName : displayName,
@@ -8538,9 +8616,13 @@ const VideoTile = (props) => {
8538
8616
  const ids = useIdentifiers();
8539
8617
  const canShowLabel = showLabel && (displayName || (showMuteIndicator && isMuted));
8540
8618
  const participantStateString = participantStateStringTrampoline(props, locale);
8619
+ /* @conditional-compile-remove(pinned-participants) */
8620
+ const canShowContextMenuButton = isHovered || isFocused;
8541
8621
  return (React__default['default'].createElement(react.Stack, Object.assign({ "data-ui-id": ids.videoTile, className: react.mergeStyles(rootStyles, {
8542
8622
  background: theme.palette.neutralLighter,
8543
- borderRadius: theme.effects.roundedCorner4
8623
+ borderRadius: theme.effects.roundedCorner4,
8624
+ // To ensure that the video tile is focusable when there is a floating video tile
8625
+ zIndex: 1
8544
8626
  }, isSpeaking && {
8545
8627
  '&::before': {
8546
8628
  content: `''`,
@@ -8552,7 +8634,7 @@ const VideoTile = (props) => {
8552
8634
  height: '100%'
8553
8635
  }
8554
8636
  }, styles === null || styles === void 0 ? void 0 : styles.root) }, longPressHandlersTrampoline),
8555
- React__default['default'].createElement("div", { ref: videoTileRef, style: { width: '100%', height: '100%' } },
8637
+ React__default['default'].createElement("div", Object.assign({ ref: videoTileRef, style: { width: '100%', height: '100%' } }, hoverHandlers),
8556
8638
  isVideoRendered ? (React__default['default'].createElement(react.Stack, { className: react.mergeStyles(videoContainerStyles, isMirrored && { transform: 'scaleX(-1)' }, styles === null || styles === void 0 ? void 0 : styles.videoContainer) }, renderElement)) : (React__default['default'].createElement(react.Stack, { className: react.mergeStyles(videoContainerStyles, {
8557
8639
  opacity: participantStateString ||
8558
8640
  /* @conditional-compile-remove(PSTN-calls) */ props.participantState === 'Idle'
@@ -8566,7 +8648,7 @@ const VideoTile = (props) => {
8566
8648
  showMuteIndicator && isMuted && (React__default['default'].createElement(react.Stack, { className: react.mergeStyles(iconContainerStyle) },
8567
8649
  React__default['default'].createElement(react.Icon, { iconName: "VideoTileMicOff" }))),
8568
8650
  /* @conditional-compile-remove(pinned-participants) */
8569
- React__default['default'].createElement(VideoTileMoreOptionsButton, { contextualMenu: contextualMenu }),
8651
+ canShowContextMenuButton && React__default['default'].createElement(VideoTileMoreOptionsButton, { contextualMenu: contextualMenu }),
8570
8652
  /* @conditional-compile-remove(pinned-participants) */
8571
8653
  isPinned && (React__default['default'].createElement(react.Stack, { className: react.mergeStyles(iconContainerStyle) },
8572
8654
  React__default['default'].createElement(react.Icon, { iconName: "VideoTilePinned", className: react.mergeStyles(pinIconStyle) })))))),
@@ -8603,7 +8685,7 @@ const bracketedParticipantString = (participantString, withBrackets) => {
8603
8685
  */
8604
8686
  const _RemoteVideoTile = React__default['default'].memo((props) => {
8605
8687
  const { isAvailable, isReceiving = true, // default to true to prevent any breaking change
8606
- isScreenSharingOn, onCreateRemoteStreamView, onDisposeRemoteStreamView, remoteVideoViewOptions, renderElement, userId, onRenderAvatar, showMuteIndicator, remoteParticipant, participantState, menuKind = 'contextual', isPinned, onPinParticipant, onUnpinParticipant, disablePinMenuItem } = props;
8688
+ isScreenSharingOn, onCreateRemoteStreamView, onDisposeRemoteStreamView, remoteVideoViewOptions, renderElement, userId, onRenderAvatar, showMuteIndicator, remoteParticipant, participantState, menuKind = 'contextual', isPinned, onPinParticipant, onUnpinParticipant, disablePinMenuItem, toggleAnnouncerString } = props;
8607
8689
  const remoteVideoStreamProps = React.useMemo(() => ({
8608
8690
  isMirrored: remoteVideoViewOptions === null || remoteVideoViewOptions === void 0 ? void 0 : remoteVideoViewOptions.isMirrored,
8609
8691
  isScreenSharingOn,
@@ -8635,7 +8717,8 @@ const _RemoteVideoTile = React__default['default'].memo((props) => {
8635
8717
  isPinned,
8636
8718
  onPinParticipant,
8637
8719
  onUnpinParticipant,
8638
- disablePinMenuItem
8720
+ disablePinMenuItem,
8721
+ toggleAnnouncerString
8639
8722
  });
8640
8723
  const videoTileContextualMenuProps = React.useMemo(() => {
8641
8724
  if (menuKind !== 'contextual') {
@@ -10392,6 +10475,21 @@ const VideoGallery = (props) => {
10392
10475
  setPinnedParticipantsState(pinnedParticipantsState.filter((p) => p !== userId));
10393
10476
  onUnpinParticipantHandler === null || onUnpinParticipantHandler === void 0 ? void 0 : onUnpinParticipantHandler(userId);
10394
10477
  }, [pinnedParticipantsState, setPinnedParticipantsState, onUnpinParticipantHandler]);
10478
+ /* @conditional-compile-remove(pinned-participants) */
10479
+ const [announcementString, setAnnouncementString] = React__default['default'].useState('');
10480
+ /* @conditional-compile-remove(pinned-participants) */
10481
+ /**
10482
+ * sets the announcement string for VideoGallery actions so that the screenreader will trigger
10483
+ */
10484
+ const toggleAnnouncerString = React.useCallback((announcement) => {
10485
+ setAnnouncementString(announcement);
10486
+ /**
10487
+ * Clears the announcer string after VideoGallery action allowing it to be re-announced.
10488
+ */
10489
+ setTimeout(() => {
10490
+ setAnnouncementString('');
10491
+ }, 3000);
10492
+ }, [setAnnouncementString]);
10395
10493
  const defaultOnRenderVideoTile = React.useCallback((participant, isVideoParticipant) => {
10396
10494
  const remoteVideoStream = participant.videoStream;
10397
10495
  /* @conditional-compile-remove(pinned-participants) */
@@ -10414,7 +10512,9 @@ const VideoGallery = (props) => {
10414
10512
  /* @conditional-compile-remove(pinned-participants) */
10415
10513
  isPinned: isPinned,
10416
10514
  /* @conditional-compile-remove(pinned-participants) */
10417
- disablePinMenuItem: pinnedParticipants.length >= MAX_PINNED_REMOTE_VIDEO_TILES }));
10515
+ disablePinMenuItem: pinnedParticipants.length >= MAX_PINNED_REMOTE_VIDEO_TILES,
10516
+ /* @conditional-compile-remove(pinned-participants) */
10517
+ toggleAnnouncerString: toggleAnnouncerString }));
10418
10518
  }, [
10419
10519
  onCreateRemoteStreamView,
10420
10520
  onDisposeRemoteStreamView,
@@ -10426,7 +10526,8 @@ const VideoGallery = (props) => {
10426
10526
  /* @conditional-compile-remove(pinned-participants) */ remoteVideoTileMenuOptions,
10427
10527
  /* @conditional-compile-remove(pinned-participants) */ pinnedParticipants,
10428
10528
  /* @conditional-compile-remove(pinned-participants) */ onPinParticipant,
10429
- /* @conditional-compile-remove(pinned-participants) */ onUnpinParticipant
10529
+ /* @conditional-compile-remove(pinned-participants) */ onUnpinParticipant,
10530
+ /* @conditional-compile-remove(pinned-participants) */ toggleAnnouncerString
10430
10531
  ]);
10431
10532
  const screenShareParticipant = remoteParticipants.find((participant) => { var _a; return (_a = participant.screenShareStream) === null || _a === void 0 ? void 0 : _a.isAvailable; });
10432
10533
  const localScreenShareStreamComponent = React__default['default'].createElement(LocalScreenShare, { localParticipant: localParticipant });
@@ -10471,7 +10572,10 @@ const VideoGallery = (props) => {
10471
10572
  return (React__default['default'].createElement("div", {
10472
10573
  /* @conditional-compile-remove(pinned-participants) */
10473
10574
  // We don't assign an drawer menu host id to the VideoGallery when a drawerMenuHostId is assigned from props
10474
- id: drawerMenuHostIdFromProp ? undefined : drawerMenuHostId, "data-ui-id": ids.videoGallery, ref: containerRef, className: react.mergeStyles(videoGalleryOuterDivStyle, styles === null || styles === void 0 ? void 0 : styles.root) }, videoGalleryLayout));
10575
+ id: drawerMenuHostIdFromProp ? undefined : drawerMenuHostId, "data-ui-id": ids.videoGallery, ref: containerRef, className: react.mergeStyles(videoGalleryOuterDivStyle, styles === null || styles === void 0 ? void 0 : styles.root) },
10576
+ videoGalleryLayout,
10577
+ /* @conditional-compile-remove(pinned-participants) */
10578
+ React__default['default'].createElement(Announcer, { announcementString: announcementString, ariaLive: "polite" })));
10475
10579
  };
10476
10580
 
10477
10581
  // Copyright (c) Microsoft Corporation.
@@ -12709,7 +12813,7 @@ const useSelector$4 = (selector, selectorProps) => {
12709
12813
  * @public
12710
12814
  */
12711
12815
  const errorBarSelector$1 = reselect.createSelector([getLatestErrors$1, getDiagnostics, getDeviceManager$1, getEnvironmentInfo], (latestErrors, diagnostics, deviceManager, environmentInfo) => {
12712
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
12816
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
12713
12817
  // The order in which the errors are returned is significant: The `ErrorBar` shows errors on the UI in that order.
12714
12818
  // There are several options for the ordering:
12715
12819
  // - Sorted by when the errors happened (latest first / oldest first).
@@ -12785,9 +12889,17 @@ const errorBarSelector$1 = reselect.createSelector([getLatestErrors$1, getDiagno
12785
12889
  appendActiveErrorIfDefined(activeErrorMessages, latestErrors, 'Call.stopVideo', 'stopVideoGeneric');
12786
12890
  appendActiveErrorIfDefined(activeErrorMessages, latestErrors, 'Call.mute', 'muteGeneric');
12787
12891
  appendActiveErrorIfDefined(activeErrorMessages, latestErrors, 'Call.stopScreenSharing', 'stopScreenShareGeneric');
12788
- appendActiveErrorIfDefined(activeErrorMessages, latestErrors, 'Call.startVideo', 'startVideoGeneric');
12892
+ if (((_o = latestErrors['Call.startVideo']) === null || _o === void 0 ? void 0 : _o.message) === 'Call.startVideo: Video operation failure SourceUnavailableError') {
12893
+ appendActiveErrorIfDefined(activeErrorMessages, latestErrors, 'Call.startVideo', 'callCameraAlreadyInUse');
12894
+ }
12895
+ else if (((_p = latestErrors['Call.startVideo']) === null || _p === void 0 ? void 0 : _p.message) === 'Call.startVideo: Video operation failure permissionDeniedError') {
12896
+ appendActiveErrorIfDefined(activeErrorMessages, latestErrors, 'Call.startVideo', 'callCameraAccessDenied');
12897
+ }
12898
+ else {
12899
+ appendActiveErrorIfDefined(activeErrorMessages, latestErrors, 'Call.startVideo', 'startVideoGeneric');
12900
+ }
12789
12901
  appendActiveErrorIfDefined(activeErrorMessages, latestErrors, 'Call.unmute', 'unmuteGeneric');
12790
- if (((_o = latestErrors['CallAgent.join']) === null || _o === void 0 ? void 0 : _o.message) === 'CallAgent.join: Invalid meeting link') {
12902
+ if (((_q = latestErrors['CallAgent.join']) === null || _q === void 0 ? void 0 : _q.message) === 'CallAgent.join: Invalid meeting link') {
12791
12903
  appendActiveErrorIfDefined(activeErrorMessages, latestErrors, 'CallAgent.join', 'failedToJoinCallInvalidMeetingLink');
12792
12904
  }
12793
12905
  else {