@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.
- package/dist/communication-react.d.ts +5 -6
- package/dist/dist-cjs/communication-react/index.js +883 -434
- package/dist/dist-cjs/communication-react/index.js.map +1 -1
- package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js +1 -1
- package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/CaptionsBanner.js +5 -7
- package/dist/dist-esm/react-components/src/components/CaptionsBanner.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageActionMenu.d.ts +2 -2
- package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageActionMenu.js +5 -22
- package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageActionMenu.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageActionsFlyout.js +2 -1
- package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageActionsFlyout.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponent.d.ts +2 -3
- package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponent.js +1 -1
- package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponent.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentAsEditBox.d.ts +0 -5
- package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentAsEditBox.js +17 -13
- package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentAsEditBox.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentAsMessageBubble.d.ts +9 -0
- package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentAsMessageBubble.js +79 -20
- package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentAsMessageBubble.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/InputBoxComponent.js +9 -8
- package/dist/dist-esm/react-components/src/components/InputBoxComponent.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/MessageThread.d.ts +15 -1
- package/dist/dist-esm/react-components/src/components/MessageThread.js +114 -93
- package/dist/dist-esm/react-components/src/components/MessageThread.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/SystemMessage.js +1 -1
- package/dist/dist-esm/react-components/src/components/SystemMessage.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/styles/Captions.style.d.ts +1 -1
- package/dist/dist-esm/react-components/src/components/styles/Captions.style.js +4 -4
- package/dist/dist-esm/react-components/src/components/styles/Captions.style.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/styles/ChatMessageComponent.styles.d.ts +5 -7
- package/dist/dist-esm/react-components/src/components/styles/ChatMessageComponent.styles.js +24 -9
- package/dist/dist-esm/react-components/src/components/styles/ChatMessageComponent.styles.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/styles/EditBox.styles.d.ts +3 -2
- package/dist/dist-esm/react-components/src/components/styles/EditBox.styles.js +10 -6
- package/dist/dist-esm/react-components/src/components/styles/EditBox.styles.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/styles/InputBoxComponent.style.d.ts +4 -0
- package/dist/dist-esm/react-components/src/components/styles/InputBoxComponent.style.js +8 -2
- package/dist/dist-esm/react-components/src/components/styles/InputBoxComponent.style.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/styles/MessageThread.styles.d.ts +10 -19
- package/dist/dist-esm/react-components/src/components/styles/MessageThread.styles.js +129 -119
- package/dist/dist-esm/react-components/src/components/styles/MessageThread.styles.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/styles/SendBox.styles.d.ts +8 -0
- package/dist/dist-esm/react-components/src/components/styles/SendBox.styles.js +8 -2
- package/dist/dist-esm/react-components/src/components/styles/SendBox.styles.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/styles/SystemMessage.styles.js +1 -1
- package/dist/dist-esm/react-components/src/components/styles/SystemMessage.styles.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/styles/v8StyleShim.d.ts +12 -0
- package/dist/dist-esm/react-components/src/components/styles/v8StyleShim.js +37 -0
- package/dist/dist-esm/react-components/src/components/styles/v8StyleShim.js.map +1 -0
- package/dist/dist-esm/react-components/src/components/utils/Datetime.d.ts +7 -8
- package/dist/dist-esm/react-components/src/components/utils/Datetime.js +9 -31
- package/dist/dist-esm/react-components/src/components/utils/Datetime.js.map +1 -1
- package/dist/dist-esm/react-components/src/localization/locales/en-US/strings.json +1 -1
- package/dist/dist-esm/react-components/src/theming/FluentThemeProvider.d.ts +3 -4
- package/dist/dist-esm/react-components/src/theming/FluentThemeProvider.js +40 -52
- package/dist/dist-esm/react-components/src/theming/FluentThemeProvider.js.map +1 -1
- package/dist/dist-esm/react-components/src/theming/FluentV9ThemeProvider.d.ts +22 -0
- package/dist/dist-esm/react-components/src/theming/FluentV9ThemeProvider.js +29 -0
- package/dist/dist-esm/react-components/src/theming/FluentV9ThemeProvider.js.map +1 -0
- package/dist/dist-esm/react-components/src/theming/themeDuplicates.d.ts +29 -0
- package/dist/dist-esm/react-components/src/theming/themeDuplicates.js +121 -0
- package/dist/dist-esm/react-components/src/theming/themeDuplicates.js.map +1 -0
- package/dist/dist-esm/react-components/src/theming/v9ThemeShim.d.ts +12 -0
- package/dist/dist-esm/react-components/src/theming/v9ThemeShim.js +206 -0
- package/dist/dist-esm/react-components/src/theming/v9ThemeShim.js.map +1 -0
- package/dist/dist-esm/react-components/src/types/ChatMessage.d.ts +2 -2
- package/dist/dist-esm/react-components/src/types/ChatMessage.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/common/ControlBar/DesktopMoreButton.js +30 -27
- package/dist/dist-esm/react-composites/src/composites/common/ControlBar/DesktopMoreButton.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/common/Drawer/MoreDrawer.js +22 -17
- package/dist/dist-esm/react-composites/src/composites/common/Drawer/MoreDrawer.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/common/icons.js +3 -3
- package/dist/dist-esm/react-composites/src/composites/common/icons.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/localization/locales/en-US/strings.json +5 -5
- package/package.json +12 -11
- package/dist/dist-esm/northstar-wrapper/src/index.js +0 -2
- 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 {
|
14
|
-
import {
|
15
|
-
|
16
|
-
import {
|
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
|
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
|
129
|
-
var _a
|
130
|
-
const
|
131
|
-
?
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
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
|
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
|
-
? (
|
163
|
-
:
|
164
|
-
const blockedMessageStyle =
|
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
|
191
|
+
return chatMessage(message, messageProps);
|
167
192
|
}
|
168
193
|
switch (message.messageType) {
|
169
194
|
case 'chat': {
|
170
195
|
const myChatMessageStyle = message.status === 'failed'
|
171
|
-
? (
|
172
|
-
:
|
173
|
-
const chatMessageStyle =
|
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
|
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`
|
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,
|
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(
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
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
|