@azure/communication-react 1.2.3-alpha-202205120015.0 → 1.2.3-alpha-202205170014.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/communication-react.d.ts +16 -5
  2. package/dist/dist-cjs/communication-react/index.js +271 -183
  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/chat-component-bindings/src/handlers/createHandlers.d.ts +4 -1
  6. package/dist/dist-esm/chat-component-bindings/src/handlers/createHandlers.d.ts.map +1 -1
  7. package/dist/dist-esm/chat-component-bindings/src/handlers/createHandlers.js +4 -2
  8. package/dist/dist-esm/chat-component-bindings/src/handlers/createHandlers.js.map +1 -1
  9. package/dist/dist-esm/communication-react/src/index.d.ts +2 -2
  10. package/dist/dist-esm/communication-react/src/index.d.ts.map +1 -1
  11. package/dist/dist-esm/communication-react/src/index.js +1 -1
  12. package/dist/dist-esm/communication-react/src/index.js.map +1 -1
  13. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponent.d.ts +4 -2
  14. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponent.d.ts.map +1 -1
  15. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponent.js +2 -2
  16. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponent.js.map +1 -1
  17. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentAsEditBox.d.ts +4 -1
  18. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentAsEditBox.d.ts.map +1 -1
  19. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentAsEditBox.js +24 -13
  20. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentAsEditBox.js.map +1 -1
  21. package/dist/dist-esm/react-components/src/components/ComplianceBanner/ComplianceBanner.d.ts +41 -0
  22. package/dist/dist-esm/react-components/src/components/ComplianceBanner/ComplianceBanner.d.ts.map +1 -0
  23. package/dist/dist-esm/react-components/src/components/ComplianceBanner/ComplianceBanner.js +196 -0
  24. package/dist/dist-esm/react-components/src/components/ComplianceBanner/ComplianceBanner.js.map +1 -0
  25. package/dist/dist-esm/react-components/src/components/ComplianceBanner/Utils.d.ts +20 -0
  26. package/dist/dist-esm/react-components/src/components/ComplianceBanner/Utils.d.ts.map +1 -0
  27. package/dist/dist-esm/react-components/src/components/ComplianceBanner/Utils.js +42 -0
  28. package/dist/dist-esm/react-components/src/components/ComplianceBanner/Utils.js.map +1 -0
  29. package/dist/dist-esm/react-components/src/components/ComplianceBanner/index.d.ts +3 -0
  30. package/dist/dist-esm/react-components/src/components/ComplianceBanner/index.d.ts.map +1 -0
  31. package/dist/dist-esm/react-components/src/components/ComplianceBanner/index.js +4 -0
  32. package/dist/dist-esm/react-components/src/components/ComplianceBanner/index.js.map +1 -0
  33. package/dist/dist-esm/react-components/src/components/MessageThread.d.ts +10 -4
  34. package/dist/dist-esm/react-components/src/components/MessageThread.d.ts.map +1 -1
  35. package/dist/dist-esm/react-components/src/components/MessageThread.js.map +1 -1
  36. package/dist/dist-esm/react-components/src/components/index.d.ts +3 -1
  37. package/dist/dist-esm/react-components/src/components/index.d.ts.map +1 -1
  38. package/dist/dist-esm/react-components/src/components/index.js +1 -0
  39. package/dist/dist-esm/react-components/src/components/index.js.map +1 -1
  40. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CallArrangement.d.ts +2 -3
  41. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CallArrangement.d.ts.map +1 -1
  42. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CallArrangement.js +2 -3
  43. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CallArrangement.js.map +1 -1
  44. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/CallPage.d.ts.map +1 -1
  45. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/CallPage.js +3 -1
  46. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/CallPage.js.map +1 -1
  47. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/LobbyPage.js +1 -1
  48. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/LobbyPage.js.map +1 -1
  49. package/dist/dist-esm/react-composites/src/composites/CallComposite/utils/Utils.d.ts +0 -19
  50. package/dist/dist-esm/react-composites/src/composites/CallComposite/utils/Utils.d.ts.map +1 -1
  51. package/dist/dist-esm/react-composites/src/composites/CallComposite/utils/Utils.js +0 -39
  52. package/dist/dist-esm/react-composites/src/composites/CallComposite/utils/Utils.js.map +1 -1
  53. package/dist/dist-esm/react-composites/src/composites/ChatComposite/adapter/AzureCommunicationChatAdapter.d.ts +3 -1
  54. package/dist/dist-esm/react-composites/src/composites/ChatComposite/adapter/AzureCommunicationChatAdapter.d.ts.map +1 -1
  55. package/dist/dist-esm/react-composites/src/composites/ChatComposite/adapter/AzureCommunicationChatAdapter.js +4 -2
  56. package/dist/dist-esm/react-composites/src/composites/ChatComposite/adapter/AzureCommunicationChatAdapter.js.map +1 -1
  57. package/dist/dist-esm/react-composites/src/composites/ChatComposite/adapter/ChatAdapter.d.ts +4 -1
  58. package/dist/dist-esm/react-composites/src/composites/ChatComposite/adapter/ChatAdapter.d.ts.map +1 -1
  59. package/dist/dist-esm/react-composites/src/composites/localization/index.d.ts +7 -0
  60. package/dist/dist-esm/react-composites/src/composites/localization/index.d.ts.map +1 -1
  61. package/dist/dist-esm/react-composites/src/composites/localization/index.js +8 -0
  62. package/dist/dist-esm/react-composites/src/composites/localization/index.js.map +1 -1
  63. package/dist/dist-esm/react-composites/src/index-public.d.ts +2 -0
  64. package/dist/dist-esm/react-composites/src/index-public.d.ts.map +1 -0
  65. package/dist/dist-esm/react-composites/src/index-public.js +8 -0
  66. package/dist/dist-esm/react-composites/src/index-public.js.map +1 -0
  67. package/package.json +7 -7
  68. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/ComplianceBanner.d.ts +0 -13
  69. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/ComplianceBanner.d.ts.map +0 -1
  70. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/ComplianceBanner.js +0 -127
  71. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/ComplianceBanner.js.map +0 -1
  72. package/dist/dist-esm/react-composites/src/index.d.ts +0 -2
  73. package/dist/dist-esm/react-composites/src/index.d.ts.map +0 -1
  74. package/dist/dist-esm/react-composites/src/index.js +0 -4
  75. package/dist/dist-esm/react-composites/src/index.js.map +0 -1
