@azure/communication-react 1.11.0-alpha-202312120013 → 1.11.0-alpha-202312150013

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 (102) hide show
  1. package/dist/communication-react.d.ts +200 -1
  2. package/dist/dist-cjs/communication-react/index.js +488 -62
  3. package/dist/dist-cjs/communication-react/index.js.map +1 -1
  4. package/dist/dist-esm/acs-ui-common/src/telemetry.js +2 -2
  5. package/dist/dist-esm/acs-ui-common/src/telemetry.js.map +1 -1
  6. package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js +1 -1
  7. package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js.map +1 -1
  8. package/dist/dist-esm/calling-component-bindings/src/handlers/createCommonHandlers.d.ts +2 -0
  9. package/dist/dist-esm/calling-component-bindings/src/handlers/createCommonHandlers.js +39 -26
  10. package/dist/dist-esm/calling-component-bindings/src/handlers/createCommonHandlers.js.map +1 -1
  11. package/dist/dist-esm/calling-component-bindings/src/participantListSelector.js +0 -1
  12. package/dist/dist-esm/calling-component-bindings/src/participantListSelector.js.map +1 -1
  13. package/dist/dist-esm/calling-component-bindings/src/videoGallerySelector.js.map +1 -1
  14. package/dist/dist-esm/calling-stateful-client/src/Converter.js.map +1 -1
  15. package/dist/dist-esm/calling-stateful-client/src/DeviceManagerDeclarative.d.ts +2 -2
  16. package/dist/dist-esm/calling-stateful-client/src/DeviceManagerDeclarative.js.map +1 -1
  17. package/dist/dist-esm/chat-component-bindings/src/messageThreadSelector.js +20 -6
  18. package/dist/dist-esm/chat-component-bindings/src/messageThreadSelector.js.map +1 -1
  19. package/dist/dist-esm/communication-react/src/index.d.ts +2 -0
  20. package/dist/dist-esm/communication-react/src/index.js.map +1 -1
  21. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentAsMessageBubble.js +4 -1
  22. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentAsMessageBubble.js.map +1 -1
  23. package/dist/dist-esm/react-components/src/components/Survey/StarSurvey/StarSurvey.d.ts +64 -0
  24. package/dist/dist-esm/react-components/src/components/Survey/StarSurvey/StarSurvey.js +54 -0
  25. package/dist/dist-esm/react-components/src/components/Survey/StarSurvey/StarSurvey.js.map +1 -0
  26. package/dist/dist-esm/react-components/src/components/Survey/StarSurvey/StarSurvey.styles.d.ts +14 -0
  27. package/dist/dist-esm/react-components/src/components/Survey/StarSurvey/StarSurvey.styles.js +39 -0
  28. package/dist/dist-esm/react-components/src/components/Survey/StarSurvey/StarSurvey.styles.js.map +1 -0
  29. package/dist/dist-esm/react-components/src/components/Survey/SurveyTypes.d.ts +141 -0
  30. package/dist/dist-esm/react-components/src/components/Survey/SurveyTypes.js +4 -0
  31. package/dist/dist-esm/react-components/src/components/Survey/SurveyTypes.js.map +1 -0
  32. package/dist/dist-esm/react-components/src/components/Survey/TagsSurvey/TagsSurvey.d.ts +59 -0
  33. package/dist/dist-esm/react-components/src/components/Survey/TagsSurvey/TagsSurvey.js +81 -0
  34. package/dist/dist-esm/react-components/src/components/Survey/TagsSurvey/TagsSurvey.js.map +1 -0
  35. package/dist/dist-esm/react-components/src/components/Survey/TagsSurvey/TagsSurvey.styles.d.ts +14 -0
  36. package/dist/dist-esm/react-components/src/components/Survey/TagsSurvey/TagsSurvey.styles.js +30 -0
  37. package/dist/dist-esm/react-components/src/components/Survey/TagsSurvey/TagsSurvey.styles.js.map +1 -0
  38. package/dist/dist-esm/react-components/src/components/index.d.ts +5 -0
  39. package/dist/dist-esm/react-components/src/components/index.js +6 -0
  40. package/dist/dist-esm/react-components/src/components/index.js.map +1 -1
  41. package/dist/dist-esm/react-components/src/components/styles/MessageThread.styles.d.ts +1 -1
  42. package/dist/dist-esm/react-components/src/components/styles/MessageThread.styles.js +13 -9
  43. package/dist/dist-esm/react-components/src/components/styles/MessageThread.styles.js.map +1 -1
  44. package/dist/dist-esm/react-components/src/index.d.ts +2 -0
  45. package/dist/dist-esm/react-components/src/index.js.map +1 -1
  46. package/dist/dist-esm/react-components/src/theming/icons.d.ts +2 -0
  47. package/dist/dist-esm/react-components/src/theming/icons.js +7 -1
  48. package/dist/dist-esm/react-components/src/theming/icons.js.map +1 -1
  49. package/dist/dist-esm/react-components/src/types/SurveyIssues.d.ts +45 -0
  50. package/dist/dist-esm/react-components/src/types/SurveyIssues.js +4 -0
  51. package/dist/dist-esm/react-components/src/types/SurveyIssues.js.map +1 -0
  52. package/dist/dist-esm/react-components/src/types/SurveyIssuesHeadingStrings.d.ts +11 -0
  53. package/dist/dist-esm/react-components/src/types/SurveyIssuesHeadingStrings.js +4 -0
  54. package/dist/dist-esm/react-components/src/types/SurveyIssuesHeadingStrings.js.map +1 -0
  55. package/dist/dist-esm/react-components/src/types/index.d.ts +2 -0
  56. package/dist/dist-esm/react-components/src/types/index.js +2 -0
  57. package/dist/dist-esm/react-components/src/types/index.js.map +1 -1
  58. package/dist/dist-esm/react-composites/src/composites/CallComposite/CallComposite.d.ts +33 -0
  59. package/dist/dist-esm/react-composites/src/composites/CallComposite/CallComposite.js +17 -7
  60. package/dist/dist-esm/react-composites/src/composites/CallComposite/CallComposite.js.map +1 -1
  61. package/dist/dist-esm/react-composites/src/composites/CallComposite/Strings.d.ts +61 -0
  62. package/dist/dist-esm/react-composites/src/composites/CallComposite/Strings.js.map +1 -1
  63. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.d.ts +2 -0
  64. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.js +11 -3
  65. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.js.map +1 -1
  66. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/CallAdapter.d.ts +7 -0
  67. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/CallAdapter.js.map +1 -1
  68. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CallControls.js +12 -1
  69. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CallControls.js.map +1 -1
  70. package/dist/dist-esm/react-composites/src/composites/CallComposite/hooks/useHandlers.js +4 -0
  71. package/dist/dist-esm/react-composites/src/composites/CallComposite/hooks/useHandlers.js.map +1 -1
  72. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/NoticePage.d.ts +33 -0
  73. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/NoticePage.js +9 -1
  74. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/NoticePage.js.map +1 -1
  75. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/CallWithChatComposite.d.ts +33 -0
  76. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/CallWithChatComposite.js +6 -0
  77. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/CallWithChatComposite.js.map +1 -1
  78. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/AzureCommunicationCallWithChatAdapter.d.ts +2 -0
  79. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/AzureCommunicationCallWithChatAdapter.js +6 -0
  80. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/AzureCommunicationCallWithChatAdapter.js.map +1 -1
  81. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatAdapter.d.ts +7 -0
  82. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatAdapter.js.map +1 -1
  83. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatBackedCallAdapter.d.ts +2 -0
  84. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatBackedCallAdapter.js +6 -0
  85. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatBackedCallAdapter.js.map +1 -1
  86. package/dist/dist-esm/react-composites/src/composites/common/ControlBar/CommonCallControlBar.js +2 -5
  87. package/dist/dist-esm/react-composites/src/composites/common/ControlBar/CommonCallControlBar.js.map +1 -1
  88. package/dist/dist-esm/react-composites/src/composites/common/StarSurvey.d.ts +6 -0
  89. package/dist/dist-esm/react-composites/src/composites/common/StarSurvey.js +29 -0
  90. package/dist/dist-esm/react-composites/src/composites/common/StarSurvey.js.map +1 -0
  91. package/dist/dist-esm/react-composites/src/composites/common/SurveyPane.d.ts +7 -0
  92. package/dist/dist-esm/react-composites/src/composites/common/SurveyPane.js +23 -0
  93. package/dist/dist-esm/react-composites/src/composites/common/SurveyPane.js.map +1 -0
  94. package/dist/dist-esm/react-composites/src/composites/common/SurveyPaneContent.d.ts +10 -0
  95. package/dist/dist-esm/react-composites/src/composites/common/SurveyPaneContent.js +106 -0
  96. package/dist/dist-esm/react-composites/src/composites/common/SurveyPaneContent.js.map +1 -0
  97. package/dist/dist-esm/react-composites/src/composites/common/TagsSurvey.d.ts +8 -0
  98. package/dist/dist-esm/react-composites/src/composites/common/TagsSurvey.js +22 -0
  99. package/dist/dist-esm/react-composites/src/composites/common/TagsSurvey.js.map +1 -0
  100. package/dist/dist-esm/react-composites/src/composites/common/icons.d.ts +2 -0
  101. package/dist/dist-esm/react-composites/src/composites/localization/locales/en-US/strings.json +59 -0
  102. package/package.json +2 -2
