@azure/communication-react 1.10.1-alpha-202311230013 → 1.10.1-alpha-202311250012

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 (90) hide show
  1. package/dist/communication-react.d.ts +17 -14
  2. package/dist/dist-cjs/communication-react/index.js +1215 -1042
  3. package/dist/dist-cjs/communication-react/index.js.map +1 -1
  4. package/dist/dist-esm/acs-ui-common/src/index.d.ts +1 -0
  5. package/dist/dist-esm/acs-ui-common/src/index.js.map +1 -1
  6. package/dist/dist-esm/acs-ui-common/src/telemetry.d.ts +7 -1
  7. package/dist/dist-esm/acs-ui-common/src/telemetry.js +24 -2
  8. package/dist/dist-esm/acs-ui-common/src/telemetry.js.map +1 -1
  9. package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js +1 -1
  10. package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js.map +1 -1
  11. package/dist/dist-esm/calling-stateful-client/src/StatefulCallClient.d.ts +7 -0
  12. package/dist/dist-esm/calling-stateful-client/src/StatefulCallClient.js +12 -4
  13. package/dist/dist-esm/calling-stateful-client/src/StatefulCallClient.js.map +1 -1
  14. package/dist/dist-esm/calling-stateful-client/src/index.d.ts +1 -0
  15. package/dist/dist-esm/calling-stateful-client/src/index.js +1 -0
  16. package/dist/dist-esm/calling-stateful-client/src/index.js.map +1 -1
  17. package/dist/dist-esm/chat-stateful-client/src/StatefulChatClient.d.ts +7 -0
  18. package/dist/dist-esm/chat-stateful-client/src/StatefulChatClient.js +10 -2
  19. package/dist/dist-esm/chat-stateful-client/src/StatefulChatClient.js.map +1 -1
  20. package/dist/dist-esm/chat-stateful-client/src/index.d.ts +1 -1
  21. package/dist/dist-esm/chat-stateful-client/src/index.js +1 -1
  22. package/dist/dist-esm/chat-stateful-client/src/index.js.map +1 -1
  23. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponent.js +2 -2
  24. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponent.js.map +1 -1
  25. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentAsMessageBubble.js +1 -1
  26. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentAsMessageBubble.js.map +1 -1
  27. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentWrapper.d.ts +46 -0
  28. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentWrapper.js +53 -0
  29. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentWrapper.js.map +1 -0
  30. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageContent.d.ts +1 -1
  31. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageContent.js +16 -10
  32. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageContent.js.map +1 -1
  33. package/dist/dist-esm/react-components/src/components/ChatMessage/DefaultSystemMessage.d.ts +6 -0
  34. package/dist/dist-esm/react-components/src/components/ChatMessage/DefaultSystemMessage.js +38 -0
  35. package/dist/dist-esm/react-components/src/components/ChatMessage/DefaultSystemMessage.js.map +1 -0
  36. package/dist/dist-esm/react-components/src/components/ChatMessage/FluentChatMessageComponentWrapper.d.ts +23 -0
  37. package/dist/dist-esm/react-components/src/components/ChatMessage/FluentChatMessageComponentWrapper.js +183 -0
  38. package/dist/dist-esm/react-components/src/components/ChatMessage/FluentChatMessageComponentWrapper.js.map +1 -0
  39. package/dist/dist-esm/react-components/src/components/MessageThread.d.ts +5 -7
  40. package/dist/dist-esm/react-components/src/components/MessageThread.js +92 -247
  41. package/dist/dist-esm/react-components/src/components/MessageThread.js.map +1 -1
  42. package/dist/dist-esm/react-components/src/components/VideoGallery/DefaultLayout.js +1 -3
  43. package/dist/dist-esm/react-components/src/components/VideoGallery/DefaultLayout.js.map +1 -1
  44. package/dist/dist-esm/react-components/src/components/VideoGallery/FloatingLocalVideoLayout.js +3 -2
  45. package/dist/dist-esm/react-components/src/components/VideoGallery/FloatingLocalVideoLayout.js.map +1 -1
  46. package/dist/dist-esm/react-components/src/components/VideoGallery/OverflowGallery.d.ts +0 -2
  47. package/dist/dist-esm/react-components/src/components/VideoGallery/OverflowGallery.js +5 -4
  48. package/dist/dist-esm/react-components/src/components/VideoGallery/OverflowGallery.js.map +1 -1
  49. package/dist/dist-esm/react-components/src/components/VideoGallery/SpeakerVideoLayout.js +3 -2
  50. package/dist/dist-esm/react-components/src/components/VideoGallery/SpeakerVideoLayout.js.map +1 -1
  51. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.d.ts +19 -7
  52. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.js +38 -10
  53. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.js.map +1 -1
  54. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/CallAdapter.d.ts +14 -5
  55. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/CallAdapter.js.map +1 -1
  56. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/CallingSoundSubscriber.d.ts +3 -3
  57. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/CallingSoundSubscriber.js +10 -13
  58. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/CallingSoundSubscriber.js.map +1 -1
  59. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/index.d.ts +1 -1
  60. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/index.js +1 -1
  61. package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/index.js.map +1 -1
  62. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/SidePane/SidePane.js +1 -1
  63. package/dist/dist-esm/react-composites/src/composites/CallComposite/components/SidePane/SidePane.js.map +1 -1
  64. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/LocalVideoTileSelector.d.ts +1 -0
  65. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/activeVideoBackgroundEffectSelector.d.ts +1 -0
  66. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/callStatusSelector.d.ts +1 -0
  67. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/capabilitiesChangedInfoAndRoleSelector.d.ts +1 -0
  68. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/complianceBannerSelector.d.ts +1 -0
  69. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/deviceCountSelector.d.ts +1 -0
  70. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/devicePermissionSelector.d.ts +1 -0
  71. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/dominantRemoteParticipantSelector.d.ts +1 -0
  72. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/lobbySelector.d.ts +1 -0
  73. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/localAndRemotePIPSelector.d.ts +1 -0
  74. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/localPreviewSelector.d.ts +1 -0
  75. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/localVideoStreamSelector.d.ts +1 -0
  76. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/mediaGallerySelector.d.ts +2 -0
  77. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/mutedNotificationSelector.d.ts +1 -0
  78. package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/networkReconnectTileSelector.d.ts +1 -0
  79. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/CallWithChatComposite.js +6 -8
  80. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/CallWithChatComposite.js.map +1 -1
  81. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/AzureCommunicationCallWithChatAdapter.js +6 -11
  82. package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/AzureCommunicationCallWithChatAdapter.js.map +1 -1
  83. package/dist/dist-esm/react-composites/src/composites/ChatComposite/ChatComposite.js +3 -13
  84. package/dist/dist-esm/react-composites/src/composites/ChatComposite/ChatComposite.js.map +1 -1
  85. package/dist/dist-esm/react-composites/src/composites/ChatComposite/ChatScreen.js +10 -4
  86. package/dist/dist-esm/react-composites/src/composites/ChatComposite/ChatScreen.js.map +1 -1
  87. package/dist/dist-esm/react-composites/src/composites/ChatComposite/adapter/AzureCommunicationChatAdapter.d.ts +7 -0
  88. package/dist/dist-esm/react-composites/src/composites/ChatComposite/adapter/AzureCommunicationChatAdapter.js +13 -5
  89. package/dist/dist-esm/react-composites/src/composites/ChatComposite/adapter/AzureCommunicationChatAdapter.js.map +1 -1
  90. package/package.json +1 -1