@@ -2303,7 +2303,9 @@ export declare interface ChatAdapterThreadManagement {
2303
2303
  /**
2304
2304
  * Update a message content.
2305
2305
  */
2306
- updateMessage(messageId: string, content: string, metadata?: Record<string, string>): Promise<void>;
2306
+ updateMessage(messageId: string, content: string, metadata?: Record<string, string>, options?: {
2307
+ attachedFilesMetadata?: FileMetadata[];
2308
+ }): Promise<void>;
2307
2309
  /**
2308
2310
  * Delete a message in the thread.
2309
2311
  */
@@ -2584,7 +2586,9 @@ export declare type ChatHandlers = {
2584
2586
  onRemoveParticipant: (userId: string) => Promise<void>;
2585
2587
  updateThreadTopicName: (topicName: string) => Promise<void>;
2586
2588
  onLoadPreviousChatMessages: (messagesToLoad: number) => Promise<boolean>;
2587
- onUpdateMessage: (messageId: string, content: string, metadata?: Record<string, string>) => Promise<void>;
2589
+ onUpdateMessage: (messageId: string, content: string, metadata?: Record<string, string>, options?: {
2590
+ attachedFilesMetadata?: FileMetadata[];
2591
+ }) => Promise<void>;
2588
2592
  onDeleteMessage: (messageId: string) => Promise<void>;
2589
2593
  };
2590
2594
 
@@ -4605,9 +4609,8 @@ export declare type MessageProps = {
4605
4609
  *
4606
4610
  * @param messageId - message id from chatClient
4607
4611
  * @param content - new content of the message
4608
- *
4609
4612
  */
4610
- onUpdateMessage?: (messageId: string, content: string) => Promise<void>;
4613
+ onUpdateMessage?: UpdateMessageCallback;
4611
4614
  /**
4612
4615
  * Optional callback to delete a message.
4613
4616
  *
@@ -4846,7 +4849,7 @@ export declare type MessageThreadProps = {
4846
4849
  * @param content - new content of the message
4847
4850
  *
4848
4851
  */
4849
- onUpdateMessage?: (messageId: string, content: string) => Promise<void>;
4852
+ onUpdateMessage?: UpdateMessageCallback;
4850
4853
  /**
4851
4854
  * Optional callback to delete a message.
4852
4855
  *
@@ -6280,6 +6283,14 @@ export declare interface TypingIndicatorStylesProps extends BaseCustomStyles {
6280
6283
  typingString?: IStyle;
6281
6284
  }
6282
6285
 
6286
+ /**
6287
+ * @public
6288
+ * Callback function run when a message is updated.
6289
+ */
6290
+ export declare type UpdateMessageCallback = (messageId: string, content: string, metadata?: Record<string, string>, options?: {
6291
+ attachedFilesMetadata?: FileMetadata[];
6292
+ }) => Promise<void>;
6293
+
6283
6294
  /**
6284
6295
  * A custom React hook to simplify the creation of {@link CallAdapter}.
6285
6296
  *
@@ -191,7 +191,7 @@ const fromFlatCommunicationIdentifier = (id) => {
191
191
  // Copyright (c) Microsoft Corporation.
192
192
  // Licensed under the MIT license.
193
193
  // GENERATED FILE. DO NOT EDIT MANUALLY.
194
- var telemetryVersion = '1.2.3-alpha-202205120015.0';
194
+ var telemetryVersion = '1.2.3-alpha-202205170014.0';
195
195
 
196
196
  // Copyright (c) Microsoft Corporation.
197
197
  /**
@@ -2580,9 +2580,10 @@ const onRenderSubmitIcon = (color) => {
2580
2580
  const ChatMessageComponentAsEditBox = (props) => {
2581
2581
  const { onCancel, onSubmit, strings, message } = props;
2582
2582
  const [textValue, setTextValue] = React.useState(message.content || '');
2583
+ const [attachedFilesMetadata, setAttachedFilesMetadata] = React__default['default'].useState(getMessageAttachedFilesMetadata(message));
2583
2584
  const editTextFieldRef = React__default['default'].useRef(null);
2584
2585
  const theme = useTheme();
2585
- const messageState = getMessageState(textValue);
2586
+ const messageState = getMessageState(textValue, attachedFilesMetadata !== null && attachedFilesMetadata !== void 0 ? attachedFilesMetadata : []);
2586
2587
  const submitEnabled = messageState === 'OK';
2587
2588
  React.useEffect(() => {
2588
2589
  var _a;
@@ -2599,37 +2600,47 @@ const ChatMessageComponentAsEditBox = (props) => {
2599
2600
  const editBoxStyles = React.useMemo(() => {
2600
2601
  return react.concatStyleSets(editBoxStyleSet, { textField: { borderColor: theme.palette.themePrimary } });
2601
2602
  }, [theme.palette.themePrimary]);
2602
- /* @conditional-compile-remove(file-sharing) */
2603
2603
  const onRenderFileUploads = React.useCallback(() => {
2604
- var _a;
2605
- return (React__default['default'].createElement("div", { style: { margin: '0.25rem' } },
2606
- React__default['default'].createElement(_FileUploadCards, { activeFileUploads: (_a = message.attachedFilesMetadata) === null || _a === void 0 ? void 0 : _a.map((file) => ({
2604
+ return ((attachedFilesMetadata === null || attachedFilesMetadata === void 0 ? void 0 : attachedFilesMetadata.length) && (React__default['default'].createElement("div", { style: { margin: '0.25rem' } },
2605
+ React__default['default'].createElement(_FileUploadCards, { activeFileUploads: attachedFilesMetadata === null || attachedFilesMetadata === void 0 ? void 0 : attachedFilesMetadata.map((file) => ({
2607
2606
  id: file.name,
2608
2607
  filename: file.name,
2609
2608
  progress: 1
2610
- })) })));
2611
- }, [message.attachedFilesMetadata]);
2609
+ })), onCancelFileUpload: (fileId) => {
2610
+ setAttachedFilesMetadata(attachedFilesMetadata === null || attachedFilesMetadata === void 0 ? void 0 : attachedFilesMetadata.filter((file) => file.name !== fileId));
2611
+ } }))));
2612
+ }, [attachedFilesMetadata]);
2612
2613
  return (React__default['default'].createElement(react.Stack, { className: react.mergeStyles(borderAndBoxShadowStyle({
2613
2614
  theme,
2614
2615
  hasErrorMessage: false,
2615
2616
  disabled: false
2616
2617
  })) },
2617
2618
  React__default['default'].createElement(InputBoxComponent, { inlineChildren: props.inlineEditButtons, id: 'editbox', textFieldRef: editTextFieldRef, inputClassName: editBoxStyle(props.inlineEditButtons), placeholderText: strings.editBoxPlaceholderText, textValue: textValue, onChange: setText, onEnterKeyDown: () => {
2618
- submitEnabled && onSubmit(textValue);
2619
+ submitEnabled &&
2620
+ onSubmit(textValue, message.metadata, {
2621
+ attachedFilesMetadata
2622
+ });
2619
2623
  }, supportNewline: false, maxLength: MAXIMUM_LENGTH_OF_MESSAGE, errorMessage: textTooLongMessage, styles: editBoxStyles },
2620
2624
  React__default['default'].createElement(InputBoxButton, { className: editingButtonStyle, ariaLabel: strings.editBoxCancelButton, tooltipContent: strings.editBoxCancelButton, onRenderIcon: onRenderThemedCancelIcon, onClick: () => {
2621
2625
  onCancel && onCancel();
2622
2626
  }, id: 'dismissIconWrapper' }),
2623
2627
  React__default['default'].createElement(InputBoxButton, { className: editingButtonStyle, ariaLabel: strings.editBoxSubmitButton, tooltipContent: strings.editBoxSubmitButton, onRenderIcon: onRenderThemedSubmitIcon, onClick: (e) => {
2624
- submitEnabled && onSubmit(textValue);
2628
+ submitEnabled &&
2629
+ onSubmit(textValue, message.metadata, {
2630
+ attachedFilesMetadata
2631
+ });
2625
2632
  e.stopPropagation();
2626
2633
  }, id: 'submitIconWrapper' })),
2627
- /* @conditional-compile-remove(file-sharing) */
2628
2634
  onRenderFileUploads()));
