@azure/communication-react 1.8.1-alpha-202309300012 → 1.8.1-alpha-202310040013

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 (79) hide show
  1. package/dist/communication-react.d.ts +5 -6
  2. package/dist/dist-cjs/communication-react/index.js +883 -434
  3. package/dist/dist-cjs/communication-react/index.js.map +1 -1
  4. package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js +1 -1
  5. package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js.map +1 -1
  6. package/dist/dist-esm/react-components/src/components/CaptionsBanner.js +5 -7
  7. package/dist/dist-esm/react-components/src/components/CaptionsBanner.js.map +1 -1
  8. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageActionMenu.d.ts +2 -2
  9. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageActionMenu.js +5 -22
  10. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageActionMenu.js.map +1 -1
  11. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageActionsFlyout.js +2 -1
  12. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageActionsFlyout.js.map +1 -1
  13. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponent.d.ts +2 -3
  14. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponent.js +1 -1
  15. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponent.js.map +1 -1
  16. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentAsEditBox.d.ts +0 -5
  17. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentAsEditBox.js +17 -13
  18. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentAsEditBox.js.map +1 -1
  19. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentAsMessageBubble.d.ts +9 -0
  20. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentAsMessageBubble.js +79 -20
  21. package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentAsMessageBubble.js.map +1 -1
  22. package/dist/dist-esm/react-components/src/components/InputBoxComponent.js +9 -8
  23. package/dist/dist-esm/react-components/src/components/InputBoxComponent.js.map +1 -1
  24. package/dist/dist-esm/react-components/src/components/MessageThread.d.ts +15 -1
  25. package/dist/dist-esm/react-components/src/components/MessageThread.js +114 -93
  26. package/dist/dist-esm/react-components/src/components/MessageThread.js.map +1 -1
  27. package/dist/dist-esm/react-components/src/components/SystemMessage.js +1 -1
  28. package/dist/dist-esm/react-components/src/components/SystemMessage.js.map +1 -1
  29. package/dist/dist-esm/react-components/src/components/styles/Captions.style.d.ts +1 -1
  30. package/dist/dist-esm/react-components/src/components/styles/Captions.style.js +4 -4
  31. package/dist/dist-esm/react-components/src/components/styles/Captions.style.js.map +1 -1
  32. package/dist/dist-esm/react-components/src/components/styles/ChatMessageComponent.styles.d.ts +5 -7
  33. package/dist/dist-esm/react-components/src/components/styles/ChatMessageComponent.styles.js +24 -9
  34. package/dist/dist-esm/react-components/src/components/styles/ChatMessageComponent.styles.js.map +1 -1
  35. package/dist/dist-esm/react-components/src/components/styles/EditBox.styles.d.ts +3 -2
  36. package/dist/dist-esm/react-components/src/components/styles/EditBox.styles.js +10 -6
  37. package/dist/dist-esm/react-components/src/components/styles/EditBox.styles.js.map +1 -1
  38. package/dist/dist-esm/react-components/src/components/styles/InputBoxComponent.style.d.ts +4 -0
  39. package/dist/dist-esm/react-components/src/components/styles/InputBoxComponent.style.js +8 -2
  40. package/dist/dist-esm/react-components/src/components/styles/InputBoxComponent.style.js.map +1 -1
  41. package/dist/dist-esm/react-components/src/components/styles/MessageThread.styles.d.ts +10 -19
  42. package/dist/dist-esm/react-components/src/components/styles/MessageThread.styles.js +129 -119
  43. package/dist/dist-esm/react-components/src/components/styles/MessageThread.styles.js.map +1 -1
  44. package/dist/dist-esm/react-components/src/components/styles/SendBox.styles.d.ts +8 -0
  45. package/dist/dist-esm/react-components/src/components/styles/SendBox.styles.js +8 -2
  46. package/dist/dist-esm/react-components/src/components/styles/SendBox.styles.js.map +1 -1
  47. package/dist/dist-esm/react-components/src/components/styles/SystemMessage.styles.js +1 -1
  48. package/dist/dist-esm/react-components/src/components/styles/SystemMessage.styles.js.map +1 -1
  49. package/dist/dist-esm/react-components/src/components/styles/v8StyleShim.d.ts +12 -0
  50. package/dist/dist-esm/react-components/src/components/styles/v8StyleShim.js +37 -0
  51. package/dist/dist-esm/react-components/src/components/styles/v8StyleShim.js.map +1 -0
  52. package/dist/dist-esm/react-components/src/components/utils/Datetime.d.ts +7 -8
  53. package/dist/dist-esm/react-components/src/components/utils/Datetime.js +9 -31
  54. package/dist/dist-esm/react-components/src/components/utils/Datetime.js.map +1 -1
  55. package/dist/dist-esm/react-components/src/localization/locales/en-US/strings.json +1 -1
  56. package/dist/dist-esm/react-components/src/theming/FluentThemeProvider.d.ts +3 -4
  57. package/dist/dist-esm/react-components/src/theming/FluentThemeProvider.js +40 -52
  58. package/dist/dist-esm/react-components/src/theming/FluentThemeProvider.js.map +1 -1
  59. package/dist/dist-esm/react-components/src/theming/FluentV9ThemeProvider.d.ts +22 -0
  60. package/dist/dist-esm/react-components/src/theming/FluentV9ThemeProvider.js +29 -0
  61. package/dist/dist-esm/react-components/src/theming/FluentV9ThemeProvider.js.map +1 -0
  62. package/dist/dist-esm/react-components/src/theming/themeDuplicates.d.ts +29 -0
  63. package/dist/dist-esm/react-components/src/theming/themeDuplicates.js +121 -0
  64. package/dist/dist-esm/react-components/src/theming/themeDuplicates.js.map +1 -0
  65. package/dist/dist-esm/react-components/src/theming/v9ThemeShim.d.ts +12 -0
  66. package/dist/dist-esm/react-components/src/theming/v9ThemeShim.js +206 -0
  67. package/dist/dist-esm/react-components/src/theming/v9ThemeShim.js.map +1 -0
  68. package/dist/dist-esm/react-components/src/types/ChatMessage.d.ts +2 -2
  69. package/dist/dist-esm/react-components/src/types/ChatMessage.js.map +1 -1
  70. package/dist/dist-esm/react-composites/src/composites/common/ControlBar/DesktopMoreButton.js +30 -27
  71. package/dist/dist-esm/react-composites/src/composites/common/ControlBar/DesktopMoreButton.js.map +1 -1
  72. package/dist/dist-esm/react-composites/src/composites/common/Drawer/MoreDrawer.js +22 -17
  73. package/dist/dist-esm/react-composites/src/composites/common/Drawer/MoreDrawer.js.map +1 -1
  74. package/dist/dist-esm/react-composites/src/composites/common/icons.js +3 -3
  75. package/dist/dist-esm/react-composites/src/composites/common/icons.js.map +1 -1
  76. package/dist/dist-esm/react-composites/src/composites/localization/locales/en-US/strings.json +5 -5
  77. package/package.json +12 -11
  78. package/dist/dist-esm/northstar-wrapper/src/index.js +0 -2
  79. package/dist/dist-esm/northstar-wrapper/src/index.js.LICENSE.txt +0 -41
