stream-chat-react 9.1.3 → 9.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/browser.full-bundle.js +111 -100
  2. package/dist/browser.full-bundle.js.map +1 -1
  3. package/dist/browser.full-bundle.min.js +5 -5
  4. package/dist/browser.full-bundle.min.js.map +1 -1
  5. package/dist/components/Channel/Channel.d.ts +1 -1
  6. package/dist/components/Channel/Channel.d.ts.map +1 -1
  7. package/dist/components/Channel/Channel.js +3 -6
  8. package/dist/components/Message/Message.d.ts.map +1 -1
  9. package/dist/components/Message/Message.js +3 -6
  10. package/dist/components/Message/hooks/useUserRole.d.ts.map +1 -1
  11. package/dist/components/Message/hooks/useUserRole.js +17 -3
  12. package/dist/components/Message/types.d.ts +2 -0
  13. package/dist/components/Message/types.d.ts.map +1 -1
  14. package/dist/components/Message/utils.d.ts +1 -2
  15. package/dist/components/Message/utils.d.ts.map +1 -1
  16. package/dist/components/Message/utils.js +18 -23
  17. package/dist/components/MessageActions/MessageActionsBox.js +1 -1
  18. package/dist/components/MessageList/VirtualizedMessageList.d.ts +0 -2
  19. package/dist/components/MessageList/VirtualizedMessageList.d.ts.map +1 -1
  20. package/dist/components/MessageList/VirtualizedMessageList.js +11 -8
  21. package/dist/components/Thread/Thread.d.ts +6 -5
  22. package/dist/components/Thread/Thread.d.ts.map +1 -1
  23. package/dist/components/Thread/Thread.js +9 -16
  24. package/dist/context/MessageContext.d.ts +2 -0
  25. package/dist/context/MessageContext.d.ts.map +1 -1
  26. package/dist/css/index.css +1 -1
  27. package/dist/index.cjs.js +58 -49
  28. package/dist/index.cjs.js.map +1 -1
  29. package/dist/scss/Message.scss +1 -1
  30. package/dist/stories/hello.stories.js +1 -1
  31. package/dist/stories/toggle-message-actions.stories.d.ts +3 -0
  32. package/dist/stories/toggle-message-actions.stories.d.ts.map +1 -0
  33. package/dist/stories/toggle-message-actions.stories.js +36 -0
  34. package/dist/version.d.ts +1 -1
  35. package/dist/version.js +1 -1
  36. package/package.json +5 -5
package/dist/index.cjs.js CHANGED
@@ -2866,12 +2866,26 @@ var useUserRole = function (message, onlySenderCanEdit, disableQuotedMessages) {
2866
2866
  var _a, _b, _c;
2867
2867
  var _d = useChannelStateContext('useUserRole'), channel = _d.channel, _e = _d.channelCapabilities, channelCapabilities = _e === void 0 ? {} : _e, channelConfig = _d.channelConfig;
2868
2868
  var client = useChatContext('useUserRole').client;
2869
+ /**
2870
+ * @deprecated as it relies on `membership.role` check which is already deprecated and shouldn't be used anymore.
2871
+ * `isAdmin` will be removed in future release. See `channelCapabilities`.
2872
+ */
2869
2873
  var isAdmin = ((_a = client.user) === null || _a === void 0 ? void 0 : _a.role) === 'admin' || channel.state.membership.role === 'admin';
2870
- var isMyMessage = client.userID === ((_b = message.user) === null || _b === void 0 ? void 0 : _b.id);
2874
+ /**
2875
+ * @deprecated as it relies on `membership.role` check which is already deprecated and shouldn't be used anymore.
2876
+ * `isOwner` will be removed in future release. See `channelCapabilities`.
2877
+ */
2871
2878
  var isOwner = channel.state.membership.role === 'owner';
2872
- var isModerator = ((_c = client.user) === null || _c === void 0 ? void 0 : _c.role) === 'channel_moderator' ||
2879
+ /**
2880
+ * @deprecated as it relies on `membership.role` check which is already deprecated and shouldn't be used anymore.
2881
+ * `isModerator` will be removed in future release. See `channelCapabilities`.
2882
+ */
2883
+ var isModerator = ((_b = client.user) === null || _b === void 0 ? void 0 : _b.role) === 'channel_moderator' ||
2873
2884
  channel.state.membership.role === 'channel_moderator' ||
2874
- channel.state.membership.role === 'moderator';
2885
+ channel.state.membership.role === 'moderator' ||
2886
+ channel.state.membership.is_moderator === true ||
2887
+ channel.state.membership.channel_role === 'channel_moderator';
2888
+ var isMyMessage = client.userID === ((_c = message.user) === null || _c === void 0 ? void 0 : _c.id);
2875
2889
  var canEdit = (!onlySenderCanEdit && channelCapabilities['update-any-message']) ||
2876
2890
  (isMyMessage && channelCapabilities['update-own-message']);
2877
2891
  var canDelete = channelCapabilities['delete-any-message'] ||
@@ -3092,18 +3106,9 @@ var showMessageActionsBox = function (actions, inThread) {
3092
3106
  }
3093
3107
  return true;
3094
3108
  };