2629
2635
  };
2630
2636
  const isMessageTooLong = (messageText) => messageText.length > MAXIMUM_LENGTH_OF_MESSAGE;
2631
- const isMessageEmpty = (messageText) => messageText.trim().length === 0;
2632
- const getMessageState = (messageText) => isMessageEmpty(messageText) ? 'too short' : isMessageTooLong(messageText) ? 'too long' : 'OK';
2637
+ const isMessageEmpty = (messageText, attachedFilesMetadata) => messageText.trim().length === 0 && attachedFilesMetadata.length === 0;
2638
+ const getMessageState = (messageText, attachedFilesMetadata) => isMessageEmpty(messageText, attachedFilesMetadata) ? 'too short' : isMessageTooLong(messageText) ? 'too long' : 'OK';
2639
+ // @TODO: Remove when file-sharing feature becomes stable.
2640
+ const getMessageAttachedFilesMetadata = (message) => {
2641
+ /* @conditional-compile-remove(file-sharing) */
2642
+ return message.attachedFilesMetadata;
2643
+ };
2633
2644
 
2634
2645
  // Copyright (c) Microsoft Corporation.
2635
2646
  const MINIMUM_TOUCH_TARGET_HEIGHT_REM$1 = 3;
@@ -3218,10 +3229,10 @@ const ChatMessageComponent = (props) => {
3218
3229
  return React__default['default'].createElement(React__default['default'].Fragment, null);
3219
3230
  }