@@ -10,15 +10,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  });
11
11
  };
12
12
  import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
13
- import { Icon, mergeStyles, PrimaryButton, Persona, PersonaSize } from '@fluentui/react';
14
- import { Chat, ChatMessage as FluentChatMessage, ChatMyMessage as FluentChatMyMessage } from '@fluentui-contrib/react-chat';
13
+ import { Icon, mergeStyles, PrimaryButton } from '@fluentui/react';
14
+ import { Chat } from '@fluentui-contrib/react-chat';
15
15
  import { mergeClasses } from '@fluentui/react-components';
16
- import { DownIconStyle, newMessageButtonContainerStyle, messageThreadContainerStyle, messageThreadWrapperContainerStyle, useChatStyles, buttonWithIconStyles, newMessageButtonStyle, noMessageStatusStyle, useChatMessageRenderStyles, gutterWithAvatar, gutterWithHiddenAvatar } from './styles/MessageThread.styles';
16
+ import { DownIconStyle, newMessageButtonContainerStyle, messageThreadContainerStyle, messageThreadWrapperContainerStyle, useChatStyles, buttonWithIconStyles, newMessageButtonStyle } from './styles/MessageThread.styles';
17
17
  import { delay } from './utils/delay';
18
18
  import { MessageStatusIndicator } from './MessageStatusIndicator';
19
19
  import { memoizeFnAll } from "../../../acs-ui-common/src";
20
- import { SystemMessage as SystemMessageComponent } from './SystemMessage';
21
- import { ChatMessageComponent } from './ChatMessage/ChatMessageComponent';
22
20
  import { useLocale } from '../localization/LocalizationProvider';
23
21
  import { isNarrowWidth, _useContainerWidth } from './utils/responsive';
