@azure/communication-react 1.7.1-alpha-202308290013 → 1.7.1-alpha-202308310013

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 (77) hide show
  1. package/dist/communication-react.d.ts +96 -9
  2. package/dist/dist-cjs/communication-react/index.js +351 -85
  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/baseSelectors.js +1 -1
  7. package/dist/dist-esm/calling-component-bindings/src/baseSelectors.js.map +1 -1
  8. package/dist/dist-esm/calling-stateful-client/src/CallClientState.d.ts +6 -2
  9. package/dist/dist-esm/calling-stateful-client/src/CallClientState.js.map +1 -1
  10. package/dist/dist-esm/calling-stateful-client/src/CallContext.d.ts +2 -2
  11. package/dist/dist-esm/calling-stateful-client/src/CallContext.js +2 -2
  12. package/dist/dist-esm/calling-stateful-client/src/CallContext.js.map +1 -1
  13. package/dist/dist-esm/calling-stateful-client/src/CapabilitiesSubscriber.js +2 -2
  14. package/dist/dist-esm/calling-stateful-client/src/CapabilitiesSubscriber.js.map +1 -1
  15. package/dist/dist-esm/calling-stateful-client/src/index-public.d.ts +1 -1
  16. package/dist/dist-esm/calling-stateful-client/src/index-public.js.map +1 -1
  17. package/dist/dist-esm/react-components/src/components/ImageGallery.js +6 -10
  18. package/dist/dist-esm/react-components/src/components/ImageGallery.js.map +1 -1
  19. package/dist/dist-esm/react-components/src/components/RemoteVideoTile.d.ts +2 -1
  20. package/dist/dist-esm/react-components/src/components/RemoteVideoTile.js +2 -1
  21. package/dist/dist-esm/react-components/src/components/RemoteVideoTile.js.map +1 -1
  22. package/dist/dist-esm/react-components/src/components/VideoGallery/useVideoTileContextualMenuProps.d.ts +1 -0
  23. package/dist/dist-esm/react-components/src/components/VideoGallery/useVideoTileContextualMenuProps.js +4 -1
  24. package/dist/dist-esm/react-components/src/components/VideoGallery/useVideoTileContextualMenuProps.js.map +1 -1
  25. package/dist/dist-esm/react-components/src/components/VideoGallery.js +21 -2
  26. package/dist/dist-esm/react-components/src/components/VideoGallery.js.map +1 -1
  27. package/dist/dist-esm/react-components/src/components/styles/ImageGallery.style.d.ts +9 -7
  28. package/dist/dist-esm/react-components/src/components/styles/ImageGallery.style.js +31 -37
  29. package/dist/dist-esm/react-components/src/components/styles/ImageGallery.style.js.map +1 -1
  30. package/dist/dist-esm/react-components/src/components/styles/MentionPopover.style.d.ts +0 -5
  31. package/dist/dist-esm/react-components/src/components/styles/MentionPopover.style.js +4 -7
  32. package/dist/dist-esm/react-components/src/components/styles/MentionPopover.style.js.map +1 -1
  33. package/dist/dist-esm/react-components/src/theming/themes.d.ts +22 -3
  34. package/dist/dist-esm/react-components/src/theming/themes.js +16 -0
  35. package/dist/dist-esm/react-components/src/theming/themes.js.map +1 -1
  36. package/dist/dist-esm/react-composites/src/composites/CallComposite/CallComposite.js +23 -5
  37. package/dist/dist-esm/react-composites/src/composites/CallComposite/CallComposite.js.map +1 -1
  38. package/dist/dist-esm/react-composites/src/composites/CallComposite/Strings.d.ts +5 -0
  39. package/dist/dist-esm/react-composites/src/composites/CallComposite/Strings.js.map +1 -1
  40. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CallArrangement.d.ts +2 -0
  41. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CallArrangement.js +17 -6
  42. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CallArrangement.js.map +1 -1
  43. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CapabilitiesChangedNotificationBar.d.ts +88 -0
  44. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CapabilitiesChangedNotificationBar.js +86 -0
  45. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CapabilitiesChangedNotificationBar.js.map +1 -0
  46. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/buttons/Camera.js +10 -2
  47. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/buttons/Camera.js.map +1 -1
  48. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/buttons/Microphone.js +10 -2
  49. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/buttons/Microphone.js.map +1 -1
  50. package/dist/dist-esm/react-composites/src/composites/CallComposite/index.d.ts +1 -0
  51. package/dist/dist-esm/react-composites/src/composites/CallComposite/index.js.map +1 -1
  52. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/CallPage.d.ts +2 -0
  53. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/CallPage.js +3 -1
  54. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/CallPage.js.map +1 -1
  55. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/ConfigurationPage.d.ts +2 -0
  56. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/ConfigurationPage.js.map +1 -1
  57. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/HoldPage.d.ts +2 -0
  58. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/HoldPage.js.map +1 -1
  59. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/LobbyPage.d.ts +2 -0
  60. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/LobbyPage.js.map +1 -1
  61. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/baseSelectors.d.ts +5 -0
  62. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/baseSelectors.js +9 -1
  63. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/baseSelectors.js.map +1 -1
  64. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/capabilitiesChangedInfoAndRoleSelector.d.ts +12 -0
  65. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/capabilitiesChangedInfoAndRoleSelector.js +14 -0
  66. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/capabilitiesChangedInfoAndRoleSelector.js.map +1 -0
  67. package/dist/dist-esm/react-composites/src/composites/CallComposite/types/CapabilityChangedNotificationTracking.d.ts +9 -0
  68. package/dist/dist-esm/react-composites/src/composites/CallComposite/types/CapabilityChangedNotificationTracking.js +4 -0
  69. package/dist/dist-esm/react-composites/src/composites/CallComposite/types/CapabilityChangedNotificationTracking.js.map +1 -0
  70. package/dist/dist-esm/react-composites/src/composites/CallComposite/utils/TrackCapabilityChangedNotifications.d.ts +33 -0
  71. package/dist/dist-esm/react-composites/src/composites/CallComposite/utils/TrackCapabilityChangedNotifications.js +99 -0
  72. package/dist/dist-esm/react-composites/src/composites/CallComposite/utils/TrackCapabilityChangedNotifications.js.map +1 -0
  73. package/dist/dist-esm/react-composites/src/composites/common/icons.d.ts +13 -0
  74. package/dist/dist-esm/react-composites/src/composites/common/icons.js +6 -0
  75. package/dist/dist-esm/react-composites/src/composites/common/icons.js.map +1 -1
  76. package/dist/dist-esm/react-composites/src/composites/localization/locales/en-US/strings.json +15 -1
  77. package/package.json +8 -8
