@azure/communication-react 1.5.1-alpha-202305250013 → 1.5.1-alpha-202305270013

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 +10 -2
  2. package/dist/dist-cjs/communication-react/index.js +366 -205
  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.d.ts +2 -0
  7. package/dist/dist-esm/calling-component-bindings/src/baseSelectors.js +6 -0
  8. package/dist/dist-esm/calling-component-bindings/src/baseSelectors.js.map +1 -1
  9. package/dist/dist-esm/calling-component-bindings/src/captionsSelector.js +5 -2
  10. package/dist/dist-esm/calling-component-bindings/src/captionsSelector.js.map +1 -1
  11. package/dist/dist-esm/calling-stateful-client/src/CallClientState.d.ts +4 -0
  12. package/dist/dist-esm/calling-stateful-client/src/CallClientState.js.map +1 -1
  13. package/dist/dist-esm/calling-stateful-client/src/CallContext.d.ts +1 -0
  14. package/dist/dist-esm/calling-stateful-client/src/CallContext.js +9 -0
  15. package/dist/dist-esm/calling-stateful-client/src/CallContext.js.map +1 -1
  16. package/dist/dist-esm/calling-stateful-client/src/CallDeclarativeCommon.js +2 -1
  17. package/dist/dist-esm/calling-stateful-client/src/CallDeclarativeCommon.js.map +1 -1
  18. package/dist/dist-esm/calling-stateful-client/src/Converter.js +2 -1
  19. package/dist/dist-esm/calling-stateful-client/src/Converter.js.map +1 -1
  20. package/dist/dist-esm/react-components/src/components/CaptionsBanner.d.ts +9 -0
  21. package/dist/dist-esm/react-components/src/components/CaptionsBanner.js +8 -6
  22. package/dist/dist-esm/react-components/src/components/CaptionsBanner.js.map +1 -1
  23. package/dist/dist-esm/react-components/src/components/CaptionsSettingsModal.js +11 -4
  24. package/dist/dist-esm/react-components/src/components/CaptionsSettingsModal.js.map +1 -1
  25. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentAsEditBox.js +26 -22
  26. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentAsEditBox.js.map +1 -1
  27. package/dist/dist-esm/react-components/src/components/DevicesButton.js +9 -0
  28. package/dist/dist-esm/react-components/src/components/DevicesButton.js.map +1 -1
  29. package/dist/dist-esm/react-components/src/components/Drawer/DrawerMenu.d.ts +5 -0
  30. package/dist/dist-esm/react-components/src/components/Drawer/DrawerMenu.js +1 -1
  31. package/dist/dist-esm/react-components/src/components/Drawer/DrawerMenu.js.map +1 -1
  32. package/dist/dist-esm/react-components/src/components/Drawer/DrawerSurface.d.ts +5 -0
  33. package/dist/dist-esm/react-components/src/components/Drawer/DrawerSurface.js +23 -5
  34. package/dist/dist-esm/react-components/src/components/Drawer/DrawerSurface.js.map +1 -1
  35. package/dist/dist-esm/react-components/src/components/InputBoxComponent.js +127 -28
  36. package/dist/dist-esm/react-components/src/components/InputBoxComponent.js.map +1 -1
  37. package/dist/dist-esm/react-components/src/components/StartCaptionsButton.js +9 -2
  38. package/dist/dist-esm/react-components/src/components/StartCaptionsButton.js.map +1 -1
  39. package/dist/dist-esm/react-components/src/components/VideoTile.js +3 -4
  40. package/dist/dist-esm/react-components/src/components/VideoTile.js.map +1 -1
  41. package/dist/dist-esm/react-components/src/components/styles/Captions.style.d.ts +4 -0
  42. package/dist/dist-esm/react-components/src/components/styles/Captions.style.js +6 -0
  43. package/dist/dist-esm/react-components/src/components/styles/Captions.style.js.map +1 -1
  44. package/dist/dist-esm/react-components/src/components/styles/ChatMessageComponent.styles.d.ts +10 -0
  45. package/dist/dist-esm/react-components/src/components/styles/ChatMessageComponent.styles.js +10 -0
  46. package/dist/dist-esm/react-components/src/components/styles/ChatMessageComponent.styles.js.map +1 -1
  47. package/dist/dist-esm/react-components/src/components/styles/VideoTile.styles.js +2 -1
  48. package/dist/dist-esm/react-components/src/components/styles/VideoTile.styles.js.map +1 -1
  49. package/dist/dist-esm/react-composites/src/composites/CallComposite/Strings.d.ts +4 -0
  50. package/dist/dist-esm/react-composites/src/composites/CallComposite/Strings.js.map +1 -1
  51. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/CallAdapter.d.ts +2 -2
  52. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/CallAdapter.js.map +1 -1
  53. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CallReadinessModal.js +3 -3
  54. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CallReadinessModal.js.map +1 -1
  55. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/MediaGallery.js +1 -2
  56. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/MediaGallery.js.map +1 -1
  57. package/dist/dist-esm/react-composites/src/composites/CallComposite/index.d.ts +1 -1
  58. package/dist/dist-esm/react-composites/src/composites/CallComposite/index.js.map +1 -1
  59. package/dist/dist-esm/react-composites/src/composites/common/AddPeopleDropdown.js +1 -1
  60. package/dist/dist-esm/react-composites/src/composites/common/AddPeopleDropdown.js.map +1 -1
  61. package/dist/dist-esm/react-composites/src/composites/common/CallingDialpad.js +1 -1
  62. package/dist/dist-esm/react-composites/src/composites/common/CallingDialpad.js.map +1 -1
  63. package/dist/dist-esm/react-composites/src/composites/common/CaptionsBanner.js +13 -5
  64. package/dist/dist-esm/react-composites/src/composites/common/CaptionsBanner.js.map +1 -1
  65. package/dist/dist-esm/react-composites/src/composites/common/CaptionsBannerMoreButton.js +0 -3
  66. package/dist/dist-esm/react-composites/src/composites/common/CaptionsBannerMoreButton.js.map +1 -1
  67. package/dist/dist-esm/react-composites/src/composites/common/ControlBar/DesktopMoreButton.js +0 -3
  68. package/dist/dist-esm/react-composites/src/composites/common/ControlBar/DesktopMoreButton.js.map +1 -1
  69. package/dist/dist-esm/react-composites/src/composites/common/Drawer/MoreDrawer.js +1 -8
  70. package/dist/dist-esm/react-composites/src/composites/common/Drawer/MoreDrawer.js.map +1 -1
  71. package/dist/dist-esm/react-composites/src/composites/common/Drawer/SpokenLanguageDrawer.styles.js +0 -1
  72. package/dist/dist-esm/react-composites/src/composites/common/Drawer/SpokenLanguageDrawer.styles.js.map +1 -1
  73. package/dist/dist-esm/react-composites/src/composites/common/SendDtmfDialpad.js +1 -1
  74. package/dist/dist-esm/react-composites/src/composites/common/SendDtmfDialpad.js.map +1 -1
  75. package/dist/dist-esm/react-composites/src/composites/common/VideoEffectsPane.js.map +1 -1
  76. package/dist/dist-esm/react-composites/src/composites/localization/locales/en-US/strings.json +2 -1
  77. package/package.json +8 -8