24
22
  import getParticipantsWhoHaveReadMessage from './utils/getParticipantsWhoHaveReadMessage';
@@ -28,6 +26,7 @@ import LiveAnnouncer from './Announcer/LiveAnnouncer';
28
26
  /* @conditional-compile-remove(file-sharing) */ /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */
29
27
  import { initializeFileTypeIcons } from '@fluentui/react-file-type-icons';
30
28
  import { createStyleFromV8Style } from './styles/v8StyleShim';
29
+ import { ChatMessageComponentWrapper } from './ChatMessage/ChatMessageComponentWrapper';
31
30
  const isMessageSame = (first, second) => {
32
31
  return (first.messageId === second.messageId &&
33
32
  first.content === second.content &&
@@ -85,38 +84,37 @@ const DefaultJumpToNewMessageButton = (props) => {
85
84
  const { text, onClick } = props;
86
85
  return (React.createElement(PrimaryButton, { className: newMessageButtonStyle, styles: buttonWithIconStyles, text: text, onClick: onClick, onRenderIcon: () => React.createElement(Icon, { iconName: "Down", className: DownIconStyle }) }));
87
86
  };
88
- const generateParticipantsStr = (participants, defaultName) => participants
89
- .map((participant) => `${!participant.displayName || participant.displayName === '' ? defaultName : participant.displayName}`)
90
- .join(', ');
91
- const ParticipantSystemMessageComponent = ({ message, style, defaultName }) => {
92
- const { strings } = useLocale();
93
- const participantsStr = generateParticipantsStr(message.participants, defaultName);
94
- const messageSuffix = message.systemMessageType === 'participantAdded'
95
- ? strings.messageThread.participantJoined
96
- : strings.messageThread.participantLeft;
97
- if (participantsStr !== '') {
98
- return (React.createElement(SystemMessageComponent, { iconName: (message.iconName ? message.iconName : ''), content: `${participantsStr} ${messageSuffix}`, containerStyle: style }));
99
- }
100
- return React.createElement(React.Fragment, null);
101
- };
102
- const DefaultSystemMessage = (props) => {
103
- var _a;
104
- const message = props.message;
105
- switch (message.messageType) {
106
- case 'system':
107
- switch (message.systemMessageType) {
108
- case 'content':
109
- return (React.createElement(SystemMessageComponent, { iconName: (message.iconName ? message.iconName : ''), content: (_a = message.content) !== null && _a !== void 0 ? _a : '', containerStyle: props === null || props === void 0 ? void 0 : props.messageContainerStyle }));
110
- case 'participantAdded':
111
- case 'participantRemoved':
112
- return (React.createElement(ParticipantSystemMessageComponent, { message: message, style: props.messageContainerStyle, defaultName: props.strings.noDisplayNameSub }));
87
+ const memoizeAllMessages = memoizeFnAll((message, showMessageDate, showMessageStatus, strings, index, onUpdateMessage, onCancelEditMessage, onDeleteMessage, onSendMessage, disableEditing, lastSeenChatMessage, lastSendingChatMessage, lastDeliveredChatMessage) => {
88
+ let key = message.messageId;
89
+ let statusToRender = undefined;
90
+ if (message.messageType === 'chat' ||
91
+ /* @conditional-compile-remove(data-loss-prevention) */ message.messageType === 'blocked') {
92
+ if ((!message.messageId || message.messageId === '') && 'clientMessageId' in message) {
93
+ key = message.clientMessageId;
94
+ }
95
+ if (showMessageStatus && message.mine) {
96
+ switch (message.messageId) {
97
+ case lastSeenChatMessage: {
98
+ statusToRender = 'seen';
99
+ break;
100
+ }
101
+ case lastSendingChatMessage: {
102
+ statusToRender = 'sending';
103
+ break;
104
+ }
105
+ case lastDeliveredChatMessage: {
106
+ statusToRender = 'delivered';
107
+ break;
108
+ }
113
109
  }
110
+ }
111
+ if (message.mine && message.status === 'failed') {
112
+ statusToRender = 'failed';
113
+ }
114
114
  }
115
- return React.createElement(React.Fragment, null);
116
- };
117
- const memoizeAllMessages = memoizeFnAll((_messageKey, message, showMessageDate, showMessageStatus, onRenderAvatar, shouldOverlapAvatarAndMessage, styles, onRenderMessageStatus, defaultStatusRenderer, defaultChatMessageRenderer, strings, theme, chatMessageRenderStyles, _attached, statusToRender, participantCount, readCount, onRenderMessage, onUpdateMessage, onCancelEditMessage, onDeleteMessage, onSendMessage, disableEditing) => {
118
- var _a, _b;
119
- const messageProps = {
115
+ return {
116
+ key: key !== null && key !== void 0 ? key : 'id_' + index,
117
+ statusToRender,
120
118
  message,
121
119
  strings,
122
120
  showDate: showMessageDate,
@@ -124,92 +122,9 @@ const memoizeAllMessages = memoizeFnAll((_messageKey, message, showMessageDate,
124
122
  onCancelEditMessage,
125
123
  onDeleteMessage,
126
124
  onSendMessage,
127
- disableEditing
125
+ disableEditing,
126
+ showMessageStatus
128
127
  };
129
- const chatMessage = (message, messageProps) => {
130
- var _a;
131
- const messageStatusRenderer = showMessageStatus && statusToRender
132
- ? onRenderMessageStatus
133
- ? (status) => onRenderMessageStatus({ status })
134
- : (status) => defaultStatusRenderer(message, status, participantCount !== null && participantCount !== void 0 ? participantCount : 0, readCount !== null && readCount !== void 0 ? readCount : 0)
135
- : () => React.createElement("div", { className: mergeStyles(noMessageStatusStyle) });
136
- let chatMessageComponent;
137
- const shouldShowAvatar = message.attached === 'top' || message.attached === false;
138
- const attached = shouldShowAvatar ? 'top' : 'center';
139
- if (message.mine === true) {
140
- chatMessageComponent = (React.createElement(FluentChatMyMessage, { attached: attached, root: {
141
- // myChatItemMessageContainer used in className and style prop as style prop can't handle CSS selectors
142
- className: mergeClasses(chatMessageRenderStyles.rootMyMessage, chatMessageRenderStyles.rootCommon, mergeStyles(styles === null || styles === void 0 ? void 0 : styles.myChatItemMessageContainer)),
143
- style: (styles === null || styles === void 0 ? void 0 : styles.myChatItemMessageContainer) !== undefined
144
- ? createStyleFromV8Style(styles === null || styles === void 0 ? void 0 : styles.myChatItemMessageContainer)
145
- : {},
146
- role: 'none'
147
- }, body: {
148
- className: mergeClasses(chatMessageRenderStyles.bodyCommon, chatMessageRenderStyles.bodyMyMessage),
149
- // make body not focusable to remove repetitions from narrators.
150
- // inner components are already focusable
151
- tabIndex: -1,
152
- role: 'none'
153
- }, statusIcon: React.createElement("div", { className: mergeStyles({ paddingLeft: '0.25rem' }, (styles === null || styles === void 0 ? void 0 : styles.messageStatusContainer) ? styles.messageStatusContainer((_a = message.mine) !== null && _a !== void 0 ? _a : false) : '') }, message.status ? messageStatusRenderer(message.status) : undefined) }, onRenderMessage === undefined
154
- ? defaultChatMessageRenderer(Object.assign(Object.assign({}, messageProps), { messageStatusRenderer }))
155
- : onRenderMessage(messageProps, defaultChatMessageRenderer)));
156
- }
157
- else {
158
- const chatAvatarStyle = shouldShowAvatar ? gutterWithAvatar : gutterWithHiddenAvatar;
159
- const personaOptions = {
160
- hidePersonaDetails: true,
161
- size: PersonaSize.size32,
162
- text: message.senderDisplayName,
163
- showOverflowTooltip: false
164
- };
165
- chatMessageComponent = (React.createElement(FluentChatMessage, { attached: attached, root: { className: mergeClasses(chatMessageRenderStyles.rootMessage, chatMessageRenderStyles.rootCommon) }, body: {
166
- // chatItemMessageContainer used in className and style prop as style prop can't handle CSS selectors
167
- className: mergeClasses(chatMessageRenderStyles.bodyCommon, !shouldShowAvatar ? chatMessageRenderStyles.bodyWithoutAvatar : chatMessageRenderStyles.bodyWithAvatar, shouldOverlapAvatarAndMessage
168
- ? chatMessageRenderStyles.avatarOverlap
169
- : chatMessageRenderStyles.avatarNoOverlap, mergeStyles(styles === null || styles === void 0 ? void 0 : styles.chatItemMessageContainer)),
170
- style: (styles === null || styles === void 0 ? void 0 : styles.chatItemMessageContainer) !== undefined
171
- ? createStyleFromV8Style(styles === null || styles === void 0 ? void 0 : styles.chatItemMessageContainer)
172
- : {},
173
- // make body not focusable to remove repetitions from narrators.
174
- // inner components are already focusable
175
- tabIndex: -1,
176
- role: 'none'
177
- }, avatar: React.createElement("div", { className: mergeStyles(chatAvatarStyle) }, onRenderAvatar ? onRenderAvatar === null || onRenderAvatar === void 0 ? void 0 : onRenderAvatar(message.senderId, personaOptions) : React.createElement(Persona, Object.assign({}, personaOptions))) }, onRenderMessage === undefined
178
- ? defaultChatMessageRenderer(Object.assign(Object.assign({}, messageProps), { messageStatusRenderer }))
179
- : onRenderMessage(messageProps, defaultChatMessageRenderer)));
180
- }
181
- return React.createElement("div", { key: _messageKey }, chatMessageComponent);
182
- };
183
- /* @conditional-compile-remove(data-loss-prevention) */
184
- // Similar logic as switch statement case 'chat', if statement for conditional compile (merge logic to switch case when stabilize)
185
- if (message.messageType === 'blocked') {
186
- const myChatMessageStyle = message.status === 'failed'
187
- ? (_a = styles === null || styles === void 0 ? void 0 : styles.failedMyChatMessageContainer) !== null && _a !== void 0 ? _a : styles === null || styles === void 0 ? void 0 : styles.myChatMessageContainer
188
- : styles === null || styles === void 0 ? void 0 : styles.myChatMessageContainer;
189
- const blockedMessageStyle = styles === null || styles === void 0 ? void 0 : styles.blockedMessageContainer;
190
- messageProps.messageContainerStyle = message.mine ? myChatMessageStyle : blockedMessageStyle;
191
- return chatMessage(message, messageProps);
192
- }
193
- switch (message.messageType) {
194
- case 'chat': {
195
- const myChatMessageStyle = message.status === 'failed'
196
- ? (_b = styles === null || styles === void 0 ? void 0 : styles.failedMyChatMessageContainer) !== null && _b !== void 0 ? _b : styles === null || styles === void 0 ? void 0 : styles.myChatMessageContainer
197
- : styles === null || styles === void 0 ? void 0 : styles.myChatMessageContainer;
198
- const chatMessageStyle = styles === null || styles === void 0 ? void 0 : styles.chatMessageContainer;
199
- messageProps.messageContainerStyle = message.mine ? myChatMessageStyle : chatMessageStyle;
200
- return chatMessage(message, messageProps);
201
- }
202
- case 'system': {
203
- messageProps.messageContainerStyle = styles === null || styles === void 0 ? void 0 : styles.systemMessageContainer;
204
- const systemMessageComponent = onRenderMessage === undefined ? (React.createElement(DefaultSystemMessage, Object.assign({}, messageProps))) : (onRenderMessage(messageProps, (props) => React.createElement(DefaultSystemMessage, Object.assign({}, props))));
205
- return (React.createElement("div", { key: _messageKey, style: { paddingTop: '0.5rem' } }, systemMessageComponent));
206
- }
207
- default: {
208
- // We do not handle custom type message by default, users can handle custom type by using onRenderMessage function.
209
- const customMessageComponent = onRenderMessage === undefined ? React.createElement(React.Fragment, null) : onRenderMessage(messageProps);
210
- return (React.createElement("div", { key: _messageKey, style: { paddingTop: '1rem', paddingBottom: '0.25rem' } }, customMessageComponent));
211
- }
212
- }
213
128
  });
214
129
  const getLastChatMessageIdWithStatus = (messages, status) => {
215
130
  for (let i = messages.length - 1; i >= 0; i--) {
@@ -253,9 +168,9 @@ export const MessageThreadWrapper = (props) => {
253
168
  /* @conditional-compile-remove(mention) */
254
169
  mentionOptions,
255
170
  /* @conditional-compile-remove(image-gallery) */
256
- onInlineImageClicked } = props;
257
- const onRenderFileDownloads = onRenderFileDownloadsTrampoline(props);
258
- const [messages, setMessages] = useState([]);
171
+ onInlineImageClicked,
172
+ /* @conditional-compile-remove(file-sharing) */
173
+ onRenderFileDownloads } = props;
259
174
  // We need this state to wait for one tick and scroll to bottom after messages have been initialized.
260
175
  // Otherwise chatScrollDivRef.current.clientHeight is wrong if we scroll to bottom before messages are initialized.
261
176
  const [chatMessagesInitialized, setChatMessagesInitialized] = useState(false);
@@ -274,19 +189,24 @@ export const MessageThreadWrapper = (props) => {
274
189
  const [inlineAttachments, setInlineAttachments] = useState({});
275
190
  /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */
276
191
  const onFetchInlineAttachment = useCallback((attachments, messageId) => __awaiter(void 0, void 0, void 0, function* () {
277
- if (!onFetchAttachments) {
192
+ if (!onFetchAttachments || attachments.length === 0) {
278
193
  return;
279
194
  }
280
195
  const attachmentDownloadResult = yield onFetchAttachments(attachments);
281
- const listOfAttachments = inlineAttachments[messageId];
282
- for (const result of attachmentDownloadResult) {
283
- const { attachmentId, blobUrl } = result;
284
- listOfAttachments[attachmentId] = blobUrl;
285
- }
286
- if (Object.keys(listOfAttachments).length > 0) {
287
- setInlineAttachments((prev) => (Object.assign(Object.assign({}, prev), { [messageId]: listOfAttachments })));
196
+ if (attachmentDownloadResult.length > 0) {
197
+ setInlineAttachments((prev) => {
198
+ var _a;
199
+ // The new state should always be based on the previous one
200
+ // otherwise there can be issues with renders
201
+ const listOfAttachments = (_a = prev[messageId]) !== null && _a !== void 0 ? _a : {};
202
+ for (const result of attachmentDownloadResult) {
203
+ const { attachmentId, blobUrl } = result;
204
+ listOfAttachments[attachmentId] = blobUrl;
205
+ }
206
+ return Object.assign(Object.assign({}, prev), { [messageId]: listOfAttachments });
207
+ });
288
208
  }
289
- }), [inlineAttachments, onFetchAttachments]);
209
+ }), [onFetchAttachments]);
290
210
  const isAllChatMessagesLoadedRef = useRef(false);
291
211
  // isAllChatMessagesLoadedRef needs to be updated every time when a new adapter is set in order to display correct data
292
212
  // onLoadPreviousChatMessages is updated when a new adapter is set
@@ -304,10 +224,12 @@ export const MessageThreadWrapper = (props) => {
304
224
  const messageIdSeenByMeRef = useRef('');
305
225
  const chatScrollDivRef = useRef(null);
306
226
  const isLoadingChatMessagesRef = useRef(false);
227
+ const messages = useMemo(() => {
228
+ return newMessages;
229
+ }, [newMessages]);
307
230
  const messagesRef = useRef(messages);
308
231
  const setMessagesRef = (messagesWithAttachedValue) => {
309
232
  messagesRef.current = messagesWithAttachedValue;
310
- setMessages(messagesWithAttachedValue);
311
233
  };
312
234
  const isAtBottomOfScrollRef = useRef(isAtBottomOfScroll);
313
235
  const setIsAtBottomOfScrollRef = (isAtBottomOfScrollValue) => {
@@ -493,52 +415,7 @@ export const MessageThreadWrapper = (props) => {
493
415
  }, []);
494
416
  const localeStrings = useLocale().strings.messageThread;
495
417
  const strings = useMemo(() => (Object.assign(Object.assign({}, localeStrings), props.strings)), [localeStrings, props.strings]);
496
- // To rerender the defaultChatMessageRenderer if app running across days(every new day chat time stamp need to be regenerated)
497
- const defaultChatMessageRenderer = useCallback((messageProps) => {
498
- var _a;
499
- /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */
500
- if (inlineAttachments[messageProps.message.messageId] === undefined) {
501
- setInlineAttachments((prev) => (Object.assign(Object.assign({}, prev), { [messageProps.message.messageId]: {} })));
502
- }
503
- if (messageProps.message.messageType === 'chat' ||
504
- /* @conditional-compile-remove(data-loss-prevention) */ messageProps.message.messageType === 'blocked') {
505
- return (React.createElement(ChatMessageComponent, Object.assign({}, messageProps, { onRenderFileDownloads: onRenderFileDownloads,
506
- /* @conditional-compile-remove(file-sharing) */
507
- strings: strings, message: messageProps.message, userId: props.userId, remoteParticipantsCount: participantCount ? participantCount - 1 : 0, shouldOverlapAvatarAndMessage: isNarrow, onRenderAvatar: onRenderAvatar, showMessageStatus: showMessageStatus, messageStatus: messageProps.message.status, onActionButtonClick: onActionButtonClickMemo,
508
- /* @conditional-compile-remove(date-time-customization) */
509
- onDisplayDateTimeString: onDisplayDateTimeString,
510
- /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */
511
- onFetchAttachments: onFetchInlineAttachment,
512
- /* @conditional-compile-remove(image-gallery) */
513
- onInlineImageClicked: onInlineImageClicked,
514
- /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */
515
- attachmentsMap: (_a = inlineAttachments[messageProps.message.messageId]) !== null && _a !== void 0 ? _a : {},
516
- /* @conditional-compile-remove(mention) */
517
- mentionOptions: mentionOptions })));
518
- }
519
- return React.createElement(React.Fragment, null);
520
- }, [
521
- onRenderFileDownloads,
522
- /* @conditional-compile-remove(file-sharing) */
523
- strings,
524
- props.userId,
525
- participantCount,
526
- isNarrow,
527
- onRenderAvatar,
528
- showMessageStatus,
529
- onActionButtonClickMemo,
530
- /* @conditional-compile-remove(date-time-customization) */
531
- onDisplayDateTimeString,
532
- /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */
533
- onFetchInlineAttachment,
534
- /* @conditional-compile-remove(image-gallery) */
535
- onInlineImageClicked,
536
- /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */
537
- inlineAttachments,
538
- /* @conditional-compile-remove(mention) */
539
- mentionOptions
540
- ]);
541
- const defaultStatusRenderer = useCallback((message, status, participantCount, readCount) => {
418
+ const defaultStatusRenderer = useCallback((message, participantCount, readCount, status) => {
542
419
  const onToggleToolTip = (isToggled) => {
543
420
  if (isToggled && readReceiptsBySenderIdRef.current) {
544
421
  setReadCountForHoveredIndicator(getParticipantsWhoHaveReadMessage(message, readReceiptsBySenderIdRef.current).length);
@@ -552,86 +429,54 @@ export const MessageThreadWrapper = (props) => {
552
429
  remoteParticipantsCount: participantCount ? participantCount - 1 : 0 }));
553
430
  }, []);
554
431
  const theme = useTheme();
555
- const chatMessageRenderStyles = useChatMessageRenderStyles();
556
- const messagesToDisplay = useMemo(() => memoizeAllMessages((memoizedMessageFn) => {
557
- return messages.map((message, index) => {
558
- let key = message.messageId;
559
- let statusToRender = undefined;
560
- if (message.messageType === 'chat' ||
561
- /* @conditional-compile-remove(data-loss-prevention) */ message.messageType === 'blocked') {
562
- if ((!message.messageId || message.messageId === '') && 'clientMessageId' in message) {
563
- key = message.clientMessageId;
564
- }
565
- if (showMessageStatus && message.mine) {
566
- switch (message.messageId) {
567
- case lastSeenChatMessage: {
568
- statusToRender = 'seen';
569
- break;
570
- }
571
- case lastSendingChatMessage: {
572
- statusToRender = 'sending';
573
- break;
574
- }
575
- case lastDeliveredChatMessage: {
576
- statusToRender = 'delivered';
577
- break;
578
- }
579
- }
580
- }
581
- if (message.mine && message.status === 'failed') {
582
- statusToRender = 'failed';
583
- }
584
- }
585
- return memoizedMessageFn(key !== null && key !== void 0 ? key : 'id_' + index, message, showMessageDate, showMessageStatus, onRenderAvatar, isNarrow, styles, onRenderMessageStatus, defaultStatusRenderer, defaultChatMessageRenderer, strings, theme, chatMessageRenderStyles,
586
- // Temporary solution to make sure we re-render if attach attribute is changed.
587
- // The proper fix should be in selector.
588
- message.messageType === 'chat' ||
589
- /* @conditional-compile-remove(data-loss-prevention) */ message.messageType === 'blocked'
590
- ? message.attached
591
- : undefined, statusToRender, participantCount, readCountForHoveredIndicator, onRenderMessage, onUpdateMessage, onCancelEditMessage, onDeleteMessage, onSendMessage, props.disableEditing);
432
+ const messagesToDisplay = useMemo(() => {
433
+ return memoizeAllMessages((memoizedMessageFn) => {
434
+ return messages.map((message, index) => {
435
+ return memoizedMessageFn(message, showMessageDate, showMessageStatus, strings, index, onUpdateMessage, onCancelEditMessage, onDeleteMessage, onSendMessage, props.disableEditing, lastDeliveredChatMessage, lastSeenChatMessage, lastSendingChatMessage);
436
+ });
592
437
  });
593
- }), [
438
+ }, [
439
+ lastDeliveredChatMessage,
440
+ lastSeenChatMessage,
441
+ lastSendingChatMessage,
594
442
  messages,
595
- showMessageDate,
596
- showMessageStatus,
597
- onRenderAvatar,
598
- isNarrow,
599
- styles,
600
- onRenderMessageStatus,
601
- defaultStatusRenderer,
602
- defaultChatMessageRenderer,
603
- strings,
604
- theme,
605
- chatMessageRenderStyles,
606
- participantCount,
607
- readCountForHoveredIndicator,
608
- onRenderMessage,
609
- onUpdateMessage,
610
443
  onCancelEditMessage,
611
444
  onDeleteMessage,
612
445
  onSendMessage,
446
+ onUpdateMessage,
613
447
  props.disableEditing,
614
- lastSeenChatMessage,
615
- lastSendingChatMessage,
616
- lastDeliveredChatMessage
448
+ showMessageDate,
449
+ showMessageStatus,
450
+ strings
617
451
  ]);
618
452
  const classes = useChatStyles();
619
- const chatBody = useMemo(() => {
620
- return (React.createElement(LiveAnnouncer, null,
453
+ return (React.createElement("div", { className: mergeStyles(messageThreadWrapperContainerStyle), ref: chatThreadRef },
454
+ existsNewChatMessage && !disableJumpToNewMessageButton && (React.createElement("div", { className: mergeStyles(newMessageButtonContainerStyle, styles === null || styles === void 0 ? void 0 : styles.newMessageButtonContainer) }, onRenderJumpToNewMessageButton ? (onRenderJumpToNewMessageButton({ text: strings.newMessagesIndicator, onClick: scrollToBottom })) : (React.createElement(DefaultJumpToNewMessageButton, { text: strings.newMessagesIndicator, onClick: scrollToBottom })))),
455
+ React.createElement(LiveAnnouncer, null,
621
456
  React.createElement(FluentV9ThemeProvider, { v8Theme: theme },
622
457
  React.createElement(Chat
623
458
  // styles?.chatContainer used in className and style prop as style prop can't handle CSS selectors
624
459
  , {
625
460
  // styles?.chatContainer used in className and style prop as style prop can't handle CSS selectors
626
- className: mergeClasses(classes.root, mergeStyles(styles === null || styles === void 0 ? void 0 : styles.chatContainer)), ref: chatScrollDivRef, style: Object.assign({}, createStyleFromV8Style(styles === null || styles === void 0 ? void 0 : styles.chatContainer)) }, messagesToDisplay))));
627
- }, [theme, classes.root, styles === null || styles === void 0 ? void 0 : styles.chatContainer, messagesToDisplay]);
628
- return (React.createElement("div", { className: mergeStyles(messageThreadWrapperContainerStyle), ref: chatThreadRef },
629
- existsNewChatMessage && !disableJumpToNewMessageButton && (React.createElement("div", { className: mergeStyles(newMessageButtonContainerStyle, styles === null || styles === void 0 ? void 0 : styles.newMessageButtonContainer) }, onRenderJumpToNewMessageButton ? (onRenderJumpToNewMessageButton({ text: strings.newMessagesIndicator, onClick: scrollToBottom })) : (React.createElement(DefaultJumpToNewMessageButton, { text: strings.newMessagesIndicator, onClick: scrollToBottom })))),
630
- chatBody));
631
- };
632
- const onRenderFileDownloadsTrampoline = (props) => {
633
- /* @conditional-compile-remove(file-sharing) */
634
- return props.onRenderFileDownloads;
635
- return undefined;
461
+ className: mergeClasses(classes.root, mergeStyles(styles === null || styles === void 0 ? void 0 : styles.chatContainer)), ref: chatScrollDivRef, style: Object.assign({}, createStyleFromV8Style(styles === null || styles === void 0 ? void 0 : styles.chatContainer)) }, messagesToDisplay.map((message) => {
462
+ return (React.createElement(MemoChatMessageComponentWrapper, Object.assign({}, message, { userId: userId, key: message.key, styles: styles, shouldOverlapAvatarAndMessage: isNarrow, strings: strings, onRenderAvatar: onRenderAvatar, onRenderMessage: onRenderMessage, onRenderMessageStatus: onRenderMessageStatus, defaultStatusRenderer: defaultStatusRenderer, onActionButtonClick: onActionButtonClickMemo, readCount: readCountForHoveredIndicator, participantCount: participantCount,
463
+ /* @conditional-compile-remove(file-sharing) */
464
+ fileDownloadHandler: props.fileDownloadHandler,
465
+ /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */
466
+ onFetchInlineAttachment: onFetchInlineAttachment,
467
+ /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */
468
+ inlineAttachments: inlineAttachments,
469
+ /* @conditional-compile-remove(image-gallery) */
470
+ onInlineImageClicked: onInlineImageClicked,
471
+ /* @conditional-compile-remove(date-time-customization) */
472
+ onDisplayDateTimeString: onDisplayDateTimeString,
473
+ /* @conditional-compile-remove(mention) */
474
+ mentionOptions: mentionOptions,
475
+ /* @conditional-compile-remove(file-sharing) */
476
+ onRenderFileDownloads: onRenderFileDownloads })));
477
+ }))))));
636
478
  };
479
+ const MemoChatMessageComponentWrapper = React.memo((obj) => {
480
+ return React.createElement(ChatMessageComponentWrapper, Object.assign({}, obj));
481
+ });
637
482
  //# sourceMappingURL=MessageThread.js.map