3220
3231
  else if (isEditing) {
3221
- return (React__default['default'].createElement(ChatMessageComponentAsEditBox, { message: message, inlineEditButtons: props.inlineAcceptRejectEditButtons, strings: props.strings, onSubmit: (text) => __awaiter$o(void 0, void 0, void 0, function* () {
3232
+ return (React__default['default'].createElement(ChatMessageComponentAsEditBox, { message: message, inlineEditButtons: props.inlineAcceptRejectEditButtons, strings: props.strings, onSubmit: (text, metadata, options) => __awaiter$o(void 0, void 0, void 0, function* () {
3222
3233
  props.onUpdateMessage &&
3223
3234
  props.message.messageId &&
3224
- (yield props.onUpdateMessage(props.message.messageId, text));
3235
+ (yield props.onUpdateMessage(props.message.messageId, text, metadata, options));
3225
3236
  setIsEditing(false);
3226
3237
  }), onCancel: () => {
3227
3238
  setIsEditing(false);
@@ -6755,6 +6766,240 @@ const _DrawerMenu = (props) => {
6755
6766
  } })))))));
6756
6767
  };
6757
6768
 
6769
+ // Copyright (c) Microsoft Corporation.
6770
+ // Licensed under the MIT license.
6771
+ /**
6772
+ * Return different conditions based on the current and previous state of recording and transcribing
6773
+ *
6774
+ * @param callRecordState - The current call record state: on, off, stopped
6775
+ * @param callTranscribeState - The current call transcribe state: on, off, stopped
6776
+ *
6777
+ * @remarks - The stopped state means: previously on but currently off
6778
+ *
6779
+ * @private
6780
+ */
6781
+ const computeVariant = (callRecordState, callTranscribeState) => {
6782
+ if (callRecordState === 'on' && callTranscribeState === 'on') {
6783
+ return 'RECORDING_AND_TRANSCRIPTION_STARTED';
6784
+ }
6785
+ else if (callRecordState === 'on' && callTranscribeState === 'off') {
6786
+ return 'RECORDING_STARTED';
6787
+ }
6788
+ else if (callRecordState === 'off' && callTranscribeState === 'on') {
6789
+ return 'TRANSCRIPTION_STARTED';
6790
+ }
6791
+ else if (callRecordState === 'on' && callTranscribeState === 'stopped') {
6792
+ return 'TRANSCRIPTION_STOPPED_STILL_RECORDING';
6793
+ }
6794
+ else if (callRecordState === 'stopped' && callTranscribeState === 'on') {
6795
+ return 'RECORDING_STOPPED_STILL_TRANSCRIBING';
6796
+ }
6797
+ else if (callRecordState === 'off' && callTranscribeState === 'stopped') {
6798
+ return 'TRANSCRIPTION_STOPPED';
6799
+ }
6800
+ else if (callRecordState === 'stopped' && callTranscribeState === 'off') {
6801
+ return 'RECORDING_STOPPED';
6802
+ }
6803
+ else if (callRecordState === 'stopped' && callTranscribeState === 'stopped') {
6804
+ return 'RECORDING_AND_TRANSCRIPTION_STOPPED';
6805
+ }
6806
+ else {
6807
+ return 'NO_STATE';
6808
+ }
6809
+ };
6810
+
6811
+ // Copyright (c) Microsoft Corporation.
6812
+ const BANNER_OVERWRITE_DELAY_MS = 3000;
6813
+ /**
6814
+ * A component that displays banners to notify the user when call recording and
6815
+ * transcription is enabled or disabled in a call.
6816
+ *
6817
+ * This component implements a state machine that tracks the changes to call
6818
+ * recording and transcription state and shows the corresponding message.
6819
+ *
6820
+ * @internal
6821
+ */
6822
+ const _ComplianceBanner = (props) => {
6823
+ const cachedProps = React.useRef({
6824
+ latestBooleanState: {
6825
+ callTranscribeState: false,
6826
+ callRecordState: false
6827
+ },
6828
+ latestStringState: {
6829
+ callTranscribeState: 'off',
6830
+ callRecordState: 'off'
6831
+ },
6832
+ lastUpdated: Date.now()
6833
+ });
6834
+ // Only update cached props and variant if there is _some_ change in the latest props.
6835
+ // This ensures that state machine is only updated if there is an actual change in the props.
6836
+ const shouldUpdateCached = props.callRecordState !== cachedProps.current.latestBooleanState.callRecordState ||
6837
+ props.callTranscribeState !== cachedProps.current.latestBooleanState.callTranscribeState;
6838
+ // The following three operations must be performed in this exact order:
6839
+ // [1]: Update cached state to transition the state machine.
6840
+ if (shouldUpdateCached) {
6841
+ cachedProps.current = {
6842
+ latestBooleanState: props,
6843
+ latestStringState: {
6844
+ callRecordState: determineStates(cachedProps.current.latestStringState.callRecordState, props.callRecordState),
6845
+ callTranscribeState: determineStates(cachedProps.current.latestStringState.callTranscribeState, props.callTranscribeState)
6846
+ },
6847
+ lastUpdated: Date.now()
6848
+ };
6849
+ }
6850
+ // [2]: Compute the variant, using the transitioned state machine.
6851
+ const variant = computeVariant(cachedProps.current.latestStringState.callRecordState, cachedProps.current.latestStringState.callTranscribeState);
6852
+ // [3]: Transition the state machine again to deal with some end-states.
6853
+ if (shouldUpdateCached &&
6854
+ cachedProps.current.latestStringState.callRecordState === 'stopped' &&
6855
+ cachedProps.current.latestStringState.callTranscribeState === 'stopped') {
6856
+ // When both states are stopped, after displaying message "RECORDING_AND_TRANSCRIPTION_STOPPED", change both states to off (going back to the default state).
6857
+ cachedProps.current.latestStringState.callRecordState = 'off';
6858
+ cachedProps.current.latestStringState.callTranscribeState = 'off';
6859
+ }
6860
+ return (React__default['default'].createElement(DelayedUpdateBanner, { variant: {
6861
+ variant,
6862
+ lastUpdated: cachedProps.current.lastUpdated
6863
+ }, strings: props.strings, onDismiss: () => {
6864
+ if (cachedProps.current.latestStringState.callRecordState === 'stopped') {
6865
+ cachedProps.current.latestStringState.callRecordState = 'off';
6866
+ }
6867
+ if (cachedProps.current.latestStringState.callTranscribeState === 'stopped') {
6868
+ cachedProps.current.latestStringState.callTranscribeState = 'off';
6869
+ }
6870
+ } }));
6871
+ };
6872
+ function determineStates(previous, current) {
6873
+ // if current state is on, then return on
6874
+ if (current) {
6875
+ return 'on';
6876
+ }
6877
+ // if current state is off
6878
+ else {
6879
+ // if previous state is on and current state is off, return stopped (on -> off)
6880
+ if (previous === 'on') {
6881
+ return 'stopped';
6882
+ }
6883
+ // otherwise remain previous state unchanged
6884
+ else {
6885
+ return previous;
6886
+ }
6887
+ }
6888
+ }
6889
+ /**
6890
+ * Shows a {@link BannerMessage} in a {@link MessageBar} tracking `variant` internally.
6891
+ *
6892
+ * This component delays and combines frequent updates to `variant` such that:
6893
+ * - Updates that happen within {@link BANNER_OVERWRITE_DELAY_MS} are delayed.
6894
+ * - Once {@link BANNER_OVERWRITE_DELAY_MS} has passed since the last update, the _latest_ pending update is shown.
6895
+ *
6896
+ * This ensures that there is enough time for the user to see a banner message before it is overwritten.
6897
+ * In case of multiple delayed messages, the user always sees the final message as it reflects the final state
6898
+ * of recording and transcription.
6899
+ *
6900
+ * @private
6901
+ */
6902
+ function DelayedUpdateBanner(props) {
6903
+ const { variant, lastUpdated: variantLastUpdated } = props.variant;
6904
+ // Tracks the variant that is currently visible in the UI.
6905
+ const [visible, setVisible] = React.useState({
6906
+ variant,
6907
+ lastUpdated: Date.now()
6908
+ });
6909
+ const pendingUpdateHandle = React.useRef(null);
6910
+ if (variant !== visible.variant && variantLastUpdated > visible.lastUpdated) {
6911
+ // Always clear pending updates.
6912
+ // We'll either update now, or schedule an update for later.
6913
+ if (pendingUpdateHandle.current) {
6914
+ clearTimeout(pendingUpdateHandle.current);
6915
+ pendingUpdateHandle.current = null;
6916
+ }
6917
+ const now = Date.now();
6918
+ const timeToNextUpdate = BANNER_OVERWRITE_DELAY_MS - (now - visible.lastUpdated);
6919
+ if (variant === 'NO_STATE' || timeToNextUpdate <= 0) {
6920
+ setVisible({
6921
+ variant,
6922
+ lastUpdated: now
6923
+ });
6924
+ }
6925
+ else {
6926
+ pendingUpdateHandle.current = setTimeout(() => {
6927
+ // Set the actual update time, not the computed time when the update should happen.
6928
+ // The actual update might be later than we planned.
6929
+ setVisible({
6930
+ variant,
6931
+ lastUpdated: Date.now()
6932
+ });
6933
+ }, timeToNextUpdate);
6934
+ }
6935
+ }
6936
+ if (visible.variant === 'NO_STATE') {
6937
+ return React__default['default'].createElement(React__default['default'].Fragment, null);
6938
+ }
6939
+ return (React__default['default'].createElement(react.MessageBar, { messageBarType: react.MessageBarType.warning, onDismiss: () => {
6940
+ // when closing the banner, change variant to nostate and change stopped state to off state.
6941
+ // Reason: on banner close, going back to the default state.
6942
+ setVisible({
6943
+ variant: 'NO_STATE',
6944
+ lastUpdated: Date.now()
6945
+ });
6946
+ props.onDismiss();
6947
+ }, dismissButtonAriaLabel: props.strings.close },
6948
+ React__default['default'].createElement(BannerMessage, { variant: visible.variant, strings: props.strings })));
6949
+ }
6950
+ function BannerMessage(props) {
6951
+ const { variant, strings } = props;
6952
+ switch (variant) {
6953
+ case 'TRANSCRIPTION_STOPPED_STILL_RECORDING':
6954
+ return (React__default['default'].createElement(React__default['default'].Fragment, null,
6955
+ React__default['default'].createElement("b", null, strings.complianceBannerTranscriptionStopped),
6956
+ ` ${strings.complianceBannerNowOnlyRecording}`,
6957
+ React__default['default'].createElement(PrivacyPolicy, { linkText: strings.privacyPolicy })));
6958
+ case 'RECORDING_STOPPED_STILL_TRANSCRIBING':
6959
+ return (React__default['default'].createElement(React__default['default'].Fragment, null,
6960
+ React__default['default'].createElement("b", null, strings.complianceBannerRecordingStopped),
6961
+ ` ${strings.complianceBannerNowOnlyTranscription}`,
6962
+ React__default['default'].createElement(PrivacyPolicy, { linkText: strings.privacyPolicy })));
6963
+ case 'RECORDING_AND_TRANSCRIPTION_STOPPED':
6964
+ return (React__default['default'].createElement(React__default['default'].Fragment, null,
6965
+ React__default['default'].createElement("b", null, strings.complianceBannerRecordingAndTranscriptionSaved),
6966
+ ` ${strings.complianceBannerRecordingAndTranscriptionStopped}`,
6967
+ React__default['default'].createElement(LearnMore, { linkText: strings.learnMore })));
6968
+ case 'RECORDING_AND_TRANSCRIPTION_STARTED':
6969
+ return (React__default['default'].createElement(React__default['default'].Fragment, null,
6970
+ React__default['default'].createElement("b", null, strings.complianceBannerRecordingAndTranscriptionStarted),
6971
+ ` ${strings.complianceBannerTranscriptionConsent}`,
6972
+ React__default['default'].createElement(PrivacyPolicy, { linkText: strings.privacyPolicy })));
6973
+ case 'TRANSCRIPTION_STARTED':
6974
+ return (React__default['default'].createElement(React__default['default'].Fragment, null,
6975
+ React__default['default'].createElement("b", null, strings.complianceBannerTranscriptionStarted),
6976
+ ` ${strings.complianceBannerTranscriptionConsent}`,
6977
+ React__default['default'].createElement(PrivacyPolicy, { linkText: strings.privacyPolicy })));
6978
+ case 'RECORDING_STOPPED':
6979
+ return (React__default['default'].createElement(React__default['default'].Fragment, null,
6980
+ React__default['default'].createElement("b", null, strings.complianceBannerRecordingSaving),
6981
+ ` ${strings.complianceBannerRecordingStopped}`,
6982
+ React__default['default'].createElement(LearnMore, { linkText: strings.learnMore })));
6983
+ case 'RECORDING_STARTED':
6984
+ return (React__default['default'].createElement(React__default['default'].Fragment, null,
6985
+ React__default['default'].createElement("b", null, strings.complianceBannerRecordingStarted),
6986
+ ` ${strings.complianceBannerTranscriptionConsent}`,
6987
+ React__default['default'].createElement(PrivacyPolicy, { linkText: strings.privacyPolicy })));
6988
+ case 'TRANSCRIPTION_STOPPED':
6989
+ return (React__default['default'].createElement(React__default['default'].Fragment, null,
6990
+ React__default['default'].createElement("b", null, strings.complianceBannerTranscriptionSaving),
6991
+ ` ${strings.complianceBannerTranscriptionStopped}`,
6992
+ React__default['default'].createElement(LearnMore, { linkText: strings.learnMore })));
6993
+ }
6994
+ return React__default['default'].createElement(React__default['default'].Fragment, null);
6995
+ }
6996
+ function PrivacyPolicy(props) {
6997
+ return (React__default['default'].createElement(react.Link, { href: "https://privacy.microsoft.com/privacystatement#mainnoticetoendusersmodule", target: "_blank", underline: true }, props.linkText));
6998
+ }
6999
+ function LearnMore(props) {
7000
+ return (React__default['default'].createElement(react.Link, { href: "https://support.microsoft.com/office/record-a-meeting-in-teams-34dfbe7f-b07d-4a27-b4c6-de62f1348c24", target: "_blank", underline: true }, props.linkText));
7001
+ }
7002
+
6758
7003
  // Copyright (c) Microsoft Corporation.
6759
7004
  // Licensed under the MIT license.
6760
7005
  /**
@@ -7164,8 +7409,10 @@ const createDefaultChatHandlers = memoizeOne__default['default']((chatClient, ch
7164
7409
  };
7165
7410
  yield chatThreadClient.sendMessage(sendMessageRequest, options);
7166
7411
  }),
7167
- onUpdateMessage: (messageId, content, metadata) => __awaiter$k(void 0, void 0, void 0, function* () {
7168
- yield chatThreadClient.updateMessage(messageId, { content, metadata });
7412
+ onUpdateMessage: (messageId, content, metadata, options) => __awaiter$k(void 0, void 0, void 0, function* () {
7413
+ const updatedMetadata = metadata ? Object.assign({}, metadata) : {};
7414
+ updatedMetadata['fileSharingMetadata'] = JSON.stringify((options === null || options === void 0 ? void 0 : options.attachedFilesMetadata) || []);
7415
+ yield chatThreadClient.updateMessage(messageId, { content, metadata: updatedMetadata });
7169
7416
  }),
7170
7417
  onDeleteMessage: (messageId) => __awaiter$k(void 0, void 0, void 0, function* () {
7171
7418
  yield chatThreadClient.deleteMessage(messageId);
@@ -11488,10 +11735,11 @@ class AzureCommunicationChatAdapter {
11488
11735
  }));
11489
11736
  });
11490
11737
  }
11491
- updateMessage(messageId, content, metadata) {
11738
+ updateMessage(messageId, content, metadata, options) {
11492
11739
  return __awaiter$9(this, void 0, void 0, function* () {
11493
11740
  return yield this.asyncTeeErrorToEventEmitter(() => __awaiter$9(this, void 0, void 0, function* () {
11494
- return yield this.handlers.onUpdateMessage(messageId, content, metadata);
11741
+ /* @conditional-compile-remove(file-sharing) */
11742
+ return yield this.handlers.onUpdateMessage(messageId, content, metadata, options);
11495
11743
  }));