3095
- var areMessagePropsEqual = function (prevProps, nextProps) {
3109
+ var areMessagesEqual = function (prevMessage, nextMessage) {
3096
3110
  var _a, _b, _c, _d, _e, _f;
3097
- var prevMessage = prevProps.message, prevMessageUI = prevProps.Message;
3098
- var nextMessage = nextProps.message, nextMessageUI = nextProps.Message;
3099
- if (prevMessageUI !== nextMessageUI)
3100
- return false;
3101
- if (prevProps.endOfGroup !== nextProps.endOfGroup)
3102
- return false;
3103
- if (nextProps.showDetailedReactions !== prevProps.showDetailedReactions) {
3104
- return false;
3105
- }
3106
- var messagesAreEqual = prevMessage.deleted_at === nextMessage.deleted_at &&
3111
+ return prevMessage.deleted_at === nextMessage.deleted_at &&
3107
3112
  ((_a = prevMessage.latest_reactions) === null || _a === void 0 ? void 0 : _a.length) === ((_b = nextMessage.latest_reactions) === null || _b === void 0 ? void 0 : _b.length) &&
3108
3113
  ((_c = prevMessage.own_reactions) === null || _c === void 0 ? void 0 : _c.length) === ((_d = nextMessage.own_reactions) === null || _d === void 0 ? void 0 : _d.length) &&
3109
3114
  prevMessage.pinned === nextMessage.pinned &&
@@ -3113,9 +3118,22 @@ var areMessagePropsEqual = function (prevProps, nextProps) {
3113
3118
  prevMessage.type === nextMessage.type &&
3114
3119
  prevMessage.updated_at === nextMessage.updated_at &&
3115
3120
  ((_e = prevMessage.user) === null || _e === void 0 ? void 0 : _e.updated_at) === ((_f = nextMessage.user) === null || _f === void 0 ? void 0 : _f.updated_at);
3121
+ };
3122
+ var areMessagePropsEqual = function (prevProps, nextProps) {
3123
+ var prevMessage = prevProps.message, prevMessageUI = prevProps.Message;
3124
+ var nextMessage = nextProps.message, nextMessageUI = nextProps.Message;
3125
+ if (prevMessageUI !== nextMessageUI)
3126
+ return false;
3127
+ if (prevProps.endOfGroup !== nextProps.endOfGroup)
3128
+ return false;
3129
+ if (nextProps.showDetailedReactions !== prevProps.showDetailedReactions) {
3130
+ return false;
3131
+ }
3132
+ var messagesAreEqual = areMessagesEqual(prevMessage, nextMessage);
3116
3133
  if (!messagesAreEqual)
3117
3134
  return false;
3118
- var deepEqualProps = deepequal__default['default'](nextProps.readBy, prevProps.readBy) &&
3135
+ var deepEqualProps = deepequal__default['default'](nextProps.messageActions, prevProps.messageActions) &&
3136
+ deepequal__default['default'](nextProps.readBy, prevProps.readBy) &&
3119
3137
  deepequal__default['default'](nextProps.highlighted, prevProps.highlighted) &&
3120
3138
  deepequal__default['default'](nextProps.groupStyles, prevProps.groupStyles) && // last 3 messages can have different group styles
3121
3139
  deepequal__default['default'](nextProps.mutes, prevProps.mutes) &&
@@ -3126,7 +3144,7 @@ var areMessagePropsEqual = function (prevProps, nextProps) {
3126
3144
  );
3127
3145
  };
3128
3146
  var areMessageUIPropsEqual = function (prevProps, nextProps) {
3129
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
3147
+ var _a, _b, _c, _d;
3130
3148
  var prevLastReceivedId = prevProps.lastReceivedId, prevMessage = prevProps.message;
3131
3149
  var nextLastReceivedId = nextProps.lastReceivedId, nextMessage = nextProps.message;
3132
3150
  if (prevProps.editing !== nextProps.editing)
@@ -3146,16 +3164,7 @@ var areMessageUIPropsEqual = function (prevProps, nextProps) {
3146
3164
  prevLastReceivedId !== nextLastReceivedId) {
3147
3165
  return false;
3148
3166
  }
3149
- return (prevMessage.deleted_at === nextMessage.deleted_at &&
3150
- ((_e = prevMessage.latest_reactions) === null || _e === void 0 ? void 0 : _e.length) === ((_f = nextMessage.latest_reactions) === null || _f === void 0 ? void 0 : _f.length) &&
3151
- ((_g = prevMessage.own_reactions) === null || _g === void 0 ? void 0 : _g.length) === ((_h = nextMessage.own_reactions) === null || _h === void 0 ? void 0 : _h.length) &&
3152
- prevMessage.pinned === nextMessage.pinned &&
3153
- prevMessage.reply_count === nextMessage.reply_count &&
3154
- prevMessage.status === nextMessage.status &&
3155
- prevMessage.text === nextMessage.text &&
3156
- prevMessage.type === nextMessage.type &&
3157
- prevMessage.updated_at === nextMessage.updated_at &&
3158
- ((_j = prevMessage.user) === null || _j === void 0 ? void 0 : _j.updated_at) === ((_k = nextMessage.user) === null || _k === void 0 ? void 0 : _k.updated_at));
3167
+ return areMessagesEqual(prevMessage, nextMessage);
3159
3168
  };
3160
3169
  var messageHasReactions = function (message) { return !!(message === null || message === void 0 ? void 0 : message.latest_reactions) && !!message.latest_reactions.length; };
3161
3170
  var messageHasAttachments = function (message) { return !!(message === null || message === void 0 ? void 0 : message.attachments) && !!message.attachments.length; };
@@ -3315,7 +3324,7 @@ var UnMemoizedMessageActionsBox = function (props) {
3315
3324
  return (React__default['default'].createElement("div", { className: "str-chat__message-actions-box\n " + (open ? 'str-chat__message-actions-box--open' : '') + "\n " + (mine ? 'str-chat__message-actions-box--mine' : '') + "\n " + (reverse ? 'str-chat__message-actions-box--reverse' : '') + "\n ", "data-testid": 'message-actions-box', ref: checkIfReverse },
3316
3325
  React__default['default'].createElement("div", { "aria-label": 'Message Options', className: 'str-chat__message-actions-list', role: 'listbox' },
3317
3326
  customMessageActions && (React__default['default'].createElement(CustomMessageActionsList, { customMessageActions: customMessageActions, message: message })),
3318
- messageActions.indexOf(MESSAGE_ACTIONS.quote) > -1 && !message.quoted_message && (React__default['default'].createElement("button", { "aria-selected": 'false', className: 'str-chat__message-actions-list-item', onClick: handleQuote, role: 'option' }, t('Reply'))),
3327
+ messageActions.indexOf(MESSAGE_ACTIONS.quote) > -1 && (React__default['default'].createElement("button", { "aria-selected": 'false', className: 'str-chat__message-actions-list-item', onClick: handleQuote, role: 'option' }, t('Reply'))),
3319
3328
  messageActions.indexOf(MESSAGE_ACTIONS.pin) > -1 && !message.parent_id && (React__default['default'].createElement("button", { "aria-selected": 'false', className: 'str-chat__message-actions-list-item', onClick: handlePin, role: 'option' }, !message.pinned ? t('Pin') : t('Unpin'))),
3320
3329
  messageActions.indexOf(MESSAGE_ACTIONS.flag) > -1 && (React__default['default'].createElement("button", { "aria-selected": 'false', className: 'str-chat__message-actions-list-item', onClick: handleFlag, role: 'option' }, t('Flag'))),
3321
3330
  messageActions.indexOf(MESSAGE_ACTIONS.mute) > -1 && (React__default['default'].createElement("button", { "aria-selected": 'false', className: 'str-chat__message-actions-list-item', onClick: handleMute, role: 'option' }, isUserMuted() ? t('Unmute') : t('Mute'))),
@@ -6530,19 +6539,16 @@ var ChannelInner = function (props) {
6530
6539
  }
6531
6540
  });
6532
6541
  }); };
6533
- var createMessagePreview = function (text, attachments, parent, mentioned_users) {
6534
- var clientSideID = client.userID + "-" + nanoid.nanoid();
6535
- return __assign({ __html: text, attachments: attachments, created_at: new Date(), html: text, id: clientSideID, mentioned_users: mentioned_users, reactions: [], status: 'sending', text: text, type: 'regular', user: client.user }, ((parent === null || parent === void 0 ? void 0 : parent.id) ? { parent_id: parent.id } : null));
6536
- };
6537
6542
  var sendMessage = function (_a, customMessageData) {
6538
- var _b = _a.attachments, attachments = _b === void 0 ? [] : _b, _c = _a.mentioned_users, mentioned_users = _c === void 0 ? [] : _c, _d = _a.parent, parent = _d === void 0 ? undefined : _d, _e = _a.text, text = _e === void 0 ? '' : _e;
6543
+ var _b = _a.attachments, attachments = _b === void 0 ? [] : _b, _c = _a.mentioned_users, mentioned_users = _c === void 0 ? [] : _c, parent = _a.parent, _d = _a.text, text = _d === void 0 ? '' : _d;
6539
6544
  return __awaiter(void 0, void 0, void 0, function () {
6540
6545
  var messagePreview;
6546
+ var _e;
6541
6547
  return __generator(this, function (_f) {
6542
6548
  switch (_f.label) {
6543
6549
  case 0:
6544
6550
  channel.state.filterErrorMessages();
6545
- messagePreview = createMessagePreview(text, attachments, parent, mentioned_users);
6551
+ messagePreview = __assign({ __html: text, attachments: attachments, created_at: new Date(), html: text, id: (_e = customMessageData === null || customMessageData === void 0 ? void 0 : customMessageData.id) !== null && _e !== void 0 ? _e : client.userID + "-" + nanoid.nanoid(), mentioned_users: mentioned_users, reactions: [], status: 'sending', text: text, type: 'regular', user: client.user }, ((parent === null || parent === void 0 ? void 0 : parent.id) ? { parent_id: parent.id } : null));
6546
6552
  updateMessage(messagePreview);
6547
6553
  return [4 /*yield*/, doSendMessage(messagePreview, customMessageData)];
6548
6554
  case 1:
@@ -7676,7 +7682,7 @@ var UnMemoizedChannelList = function (props) {
7676
7682
  */
7677
7683
  var ChannelList = React__default['default'].memo(UnMemoizedChannelList);
7678
7684
 
7679
- var version = '9.1.3';
7685
+ var version = '9.2.0';
7680
7686
 
7681
7687
  var useChat = function (_a) {
7682
7688
  var _b, _c;
@@ -8076,7 +8082,7 @@ var MessageWithContext = function (props) {
8076
8082
  canReact: canReact,
8077
8083
  canReply: canReply,
8078
8084
  });
8079
- }, [canDelete, canEdit, canFlag, canMute, canPin, canQuote, canReact, canReply]);
8085
+ }, [messageActions, canDelete, canEdit, canFlag, canMute, canPin, canQuote, canReact, canReply]);
8080
8086
  props.canPin; // eslint-disable-line @typescript-eslint/no-unused-vars
8081
8087
  props.messageActions; // eslint-disable-line @typescript-eslint/no-unused-vars
8082
8088
  props.onlySenderCanEdit; // eslint-disable-line @typescript-eslint/no-unused-vars
@@ -8127,7 +8133,7 @@ var Message = function (props) {
8127
8133
  }), canPin = _d.canPin, handlePin = _d.handlePin;
8128
8134
  var _e = useReactionClick(message, reactionSelectorRef, undefined, closeReactionSelectorOnClick), isReactionEnabled = _e.isReactionEnabled, onReactionListClick = _e.onReactionListClick, showDetailedReactions = _e.showDetailedReactions;
8129
8135
  var highlighted = highlightedMessageId === message.id;
8130
- return (React__default['default'].createElement(MemoizedMessage, { additionalMessageInputProps: props.additionalMessageInputProps, canPin: canPin, customMessageActions: props.customMessageActions, disableQuotedMessages: props.disableQuotedMessages, endOfGroup: props.endOfGroup, firstOfGroup: props.firstOfGroup, formatDate: props.formatDate, groupedByUser: props.groupedByUser, groupStyles: props.groupStyles, handleAction: handleAction, handleDelete: handleDelete, handleFlag: handleFlag, handleMute: handleMute, handleOpenThread: handleOpenThread, handlePin: handlePin, handleReaction: handleReaction, handleRetry: handleRetry, highlighted: highlighted, initialMessage: props.initialMessage, isReactionEnabled: isReactionEnabled, lastReceivedId: props.lastReceivedId, message: message, Message: props.Message, messageActions: props.messageActions, messageListRect: props.messageListRect, mutes: mutes, onMentionsClickMessage: onMentionsClick, onMentionsHoverMessage: onMentionsHover, onReactionListClick: onReactionListClick, onUserClick: props.onUserClick, onUserHover: props.onUserHover, pinPermissions: props.pinPermissions, reactionSelectorRef: reactionSelectorRef, readBy: props.readBy, renderText: props.renderText, showDetailedReactions: showDetailedReactions, threadList: props.threadList, unsafeHTML: props.unsafeHTML, userRoles: userRoles }));
8136
+ return (React__default['default'].createElement(MemoizedMessage, { additionalMessageInputProps: props.additionalMessageInputProps, autoscrollToBottom: props.autoscrollToBottom, canPin: canPin, customMessageActions: props.customMessageActions, disableQuotedMessages: props.disableQuotedMessages, endOfGroup: props.endOfGroup, firstOfGroup: props.firstOfGroup, formatDate: props.formatDate, groupedByUser: props.groupedByUser, groupStyles: props.groupStyles, handleAction: handleAction, handleDelete: handleDelete, handleFlag: handleFlag, handleMute: handleMute, handleOpenThread: handleOpenThread, handlePin: handlePin, handleReaction: handleReaction, handleRetry: handleRetry, highlighted: highlighted, initialMessage: props.initialMessage, isReactionEnabled: isReactionEnabled, lastReceivedId: props.lastReceivedId, message: message, Message: props.Message, messageActions: props.messageActions, messageListRect: props.messageListRect, mutes: mutes, onMentionsClickMessage: onMentionsClick, onMentionsHoverMessage: onMentionsHover, onReactionListClick: onReactionListClick, onUserClick: props.onUserClick, onUserHover: props.onUserHover, pinPermissions: props.pinPermissions, reactionSelectorRef: reactionSelectorRef, readBy: props.readBy, renderText: props.renderText, showDetailedReactions: showDetailedReactions, threadList: props.threadList, unsafeHTML: props.unsafeHTML, userRoles: userRoles }));
8131
8137
  };
8132
8138
 
8133
8139
  var MessageCommerceWithContext = function (props) {
@@ -9304,7 +9310,7 @@ var VirtualizedMessageListWithContext = function (props) {
9304
9310
  return isAtBottom ? stickToBottomScrollBehavior : false;
9305
9311
  };
9306
9312
  var messageRenderer = React.useCallback(function (messageList, virtuosoIndex) {
9307
- var _a, _b, _c, _d, _e, _f, _g, _h;
9313
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
9308
9314
  var streamMessageIndex = virtuosoIndex + numItemsPrepended - PREPEND_OFFSET;
9309
9315
  // use custom renderer supplied by client if present and skip the rest
9310
9316
  if (customMessageRenderer) {
@@ -9324,17 +9330,20 @@ var VirtualizedMessageListWithContext = function (props) {
9324
9330
  ((_a = message.user) === null || _a === void 0 ? void 0 : _a.id) === ((_b = messageList[streamMessageIndex - 1].user) === null || _b === void 0 ? void 0 : _b.id);
9325
9331
  var firstOfGroup = shouldGroupByUser && ((_c = message.user) === null || _c === void 0 ? void 0 : _c.id) !== ((_e = (_d = messageList[streamMessageIndex - 1]) === null || _d === void 0 ? void 0 : _d.user) === null || _e === void 0 ? void 0 : _e.id);
9326
9332
  var endOfGroup = shouldGroupByUser && ((_f = message.user) === null || _f === void 0 ? void 0 : _f.id) !== ((_h = (_g = messageList[streamMessageIndex + 1]) === null || _g === void 0 ? void 0 : _g.user) === null || _h === void 0 ? void 0 : _h.id);
9327
- return (React__default['default'].createElement(Message, { closeReactionSelectorOnClick: closeReactionSelectorOnClick, customMessageActions: props.customMessageActions, endOfGroup: endOfGroup, firstOfGroup: firstOfGroup, groupedByUser: groupedByUser, message: message, Message: MessageUIComponent, messageActions: props.messageActions }));
9333
+ return (React__default['default'].createElement(Message, { autoscrollToBottom: (_j = virtuoso.current) === null || _j === void 0 ? void 0 : _j.autoscrollToBottom, closeReactionSelectorOnClick: closeReactionSelectorOnClick, customMessageActions: props.customMessageActions, endOfGroup: endOfGroup, firstOfGroup: firstOfGroup, groupedByUser: groupedByUser, message: message, Message: MessageUIComponent, messageActions: props.messageActions }));
9328
9334
  }, [customMessageRenderer, shouldGroupByUser, numItemsPrepended]);
9335
+ var Item = React.useMemo(function () {
9336
+ // using 'display: inline-block'
9337
+ // traps CSS margins of the item elements, preventing incorrect item measurements
9338
+ var Item = function (props) { return (React__default['default'].createElement("div", __assign({}, props, { className: (customClasses === null || customClasses === void 0 ? void 0 : customClasses.virtualMessage) || 'str-chat__virtual-list-message-wrapper' }))); };
9339
+ return Item;
9340
+ }, [customClasses === null || customClasses === void 0 ? void 0 : customClasses.virtualMessage]);
9329
9341
  var virtuosoComponents = React.useMemo(function () {
9330
9342
  var EmptyPlaceholder = function () { return (React__default['default'].createElement(React__default['default'].Fragment, null, EmptyStateIndicator$1 && React__default['default'].createElement(EmptyStateIndicator$1, { listType: 'message' }))); };
9331
9343
  var Header = function () {
9332
9344
  return loadingMore ? (React__default['default'].createElement("div", { className: 'str-chat__virtual-list__loading' },
9333
9345
  React__default['default'].createElement(LoadingIndicator$1, { size: 20 }))) : (React__default['default'].createElement(React__default['default'].Fragment, null));
9334
9346
  };
9335
- var virtualMessageClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.virtualMessage) || 'str-chat__virtual-list-message-wrapper';
9336
- // using 'display: inline-block' traps CSS margins of the item elements, preventing incorrect item measurements
9337
- var Item = function (props) { return React__default['default'].createElement("div", __assign({}, props, { className: virtualMessageClass })); };
9338
9347
  var Footer = function () {
9339
9348
  return TypingIndicator ? React__default['default'].createElement(TypingIndicator, { avatarSize: 24 }) : React__default['default'].createElement(React__default['default'].Fragment, null);
9340
9349
  };
@@ -9374,15 +9383,15 @@ var VirtualizedMessageListWithContext = function (props) {
9374
9383
  return null;
9375
9384
  return (React__default['default'].createElement(React__default['default'].Fragment, null,
9376
9385
  React__default['default'].createElement("div", { className: (customClasses === null || customClasses === void 0 ? void 0 : customClasses.virtualizedMessageList) || 'str-chat__virtual-list' },
9377
- React__default['default'].createElement(reactVirtuoso.Virtuoso, __assign({ atBottomStateChange: atBottomStateChange, components: virtuosoComponents, endReached: endReached, firstItemIndex: PREPEND_OFFSET - numItemsPrepended, followOutput: followOutput, increaseViewportBy: { bottom: 200, top: 0 }, initialTopMostItemIndex: calculateInitialTopMostItemIndex(processedMessages, highlightedMessageId), itemContent: function (i) { return messageRenderer(processedMessages, i); }, itemSize: fractionalItemSize, key: messageSetKey, overscan: overscan, ref: virtuoso, startReached: startReached, style: { overflowX: 'hidden' }, totalCount: processedMessages.length }, additionalVirtuosoProps, (scrollSeekPlaceHolder ? { scrollSeek: scrollSeekPlaceHolder } : {}), (defaultItemHeight ? { defaultItemHeight: defaultItemHeight } : {})))),
9386
+ React__default['default'].createElement(reactVirtuoso.Virtuoso, __assign({ atBottomStateChange: atBottomStateChange, components: virtuosoComponents, computeItemKey: function (index) {
9387
+ return processedMessages[numItemsPrepended + index - PREPEND_OFFSET].id;
9388
+ }, endReached: endReached, firstItemIndex: PREPEND_OFFSET - numItemsPrepended, followOutput: followOutput, increaseViewportBy: { bottom: 200, top: 0 }, initialTopMostItemIndex: calculateInitialTopMostItemIndex(processedMessages, highlightedMessageId), itemContent: function (i) { return messageRenderer(processedMessages, i); }, itemSize: fractionalItemSize, key: messageSetKey, overscan: overscan, ref: virtuoso, startReached: startReached, style: { overflowX: 'hidden' }, totalCount: processedMessages.length }, additionalVirtuosoProps, (scrollSeekPlaceHolder ? { scrollSeek: scrollSeekPlaceHolder } : {}), (defaultItemHeight ? { defaultItemHeight: defaultItemHeight } : {})))),
9378
9389
  React__default['default'].createElement(MessageListNotifications$1, { hasNewMessages: newMessagesNotification, isNotAtLatestMessageSet: hasMoreNewer, MessageNotification: MessageNotification$1, notifications: notifications, scrollToBottom: scrollToBottom }),
9379
9390
  giphyPreviewMessage && React__default['default'].createElement(GiphyPreviewMessage$1, { message: giphyPreviewMessage })));
9380
9391
  };
9381
9392
  /**
9382
9393
  * The VirtualizedMessageList component renders a list of messages in a virtualized list.
9383
9394
  * It is a consumer of the React contexts set in [Channel](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Channel/Channel.tsx).
9384
- *
9385
- * **Note**: It works well when there are thousands of messages in a channel, it has a shortcoming though - the message UI should have a fixed height.
9386
9395
  */
9387
9396
  function VirtualizedMessageList(props) {
9388
9397
  var _a = useChannelActionContext('VirtualizedMessageList'), jumpToLatestMessage = _a.jumpToLatestMessage, loadMore = _a.loadMore, loadMoreNewer = _a.loadMoreNewer;
@@ -9422,11 +9431,11 @@ var DefaultThreadStart = function () {
9422
9431
  return React__default['default'].createElement("div", { className: 'str-chat__thread-start' }, t('Start of a new thread'));
9423
9432
  };
9424
9433
  var ThreadInner = function (props) {
9425
- var additionalMessageInputProps = props.additionalMessageInputProps, additionalMessageListProps = props.additionalMessageListProps, additionalParentMessageProps = props.additionalParentMessageProps, additionalVirtualizedMessageListProps = props.additionalVirtualizedMessageListProps, _a = props.autoFocus, autoFocus = _a === void 0 ? true : _a, _b = props.enableDateSeparator, enableDateSeparator = _b === void 0 ? false : _b, _c = props.fullWidth, fullWidth = _c === void 0 ? false : _c, PropInput = props.Input, PropMessage = props.Message, virtualized = props.virtualized;
9426
- var _d = useChannelStateContext('Thread'), thread = _d.thread, threadHasMore = _d.threadHasMore, threadLoadingMore = _d.threadLoadingMore, threadMessages = _d.threadMessages;
9427
- var _e = useChannelActionContext('Thread'), closeThread = _e.closeThread, loadMoreThread = _e.loadMoreThread, sendMessage = _e.sendMessage;
9434
+ var additionalMessageInputProps = props.additionalMessageInputProps, additionalMessageListProps = props.additionalMessageListProps, additionalParentMessageProps = props.additionalParentMessageProps, additionalVirtualizedMessageListProps = props.additionalVirtualizedMessageListProps, _a = props.autoFocus, autoFocus = _a === void 0 ? true : _a, _b = props.enableDateSeparator, enableDateSeparator = _b === void 0 ? false : _b, _c = props.fullWidth, fullWidth = _c === void 0 ? false : _c, PropInput = props.Input, PropMessage = props.Message, _d = props.messageActions, messageActions = _d === void 0 ? Object.keys(MESSAGE_ACTIONS) : _d, virtualized = props.virtualized;
9435
+ var _e = useChannelStateContext('Thread'), thread = _e.thread, threadHasMore = _e.threadHasMore, threadLoadingMore = _e.threadLoadingMore, threadMessages = _e.threadMessages;
9436
+ var _f = useChannelActionContext('Thread'), closeThread = _f.closeThread, loadMoreThread = _f.loadMoreThread, sendMessage = _f.sendMessage;
9428
9437
  var customClasses = useChatContext('Thread').customClasses;
9429
- var _f = useComponentContext('Thread'), ContextInput = _f.ThreadInput, ContextMessage = _f.Message, _g = _f.ThreadHeader, ThreadHeader = _g === void 0 ? DefaultThreadHeader : _g, _h = _f.ThreadStart, ThreadStart = _h === void 0 ? DefaultThreadStart : _h, _j = _f.VirtualMessage, VirtualMessage = _j === void 0 ? FixedHeightMessage : _j;
9438
+ var _g = useComponentContext('Thread'), ContextInput = _g.ThreadInput, ContextMessage = _g.Message, _h = _g.ThreadHeader, ThreadHeader = _h === void 0 ? DefaultThreadHeader : _h, _j = _g.ThreadStart, ThreadStart = _j === void 0 ? DefaultThreadStart : _j, _k = _g.VirtualMessage, VirtualMessage = _k === void 0 ? FixedHeightMessage : _k;
9430
9439
  var messageList = React.useRef(null);
9431
9440
  var ThreadInput = PropInput || (additionalMessageInputProps === null || additionalMessageInputProps === void 0 ? void 0 : additionalMessageInputProps.Input) || ContextInput || MessageInputSmall;
9432
9441
  var ThreadMessage = PropMessage || (additionalMessageListProps === null || additionalMessageListProps === void 0 ? void 0 : additionalMessageListProps.Message);
@@ -9458,7 +9467,7 @@ var ThreadInner = function (props) {
9458
9467
  React__default['default'].createElement("div", { className: 'str-chat__thread-list', ref: messageList },
9459
9468
  React__default['default'].createElement(Message, __assign({ initialMessage: true, message: thread, Message: ThreadMessage || FallbackMessage, threadList: true }, additionalParentMessageProps)),
9460
9469
  React__default['default'].createElement(ThreadStart, null),
9461
- React__default['default'].createElement(ThreadMessageList, __assign({ disableDateSeparator: !enableDateSeparator, hasMore: threadHasMore, loadingMore: threadLoadingMore, loadMore: loadMoreThread, Message: ThreadMessage || FallbackMessage, messages: threadMessages || [], threadList: true }, (virtualized ? additionalVirtualizedMessageListProps : additionalMessageListProps)))),
9470
+ React__default['default'].createElement(ThreadMessageList, __assign({ disableDateSeparator: !enableDateSeparator, hasMore: threadHasMore, loadingMore: threadLoadingMore, loadMore: loadMoreThread, Message: ThreadMessage || FallbackMessage, messageActions: messageActions, messages: threadMessages || [], threadList: true }, (virtualized ? additionalVirtualizedMessageListProps : additionalMessageListProps)))),
9462
9471
  React__default['default'].createElement(MessageInput, __assign({ focus: autoFocus, Input: ThreadInput, overrideSubmitHandler: threadSubmitHandler, parent: thread, publishTypingEvent: false }, additionalMessageInputProps))));
9463
9472
  };
9464
9473