@@ -10,11 +10,10 @@ 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 { Chat, Flex, mergeStyles as mergeNorthstarThemes, Ref } from "../../../northstar-wrapper/src";
14
- import { DownIconStyle, newMessageButtonContainerStyle, messageThreadContainerStyle, chatStyle, buttonWithIconStyles, newMessageButtonStyle, messageStatusContainerStyle, noMessageStatusStyle, defaultChatItemMessageContainer, defaultMyChatMessageContainer, defaultChatMessageContainer, gutterWithAvatar, gutterWithHiddenAvatar, FailedMyChatMessageContainer } from './styles/MessageThread.styles';
15
- /* @conditional-compile-remove(data-loss-prevention) */
16
- import { defaultBlockedMessageStyleContainer } from './styles/MessageThread.styles';
17
- import { Icon, mergeStyles, Persona, PersonaSize, PrimaryButton, Stack } from '@fluentui/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';
15
+ import { mergeClasses } from '@fluentui/react-components';
16
+ import { DownIconStyle, newMessageButtonContainerStyle, messageThreadContainerStyle, messageThreadWrapperContainerStyle, useChatStyles, buttonWithIconStyles, newMessageButtonStyle, noMessageStatusStyle, useChatMessageRenderStyles, gutterWithAvatar, gutterWithHiddenAvatar } from './styles/MessageThread.styles';
18
17
  import { delay } from './utils/delay';