11496
11744
  });
11497
11745
  }
@@ -12785,45 +13033,6 @@ const getCallCompositePage = (call, previousCall) => {
12785
13033
  // No call state - show starting page (configuration)
12786
13034
  return 'configuration';
12787
13035
  };
12788
- /**
12789
- * Return different conditions based on the current and previous state of recording and transcribing
12790
- *
12791
- * @param callRecordState - The current call record state: on, off, stopped
12792
- * @param callTranscribeState - The current call transcribe state: on, off, stopped
12793
- *
12794
- * @remarks - The stopped state means: previously on but currently off
12795
- *
12796
- * @private
12797
- */
12798
- const computeVariant = (callRecordState, callTranscribeState) => {
12799
- if (callRecordState === 'on' && callTranscribeState === 'on') {
12800
- return 'RECORDING_AND_TRANSCRIPTION_STARTED';
12801
- }
12802
- else if (callRecordState === 'on' && callTranscribeState === 'off') {
12803
- return 'RECORDING_STARTED';
12804
- }
12805
- else if (callRecordState === 'off' && callTranscribeState === 'on') {
12806
- return 'TRANSCRIPTION_STARTED';
12807
- }
12808
- else if (callRecordState === 'on' && callTranscribeState === 'stopped') {
12809
- return 'TRANSCRIPTION_STOPPED_STILL_RECORDING';
12810
- }
12811
- else if (callRecordState === 'stopped' && callTranscribeState === 'on') {
12812
- return 'RECORDING_STOPPED_STILL_TRANSCRIBING';
12813
- }
12814
- else if (callRecordState === 'off' && callTranscribeState === 'stopped') {
12815
- return 'TRANSCRIPTION_STOPPED';
12816
- }
12817
- else if (callRecordState === 'stopped' && callTranscribeState === 'off') {
12818
- return 'RECORDING_STOPPED';
12819
- }
12820
- else if (callRecordState === 'stopped' && callTranscribeState === 'stopped') {
12821
- return 'RECORDING_AND_TRANSCRIPTION_STOPPED';
12822
- }
12823
- else {
12824
- return 'NO_STATE';
12825
- }
12826
- };
12827
13036
 