@@ -170,7 +170,7 @@ function getDefaultExportFromCjs (x) {
170
170
  // Copyright (c) Microsoft Corporation.
171
171
  // Licensed under the MIT License.
172
172
  // GENERATED FILE. DO NOT EDIT MANUALLY.
173
- var telemetryVersion = '1.11.0-alpha-202312120013';
173
+ var telemetryVersion = '1.11.0-alpha-202312150013';
174
174
 
175
175
 
176
176
  var telemetryVersion$1 = /*@__PURE__*/getDefaultExportFromCjs(telemetryVersion);
@@ -793,38 +793,47 @@ const createDefaultCommonCallingHandlers = memoizeOne((callClient, deviceManager
793
793
  });
794
794
  const onToggleCamera = (options) => __awaiter$L(void 0, void 0, void 0, function* () {
795
795
  const previewOn = _isPreviewOn(callClient.getState().deviceManager);
796
- if (previewOn && call && call.state === 'Connecting') {
797
- // This is to workaround: https://skype.visualstudio.com/SPOOL/_workitems/edit/3030558.
798
- // The root cause of the issue is caused by never transitioning the unparented view to the
799
- // call object when going from configuration page (disconnected call state) to connecting.
800
- //
801
- // Currently the only time the local video stream is moved from unparented view to the call
802
- // object is when we transition from connecting -> call state. If the camera was on,
803
- // inside the MediaGallery we trigger toggleCamera. This triggers onStartLocalVideo which
804
- // destroys the unparentedView and creates a new stream in the call - so all looks well.
805
- //
806
- // However, if someone turns off their camera during the lobbyOrConnecting screen, the
807
- // call.localVideoStreams will be empty (as the stream is currently stored in the unparented
808
- // views and was never transitioned to the call object) and thus we incorrectly try to create
809
- // a new video stream for the call object, instead of only stopping the unparented view.
810
- //
811
- // The correct fix for this is to ensure that callAgent.onStartCall is called with the
812
- // localvideostream as a videoOption. That will mean call.onLocalVideoStreamsUpdated will
813
- // be triggered when the call is in connecting state, which we can then transition the
814
- // local video stream to the stateful call client and get into a clean state.
815
- yield onDisposeLocalStreamView();
816
- return;
817
- }
796
+ // the disposal of the unparented views is to workaround: https://skype.visualstudio.com/SPOOL/_workitems/edit/3030558.
797
+ // The root cause of the issue is caused by never transitioning the unparented view to the
798
+ // call object when going from configuration page (disconnected call state) to connecting.
799
+ //
800
+ // Currently the only time the local video stream is moved from unparented view to the call
801
+ // object is when we transition from connecting -> call state. If the camera was on,
802
+ // inside the MediaGallery we trigger toggleCamera. This triggers onStartLocalVideo which
803
+ // destroys the unparentedView and creates a new stream in the call - so all looks well.
804
+ //
805
+ // However, if someone turns off their camera during the lobbyOrConnecting screen, the
806
+ // call.localVideoStreams will be empty (as the stream is currently stored in the unparented
807
+ // views and was never transitioned to the call object) and thus we incorrectly try to create
808
+ // a new video stream for the call object, instead of only stopping the unparented view.
809
+ //
810
+ // The correct fix for this is to ensure that callAgent.onStartCall is called with the
811
+ // localvideostream as a videoOption. That will mean call.onLocalVideoStreamsUpdated will
812
+ // be triggered when the call is in connecting state, which we can then transition the
813
+ // local video stream to the stateful call client and get into a clean state.
818
814
  if (call && (_isInCall(call.state) || _isInLobbyOrConnecting(call.state))) {
819
815
  const stream = call.localVideoStreams.find((stream) => stream.mediaStreamType === 'Video');
820
- if (stream) {
821
- yield onStopLocalVideo(stream);
816
+ const unparentedViews = callClient.getState().deviceManager.unparentedViews;
817
+ if (stream || unparentedViews.length > 0) {
818
+ unparentedViews &&
819
+ (yield unparentedViews.forEach((view) => view.mediaStreamType === 'Video' && callClient.disposeView(undefined, undefined, view)));
820
+ stream && (yield onStopLocalVideo(stream));
822
821
  }
823
822
  else {
824
823
  yield onStartLocalVideo();
825
824
  }
826
825
  }
827
826
  else {
827
+ /**
828
+ * This will create a unparented view to be used on the configuration page and the connecting screen
829
+ *
830
+ * If the device that the stream will come from is not on from permissions checks, then it will take time
831
+ * to create the stream since device is off. If we are turn the camera on immedietly on the configuration page we see it is
832
+ * fast but that is because the device is already primed to return a stream.
833
+ *
834
+ * On the connecting page the device has already turned off and the connecting window is so small we do not see the resulting
835
+ * unparented view from the code below.
836
+ */
828
837
  const selectedCamera = callClient.getState().deviceManager.selectedCamera;
829
838
  if (selectedCamera) {
830
839
  if (previewOn) {
@@ -891,7 +900,7 @@ const createDefaultCommonCallingHandlers = memoizeOne((callClient, deviceManager
891
900
  }
892
901
  });
893
902
  const onToggleMicrophone = () => __awaiter$L(void 0, void 0, void 0, function* () {
894
- if (!call || !_isInCall(call.state)) {
903
+ if (!call || !(_isInCall(call.state) || _isInLobbyOrConnecting(call.state))) {
895
904
  throw new Error(`Please invoke onToggleMicrophone after call is started`);
896
905
  }
897
906
  return call.isMuted ? yield call.unmute() : yield call.mute();
@@ -1088,6 +1097,8 @@ const createDefaultCommonCallingHandlers = memoizeOne((callClient, deviceManager
1088
1097
  const captionsFeature = call === null || call === void 0 ? void 0 : call.feature(communicationCalling.Features.Captions).captions;
1089
1098
  yield captionsFeature.setCaptionLanguage(language);
1090
1099
  });
1100
+ /* @conditional-compile-remove(end-of-call-survey) */
1101
+ const onSubmitSurvey = (survey) => __awaiter$L(void 0, void 0, void 0, function* () { return yield (call === null || call === void 0 ? void 0 : call.feature(communicationCalling.Features.CallSurvey).submitSurvey(survey, options)); });
1091
1102
  return {
1092
1103
  onHangUp,
1093
1104
  /* @conditional-compile-remove(PSTN-calls) */
@@ -1133,7 +1144,9 @@ const createDefaultCommonCallingHandlers = memoizeOne((callClient, deviceManager
1133
1144
  /* @conditional-compile-remove(close-captions) */
1134
1145
  onSetCaptionLanguage,
1135
1146
  /* @conditional-compile-remove(close-captions) */
1136
- onSetSpokenLanguage
1147
+ onSetSpokenLanguage,
1148
+ /* @conditional-compile-remove(end-of-call-survey) */
1149
+ onSubmitSurvey
1137
1150
  };
1138
1151
  });
1139
1152
 
@@ -6283,7 +6296,11 @@ const DEFAULT_COMPONENT_ICONS = {
6283
6296
  ChangeCaptionLanguageIcon: React.createElement(reactIcons.Translate20Regular, null),
6284
6297
  ContextMenuCameraIcon: React.createElement(reactIcons.Video20Regular, null),
6285
6298
  ContextMenuMicIcon: React.createElement(reactIcons.Mic20Regular, null),
6286
- ContextMenuSpeakerIcon: React.createElement(reactIcons.Speaker220Regular, null)
6299
+ ContextMenuSpeakerIcon: React.createElement(reactIcons.Speaker220Regular, null),
6300
+ /* @conditional-compile-remove(end-of-call-survey) */
6301
+ SurveyStarIcon: React.createElement(reactIcons.Star28Regular, null),
6302
+ /* @conditional-compile-remove(end-of-call-survey) */
6303
+ SurveyStarIconFilled: React.createElement(reactIcons.Star28Filled, null)
6287
6304
  };
6288
6305
 
6289
6306
  // Copyright (c) Microsoft Corporation.
@@ -9012,11 +9029,20 @@ const useChatMessageStyles = reactComponents.makeStyles({
9012
9029
  }, '& msft-mention': {
9013
9030
  color: reactComponents.tokens.colorStatusWarningBackground3,
9014
9031
  fontWeight: reactComponents.tokens.fontWeightSemibold
9015
- }, '& img[src=""]': {
9032
+ }, '& img': {
9033
+ maxWidth: '100% !important', // Add !important to make sure it won't be overridden by style defined in element
9034
+ height: 'auto !important'
9035
+ }, '& video': {
9036
+ maxWidth: '100% !important', // Add !important to make sure it won't be overridden by style defined in element
9037
+ height: 'auto !important'
9038
+ }, '& p': Object.assign({}, reactComponents.shorthands.marginBlock('0.125rem')), '& blockquote': Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ backgroundColor: reactComponents.tokens.colorBrandBackgroundInverted, clear: 'left', minHeight: '2.25rem', width: 'fit-content', marginTop: '7px', marginRight: '0px', marginLeft: '0px', marginBottom: '7px', paddingTop: '7px', paddingRight: '15px', paddingLeft: '15px', paddingBottom: '7px' }, reactComponents.shorthands.border('solid')), reactComponents.shorthands.borderRadius('4px')), reactComponents.shorthands.borderWidth('1px')), reactComponents.shorthands.borderColor(reactComponents.tokens.colorNeutralStroke1Selected)), { borderLeftWidth: '4px' }), '& table': Object.assign(Object.assign({ backgroundColor: reactComponents.tokens.colorBrandBackgroundInverted }, reactComponents.shorthands.borderColor(reactComponents.tokens.colorNeutralStroke1Selected)), { borderCollapse: 'collapse', tableLayout: 'auto', width: '100%', '& tr': Object.assign(Object.assign({}, reactComponents.shorthands.border('1px', 'solid', `${reactComponents.tokens.colorNeutralStroke1Selected}`)), { '& td': Object.assign(Object.assign({}, reactComponents.shorthands.border('1px', 'solid', `${reactComponents.tokens.colorNeutralStroke1Selected}`)), { wordBreak: 'normal', paddingTop: '0px', paddingRight: '5px' }) }) }) }),
9039
+ bodyWithPlaceholderImage: {
9040
+ '& img[src=""]': {
9016
9041
  display: 'block',
9017
9042
  position: 'relative',
9018
9043
  marginBottom: '5px'
9019
- }, '& img[src=""]:after': {
9044
+ },
9045
+ '& img[src=""]:after': {
9020
9046
  backgroundColor: reactComponents.tokens.colorNeutralBackground1Selected,
9021
9047
  content: `url("data:image/gif;base64,R0lGODlhAQABAAAAACw=")`,
9022
9048
  backgroundSize: 'center',
@@ -9026,13 +9052,8 @@ const useChatMessageStyles = reactComponents.makeStyles({
9026
9052
  top: '0',
9027
9053
  left: '0',
9028
9054
  display: 'block'
9029
- }, '& img': {
9030
- maxWidth: '100% !important', // Add !important to make sure it won't be overridden by style defined in element
9031
- height: 'auto !important'
9032
- }, '& video': {
9033
- maxWidth: '100% !important', // Add !important to make sure it won't be overridden by style defined in element
9034
- height: 'auto !important'
9035
- }, '& p': Object.assign({}, reactComponents.shorthands.marginBlock('0.125rem')), '& blockquote': Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ backgroundColor: reactComponents.tokens.colorBrandBackgroundInverted, clear: 'left', minHeight: '2.25rem', width: 'fit-content', marginTop: '7px', marginRight: '0px', marginLeft: '0px', marginBottom: '7px', paddingTop: '7px', paddingRight: '15px', paddingLeft: '15px', paddingBottom: '7px' }, reactComponents.shorthands.border('solid')), reactComponents.shorthands.borderRadius('4px')), reactComponents.shorthands.borderWidth('1px')), reactComponents.shorthands.borderColor(reactComponents.tokens.colorNeutralStroke1Selected)), { borderLeftWidth: '4px' }), '& table': Object.assign(Object.assign({ backgroundColor: reactComponents.tokens.colorBrandBackgroundInverted }, reactComponents.shorthands.borderColor(reactComponents.tokens.colorNeutralStroke1Selected)), { borderCollapse: 'collapse', tableLayout: 'auto', width: '100%', '& tr': Object.assign(Object.assign({}, reactComponents.shorthands.border('1px', 'solid', `${reactComponents.tokens.colorNeutralStroke1Selected}`)), { '& td': Object.assign(Object.assign({}, reactComponents.shorthands.border('1px', 'solid', `${reactComponents.tokens.colorNeutralStroke1Selected}`)), { wordBreak: 'normal', paddingTop: '0px', paddingRight: '5px' }) }) }) }),
9055
+ }
9056
+ },
9036
9057
  bodyWithoutAvatar: {
9037
9058
  marginTop: '0.125rem'
9038
9059
  },