@@ -165,7 +165,7 @@ const _toCommunicationIdentifier = (id) => {
165
165
  // Copyright (c) Microsoft Corporation.
166
166
  // Licensed under the MIT license.
167
167
  // GENERATED FILE. DO NOT EDIT MANUALLY.
168
- var telemetryVersion = '1.5.1-alpha-202305250013';
168
+ var telemetryVersion = '1.5.1-alpha-202305270013';
169
169
 
170
170
  // Copyright (c) Microsoft Corporation.
171
171
  /**
@@ -392,6 +392,12 @@ const getCaptionsStatus = (state, props) => {
392
392
  };
393
393
  /* @conditional-compile-remove(close-captions) */
394
394
  /** @private */
395
+ const getStartCaptionsInProgress = (state, props) => {
396
+ var _a;
397
+ return (_a = state.calls[props.callId]) === null || _a === void 0 ? void 0 : _a.captionsFeature.startCaptionsInProgress;
398
+ };
399
+ /* @conditional-compile-remove(close-captions) */
400
+ /** @private */
395
401
  const getCurrentCaptionLanguage = (state, props) => {
396
402
  var _a;
397
403
  return (_a = state.calls[props.callId]) === null || _a === void 0 ? void 0 : _a.captionsFeature.currentCaptionLanguage;
@@ -1025,7 +1031,7 @@ const _changeSpokenLanguageSelector = reselect__namespace.createSelector([getSup
1025
1031
  *
1026
1032
  * @internal
1027
1033
  */
1028
- const _captionsBannerSelector = reselect__namespace.createSelector([getCaptions, getCaptionsStatus], (captions, isCaptionsFeatureActive) => {
1034
+ const _captionsBannerSelector = reselect__namespace.createSelector([getCaptions, getCaptionsStatus, getStartCaptionsInProgress], (captions, isCaptionsFeatureActive, startCaptionsInProgress) => {
1029
1035
  // Following Teams app logic, no matter how many 'Partial' captions come,
1030
1036
  // we only pick first one according to start time, and all the other partial captions will be filtered out
1031
1037
  // This will give customers a stable captions experience when others talking over the dominant speaker
@@ -1044,7 +1050,8 @@ const _captionsBannerSelector = reselect__namespace.createSelector([getCaptions,
1044
1050
  });
1045
1051
  return {
1046
1052
  captions: captionsInfo !== null && captionsInfo !== void 0 ? captionsInfo : [],
1047
- isCaptionsOn: isCaptionsFeatureActive !== null && isCaptionsFeatureActive !== void 0 ? isCaptionsFeatureActive : false
1053
+ isCaptionsOn: isCaptionsFeatureActive !== null && isCaptionsFeatureActive !== void 0 ? isCaptionsFeatureActive : false,
1054
+ startCaptionsInProgress: startCaptionsInProgress !== null && startCaptionsInProgress !== void 0 ? startCaptionsInProgress : false
1048
1055
  };
1049
1056
  });
1050
1057
  /* @conditional-compile-remove(close-captions) */
@@ -1448,7 +1455,8 @@ function convertSdkCallToDeclarativeCall(call) {
1448
1455
  supportedCaptionLanguages: [],
1449
1456
  currentCaptionLanguage: '',
1450
1457
  currentSpokenLanguage: '',
1451
- isCaptionsFeatureActive: false
1458
+ isCaptionsFeatureActive: false,
1459
+ startCaptionsInProgress: false
1452
1460
  }
1453
1461
  };
1454
1462
  }
@@ -2101,6 +2109,15 @@ class CallContext$2 {
2101
2109
  });
2102
2110
  }
2103
2111
  /* @conditional-compile-remove(close-captions) */
2112
+ setStartCaptionsInProgress(callId, startCaptionsInProgress) {
2113
+ this.modifyState((draft) => {
2114
+ const call = draft.calls[this._callIdHistory.latestCallId(callId)];
2115
+ if (call) {
2116
+ call.captionsFeature.startCaptionsInProgress = startCaptionsInProgress;
2117
+ }
2118
+ });
2119
+ }
2120
+ /* @conditional-compile-remove(close-captions) */
2104
2121
  setSelectedSpokenLanguage(callId, spokenLanguage) {
2105
2122
  this.modifyState((draft) => {
2106
2123
  const call = draft.calls[this._callIdHistory.latestCallId(callId)];
@@ -3690,8 +3707,8 @@ class ProxyTeamsCaptionsFeature {
3690
3707
  case 'startCaptions':
3691
3708
  return this._context.withAsyncErrorTeedToState((...args) => __awaiter$B(this, void 0, void 0, function* () {
3692
3709
  var _a, _b;
3710
+ this._context.setStartCaptionsInProgress(this._call.id, true);
3693
3711
  const ret = yield target.startCaptions(...args);
3694
- this._context.setIsCaptionActive(this._call.id, true);
3695
3712
  this._context.setSelectedSpokenLanguage(this._call.id, (_b = (_a = args[0]) === null || _a === void 0 ? void 0 : _a.spokenLanguage) !== null && _b !== void 0 ? _b : 'en-us');
3696
3713
  return ret;
3697
3714
  }), 'Call.feature');
@@ -3699,6 +3716,7 @@ class ProxyTeamsCaptionsFeature {
3699
3716
  return this._context.withAsyncErrorTeedToState((...args) => __awaiter$B(this, void 0, void 0, function* () {
3700
3717
  const ret = yield target.stopCaptions(...args);
3701
3718
  this._context.setIsCaptionActive(this._call.id, false);
3719
+ this._context.setStartCaptionsInProgress(this._call.id, false);
3702
3720
  return ret;
3703
3721
  }), 'Call.feature');
3704
3722
  case 'setSpokenLanguage':
@@ -5028,7 +5046,7 @@ function chunk(options, itemsPerRow) {
5028
5046
  /**
5029
5047
  * @private
5030
5048
  */
5031
- const defaultSpokenLanguage$1 = 'en-us';
5049
+ const defaultSpokenLanguage = 'en-us';
5032
5050
 
5033
5051
  // Copyright (c) Microsoft Corporation.
5034
5052
  /**
@@ -6068,9 +6086,17 @@ const InputBoxComponent = (props) => {
6068
6086
  // Index of the previous selection end in the text field
6069
6087
  const [selectionEndValue, setSelectionEndValue] = React.useState(null);
6070
6088
  /* @conditional-compile-remove(mention) */
6071
- // Boolean value to check if onMouseDown event should be handled during select as selection range for onMouseDown event is not updated yet and the selection range for mouse click/taps will be updated in onSelect event if needed.
6089
+ // Boolean value to check if onMouseDown event should be handled during select as selection range
6090
+ // for onMouseDown event is not updated yet and the selection range for mouse click/taps will be
6091
+ // updated in onSelect event if needed.
6072
6092
  const [shouldHandleOnMouseDownDuringSelect, setShouldHandleOnMouseDownDuringSelect] = React.useState(true);
6073
6093
  /* @conditional-compile-remove(mention) */
6094
+ // Point of start of touch/mouse selection
6095
+ const [interactionStartPoint, setInteractionStartPoint] = React.useState();
6096
+ /* @conditional-compile-remove(mention) */
6097
+ // Target selection from mouse movement
6098
+ const [targetSelection, setTargetSelection] = React.useState();
6099
+ /* @conditional-compile-remove(mention) */
6074
6100
  // Caret position in the text field
6075
6101
  const [caretPosition, setCaretPosition] = React.useState(undefined);
6076
6102
  /* @conditional-compile-remove(mention) */
@@ -6239,10 +6265,6 @@ const InputBoxComponent = (props) => {
6239
6265
  /* @conditional-compile-remove(mention) */
6240
6266
  const debouncedQueryUpdate = useDebounce.useDebouncedCallback((query) => __awaiter$w(void 0, void 0, void 0, function* () {
6241
6267
  var _a;
6242
- if (query === undefined) {
6243
- updateMentionSuggestions([]);
6244
- return;
6245
- }
6246
6268
  const suggestions = (_a = (yield (mentionLookupOptions === null || mentionLookupOptions === void 0 ? void 0 : mentionLookupOptions.onQueryUpdated(query)))) !== null && _a !== void 0 ? _a : [];
6247
6269
  if (suggestions.length === 0) {
6248
6270
  setActiveSuggestionIndex(undefined);
@@ -6332,33 +6354,54 @@ const InputBoxComponent = (props) => {
6332
6354
  }, [setSelectionStartValue, setSelectionEndValue]);
6333
6355
  /* @conditional-compile-remove(mention) */
6334
6356
  const handleOnSelect = React.useCallback((event, inputTextValue, tags, shouldHandleOnMouseDownDuringSelect, selectionStartValue, selectionEndValue) => {
6335
- var _a, _b, _c;
6336
- /* @conditional-compile-remove(mention) */
6337
- if (shouldHandleOnMouseDownDuringSelect && event.currentTarget.selectionStart !== null) {
6338
- // on select was triggered by mouse down
6339
- const mentionTag = findMentionTagForSelection(tags, event.currentTarget.selectionStart);
6340
- if (mentionTag !== undefined && mentionTag.plainTextBeginIndex !== undefined) {
6341
- // handle mention click
6342
- if (event.currentTarget.selectionDirection === null) {
6343
- event.currentTarget.setSelectionRange(mentionTag.plainTextBeginIndex, (_a = mentionTag.plainTextEndIndex) !== null && _a !== void 0 ? _a : mentionTag.plainTextBeginIndex);
6357
+ if (shouldHandleOnMouseDownDuringSelect) {
6358
+ if (targetSelection !== undefined) {
6359
+ setSelectionStartValue(targetSelection.start);
6360
+ setSelectionEndValue(targetSelection.end);
6361
+ event.currentTarget.setSelectionRange(targetSelection.start, targetSelection.end);
6362
+ setTargetSelection(undefined);
6363
+ }
6364
+ else if (event.currentTarget.selectionStart !== null) {
6365
+ // on select was triggered by mouse down/up with no movement
6366
+ const mentionTag = findMentionTagForSelection(tags, event.currentTarget.selectionStart);
6367
+ if (mentionTag !== undefined && mentionTag.plainTextBeginIndex !== undefined) {
6368
+ // handle mention click
6369
+ // Get range of word that was clicked on
6370
+ const selectionRange = rangeOfWordInSelection({
6371
+ textInput: inputTextValue,
6372
+ selectionStart: event.currentTarget.selectionStart,
6373
+ selectionEnd: event.currentTarget.selectionEnd,
6374
+ tag: mentionTag
6375
+ });
6376
+ if (event.currentTarget.selectionDirection === null) {
6377
+ event.currentTarget.setSelectionRange(selectionRange.start, selectionRange.end);
6378
+ }
6379
+ else {
6380
+ event.currentTarget.setSelectionRange(selectionRange.start, selectionRange.end, event.currentTarget.selectionDirection);
6381
+ }
6382
+ setSelectionStartValue(selectionRange.start);
6383
+ setSelectionEndValue(selectionRange.end);
6344
6384
  }
6345
6385
  else {
6346
- event.currentTarget.setSelectionRange(mentionTag.plainTextBeginIndex, (_b = mentionTag.plainTextEndIndex) !== null && _b !== void 0 ? _b : mentionTag.plainTextBeginIndex, event.currentTarget.selectionDirection);
6386
+ setSelectionStartValue(event.currentTarget.selectionStart);
6387
+ setSelectionEndValue(event.currentTarget.selectionEnd);
6347
6388
  }
6348
- setSelectionStartValue(mentionTag.plainTextBeginIndex);
6349
- setSelectionEndValue((_c = mentionTag.plainTextEndIndex) !== null && _c !== void 0 ? _c : mentionTag.plainTextBeginIndex);
6350
- }
6351
- else {
6352
- setSelectionStartValue(event.currentTarget.selectionStart);
6353
- setSelectionEndValue(event.currentTarget.selectionEnd);
6354
6389
  }
6355
6390
  }
6356
6391
  else {
6357
6392
  // selection was changed by keyboard
6358
6393
  updateSelectionIndexesWithMentionIfNeeded(event, inputTextValue, selectionStartValue, selectionEndValue, tags);
6359
6394
  }
6360
- // don't set setShouldHandleOnMouseDownDuringSelect(false) here as setSelectionRange could trigger additional calls of onSelect event and they may not be handled correctly (because of setSelectionRange calls or rerender)
6361
- }, [updateSelectionIndexesWithMentionIfNeeded]);
6395
+ // don't set setShouldHandleOnMouseDownDuringSelect(false) here as setSelectionRange
6396
+ // could trigger additional calls of onSelect event and they may not be handled correctly
6397
+ // (because of setSelectionRange calls or rerender)
6398
+ }, [
6399
+ updateSelectionIndexesWithMentionIfNeeded,
6400
+ targetSelection,
6401
+ setTargetSelection,
6402
+ setSelectionStartValue,
6403
+ setSelectionEndValue
6404
+ ]);
6362
6405
  /* @conditional-compile-remove(mention) */
6363
6406
  const handleOnChange = React.useCallback((event, tagsValue, htmlTextValue, inputTextValue, currentTriggerStartIndex, previousSelectionStart, previousSelectionEnd, currentSelectionStart, currentSelectionEnd, updatedValue) => __awaiter$w(void 0, void 0, void 0, function* () {
6364
6407
  var _b;
@@ -6417,7 +6460,7 @@ const InputBoxComponent = (props) => {
6417
6460
  setCurrentTriggerStartIndex(tagIndex);
6418
6461
  }
6419
6462
  if (tagIndex === -1) {
6420
- yield debouncedQueryUpdate(undefined);
6463
+ updateMentionSuggestions([]);
6421
6464
  }
6422
6465
  else {
6423
6466
  // In the middle of a @mention lookup
@@ -6467,11 +6510,43 @@ const InputBoxComponent = (props) => {
6467
6510
  }
6468
6511
  }
6469
6512
  onChange && onChange(event, result);
6470
- }), [onChange, mentionLookupOptions, setCaretIndex, setCaretPosition, debouncedQueryUpdate]);
6513
+ }), [onChange, mentionLookupOptions, setCaretIndex, setCaretPosition, updateMentionSuggestions, debouncedQueryUpdate]);
6471
6514
  const getInputFieldTextValue = () => {
6472
6515
  /* @conditional-compile-remove(mention) */
6473
6516
  return inputTextValue;
6474
6517
  };
6518
+ /* @conditional-compile-remove(mention) */
6519
+ // Adjust the selection range based on a mouse / touch interaction
6520
+ const handleOnMove = React.useCallback((event) => {
6521
+ var _a;
6522
+ let targetStart = event.currentTarget.selectionStart;
6523
+ let targetEnd = event.currentTarget.selectionEnd;
6524
+ // Should we do anything?
6525
+ if (interactionStartPoint !== undefined &&
6526
+ // And did selection change?
6527
+ targetStart !== null &&
6528
+ (targetStart !== (targetSelection === null || targetSelection === void 0 ? void 0 : targetSelection.start) || targetEnd !== (targetSelection === null || targetSelection === void 0 ? void 0 : targetSelection.end))) {
6529
+ const direction = event.clientX > interactionStartPoint.x ? 'forward' : 'backward';
6530
+ const mentionTag = findMentionTagForSelection(tagsValue, direction === 'backward'
6531
+ ? event.currentTarget.selectionStart
6532
+ : (_a = event.currentTarget.selectionEnd) !== null && _a !== void 0 ? _a : event.currentTarget.selectionStart);
6533
+ let updateCurrentTarget = false;
6534
+ if (mentionTag !== undefined && mentionTag.plainTextBeginIndex !== undefined) {
6535
+ targetStart = Math.min(mentionTag.plainTextBeginIndex, targetStart);
6536
+ if (mentionTag.plainTextEndIndex !== undefined && targetEnd !== null) {
6537
+ targetEnd = Math.max(mentionTag.plainTextEndIndex, targetEnd);
6538
+ }
6539
+ updateCurrentTarget = true;
6540
+ setShouldHandleOnMouseDownDuringSelect(false);
6541
+ }
6542
+ // Update selection range
6543
+ setTargetSelection({ start: targetStart, end: targetEnd });
6544
+ if (updateCurrentTarget) {
6545
+ // Only set the control, if the values are updated
6546
+ event.currentTarget.setSelectionRange(targetStart, targetEnd, direction);
6547
+ }
6548
+ }
6549
+ }, [setTargetSelection, targetSelection, setShouldHandleOnMouseDownDuringSelect, interactionStartPoint, tagsValue]);
6475
6550
  return (React__default['default'].createElement(react.Stack, { className: mergedRootStyle },
6476
6551
  React__default['default'].createElement("div", { className: mergedTextContainerStyle },
6477
6552
  /* @conditional-compile-remove(mention) */ mentionSuggestions.length > 0 && (React__default['default'].createElement(_MentionPopover, { suggestions: mentionSuggestions, activeSuggestionIndex: activeSuggestionIndex, target: inputBoxRef, targetPositionOffset: caretPosition, onRenderSuggestionItem: mentionLookupOptions === null || mentionLookupOptions === void 0 ? void 0 : mentionLookupOptions.onRenderSuggestionItem, onSuggestionSelected: onSuggestionSelected, onDismiss: () => {
@@ -6503,8 +6578,9 @@ const InputBoxComponent = (props) => {
6503
6578
  handleOnSelect(e, inputTextValue, tagsValue, shouldHandleOnMouseDownDuringSelect, selectionStartValue, selectionEndValue);
6504
6579
  },
6505
6580
  /* @conditional-compile-remove(mention) */
6506
- onMouseDown: () => {
6507
- // as events order is onMouseDown -> onSelect -> onClick
6581
+ onMouseDown: (e) => {
6582
+ setInteractionStartPoint({ x: e.clientX, y: e.clientY });
6583
+ // as events order is onMouseDown -> onMouseMove -> onMouseUp -> onSelect -> onClick
6508
6584
  // onClick and onMouseDown can't handle clicking on mention event because
6509
6585
  // onMouseDown doesn't have correct selectionRange yet and
6510
6586
  // onClick already has wrong range as it's called after onSelect that updates the selection range
@@ -6512,11 +6588,27 @@ const InputBoxComponent = (props) => {
6512
6588
  setShouldHandleOnMouseDownDuringSelect(true);
6513
6589
  },
6514
6590
  /* @conditional-compile-remove(mention) */
6515
- onTouchStart: () => {
6591
+ onMouseMove: handleOnMove,
6592
+ /* @conditional-compile-remove(mention) */
6593
+ onMouseUp: () => {
6594
+ setInteractionStartPoint(undefined);
6595
+ },
6596
+ /* @conditional-compile-remove(mention) */
6597
+ onTouchStart: (e) => {
6598
+ setInteractionStartPoint({
6599
+ x: e.targetTouches.item(0).clientX,
6600
+ y: e.targetTouches.item(0).clientY
6601
+ });
6516
6602
  // see onMouseDown for more details
6517
6603
  setShouldHandleOnMouseDownDuringSelect(true);
6518
6604
  },
6519
6605
  /* @conditional-compile-remove(mention) */
6606
+ onTouchMove: handleOnMove,
6607
+ /* @conditional-compile-remove(mention) */
6608
+ onTouchEnd: () => {
6609
+ setInteractionStartPoint(undefined);
6610
+ },
6611
+ /* @conditional-compile-remove(mention) */
6520
6612
  onBlur: () => {
6521
6613
  // setup all flags to default values when text field loses focus
6522
6614
  setShouldHandleOnMouseDownDuringSelect(false);
@@ -6602,6 +6694,31 @@ const findMentionTagForSelection = (tags, selection) => {
6602
6694
  return mentionTag;
6603
6695
  };
6604
6696
  /* @conditional-compile-remove(mention) */
6697
+ const rangeOfWordInSelection = ({ textInput, selectionStart, selectionEnd, tag }) => {
6698
+ var _a;
6699
+ if (tag.plainTextBeginIndex === undefined) {
6700
+ return { start: selectionStart, end: selectionEnd === null ? selectionStart : selectionEnd };
6701
+ }
6702
+ // Look at start word index and optionally end word index.
6703
+ // Select combination of the two and return the range.
6704
+ let start = selectionStart;
6705
+ let end = selectionEnd === null ? selectionStart : selectionEnd;
6706
+ const firstWordStartIndex = textInput.lastIndexOf(' ', selectionStart);
6707
+ if (firstWordStartIndex === tag.plainTextBeginIndex) {
6708
+ start = firstWordStartIndex;
6709
+ }
6710
+ else {
6711
+ start = Math.max(firstWordStartIndex + 1, tag.plainTextBeginIndex);
6712
+ }
6713
+ const firstWordEndIndex = textInput.indexOf(' ', selectionStart);
6714
+ end = Math.max(firstWordEndIndex + 1, (_a = tag.plainTextEndIndex) !== null && _a !== void 0 ? _a : firstWordEndIndex + 1);
6715
+ if (selectionEnd !== null && tag.plainTextEndIndex !== undefined) {
6716
+ const lastWordEndIndex = textInput.indexOf(' ', selectionEnd);
6717
+ end = Math.max(lastWordEndIndex > -1 ? lastWordEndIndex : tag.plainTextEndIndex, selectionEnd);
6718
+ }
6719
+ return { start, end };
6720
+ };
6721
+ /* @conditional-compile-remove(mention) */
6605
6722
  /**
6606
6723
  * Find a new the selection index.
6607
6724
  *
@@ -8159,6 +8276,16 @@ const chatMessageMenuStyle = react.mergeStyles({
8159
8276
  cursor: 'pointer',
8160
8277
  overflow: 'hidden'
8161
8278
  });
8279
+ /**
8280
+ * @private
8281
+ */
8282
+ const chatMessageEditContainerStyle = {
8283
+ margin: 0,
8284
+ padding: 0,
8285
+ maxWidth: 'unset',
8286
+ minWidth: 'unset',
8287
+ backgroundColor: 'transparent'
8288
+ };
8162
8289
  /**
8163
8290
  * Styles that can be applied to ensure flyout items have the minimum touch target size.
8164
8291
  *
@@ -8247,31 +8374,34 @@ const ChatMessageComponentAsEditBox = (props) => {
8247
8374
  setAttachedFilesMetadata(attachedFilesMetadata === null || attachedFilesMetadata === void 0 ? void 0 : attachedFilesMetadata.filter((file) => file.name !== fileId));
8248
8375
  } }))));
8249
8376
  }, [attachedFilesMetadata]);
8250
- return (React__default['default'].createElement(react.Stack, { className: react.mergeStyles(borderAndBoxShadowStyle({
8251
- theme,
8252
- hasErrorMessage: message.failureReason !== undefined,
8253
- disabled: false
8254
- })) },
8255
- React__default['default'].createElement(InputBoxComponent, { inlineChildren: props.inlineEditButtons, id: 'editbox', textFieldRef: editTextFieldRef, inputClassName: editBoxStyle(props.inlineEditButtons), placeholderText: strings.editBoxPlaceholderText, textValue: textValue, onChange: setText, onEnterKeyDown: () => {
8256
- submitEnabled &&
8257
- onSubmit(textValue, message.metadata, {
8258
- attachedFilesMetadata
8259
- });
8260
- }, supportNewline: false, maxLength: MAXIMUM_LENGTH_OF_MESSAGE, errorMessage: textTooLongMessage, styles: editBoxStyles,
8261
- /* @conditional-compile-remove(mention) */
8262
- mentionLookupOptions: mentionLookupOptions },
8263
- React__default['default'].createElement(InputBoxButton, { className: editingButtonStyle, ariaLabel: strings.editBoxCancelButton, tooltipContent: strings.editBoxCancelButton, onRenderIcon: onRenderThemedCancelIcon, onClick: () => {
8264
- onCancel && onCancel(message.messageId);
8265
- }, id: 'dismissIconWrapper' }),
8266
- React__default['default'].createElement(InputBoxButton, { className: editingButtonStyle, ariaLabel: strings.editBoxSubmitButton, tooltipContent: strings.editBoxSubmitButton, onRenderIcon: onRenderThemedSubmitIcon, onClick: (e) => {
8377
+ const getContent = () => {
8378
+ return (React__default['default'].createElement(react.Stack, { className: react.mergeStyles(borderAndBoxShadowStyle({
8379
+ theme,
8380
+ hasErrorMessage: message.failureReason !== undefined,
8381
+ disabled: false
8382
+ })) },
8383
+ React__default['default'].createElement(InputBoxComponent, { inlineChildren: props.inlineEditButtons, id: 'editbox', textFieldRef: editTextFieldRef, inputClassName: editBoxStyle(props.inlineEditButtons), placeholderText: strings.editBoxPlaceholderText, textValue: textValue, onChange: setText, onEnterKeyDown: () => {
8267
8384
  submitEnabled &&
8268
8385
  onSubmit(textValue, message.metadata, {
8269
8386
  attachedFilesMetadata
8270
8387
  });
8271
- e.stopPropagation();
8272
- }, id: 'submitIconWrapper' })),
8273
- message.failureReason && (React__default['default'].createElement("div", { className: react.mergeStyles(chatMessageFailedTagStyle(theme), { padding: '0.5rem' }) }, message.failureReason)),
8274
- onRenderFileUploads()));
8388
+ }, supportNewline: false, maxLength: MAXIMUM_LENGTH_OF_MESSAGE, errorMessage: textTooLongMessage, styles: editBoxStyles,
8389
+ /* @conditional-compile-remove(mention) */
8390
+ mentionLookupOptions: mentionLookupOptions },
8391
+ React__default['default'].createElement(InputBoxButton, { className: editingButtonStyle, ariaLabel: strings.editBoxCancelButton, tooltipContent: strings.editBoxCancelButton, onRenderIcon: onRenderThemedCancelIcon, onClick: () => {
8392
+ onCancel && onCancel(message.messageId);
8393
+ }, id: 'dismissIconWrapper' }),
8394
+ React__default['default'].createElement(InputBoxButton, { className: editingButtonStyle, ariaLabel: strings.editBoxSubmitButton, tooltipContent: strings.editBoxSubmitButton, onRenderIcon: onRenderThemedSubmitIcon, onClick: (e) => {
8395
+ submitEnabled &&
8396
+ onSubmit(textValue, message.metadata, {
8397
+ attachedFilesMetadata
8398
+ });
8399
+ e.stopPropagation();
8400
+ }, id: 'submitIconWrapper' })),
8401
+ message.failureReason && (React__default['default'].createElement("div", { className: react.mergeStyles(chatMessageFailedTagStyle(theme), { padding: '0.5rem' }) }, message.failureReason)),
8402
+ onRenderFileUploads()));
8403
+ };
8404
+ return React__default['default'].createElement(i.Message, { styles: chatMessageEditContainerStyle, content: getContent() });
8275
8405
  };
8276
8406
  const isMessageTooLong = (messageText) => messageText.length > MAXIMUM_LENGTH_OF_MESSAGE;
8277
8407
  const isMessageEmpty = (messageText, attachedFilesMetadata) => messageText.trim().length === 0 && attachedFilesMetadata.length === 0;
@@ -10285,10 +10415,13 @@ const lightDismissContainerStyles = { root: { height: '100%' } };
10285
10415
  * @internal
10286
10416
  */
10287
10417
  const _DrawerSurface = (props) => {
10288
- var _a, _b, _c;
10289
- const rootStyles = react.mergeStyles(drawerSurfaceStyles, (_a = props.styles) === null || _a === void 0 ? void 0 : _a.root);
10418
+ var _a, _b, _c, _d;
10419
+ const rootStyles = props.disableMaxHeight
10420
+ ? react.mergeStyles(drawerSurfaceStyles, (_a = props.styles) === null || _a === void 0 ? void 0 : _a.root)
10421
+ : react.mergeStyles(drawerSurfaceStyles, focusTrapZoneStyles, (_b = props.styles) === null || _b === void 0 ? void 0 : _b.root);
10422
+ const containerStyles = react.mergeStyleSets(drawerContentContainerStyles, (_c = props.styles) === null || _c === void 0 ? void 0 : _c.drawerContentContainer);
10290
10423
  return (React__default['default'].createElement(react.Stack, { className: rootStyles },
10291
- React__default['default'].createElement(DrawerLightDismiss, { styles: (_b = props.styles) === null || _b === void 0 ? void 0 : _b.lightDismissRoot, onDismiss: props.onLightDismiss }),
10424
+ React__default['default'].createElement(DrawerLightDismiss, { styles: (_d = props.styles) === null || _d === void 0 ? void 0 : _d.lightDismissRoot, onDismiss: props.onLightDismiss }),
10292
10425
  React__default['default'].createElement(react.FocusTrapZone, { onKeyDown: (e) => {
10293
10426
  if (e.key === 'Escape' || e.key === 'Esc') {
10294
10427
  props.onLightDismiss && props.onLightDismiss();
@@ -10297,13 +10430,28 @@ const _DrawerSurface = (props) => {
10297
10430
  // Ensure when the focus trap has focus, the light dismiss area can still be clicked with mouse to dismiss.
10298
10431
  // Note: this still correctly captures keyboard focus, this just allows mouse click outside of the focus trap.
10299
10432
  isClickableOutsideFocusTrap: true },
10300
- React__default['default'].createElement(DrawerContentContainer, { styles: (_c = props.styles) === null || _c === void 0 ? void 0 : _c.drawerContentContainer, heading: props.heading }, props.children))));
10433
+ React__default['default'].createElement(DrawerContentContainer, { styles: containerStyles, heading: props.heading }, props.children))));
10301
10434
  };
10302
10435
  const drawerSurfaceStyles = {
10303
10436
  width: '100%',
10304
10437
  height: '100%',
10305
10438
  background: 'rgba(0,0,0,0.4)'
10306
10439
  };
10440
+ const focusTrapZoneStyles = {
10441
+ // Targets FocusTrapZone in drawer.
10442
+ // Setting percentage to Height to transform a container does not work unless the
10443
+ // direct parent container also has a Height set other than 'auto'.
10444
+ '> div:nth-child(2)': {
10445
+ maxHeight: '75%',
10446
+ overflow: 'auto'
10447
+ }
10448
+ };
10449
+ const drawerContentContainerStyles = {
10450
+ root: {
10451
+ // Needed to fill max height from parent, drawerSurfaceStyles
10452
+ height: '100%'
10453
+ }
10454
+ };
10307
10455
 
10308
10456
  // Copyright (c) Microsoft Corporation.
10309
10457
  /**
@@ -10344,7 +10492,7 @@ const _DrawerMenu = (props) => {
10344
10492
  borderTopLeftRadius: borderRadius
10345
10493
  }
10346
10494
  }), [firstItemStyle, borderRadius]);
10347
- return (React__default['default'].createElement(_DrawerSurface, { styles: (_b = props.styles) === null || _b === void 0 ? void 0 : _b.drawerSurfaceStyles, onLightDismiss: props.onLightDismiss, heading: props.heading },
10495
+ return (React__default['default'].createElement(_DrawerSurface, { disableMaxHeight: props.disableMaxHeight, styles: (_b = props.styles) === null || _b === void 0 ? void 0 : _b.drawerSurfaceStyles, onLightDismiss: props.onLightDismiss, heading: props.heading },
10348
10496
  React__default['default'].createElement(react.Stack, { styles: props.styles, role: "menu", "data-ui-id": "drawer-menu" }, menuItemsToRender === null || menuItemsToRender === void 0 ? void 0 :
10349
10497
  menuItemsToRender.slice(0, 1).map((item) => (React__default['default'].createElement(DrawerMenuItem, Object.assign({}, item, { key: '0', styles: modifiedFirstItemStyle, onItemClick: (ev, itemKey) => {
10350
10498
  onItemClick(item, ev, itemKey);
@@ -10703,7 +10851,8 @@ const moreButtonStyles = {
10703
10851
  zIndex: 1,
10704
10852
  color: 'inherit',
10705
10853
  top: '-0.125rem',
10706
- height: '100%'
10854
+ height: '100%',
10855
+ padding: '0rem'
10707
10856
  },
10708
10857
  rootHovered: {
10709
10858
  background: 'none'
@@ -10825,8 +10974,7 @@ const DEFAULT_PERSONA_MIN_SIZE_PX = 32;
10825
10974
  const DefaultPlaceholder = (props) => {
10826
10975
  const { text, noVideoAvailableAriaLabel, coinSize, hidePersonaDetails } = props;
10827
10976
  return (React__default['default'].createElement(react.Stack, { className: react.mergeStyles({ position: 'absolute', height: '100%', width: '100%' }) },
10828
- React__default['default'].createElement(react.Stack, { styles: defaultPersonaStyles },
10829
- React__default['default'].createElement(react.Persona, { coinSize: coinSize, hidePersonaDetails: hidePersonaDetails, text: text !== null && text !== void 0 ? text : '', initialsTextColor: "white", "aria-label": noVideoAvailableAriaLabel !== null && noVideoAvailableAriaLabel !== void 0 ? noVideoAvailableAriaLabel : '', showOverflowTooltip: false }))));
10977
+ React__default['default'].createElement(react.Stack, { styles: defaultPersonaStyles }, coinSize && (React__default['default'].createElement(react.Persona, { coinSize: coinSize, hidePersonaDetails: hidePersonaDetails, text: text !== null && text !== void 0 ? text : '', initialsTextColor: "white", "aria-label": noVideoAvailableAriaLabel !== null && noVideoAvailableAriaLabel !== void 0 ? noVideoAvailableAriaLabel : '', showOverflowTooltip: false })))));
10830
10978
  };
10831
10979
  const defaultPersonaStyles = { root: { margin: 'auto', maxHeight: '100%' } };
10832
10980
  /* @conditional-compile-remove(pinned-participants) */
@@ -10863,7 +11011,7 @@ const VideoTile = (props) => {
10863
11011
  const [isHovered, setIsHovered] = React.useState(false);
10864
11012
  /* @conditional-compile-remove(pinned-participants) */
10865
11013
  const [isFocused, setIsFocused] = React.useState(false);
10866
- const [personaSize, setPersonaSize] = React.useState(100);
11014
+ const [personaSize, setPersonaSize] = React.useState();
10867
11015
  const videoTileRef = React.useRef(null);
10868
11016
  const locale = useLocale$1();
10869
11017
  const theme = useTheme();
@@ -10947,7 +11095,7 @@ const VideoTile = (props) => {
10947
11095
  }) }, onRenderPlaceholder ? (onRenderPlaceholder(userId !== null && userId !== void 0 ? userId : '', placeholderOptions, DefaultPlaceholder)) : (React__default['default'].createElement(DefaultPlaceholder, Object.assign({}, placeholderOptions))))),
10948
11096
  (canShowLabel || participantStateString) && (React__default['default'].createElement(react.Stack, { horizontal: true, className: tileInfoContainerStyle, tokens: tileInfoContainerTokens },
10949
11097
  React__default['default'].createElement(react.Stack, { horizontal: true, className: tileInfoStyle },
10950
- canShowLabel && (React__default['default'].createElement(react.Text, { className: react.mergeStyles(displayNameStyle), title: displayName, style: { color: participantStateString ? theme.palette.neutralSecondary : 'inherit' } }, displayName)),
11098
+ canShowLabel && (React__default['default'].createElement(react.Text, { className: react.mergeStyles(displayNameStyle), title: displayName, style: { color: participantStateString ? theme.palette.neutralSecondary : 'inherit' }, "data-ui-id": "video-tile-display-name" }, displayName)),
10951
11099
  participantStateString && (React__default['default'].createElement(react.Text, { className: react.mergeStyles(participantStateStringStyles(theme)) }, bracketedParticipantString(participantStateString, !!canShowLabel))),
10952
11100
  showMuteIndicator && isMuted && (React__default['default'].createElement(react.Stack, { className: react.mergeStyles(iconContainerStyle) },
10953
11101
  React__default['default'].createElement(react.Icon, { iconName: "VideoTileMicOff" }))),
@@ -13690,6 +13838,9 @@ const generateDefaultDeviceMenuProps = (props, strings, primaryActionItem, isSel
13690
13838
  key: 'sectionCamera',
13691
13839
  title: strings.cameraMenuTooltip,
13692
13840
  subMenuProps: {
13841
+ calloutProps: {
13842
+ preventDismissOnEvent: _preventDismissOnEvent
13843
+ },
13693
13844
  items: cameras.map((camera) => ({
13694
13845
  key: camera.id,
13695
13846
  text: camera.name,
@@ -13730,6 +13881,9 @@ const generateDefaultDeviceMenuProps = (props, strings, primaryActionItem, isSel
13730
13881
  key: key,
13731
13882
  title: title,
13732
13883
  subMenuProps: {
13884
+ calloutProps: {
13885
+ preventDismissOnEvent: _preventDismissOnEvent
13886
+ },
13733
13887
  items: microphones.map((microphone) => ({
13734
13888
  key: microphone.id,
13735
13889
  text: microphone.name,
@@ -13762,6 +13916,9 @@ const generateDefaultDeviceMenuProps = (props, strings, primaryActionItem, isSel
13762
13916
  {
13763
13917
  key: 'sectionSpeaker',
13764
13918
  subMenuProps: {
13919
+ calloutProps: {
13920
+ preventDismissOnEvent: _preventDismissOnEvent
13921
+ },
13765
13922
  items: speakers.map((speaker) => ({
13766
13923
  key: speaker.id,
13767
13924
  text: speaker.name,
@@ -15581,6 +15738,12 @@ const captionContainerClassName = react.mergeStyles({
15581
15738
  * @private
15582
15739
  */
15583
15740
  const captionsBannerClassName = react.mergeStyles(Object.assign({ height: _pxToRem(100), overflowY: 'auto', overflowX: 'hidden' }, scrollbarStyles));
15741
+ /**
15742
+ * @private
15743
+ */
15744
+ const loadingBannerClassName = react.mergeStyles({
15745
+ height: _pxToRem(100)
15746
+ });
15584
15747
  /**
15585
15748
  * @private
15586
15749
  */
@@ -15629,7 +15792,7 @@ const _Caption = (props) => {
15629
15792
  * A component for displaying a CaptionsBanner with user icon, displayName and captions text.
15630
15793
  */
15631
15794
  const _CaptionsBanner = (props) => {
15632
- const { captions, isCaptionsOn, onRenderAvatar } = props;
15795
+ const { captions, isCaptionsOn, startCaptionsInProgress, onRenderAvatar, strings } = props;
15633
15796
  const captionsScrollDivRef = React.useRef(null);
15634
15797
  const [isAtBottomOfScroll, setIsAtBottomOfScroll] = React.useState(true);
15635
15798
  const scrollToBottom = () => {
@@ -15658,12 +15821,14 @@ const _CaptionsBanner = (props) => {
15658
15821
  scrollToBottom();
15659
15822
  }
15660
15823
  }, [captions, isAtBottomOfScroll]);
15661
- return (React__default['default'].createElement(React__default['default'].Fragment, null, isCaptionsOn && (React__default['default'].createElement(react.FocusZone, { as: "ul", className: captionsContainerClassName },
15662
- React__default['default'].createElement(c, { innerRef: captionsScrollDivRef },
15824
+ return (React__default['default'].createElement(React__default['default'].Fragment, null, startCaptionsInProgress && (React__default['default'].createElement(react.FocusZone, { as: "ul", className: captionsContainerClassName },
15825
+ isCaptionsOn && (React__default['default'].createElement(c, { innerRef: captionsScrollDivRef },
15663
15826
  React__default['default'].createElement(react.Stack, { verticalAlign: "start", className: captionsBannerClassName }, captions.map((caption) => {
15664
15827
  return (React__default['default'].createElement("div", { key: caption.id, className: captionContainerClassName, "data-is-focusable": true },
15665
15828
  React__default['default'].createElement(_Caption, Object.assign({}, caption, { onRenderAvatar: onRenderAvatar }))));
15666
- })))))));
15829
+ })))),
15830
+ !isCaptionsOn && (React__default['default'].createElement(react.Stack, { verticalAlign: "center", className: loadingBannerClassName, "data-is-focusable": true },
15831
+ React__default['default'].createElement(react.Spinner, { label: strings === null || strings === void 0 ? void 0 : strings.captionsBannerSpinnerText, ariaLive: "assertive", labelPosition: "right" })))))));
15667
15832
  };
15668
15833
 
15669
15834
  // Copyright (c) Microsoft Corporation.
@@ -15777,14 +15942,24 @@ const _CaptionsSettingsModal = (props) => {
15777
15942
  const { supportedSpokenLanguages, currentSpokenLanguage, isCaptionsFeatureActive, showModal, onSetSpokenLanguage, onDismissCaptionsSettings, onStartCaptions, strings, captionsAvailableLanguageStrings } = props;
15778
15943
  const theme = react.useTheme();
15779
15944
  const [selectedItem, setSelectedItem] = React.useState({
15780
- key: currentSpokenLanguage !== '' ? currentSpokenLanguage : defaultSpokenLanguage$1,
15781
- text: currentSpokenLanguage !== '' ? currentSpokenLanguage : defaultSpokenLanguage$1
15945
+ key: currentSpokenLanguage !== '' ? currentSpokenLanguage : defaultSpokenLanguage,
15946
+ text: currentSpokenLanguage !== '' ? currentSpokenLanguage : defaultSpokenLanguage
15782
15947
  });
15948
+ const [hasSetSpokenLanguage, setHasSetSpokenLanguage] = React.useState(false);
15783
15949
  const onDismiss = React.useCallback(() => {
15784
15950
  if (onDismissCaptionsSettings) {
15785
15951
  onDismissCaptionsSettings();
15786
15952
  }
15787
15953
  }, [onDismissCaptionsSettings]);
15954
+ React.useEffect(() => {
15955
+ // set spoken language when start captions with a spoken language specified.
15956
+ // this is to fix the bug when a second user starts captions with a new spoken language, captions bot ignore that spoken language
15957
+ if (isCaptionsFeatureActive && !hasSetSpokenLanguage) {
15958
+ onSetSpokenLanguage(selectedItem.key.toString());
15959
+ // we only need to call set spoken language once when first starting captions
15960
+ setHasSetSpokenLanguage(true);
15961
+ }
15962
+ }, [isCaptionsFeatureActive, onSetSpokenLanguage, selectedItem.key, hasSetSpokenLanguage]);
15788
15963
  const onConfirm = React.useCallback(() => __awaiter$p(void 0, void 0, void 0, function* () {
15789
15964
  const languageCode = selectedItem.key.toString();
15790
15965
  if (isCaptionsFeatureActive) {
@@ -15792,9 +15967,6 @@ const _CaptionsSettingsModal = (props) => {
15792
15967
  }
15793
15968
  else {
15794
15969
  yield onStartCaptions({ spokenLanguage: languageCode });
15795
- // set spoken language when start captions with a spoken language specified.
15796
- // this is to fix the bug when a second user starts captions with a new spoken language, captions bot ignore that spoken language
15797
- onSetSpokenLanguage(languageCode);
15798
15970
  }
15799
15971
  onDismiss();
15800
15972
  }), [onDismiss, isCaptionsFeatureActive, onSetSpokenLanguage, onStartCaptions, selectedItem.key]);
@@ -15816,7 +15988,7 @@ const _CaptionsSettingsModal = (props) => {
15816
15988
  }), []);
15817
15989
  const CaptionsSettingsComponent = React.useCallback(() => {
15818
15990
  return (React__default['default'].createElement(react.Stack, null,
15819
- React__default['default'].createElement(react.Dropdown, { label: strings === null || strings === void 0 ? void 0 : strings.captionsSettingsDropdownLabel, selectedKey: selectedItem ? selectedItem.key : undefined, onChange: onChange, calloutProps: calloutProps, placeholder: currentSpokenLanguage !== '' ? currentSpokenLanguage : defaultSpokenLanguage$1, options: dropdownOptions, styles: dropdownStyles }),
15991
+ React__default['default'].createElement(react.Dropdown, { label: strings === null || strings === void 0 ? void 0 : strings.captionsSettingsDropdownLabel, selectedKey: selectedItem ? selectedItem.key : undefined, onChange: onChange, calloutProps: calloutProps, placeholder: currentSpokenLanguage !== '' ? currentSpokenLanguage : defaultSpokenLanguage, options: dropdownOptions, styles: dropdownStyles }),
15820
15992
  React__default['default'].createElement(react.Text, { className: dropdownInfoTextStyle(theme) }, strings === null || strings === void 0 ? void 0 : strings.captionsSettingsDropdownInfoText)));
15821
15993
  }, [
15822
15994
  calloutProps,
@@ -18330,7 +18502,7 @@ const CallCompositeIcon = (props) => (React__default['default'].createElement(re
18330
18502
  */
18331
18503
  const CallWithChatCompositeIcon = (props) => (React__default['default'].createElement(react.FontIcon, Object.assign({}, props)));
18332
18504
 
18333
- var call$d={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",leftCallMoreDetails:"If this was a mistake, re-join the call.",leftCallTitle:"You left the call",lobbyScreenConnectingToCallTitle:"Joining call",lobbyScreenWaitingToBeAdmittedTitle:"Waiting to be admitted",microphonePermissionDenied:"Your browser is blocking access to your microphone",microphoneToggleInLobbyNotAllowed:"Cannot mute or unmute while in lobby.",mutedMessage:"You're muted",networkReconnectMoreDetails:"Looks like something went wrong. We're trying to get back into the call.",networkReconnectTitle:"Hold on",deniedPermissionToRoomDetails:"You do not have permission to join this room.",deniedPermissionToRoomTitle:"Permission denied to room",peopleButtonLabel:"People",peoplePaneTitle:"People",peopleButtonTooltipOpen:"Show participants",peopleButtonTooltipClose:"Hide participants",peoplePaneSubTitle:"In this call",privacyPolicy:"Privacy policy",rejoinCallButtonLabel:"Re-join call",removedFromCallMoreDetails:"Another participant removed you from the call.",removedFromCallTitle:"You were removed",removeMenuLabel:"Remove",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back",roomNotFoundDetails:"Room ID provided is not valid.",roomNotFoundTitle:"Room not found",soundLabel:"Sound",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"}};var chat$d={chatListHeader:"In this chat",uploadFile:"Upload File"};var callWithChat$d={chatButtonLabel:"Chat",chatButtonNewMessageNotificationLabel:"New Message",chatButtonTooltipClosedWithMessageCount:"Show chat ({unreadMessagesCount} unread)",chatButtonTooltipClose:"Hide chat",chatButtonTooltipOpen:"Show chat",chatPaneTitle:"Chat",copyInviteLinkButtonLabel:"Copy invite link",copyInviteLinkActionedAriaLabel:"Invite link copied",dismissSidePaneButtonLabel:"Close",moreDrawerAudioDeviceMenuTitle:"Audio Device",moreDrawerButtonLabel:"More options",moreDrawerButtonTooltip:"More options",moreDrawerMicrophoneMenuTitle:"Microphone",moreDrawerSpeakerMenuTitle:"Speaker",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_US = {call:call$d,chat:chat$d,callWithChat:callWithChat$d};
18505
+ var call$d={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",leftCallMoreDetails:"If this was a mistake, re-join the call.",leftCallTitle:"You left the call",lobbyScreenConnectingToCallTitle:"Joining call",lobbyScreenWaitingToBeAdmittedTitle:"Waiting to be admitted",microphonePermissionDenied:"Your browser is blocking access to your microphone",microphoneToggleInLobbyNotAllowed:"Cannot mute or unmute while in lobby.",mutedMessage:"You're muted",networkReconnectMoreDetails:"Looks like something went wrong. We're trying to get back into the call.",networkReconnectTitle:"Hold on",deniedPermissionToRoomDetails:"You do not have permission to join this room.",deniedPermissionToRoomTitle:"Permission denied to room",peopleButtonLabel:"People",peoplePaneTitle:"People",peopleButtonTooltipOpen:"Show participants",peopleButtonTooltipClose:"Hide participants",peoplePaneSubTitle:"In this call",privacyPolicy:"Privacy policy",rejoinCallButtonLabel:"Re-join call",removedFromCallMoreDetails:"Another participant removed you from the call.",removedFromCallTitle:"You were removed",removeMenuLabel:"Remove",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back",roomNotFoundDetails:"Room ID provided is not valid.",roomNotFoundTitle:"Room not found",soundLabel:"Sound",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..."};var chat$d={chatListHeader:"In this chat",uploadFile:"Upload File"};var callWithChat$d={chatButtonLabel:"Chat",chatButtonNewMessageNotificationLabel:"New Message",chatButtonTooltipClosedWithMessageCount:"Show chat ({unreadMessagesCount} unread)",chatButtonTooltipClose:"Hide chat",chatButtonTooltipOpen:"Show chat",chatPaneTitle:"Chat",copyInviteLinkButtonLabel:"Copy invite link",copyInviteLinkActionedAriaLabel:"Invite link copied",dismissSidePaneButtonLabel:"Close",moreDrawerAudioDeviceMenuTitle:"Audio Device",moreDrawerButtonLabel:"More options",moreDrawerButtonTooltip:"More options",moreDrawerMicrophoneMenuTitle:"Microphone",moreDrawerSpeakerMenuTitle:"Speaker",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_US = {call:call$d,chat:chat$d,callWithChat:callWithChat$d};
18334
18506
 
18335
18507
  var call$c={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",leftCallMoreDetails:"If this was a mistake, re-join the call.",leftCallTitle:"You left the call",lobbyScreenConnectingToCallTitle:"Joining call",lobbyScreenWaitingToBeAdmittedTitle:"Waiting to be admitted",microphonePermissionDenied:"Your browser is blocking access to your microphone",microphoneToggleInLobbyNotAllowed:"Cannot mute or unmute while in lobby.",mutedMessage:"You're muted",networkReconnectMoreDetails:"Looks like something went wrong. We're trying to get back into the call.",networkReconnectTitle:"Hold on",deniedPermissionToRoomDetails:"You do not have permission to join this room.",deniedPermissionToRoomTitle:"Permission denied to room",peopleButtonLabel:"People",peoplePaneTitle:"People",peopleButtonTooltipOpen:"Show participants",peopleButtonTooltipClose:"Hide participants",peoplePaneSubTitle:"In this call",privacyPolicy:"Privacy policy",rejoinCallButtonLabel:"Re-join call",removedFromCallMoreDetails:"Another participant removed you from the call.",removedFromCallTitle:"You were removed",removeMenuLabel:"Remove",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back",roomNotFoundDetails:"Room ID provided is not valid.",roomNotFoundTitle:"Room not found",soundLabel:"Sound",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"}};var chat$c={chatListHeader:"In this chat",uploadFile:"Upload File"};var callWithChat$c={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$c,chat:chat$c,callWithChat:callWithChat$c};
18336
18508
 
@@ -20742,9 +20914,6 @@ const CaptionsBannerMoreButton = (props) => {
20742
20914
  yield startCaptionsButtonHandlers.onStartCaptions({
20743
20915
  spokenLanguage: startCaptionsButtonProps.currentSpokenLanguage
20744
20916
  });
20745
- // set spoken language when start captions with a spoken language specified.
20746
- // this is to fix the bug when a second user starts captions with a new spoken language, captions bot ignore that spoken language
20747
- startCaptionsButtonHandlers.onSetSpokenLanguage(startCaptionsButtonProps.currentSpokenLanguage);
20748
20917
  }), [startCaptionsButtonHandlers, startCaptionsButtonProps.currentSpokenLanguage]);
20749
20918
  /* @conditional-compile-remove(close-captions) */
20750
20919
  moreButtonContextualMenuItems.push({
@@ -20824,15 +20993,21 @@ const CaptionsBanner = (props) => {
20824
20993
  right: 0,
20825
20994
  top: 0
20826
20995
  });
20996
+ /* @conditional-compile-remove(close-captions) */
20997
+ const strings = useLocale().strings.call;
20998
+ /* @conditional-compile-remove(close-captions) */
20999
+ const captionsBannerStrings = {
21000
+ captionsBannerSpinnerText: strings.captionsBannerSpinnerText
21001
+ };
20827
21002
  return (React__default['default'].createElement(React__default['default'].Fragment, null,
20828
21003
  /* @conditional-compile-remove(close-captions) */ isCaptionsSettingsOpen && (React__default['default'].createElement(CaptionsSettingsModal, { showCaptionsSettingsModal: isCaptionsSettingsOpen, onDismissCaptionsSettings: onDismissCaptionsSettings })),
20829
- /* @conditional-compile-remove(close-captions) */ captionsBannerProps.captions.length > 0 &&
20830
- captionsBannerProps.isCaptionsOn && (React__default['default'].createElement("div", { className: containerClassName },
21004
+ /* @conditional-compile-remove(close-captions) */
21005
+ React__default['default'].createElement("div", { className: containerClassName },
20831
21006
  React__default['default'].createElement(react.Stack, { horizontalAlign: "center" },
20832
21007
  React__default['default'].createElement(react.Stack.Item, { style: { width: props.isMobile ? mobileViewBannerWidth : desktopViewBannerWidth } },
20833
- React__default['default'].createElement(_CaptionsBanner, Object.assign({}, captionsBannerProps, handlers)))),
20834
- !props.isMobile && (React__default['default'].createElement("div", { className: floatingChildClassName },
20835
- React__default['default'].createElement(CaptionsBannerMoreButton, { onCaptionsSettingsClick: onClickCaptionsSettings })))))));
21008
+ React__default['default'].createElement(_CaptionsBanner, Object.assign({}, captionsBannerProps, handlers, { strings: captionsBannerStrings })))),
21009
+ !props.isMobile && captionsBannerProps.isCaptionsOn && (React__default['default'].createElement("div", { className: floatingChildClassName },
21010
+ React__default['default'].createElement(CaptionsBannerMoreButton, { onCaptionsSettingsClick: onClickCaptionsSettings }))))));
20836
21011
  };
20837
21012
 
20838
21013
  // Copyright (c) Microsoft Corporation.
@@ -21227,7 +21402,7 @@ const SendDtmfDialpad = (props) => {
21227
21402
  const dialpadStyle = React.useMemo(() => themedDialpadStyle$1(isMobile, theme), [theme, isMobile]);
21228
21403
  if (isMobile) {
21229
21404
  return (React__default['default'].createElement(react.Stack, null, showDialpad && (React__default['default'].createElement(react.Stack, { styles: drawerContainerStyles() },
21230
- React__default['default'].createElement(_DrawerSurface, { onLightDismiss: onDismissTriggered },
21405
+ React__default['default'].createElement(_DrawerSurface, { disableMaxHeight: true, onLightDismiss: onDismissTriggered },
21231
21406
  React__default['default'].createElement(react.Stack, { style: { padding: '1rem' } },
21232
21407
  React__default['default'].createElement(Dialpad, Object.assign({ styles: dialpadStyle }, dialpadProps, { showDeleteButton: false, textFieldValue: textFieldValue, onChange: onChange, strings: strings, isMobile: isMobile }))))))));
21233
21408
  }
@@ -21605,9 +21780,6 @@ const DesktopMoreButton = (props) => {
21605
21780
  yield startCaptionsButtonHandlers.onStartCaptions({
21606
21781
  spokenLanguage: startCaptionsButtonProps.currentSpokenLanguage
21607
21782
  });
21608
- // set spoken language when start captions with a spoken language specified.
21609
- // this is to fix the bug when a second user starts captions with a new spoken language, captions bot ignore that spoken language
21610
- startCaptionsButtonHandlers.onSetSpokenLanguage(startCaptionsButtonProps.currentSpokenLanguage);
21611
21783
  }), [startCaptionsButtonHandlers, startCaptionsButtonProps.currentSpokenLanguage]);
21612
21784
  /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */ /* @conditional-compile-remove(close-captions) */
21613
21785
  const moreButtonStrings = React.useMemo(() => ({
@@ -22092,116 +22264,12 @@ const callStatusSelector = reselect.createSelector([getCallStatus, getIsScreenSh
22092
22264
  };
22093
22265
  });
22094
22266
 
22095
- // Copyright (c) Microsoft Corporation.
22096
- /**
22097
- * Default Modal PIP related pixel measurements used for ModalLocalAndremotePIP and common/utils.
22098
- *
22099
- * @private
22100
- */
22101
- const MODAL_PIP_DEFAULT_PX = {
22102
- rightPositionPx: 16,
22103
- topPositionPx: 52,
22104
- widthPx: 88,
22105
- heightPx: 128
22106
- };
22107
- /**
22108
- * @private
22109
- */
22110
- const getPipStyles = (theme) => ({
22111
- modal: {
22112
- main: Object.assign(Object.assign({ borderRadius: theme.effects.roundedCorner4, boxShadow: theme.effects.elevation8,
22113
- // Above the message thread / people pane.
22114
- zIndex: 2 }, (theme.rtl
22115
- ? { left: _pxToRem(MODAL_PIP_DEFAULT_PX.rightPositionPx) }
22116
- : { right: _pxToRem(MODAL_PIP_DEFAULT_PX.rightPositionPx) })), { top: _pxToRem(MODAL_PIP_DEFAULT_PX.topPositionPx) })
22117
- }
22118
- });
22119
- /**
22120
- * @private
22121
- */
22122
- const PIPContainerStyle = {
22123
- root: { position: 'absolute', width: '100%', height: '100%', pointerEvents: 'none' }
22124
- };
22125
- /**
22126
- * @private
22127
- */
22128
- const hiddenStyle = react.concatStyleSets(PIPContainerStyle, { root: { display: 'none' } });
22129
- /**
22130
- * @private
22131
- */
22132
- const modalStyle = {
22133
- main: {
22134
- minWidth: 'min-content',
22135
- minHeight: 'min-content',
22136
- position: 'absolute',
22137
- overflow: 'hidden',
22138
- // pointer events for root Modal div set to auto to make LocalAndRemotePIP interactive
22139
- pointerEvents: 'auto',
22140
- touchAction: 'none'
22141
- },
22142
- root: {
22143
- width: '100%',
22144
- height: '100%',
22145
- // pointer events for root Modal div set to none to make descendants interactive
22146
- pointerEvents: 'none'
22147
- }
22148
- };
22149
- /**
22150
- * Styles for layer host to bound the modal wrapping PiPiP in the mobile pane.
22151
- * @private
22152
- */
22153
- const modalLayerHostStyle = {
22154
- display: 'flex',
22155
- position: 'absolute',
22156
- left: 0,
22157
- top: 0,
22158
- width: '100%',
22159
- height: '100%',
22160
- overflow: 'hidden',
22161
- zIndex: '100000',
22162
- // pointer events for layerHost set to none to make descendants interactive
22163
- pointerEvents: 'none'
22164
- };
22165
-
22166
- // Copyright (c) Microsoft Corporation.
22167
- /**
22168
- * @private
22169
- */
22170
- // Use document.getElementById until Fluent's Stack supports componentRef property: https://github.com/microsoft/fluentui/issues/20410
22171
- const useMinMaxDragPosition = (modalLayerHostId, rtl) => {
22172
- const modalHostRef = React.useRef(document.getElementById(modalLayerHostId));
22173
- const modalHostWidth = _useContainerWidth(modalHostRef);
22174
- const modalHostHeight = _useContainerHeight(modalHostRef);
22175
- const minDragPosition = React.useMemo(() => modalHostWidth === undefined
22176
- ? undefined
22177
- : {
22178
- x: rtl
22179
- ? -1 * MODAL_PIP_DEFAULT_PX.rightPositionPx
22180
- : MODAL_PIP_DEFAULT_PX.rightPositionPx - modalHostWidth + MODAL_PIP_DEFAULT_PX.widthPx,
22181
- y: -1 * MODAL_PIP_DEFAULT_PX.topPositionPx
22182
- }, [modalHostWidth, rtl]);
22183
- const maxDragPosition = React.useMemo(() => modalHostWidth === undefined || modalHostHeight === undefined
22184
- ? undefined
22185
- : {
22186
- x: rtl
22187
- ? modalHostWidth - MODAL_PIP_DEFAULT_PX.rightPositionPx - MODAL_PIP_DEFAULT_PX.widthPx
22188
- : MODAL_PIP_DEFAULT_PX.rightPositionPx,
22189
- y: modalHostHeight - MODAL_PIP_DEFAULT_PX.topPositionPx - MODAL_PIP_DEFAULT_PX.heightPx
22190
- }, [modalHostHeight, modalHostWidth, rtl]);
22191
- return { minDragPosition: minDragPosition, maxDragPosition: maxDragPosition };
22192
- };
22193
- /**
22194
- * @private
22195
- */
22196
- const defaultSpokenLanguage = 'en-us';
22197
-
22198
22267
  // Copyright (c) Microsoft Corporation.
22199
22268
  /**
22200
22269
  * @private
22201
22270
  */
22202
22271
  const spokenLanguageDrawerStyles = (theme) => ({
22203
22272
  root: {
22204
- height: _pxToRem(300),
22205
22273
  overflow: 'auto'
22206
22274
  },
22207
22275
  drawerSurfaceStyles: {
@@ -22418,18 +22486,13 @@ const MoreDrawer = (props) => {
22418
22486
  /* @conditional-compile-remove(close-captions) */
22419
22487
  const [isSpokenLanguageDrawerOpen, setIsSpokenLanguageDrawerOpen] = React.useState(false);
22420
22488
  /* @conditional-compile-remove(close-captions) */
22421
- const [currentSpokenLanguage, setCurrentSpokenLanguage] = React.useState(startCaptionsButtonProps.currentSpokenLanguage === ''
22422
- ? defaultSpokenLanguage
22423
- : startCaptionsButtonProps.currentSpokenLanguage);
22489
+ const [currentSpokenLanguage, setCurrentSpokenLanguage] = React.useState(startCaptionsButtonProps.currentSpokenLanguage);
22424
22490
  /* @conditional-compile-remove(close-captions) */
22425
22491
  const onToggleChange = React.useCallback(() => __awaiter$b(void 0, void 0, void 0, function* () {
22426
22492
  if (!startCaptionsButtonProps.checked) {
22427
22493
  yield startCaptionsButtonHandlers.onStartCaptions({
22428
22494
  spokenLanguage: currentSpokenLanguage
22429
22495
  });
22430
- // set spoken language when start captions with a spoken language specified.
22431
- // this is to fix the bug when a second user starts captions with a new spoken language, captions bot ignore that spoken language
22432
- startCaptionsButtonHandlers.onSetSpokenLanguage(currentSpokenLanguage);
22433
22496
  }
22434
22497
  else {
22435
22498
  startCaptionsButtonHandlers.onStopCaptions();
@@ -22969,7 +23032,7 @@ const CallingDialpad = (props) => {
22969
23032
  };
22970
23033
  if (isMobile) {
22971
23034
  return (React__default['default'].createElement(react.Stack, { "data-ui-id": "call-with-chat-composite-dialpad" }, showDialpad && (React__default['default'].createElement(react.Stack, { styles: drawerContainerStyles() },
22972
- React__default['default'].createElement(_DrawerSurface, { onLightDismiss: onDismissTriggered },
23035
+ React__default['default'].createElement(_DrawerSurface, { onLightDismiss: onDismissTriggered, disableMaxHeight: true },
22973
23036
  React__default['default'].createElement(react.Stack, { style: { padding: '1rem' } }, dialpadComponent()))))));
22974
23037
  }
22975
23038
  return (React__default['default'].createElement(React__default['default'].Fragment, null, React__default['default'].createElement(react.Modal, { titleAriaId: strings.dialpadModalAriaLabel, isOpen: showDialpad, onDismiss: onDismissTriggered, isBlocking: true, styles: dialpadModalStyle, "data-ui-id": "call-with-chat-composite-dialpad" },
@@ -23054,7 +23117,7 @@ const AddPeopleDropdown = (props) => {
23054
23117
  defaultMenuProps.items.length > 0 && (React__default['default'].createElement(react.Stack.Item, { styles: copyLinkButtonContainerStyles },
23055
23118
  React__default['default'].createElement(react.PrimaryButton, { onClick: setDrawerMenuItemsForAddPeople, styles: copyLinkButtonStylesThemed, onRenderIcon: () => PeoplePaneAddPersonIconTrampoline(), text: strings.peoplePaneAddPeopleButtonLabel, "data-ui-id": "call-add-people-button" }))),
23056
23119
  addPeopleDrawerMenuItems.length > 0 && (React__default['default'].createElement(react.Stack, { styles: drawerContainerStyles(), "data-ui-id": "call-add-people-dropdown" },
23057
- React__default['default'].createElement(_DrawerMenu, { onLightDismiss: () => setAddPeopleDrawerMenuItems([]), items: addPeopleDrawerMenuItems }))),
23120
+ React__default['default'].createElement(_DrawerMenu, { disableMaxHeight: true, onLightDismiss: () => setAddPeopleDrawerMenuItems([]), items: addPeopleDrawerMenuItems }))),
23058
23121
  alternateCallerId && (React__default['default'].createElement(CallingDialpad, { isMobile: true, strings: strings, showDialpad: showDialpad, onDismissDialpad: onDismissDialpad, onAddParticipant: onAddParticipant, alternateCallerId: alternateCallerId }))));
23059
23122
  }
23060
23123
  return (React__default['default'].createElement(React__default['default'].Fragment, null, React__default['default'].createElement(react.Stack, null,
@@ -23617,6 +23680,77 @@ const localAndRemotePIPSelector = reselect__namespace.createSelector([getDisplay
23617
23680
  };
23618
23681
  });
23619
23682
 
23683
+ // Copyright (c) Microsoft Corporation.
23684
+ /**
23685
+ * Default Modal PIP related pixel measurements used for ModalLocalAndremotePIP and common/utils.
23686
+ *
23687
+ * @private
23688
+ */
23689
+ const MODAL_PIP_DEFAULT_PX = {
23690
+ rightPositionPx: 16,
23691
+ topPositionPx: 52,
23692
+ widthPx: 88,
23693
+ heightPx: 128
23694
+ };
23695
+ /**
23696
+ * @private
23697
+ */
23698
+ const getPipStyles = (theme) => ({
23699
+ modal: {
23700
+ main: Object.assign(Object.assign({ borderRadius: theme.effects.roundedCorner4, boxShadow: theme.effects.elevation8,
23701
+ // Above the message thread / people pane.
23702
+ zIndex: 2 }, (theme.rtl
23703
+ ? { left: _pxToRem(MODAL_PIP_DEFAULT_PX.rightPositionPx) }
23704
+ : { right: _pxToRem(MODAL_PIP_DEFAULT_PX.rightPositionPx) })), { top: _pxToRem(MODAL_PIP_DEFAULT_PX.topPositionPx) })
23705
+ }
23706
+ });
23707
+ /**
23708
+ * @private
23709
+ */
23710
+ const PIPContainerStyle = {
23711
+ root: { position: 'absolute', width: '100%', height: '100%', pointerEvents: 'none' }
23712
+ };
23713
+ /**
23714
+ * @private
23715
+ */
23716
+ const hiddenStyle = react.concatStyleSets(PIPContainerStyle, { root: { display: 'none' } });
23717
+ /**
23718
+ * @private
23719
+ */
23720
+ const modalStyle = {
23721
+ main: {
23722
+ minWidth: 'min-content',
23723
+ minHeight: 'min-content',
23724
+ position: 'absolute',
23725
+ overflow: 'hidden',
23726
+ // pointer events for root Modal div set to auto to make LocalAndRemotePIP interactive
23727
+ pointerEvents: 'auto',
23728
+ touchAction: 'none'
23729
+ },
23730
+ root: {
23731
+ width: '100%',
23732
+ height: '100%',
23733
+ // pointer events for root Modal div set to none to make descendants interactive
23734
+ pointerEvents: 'none'
23735
+ }
23736
+ };
23737
+ /**
23738
+ * Styles for layer host to bound the modal wrapping PiPiP in the mobile pane.
23739
+ * @private
23740
+ */
23741
+ const modalLayerHostStyle = {
23742
+ display: 'flex',
23743
+ position: 'absolute',
23744
+ left: 0,
23745
+ top: 0,
23746
+ width: '100%',
23747
+ height: '100%',
23748
+ overflow: 'hidden',
23749
+ zIndex: '100000',
23750
+ // pointer events for layerHost set to none to make descendants interactive
23751
+ pointerEvents: 'none'
23752
+ };
23753
+
23620
23754
  // Copyright (c) Microsoft Corporation.
23621
23755
  /**
23622
23756
  * Drag options for Modal in {@link ModalLocalAndRemotePIP} component
@@ -23663,6 +23797,34 @@ const ModalLocalAndRemotePIP = (props) => {
23663
23797
  !props.hidden && localAndRemotePIP)));
23664
23798
  };
23665
23799
 
23800
+ // Copyright (c) Microsoft Corporation.
23801
+ /**
23802
+ * @private
23803
+ */
23804
+ // Use document.getElementById until Fluent's Stack supports componentRef property: https://github.com/microsoft/fluentui/issues/20410
23805
+ const useMinMaxDragPosition = (modalLayerHostId, rtl) => {
23806
+ const modalHostRef = React.useRef(document.getElementById(modalLayerHostId));
23807
+ const modalHostWidth = _useContainerWidth(modalHostRef);
23808
+ const modalHostHeight = _useContainerHeight(modalHostRef);
23809
+ const minDragPosition = React.useMemo(() => modalHostWidth === undefined
23810
+ ? undefined
23811
+ : {
23812
+ x: rtl
23813
+ ? -1 * MODAL_PIP_DEFAULT_PX.rightPositionPx
23814
+ : MODAL_PIP_DEFAULT_PX.rightPositionPx - modalHostWidth + MODAL_PIP_DEFAULT_PX.widthPx,
23815
+ y: -1 * MODAL_PIP_DEFAULT_PX.topPositionPx
23816
+ }, [modalHostWidth, rtl]);
23817
+ const maxDragPosition = React.useMemo(() => modalHostWidth === undefined || modalHostHeight === undefined
23818
+ ? undefined
23819
+ : {
23820
+ x: rtl
23821
+ ? modalHostWidth - MODAL_PIP_DEFAULT_PX.rightPositionPx - MODAL_PIP_DEFAULT_PX.widthPx
23822
+ : MODAL_PIP_DEFAULT_PX.rightPositionPx,
23823
+ y: modalHostHeight - MODAL_PIP_DEFAULT_PX.topPositionPx - MODAL_PIP_DEFAULT_PX.heightPx
23824
+ }, [modalHostHeight, modalHostWidth, rtl]);
23825
+ return { minDragPosition: minDragPosition, maxDragPosition: maxDragPosition };
23826
+ };
23827
+
23666
23828
  // Copyright (c) Microsoft Corporation.
23667
23829
  /**
23668
23830
  * @private
@@ -24028,8 +24190,7 @@ const MediaGallery = (props) => {
24028
24190
  }, [cameraSwitcherCallback, cameraSwitcherCameras]);
24029
24191
  const onRenderAvatar = React.useCallback((userId, options) => {
24030
24192
  return (React__default['default'].createElement(react.Stack, { className: react.mergeStyles({ position: 'absolute', height: '100%', width: '100%' }) },
24031
- React__default['default'].createElement(react.Stack, { styles: { root: { margin: 'auto', maxHeight: '100%' } } },
24032
- React__default['default'].createElement(AvatarPersona, Object.assign({ userId: userId }, options, { dataProvider: props.onFetchAvatarPersonaData })))));
24193
+ React__default['default'].createElement(react.Stack, { styles: { root: { margin: 'auto', maxHeight: '100%' } } }, (options === null || options === void 0 ? void 0 : options.coinSize) && (React__default['default'].createElement(AvatarPersona, Object.assign({ userId: userId }, options, { dataProvider: props.onFetchAvatarPersonaData }))))));
24033
24194
  }, [props.onFetchAvatarPersonaData]);
24034
24195
  useLocalVideoStartTrigger(!!props.isVideoStreamOn);
24035
24196
  /* @conditional-compile-remove(pinned-participants) */
@@ -25001,7 +25162,7 @@ const CallReadinessModal = (props) => {
25001
25162
  }
25002
25163
  };
25003
25164
  if (mobileView && modal !== undefined) {
25004
- return (React__default['default'].createElement(React__default['default'].Fragment, null, isPermissionsModalDismissed && (React__default['default'].createElement(_DrawerSurface, { onLightDismiss: onLightDismissTriggered, styles: drawerContainerStyles(DRAWER_HIGH_Z_BAND) }, modal()))));
25165
+ return (React__default['default'].createElement(React__default['default'].Fragment, null, isPermissionsModalDismissed && (React__default['default'].createElement(_DrawerSurface, { disableMaxHeight: true, onLightDismiss: onLightDismissTriggered, styles: drawerContainerStyles(DRAWER_HIGH_Z_BAND) }, modal()))));
25005
25166
  }
25006
25167
  else if (!mobileView && modal !== undefined) {
25007
25168
  return (React__default['default'].createElement(_ModalClone, { styles: {
@@ -25070,7 +25231,7 @@ const CallReadinessModalFallBack = (props) => {
25070
25231
  };
25071
25232
  if (mobileView) {
25072
25233
  return (React__default['default'].createElement(React__default['default'].Fragment, null,
25073
- (checkPermissionModalShowing || audioState === 'prompt' || videoState === 'prompt') && (React__default['default'].createElement(_DrawerSurface, { onLightDismiss: onLightDismissTriggered, styles: drawerContainerStyles(DRAWER_HIGH_Z_BAND) },
25234
+ (checkPermissionModalShowing || audioState === 'prompt' || videoState === 'prompt') && (React__default['default'].createElement(_DrawerSurface, { disableMaxHeight: true, onLightDismiss: onLightDismissTriggered, styles: drawerContainerStyles(DRAWER_HIGH_Z_BAND) },
25074
25235
  React__default['default'].createElement(CameraAndMicrophoneSitePermissions, { appName: 'app',
25075
25236
  /* @conditional-compile-remove(unsupported-browser) */
25076
25237
  browserHint: isSafari ? 'safari' : 'unset', onTroubleshootingClick: onPermissionsTroubleshootingClick
@@ -25078,7 +25239,7 @@ const CallReadinessModalFallBack = (props) => {
25078
25239
  onPermissionsTroubleshootingClick(permissionsState);
25079
25240
  }
25080
25241
  : undefined, kind: "check" }))),
25081
- isPermissionsModalDismissed && !checkPermissionModalShowing && modal !== undefined && (React__default['default'].createElement(_DrawerSurface, { onLightDismiss: onLightDismissTriggered, styles: drawerContainerStyles(DRAWER_HIGH_Z_BAND) }, modal()))));
25242
+ isPermissionsModalDismissed && !checkPermissionModalShowing && modal !== undefined && (React__default['default'].createElement(_DrawerSurface, { disableMaxHeight: true, onLightDismiss: onLightDismissTriggered, styles: drawerContainerStyles(DRAWER_HIGH_Z_BAND) }, modal()))));
25082
25243
  }
25083
25244
  else {
25084
25245
  return (React__default['default'].createElement(React__default['default'].Fragment, null,