12828
13037
  // Copyright (c) Microsoft Corporation.
12829
13038
  // Licensed under the MIT license.
@@ -13232,128 +13441,6 @@ const onFetchCustomButtonPropsTrampoline = (options) => {
13232
13441
  return response;
13233
13442
  };
13234
13443
 
13235
- // Copyright (c) Microsoft Corporation.
13236
- /**
13237
- * @private
13238
- */
13239
- const ComplianceBanner = (props) => {
13240
- function determineStates(previous, current) {
13241
- // if current state is on, then return on
13242
- if (current) {
13243
- return 'on';
13244
- }
13245
- // if current state is off
13246
- else {
13247
- // if previous state is on and current state is off, return stopped (on -> off)
13248
- if (previous === 'on') {
13249
- return 'stopped';
13250
- }
13251
- // otherwise remain previous state unchanged
13252
- else {
13253
- return previous;
13254
- }
13255
- }
13256
- }
13257
- //set variant when incoming state is different from current state
13258
- //when variant change, return message bar
13259
- //when message bar is dismissed,set variant to default nostate and if current state is stopped, set to off
13260
- const strings = useLocale().strings;
13261
- const [variant, setVariant] = React.useState('NO_STATE');
13262
- const cachedProps = React.useRef({
13263
- latestBooleanState: {
13264
- callTranscribeState: false,
13265
- callRecordState: false
13266
- },
13267
- latestStringState: {
13268
- callTranscribeState: 'off',
13269
- callRecordState: 'off'
13270
- }
13271
- });
13272
- // Only update cached props and variant if there is _some_ change in the latest props.
13273
- // This ensures that state machine is only updated if there is an actual change in the props.
13274
- if (props.callRecordState !== cachedProps.current.latestBooleanState.callRecordState ||
13275
- props.callTranscribeState !== cachedProps.current.latestBooleanState.callTranscribeState) {
13276
- cachedProps.current = {
13277
- latestBooleanState: props,
13278
- latestStringState: {
13279
- callRecordState: determineStates(cachedProps.current.latestStringState.callRecordState, props.callRecordState),
13280
- callTranscribeState: determineStates(cachedProps.current.latestStringState.callTranscribeState, props.callTranscribeState)
13281
- }
13282
- };
13283
- setVariant(computeVariant(cachedProps.current.latestStringState.callRecordState, cachedProps.current.latestStringState.callTranscribeState));
13284
- // when both states are stopped, after displaying message "RECORDING_AND_TRANSCRIPTION_STOPPED", change both states to off (going back to the default state)
13285
- if (cachedProps.current.latestStringState.callRecordState === 'stopped' &&
13286
- cachedProps.current.latestStringState.callTranscribeState === 'stopped') {
13287
- cachedProps.current.latestStringState.callRecordState = 'off';
13288
- cachedProps.current.latestStringState.callTranscribeState = 'off';
13289
- }
13290
- }
13291
- return variant === 'NO_STATE' ? (React__default['default'].createElement(React__default['default'].Fragment, null)) : (React__default['default'].createElement(react.MessageBar, { messageBarType: react.MessageBarType.warning, onDismiss: () => {
13292
- // when closing the banner, change variant to nostate and change stopped state to off state.
13293
- // Reason: on banner close, going back to the default state
13294
- setVariant('NO_STATE');
13295
- if (cachedProps.current.latestStringState.callRecordState === 'stopped') {
13296
- cachedProps.current.latestStringState.callRecordState = 'off';
13297
- }
13298
- if (cachedProps.current.latestStringState.callTranscribeState === 'stopped') {
13299
- cachedProps.current.latestStringState.callTranscribeState = 'off';
13300
- }
13301
- }, dismissButtonAriaLabel: strings.call.close },
13302
- React__default['default'].createElement(BannerMessage, { variant: variant, strings: strings })));
13303
- };
13304
- function BannerMessage(props) {
13305
- const { variant, strings } = props;
13306
- switch (variant) {
13307
- case 'TRANSCRIPTION_STOPPED_STILL_RECORDING':
13308
- return (React__default['default'].createElement(React__default['default'].Fragment, null,
13309
- React__default['default'].createElement("b", null, strings.call.complianceBannerTranscriptionStopped),
13310
- ` ${strings.call.complianceBannerNowOnlyRecording}`,
13311
- React__default['default'].createElement(PrivacyPolicy, { linkText: strings.call.privacyPolicy })));
13312
- case 'RECORDING_STOPPED_STILL_TRANSCRIBING':
13313
- return (React__default['default'].createElement(React__default['default'].Fragment, null,
13314
- React__default['default'].createElement("b", null, strings.call.complianceBannerRecordingStopped),
13315
- ` ${strings.call.complianceBannerNowOnlyTranscription}`,
13316
- React__default['default'].createElement(PrivacyPolicy, { linkText: strings.call.privacyPolicy })));
13317
- case 'RECORDING_AND_TRANSCRIPTION_STOPPED':
13318
- return (React__default['default'].createElement(React__default['default'].Fragment, null,
13319
- React__default['default'].createElement("b", null, strings.call.complianceBannerRecordingAndTranscriptionSaved),
13320
- ` ${strings.call.complianceBannerRecordingAndTranscriptionStopped}`,
13321
- React__default['default'].createElement(LearnMore, { linkText: strings.call.learnMore })));
13322
- case 'RECORDING_AND_TRANSCRIPTION_STARTED':
13323
- return (React__default['default'].createElement(React__default['default'].Fragment, null,
13324
- React__default['default'].createElement("b", null, strings.call.complianceBannerRecordingAndTranscriptionStarted),
13325
- ` ${strings.call.complianceBannerTranscriptionConsent}`,
13326
- React__default['default'].createElement(PrivacyPolicy, { linkText: strings.call.privacyPolicy })));
13327
- case 'TRANSCRIPTION_STARTED':
13328
- return (React__default['default'].createElement(React__default['default'].Fragment, null,
13329
- React__default['default'].createElement("b", null, strings.call.complianceBannerTranscriptionStarted),
13330
- ` ${strings.call.complianceBannerTranscriptionConsent}`,
13331
- React__default['default'].createElement(PrivacyPolicy, { linkText: strings.call.privacyPolicy })));
13332
- case 'RECORDING_STOPPED':
13333
- return (React__default['default'].createElement(React__default['default'].Fragment, null,
13334
- React__default['default'].createElement("b", null, strings.call.complianceBannerRecordingSaving),
13335
- ` ${strings.call.complianceBannerRecordingStopped}`,
13336
- React__default['default'].createElement(LearnMore, { linkText: strings.call.learnMore })));
13337
- case 'RECORDING_STARTED':
13338
- return (React__default['default'].createElement(React__default['default'].Fragment, null,
13339
- React__default['default'].createElement("b", null, strings.call.complianceBannerRecordingStarted),
13340
- ` ${strings.call.complianceBannerTranscriptionConsent}`,
13341
- React__default['default'].createElement(PrivacyPolicy, { linkText: strings.call.privacyPolicy })));
13342
- case 'TRANSCRIPTION_STOPPED':
13343
- return (React__default['default'].createElement(React__default['default'].Fragment, null,
13344
- React__default['default'].createElement("b", null, strings.call.complianceBannerTranscriptionSaving),
13345
- ` ${strings.call.complianceBannerTranscriptionStopped}`,
13346
- React__default['default'].createElement(LearnMore, { linkText: strings.call.learnMore })));
13347
- }
13348
- return React__default['default'].createElement(React__default['default'].Fragment, null);
13349
- }
13350
- function PrivacyPolicy(props) {
13351
- return (React__default['default'].createElement(react.Link, { href: "https://privacy.microsoft.com/privacystatement#mainnoticetoendusersmodule", target: "_blank", underline: true }, props.linkText));
13352
- }
13353
- function LearnMore(props) {
13354
- return (React__default['default'].createElement(react.Link, { href: "https://support.microsoft.com/office/record-a-meeting-in-teams-34dfbe7f-b07d-4a27-b4c6-de62f1348c24", target: "_blank", underline: true }, props.linkText));
13355
- }
13356
-
13357
13444
  // Copyright (c) Microsoft Corporation.