@@ -10630,7 +10651,10 @@ const MessageBubble = (props) => {
10630
10651
  const chatMessageStyles = useChatMessageStyles();
10631
10652
  const chatItemMessageContainerClassName = reactComponents.mergeClasses(
10632
10653
  // messageContainerStyle used in className and style prop as style prop can't handle CSS selectors
10633
- chatMessageStyles.body, isBlockedMessage
10654
+ chatMessageStyles.body,
10655
+ // disable placeholder functionality for GA releases as it might confuse users
10656
+ /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */
10657
+ chatMessageStyles.bodyWithPlaceholderImage, isBlockedMessage
10634
10658
  ? chatMessageCommonStyles.blocked
10635
10659
  : props.message.status === 'failed'
10636
10660
  ? chatMessageCommonStyles.failed
@@ -17797,6 +17821,197 @@ const sanitizeInput = (input) => {
17797
17821
  return input.replace(/[^\d*#+]/g, '');
17798
17822
  };
17799
17823
 
17824
+ // Copyright (c) Microsoft Corporation.
17825
+ // Licensed under the MIT License.
17826
+ /**
17827
+ * @private
17828
+ */
17829
+ const helperTextStyle$1 = (theme) => react.mergeStyles({
17830
+ fontWeight: 600,
17831
+ fontSize: _pxToRem(14),
17832
+ lineHeight: _pxToRem(20),
17833
+ color: theme.palette.neutralPrimary,
17834
+ paddingTop: _pxToRem(20)
17835
+ });
17836
+ /**
17837
+ * @private
17838
+ */
17839
+ const ratingStyles = (theme) => {
17840
+ return {
17841
+ root: {
17842
+ marginBottom: _pxToRem(24),
17843
+ textAlign: 'center'
17844
+ },
17845
+ ratingStar: {
17846
+ fontSize: _pxToRem(35),
17847
+ margin: _pxToRem(5)
17848
+ },
17849
+ ratingStarFront: {
17850
+ color: theme.palette.themePrimary
17851
+ }
17852
+ };
17853
+ };
17854
+ /**
17855
+ * @private
17856
+ */
17857
+ const titleContainerClassName$1 = react.mergeStyles({
17858
+ paddingBottom: _pxToRem(6)
17859
+ });
17860
+
17861
+ // Copyright (c) Microsoft Corporation.
17862
+ // Licensed under the MIT License.
17863
+ /**
17864
+ * A component to allow users to send numerical ratings regarding call quality
17865
+ *
17866
+ * @internal
17867
+ */
17868
+ const _StarSurvey = (props) => {
17869
+ const { onStarRatingSelected, selectedIcon, unselectedIcon, strings } = props;
17870
+ const [rating, setRating] = React.useState(0);
17871
+ const [helperText, setHelperText] = React.useState(strings === null || strings === void 0 ? void 0 : strings.starSurveyHelperText);
17872
+ const theme = react.useTheme();
17873
+ const onRatingChange = React.useCallback((ev, rating) => {
17874
+ if (rating) {
17875
+ setRating(rating);
17876
+ switch (rating) {
17877
+ case 1:
17878
+ setHelperText(strings === null || strings === void 0 ? void 0 : strings.starSurveyOneStarText);
17879
+ break;
17880
+ case 2:
17881
+ setHelperText(strings === null || strings === void 0 ? void 0 : strings.starSurveyTwoStarText);
17882
+ break;
17883
+ case 3:
17884
+ setHelperText(strings === null || strings === void 0 ? void 0 : strings.starSurveyThreeStarText);
17885
+ break;
17886
+ case 4:
17887
+ setHelperText(strings === null || strings === void 0 ? void 0 : strings.starSurveyFourStarText);
17888
+ break;
17889
+ case 5:
17890
+ setHelperText(strings === null || strings === void 0 ? void 0 : strings.starSurveyFiveStarText);
17891
+ break;
17892
+ }
17893
+ onStarRatingSelected === null || onStarRatingSelected === void 0 ? void 0 : onStarRatingSelected(rating);
17894
+ }
17895
+ }, [
17896
+ strings === null || strings === void 0 ? void 0 : strings.starSurveyOneStarText,
17897
+ strings === null || strings === void 0 ? void 0 : strings.starSurveyTwoStarText,
17898
+ strings === null || strings === void 0 ? void 0 : strings.starSurveyThreeStarText,
17899
+ strings === null || strings === void 0 ? void 0 : strings.starSurveyFourStarText,
17900
+ strings === null || strings === void 0 ? void 0 : strings.starSurveyFiveStarText,
17901
+ onStarRatingSelected
17902
+ ]);
17903
+ return (React.createElement(react.Stack, { verticalAlign: "center" },
17904
+ React.createElement(react.Stack, { className: titleContainerClassName$1 },
17905
+ React.createElement(react.Text, { className: helperTextStyle$1(theme) }, helperText)),
17906
+ React.createElement(react.Rating, { max: 5, size: react.RatingSize.Large, defaultRating: 0, allowZeroStars: true, rating: rating, onChange: onRatingChange, styles: ratingStyles(theme), icon: selectedIcon !== null && selectedIcon !== void 0 ? selectedIcon : 'SurveyStarIconFilled', unselectedIcon: unselectedIcon !== null && unselectedIcon !== void 0 ? unselectedIcon : 'SurveyStarIcon', ariaLabelFormat: strings === null || strings === void 0 ? void 0 : strings.starRatingAriaLabel })));
17907
+ };
17908
+
17909
+ // Copyright (c) Microsoft Corporation.
17910
+ // Licensed under the MIT License.
17911
+ /**
17912
+ * @private
17913
+ */
17914
+ const questionTextStyle = (theme) => react.mergeStyles({
17915
+ fontWeight: 600,
17916
+ fontSize: _pxToRem(14),
17917
+ lineHeight: _pxToRem(20),
17918
+ color: theme.palette.neutralPrimary,
17919
+ paddingTop: _pxToRem(20)
17920
+ });
17921
+ /**
17922
+ * @private
17923
+ */
17924
+ const helperTextStyle = (theme) => react.mergeStyles({
17925
+ fontWeight: 400,
17926
+ fontSize: _pxToRem(12),
17927
+ lineHeight: _pxToRem(16),
17928
+ color: theme.palette.neutralPrimary
17929
+ });
17930
+ /**
17931
+ * @private
17932
+ */
17933
+ const checkboxClassName = react.mergeStyles({
17934
+ padding: _pxToRem(8)
17935
+ });
17936
+
17937
+ // Copyright (c) Microsoft Corporation.
17938
+ // Licensed under the MIT License.
17939
+ /**
17940
+ * A component to allow users to send numerical ratings regarding call quality
17941
+ *
17942
+ * @internal
17943
+ */
17944
+ const _TagsSurvey = (props) => {
17945
+ const { issues, callIssuesToTag, categoryHeadings, onConfirm, strings } = props;
17946
+ const [selectedTags, setSelectedTags] = React.useState({});
17947
+ const tags = React.useMemo(() => {
17948
+ const tags = [];
17949
+ issues.forEach((issue) => {
17950
+ const issueCamelCase = (issue === null || issue === void 0 ? void 0 : issue.charAt(0).toLowerCase()) + (issue === null || issue === void 0 ? void 0 : issue.slice(1));
17951
+ const issueCategory = Object.keys(callIssuesToTag).find((key) => callIssuesToTag[key][issueCamelCase] !== undefined);
17952
+ if (issueCategory) {
17953
+ if (tags[issueCategory]) {
17954
+ tags[issueCategory].push({
17955
+ message: callIssuesToTag[issueCategory][issueCamelCase],
17956
+ issue: issue
17957
+ });
17958
+ }
17959
+ else {
17960
+ tags[issueCategory] = [
17961
+ {
17962
+ message: callIssuesToTag[issueCategory][issueCamelCase],
17963
+ issue: issue
17964
+ }
17965
+ ];
17966
+ }
17967
+ }
17968
+ });
17969
+ return tags;
17970
+ }, [issues, callIssuesToTag]);
17971
+ const onChange = React.useCallback((issue, issueCategory, checked) => {
17972
+ if (checked) {
17973
+ setSelectedTags((prevState) => {
17974
+ if (prevState[issueCategory]) {
17975
+ prevState[issueCategory].issues.push(issue);
17976
+ }
17977
+ else {
17978
+ prevState[issueCategory] = { score: 1, issues: [issue] };
17979
+ }
17980
+ return prevState;
17981
+ });
17982
+ }
17983
+ else {
17984
+ setSelectedTags((prevState) => {
17985
+ if (prevState[issueCategory]) {
17986
+ prevState[issueCategory].issues = prevState[issueCategory].issues.filter(function (value) {
17987
+ return value !== issue;
17988
+ });
17989
+ if (prevState[issueCategory].issues.length === 0) {
17990
+ delete prevState[issueCategory];
17991
+ }
17992
+ }
17993
+ return prevState;
17994
+ });
17995
+ }
17996
+ if (onConfirm) {
17997
+ onConfirm(selectedTags);
17998
+ }
17999
+ }, [onConfirm, selectedTags]);
18000
+ const theme = react.useTheme();
18001
+ return (React.createElement(React.Fragment, null,
18002
+ React.createElement(react.Stack, { verticalAlign: "center" },
18003
+ React.createElement(react.Text, { className: questionTextStyle(theme) }, strings === null || strings === void 0 ? void 0 : strings.tagsSurveyQuestion),
18004
+ React.createElement(react.Text, { className: helperTextStyle(theme) }, strings === null || strings === void 0 ? void 0 : strings.tagsSurveyHelperText)),
18005
+ React.createElement(react.Pivot, null, Object.keys(tags).map((key, i) => {
18006
+ return (React.createElement(react.PivotItem, { key: `key-${i}`, headerText: categoryHeadings[key], headerButtonProps: {
18007
+ 'data-order': i,
18008
+ 'data-title': key
18009
+ }, alwaysRender: true }, tags[key].map((t, i) => {
18010
+ return (React.createElement(react.Checkbox, { className: checkboxClassName, key: `checkBox_${i}`, label: t.message, onChange: (ev, checked) => onChange(t.issue, key, checked !== null && checked !== void 0 ? checked : false) }));
18011
+ })));
18012
+ }))));
18013
+ };
18014
+
17800
18015
  // Copyright (c) Microsoft Corporation.
17801
18016
  // Licensed under the MIT License.
17802
18017
  /**
@@ -19159,7 +19374,6 @@ const convertRemoteParticipantToParticipantListParticipantBeta = (userId, displa
19159
19374
  // Copyright (c) Microsoft Corporation.
19160
19375
  // Licensed under the MIT License.
19161
19376
  const convertRemoteParticipantsToParticipantListParticipants = (remoteParticipants, localUserCanRemoveOthers, isHideAttendeeNamesEnabled, localUserRole) => {
19162
- /* eslint-disable @typescript-eslint/explicit-function-return-type */
19163
19377
  const conversionCallback = (memoizeFn) => {
19164
19378
  return (remoteParticipants
19165
19379
  // Filter out MicrosoftBot participants
@@ -20024,8 +20238,9 @@ const extractTeamsAttachmentsMetadata = (attachments) => {
20024
20238
  const files = [];
20025
20239
  const inlineImages = [];
20026
20240
  attachments.forEach((attachment) => {
20027
- var _a, _b;
20241
+ var _a;
20028
20242
  const attachmentType = mapAttachmentType(attachment.attachmentType);
20243
+ const contentType = extractAttachmentContentTypeFromName(attachment.name);
20029
20244
  if (attachmentType === 'inlineImage') {
20030
20245
  inlineImages.push({
20031
20246
  attachmentType: attachmentType,
@@ -20039,7 +20254,7 @@ const extractTeamsAttachmentsMetadata = (attachments) => {
20039
20254
  attachmentType: attachmentType,
20040
20255
  id: attachment.id,
20041
20256
  name: (_a = attachment.name) !== null && _a !== void 0 ? _a : '',
20042
- extension: (_b = attachment.contentType) !== null && _b !== void 0 ? _b : '',
20257
+ extension: contentType !== null && contentType !== void 0 ? contentType : '',
20043
20258
  url: extractAttachmentUrl(attachment),
20044
20259
  payload: { teamsFileAttachment: 'true' }
20045
20260
  });
@@ -20049,7 +20264,7 @@ const extractTeamsAttachmentsMetadata = (attachments) => {
20049
20264
  };
20050
20265
  /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */
20051
20266
  const mapAttachmentType = (attachmentType) => {
20052
- if (attachmentType === 'teamsImage' || attachmentType === 'teamsInlineImage') {
20267
+ if (attachmentType === 'image') {
20053
20268
  return 'inlineImage';
20054
20269
  }
20055
20270
  else if (attachmentType === 'file') {
@@ -20059,7 +20274,7 @@ const mapAttachmentType = (attachmentType) => {
20059
20274
  };
20060
20275
  /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */
20061
20276
  const extractAttachmentUrl = (attachment) => {
20062
- return attachment.attachmentType === 'file' && attachment.previewUrl ? attachment.previewUrl : attachment.url;
20277
+ return attachment.attachmentType === 'file' && attachment.previewUrl ? attachment.previewUrl : attachment.url || '';
20063
20278
  };
20064
20279
  const processChatMessageContent = (message) => {
20065
20280
  var _a, _b, _c, _d, _e;
@@ -20067,7 +20282,7 @@ const processChatMessageContent = (message) => {
20067
20282
  if (sanitizedMessageContentType(message.type).includes('html') && ((_a = message.content) === null || _a === void 0 ? void 0 : _a.attachments)) {
20068
20283
  const attachments = (_b = message.content) === null || _b === void 0 ? void 0 : _b.attachments;
20069
20284
  const teamsImageHtmlContent = attachments
20070
- .filter((attachment) => attachment.attachmentType === 'teamsImage')
20285
+ .filter((attachment) => { var _a, _b; return attachment.attachmentType === 'image' && !((_b = (_a = message.content) === null || _a === void 0 ? void 0 : _a.message) === null || _b === void 0 ? void 0 : _b.includes(attachment.id)); })
20071
20286
  .map((attachment) => generateImageAttachmentImgHtml(attachment))
20072
20287
  .join('');
20073
20288
  if (teamsImageHtmlContent) {
@@ -20078,7 +20293,20 @@ const processChatMessageContent = (message) => {
20078
20293
  };
20079
20294
  /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */
20080
20295
  const generateImageAttachmentImgHtml = (attachment) => {
20081
- return `\r\n<p><img alt="image" src="" itemscope="${attachment.contentType}" id="${attachment.id}"></p>`;
20296
+ const contentType = extractAttachmentContentTypeFromName(attachment.name);
20297
+ return `\r\n<p><img alt="image" src="" itemscope="${contentType}" id="${attachment.id}"></p>`;
20298
+ };
20299
+ /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */
20300
+ const extractAttachmentContentTypeFromName = (name) => {
20301
+ if (name === undefined) {
20302
+ return '';
20303
+ }
20304
+ const indexOfLastDot = name.lastIndexOf('.');
20305
+ if (indexOfLastDot === undefined || indexOfLastDot < 0) {
20306
+ return '';
20307
+ }
20308
+ const contentType = name.substring(indexOfLastDot + 1);
20309
+ return contentType;
20082
20310
  };
20083
20311
  /* @conditional-compile-remove(file-sharing) @conditional-compile-remove(teams-inline-images-and-file-sharing) */
20084
20312
  const extractAttachmentsMetadata = (message) => {
@@ -21676,7 +21904,7 @@ const CallCompositeIcon = (props) => (React.createElement(react.FontIcon, Object
21676
21904
  */
21677
21905
  const CallWithChatCompositeIcon = (props) => (React.createElement(react.FontIcon, Object.assign({}, props)));
21678
21906
 
21679
- var call$k={cameraLabel:"Camera",noCamerasLabel:"No cameras found",cameraPermissionDenied:"Your browser is blocking access to your camera",cameraTurnedOff:"Your camera is turned off",chatButtonLabel:"Chat",close:"Close",complianceBannerNowOnlyRecording:"You are now only recording this meeting.",complianceBannerNowOnlyTranscription:"You are now only transcribing this meeting.",complianceBannerRecordingAndTranscriptionSaved:"Recording and transcription are being saved.",complianceBannerRecordingAndTranscriptionStarted:"Recording and transcription have started.",complianceBannerRecordingAndTranscriptionStopped:"Recording and transcription have stopped.",complianceBannerRecordingSaving:"Recording is being saved.",complianceBannerRecordingStarted:"Recording has started.",complianceBannerRecordingStopped:"Recording has stopped.",complianceBannerTranscriptionStarted:"Transcription has started.",complianceBannerTranscriptionConsent:"By joining, you are giving consent for this meeting to be transcribed.",complianceBannerTranscriptionSaving:"Transcription is being saved.",complianceBannerTranscriptionStopped:"Transcription has stopped.",configurationPageTitle:"Start a call",copyInviteLinkButtonLabel:"Copy invite link",copyInviteLinkActionedAriaLabel:"Invite link copied",defaultPlaceHolder:"Select an option",dismissSidePaneButtonLabel:"Close",videoEffectsPaneTitle:"Effects",videoEffectsPaneBackgroundSelectionTitle:"Background",configurationPageVideoEffectsButtonLabel:"Effects",unableToStartVideoEffect:"Unable to apply video effect.",blurBackgroundEffectButtonLabel:"Blur",blurBackgroundTooltip:"Blur Background",removeBackgroundEffectButtonLabel:"None",removeBackgroundTooltip:"Remove Background",cameraOffBackgroundEffectWarningText:"Your camera is off. Turn on camera to see video effect.",failedToJoinCallDueToNoNetworkMoreDetails:"Call was disconnected due to a network issue. Check your connection and join again.",failedToJoinCallDueToNoNetworkTitle:"Call disconnected",failedToJoinTeamsMeetingReasonAccessDeniedMoreDetails:"You were not granted entry in the call. If this was a mistake, re-join the call.",failedToJoinTeamsMeetingReasonAccessDeniedTitle:"Dismissed from lobby",learnMore:"Learn more",leavingCallTitle:"Leaving...",leftCallMoreDetails:"If this was a mistake, re-join the call.",leftCallTitle:"You left the call",lobbyScreenConnectingToCallTitle:"Joining call",lobbyScreenWaitingToBeAdmittedTitle:"Waiting to be admitted",microphonePermissionDenied:"Your browser is blocking access to your microphone",microphoneToggleInLobbyNotAllowed:"Cannot mute or unmute while in lobby.",mutedMessage:"You're muted",networkReconnectMoreDetails:"Looks like something went wrong. We're trying to get back into the call.",networkReconnectTitle:"Hold on",notInvitedToRoomDetails:"You are not able to join this room because you do not have an invite.",notInvitedToRoomTitle:"Not invited to room",peopleButtonLabel:"People",selectedPeopleButtonLabel:"People Button Selected",peoplePaneTitle:"People",peopleButtonTooltipOpen:"Show participants",peopleButtonTooltipClose:"Hide participants",peoplePaneSubTitle:"In this call {numberOfPeople}",privacyPolicy:"Privacy policy",rejoinCallButtonLabel:"Re-join call",removedFromCallMoreDetails:"Another participant removed you from the call.",removedFromCallTitle:"You were removed",removeMenuLabel:"Remove",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back",roomNotFoundDetails:"The room ID provided could not be found.",roomNotFoundTitle:"Room not found",roomNotValidDetails:"This room is not valid at this current time.",roomNotValidTitle:"Room not valid",inviteToRoomRemovedDetails:"Your invite to join this room was removed.",inviteToRoomRemovedTitle:"Invite to room removed",soundLabel:"Sound",noMicrophonesLabel:"No microphones found",noSpeakersLabel:"No speakers found",startCallButtonLabel:"Start call",openDialpadButtonLabel:"Dial phone number",peoplePaneAddPeopleButtonLabel:"Add People",dialpadStartCallButtonLabel:"Call",dialpadModalTitle:"Dial Phone Number",dialpadModalAriaLabel:"Dialpad",dialpadCloseModalButtonAriaLabel:"Close dialpad",moreButtonCallingLabel:"More",resumeCallButtonLabel:"Resume",resumingCallButtonLabel:"Resuming...",resumeCallButtonAriaLabel:"Resume call",resumingCallButtonAriaLabel:"Resume call",holdScreenLabel:"You're on hold",openDtmfDialpadLabel:"Show dialpad",dtmfDialpadPlaceholderText:"Enter number",outboundCallingNoticeString:"Calling...",participantJoinedNoticeString:"{displayName} joined",twoParticipantJoinedNoticeString:"{displayName1} and {displayName2} have joined",threeParticipantJoinedNoticeString:"{displayName1}, {displayName2} and {displayName3} have joined",participantLeftNoticeString:"{displayName} left",twoParticipantLeftNoticeString:"{displayName1} and {displayName2} have left",threeParticipantLeftNoticeString:"{displayName1}, {displayName2} and {displayName3} have left",unnamedParticipantString:"unnamed participant",manyUnnamedParticipantsJoined:"unnamed participant and {numOfParticipants} other participants joined",manyUnnamedParticipantsLeft:"unnamed participant and {numOfParticipants} other participants left",manyParticipantsJoined:"{displayName1}, {displayName2}, {displayName3} and {numOfParticipants} other participants joined",manyParticipantsLeft:"{displayName1}, {displayName2}, {displayName3} and {numOfParticipants} other participants left",liveCaptionsLabel:"Live captions",captionsSettingsLabel:"Caption settings",startCaptionsButtonOnLabel:"Turn on captions",startCaptionsButtonOffLabel:"Turn off captions",startCaptionsButtonTooltipOnContent:"Turn off captions",startCaptionsButtonTooltipOffContent:"Turn on captions",captionsSettingsModalTitle:"Captions Settings",captionsSettingsSpokenLanguageDropdownLabel:"Spoken language",captionsSettingsCaptionLanguageDropdownLabel:"Captions language",captionsSettingsSpokenLanguageDropdownInfoText:"Language that everyone on this call is speaking.",captionsSettingsCaptionLanguageDropdownInfoText:"Captions will appear in this langugage.",captionsSettingsConfirmButtonLabel:"Confirm",captionsSettingsCancelButtonLabel:"Cancel",captionsSettingsModalAriaLabel:"Captions Setting Modal",captionsSettingsCloseModalButtonAriaLabel:"Close Captions Setting",captionsBannerMoreButtonCallingLabel:"More",captionsBannerMoreButtonTooltip:"More options",dismissModalAriaLabel:"Local and remote picture and picture, press enter to return to call",callRejectedTitle:"The call could not be completed",callRejectedMoreDetails:"The person you are trying to reach is unavailable. Please try again later.",spokenLanguageStrings:{"ar-ae":"Arabic - U.A.E.","ar-sa":"Arabic - Saudi Arabia","da-dk":"Danish","de-de":"German - Germany","en-au":"English - Australia","en-ca":"English - Canada","en-gb":"English - United Kingdom","en-in":"English - India","en-nz":"English - New Zealand","en-us":"English - United States","es-es":"Spanish - Spain (Modern Sort)","es-mx":"Spanish - Mexico","fi-fi":"Finnish","fr-ca":"French - Canada","fr-fr":"French - France","hi-in":"Hindi","it-it":"Italian - Italy","ja-jp":"Japanese","ko-kr":"Korean","nb-no":"Norwegian (Bokmål)","nl-be":"Dutch - Belgium","nl-nl":"Dutch - Netherlands","pl-pl":"Polish","pt-br":"Portuguese - Brazil","ru-ru":"Russian","sv-se":"Swedish","zh-cn":"Chinese - People's Republic of China","zh-hk":"Chinese - Hong Kong SAR","cs-cz":"Czech","pt-pt":"Portuguese - Portugal","tr-tr":"Turkish","vi-vn":"Vietnamese","th-th":"Thai","he-il":"Hebrew","cy-gb":"Welsh","uk-ua":"Ukrainian","el-gr":"Greek","hu-hu":"Hungarian","ro-ro":"Romanian","sk-sk":"Slovak","zh-tw":"Chinese - Taiwan"},captionLanguageStrings:{ar:"Arabic",da:"Danish",de:"German",en:"English",es:"Spanish",fi:"Finnish","fr-ca":"French - Canada",fr:"French - France",hi:"Hindi",it:"Italian",ja:"Japanese",ko:"Korean",nb:"Norwegian (Bokmål)",nl:"Dutch",pl:"Polish",pt:"Portuguese - Brazil",ru:"Russian",sv:"Swedish","zh-Hans":"Chinese (Simplified)","zh-Hant":"Chinese (Traditional)",cs:"Czech","pt-pt":"Portuguese - Portugal",tr:"Turkish",vi:"Vietnamese",th:"Thai",he:"Hebrew",cy:"Welsh",uk:"Ukrainian",el:"Greek",hu:"Hungarian",ro:"Romanian",sk:"Slovak"},captionsBannerSpinnerText:"Starting captions...",transferPageTransferorText:"Transferring...",transferPageTransferTargetText:"Connecting...",transferPageUnknownTransferorDisplayName:"Unknown",transferPageUnknownTransferTargetDisplayName:"Unknown",transferPageNoticeString:"You are being transferred",participantCouldNotBeReachedTitle:"Target participant is currently not available",participantCouldNotBeReachedMoreDetails:"Please contact participant when they are available",permissionToReachTargetParticipantNotAllowedTitle:"Permission to reach target participant is not allowed",permissionToReachTargetParticipantNotAllowedMoreDetails:"Please check that the target participant is in the same tenant",unableToResolveTenantTitle:"Unable to resolve tenant id for the target participant",unableToResolveTenantMoreDetails:"Please check the participant id is entered correctly",participantIdIsMalformedTitle:"Participant id is not in the correct format",participantIdIsMalformedMoreDetails:"Please check that the participant id is in the correct format",moreButtonGalleryControlLabel:"View",moreButtonGalleryPositionToggleLabel:"Move gallery to top",moreButtonGallerySpeakerLayoutLabel:"Speaker",moreButtonGalleryFloatingLocalLayoutLabel:"Dynamic",moreButtonGalleryDefaultLayoutLabel:"Gallery view",moreButtonGalleryFocusedContentLayoutLabel:"Focus on content",moreButtonLargeGalleryDefaultLayoutLabel:"Large Gallery",capabilityChangedNotification:{turnVideoOn:{lostDueToMeetingOption:"Your camera has been disabled. You can no longer share video.",grantedDueToMeetingOption:"Your camera has been enabled. Turn it on if you'd like to share video."},unmuteMic:{lostDueToMeetingOption:"Your mic has been disabled. You can no longer unmute.",grantedDueToMeetingOption:"Your mic has been enabled. Unmute if you'd like to speak."},shareScreen:{lostDueToRoleChangeToAttendee:"Your role has been changed. Some actions, like sharing content, won't be available to you.",grantedDueToRoleChangeToPresenter:"You're a presenter. You can share content and facilitate the meeting."}}};var chat$k={chatListHeader:"In this chat",uploadFile:"Upload File"};var callWithChat$k={chatButtonLabel:"Chat",chatButtonNewMessageNotificationLabel:"New Message",chatButtonTooltipClosedWithMessageCount:"Show chat ({unreadMessagesCount} unread)",chatButtonTooltipClose:"Hide chat",chatButtonTooltipOpen:"Show chat",chatPaneTitle:"Chat",copyInviteLinkButtonLabel:"Copy invite link",copyInviteLinkActionedAriaLabel:"Invite link copied",dismissSidePaneButtonLabel:"Close",moreDrawerAudioDeviceMenuTitle:"Audio Device",moreDrawerButtonLabel:"More options",moreDrawerButtonTooltip:"More options",moreDrawerMicrophoneMenuTitle:"Microphone",moreDrawerSpeakerMenuTitle:"Speaker",moreDrawerCaptionsMenuTitle:"Live captions",moreDrawerSpokenLanguageMenuTitle:"Spoken language",moreDrawerCaptionLanguageMenuTitle:"Caption language",moreDrawerGalleryOptionsMenuTitle:"Gallery options",peopleButtonLabel:"People",selectedPeopleButtonLabel:"People Button Selected",peopleButtonTooltipOpen:"Show participants",peopleButtonTooltipClose:"Hide participants",peoplePaneSubTitle:"In this call",peoplePaneTitle:"People",pictureInPictureTileAriaLabel:"Video Feeds. Click to return to call screen.",removeMenuLabel:"Remove",openDialpadButtonLabel:"Dial phone number",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back",peoplePaneAddPeopleButtonLabel:"Add People",dialpadStartCallButtonLabel:"Call",dialpadModalTitle:"Dial Phone Number",dialpadModalAriaLabel:"Dialpad",dialpadCloseModalButtonAriaLabel:"Close dialpad",openDtmfDialpadLabel:"Show dialpad",dtmfDialpadPlaceholderText:"Enter number"};var en_US = {call:call$k,chat:chat$k,callWithChat:callWithChat$k};
21907
+ var call$k={cameraLabel:"Camera",noCamerasLabel:"No cameras found",cameraPermissionDenied:"Your browser is blocking access to your camera",cameraTurnedOff:"Your camera is turned off",chatButtonLabel:"Chat",close:"Close",complianceBannerNowOnlyRecording:"You are now only recording this meeting.",complianceBannerNowOnlyTranscription:"You are now only transcribing this meeting.",complianceBannerRecordingAndTranscriptionSaved:"Recording and transcription are being saved.",complianceBannerRecordingAndTranscriptionStarted:"Recording and transcription have started.",complianceBannerRecordingAndTranscriptionStopped:"Recording and transcription have stopped.",complianceBannerRecordingSaving:"Recording is being saved.",complianceBannerRecordingStarted:"Recording has started.",complianceBannerRecordingStopped:"Recording has stopped.",complianceBannerTranscriptionStarted:"Transcription has started.",complianceBannerTranscriptionConsent:"By joining, you are giving consent for this meeting to be transcribed.",complianceBannerTranscriptionSaving:"Transcription is being saved.",complianceBannerTranscriptionStopped:"Transcription has stopped.",configurationPageTitle:"Start a call",copyInviteLinkButtonLabel:"Copy invite link",copyInviteLinkActionedAriaLabel:"Invite link copied",defaultPlaceHolder:"Select an option",dismissSidePaneButtonLabel:"Close",videoEffectsPaneTitle:"Effects",videoEffectsPaneBackgroundSelectionTitle:"Background",configurationPageVideoEffectsButtonLabel:"Effects",unableToStartVideoEffect:"Unable to apply video effect.",blurBackgroundEffectButtonLabel:"Blur",blurBackgroundTooltip:"Blur Background",removeBackgroundEffectButtonLabel:"None",removeBackgroundTooltip:"Remove Background",cameraOffBackgroundEffectWarningText:"Your camera is off. Turn on camera to see video effect.",failedToJoinCallDueToNoNetworkMoreDetails:"Call was disconnected due to a network issue. Check your connection and join again.",failedToJoinCallDueToNoNetworkTitle:"Call disconnected",failedToJoinTeamsMeetingReasonAccessDeniedMoreDetails:"You were not granted entry in the call. If this was a mistake, re-join the call.",failedToJoinTeamsMeetingReasonAccessDeniedTitle:"Dismissed from lobby",learnMore:"Learn more",leavingCallTitle:"Leaving...",leftCallMoreDetails:"If this was a mistake, re-join the call.",leftCallTitle:"You left the call",lobbyScreenConnectingToCallTitle:"Joining call",lobbyScreenWaitingToBeAdmittedTitle:"Waiting to be admitted",microphonePermissionDenied:"Your browser is blocking access to your microphone",microphoneToggleInLobbyNotAllowed:"Cannot mute or unmute while in lobby.",mutedMessage:"You're muted",networkReconnectMoreDetails:"Looks like something went wrong. We're trying to get back into the call.",networkReconnectTitle:"Hold on",notInvitedToRoomDetails:"You are not able to join this room because you do not have an invite.",notInvitedToRoomTitle:"Not invited to room",peopleButtonLabel:"People",selectedPeopleButtonLabel:"People Button Selected",peoplePaneTitle:"People",peopleButtonTooltipOpen:"Show participants",peopleButtonTooltipClose:"Hide participants",peoplePaneSubTitle:"In this call {numberOfPeople}",privacyPolicy:"Privacy policy",rejoinCallButtonLabel:"Re-join call",removedFromCallMoreDetails:"Another participant removed you from the call.",removedFromCallTitle:"You were removed",removeMenuLabel:"Remove",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back",roomNotFoundDetails:"The room ID provided could not be found.",roomNotFoundTitle:"Room not found",roomNotValidDetails:"This room is not valid at this current time.",roomNotValidTitle:"Room not valid",inviteToRoomRemovedDetails:"Your invite to join this room was removed.",inviteToRoomRemovedTitle:"Invite to room removed",soundLabel:"Sound",noMicrophonesLabel:"No microphones found",noSpeakersLabel:"No speakers found",startCallButtonLabel:"Start call",openDialpadButtonLabel:"Dial phone number",peoplePaneAddPeopleButtonLabel:"Add People",dialpadStartCallButtonLabel:"Call",dialpadModalTitle:"Dial Phone Number",dialpadModalAriaLabel:"Dialpad",dialpadCloseModalButtonAriaLabel:"Close dialpad",moreButtonCallingLabel:"More",resumeCallButtonLabel:"Resume",resumingCallButtonLabel:"Resuming...",resumeCallButtonAriaLabel:"Resume call",resumingCallButtonAriaLabel:"Resume call",holdScreenLabel:"You're on hold",openDtmfDialpadLabel:"Show dialpad",dtmfDialpadPlaceholderText:"Enter number",outboundCallingNoticeString:"Calling...",participantJoinedNoticeString:"{displayName} joined",twoParticipantJoinedNoticeString:"{displayName1} and {displayName2} have joined",threeParticipantJoinedNoticeString:"{displayName1}, {displayName2} and {displayName3} have joined",participantLeftNoticeString:"{displayName} left",twoParticipantLeftNoticeString:"{displayName1} and {displayName2} have left",threeParticipantLeftNoticeString:"{displayName1}, {displayName2} and {displayName3} have left",unnamedParticipantString:"unnamed participant",manyUnnamedParticipantsJoined:"unnamed participant and {numOfParticipants} other participants joined",manyUnnamedParticipantsLeft:"unnamed participant and {numOfParticipants} other participants left",manyParticipantsJoined:"{displayName1}, {displayName2}, {displayName3} and {numOfParticipants} other participants joined",manyParticipantsLeft:"{displayName1}, {displayName2}, {displayName3} and {numOfParticipants} other participants left",liveCaptionsLabel:"Live captions",captionsSettingsLabel:"Caption settings",startCaptionsButtonOnLabel:"Turn on captions",startCaptionsButtonOffLabel:"Turn off captions",startCaptionsButtonTooltipOnContent:"Turn off captions",startCaptionsButtonTooltipOffContent:"Turn on captions",captionsSettingsModalTitle:"Captions Settings",captionsSettingsSpokenLanguageDropdownLabel:"Spoken language",captionsSettingsCaptionLanguageDropdownLabel:"Captions language",captionsSettingsSpokenLanguageDropdownInfoText:"Language that everyone on this call is speaking.",captionsSettingsCaptionLanguageDropdownInfoText:"Captions will appear in this langugage.",captionsSettingsConfirmButtonLabel:"Confirm",captionsSettingsCancelButtonLabel:"Cancel",captionsSettingsModalAriaLabel:"Captions Setting Modal",captionsSettingsCloseModalButtonAriaLabel:"Close Captions Setting",captionsBannerMoreButtonCallingLabel:"More",captionsBannerMoreButtonTooltip:"More options",dismissModalAriaLabel:"Local and remote picture and picture, press enter to return to call",callRejectedTitle:"The call could not be completed",callRejectedMoreDetails:"The person you are trying to reach is unavailable. Please try again later.",spokenLanguageStrings:{"ar-ae":"Arabic - U.A.E.","ar-sa":"Arabic - Saudi Arabia","da-dk":"Danish","de-de":"German - Germany","en-au":"English - Australia","en-ca":"English - Canada","en-gb":"English - United Kingdom","en-in":"English - India","en-nz":"English - New Zealand","en-us":"English - United States","es-es":"Spanish - Spain (Modern Sort)","es-mx":"Spanish - Mexico","fi-fi":"Finnish","fr-ca":"French - Canada","fr-fr":"French - France","hi-in":"Hindi","it-it":"Italian - Italy","ja-jp":"Japanese","ko-kr":"Korean","nb-no":"Norwegian (Bokmål)","nl-be":"Dutch - Belgium","nl-nl":"Dutch - Netherlands","pl-pl":"Polish","pt-br":"Portuguese - Brazil","ru-ru":"Russian","sv-se":"Swedish","zh-cn":"Chinese - People's Republic of China","zh-hk":"Chinese - Hong Kong SAR","cs-cz":"Czech","pt-pt":"Portuguese - Portugal","tr-tr":"Turkish","vi-vn":"Vietnamese","th-th":"Thai","he-il":"Hebrew","cy-gb":"Welsh","uk-ua":"Ukrainian","el-gr":"Greek","hu-hu":"Hungarian","ro-ro":"Romanian","sk-sk":"Slovak","zh-tw":"Chinese - Taiwan"},captionLanguageStrings:{ar:"Arabic",da:"Danish",de:"German",en:"English",es:"Spanish",fi:"Finnish","fr-ca":"French - Canada",fr:"French - France",hi:"Hindi",it:"Italian",ja:"Japanese",ko:"Korean",nb:"Norwegian (Bokmål)",nl:"Dutch",pl:"Polish",pt:"Portuguese - Brazil",ru:"Russian",sv:"Swedish","zh-Hans":"Chinese (Simplified)","zh-Hant":"Chinese (Traditional)",cs:"Czech","pt-pt":"Portuguese - Portugal",tr:"Turkish",vi:"Vietnamese",th:"Thai",he:"Hebrew",cy:"Welsh",uk:"Ukrainian",el:"Greek",hu:"Hungarian",ro:"Romanian",sk:"Slovak"},captionsBannerSpinnerText:"Starting captions...",transferPageTransferorText:"Transferring...",transferPageTransferTargetText:"Connecting...",transferPageUnknownTransferorDisplayName:"Unknown",transferPageUnknownTransferTargetDisplayName:"Unknown",transferPageNoticeString:"You are being transferred",participantCouldNotBeReachedTitle:"Target participant is currently not available",participantCouldNotBeReachedMoreDetails:"Please contact participant when they are available",permissionToReachTargetParticipantNotAllowedTitle:"Permission to reach target participant is not allowed",permissionToReachTargetParticipantNotAllowedMoreDetails:"Please check that the target participant is in the same tenant",unableToResolveTenantTitle:"Unable to resolve tenant id for the target participant",unableToResolveTenantMoreDetails:"Please check the participant id is entered correctly",participantIdIsMalformedTitle:"Participant id is not in the correct format",participantIdIsMalformedMoreDetails:"Please check that the participant id is in the correct format",moreButtonGalleryControlLabel:"View",moreButtonGalleryPositionToggleLabel:"Move gallery to top",moreButtonGallerySpeakerLayoutLabel:"Speaker",moreButtonGalleryFloatingLocalLayoutLabel:"Dynamic",moreButtonGalleryDefaultLayoutLabel:"Gallery view",moreButtonGalleryFocusedContentLayoutLabel:"Focus on content",moreButtonLargeGalleryDefaultLayoutLabel:"Large Gallery",capabilityChangedNotification:{turnVideoOn:{lostDueToMeetingOption:"Your camera has been disabled. You can no longer share video.",grantedDueToMeetingOption:"Your camera has been enabled. Turn it on if you'd like to share video."},unmuteMic:{lostDueToMeetingOption:"Your mic has been disabled. You can no longer unmute.",grantedDueToMeetingOption:"Your mic has been enabled. Unmute if you'd like to speak."},shareScreen:{lostDueToRoleChangeToAttendee:"Your role has been changed. Some actions, like sharing content, won't be available to you.",grantedDueToRoleChangeToPresenter:"You're a presenter. You can share content and facilitate the meeting."}},surveyQuestion:"How was your call today?",starSurveyHelperText:"How was the quality of the call?",starSurveyOneStarText:"The quality was bad.",starSurveyTwoStarText:"The quality was poor.",starSurveyThreeStarText:"The quality was good.",starSurveyFourStarText:"The quality was great.",starSurveyFiveStarText:"The quality was excellent.",surveyConfirmButtonLabel:"Send Feedback",starRatingAriaLabel:"Select {0} of {1} stars",surveyCancelButtonAriaLabel:"Cancel",tagsSurveyQuestion:"What could have been better?",tagsSurveyHelperText:"Check any issues you experienced",surveyTextboxDefaultText:"Other,please specify",surveyIssues:{overallRating:{callCannotJoin:"I could not join call",callCannotInvite:"I could not invite others into the call",hadToRejoin:"I had to rejoin the call",callEndedUnexpectedly:"Call ended for me unexpectedly",otherIssues:"I was having other issues with the call"},audioRating:{noLocalAudio:"The other side could not hear any sound",noRemoteAudio:"I could not hear any sound",echo:"I heard echos on the call",audioNoise:"I heard noise on the call",lowVolume:"Volume was low",audioStoppedUnexpectedly:"Audio stopped unexpectedly",distortedSpeech:"Audio was distorted",audioInterruption:"Audio was interrupted",otherIssues:"I was having other audio issues in this call"},videoRating:{noVideoReceived:"I could not see any video",noVideoSent:"Others could not see me",lowQuality:"Video quality was low",freezes:"Video frozen",stoppedUnexpectedly:"Video stopped unexpectedly",darkVideoReceived:"I can only see dark screens when others turn on their camera",audioVideoOutOfSync:"Audio and Video was out of sync",otherIssues:"I was having other video issues in this call"},screenshareRating:{noContentLocal:"Other people could not see my screenshare",noContentRemote:"I could not see other people's screenshare",cannotPresent:"I could not present my screen",lowQuality:"Screen share quality was low",freezes:"Screen share frozen",stoppedUnexpectedly:"Screen share stopped unexpectedly",largeDelay:"Screen share has a large delay",otherIssues:"I was having other screen share issues in this call"}},SurveyIssuesHeadingStrings:{overallRating:"Overall",audioRating:"Audio",videoRating:"Video",screenshareRating:"Presenting"}};var chat$k={chatListHeader:"In this chat",uploadFile:"Upload File"};var callWithChat$k={chatButtonLabel:"Chat",chatButtonNewMessageNotificationLabel:"New Message",chatButtonTooltipClosedWithMessageCount:"Show chat ({unreadMessagesCount} unread)",chatButtonTooltipClose:"Hide chat",chatButtonTooltipOpen:"Show chat",chatPaneTitle:"Chat",copyInviteLinkButtonLabel:"Copy invite link",copyInviteLinkActionedAriaLabel:"Invite link copied",dismissSidePaneButtonLabel:"Close",moreDrawerAudioDeviceMenuTitle:"Audio Device",moreDrawerButtonLabel:"More options",moreDrawerButtonTooltip:"More options",moreDrawerMicrophoneMenuTitle:"Microphone",moreDrawerSpeakerMenuTitle:"Speaker",moreDrawerCaptionsMenuTitle:"Live captions",moreDrawerSpokenLanguageMenuTitle:"Spoken language",moreDrawerCaptionLanguageMenuTitle:"Caption language",moreDrawerGalleryOptionsMenuTitle:"Gallery options",peopleButtonLabel:"People",selectedPeopleButtonLabel:"People Button Selected",peopleButtonTooltipOpen:"Show participants",peopleButtonTooltipClose:"Hide participants",peoplePaneSubTitle:"In this call",peoplePaneTitle:"People",pictureInPictureTileAriaLabel:"Video Feeds. Click to return to call screen.",removeMenuLabel:"Remove",openDialpadButtonLabel:"Dial phone number",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back",peoplePaneAddPeopleButtonLabel:"Add People",dialpadStartCallButtonLabel:"Call",dialpadModalTitle:"Dial Phone Number",dialpadModalAriaLabel:"Dialpad",dialpadCloseModalButtonAriaLabel:"Close dialpad",openDtmfDialpadLabel:"Show dialpad",dtmfDialpadPlaceholderText:"Enter number"};var en_US = {call:call$k,chat:chat$k,callWithChat:callWithChat$k};
21680
21908
 
21681
21909
  // Copyright (c) Microsoft Corporation.
21682
21910
  // Licensed under the MIT License.
@@ -24068,6 +24296,10 @@ const createCompositeHandlers = memoizeOne((adapter) => ({
24068
24296
  /* @conditional-compile-remove(close-captions) */
24069
24297
  onSetCaptionLanguage: (language) => __awaiter$g(void 0, void 0, void 0, function* () {
24070
24298
  yield adapter.setCaptionLanguage(language);
24299
+ }),
24300
+ /* @conditional-compile-remove(end-of-call-survey) */
24301
+ onSubmitSurvey: (survey) => __awaiter$g(void 0, void 0, void 0, function* () {
24302
+ return yield adapter.submitSurvey(survey);
24071
24303
  })
24072
24304
  }));
24073
24305
 
@@ -25009,12 +25241,23 @@ const onFetchCustomButtonPropsTrampoline = (options) => {
25009
25241
  // Licensed under the MIT License.
25010
25242
  // Enforce a background color on control bar to ensure it matches the composite background color.
25011
25243
  const controlBarStyles = react.memoizeFunction((background) => ({ root: { background: background } }));
25244
+ const inferCallControlOptions = (mobileView, callControlOptions) => {
25245
+ if (callControlOptions === false) {
25246
+ return {};
25247
+ }
25248
+ const options = callControlOptions === true || callControlOptions === undefined ? {} : callControlOptions;
25249
+ if (mobileView) {
25250
+ // Set options to always not show screen share button for mobile
25251
+ options.screenShareButton = false;
25252
+ }
25253
+ return options;
25254
+ };
25012
25255
  /**
25013
25256
  * @private
25014
25257
  */
25015
25258
  const CallControls = (props) => {
25016
25259
  var _a, _b;
25017
- const options = React.useMemo(() => (typeof props.options === 'boolean' ? {} : props.options), [props.options]);
25260
+ const options = React.useMemo(() => inferCallControlOptions(!!props.isMobile, props.options), [props.isMobile, props.options]);
25018
25261
  /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(rooms) */
25019
25262
  const adapter = useAdapter();
25020
25263
  /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */ /* @conditional-compile-remove(close-captions) */ /* @conditional-compile-remove(raise-hand) */
@@ -25661,11 +25904,8 @@ const inferCommonCallControlOptions = (mobileView, commonCallControlOptions) =>
25661
25904
  if (mobileView) {
25662
25905
  // Set to compressed mode when composite is optimized for mobile
25663
25906
  options.displayType = 'compact';
25664
- // Do not show screen share button when composite is optimized for mobile unless the developer
25665
- // has explicitly opted in.
25666
- if (options.screenShareButton !== true) {
25667
- options.screenShareButton = false;
25668
- }
25907
+ // Set options to always not show screen share button for mobile
25908
+ options.screenShareButton = false;
25669
25909
  }
25670
25910
  return options;
25671
25911
  };
@@ -29877,6 +30117,152 @@ const moreDetailsStyles = {
29877
30117
  fontSize: '1rem'
29878
30118
  };
29879
30119
 
30120
+ // Copyright (c) Microsoft Corporation.
30121
+ // Licensed under the MIT License.
30122
+ /** @private */
30123
+ const StarSurvey = (
30124
+ /* @conditional-compile-remove(end-of-call-survey) */ props) => {
30125
+ /* @conditional-compile-remove(end-of-call-survey) */
30126
+ const { onStarRatingSelected } = props;
30127
+ /* @conditional-compile-remove(end-of-call-survey) */
30128
+ const strings = useLocale().strings.call;
30129
+ /* @conditional-compile-remove(end-of-call-survey) */
30130
+ const StarSurveyStrings = {
30131
+ starSurveyHelperText: strings.starSurveyHelperText,
30132
+ starSurveyOneStarText: strings.starSurveyOneStarText,
30133
+ starSurveyTwoStarText: strings.starSurveyTwoStarText,
30134
+ starSurveyThreeStarText: strings.starSurveyThreeStarText,
30135
+ starSurveyFourStarText: strings.starSurveyFourStarText,
30136
+ starSurveyFiveStarText: strings.starSurveyFiveStarText,
30137
+ starRatingAriaLabel: strings.starRatingAriaLabel
30138
+ };
30139
+ /* @conditional-compile-remove(end-of-call-survey) */
30140
+ return React.createElement(_StarSurvey, { strings: StarSurveyStrings, onStarRatingSelected: onStarRatingSelected });
30141
+ };
30142
+
30143
+ // Copyright (c) Microsoft Corporation.
30144
+ // Licensed under the MIT License.
30145
+ /** @private */
30146
+ const TagsSurvey = (
30147
+ /* @conditional-compile-remove(end-of-call-survey) */ props) => {
30148
+ /* @conditional-compile-remove(end-of-call-survey) */
30149
+ const strings = useLocale().strings.call;
30150
+ /* @conditional-compile-remove(end-of-call-survey) */
30151
+ const tagsSurveyStrings = {
30152
+ tagsSurveyQuestion: strings.tagsSurveyQuestion,
30153
+ tagsSurveyHelperText: strings.tagsSurveyHelperText
30154
+ };
30155
+ /* @conditional-compile-remove(end-of-call-survey) */
30156
+ return (React.createElement(_TagsSurvey, { callIssuesToTag: strings.surveyIssues, categoryHeadings: strings.SurveyIssuesHeadingStrings, issues: props.issues, onConfirm: props.onConfirm, strings: tagsSurveyStrings }));
30157
+ };
30158
+
30159
+ // Copyright (c) Microsoft Corporation.
30160
+ // Licensed under the MIT License.
30161
+ /**
30162
+ * @private
30163
+ */
30164
+ const SurveyPaneContent = (
30165
+ /* @conditional-compile-remove(end-of-call-survey) */ props) => {
30166
+ /* @conditional-compile-remove(end-of-call-survey) */
30167
+ const [showTagsSurvey, setShowTagsSurvey] = React.useState(false);
30168
+ /* @conditional-compile-remove(end-of-call-survey) */
30169
+ const [ratings, setRatings] = React.useState(0);
30170
+ /* @conditional-compile-remove(end-of-call-survey) */
30171
+ const [issuesSelected, setIssuesSelected] = React.useState();
30172
+ /* @conditional-compile-remove(end-of-call-survey) */
30173
+ const [showSubmitFeedbackButton, setShowSubmitFeedbackButton] = React.useState(false);
30174
+ /* @conditional-compile-remove(end-of-call-survey) */
30175
+ const strings = useLocale().strings.call;
30176
+ /* @conditional-compile-remove(end-of-call-survey) */
30177
+ const onStarRatingSelected = (ratings) => {
30178
+ if (ratings <= 3) {
30179
+ setShowTagsSurvey(true);
30180
+ }
30181
+ else {
30182
+ setShowSubmitFeedbackButton(true);
30183
+ }
30184
+ setRatings(ratings);
30185
+ };
30186
+ /* @conditional-compile-remove(end-of-call-survey) */
30187
+ const onIssuesSelected = (selectedTags) => {
30188
+ setIssuesSelected(selectedTags);
30189
+ setShowSubmitFeedbackButton(true);
30190
+ };
30191
+ /* @conditional-compile-remove(end-of-call-survey) */
30192
+ const issues = [
30193
+ 'NoLocalAudio',
30194
+ 'NoRemoteAudio',
30195
+ 'Echo',
30196
+ 'AudioNoise',
30197
+ 'LowVolume',
30198
+ 'AudioStoppedUnexpectedly',
30199
+ 'DistortedSpeech',
30200
+ 'AudioInterruption',
30201
+ 'OtherIssues',
30202
+ 'NoContentLocal',
30203
+ 'NoContentRemote',
30204
+ 'CannotPresent',
30205
+ 'LowQuality',
30206
+ 'Freezes',
30207
+ 'StoppedUnexpectedly',
30208
+ 'LargeDelay',
30209
+ 'NoVideoReceived',
30210
+ 'NoVideoSent',
30211
+ 'LowQuality',
30212
+ 'Freezes',
30213
+ 'StoppedUnexpectedly',
30214
+ 'DarkVideoReceived',
30215
+ 'AudioVideoOutOfSync',
30216
+ 'CallCannotJoin',
30217
+ 'CallCannotInvite',
30218
+ 'HadToRejoin',
30219
+ 'CallEndedUnexpectedly'
30220
+ ];
30221
+ /* @conditional-compile-remove(end-of-call-survey) */
30222
+ return (React.createElement(react.Stack, { verticalAlign: "space-between" },
30223
+ React.createElement(react.Stack, null,
30224
+ React.createElement(StarSurvey, { onStarRatingSelected: onStarRatingSelected }),
30225
+ showTagsSurvey && React.createElement(TagsSurvey, { issues: issues, onConfirm: onIssuesSelected })),
30226
+ showSubmitFeedbackButton && (React.createElement(react.Stack, { style: { borderTop: 'solid', borderTopColor: 'lightgrey' }, horizontalAlign: "end" },
30227
+ React.createElement(react.PrimaryButton, { style: { marginTop: '2rem' }, onClick: () => {
30228
+ const surveyResults = { overallRating: { score: ratings } };
30229
+ if (issuesSelected === null || issuesSelected === void 0 ? void 0 : issuesSelected.overallRating) {
30230
+ surveyResults.overallRating = { score: ratings, issues: issuesSelected.overallRating.issues };
30231
+ }
30232
+ if (issuesSelected === null || issuesSelected === void 0 ? void 0 : issuesSelected.audioRating) {
30233
+ surveyResults.audioRating = { score: ratings, issues: issuesSelected.audioRating.issues };
30234
+ }
30235
+ if (issuesSelected === null || issuesSelected === void 0 ? void 0 : issuesSelected.screenshareRating) {
30236
+ surveyResults.screenshareRating = { score: ratings, issues: issuesSelected.screenshareRating.issues };
30237
+ }
30238
+ if (issuesSelected === null || issuesSelected === void 0 ? void 0 : issuesSelected.videoRating) {
30239
+ surveyResults.videoRating = { score: ratings, issues: issuesSelected.videoRating.issues };
30240
+ }
30241
+ if (props.onSubmitSurvey) {
30242
+ props
30243
+ .onSubmitSurvey(surveyResults)
30244
+ .then(() => console.log('survey submitted successfully', surveyResults))
30245
+ .catch((e) => console.log('error when submitting survey: ' + e));
30246
+ }
30247
+ if (props.onDismissSidePane) {
30248
+ props.onDismissSidePane();
30249
+ }
30250
+ } }, strings.surveyConfirmButtonLabel)))));
30251
+ };
30252
+
30253
+ // Copyright (c) Microsoft Corporation.
30254
+ // Licensed under the MIT License.
30255
+ /** @private */
30256
+ const SurveyPane = (props) => {
30257
+ /* @conditional-compile-remove(end-of-call-survey) */
30258
+ const strings = useLocale().strings.call;
30259
+ /* @conditional-compile-remove(end-of-call-survey) */
30260
+ const [isOpen, setIsOpen] = React.useState(true);
30261
+ /* @conditional-compile-remove(end-of-call-survey) */
30262
+ return (React.createElement(react.Panel, { headerText: strings.surveyQuestion, isOpen: isOpen, onDismiss: () => setIsOpen(false), closeButtonAriaLabel: strings.surveyCancelButtonAriaLabel, type: react.PanelType.custom, customWidth: "32rem" },
30263
+ React.createElement(SurveyPaneContent, { onSubmitSurvey: props.onSubmitSurvey, onDismissSidePane: () => setIsOpen(false) })));
30264
+ };
30265
+
29880
30266
  // Copyright (c) Microsoft Corporation.
29881
30267
  // Licensed under the MIT License.
29882
30268
  /**
@@ -29885,14 +30271,18 @@ const moreDetailsStyles = {
29885
30271
  * @private
29886
30272
  */
29887
30273
  function NoticePage(props) {
30274
+ var _a;
29888
30275
  const adapter = useAdapter();
30276
+ /* @conditional-compile-remove(end-of-call-survey) */
30277
+ const handlers = useHandlers();
29889
30278
  return (React.createElement(react.Stack, { className: react.mergeStyles(props.pageStyle), verticalFill: true, verticalAlign: "center", horizontalAlign: "center", "data-ui-id": props.dataUiId, "aria-atomic": true },
29890
30279
  React.createElement(react.Stack, { className: react.mergeStyles(containerStyle), tokens: containerItemGap },
29891
30280
  props.iconName && React.createElement(CallCompositeIcon, { iconName: props.iconName }),
29892
30281
  React.createElement(react.Text, { className: react.mergeStyles(titleStyles), "aria-live": "assertive" }, props.title),
29893
30282
  React.createElement(react.Text, { className: react.mergeStyles(moreDetailsStyles), "aria-live": "assertive" }, props.moreDetails),
29894
30283
  !props.disableStartCallButton && (React.createElement(react.Stack, { styles: rejoinCallButtonContainerStyles },
29895
- React.createElement(StartCallButton, { onClick: () => adapter.joinCall(), disabled: false, rejoinCall: true, autoFocus: true }))))));
30284
+ React.createElement(StartCallButton, { onClick: () => adapter.joinCall(), disabled: false, rejoinCall: true, autoFocus: true })))),
30285
+ /* @conditional-compile-remove(end-of-call-survey) */ !((_a = props.surveyOptions) === null || _a === void 0 ? void 0 : _a.hideSurvey) && (React.createElement(SurveyPane, Object.assign({}, handlers)))));
29896
30286
  }
29897
30287
 
29898
30288
  // Copyright (c) Microsoft Corporation.
@@ -30569,7 +30959,7 @@ const isShowing = (overrideSidePane) => {
30569
30959
  return !!(overrideSidePane === null || overrideSidePane === void 0 ? void 0 : overrideSidePane.isActive);
30570
30960
  };
30571
30961
  const MainScreen = (props) => {
30572
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
30962
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
30573
30963
  const adapter = useAdapter();
30574
30964
  const { camerasCount, microphonesCount } = useSelector$1(deviceCountSelector);
30575
30965
  const hasCameras = camerasCount > 0;
@@ -30657,20 +31047,30 @@ const MainScreen = (props) => {
30657
31047
  backgroundImage: (_k = (_j = props.options) === null || _j === void 0 ? void 0 : _j.branding) === null || _k === void 0 ? void 0 : _k.backgroundImage }));
30658
31048
  break;
30659
31049
  case 'accessDeniedTeamsMeeting':
30660
- pageElement = (React.createElement(NoticePage, { iconName: "NoticePageAccessDeniedTeamsMeeting", title: locale.strings.call.failedToJoinTeamsMeetingReasonAccessDeniedTitle, moreDetails: locale.strings.call.failedToJoinTeamsMeetingReasonAccessDeniedMoreDetails, dataUiId: 'access-denied-teams-meeting-page' }));
31050
+ pageElement = (React.createElement(NoticePage, { iconName: "NoticePageAccessDeniedTeamsMeeting", title: locale.strings.call.failedToJoinTeamsMeetingReasonAccessDeniedTitle, moreDetails: locale.strings.call.failedToJoinTeamsMeetingReasonAccessDeniedMoreDetails, dataUiId: 'access-denied-teams-meeting-page',
31051
+ /* @conditional-compile-remove(end-of-call-survey) */
31052
+ surveyOptions: { hideSurvey: true } }));
30661
31053
  break;
30662
31054
  case 'removedFromCall':
30663
- pageElement = (React.createElement(NoticePage, { iconName: "NoticePageRemovedFromCall", title: locale.strings.call.removedFromCallTitle, moreDetails: locale.strings.call.removedFromCallMoreDetails, dataUiId: 'removed-from-call-page' }));
31055
+ pageElement = (React.createElement(NoticePage, { iconName: "NoticePageRemovedFromCall", title: locale.strings.call.removedFromCallTitle, moreDetails: locale.strings.call.removedFromCallMoreDetails, dataUiId: 'removed-from-call-page',
31056
+ /* @conditional-compile-remove(end-of-call-survey) */
31057
+ surveyOptions: { hideSurvey: true } }));
30664
31058
  break;
30665
31059
  case 'joinCallFailedDueToNoNetwork':
30666
- pageElement = (React.createElement(NoticePage, { iconName: "NoticePageJoinCallFailedDueToNoNetwork", title: locale.strings.call.failedToJoinCallDueToNoNetworkTitle, moreDetails: locale.strings.call.failedToJoinCallDueToNoNetworkMoreDetails, dataUiId: 'join-call-failed-due-to-no-network-page' }));
31060
+ pageElement = (React.createElement(NoticePage, { iconName: "NoticePageJoinCallFailedDueToNoNetwork", title: locale.strings.call.failedToJoinCallDueToNoNetworkTitle, moreDetails: locale.strings.call.failedToJoinCallDueToNoNetworkMoreDetails, dataUiId: 'join-call-failed-due-to-no-network-page',
31061
+ /* @conditional-compile-remove(end-of-call-survey) */
31062
+ surveyOptions: { hideSurvey: true } }));
30667
31063
  break;
30668
31064
  case 'leaving':
30669
- pageElement = (React.createElement(NoticePage, { title: (_l = locale.strings.call.leavingCallTitle) !== null && _l !== void 0 ? _l : 'Leaving...', dataUiId: 'leaving-page', pageStyle: leavePageStyle, disableStartCallButton: true }));
31065
+ pageElement = (React.createElement(NoticePage, { title: (_l = locale.strings.call.leavingCallTitle) !== null && _l !== void 0 ? _l : 'Leaving...', dataUiId: 'leaving-page', pageStyle: leavePageStyle, disableStartCallButton: true,
31066
+ /* @conditional-compile-remove(end-of-call-survey) */
31067
+ surveyOptions: { hideSurvey: true } }));
30670
31068
  break;
30671
31069
  case 'leftCall': {
30672
31070
  const { title, moreDetails, disableStartCallButton, iconName } = getEndedCallPageProps(locale, endedCall);
30673
- pageElement = (React.createElement(NoticePage, { iconName: iconName, title: title, moreDetails: moreDetails, dataUiId: 'left-call-page', disableStartCallButton: disableStartCallButton }));
31071
+ pageElement = (React.createElement(NoticePage, { iconName: iconName, title: title, moreDetails: moreDetails, dataUiId: 'left-call-page', disableStartCallButton: disableStartCallButton,
31072
+ /* @conditional-compile-remove(end-of-call-survey) */
31073
+ surveyOptions: (_m = props.options) === null || _m === void 0 ? void 0 : _m.surveyOptions }));
30674
31074
  break;
30675
31075
  }
30676
31076
  case 'lobby':
@@ -30710,7 +31110,7 @@ const MainScreen = (props) => {
30710
31110
  case 'unsupportedEnvironment':
30711
31111
  pageElement = (React.createElement(React.Fragment, null,
30712
31112
  /* @conditional-compile-remove(unsupported-browser) */
30713
- React.createElement(UnsupportedBrowserPage, { onTroubleshootingClick: (_m = props.options) === null || _m === void 0 ? void 0 : _m.onEnvironmentInfoTroubleshootingClick, environmentInfo: adapter.getState().environmentInfo })));
31113
+ React.createElement(UnsupportedBrowserPage, { onTroubleshootingClick: (_o = props.options) === null || _o === void 0 ? void 0 : _o.onEnvironmentInfoTroubleshootingClick, environmentInfo: adapter.getState().environmentInfo })));
30714
31114
  break;
30715
31115
  }
30716
31116
  if (!pageElement) {
@@ -31364,6 +31764,8 @@ class AzureCommunicationCallAdapter {
31364
31764
  this.stopVideoBackgroundEffects.bind(this);
31365
31765
  /* @conditional-compile-remove(video-background-effects) */
31366
31766
  this.updateBackgroundPickerImages.bind(this);
31767
+ /* @conditional-compile-remove(end-of-call-survey) */
31768
+ this.submitSurvey.bind(this);
31367
31769
  }
31368
31770
  dispose() {
31369
31771
  this.resetDiagnosticsForwarder();
@@ -31608,9 +32010,9 @@ class AzureCommunicationCallAdapter {
31608
32010
  unmute() {
31609
32011
  return __awaiter$5(this, void 0, void 0, function* () {
31610
32012
  return yield this.asyncTeeErrorToEventEmitter(() => __awaiter$5(this, void 0, void 0, function* () {
31611
- var _a, _b;
32013
+ var _a, _b, _c;
31612
32014
  this.context.setIsLocalMicrophoneEnabled(true);
31613
- if (_isInCall((_a = this.call) === null || _a === void 0 ? void 0 : _a.state) && ((_b = this.call) === null || _b === void 0 ? void 0 : _b.isMuted)) {
32015
+ if ((_isInCall((_a = this.call) === null || _a === void 0 ? void 0 : _a.state) || _isInLobbyOrConnecting((_b = this.call) === null || _b === void 0 ? void 0 : _b.state)) && ((_c = this.call) === null || _c === void 0 ? void 0 : _c.isMuted)) {
31614
32016
  yield this.handlers.onToggleMicrophone();
31615
32017
  }
31616
32018
  }));
@@ -31802,6 +32204,12 @@ class AzureCommunicationCallAdapter {
31802
32204
  this.handlers.onSetSpokenLanguage(language);
31803
32205
  });
31804
32206
  }
32207
+ /* @conditional-compile-remove(end-of-call-survey) */
32208
+ submitSurvey(survey) {
32209
+ return __awaiter$5(this, void 0, void 0, function* () {
32210
+ return this.handlers.onSubmitSurvey(survey);
32211
+ });
32212
+ }
31805
32213
  getState() {
31806
32214
  return this.context.getState();
31807
32215
  }
@@ -32515,6 +32923,12 @@ class CallWithChatBackedCallAdapter {
32515
32923
  updateSelectedVideoBackgroundEffect(selectedVideoBackground) {
32516
32924
  return this.callWithChatAdapter.updateSelectedVideoBackgroundEffect(selectedVideoBackground);
32517
32925
  }
32926
+ /* @conditional-compile-remove(end-of-call-survey) */
32927
+ submitSurvey(survey) {
32928
+ return __awaiter$4(this, void 0, void 0, function* () {
32929
+ return this.callWithChatAdapter.submitSurvey(survey);
32930
+ });
32931
+ }
32518
32932
  }
32519
32933
  function callAdapterStateFromCallWithChatAdapterState(callWithChatAdapterState) {
32520
32934
  return {
@@ -32804,6 +33218,8 @@ const validNewChatMessage = (message) => !!message.senderDisplayName && (message
32804
33218
  // Licensed under the MIT License.
32805
33219
  const CallWithChatScreen = (props) => {
32806
33220
  const { callWithChatAdapter, fluentTheme, formFactor = 'desktop' } = props;
33221
+ /* @conditional-compile-remove(end-of-call-survey) */
33222
+ const { surveyOptions } = props;
32807
33223
  const mobileView = formFactor === 'mobile';
32808
33224
  if (!callWithChatAdapter) {
32809
33225
  throw new Error('CallWithChatAdapter is undefined');
@@ -32920,6 +33336,8 @@ const CallWithChatScreen = (props) => {
32920
33336
  galleryOptions: props.galleryOptions,
32921
33337
  /* @conditional-compile-remove(click-to-call) */
32922
33338
  localVideoTile: props.localVideoTile,
33339
+ /* @conditional-compile-remove(end-of-call-survey) */
33340
+ surveyOptions: surveyOptions,
32923
33341
  /* @conditional-compile-remove(custom-branding) */
32924
33342
  branding: {
32925
33343
  logo: props.logo,
@@ -32945,6 +33363,8 @@ const CallWithChatScreen = (props) => {
32945
33363
  props.localVideoTile,
32946
33364
  /* @conditional-compile-remove(pinned-participants) */
32947
33365
  props.remoteVideoTileMenuOptions,
33366
+ /* @conditional-compile-remove(end-of-call-survey) */
33367
+ surveyOptions,
32948
33368
  /* @conditional-compile-remove(custom-branding) */
32949
33369
  props.logo,
32950
33370
  /* @conditional-compile-remove(custom-branding) */
@@ -33599,6 +34019,12 @@ class AzureCommunicationCallWithChatAdapter {
33599
34019
  updateSelectedVideoBackgroundEffect(selectedVideoBackground) {
33600
34020
  return this.callAdapter.updateSelectedVideoBackgroundEffect(selectedVideoBackground);
33601
34021
  }
34022
+ /* @conditional-compile-remove(end-of-call-survey) */
34023
+ submitSurvey(survey) {
34024
+ return __awaiter$2(this, void 0, void 0, function* () {
34025
+ return this.callAdapter.submitSurvey(survey);
34026
+ });
34027
+ }
33602
34028
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
33603
34029
  on(event, listener) {
33604
34030
  switch (event) {