@@ -178,7 +178,7 @@ const _isValidIdentifier = (identifier) => {
178
178
  // Copyright (c) Microsoft Corporation.
179
179
  // Licensed under the MIT license.
180
180
  // GENERATED FILE. DO NOT EDIT MANUALLY.
181
- var telemetryVersion = '1.7.1-alpha-202308290013';
181
+ var telemetryVersion = '1.7.1-alpha-202308310013';
182
182
 
183
183
  // Copyright (c) Microsoft Corporation.
184
184
  /**
@@ -335,7 +335,7 @@ const getDeviceManager$1 = (state) => state.deviceManager;
335
335
  /**
336
336
  * @private
337
337
  */
338
- const getRole = (state, props) => {
338
+ const getRole$1 = (state, props) => {
339
339
  var _a;
340
340
  /* @conditional-compile-remove(rooms) */
341
341
  return (_a = state.calls[props.callId]) === null || _a === void 0 ? void 0 : _a.role;
@@ -344,7 +344,7 @@ const getRole = (state, props) => {
344
344
  /**
345
345
  * @private
346
346
  */
347
- const getCapabilites = (state, props) => { var _a, _b; return (_b = (_a = state.calls[props.callId]) === null || _a === void 0 ? void 0 : _a.capabilities) === null || _b === void 0 ? void 0 : _b.capabilities; };
347
+ const getCapabilites = (state, props) => { var _a, _b; return (_b = (_a = state.calls[props.callId]) === null || _a === void 0 ? void 0 : _a.capabilitiesFeature) === null || _b === void 0 ? void 0 : _b.capabilities; };
348
348
  /**
349
349
  * @private
350
350
  */
@@ -567,7 +567,7 @@ const microphoneButtonSelector = reselect__namespace.createSelector([
567
567
  getIsMuted,
568
568
  getDeviceManager$1,
569
569
  /* @conditional-compile-remove(capabilities) */ getCapabilites,
570
- /* @conditional-compile-remove(capabilities) */ getRole
570
+ /* @conditional-compile-remove(capabilities) */ getRole$1
571
571
  ], (callExists, isMuted, deviceManager,
572
572
  /* @conditional-compile-remove(capabilities) */ capabilities,
573
573
  /* @conditional-compile-remove(capabilities) */ role) => {
@@ -593,7 +593,7 @@ const cameraButtonSelector = reselect__namespace.createSelector([
593
593
  getLocalVideoStreams$1,
594
594
  getDeviceManager$1,
595
595
  /* @conditional-compile-remove(capabilities) */ getCapabilites,
596
- /* @conditional-compile-remove(capabilities) */ getRole
596
+ /* @conditional-compile-remove(capabilities) */ getRole$1
597
597
  ], (localVideoStreams, deviceManager,
598
598
  /* @conditional-compile-remove(capabilities) */ capabilities,
599
599
  /* @conditional-compile-remove(capabilities) */ role) => {
@@ -635,7 +635,7 @@ const screenShareButtonSelector = reselect__namespace.createSelector([
635
635
  getIsScreenSharingOn,
636
636
  /* @conditional-compile-remove(PSTN-calls) */ getCallState,
637
637
  /* @conditional-compile-remove(capabilities) */ getCapabilites,
638
- /* @conditional-compile-remove(capabilities) */ getRole
638
+ /* @conditional-compile-remove(capabilities) */ getRole$1
639
639
  ], (isScreenSharingOn,
640
640
  /* @conditional-compile-remove(PSTN-calls) */ callState,
641
641
  /* @conditional-compile-remove(capabilities) */ capabilities,
@@ -2028,11 +2028,11 @@ class CallContext$2 {
2028
2028
  });
2029
2029
  }
2030
2030
  /* @conditional-compile-remove(capabilities) */
2031
- setCapabilities(callId, capabilities) {
2031
+ setCapabilities(callId, capabilities, capabilitiesChangeInfo) {
2032
2032
  this.modifyState((draft) => {
2033
2033
  const call = draft.calls[this._callIdHistory.latestCallId(callId)];
2034
2034
  if (call) {
2035
- call.capabilities = { capabilities: capabilities };
2035
+ call.capabilitiesFeature = { capabilities, latestCapabilitiesChangeInfo: capabilitiesChangeInfo };
2036
2036
  }
2037
2037
  });
2038
2038
  }
@@ -3559,8 +3559,8 @@ class CapabilitiesSubscriber {
3559
3559
  this.unsubscribe = () => {
3560
3560
  this._capabilitiesFeature.off('capabilitiesChanged', this.capabilitiesChanged);
3561
3561
  };
3562
- this.capabilitiesChanged = () => {
3563
- this._context.setCapabilities(this._callIdRef.callId, this._capabilitiesFeature.capabilities);
3562
+ this.capabilitiesChanged = (data) => {
3563
+ this._context.setCapabilities(this._callIdRef.callId, this._capabilitiesFeature.capabilities, data);
3564
3564
  };
3565
3565
  this._callIdRef = callIdRef;
3566
3566
  this._context = context;
@@ -5960,6 +5960,14 @@ const lightTheme = {
5960
5960
  /* @conditional-compile-remove(raise-hand) */
5961
5961
  raiseHandGold: '#eaa300'
5962
5962
  },
5963
+ /* @conditional-compile-remove(image-gallery) */
5964
+ chatPalette: {
5965
+ modalOverlayBlack: '#000000',
5966
+ modalTitleWhite: '#ffffff',
5967
+ modalButtonBackground: '#1b1a19',
5968
+ modalButtonBackgroundHover: '#252423',
5969
+ modalButtonBackgroundActive: '#292827'
5970
+ },
5963
5971
  semanticColors: {
5964
5972
  errorText: '#a80000'
5965
5973
  }
@@ -6002,6 +6010,14 @@ const darkTheme = {
6002
6010
  /* @conditional-compile-remove(raise-hand) */
6003
6011
  raiseHandGold: '#eaa300'
6004
6012
  },
6013
+ /* @conditional-compile-remove(image-gallery) */
6014
+ chatPalette: {
6015
+ modalOverlayBlack: '#000000',
6016
+ modalTitleWhite: '#ffffff',
6017
+ modalButtonBackground: '#1b1a19',
6018
+ modalButtonBackgroundHover: '#252423',
6019
+ modalButtonBackgroundActive: '#292827'
6020
+ },
6005
6021
  semanticColors: {
6006
6022
  errorText: '#f1707b'
6007
6023
  }
@@ -7294,11 +7310,6 @@ const unEscapeHtmlCharacters = (text) => {
7294
7310
  };
7295
7311
 
7296
7312
  // Copyright (c) Microsoft Corporation.
7297
- /**
7298
- * @private
7299
- * z-index to ensure that chat container has lower z-index than mention popover
7300
- */
7301
- const CHAT_CONTAINER_ZINDEX$1 = 1;
7302
7313
  /**
7303
7314
  * @private
7304
7315
  */
@@ -7306,8 +7317,10 @@ const mentionPopoverContainerStyle = (theme) => react.mergeStyles({
7306
7317
  boxShadow: theme.effects.elevation16,
7307
7318
  background: theme.semanticColors.bodyBackground,
7308
7319
  overflow: 'visible',
7309
- // zIndex to set the mentionPopover above the chat container
7310
- zIndex: CHAT_CONTAINER_ZINDEX$1 + 1
7320
+ // zIndex to set the mentionPopover
7321
+ // Temporary set to a hardcoded high number to make sure it is on top of the other components
7322
+ // Will be replaced by a proper z-index solution after the Fluent 9 migration
7323
+ zIndex: 10000
7311
7324
  });
7312
7325
  /**
7313
7326
  * @private
@@ -8523,15 +8536,14 @@ const cancelIcon = { iconName: 'Cancel' };
8523
8536
  const downloadIcon = {
8524
8537
  iconName: 'Download'
8525
8538
  };
8539
+ /* @conditional-compile-remove(image-gallery) */
8526
8540
  /**
8527
8541
  * @private
8528
8542
  */
8529
- const overlayStyles = (theme, isDarkThemed) => {
8543
+ const overlayStyles = (theme) => {
8530
8544
  return {
8531
8545
  root: {
8532
- // The overlay background color should always be black in both light and dark theme.
8533
- // In dark theme, theme.palette.white is actually black.
8534
- background: isDarkThemed ? theme.palette.white : theme.palette.black,
8546
+ background: theme.chatPalette.modalOverlayBlack,
8535
8547
  opacity: '0.85'
8536
8548
  }
8537
8549
  };
@@ -8581,14 +8593,15 @@ const titleBarContainerStyle = {
8581
8593
  alignContent: 'center',
8582
8594
  alignItems: 'center'
8583
8595
  };
8596
+ /* @conditional-compile-remove(image-gallery) */
8584
8597
  /**
8585
8598
  * @private
8586
8599
  */
8587
- const titleStyle$2 = (theme, isDarkThemed) => {
8600
+ const titleStyle$2 = (theme) => {
8588
8601
  return {
8589
8602
  paddingLeft: '0.5rem',
8590
8603
  marginLeft: '0.5rem',
8591
- color: isDarkThemed ? undefined : theme.palette.white,
8604
+ color: theme.chatPalette.modalTitleWhite,
8592
8605
  fontFamily: 'inherit',
8593
8606
  fontSize: '0.875rem',
8594
8607
  fontStyle: 'normal',
@@ -8646,38 +8659,37 @@ const normalImageStyle = {
8646
8659
  maxHeight: '100%',
8647
8660
  maxWidth: '100%'
8648
8661
  };
8662
+ /* @conditional-compile-remove(image-gallery) */
8649
8663
  /**
8650
8664
  * @private
8651
8665
  */
8652
- const brokenImageStyle = (theme, isDarkThemed) => {
8666
+ const brokenImageStyle = (theme) => {
8653
8667
  return {
8654
- // The color should be white in dark theme.
8655
- // In dark theme, theme.palette.black is actually white.
8656
- color: isDarkThemed ? theme.palette.black : theme.palette.white
8668
+ color: theme.chatPalette.modalTitleWhite
8657
8669
  };
8658
8670
  };
8671
+ /* @conditional-compile-remove(image-gallery) */
8659
8672
  /**
8660
8673
  * @private
8661
8674
  */
8662
- const closeButtonStyles = (theme, isDarkThemed) => {
8675
+ const closeButtonStyles = (theme) => {
8663
8676
  return {
8664
- // The color should be white in dark theme.
8665
- // In dark theme, theme.palette.black is actually white.
8666
- color: isDarkThemed ? theme.palette.black : theme.palette.white,
8677
+ color: theme.chatPalette.modalTitleWhite,
8667
8678
  ':hover': {
8668
- color: isDarkThemed ? theme.palette.black : theme.palette.white,
8669
- backgroundColor: isDarkThemed ? undefined : theme.palette.neutralPrimaryAlt
8679
+ color: theme.chatPalette.modalTitleWhite,
8680
+ backgroundColor: theme.chatPalette.modalButtonBackgroundHover
8670
8681
  },
8671
8682
  ':active': {
8672
- color: isDarkThemed ? theme.palette.black : theme.palette.white,
8673
- backgroundColor: isDarkThemed ? undefined : theme.palette.neutralDark
8683
+ color: theme.chatPalette.modalTitleWhite,
8684
+ backgroundColor: theme.chatPalette.modalButtonBackgroundActive
8674
8685
  }
8675
8686
  };
8676
8687
  };
8688
+ /* @conditional-compile-remove(image-gallery) */
8677
8689
  /**
8678
8690
  * @private
8679
8691
  */
8680
- const downloadButtonStyle = (theme, isDarkThemed) => {
8692
+ const downloadButtonStyle = (theme) => {
8681
8693
  return {
8682
8694
  margin: '0 0.5rem',
8683
8695
  height: '32px',
@@ -8686,43 +8698,38 @@ const downloadButtonStyle = (theme, isDarkThemed) => {
8686
8698
  fontWeight: 600,
8687
8699
  padding: '0.38rem 0.75rem',
8688
8700
  borderRadius: '4px',
8689
- backgroundColor: isDarkThemed ? theme.palette.neutralLighterAlt : theme.palette.neutralPrimary,
8690
- color: isDarkThemed ? undefined : theme.palette.white,
8701
+ backgroundColor: theme.chatPalette.modalButtonBackground,
8702
+ color: theme.chatPalette.modalTitleWhite,
8691
8703
  whiteSpace: 'nowrap',
8692
8704
  ':hover': {
8693
- // The color should be white in dark theme.
8694
- // In dark theme, theme.palette.black is actually white.
8695
- color: isDarkThemed ? theme.palette.black : theme.palette.white,
8696
- backgroundColor: isDarkThemed ? undefined : theme.palette.neutralPrimaryAlt
8705
+ color: theme.chatPalette.modalTitleWhite,
8706
+ backgroundColor: theme.chatPalette.modalButtonBackgroundHover
8697
8707
  },
8698
8708
  ':active': {
8699
- // The color should be white in dark theme.
8700
- // In dark theme, theme.palette.black is actually white.
8701
- color: isDarkThemed ? theme.palette.black : theme.palette.white,
8702
- backgroundColor: isDarkThemed ? undefined : theme.palette.neutralDark
8709
+ color: theme.chatPalette.modalTitleWhite,
8710
+ backgroundColor: theme.chatPalette.modalButtonBackgroundActive
8703
8711
  },
8704
8712
  '@media (max-width: 25rem)': {
8705
8713
  display: 'none'
8706
8714
  }
8707
8715
  };
8708
8716
  };
8717
+ /* @conditional-compile-remove(image-gallery) */
8709
8718
  /**
8710
8719
  * @private
8711
8720
  */
8712
- const smallDownloadButtonContainerStyle = (theme, isDarkThemed) => {
8721
+ const smallDownloadButtonContainerStyle = (theme) => {
8713
8722
  return {
8714
8723
  marginRight: '0.5rem',
8715
- // The color should be white in dark theme.
8716
- // In dark theme, theme.palette.black is actually white.
8717
- color: isDarkThemed ? theme.palette.black : theme.palette.white,
8724
+ color: theme.chatPalette.modalTitleWhite,
8718
8725
  whiteSpace: 'nowrap',
8719
8726
  ':hover': {
8720
- color: isDarkThemed ? theme.palette.black : theme.palette.white,
8721
- backgroundColor: isDarkThemed ? undefined : theme.palette.neutralPrimaryAlt
8727
+ color: theme.chatPalette.modalTitleWhite,
8728
+ backgroundColor: theme.chatPalette.modalButtonBackgroundHover
8722
8729
  },
8723
8730
  ':active': {
8724
- color: isDarkThemed ? theme.palette.black : theme.palette.white,
8725
- backgroundColor: isDarkThemed ? undefined : theme.palette.neutralDark
8731
+ color: theme.chatPalette.modalTitleWhite,
8732
+ backgroundColor: theme.chatPalette.modalButtonBackgroundActive
8726
8733
  },
8727
8734
  '@media (min-width: 25rem)': {
8728
8735
  display: 'none'
@@ -8740,13 +8747,11 @@ const smallDownloadButtonContainerStyle = (theme, isDarkThemed) => {
8740
8747
  const ImageGallery = (props) => {
8741
8748
  const { isOpen, images, onImageDownloadButtonClicked, onDismiss, onError, startIndex = 0 } = props;
8742
8749
  const theme = useTheme();
8743
- const isDarkTheme = isDarkThemed(theme);
8744
8750
  /* @conditional-compile-remove(image-gallery) */
8745
8751
  const localeStrings = useLocale$1().strings.imageGallery;
8746
8752
  const [isImageLoaded, setIsImageLoaded] = React.useState(true);
8747
- const imageStyle = isImageLoaded ? normalImageStyle : brokenImageStyle(theme, isDarkTheme);
8753
+ const imageStyle = isImageLoaded ? normalImageStyle : brokenImageStyle(theme);
8748
8754
  if (images.length <= startIndex) {
8749
- console.log('Unable to display Image Gallery due to startIndex is out of range.');
8750
8755
  return React__default['default'].createElement(React__default['default'].Fragment, null);
8751
8756
  }
8752
8757
  const image = images[startIndex];
@@ -8754,13 +8759,13 @@ const ImageGallery = (props) => {
8754
8759
  return (React__default['default'].createElement(react.Stack, { className: react.mergeStyles(headerStyle) },
8755
8760
  React__default['default'].createElement(react.Stack, { className: react.mergeStyles(titleBarContainerStyle) },
8756
8761
  image.titleIcon,
8757
- React__default['default'].createElement(react.Stack.Item, { className: react.mergeStyles(titleStyle$2(theme, isDarkTheme)), "aria-label": image.title }, image.title)),
8762
+ React__default['default'].createElement(react.Stack.Item, { className: react.mergeStyles(titleStyle$2(theme)), "aria-label": image.title }, image.title)),
8758
8763
  React__default['default'].createElement(react.Stack, { className: react.mergeStyles(controlBarContainerStyle) },
8759
- React__default['default'].createElement(react.DefaultButton, { className: react.mergeStyles(downloadButtonStyle(theme, isDarkTheme)),
8764
+ React__default['default'].createElement(react.DefaultButton, { className: react.mergeStyles(downloadButtonStyle(theme)),
8760
8765
  /* @conditional-compile-remove(image-gallery) */
8761
8766
  text: localeStrings.downloadButtonLabel, onClick: () => onImageDownloadButtonClicked(image.imageUrl, image.saveAsName), onRenderIcon: () => React__default['default'].createElement(react.Icon, { iconName: downloadIcon.iconName, className: react.mergeStyles(downloadIconStyle) }), "aria-live": 'polite', "aria-label": localeStrings.downloadButtonLabel }),
8762
- React__default['default'].createElement(react.IconButton, { iconProps: downloadIcon, className: react.mergeStyles(smallDownloadButtonContainerStyle(theme, isDarkTheme)), onClick: () => onImageDownloadButtonClicked(image.imageUrl, image.saveAsName), "aria-label": localeStrings.downloadButtonLabel, "aria-live": 'polite' }),
8763
- React__default['default'].createElement(react.IconButton, { iconProps: cancelIcon, className: react.mergeStyles(closeButtonStyles(theme, isDarkTheme)), onClick: onDismiss,
8767
+ React__default['default'].createElement(react.IconButton, { iconProps: downloadIcon, className: react.mergeStyles(smallDownloadButtonContainerStyle(theme)), onClick: () => onImageDownloadButtonClicked(image.imageUrl, image.saveAsName), "aria-label": localeStrings.downloadButtonLabel, "aria-live": 'polite' }),
8768
+ React__default['default'].createElement(react.IconButton, { iconProps: cancelIcon, className: react.mergeStyles(closeButtonStyles(theme)), onClick: onDismiss,
8764
8769
  /* @conditional-compile-remove(image-gallery) */
8765
8770
  ariaLabel: localeStrings.dismissButtonAriaLabel, "aria-live": 'polite' }))));
8766
8771
  };
@@ -8781,7 +8786,7 @@ const ImageGallery = (props) => {
8781
8786
  event.persist();
8782
8787
  } }))));
8783
8788
  };
8784
- return (React__default['default'].createElement(react.Modal, { titleAriaId: image.title, isOpen: isOpen, onDismiss: onDismiss, overlay: { styles: Object.assign({}, overlayStyles(theme, isDarkTheme)) }, styles: { main: focusTrapZoneStyle, scrollableContent: scrollableContentStyle }, isDarkOverlay: true },
8789
+ return (React__default['default'].createElement(react.Modal, { titleAriaId: image.title, isOpen: isOpen, onDismiss: onDismiss, overlay: { styles: Object.assign({}, overlayStyles(theme)) }, styles: { main: focusTrapZoneStyle, scrollableContent: scrollableContentStyle }, isDarkOverlay: true },
8785
8790
  renderHeaderBar(),
8786
8791
  renderBodyWithLightDismiss()));
8787
8792
  };
@@ -11897,7 +11902,7 @@ const useRemoteVideoStreamLifecycleMaintainer = (props) => {
11897
11902
  */
11898
11903
  const useVideoTileContextualMenuProps = (props) => {
11899
11904
  var _a;
11900
- const { remoteParticipant, view, strings, isPinned, onPinParticipant, onUnpinParticipant, disablePinMenuItem, toggleAnnouncerString } = props;
11905
+ const { remoteParticipant, view, strings, isPinned, onPinParticipant, onUnpinParticipant, onUpdateScalingMode, disablePinMenuItem, toggleAnnouncerString } = props;
11901
11906
  const scalingMode = React.useMemo(() => {
11902
11907
  var _a;
11903
11908
  /* @conditional-compile-remove(pinned-participants) */
@@ -11965,6 +11970,7 @@ const useVideoTileContextualMenuProps = (props) => {
11965
11970
  styles: { root: { lineHeight: '1rem', textAlign: 'center' } }
11966
11971
  },
11967
11972
  onClick: () => {
11973
+ onUpdateScalingMode === null || onUpdateScalingMode === void 0 ? void 0 : onUpdateScalingMode(remoteParticipant.userId, 'Fit');
11968
11974
  view === null || view === void 0 ? void 0 : view.updateScalingMode('Fit');
11969
11975
  },
11970
11976
  'data-ui-id': 'video-tile-fit-to-frame',
@@ -11981,6 +11987,7 @@ const useVideoTileContextualMenuProps = (props) => {
11981
11987
  styles: { root: { lineHeight: '1rem', textAlign: 'center' } }
11982
11988
  },
11983
11989
  onClick: () => {
11990
+ onUpdateScalingMode === null || onUpdateScalingMode === void 0 ? void 0 : onUpdateScalingMode(remoteParticipant.userId, 'Crop');
11984
11991
  view === null || view === void 0 ? void 0 : view.updateScalingMode('Crop');
11985
11992
  },
11986
11993
  'data-ui-id': 'video-tile-fill-frame',
@@ -12000,6 +12007,7 @@ const useVideoTileContextualMenuProps = (props) => {
12000
12007
  isPinned,
12001
12008
  onPinParticipant,
12002
12009
  onUnpinParticipant,
12010
+ onUpdateScalingMode,
12003
12011
  remoteParticipant.userId,
12004
12012
  remoteParticipant.displayName,
12005
12013
  disablePinMenuItem,
@@ -12437,7 +12445,7 @@ const bracketedParticipantString = (participantString, withBrackets) => {
12437
12445
  const _RemoteVideoTile = React__default['default'].memo((props) => {
12438
12446
  var _a;
12439
12447
  const { isAvailable, isReceiving = true, // default to true to prevent any breaking change
12440
- isScreenSharingOn, onCreateRemoteStreamView, onDisposeRemoteStreamView, remoteVideoViewOptions, renderElement, userId, onRenderAvatar, showMuteIndicator, remoteParticipant, participantState, menuKind, isPinned, onPinParticipant, onUnpinParticipant, disablePinMenuItem, toggleAnnouncerString, strings } = props;
12448
+ isScreenSharingOn, onCreateRemoteStreamView, onDisposeRemoteStreamView, remoteVideoViewOptions, renderElement, userId, onRenderAvatar, showMuteIndicator, remoteParticipant, participantState, menuKind, isPinned, onPinParticipant, onUnpinParticipant, onUpdateScalingMode, disablePinMenuItem, toggleAnnouncerString, strings } = props;
12441
12449
  const remoteVideoStreamProps = React.useMemo(() => ({
12442
12450
  isMirrored: remoteVideoViewOptions === null || remoteVideoViewOptions === void 0 ? void 0 : remoteVideoViewOptions.isMirrored,
12443
12451
  isScreenSharingOn,
@@ -12469,6 +12477,7 @@ const _RemoteVideoTile = React__default['default'].memo((props) => {
12469
12477
  isPinned,
12470
12478
  onPinParticipant,
12471
12479
  onUnpinParticipant,
12480
+ onUpdateScalingMode,
12472
12481
  disablePinMenuItem,
12473
12482
  toggleAnnouncerString
12474
12483
  });
@@ -14906,6 +14915,15 @@ const VideoGallery = (props) => {
14906
14915
  /* @conditional-compile-remove(pinned-participants) */
14907
14916
  const [pinnedParticipantsState, setPinnedParticipantsState] = React__default['default'].useState([]);
14908
14917
  /* @conditional-compile-remove(pinned-participants) */
14918
+ const [selectedScalingModeState, setselectedScalingModeState] = React__default['default'].useState({});
14919
+ /* @conditional-compile-remove(pinned-participants) */
14920
+ const onUpdateScalingMode = React.useCallback((remoteUserId, scalingMode) => {
14921
+ setselectedScalingModeState((current) => (Object.assign(Object.assign({}, current), { [remoteUserId]: {
14922
+ scalingMode,
14923
+ isMirrored: remoteVideoViewOptions === null || remoteVideoViewOptions === void 0 ? void 0 : remoteVideoViewOptions.isMirrored
14924
+ } })));
14925
+ }, [remoteVideoViewOptions === null || remoteVideoViewOptions === void 0 ? void 0 : remoteVideoViewOptions.isMirrored]);
14926
+ /* @conditional-compile-remove(pinned-participants) */
14909
14927
  React.useEffect(() => {
14910
14928
  var _a;
14911
14929
  (_a = props.pinnedParticipants) === null || _a === void 0 ? void 0 : _a.forEach((pinParticipant) => {
@@ -14995,10 +15013,16 @@ const VideoGallery = (props) => {
14995
15013
  const defaultOnRenderVideoTile = React.useCallback((participant, isVideoParticipant) => {
14996
15014
  const remoteVideoStream = participant.videoStream;
14997
15015
  /* @conditional-compile-remove(pinned-participants) */
15016
+ const selectedScalingMode = remoteVideoStream ? selectedScalingModeState[participant.userId] : undefined;
15017
+ /* @conditional-compile-remove(pinned-participants) */
14998
15018
  const isPinned = pinnedParticipants === null || pinnedParticipants === void 0 ? void 0 : pinnedParticipants.includes(participant.userId);
14999
15019
  const createViewOptions = () => {
15000
15020
  var _a, _b;
15001
15021
  /* @conditional-compile-remove(pinned-participants) */
15022
+ if (selectedScalingMode) {
15023
+ return selectedScalingMode;
15024
+ }
15025
+ /* @conditional-compile-remove(pinned-participants) */
15002
15026
  return (remoteVideoStream === null || remoteVideoStream === void 0 ? void 0 : remoteVideoStream.streamSize) &&
15003
15027
  ((_a = remoteVideoStream.streamSize) === null || _a === void 0 ? void 0 : _a.height) > ((_b = remoteVideoStream.streamSize) === null || _b === void 0 ? void 0 : _b.width)
15004
15028
  ? {
@@ -15025,6 +15049,8 @@ const VideoGallery = (props) => {
15025
15049
  /* @conditional-compile-remove(pinned-participants) */
15026
15050
  onUnpinParticipant: onUnpinParticipant,
15027
15051
  /* @conditional-compile-remove(pinned-participants) */
15052
+ onUpdateScalingMode: onUpdateScalingMode,
15053
+ /* @conditional-compile-remove(pinned-participants) */
15028
15054
  isPinned: isPinned,
15029
15055
  /* @conditional-compile-remove(pinned-participants) */
15030
15056
  disablePinMenuItem: pinnedParticipants.length >= MAX_PINNED_REMOTE_VIDEO_TILES,
@@ -15038,12 +15064,14 @@ const VideoGallery = (props) => {
15038
15064
  onRenderAvatar,
15039
15065
  showMuteIndicator,
15040
15066
  strings,
15041
- /* @conditional-compile-remove(pinned-participants) */ drawerMenuHostId,
15067
+ /* @conditional-compile-remove(pinned-participants) */ selectedScalingModeState,
15042
15068
  /* @conditional-compile-remove(pinned-participants) */ remoteVideoTileMenuOptions,
15043
15069
  /* @conditional-compile-remove(pinned-participants) */ pinnedParticipants,
15044
15070
  /* @conditional-compile-remove(pinned-participants) */ onPinParticipant,
15045
15071
  /* @conditional-compile-remove(pinned-participants) */ onUnpinParticipant,
15046
- /* @conditional-compile-remove(pinned-participants) */ toggleAnnouncerString
15072
+ /* @conditional-compile-remove(pinned-participants) */ toggleAnnouncerString,
15073
+ /* @conditional-compile-remove(pinned-participants) */ drawerMenuHostId,
15074
+ /* @conditional-compile-remove(pinned-participants) */ onUpdateScalingMode
15047
15075
  ]);
15048
15076
  const screenShareParticipant = remoteParticipants.find((participant) => { var _a; return (_a = participant.screenShareStream) === null || _a === void 0 ? void 0 : _a.isAvailable; });
15049
15077
  const localScreenShareStreamComponent = React__default['default'].createElement(LocalScreenShare, { localParticipant: localParticipant });
@@ -17827,7 +17855,7 @@ const videoGallerySelector = reselect.createSelector([
17827
17855
  /* @conditional-compile-remove(optimal-video-count) */
17828
17856
  getOptimalVideoCount,
17829
17857
  /* @conditional-compile-remove(rooms) */
17830
- getRole,
17858
+ getRole$1,
17831
17859
  /* @conditional-compile-remove(raise-hand) */
17832
17860
  getLocalParticipantRaisedHand$1
17833
17861
  ], (screenShareRemoteParticipantId, remoteParticipants, localVideoStreams, isMuted, isScreenSharingOn, displayName, identifier, dominantSpeakers,
@@ -17954,7 +17982,7 @@ const participantListSelector = reselect.createSelector([
17954
17982
  getIsScreenSharingOn,
17955
17983
  getIsMuted,
17956
17984
  /* @conditional-compile-remove(raise-hand) */ getLocalParticipantRaisedHand$1,
17957
- getRole,
17985
+ getRole$1,
17958
17986
  getParticipantCount
17959
17987
  ], (userId, displayName, remoteParticipants, isScreenSharingOn, isMuted,
17960
17988
  /* @conditional-compile-remove(raise-hand) */
@@ -20275,6 +20303,10 @@ const COMPOSITE_ONLY_ICONS = {
20275
20303
  LocalCameraSwitch: React__default['default'].createElement(reactIcons.CameraSwitch24Regular, null),
20276
20304
  ControlBarChatButtonActive: React__default['default'].createElement(reactIcons.Chat20Filled, null),
20277
20305
  ControlBarChatButtonInactive: React__default['default'].createElement(reactIcons.Chat20Regular, null),
20306
+ /* @conditional-compile-remove(capabilities) */
20307
+ ControlButtonCameraProhibited: React__default['default'].createElement(reactIcons.VideoProhibited20Filled, null),
20308
+ /* @conditional-compile-remove(capabilities) */
20309
+ ControlButtonMicProhibited: React__default['default'].createElement(reactIcons.MicProhibited20Filled, null),
20278
20310
  ControlBarPeopleButton: React__default['default'].createElement(reactIcons.People20Regular, null),
20279
20311
  MoreDrawerMicrophones: React__default['default'].createElement(reactIcons.Mic20Regular, null),
20280
20312
  MoreDrawerPeople: React__default['default'].createElement(reactIcons.People20Regular, null),
@@ -20345,7 +20377,7 @@ const CallCompositeIcon = (props) => (React__default['default'].createElement(re
20345
20377
  */
20346
20378
  const CallWithChatCompositeIcon = (props) => (React__default['default'].createElement(react.FontIcon, Object.assign({}, props)));
20347
20379
 
20348
- var call$k={cameraLabel:"Camera",noCamerasLabel:"No cameras found",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",videoEffectsPaneTitle:"Effects",videoEffectsPaneBackgroundSelectionTitle:"Background",configurationPageVideoEffectsButtonLabel:"Effects",unableToStartVideoEffect:"Unable to apply video effect.",blurBackgroundEffectButtonLabel:"Blur",blurBackgroundTooltip:"Blur Background",removeBackgroundEffectButtonLabel:"None",removeBackgroundTooltip:"Remove Background",cameraOffBackgroundEffectWarningText:"Your camera is off. Turn on camera to see video effect.",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",leavingCallTitle:"Leaving...",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",selectedPeopleButtonLabel:"People Button Selected",peoplePaneTitle:"People",peopleButtonTooltipOpen:"Show participants",peopleButtonTooltipClose:"Hide participants",peoplePaneSubTitle:"In this call {numberOfPeople}",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",noMicrophonesLabel:"No microphones found",noSpeakersLabel:"No speakers found",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",outboundCallingNoticeString:"Calling...",participantJoinedNoticeString:"{displayName} joined",twoParticipantJoinedNoticeString:"{displayName1} and {displayName2} have joined",threeParticipantJoinedNoticeString:"{displayName1}, {displayName2} and {displayName3} have joined",participantLeftNoticeString:"{displayName} left",twoParticipantLeftNoticeString:"{displayName1} and {displayName2} have left",threeParticipantLeftNoticeString:"{displayName1}, {displayName2} and {displayName3} have left",unnamedParticipantString:"unnamed participant",manyUnnamedParticipantsJoined:"unnamed participant and {numOfParticipants} other participants joined",manyUnnamedParticipantsLeft:"unnamed participant and {numOfParticipants} other participants left",manyParticipantsJoined:"{displayName1}, {displayName2}, {displayName3} and {numOfParticipants} other participants joined",manyParticipantsLeft:"{displayName1}, {displayName2}, {displayName3} and {numOfParticipants} other participants left",liveCaptionsLabel:"Live captions",captionsSettingsLabel:"Caption settings",startCaptionsButtonOnLabel:"Turn on captions",startCaptionsButtonOffLabel:"Turn off captions",startCaptionsButtonTooltipOnContent:"Turn off captions",startCaptionsButtonTooltipOffContent:"Turn on captions",captionsSettingsModalTitle:"Captions Settings",captionsSettingsSpokenLanguageDropdownLabel:"Spoken language",captionsSettingsCaptionLanguageDropdownLabel:"Captions language",captionsSettingsSpokenLanguageDropdownInfoText:"Language that everyone on this call is speaking.",captionsSettingsCaptionLanguageDropdownInfoText:"Captions will appear in this langugage.",captionsSettingsConfirmButtonLabel:"Confirm",captionsSettingsCancelButtonLabel:"Cancel",captionsSettingsModalAriaLabel:"Captions Setting Modal",captionsSettingsCloseModalButtonAriaLabel:"Close Captions Setting",captionsBannerMoreButtonCallingLabel:"More",captionsBannerMoreButtonTooltip:"More options",spokenLanguageStrings:{"ar-ae":"Arabic - U.A.E.","ar-sa":"Arabic - Saudi Arabia","da-dk":"Danish","de-de":"German - Germany","en-au":"English - Australia","en-ca":"English - Canada","en-gb":"English - United Kingdom","en-in":"English - India","en-nz":"English - New Zealand","en-us":"English - United States","es-es":"Spanish - Spain (Modern Sort)","es-mx":"Spanish - Mexico","fi-fi":"Finnish","fr-ca":"French - Canada","fr-fr":"French - France","hi-in":"Hindi","it-it":"Italian - Italy","ja-jp":"Japanese","ko-kr":"Korean","nb-no":"Norwegian (Bokmål)","nl-be":"Dutch - Belgium","nl-nl":"Dutch - Netherlands","pl-pl":"Polish","pt-br":"Portuguese - Brazil","ru-ru":"Russian","sv-se":"Swedish","zh-cn":"Chinese - People's Republic of China","zh-hk":"Chinese - Hong Kong SAR","cs-cz":"Czech","pt-pt":"Portuguese - Portugal","tr-tr":"Turkish","vi-vn":"Vietnamese","th-th":"Thai","he-il":"Hebrew","cy-gb":"Welsh","uk-ua":"Ukrainian","el-gr":"Greek","hu-hu":"Hungarian","ro-ro":"Romanian","sk-sk":"Slovak","zh-tw":"Chinese - Taiwan"},captionLanguageStrings:{ar:"Arabic",da:"Danish",de:"German",en:"English",es:"Spanish",fi:"Finnish","fr-ca":"French - Canada",fr:"French - France",hi:"Hindi",it:"Italian",ja:"Japanese",ko:"Korean",nb:"Norwegian (Bokmål)",nl:"Dutch",pl:"Polish",pt:"Portuguese - Brazil",ru:"Russian",sv:"Swedish","zh-Hans":"Chinese (Simplified)","zh-Hant":"Chinese (Traditional)",cs:"Czech","pt-pt":"Portuguese - Portugal",tr:"Turkish",vi:"Vietnamese",th:"Thai",he:"Hebrew",cy:"Welsh",uk:"Ukrainian",el:"Greek",hu:"Hungarian",ro:"Romanian",sk:"Slovak"},captionsBannerSpinnerText:"Starting captions...",transferPageTransferorText:"Transferring...",transferPageTransferTargetText:"Connecting...",transferPageUnknownTransferorDisplayName:"Unknown",transferPageUnknownTransferTargetDisplayName:"Unknown",transferPageNoticeString:"You are being transferred",participantCouldNotBeReachedTitle:"Target participant is currently not available",participantCouldNotBeReachedMoreDetails:"Please contact participant when they are available",permissionToReachTargetParticipantNotAllowedTitle:"Permission to reach target participant is not allowed",permissionToReachTargetParticipantNotAllowedMoreDetails:"Please check that the target participant is in the same tenant",unableToResolveTenantTitle:"Unable to resolve tenant id for the target participant",unableToResolveTenantMoreDetails:"Please check the participant id is entered correctly",participantIdIsMalformedTitle:"Participant id is not in the correct format",participantIdIsMalformedMoreDetails:"Please check that the participant id is in the correct format",moreButtonGalleryControlLabel:"Gallery options",moreButtonGalleryPositionToggleLabel:"Move gallery to top",moreButtonGallerySpeakerLayoutLabel:"Speaker layout",moreButtonGalleryFloatingLocalLayoutLabel:"Dynamic layout",moreButtonGalleryDefaultLayoutLabel:"Gallery layout",moreButtonGalleryFocusedContentLayoutLabel:"Focused content"};var chat$k={chatListHeader:"In this chat",uploadFile:"Upload File"};var callWithChat$k={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",moreDrawerCaptionsMenuTitle:"Live captions",moreDrawerSpokenLanguageMenuTitle:"Spoken language",moreDrawerCaptionLanguageMenuTitle:"Caption language",peopleButtonLabel:"People",selectedPeopleButtonLabel:"People Button Selected",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$k,chat:chat$k,callWithChat:callWithChat$k};
20380
+ var call$k={cameraLabel:"Camera",noCamerasLabel:"No cameras found",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",videoEffectsPaneTitle:"Effects",videoEffectsPaneBackgroundSelectionTitle:"Background",configurationPageVideoEffectsButtonLabel:"Effects",unableToStartVideoEffect:"Unable to apply video effect.",blurBackgroundEffectButtonLabel:"Blur",blurBackgroundTooltip:"Blur Background",removeBackgroundEffectButtonLabel:"None",removeBackgroundTooltip:"Remove Background",cameraOffBackgroundEffectWarningText:"Your camera is off. Turn on camera to see video effect.",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",leavingCallTitle:"Leaving...",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",selectedPeopleButtonLabel:"People Button Selected",peoplePaneTitle:"People",peopleButtonTooltipOpen:"Show participants",peopleButtonTooltipClose:"Hide participants",peoplePaneSubTitle:"In this call {numberOfPeople}",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",noMicrophonesLabel:"No microphones found",noSpeakersLabel:"No speakers found",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",outboundCallingNoticeString:"Calling...",participantJoinedNoticeString:"{displayName} joined",twoParticipantJoinedNoticeString:"{displayName1} and {displayName2} have joined",threeParticipantJoinedNoticeString:"{displayName1}, {displayName2} and {displayName3} have joined",participantLeftNoticeString:"{displayName} left",twoParticipantLeftNoticeString:"{displayName1} and {displayName2} have left",threeParticipantLeftNoticeString:"{displayName1}, {displayName2} and {displayName3} have left",unnamedParticipantString:"unnamed participant",manyUnnamedParticipantsJoined:"unnamed participant and {numOfParticipants} other participants joined",manyUnnamedParticipantsLeft:"unnamed participant and {numOfParticipants} other participants left",manyParticipantsJoined:"{displayName1}, {displayName2}, {displayName3} and {numOfParticipants} other participants joined",manyParticipantsLeft:"{displayName1}, {displayName2}, {displayName3} and {numOfParticipants} other participants left",liveCaptionsLabel:"Live captions",captionsSettingsLabel:"Caption settings",startCaptionsButtonOnLabel:"Turn on captions",startCaptionsButtonOffLabel:"Turn off captions",startCaptionsButtonTooltipOnContent:"Turn off captions",startCaptionsButtonTooltipOffContent:"Turn on captions",captionsSettingsModalTitle:"Captions Settings",captionsSettingsSpokenLanguageDropdownLabel:"Spoken language",captionsSettingsCaptionLanguageDropdownLabel:"Captions language",captionsSettingsSpokenLanguageDropdownInfoText:"Language that everyone on this call is speaking.",captionsSettingsCaptionLanguageDropdownInfoText:"Captions will appear in this langugage.",captionsSettingsConfirmButtonLabel:"Confirm",captionsSettingsCancelButtonLabel:"Cancel",captionsSettingsModalAriaLabel:"Captions Setting Modal",captionsSettingsCloseModalButtonAriaLabel:"Close Captions Setting",captionsBannerMoreButtonCallingLabel:"More",captionsBannerMoreButtonTooltip:"More options",spokenLanguageStrings:{"ar-ae":"Arabic - U.A.E.","ar-sa":"Arabic - Saudi Arabia","da-dk":"Danish","de-de":"German - Germany","en-au":"English - Australia","en-ca":"English - Canada","en-gb":"English - United Kingdom","en-in":"English - India","en-nz":"English - New Zealand","en-us":"English - United States","es-es":"Spanish - Spain (Modern Sort)","es-mx":"Spanish - Mexico","fi-fi":"Finnish","fr-ca":"French - Canada","fr-fr":"French - France","hi-in":"Hindi","it-it":"Italian - Italy","ja-jp":"Japanese","ko-kr":"Korean","nb-no":"Norwegian (Bokmål)","nl-be":"Dutch - Belgium","nl-nl":"Dutch - Netherlands","pl-pl":"Polish","pt-br":"Portuguese - Brazil","ru-ru":"Russian","sv-se":"Swedish","zh-cn":"Chinese - People's Republic of China","zh-hk":"Chinese - Hong Kong SAR","cs-cz":"Czech","pt-pt":"Portuguese - Portugal","tr-tr":"Turkish","vi-vn":"Vietnamese","th-th":"Thai","he-il":"Hebrew","cy-gb":"Welsh","uk-ua":"Ukrainian","el-gr":"Greek","hu-hu":"Hungarian","ro-ro":"Romanian","sk-sk":"Slovak","zh-tw":"Chinese - Taiwan"},captionLanguageStrings:{ar:"Arabic",da:"Danish",de:"German",en:"English",es:"Spanish",fi:"Finnish","fr-ca":"French - Canada",fr:"French - France",hi:"Hindi",it:"Italian",ja:"Japanese",ko:"Korean",nb:"Norwegian (Bokmål)",nl:"Dutch",pl:"Polish",pt:"Portuguese - Brazil",ru:"Russian",sv:"Swedish","zh-Hans":"Chinese (Simplified)","zh-Hant":"Chinese (Traditional)",cs:"Czech","pt-pt":"Portuguese - Portugal",tr:"Turkish",vi:"Vietnamese",th:"Thai",he:"Hebrew",cy:"Welsh",uk:"Ukrainian",el:"Greek",hu:"Hungarian",ro:"Romanian",sk:"Slovak"},captionsBannerSpinnerText:"Starting captions...",transferPageTransferorText:"Transferring...",transferPageTransferTargetText:"Connecting...",transferPageUnknownTransferorDisplayName:"Unknown",transferPageUnknownTransferTargetDisplayName:"Unknown",transferPageNoticeString:"You are being transferred",participantCouldNotBeReachedTitle:"Target participant is currently not available",participantCouldNotBeReachedMoreDetails:"Please contact participant when they are available",permissionToReachTargetParticipantNotAllowedTitle:"Permission to reach target participant is not allowed",permissionToReachTargetParticipantNotAllowedMoreDetails:"Please check that the target participant is in the same tenant",unableToResolveTenantTitle:"Unable to resolve tenant id for the target participant",unableToResolveTenantMoreDetails:"Please check the participant id is entered correctly",participantIdIsMalformedTitle:"Participant id is not in the correct format",participantIdIsMalformedMoreDetails:"Please check that the participant id is in the correct format",moreButtonGalleryControlLabel:"Gallery options",moreButtonGalleryPositionToggleLabel:"Move gallery to top",moreButtonGallerySpeakerLayoutLabel:"Speaker layout",moreButtonGalleryFloatingLocalLayoutLabel:"Dynamic layout",moreButtonGalleryDefaultLayoutLabel:"Gallery layout",moreButtonGalleryFocusedContentLayoutLabel:"Focused content",capabilityChangedNotification:{turnVideoOn:{lostDueToMeetingOption:"Your camera has been disabled. You can no longer share video.",grantedDueToMeetingOption:"Your camera has been enabled. Turn it on if you'd like to share video."},unmuteMic:{lostDueToMeetingOption:"Your mic has been disabled. You can no longer unmute.",grantedDueToMeetingOption:"Your mic has been enabled. Unmute if you'd like to speak."},shareScreen:{lostDueToRoleChangeToAttendee:"Your role has been changed. Some actions, like sharing content, won't be available to you.",grantedDueToRoleChangeToPresenter:"You're a presenter. You can share content and facilitate the meeting."}}};var chat$k={chatListHeader:"In this chat",uploadFile:"Upload File"};var callWithChat$k={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",moreDrawerCaptionsMenuTitle:"Live captions",moreDrawerSpokenLanguageMenuTitle:"Spoken language",moreDrawerCaptionLanguageMenuTitle:"Caption language",peopleButtonLabel:"People",selectedPeopleButtonLabel:"People Button Selected",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$k,chat:chat$k,callWithChat:callWithChat$k};
20349
20381
 
20350
20382
  var call$j={cameraLabel:"Camera",noCamerasLabel:"No cameras found",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",videoEffectsPaneTitle:"Effects",videoEffectsPaneBackgroundSelectionTitle:"Background",configurationPageVideoEffectsButtonLabel:"Effects",unableToStartVideoEffect:"Unable to apply video effect.",blurBackgroundEffectButtonLabel:"Blur",blurBackgroundTooltip:"Blur Background",removeBackgroundEffectButtonLabel:"None",removeBackgroundTooltip:"Remove Background",cameraOffBackgroundEffectWarningText:"Your camera is off. Turn on camera to see video effect.",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",leavingCallTitle:"Leaving...",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 {numberOfPeople}",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",noMicrophonesLabel:"No microphones found",noSpeakersLabel:"No speakers found",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",outboundCallingNoticeString:"Calling...",participantJoinedNoticeString:"{displayName} joined",twoParticipantJoinedNoticeString:"{displayName1} and {displayName2} have joined",threeParticipantJoinedNoticeString:"{displayName1}, {displayName2} and {displayName3} have joined",participantLeftNoticeString:"{displayName} left",twoParticipantLeftNoticeString:"{displayName1} and {displayName2} have left",threeParticipantLeftNoticeString:"{displayName1}, {displayName2} and {displayName3} have left",unnamedParticipantString:"unnamed participant",manyUnnamedParticipantsJoined:"unnamed participant and {numOfParticipants} other participants joined",manyUnnamedParticipantsLeft:"unnamed participant and {numOfParticipants} other participants left",manyParticipantsJoined:"{displayName1}, {displayName2}, {displayName3} and {numOfParticipants} other participants joined",manyParticipantsLeft:"{displayName1}, {displayName2}, {displayName3} and {numOfParticipants} other participants left",liveCaptionsLabel:"Live captions",captionsSettingsLabel:"Caption settings",startCaptionsButtonOnLabel:"Turn on captions",startCaptionsButtonOffLabel:"Turn off captions",startCaptionsButtonTooltipOnContent:"Turn off captions",startCaptionsButtonTooltipOffContent:"Turn on captions",captionsSettingsModalTitle:"What language is being spoken?",captionsSettingsDropdownLabel:"Spoken language",captionsSettingsDropdownInfoText:"Language that everyone on this call is speaking.",captionsSettingsConfirmButtonLabel:"Confirm",captionsSettingsCancelButtonLabel:"Cancel",captionsSettingsModalAriaLabel:"Captions Setting Modal",captionsSettingsCloseModalButtonAriaLabel:"Close Captions Setting",captionsBannerMoreButtonCallingLabel:"More",captionsBannerMoreButtonTooltip:"More options",captionsAvailableLanguageStrings:{"ar-ae":"Arabic - U.A.E.","ar-sa":"Arabic - Saudi Arabia","da-dk":"Danish","de-de":"German - Germany","en-au":"English - Australia","en-ca":"English - Canada","en-gb":"English - United Kingdom","en-in":"English - India","en-nz":"English - New Zealand","en-us":"English - United States","es-es":"Spanish - Spain (Modern Sort)","es-mx":"Spanish - Mexico","fi-fi":"Finnish","fr-ca":"French - Canada","fr-fr":"French - France","hi-in":"Hindi","it-it":"Italian - Italy","ja-jp":"Japanese","ko-kr":"Korean","nb-no":"Norwegian (Bokmål)","nl-be":"Dutch - Belgium","nl-nl":"Dutch - Netherlands","pl-pl":"Polish","pt-br":"Portuguese - Brazil","ru-ru":"Russian","sv-se":"Swedish","zh-cn":"Chinese - People's Republic of China","zh-hk":"Chinese - Hong Kong SAR","cs-cz":"Czech","pt-pt":"Portuguese - Portugal","tr-tr":"Turkish","vi-vn":"Vietnamese","th-th":"Thai","he-il":"Hebrew","cy-gb":"Welsh","uk-ua":"Ukrainian","el-gr":"Greek","hu-hu":"Hungarian","ro-ro":"Romanian","sk-sk":"Slovak","zh-tw":"Chinese - Taiwan"},captionsBannerSpinnerText:"Starting captions...",transferPageTransferorText:"Transferring...",transferPageTransferTargetText:"Connecting...",transferPageUnknownTransferorDisplayName:"Unknown",transferPageUnknownTransferTargetDisplayName:"Unknown",transferPageNoticeString:"You are being transferred",participantCouldNotBeReachedTitle:"Target participant is currently not available",participantCouldNotBeReachedMoreDetails:"Please contact participant when they are available",permissionToReachTargetParticipantNotAllowedTitle:"Permission to reach target participant is not allowed",permissionToReachTargetParticipantNotAllowedMoreDetails:"Please check that the target participant is in the same tenant",unableToResolveTenantTitle:"Unable to resolve tenant id for the target participant",unableToResolveTenantMoreDetails:"Please check the participant id is entered correctly",participantIdIsMalformedTitle:"Participant id is not in the correct format",participantIdIsMalformedMoreDetails:"Please check that the participant id is in the correct format",moreButtonGalleryControlLabel:"Gallery options",moreButtonGalleryPositionToggleLabel:"Move gallery to top",moreButtonGallerySpeakerLayoutLabel:"Speaker layout",moreButtonGalleryFloatingLocalLayoutLabel:"Dynamic layout",moreButtonGalleryDefaultLayoutLabel:"Gallery layout",moreButtonGalleryFocusedContentLayoutLabel:"Focused content"};var chat$j={chatListHeader:"In this chat",uploadFile:"Upload File"};var callWithChat$j={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",moreDrawerCaptionsMenuTitle:"Live captions",moreDrawerSpokenLanguageMenuTitle:"Spoken language",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_GB = {call:call$j,chat:chat$j,callWithChat:callWithChat$j};
20351
20383
 
@@ -23107,16 +23139,22 @@ const usePropsFor$1 = (component) => {
23107
23139
  * @private
23108
23140
  */
23109
23141
  const Camera = (props) => {
23110
- var _a;
23142
+ var _a, _b, _c;
23111
23143
  const cameraButtonProps = usePropsFor$1(CameraButton);
23112
23144
  const styles = React.useMemo(() => { var _a; return concatButtonBaseStyles((_a = props.styles) !== null && _a !== void 0 ? _a : {}); }, [props.styles]);
23113
23145
  /* @conditional-compile-remove(rooms) */
23114
23146
  const adapter = useAdapter();
23115
23147
  /* @conditional-compile-remove(rooms) */
23116
23148
  const isRoomsCall = adapter.getState().isRoomsCall;
23149
+ /* @conditional-compile-remove(capabilities) */
23150
+ const turnVideoOnCapability = (_b = (_a = adapter.getState().call) === null || _a === void 0 ? void 0 : _a.capabilitiesFeature) === null || _b === void 0 ? void 0 : _b.capabilities.turnVideoOn;
23117
23151
  return (React__default['default'].createElement(CameraButton, Object.assign({ "data-ui-id": "call-composite-camera-button" }, cameraButtonProps, { showLabel: props.displayType !== 'compact', styles: styles, enableDeviceSelectionMenu: props.splitButtonsForDeviceSelection, disabled: cameraButtonProps.disabled ||
23118
23152
  props.disabled ||
23119
- /* @conditional-compile-remove(rooms) */ (isRoomsCall && ((_a = adapter.getState().call) === null || _a === void 0 ? void 0 : _a.role) === 'Unknown'),
23153
+ /* @conditional-compile-remove(rooms) */ (isRoomsCall && ((_c = adapter.getState().call) === null || _c === void 0 ? void 0 : _c.role) === 'Unknown'),
23154
+ /* @conditional-compile-remove(capabilities) */
23155
+ onRenderOffIcon: turnVideoOnCapability && !turnVideoOnCapability.isPresent
23156
+ ? () => React__default['default'].createElement(_HighContrastAwareIcon, { disabled: true, iconName: 'ControlButtonCameraProhibited' })
23157
+ : undefined,
23120
23158
  /* @conditional-compile-remove(video-background-effects) */
23121
23159
  onShowVideoEffectsPicker: props.onShowVideoEffectsPicker, componentRef: props.componentRef })));
23122
23160
  };
@@ -23258,6 +23296,11 @@ const getMicrophones = (state) => state.devices.microphones;
23258
23296
  * @private
23259
23297
  */
23260
23298
  const getCameras = (state) => state.devices.cameras;
23299
+ /* @conditional-compile-remove(capabilities) */
23300
+ /**
23301
+ * @private
23302
+ */
23303
+ const getRole = (state) => { var _a; return (_a = state.call) === null || _a === void 0 ? void 0 : _a.role; };
23261
23304
  /**
23262
23305
  * @private
23263
23306
  */
@@ -23311,13 +23354,21 @@ const getCaptionsStatus = (state) => {
23311
23354
  * @private
23312
23355
  */
23313
23356
  const getIsTeamsCall = (state) => state.isTeamsCall;
23357
+ /* @conditional-compile-remove(capabilities) */
23358
+ /**
23359
+ * @private
23360
+ */
23361
+ const getLatestCapabilitiesChangedInfo = (state) => {
23362
+ var _a, _b;
23363
+ return (_b = (_a = state.call) === null || _a === void 0 ? void 0 : _a.capabilitiesFeature) === null || _b === void 0 ? void 0 : _b.latestCapabilitiesChangeInfo;
23364
+ };
23314
23365
 
23315
23366
  // Copyright (c) Microsoft Corporation.
23316
23367
  /**
23317
23368
  * @private
23318
23369
  */
23319
23370
  const Microphone = (props) => {
23320
- var _a;
23371
+ var _a, _b, _c;
23321
23372
  const microphoneButtonProps = usePropsFor$1(MicrophoneButton);
23322
23373
  const callStatus = useSelector$1(getCallStatus);
23323
23374
  const isLocalMicrophoneEnabled = useSelector$1(getLocalMicrophoneEnabled);
@@ -23326,6 +23377,8 @@ const Microphone = (props) => {
23326
23377
  const adapter = useAdapter();
23327
23378
  /* @conditional-compile-remove(rooms) */
23328
23379
  const isRoomsCall = adapter.getState().isRoomsCall;
23380
+ /* @conditional-compile-remove(capabilities) */
23381
+ const unmuteMicCapability = (_b = (_a = adapter.getState().call) === null || _a === void 0 ? void 0 : _a.capabilitiesFeature) === null || _b === void 0 ? void 0 : _b.capabilities.unmuteMic;
23329
23382
  /**
23330
23383
  * When call is in Lobby, microphone button should be disabled.
23331
23384
  * This is due to to headless limitation where a call can not be muted/unmuted in lobby.
@@ -23348,7 +23401,11 @@ const Microphone = (props) => {
23348
23401
  // tab focus on MicrophoneButton on page load
23349
23402
  return (React__default['default'].createElement(MicrophoneButton, Object.assign({ "data-ui-id": "call-composite-microphone-button" }, microphoneButtonProps, { showLabel: props.displayType !== 'compact', styles: styles }, microphoneButtonStrings, { enableDeviceSelectionMenu: props.splitButtonsForDeviceSelection, disabled: microphoneButtonProps.disabled ||
23350
23403
  props.disabled ||
23351
- /* @conditional-compile-remove(rooms) */ (isRoomsCall && ((_a = adapter.getState().call) === null || _a === void 0 ? void 0 : _a.role) === 'Unknown') })));
23404
+ /* @conditional-compile-remove(rooms) */ (isRoomsCall && ((_c = adapter.getState().call) === null || _c === void 0 ? void 0 : _c.role) === 'Unknown'),
23405
+ /* @conditional-compile-remove(capabilities) */
23406
+ onRenderOffIcon: unmuteMicCapability && !unmuteMicCapability.isPresent
23407
+ ? () => React__default['default'].createElement(_HighContrastAwareIcon, { disabled: true, iconName: 'ControlButtonMicProhibited' })
23408
+ : undefined })));
23352
23409
  };
23353
23410
 
23354
23411
  // Copyright (c) Microsoft Corporation.
@@ -26190,12 +26247,91 @@ const useMinMaxDragPosition = (modalLayerHostId, rtl) => {
26190
26247
  return { minDragPosition: minDragPosition, maxDragPosition: maxDragPosition };
26191
26248
  };
26192
26249
 
26250
+ // Copyright (c) Microsoft Corporation.
26251
+ /* @conditional-compile-remove(capabilities) */
26252
+ /**
26253
+ * Notification bar for capabilities changed
26254
+ * @private
26255
+ */
26256
+ const CapabilitiesChangedNotificationBar = (props) => {
26257
+ const locale = useLocale();
26258
+ return (React__default['default'].createElement(react.Stack, { "data-ui-id": "capabilities-changed-notification-bar-stack" }, props.capabilitiesChangedNotifications.map((notification) => {
26259
+ const message = getCapabilityChangedNotificationString(notification, locale.strings.call.capabilityChangedNotification);
26260
+ if (!message) {
26261
+ return null;
26262
+ }
26263
+ const iconProps = getNotificationIconProps(notification);
26264
+ return (React__default['default'].createElement(react.MessageBar, { key: notification.capabilityName, styles: messageBarStyles, messageBarType: react.MessageBarType.warning, dismissIconProps: { iconName: 'ErrorBarClear' }, onDismiss: () => props.onDismissNotification(notification), messageBarIconProps: iconProps }, message));
26265
+ })));
26266
+ };
26267
+ /* @conditional-compile-remove(capabilities) */
26268
+ const getCapabilityChangedNotificationString = (notification, strings) => {
26269
+ var _a, _b, _c, _d, _e, _f;
26270
+ switch (notification.capabilityName) {
26271
+ case 'turnVideoOn':
26272
+ if (notification.changedReason === 'MeetingOptionOrOrganizerPolicyChanged') {
26273
+ return notification.isPresent
26274
+ ? (_a = strings === null || strings === void 0 ? void 0 : strings.turnVideoOn) === null || _a === void 0 ? void 0 : _a.grantedDueToMeetingOption
26275
+ : (_b = strings === null || strings === void 0 ? void 0 : strings.turnVideoOn) === null || _b === void 0 ? void 0 : _b.lostDueToMeetingOption;
26276
+ }
26277
+ break;
26278
+ case 'unmuteMic':
26279
+ if (notification.changedReason === 'MeetingOptionOrOrganizerPolicyChanged') {
26280
+ return notification.isPresent
26281
+ ? (_c = strings === null || strings === void 0 ? void 0 : strings.unmuteMic) === null || _c === void 0 ? void 0 : _c.grantedDueToMeetingOption
26282
+ : (_d = strings === null || strings === void 0 ? void 0 : strings.unmuteMic) === null || _d === void 0 ? void 0 : _d.lostDueToMeetingOption;
26283
+ }
26284
+ break;
26285
+ case 'shareScreen':
26286
+ if (notification.isPresent && notification.changedReason === 'RoleChanged' && notification.role === 'Presenter') {
26287
+ return (_e = strings === null || strings === void 0 ? void 0 : strings.shareScreen) === null || _e === void 0 ? void 0 : _e.grantedDueToRoleChangeToPresenter;
26288
+ }
26289
+ if (!notification.isPresent && notification.changedReason === 'RoleChanged' && notification.role === 'Attendee') {
26290
+ return (_f = strings === null || strings === void 0 ? void 0 : strings.shareScreen) === null || _f === void 0 ? void 0 : _f.lostDueToRoleChangeToAttendee;
26291
+ }
26292
+ break;
26293
+ }
26294
+ return undefined;
26295
+ };
26296
+ /* @conditional-compile-remove(capabilities) */
26297
+ const getNotificationIconProps = (notification) => {
26298
+ switch (notification.capabilityName) {
26299
+ case 'turnVideoOn':
26300
+ if (notification.isPresent) {
26301
+ return { iconName: 'ControlButtonCameraOn' };
26302
+ }
26303
+ return { iconName: 'ControlButtonCameraProhibited' };
26304
+ case 'unmuteMic':
26305
+ if (notification.isPresent) {
26306
+ return { iconName: 'ControlButtonMicOn' };
26307
+ }
26308
+ return { iconName: 'ControlButtonMicProhibited' };
26309
+ }
26310
+ return undefined;
26311
+ };
26312
+ /* @conditional-compile-remove(capabilities) */
26313
+ const messageBarStyles = {
26314
+ innerText: {
26315
+ alignSelf: 'center'
26316
+ },
26317
+ icon: {
26318
+ height: 0
26319
+ },
26320
+ content: {
26321
+ lineHeight: 'inherit'
26322
+ },
26323
+ dismissal: {
26324
+ height: 0,
26325
+ paddingTop: '0.8rem'
26326
+ }
26327
+ };
26328
+
26193
26329
  // Copyright (c) Microsoft Corporation.
26194
26330
  /**
26195
26331
  * @private
26196
26332
  */
26197
26333
  const CallArrangement = (props) => {
26198
- var _a, _b, _c, _d, _e, _f, _g, _h, _j;
26334
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
26199
26335
  const containerClassName = React.useMemo(() => {
26200
26336
  return props.mobileView ? containerStyleMobile : containerStyleDesktop;
26201
26337
  }, [props.mobileView]);
@@ -26324,13 +26460,18 @@ const CallArrangement = (props) => {
26324
26460
  const minMaxDragPosition = useMinMaxDragPosition(props.modalLayerHostId);
26325
26461
  const pipStyles = React.useMemo(() => getPipStyles(theme), [theme]);
26326
26462
  const verticalControlBar = props.mobileView && containerWidth && containerHeight && containerWidth / containerHeight > 1 ? true : false;
26463
+ /* @conditional-compile-remove(capabilities) */
26464
+ // Filter out shareScreen capability notifications if on mobile
26465
+ const filteredCapabilitesChangedNotifications = props.mobileView
26466
+ ? (_c = props.capabilitiesChangedNotificationBarProps) === null || _c === void 0 ? void 0 : _c.capabilitiesChangedNotifications.filter((notification) => notification.capabilityName !== 'shareScreen')
26467
+ : (_d = props.capabilitiesChangedNotificationBarProps) === null || _d === void 0 ? void 0 : _d.capabilitiesChangedNotifications;
26327
26468
  return (React__default['default'].createElement("div", { ref: containerRef, className: react.mergeStyles(containerDivStyles), id: props.id },
26328
26469
  React__default['default'].createElement(react.Stack, { verticalFill: true, horizontalAlign: "stretch", className: containerClassName, "data-ui-id": props.dataUiId },
26329
26470
  React__default['default'].createElement(react.Stack, { reversed: true, horizontal: verticalControlBar, grow: true, styles: callArrangementContainerStyles(verticalControlBar) },
26330
- ((_c = props.callControlProps) === null || _c === void 0 ? void 0 : _c.options) !== false && !isMobileWithActivePane && (React__default['default'].createElement(react.Stack, { verticalAlign: 'center', className: react.mergeStyles({
26471
+ ((_e = props.callControlProps) === null || _e === void 0 ? void 0 : _e.options) !== false && !isMobileWithActivePane && (React__default['default'].createElement(react.Stack, { verticalAlign: 'center', className: react.mergeStyles({
26331
26472
  zIndex: CONTROL_BAR_Z_INDEX,
26332
26473
  padding: verticalControlBar ? '0.25rem' : 'unset'
26333
- }) }, isLegacyCallControlEnabled((_d = props.callControlProps) === null || _d === void 0 ? void 0 : _d.options) ? (React__default['default'].createElement(CallControls, Object.assign({}, props.callControlProps, { containerWidth: containerWidth, containerHeight: containerHeight, isMobile: props.mobileView,
26474
+ }) }, isLegacyCallControlEnabled((_f = props.callControlProps) === null || _f === void 0 ? void 0 : _f.options) ? (React__default['default'].createElement(CallControls, Object.assign({}, props.callControlProps, { containerWidth: containerWidth, containerHeight: containerHeight, isMobile: props.mobileView,
26334
26475
  /* @conditional-compile-remove(one-to-n-calling) */
26335
26476
  peopleButtonChecked: isPeoplePaneOpen,
26336
26477
  /* @conditional-compile-remove(one-to-n-calling) */
@@ -26351,7 +26492,7 @@ const CallArrangement = (props) => {
26351
26492
  onUserSetGalleryLayout: props.onUserSetGalleryLayoutChange,
26352
26493
  /* @conditional-compile-remove(gallery-layouts) */
26353
26494
  userSetGalleryLayout: props.userSetGalleryLayout, peopleButtonRef: peopleButtonRef, cameraButtonRef: cameraButtonRef }))))),
26354
- ((_e = props.callControlProps) === null || _e === void 0 ? void 0 : _e.options) !== false && showDrawer && (React__default['default'].createElement(react.Stack, { styles: drawerContainerStylesValue },
26495
+ ((_g = props.callControlProps) === null || _g === void 0 ? void 0 : _g.options) !== false && showDrawer && (React__default['default'].createElement(react.Stack, { styles: drawerContainerStylesValue },
26355
26496
  React__default['default'].createElement(PreparedMoreDrawer, { callControls: props.callControlProps.options, onLightDismiss: closeDrawer, onPeopleButtonClicked: onMoreDrawerPeopleClicked,
26356
26497
  /* @conditional-compile-remove(PSTN-calls) */
26357
26498
  onClickShowDialpad: alternateCallerId ? onClickShowDialpad : undefined,
@@ -26360,7 +26501,7 @@ const CallArrangement = (props) => {
26360
26501
  /* @conditional-compile-remove(close-captions) */
26361
26502
  isCaptionsSupported: isTeamsCall && hasJoinedCall }))),
26362
26503
  /* @conditional-compile-remove(PSTN-calls) */
26363
- ((_f = props.callControlProps) === null || _f === void 0 ? void 0 : _f.options) !== false && showDtmfDialpad && (React__default['default'].createElement(react.Stack, { styles: drawerContainerStylesValue },
26504
+ ((_h = props.callControlProps) === null || _h === void 0 ? void 0 : _h.options) !== false && showDtmfDialpad && (React__default['default'].createElement(react.Stack, { styles: drawerContainerStylesValue },
26364
26505
  React__default['default'].createElement(SendDtmfDialpad, { isMobile: props.mobileView, strings: dialpadStrings, showDialpad: showDtmfDialpad, onDismissDialpad: onDismissDtmfDialpad }))),
26365
26506
  React__default['default'].createElement(react.Stack, { horizontal: true, grow: true },
26366
26507
  React__default['default'].createElement(react.Stack.Item, { style: callCompositeContainerCSS },
@@ -26371,6 +26512,10 @@ const CallArrangement = (props) => {
26371
26512
  React__default['default'].createElement(_ComplianceBanner, Object.assign({}, props.complianceBannerProps))),
26372
26513
  props.errorBarProps !== false && (React__default['default'].createElement(react.Stack, { styles: bannerNotificationStyles },
26373
26514
  React__default['default'].createElement(ErrorBar, Object.assign({}, props.errorBarProps, { onDismissError: props.onDismissError, activeErrorMessages: filteredLatestErrors })))),
26515
+ /* @conditional-compile-remove(capabilities) */
26516
+ props.capabilitiesChangedNotificationBarProps &&
26517
+ props.capabilitiesChangedNotificationBarProps.capabilitiesChangedNotifications.length > 0 && (React__default['default'].createElement(react.Stack, { styles: bannerNotificationStyles },
26518
+ React__default['default'].createElement(CapabilitiesChangedNotificationBar, Object.assign({}, props.capabilitiesChangedNotificationBarProps, { capabilitiesChangedNotifications: filteredCapabilitesChangedNotifications !== null && filteredCapabilitesChangedNotifications !== void 0 ? filteredCapabilitesChangedNotifications : [] })))),
26374
26519
  canUnmute && !!props.mutedNotificationProps && (React__default['default'].createElement(MutedNotification, Object.assign({}, props.mutedNotificationProps)))),
26375
26520
  props.onRenderGalleryContent && props.onRenderGalleryContent(),
26376
26521
  /* @conditional-compile-remove(close-captions) */
@@ -26380,7 +26525,7 @@ const CallArrangement = (props) => {
26380
26525
  maxWidth: isVideoPaneOpen ? `${VIDEO_EFFECTS_SIDE_PANE_WIDTH_REM}rem` : undefined, updateSidePaneRenderer: props.updateSidePaneRenderer, onPeopleButtonClicked: props.mobileView && !shouldShowPeopleTabHeaderButton(props.callControlProps.options)
26381
26526
  ? undefined
26382
26527
  : togglePeoplePane, disablePeopleButton: typeof props.callControlProps.options !== 'boolean' &&
26383
- isDisabled$3((_g = props.callControlProps.options) === null || _g === void 0 ? void 0 : _g.participantsButton), onChatButtonClicked: (_h = props.mobileChatTabHeader) === null || _h === void 0 ? void 0 : _h.onClick, disableChatButton: (_j = props.mobileChatTabHeader) === null || _j === void 0 ? void 0 : _j.disabled }),
26528
+ isDisabled$3((_j = props.callControlProps.options) === null || _j === void 0 ? void 0 : _j.participantsButton), onChatButtonClicked: (_k = props.mobileChatTabHeader) === null || _k === void 0 ? void 0 : _k.onClick, disableChatButton: (_l = props.mobileChatTabHeader) === null || _l === void 0 ? void 0 : _l.disabled }),
26384
26529
  props.mobileView && (React__default['default'].createElement(ModalLocalAndRemotePIP, { modalLayerHostId: props.modalLayerHostId, hidden: !isSidePaneOpen, styles: pipStyles, minDragPosition: minMaxDragPosition.minDragPosition, maxDragPosition: minMaxDragPosition.maxDragPosition })),
26385
26530
  drawerMenuItems.length > 0 && (React__default['default'].createElement(react.Stack, { styles: drawerContainerStyles() },
26386
26531
  React__default['default'].createElement(_DrawerMenu, { onLightDismiss: () => setDrawerMenuItems([]), items: drawerMenuItems }))))))));
@@ -26905,7 +27050,9 @@ const CallPage = (props) => {
26905
27050
  /* @conditional-compile-remove(gallery-layouts) */
26906
27051
  onUserSetGalleryLayoutChange: setUserSetGalleryLayout,
26907
27052
  /* @conditional-compile-remove(gallery-layouts) */
26908
- userSetGalleryLayout: userSetGalleryLayout }));
27053
+ userSetGalleryLayout: userSetGalleryLayout,
27054
+ /* @conditional-compile-remove(capabilities) */
27055
+ capabilitiesChangedNotificationBarProps: props.capabilitiesChangedNotificationBarProps }));
26909
27056
  };
26910
27057
  /**
26911
27058
  * @private
@@ -28465,6 +28612,111 @@ const deviceCountSelector = reselect.createSelector([getCameras, getMicrophones]
28465
28612
  };
28466
28613
  });
28467
28614
 
28615
+ // Copyright (c) Microsoft Corporation.
28616
+ /* @conditional-compile-remove(capabilities) */
28617
+ /**
28618
+ * @private
28619
+ */
28620
+ const capabilitiesChangedInfoAndRoleSelector = reselect__namespace.createSelector([getLatestCapabilitiesChangedInfo, getRole], (capabilitiesChangeInfo, participantRole) => {
28621
+ return { capabilitiesChangeInfo, participantRole };
28622
+ });
28623
+
28624
+ // Copyright (c) Microsoft Corporation.
28625
+ /* @conditional-compile-remove(capabilities) */
28626
+ /**
28627
+ * Create a record for when the notification was most recently dismissed for tracking dismissed notifications.
28628
+ *
28629
+ * @private
28630
+ */
28631
+ const useTrackedCapabilityChangedNotifications = (capabilitiesChangedAndRoleInfo) => {
28632
+ const [trackedCapabilityChangedNotifications, setTrackedCapabilityChangedNotifications] = React.useState({});
28633
+ const activeNotifications = React.useRef({});
28634
+ // Take note of first capabilities changed reason
28635
+ const firstCapabilitiesChangedReason = React.useRef();
28636
+ React.useEffect(() => {
28637
+ var _a;
28638
+ if (firstCapabilitiesChangedReason.current === undefined) {
28639
+ firstCapabilitiesChangedReason.current = (_a = capabilitiesChangedAndRoleInfo.capabilitiesChangeInfo) === null || _a === void 0 ? void 0 : _a.reason;
28640
+ // Skip the first notifications if they are role related to be inline with Teams behavior
28641
+ if (firstCapabilitiesChangedReason.current === 'RoleChanged') {
28642
+ return;
28643
+ }
28644
+ }
28645
+ activeNotifications.current = updateLatestCapabilityChangedNotificationMap(capabilitiesChangedAndRoleInfo, activeNotifications.current);
28646
+ setTrackedCapabilityChangedNotifications((prev) => updateTrackedCapabilityChangedNotificationsWithActiveNotifications(prev, Object.values(activeNotifications.current)));
28647
+ }, [capabilitiesChangedAndRoleInfo]);
28648
+ const onDismissCapabilityChangedNotification = React.useCallback((notification) => {
28649
+ setTrackedCapabilityChangedNotifications((prev) => trackCapabilityChangedNotificationAsDismissed(notification.capabilityName, prev));
28650
+ }, []);
28651
+ const latestCapabilityChangedNotifications = React.useMemo(() => filterLatestCapabilityChangedNotifications(Object.values(activeNotifications.current), trackedCapabilityChangedNotifications), [trackedCapabilityChangedNotifications]);
28652
+ return {
28653
+ capabilitiesChangedNotifications: latestCapabilityChangedNotifications,
28654
+ onDismissNotification: onDismissCapabilityChangedNotification
28655
+ };
28656
+ };
28657
+ /* @conditional-compile-remove(capabilities) */
28658
+ /**
28659
+ * Take the set of active notifications, and filter to only those that are newer than previously dismissed notifications or have never been dismissed.
28660
+ *
28661
+ * @private
28662
+ */
28663
+ const filterLatestCapabilityChangedNotifications = (activeNotifications, trackedNotifications) => {
28664
+ const filteredNotifications = activeNotifications.filter((activeNotification) => {
28665
+ const trackedNotification = trackedNotifications[activeNotification.capabilityName];
28666
+ return (!trackedNotification ||
28667
+ !trackedNotification.lastDismissedAt ||
28668
+ trackedNotification.lastDismissedAt < trackedNotification.mostRecentlyActive);
28669
+ });
28670
+ return filteredNotifications;
28671
+ };
28672
+ /* @conditional-compile-remove(capabilities) */
28673
+ /**
28674
+ * Maintain a record of the most recently active notification for each capability name.
28675
+ *
28676
+ * @private
28677
+ */
28678
+ const updateTrackedCapabilityChangedNotificationsWithActiveNotifications = (existingTrackedNotifications, activeNotifications) => {
28679
+ var _a, _b;
28680
+ const trackedNotifications = {};
28681
+ // Only care about active notifications. If notifications are no longer active we do not track that they have been previously dismissed.
28682
+ for (const activeNotification of activeNotifications) {
28683
+ const existingTrackedNotification = existingTrackedNotifications[activeNotification.capabilityName];
28684
+ trackedNotifications[activeNotification.capabilityName] = {
28685
+ mostRecentlyActive: (_b = (_a = activeNotification.timestamp) !== null && _a !== void 0 ? _a : existingTrackedNotification === null || existingTrackedNotification === void 0 ? void 0 : existingTrackedNotification.mostRecentlyActive) !== null && _b !== void 0 ? _b : new Date(Date.now()),
28686
+ lastDismissedAt: existingTrackedNotification === null || existingTrackedNotification === void 0 ? void 0 : existingTrackedNotification.lastDismissedAt
28687
+ };
28688
+ }
28689
+ return trackedNotifications;
28690
+ };
28691
+ /* @conditional-compile-remove(capabilities) */
28692
+ /**
28693
+ * Create a record for when the notification was most recently dismissed for tracking dismissed notifications.
28694
+ *
28695
+ * @private
28696
+ */
28697
+ const trackCapabilityChangedNotificationAsDismissed = (capabilityName, trackedNotifications) => {
28698
+ const now = new Date(Date.now());
28699
+ const existingNotification = trackedNotifications[capabilityName];
28700
+ return Object.assign(Object.assign({}, trackedNotifications), { [capabilityName]: Object.assign(Object.assign({}, (existingNotification || {})), { lastDismissedAt: now }) });
28701
+ };
28702
+ /* @conditional-compile-remove(capabilities) */
28703
+ const updateLatestCapabilityChangedNotificationMap = (capabilitiesChangedInfoAndRole, activeNotifications) => {
28704
+ if (!capabilitiesChangedInfoAndRole.capabilitiesChangeInfo) {
28705
+ return activeNotifications;
28706
+ }
28707
+ for (const [capabilityName, newCapabilityValue] of Object.entries(capabilitiesChangedInfoAndRole.capabilitiesChangeInfo.newValue)) {
28708
+ const newCapabilityChangeNotification = {
28709
+ capabilityName: capabilityName,
28710
+ isPresent: newCapabilityValue.isPresent,
28711
+ changedReason: capabilitiesChangedInfoAndRole.capabilitiesChangeInfo.reason,
28712
+ role: capabilitiesChangedInfoAndRole.participantRole,
28713
+ timestamp: new Date(Date.now())
28714
+ };
28715
+ activeNotifications[capabilityName] = newCapabilityChangeNotification;
28716
+ }
28717
+ return activeNotifications;
28718
+ };
28719
+
28468
28720
  // Copyright (c) Microsoft Corporation.
28469
28721
  // Licensed under the MIT license.
28470
28722
  var __awaiter$7 = (window && window.__awaiter) || function (thisArg, _arguments, P, generator) {
@@ -28522,6 +28774,10 @@ const MainScreen = (props) => {
28522
28774
  React.useEffect(() => {
28523
28775
  onSidePaneIdChange === null || onSidePaneIdChange === void 0 ? void 0 : onSidePaneIdChange(sidePaneRenderer === null || sidePaneRenderer === void 0 ? void 0 : sidePaneRenderer.id);
28524
28776
  }, [sidePaneRenderer === null || sidePaneRenderer === void 0 ? void 0 : sidePaneRenderer.id, onSidePaneIdChange]);
28777
+ /* @conditional-compile-remove(capabilities) */
28778
+ const capabilitiesChangedInfoAndRole = useSelector$1(capabilitiesChangedInfoAndRoleSelector);
28779
+ /* @conditional-compile-remove(capabilities) */
28780
+ const capabilitiesChangedNotificationBarProps = useTrackedCapabilityChangedNotifications(capabilitiesChangedInfoAndRole);
28525
28781
  // Track the last dismissed errors of any error kind to prevent errors from re-appearing on subsequent page navigation
28526
28782
  // This works by tracking the most recent timestamp of any active error type.
28527
28783
  // And then tracking when that error type was last dismissed.
@@ -28557,7 +28813,9 @@ const MainScreen = (props) => {
28557
28813
  /* @conditional-compile-remove(call-readiness) */
28558
28814
  onPermissionsTroubleshootingClick: (_b = props.options) === null || _b === void 0 ? void 0 : _b.onPermissionsTroubleshootingClick,
28559
28815
  /* @conditional-compile-remove(call-readiness) */
28560
- onNetworkingTroubleShootingClick: (_c = props.options) === null || _c === void 0 ? void 0 : _c.onNetworkingTroubleShootingClick }));
28816
+ onNetworkingTroubleShootingClick: (_c = props.options) === null || _c === void 0 ? void 0 : _c.onNetworkingTroubleShootingClick,
28817
+ /* @conditional-compile-remove(capabilities) */
28818
+ capabilitiesChangedNotificationBarProps: capabilitiesChangedNotificationBarProps }));
28561
28819
  break;
28562
28820
  case 'accessDeniedTeamsMeeting':
28563
28821
  pageElement = (React__default['default'].createElement(NoticePage, { iconName: "NoticePageAccessDeniedTeamsMeeting", title: locale.strings.call.failedToJoinTeamsMeetingReasonAccessDeniedTitle, moreDetails: locale.strings.call.failedToJoinTeamsMeetingReasonAccessDeniedMoreDetails, dataUiId: 'access-denied-teams-meeting-page' }));
@@ -28577,20 +28835,28 @@ const MainScreen = (props) => {
28577
28835
  break;
28578
28836
  }
28579
28837
  case 'lobby':
28580
- pageElement = (React__default['default'].createElement(LobbyPage, { mobileView: props.mobileView, modalLayerHostId: props.modalLayerHostId, options: props.options, updateSidePaneRenderer: setSidePaneRenderer, mobileChatTabHeader: props.mobileChatTabHeader, latestErrors: latestErrors, onDismissError: onDismissError }));
28838
+ pageElement = (React__default['default'].createElement(LobbyPage, { mobileView: props.mobileView, modalLayerHostId: props.modalLayerHostId, options: props.options, updateSidePaneRenderer: setSidePaneRenderer, mobileChatTabHeader: props.mobileChatTabHeader, latestErrors: latestErrors, onDismissError: onDismissError,
28839
+ /* @conditional-compile-remove(capabilities) */
28840
+ capabilitiesChangedNotificationBarProps: capabilitiesChangedNotificationBarProps }));
28581
28841
  break;
28582
28842
  /* @conditional-compile-remove(call-transfer) */
28583
28843
  case 'transferring':
28584
- pageElement = (React__default['default'].createElement(TransferPage, { mobileView: props.mobileView, modalLayerHostId: props.modalLayerHostId, options: props.options, updateSidePaneRenderer: setSidePaneRenderer, mobileChatTabHeader: props.mobileChatTabHeader, onRenderAvatar: onRenderAvatar, onFetchAvatarPersonaData: onFetchAvatarPersonaData, latestErrors: latestErrors, onDismissError: onDismissError }));
28844
+ pageElement = (React__default['default'].createElement(TransferPage, { mobileView: props.mobileView, modalLayerHostId: props.modalLayerHostId, options: props.options, updateSidePaneRenderer: setSidePaneRenderer, mobileChatTabHeader: props.mobileChatTabHeader, onRenderAvatar: onRenderAvatar, onFetchAvatarPersonaData: onFetchAvatarPersonaData, latestErrors: latestErrors, onDismissError: onDismissError,
28845
+ /* @conditional-compile-remove(capabilities) */
28846
+ capabilitiesChangedNotificationBarProps: capabilitiesChangedNotificationBarProps }));
28585
28847
  break;
28586
28848
  case 'call':
28587
28849
  pageElement = (React__default['default'].createElement(CallPage, { onRenderAvatar: onRenderAvatar, callInvitationURL: callInvitationUrl, onFetchAvatarPersonaData: onFetchAvatarPersonaData, onFetchParticipantMenuItems: onFetchParticipantMenuItems, mobileView: props.mobileView, modalLayerHostId: props.modalLayerHostId, options: props.options, updateSidePaneRenderer: setSidePaneRenderer, mobileChatTabHeader: props.mobileChatTabHeader, latestErrors: latestErrors, onDismissError: onDismissError,
28588
28850
  /* @conditional-compile-remove(gallery-layouts) */
28589
- galleryLayout: ((_f = (_e = props.options) === null || _e === void 0 ? void 0 : _e.galleryOptions) === null || _f === void 0 ? void 0 : _f.layout) ? props.options.galleryOptions.layout : 'floatingLocalVideo' }));
28851
+ galleryLayout: ((_f = (_e = props.options) === null || _e === void 0 ? void 0 : _e.galleryOptions) === null || _f === void 0 ? void 0 : _f.layout) ? props.options.galleryOptions.layout : 'floatingLocalVideo',
28852
+ /* @conditional-compile-remove(capabilities) */
28853
+ capabilitiesChangedNotificationBarProps: capabilitiesChangedNotificationBarProps }));
28590
28854
  break;
28591
28855
  /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */
28592
28856
  case 'hold':
28593
- pageElement = (React__default['default'].createElement(React__default['default'].Fragment, null, React__default['default'].createElement(HoldPage, { mobileView: props.mobileView, modalLayerHostId: props.modalLayerHostId, options: props.options, updateSidePaneRenderer: setSidePaneRenderer, mobileChatTabHeader: props.mobileChatTabHeader, latestErrors: latestErrors, onDismissError: onDismissError })));
28857
+ pageElement = (React__default['default'].createElement(React__default['default'].Fragment, null, React__default['default'].createElement(HoldPage, { mobileView: props.mobileView, modalLayerHostId: props.modalLayerHostId, options: props.options, updateSidePaneRenderer: setSidePaneRenderer, mobileChatTabHeader: props.mobileChatTabHeader, latestErrors: latestErrors, onDismissError: onDismissError,
28858
+ /* @conditional-compile-remove(capabilities) */
28859
+ capabilitiesChangedNotificationBarProps: capabilitiesChangedNotificationBarProps })));
28594
28860
  break;
28595
28861
  }
28596
28862
  /* @conditional-compile-remove(unsupported-browser) */