13358
13445
  // Licensed under the MIT license.
13359
13446
  /** @private */
@@ -13489,7 +13576,7 @@ const CallArrangement = (props) => {
13489
13576
  React__default['default'].createElement(react.Stack, { verticalFill: true, horizontalAlign: "stretch", className: containerClassName, "data-ui-id": props.dataUiId },
13490
13577
  React__default['default'].createElement(react.Stack.Item, { styles: notificationsContainerStyles },
13491
13578
  React__default['default'].createElement(react.Stack, { styles: bannerNotificationStyles },
13492
- React__default['default'].createElement(ComplianceBanner, Object.assign({}, props.complianceBannerProps))),
13579
+ React__default['default'].createElement(_ComplianceBanner, Object.assign({}, props.complianceBannerProps))),
13493
13580
  props.errorBarProps !== false && (React__default['default'].createElement(react.Stack, { styles: bannerNotificationStyles },
13494
13581
  React__default['default'].createElement(ErrorBar, Object.assign({}, props.errorBarProps)))),
13495
13582
  !!props.mutedNotificationProps && React__default['default'].createElement(MutedNotification, Object.assign({}, props.mutedNotificationProps))),
@@ -13817,9 +13904,10 @@ const CallPage = (props) => {
13817
13904
  const errorBarProps = usePropsFor$1(ErrorBar);
13818
13905
  const mutedNotificationProps = useSelector$1(mutedNotificationSelector);
13819
13906
  const networkReconnectTileProps = useSelector$1(networkReconnectTileSelector);
13907
+ const strings = useLocale().strings.call;
13820
13908
  // Reduce the controls shown when mobile view is enabled.
13821
13909
  const callControlOptions = mobileView ? reduceCallControlsForMobile(options === null || options === void 0 ? void 0 : options.callControls) : options === null || options === void 0 ? void 0 : options.callControls;
13822
- return (React__default['default'].createElement(CallArrangement, { complianceBannerProps: Object.assign({}, complianceBannerProps), errorBarProps: (options === null || options === void 0 ? void 0 : options.errorBar) !== false && Object.assign({}, errorBarProps), mutedNotificationProps: mutedNotificationProps, callControlProps: {
13910
+ return (React__default['default'].createElement(CallArrangement, { complianceBannerProps: Object.assign(Object.assign({}, complianceBannerProps), { strings }), errorBarProps: (options === null || options === void 0 ? void 0 : options.errorBar) !== false && Object.assign({}, errorBarProps), mutedNotificationProps: mutedNotificationProps, callControlProps: {
13823
13911
  callInvitationURL: callInvitationURL,
13824
13912
  onFetchParticipantMenuItems: onFetchParticipantMenuItems,
13825
13913
  options: callControlOptions,
@@ -14373,7 +14461,7 @@ const LobbyPage = (props) => {
14373
14461
  ? reduceCallControlsForMobile((_a = props.options) === null || _a === void 0 ? void 0 : _a.callControls)
14374
14462
  : (_b = props.options) === null || _b === void 0 ? void 0 : _b.callControls;
14375
14463
  callControlOptions = disableLobbyPageControls(callControlOptions);
14376
- return (React__default['default'].createElement(CallArrangement, { complianceBannerProps: {}, errorBarProps: ((_c = props.options) === null || _c === void 0 ? void 0 : _c.errorBar) !== false && Object.assign({}, errorBarProps), callControlProps: {
14464
+ return (React__default['default'].createElement(CallArrangement, { complianceBannerProps: { strings }, errorBarProps: ((_c = props.options) === null || _c === void 0 ? void 0 : _c.errorBar) !== false && Object.assign({}, errorBarProps), callControlProps: {
14377
14465
  options: callControlOptions,
14378
14466
  increaseFlyoutItemSize: props.mobileView
14379
14467
  }, mobileView: props.mobileView, onRenderGalleryContent: () => React__default['default'].createElement(LobbyTile, Object.assign({}, lobbyProps, { overlayProps: overlayProps(strings, inLobby) })), dataUiId: 'lobby-page' }));