@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.
- package/dist/communication-react.d.ts +17 -14
- package/dist/dist-cjs/communication-react/index.js +1215 -1042
- package/dist/dist-cjs/communication-react/index.js.map +1 -1
- package/dist/dist-esm/acs-ui-common/src/index.d.ts +1 -0
- package/dist/dist-esm/acs-ui-common/src/index.js.map +1 -1
- package/dist/dist-esm/acs-ui-common/src/telemetry.d.ts +7 -1
- package/dist/dist-esm/acs-ui-common/src/telemetry.js +24 -2
- package/dist/dist-esm/acs-ui-common/src/telemetry.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/calling-stateful-client/src/StatefulCallClient.d.ts +7 -0
- package/dist/dist-esm/calling-stateful-client/src/StatefulCallClient.js +12 -4
- package/dist/dist-esm/calling-stateful-client/src/StatefulCallClient.js.map +1 -1
- package/dist/dist-esm/calling-stateful-client/src/index.d.ts +1 -0
- package/dist/dist-esm/calling-stateful-client/src/index.js +1 -0
- package/dist/dist-esm/calling-stateful-client/src/index.js.map +1 -1
- package/dist/dist-esm/chat-stateful-client/src/StatefulChatClient.d.ts +7 -0
- package/dist/dist-esm/chat-stateful-client/src/StatefulChatClient.js +10 -2
- package/dist/dist-esm/chat-stateful-client/src/StatefulChatClient.js.map +1 -1
- package/dist/dist-esm/chat-stateful-client/src/index.d.ts +1 -1
- package/dist/dist-esm/chat-stateful-client/src/index.js +1 -1
- package/dist/dist-esm/chat-stateful-client/src/index.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponent.js +2 -2
- package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponent.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentAsMessageBubble.js +1 -1
- package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentAsMessageBubble.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentWrapper.d.ts +46 -0
- package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentWrapper.js +53 -0
- package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageComponentWrapper.js.map +1 -0
- package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageContent.d.ts +1 -1
- package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageContent.js +16 -10
- package/dist/dist-esm/react-components/src/components/ChatMessage/ChatMessageContent.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/ChatMessage/DefaultSystemMessage.d.ts +6 -0
- package/dist/dist-esm/react-components/src/components/ChatMessage/DefaultSystemMessage.js +38 -0
- package/dist/dist-esm/react-components/src/components/ChatMessage/DefaultSystemMessage.js.map +1 -0
- package/dist/dist-esm/react-components/src/components/ChatMessage/FluentChatMessageComponentWrapper.d.ts +23 -0
- package/dist/dist-esm/react-components/src/components/ChatMessage/FluentChatMessageComponentWrapper.js +183 -0
- package/dist/dist-esm/react-components/src/components/ChatMessage/FluentChatMessageComponentWrapper.js.map +1 -0
- package/dist/dist-esm/react-components/src/components/MessageThread.d.ts +5 -7
- package/dist/dist-esm/react-components/src/components/MessageThread.js +92 -247
- package/dist/dist-esm/react-components/src/components/MessageThread.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/VideoGallery/DefaultLayout.js +1 -3
- package/dist/dist-esm/react-components/src/components/VideoGallery/DefaultLayout.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/VideoGallery/FloatingLocalVideoLayout.js +3 -2
- package/dist/dist-esm/react-components/src/components/VideoGallery/FloatingLocalVideoLayout.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/VideoGallery/OverflowGallery.d.ts +0 -2
- package/dist/dist-esm/react-components/src/components/VideoGallery/OverflowGallery.js +5 -4
- package/dist/dist-esm/react-components/src/components/VideoGallery/OverflowGallery.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/VideoGallery/SpeakerVideoLayout.js +3 -2
- package/dist/dist-esm/react-components/src/components/VideoGallery/SpeakerVideoLayout.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.d.ts +19 -7
- package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.js +38 -10
- package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/CallAdapter.d.ts +14 -5
- package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/CallAdapter.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/CallingSoundSubscriber.d.ts +3 -3
- package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/CallingSoundSubscriber.js +10 -13
- package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/CallingSoundSubscriber.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/index.d.ts +1 -1
- package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/index.js +1 -1
- package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/index.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/CallComposite/components/SidePane/SidePane.js +1 -1
- package/dist/dist-esm/react-composites/src/composites/CallComposite/components/SidePane/SidePane.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/LocalVideoTileSelector.d.ts +1 -0
- package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/activeVideoBackgroundEffectSelector.d.ts +1 -0
- package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/callStatusSelector.d.ts +1 -0
- package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/capabilitiesChangedInfoAndRoleSelector.d.ts +1 -0
- package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/complianceBannerSelector.d.ts +1 -0
- package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/deviceCountSelector.d.ts +1 -0
- package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/devicePermissionSelector.d.ts +1 -0
- package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/dominantRemoteParticipantSelector.d.ts +1 -0
- package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/lobbySelector.d.ts +1 -0
- package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/localAndRemotePIPSelector.d.ts +1 -0
- package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/localPreviewSelector.d.ts +1 -0
- package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/localVideoStreamSelector.d.ts +1 -0
- package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/mediaGallerySelector.d.ts +2 -0
- package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/mutedNotificationSelector.d.ts +1 -0
- package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/networkReconnectTileSelector.d.ts +1 -0
- package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/CallWithChatComposite.js +6 -8
- package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/CallWithChatComposite.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/AzureCommunicationCallWithChatAdapter.js +6 -11
- package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/AzureCommunicationCallWithChatAdapter.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/ChatComposite/ChatComposite.js +3 -13
- package/dist/dist-esm/react-composites/src/composites/ChatComposite/ChatComposite.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/ChatComposite/ChatScreen.js +10 -4
- package/dist/dist-esm/react-composites/src/composites/ChatComposite/ChatScreen.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/ChatComposite/adapter/AzureCommunicationChatAdapter.d.ts +7 -0
- package/dist/dist-esm/react-composites/src/composites/ChatComposite/adapter/AzureCommunicationChatAdapter.js +13 -5
- package/dist/dist-esm/react-composites/src/composites/ChatComposite/adapter/AzureCommunicationChatAdapter.js.map +1 -1
- 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
|
14
|
-
import { 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
|
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
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
}
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
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
|
116
|
-
|
117
|
-
|
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
|
257
|
-
|
258
|
-
|
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
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
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
|
-
}), [
|
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
|
-
|
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
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
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
|
-
|
615
|
-
|
616
|
-
|
448
|
+
showMessageDate,
|
449
|
+
showMessageStatus,
|
450
|
+
strings
|
617
451
|
]);
|
618
452
|
const classes = useChatStyles();
|
619
|
-
|
620
|
-
|
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
|
-
|
628
|
-
|
629
|
-
|
630
|
-
|
631
|
-
|
632
|
-
|
633
|
-
|
634
|
-
|
635
|
-
|
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
|