19
18
  import { MessageStatusIndicator } from './MessageStatusIndicator';
20
19
  import { memoizeFnAll } from "../../../acs-ui-common/src";
@@ -24,9 +23,11 @@ import { useLocale } from '../localization/LocalizationProvider';
24
23
  import { isNarrowWidth, _useContainerWidth } from './utils/responsive';
25
24
  import getParticipantsWhoHaveReadMessage from './utils/getParticipantsWhoHaveReadMessage';
26
25
  import { useTheme } from '../theming';
26
+ import { FluentV9ThemeProvider } from './../theming/FluentV9ThemeProvider';
27
27
  import LiveAnnouncer from './Announcer/LiveAnnouncer';
28
28
  /* @conditional-compile-remove(file-sharing) */ /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */
29
29
  import { initializeFileTypeIcons } from '@fluentui/react-file-type-icons';
30
+ import { createStyleFromV8Style } from './styles/v8StyleShim';
30
31
  const isMessageSame = (first, second) => {
31
32
  return (first.messageId === second.messageId &&
32
33
  first.content === second.content &&
@@ -113,8 +114,8 @@ const DefaultSystemMessage = (props) => {
113
114
  }
114
115
  return React.createElement(React.Fragment, null);
115
116
  };
116
- const memoizeAllMessages = memoizeFnAll((_messageKey, message, showMessageDate, showMessageStatus, onRenderAvatar, shouldOverlapAvatarAndMessage, styles, onRenderMessageStatus, defaultStatusRenderer, defaultChatMessageRenderer, strings, theme, _attached, statusToRender, participantCount, readCount, onRenderMessage, onUpdateMessage, onCancelEditMessage, onDeleteMessage, onSendMessage, disableEditing) => {
117
- var _a, _b, _c, _d, _e, _f, _g, _h;
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;
118
119
  const messageProps = {
119
120
  message,
120
121
  strings,
@@ -125,70 +126,88 @@ const memoizeAllMessages = memoizeFnAll((_messageKey, message, showMessageDate,
125
126
  onSendMessage,
126
127
  disableEditing
127
128
  };
128
- const chatMessageItemProps = (message, messageProps) => {
129
- var _a, _b, _c;
130
- const chatMessageComponent = onRenderMessage === undefined
131
- ? defaultChatMessageRenderer(messageProps)
132
- : onRenderMessage(messageProps, defaultChatMessageRenderer);
133
- const personaOptions = {
134
- hidePersonaDetails: true,
135
- size: PersonaSize.size32,
136
- text: message.senderDisplayName,
137
- showOverflowTooltip: false
138
- };
139
- const chatItemMessageStyle = (message.mine ? styles === null || styles === void 0 ? void 0 : styles.myChatItemMessageContainer : styles === null || styles === void 0 ? void 0 : styles.chatItemMessageContainer) ||
140
- defaultChatItemMessageContainer(shouldOverlapAvatarAndMessage);
141
- const chatGutterStyles = message.attached === 'top' || message.attached === false ? gutterWithAvatar : gutterWithHiddenAvatar;
142
- return {
143
- gutter: {
144
- styles: chatGutterStyles,
145
- content: message.mine ? ('') : onRenderAvatar ? (onRenderAvatar((_a = message.senderId) !== null && _a !== void 0 ? _a : '', personaOptions)) : (React.createElement(Persona, Object.assign({}, personaOptions)))
146
- },
147
- contentPosition: message.mine ? 'end' : 'start',
148
- message: {
149
- styles: chatItemMessageStyle,
150
- content: (React.createElement(Flex, { hAlign: message.mine ? 'end' : undefined, vAlign: "end" },
151
- chatMessageComponent,
152
- React.createElement("div", { className: mergeStyles(messageStatusContainerStyle((_b = message.mine) !== null && _b !== void 0 ? _b : false), (styles === null || styles === void 0 ? void 0 : styles.messageStatusContainer) ? styles.messageStatusContainer((_c = message.mine) !== null && _c !== void 0 ? _c : false) : '') }, showMessageStatus && statusToRender ? (onRenderMessageStatus ? (onRenderMessageStatus({ status: statusToRender })) : (defaultStatusRenderer(message, statusToRender, participantCount !== null && participantCount !== void 0 ? participantCount : 0, readCount !== null && readCount !== void 0 ? readCount : 0))) : (React.createElement("div", { className: mergeStyles(noMessageStatusStyle) })))))
153
- },
154
- attached: message.attached,
155
- key: _messageKey
156
- };
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);
157
182
  };
158
183
  /* @conditional-compile-remove(data-loss-prevention) */
159
- // Similar logic as switch statement case 'chat', if statement for conditional compile (merge logic to switch case when stablize)
184
+ // Similar logic as switch statement case 'chat', if statement for conditional compile (merge logic to switch case when stabilize)
160
185
  if (message.messageType === 'blocked') {
161
186
  const myChatMessageStyle = message.status === 'failed'
162
- ? (_b = (_a = styles === null || styles === void 0 ? void 0 : styles.failedMyChatMessageContainer) !== null && _a !== void 0 ? _a : styles === null || styles === void 0 ? void 0 : styles.myChatMessageContainer) !== null && _b !== void 0 ? _b : FailedMyChatMessageContainer
163
- : (_c = styles === null || styles === void 0 ? void 0 : styles.myChatMessageContainer) !== null && _c !== void 0 ? _c : defaultBlockedMessageStyleContainer(theme);
164
- const blockedMessageStyle = (_d = styles === null || styles === void 0 ? void 0 : styles.blockedMessageContainer) !== null && _d !== void 0 ? _d : defaultBlockedMessageStyleContainer(theme);
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;
165
190
  messageProps.messageContainerStyle = message.mine ? myChatMessageStyle : blockedMessageStyle;
166
- return chatMessageItemProps(message, messageProps);
191
+ return chatMessage(message, messageProps);
167
192
  }
168
193
  switch (message.messageType) {
169
194
  case 'chat': {
170
195
  const myChatMessageStyle = message.status === 'failed'
171
- ? (_f = (_e = styles === null || styles === void 0 ? void 0 : styles.failedMyChatMessageContainer) !== null && _e !== void 0 ? _e : styles === null || styles === void 0 ? void 0 : styles.myChatMessageContainer) !== null && _f !== void 0 ? _f : FailedMyChatMessageContainer
172
- : (_g = styles === null || styles === void 0 ? void 0 : styles.myChatMessageContainer) !== null && _g !== void 0 ? _g : defaultMyChatMessageContainer;
173
- const chatMessageStyle = (_h = styles === null || styles === void 0 ? void 0 : styles.chatMessageContainer) !== null && _h !== void 0 ? _h : defaultChatMessageContainer(theme);
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;
174
199
  messageProps.messageContainerStyle = message.mine ? myChatMessageStyle : chatMessageStyle;
175
- return chatMessageItemProps(message, messageProps);
200
+ return chatMessage(message, messageProps);
176
201
  }
177
202
  case 'system': {
178
203
  messageProps.messageContainerStyle = styles === null || styles === void 0 ? void 0 : styles.systemMessageContainer;
179
204
  const systemMessageComponent = onRenderMessage === undefined ? (React.createElement(DefaultSystemMessage, Object.assign({}, messageProps))) : (onRenderMessage(messageProps, (props) => React.createElement(DefaultSystemMessage, Object.assign({}, props))));
180
- return {
181
- children: systemMessageComponent,
182
- key: _messageKey
183
- };
205
+ return (React.createElement("div", { key: _messageKey, style: { paddingTop: '0.5rem' } }, systemMessageComponent));
184
206
  }
185
207
  default: {
186
208
  // We do not handle custom type message by default, users can handle custom type by using onRenderMessage function.
187
209
  const customMessageComponent = onRenderMessage === undefined ? React.createElement(React.Fragment, null) : onRenderMessage(messageProps);
188
- return {
189
- children: customMessageComponent,
190
- key: _messageKey
191
- };
210
+ return (React.createElement("div", { key: _messageKey, style: { paddingTop: '1rem', paddingBottom: '0.25rem' } }, customMessageComponent));
192
211
  }
193
212
  }
194
213
  });
@@ -208,11 +227,23 @@ const getLastChatMessageIdWithStatus = (messages, status) => {
208
227
  * Users will need to provide at least chat messages and userId to render the `MessageThread` component.
209
228
  * Users can also customize `MessageThread` by passing in their own Avatar, `MessageStatusIndicator` icon, `JumpToNewMessageButton`, `LoadPreviousMessagesButton` and the behavior of these controls.
210
229
  *
211
- * `MessageThread` internally uses the `Chat` & `Chat.Message` component from `@fluentui/react-northstar`. You can checkout the details about these [two components](https://fluentsite.z22.web.core.windows.net/0.53.0/components/chat/props).
230
+ * `MessageThread` internally uses the `Chat` component from `@fluentui-contrib/chat`. You can checkout the details about these components [here](https://microsoft.github.io/fluentui-contrib/react-chat/).
212
231
  *
213
232
  * @public
214
233
  */
215
234
  export const MessageThread = (props) => {
235
+ var _a;
236
+ const theme = useTheme();
237
+ const chatBody = useMemo(() => {
238
+ return (React.createElement(FluentV9ThemeProvider, { v8Theme: theme },
239
+ React.createElement(MessageThreadWrapper, Object.assign({}, props))));
240
+ }, [theme, props]);
241
+ return React.createElement("div", { className: mergeStyles(messageThreadContainerStyle, (_a = props.styles) === null || _a === void 0 ? void 0 : _a.root) }, chatBody);
242
+ };
243
+ /**
244
+ * @private
245
+ */
246
+ export const MessageThreadWrapper = (props) => {
216
247
  var _a;
217
248
  const { messages: newMessages, userId, participantCount, readReceiptsBySenderId, styles, disableJumpToNewMessageButton = false, showMessageDate = false, showMessageStatus = false, numberOfChatMessagesToReload = 5, onMessageSeen, onRenderMessageStatus, onRenderAvatar, onLoadPreviousChatMessages, onRenderJumpToNewMessageButton, onRenderMessage, onUpdateMessage, onCancelEditMessage, onDeleteMessage, onSendMessage,
218
249
  /* @conditional-compile-remove(date-time-customization) */
@@ -268,13 +299,7 @@ export const MessageThread = (props) => {
268
299
  const previousHeightRef = useRef(-1);
269
300
  const messageIdSeenByMeRef = useRef('');
270
301
  const chatScrollDivRef = useRef(null);
271
- const chatThreadRef = useRef(null);
272
302
  const isLoadingChatMessagesRef = useRef(false);
273
- // When the chat thread is narrow, we perform space optimizations such as overlapping
274
- // the avatar on top of the chat message and moving the chat accept/reject edit buttons
275
- // to a new line
276
- const chatThreadWidth = _useContainerWidth(chatThreadRef);
277
- const isNarrow = chatThreadWidth ? isNarrowWidth(chatThreadWidth) : false;
278
303
  const messagesRef = useRef(messages);
279
304
  const setMessagesRef = (messagesWithAttachedValue) => {
280
305
  messagesRef.current = messagesWithAttachedValue;
@@ -290,6 +315,18 @@ export const MessageThread = (props) => {
290
315
  chatMessagesInitializedRef.current = chatMessagesInitialized;
291
316
  setChatMessagesInitialized(chatMessagesInitialized);
292
317
  };
318
+ const chatThreadRef = useRef(null);
319
+ // When the chat thread is narrow, we perform space optimizations such as overlapping
320
+ // the avatar on top of the chat message and moving the chat accept/reject edit buttons
321
+ // to a new line
322
+ const chatThreadWidth = _useContainerWidth(chatThreadRef);
323
+ const isNarrow = chatThreadWidth ? isNarrowWidth(chatThreadWidth) : false;
324
+ /**
325
+ * ClientHeight controls the number of messages to render. However ClientHeight will not be initialized after the
326
+ * first render (not sure but I guess Fluent is updating it in hook which is after render maybe?) so we need to
327
+ * trigger a re-render until ClientHeight is initialized. This force re-render should only happen once.
328
+ */
329
+ const clientHeight = (_a = chatThreadRef.current) === null || _a === void 0 ? void 0 : _a.clientHeight;
293
330
  // we try to only send those message status if user is scrolled to the bottom.
294
331
  const sendMessageStatusIfAtBottom = useCallback(() => __awaiter(void 0, void 0, void 0, function* () {
295
332
  if (!isAtBottomOfScrollRef.current ||
@@ -405,12 +442,6 @@ export const MessageThread = (props) => {
405
442
  chatScrollDiv === null || chatScrollDiv === void 0 ? void 0 : chatScrollDiv.removeEventListener('scroll', fetchNewMessageWhenAtTop);
406
443
  };
407
444
  }, [fetchNewMessageWhenAtTop, handleScrollToTheBottom]);
408
- /**
409
- * ClientHeight controls the number of messages to render. However ClientHeight will not be initialized after the
410
- * first render (not sure but I guess Fluent is updating it in hook which is after render maybe?) so we need to
411
- * trigger a re-render until ClientHeight is initialized. This force re-render should only happen once.
412
- */
413
- const clientHeight = (_a = chatThreadRef.current) === null || _a === void 0 ? void 0 : _a.clientHeight;
414
445
  useEffect(() => {
415
446
  if (clientHeight === undefined) {
416
447
  setForceUpdate(forceUpdate + 1);
@@ -464,7 +495,7 @@ export const MessageThread = (props) => {
464
495
  /* @conditional-compile-remove(data-loss-prevention) */ messageProps.message.messageType === 'blocked') {
465
496
  return (React.createElement(ChatMessageComponent, Object.assign({}, messageProps, { onRenderFileDownloads: onRenderFileDownloads,
466
497
  /* @conditional-compile-remove(file-sharing) */
467
- strings: strings, message: messageProps.message, userId: props.userId, remoteParticipantsCount: participantCount ? participantCount - 1 : 0, inlineAcceptRejectEditButtons: !isNarrow, onRenderAvatar: onRenderAvatar, showMessageStatus: showMessageStatus, messageStatus: messageProps.message.status, onActionButtonClick: onActionButtonClickMemo,
498
+ 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,
468
499
  /* @conditional-compile-remove(date-time-customization) */
469
500
  onDisplayDateTimeString: onDisplayDateTimeString,
470
501
  /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */
@@ -512,6 +543,7 @@ export const MessageThread = (props) => {
512
543
  remoteParticipantsCount: participantCount ? participantCount - 1 : 0 }));
513
544
  }, []);
514
545
  const theme = useTheme();
546
+ const chatMessageRenderStyles = useChatMessageRenderStyles();
515
547
  const messagesToDisplay = useMemo(() => memoizeAllMessages((memoizedMessageFn) => {
516
548
  return messages.map((message, index) => {
517
549
  let key = message.messageId;
@@ -541,7 +573,7 @@ export const MessageThread = (props) => {
541
573
  statusToRender = 'failed';
542
574
  }
543
575
  }
544
- return memoizedMessageFn(key !== null && key !== void 0 ? key : 'id_' + index, message, showMessageDate, showMessageStatus, onRenderAvatar, isNarrow, styles, onRenderMessageStatus, defaultStatusRenderer, defaultChatMessageRenderer, strings, theme,
576
+ return memoizedMessageFn(key !== null && key !== void 0 ? key : 'id_' + index, message, showMessageDate, showMessageStatus, onRenderAvatar, isNarrow, styles, onRenderMessageStatus, defaultStatusRenderer, defaultChatMessageRenderer, strings, theme, chatMessageRenderStyles,
545
577
  // Temporary solution to make sure we re-render if attach attribute is changed.
546
578
  // The proper fix should be in selector.
547
579
  message.messageType === 'chat' ||
@@ -561,6 +593,7 @@ export const MessageThread = (props) => {
561
593
  defaultChatMessageRenderer,
562
594
  strings,
563
595
  theme,
596
+ chatMessageRenderStyles,
564
597
  participantCount,
565
598
  readCountForHoveredIndicator,
566
599
  onRenderMessage,
@@ -568,40 +601,28 @@ export const MessageThread = (props) => {
568
601
  onCancelEditMessage,
569
602
  onDeleteMessage,
570
603
  onSendMessage,
604
+ props.disableEditing,
571
605
  lastSeenChatMessage,
572
606
  lastSendingChatMessage,
573
- lastDeliveredChatMessage,
574
- props.disableEditing
607
+ lastDeliveredChatMessage
575
608
  ]);
609
+ const classes = useChatStyles();
576
610
  const chatBody = useMemo(() => {
577
- var _a;
578
611
  return (React.createElement(LiveAnnouncer, null,
579
- React.createElement(Chat, { styles: mergeNorthstarThemes(chatStyle, linkStyles(theme), (_a = styles === null || styles === void 0 ? void 0 : styles.chatContainer) !== null && _a !== void 0 ? _a : {}), items: messagesToDisplay })));
580
- }, [theme, styles === null || styles === void 0 ? void 0 : styles.chatContainer, messagesToDisplay]);
581
- return (React.createElement(Ref, { innerRef: chatThreadRef },
582
- React.createElement(Stack, { className: mergeStyles(messageThreadContainerStyle, styles === null || styles === void 0 ? void 0 : styles.root), grow: true },
583
- 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 })))),
584
- React.createElement(Ref, { innerRef: chatScrollDivRef }, chatBody))));
612
+ React.createElement(FluentV9ThemeProvider, { v8Theme: theme },
613
+ React.createElement(Chat
614
+ // styles?.chatContainer used in className and style prop as style prop can't handle CSS selectors
615
+ , {
616
+ // styles?.chatContainer used in className and style prop as style prop can't handle CSS selectors
617
+ 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))));
618
+ }, [theme, classes.root, styles === null || styles === void 0 ? void 0 : styles.chatContainer, messagesToDisplay]);
619
+ return (React.createElement("div", { className: mergeStyles(messageThreadWrapperContainerStyle), ref: chatThreadRef },
620
+ 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 })))),
621
+ chatBody));
585
622
  };
586
623
  const onRenderFileDownloadsTrampoline = (props) => {
587
624
  /* @conditional-compile-remove(file-sharing) */
588
625
  return props.onRenderFileDownloads;
589
626
  return undefined;
590
627
  };
591
- const linkStyles = (theme) => {
592
- return {
593
- '& a:link': {
594
- color: theme.palette.themePrimary
595
- },
596
- '& a:visited': {
597
- color: theme.palette.themeDarker
598
- },
599
- '& a:hover': {
600
- color: theme.palette.themeDarker
601
- },
602
- '& a:selected': {
603
- color: theme.palette.themeDarker
604
- }
605
- };
606
- };
607
628
  //# sourceMappingURL=MessageThread.js.map