stream-chat-react 9.1.4 → 9.3.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 (41) hide show
  1. package/dist/browser.full-bundle.js +106 -80
  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.map +1 -1
  6. package/dist/components/Channel/Channel.js +3 -6
  7. package/dist/components/Channel/channelState.d.ts.map +1 -1
  8. package/dist/components/Channel/channelState.js +2 -2
  9. package/dist/components/ChatAutoComplete/ChatAutoComplete.d.ts +12 -1
  10. package/dist/components/ChatAutoComplete/ChatAutoComplete.d.ts.map +1 -1
  11. package/dist/components/Message/Message.d.ts.map +1 -1
  12. package/dist/components/Message/Message.js +1 -1
  13. package/dist/components/Message/MessageStatus.d.ts +2 -0
  14. package/dist/components/Message/MessageStatus.d.ts.map +1 -1
  15. package/dist/components/Message/MessageStatus.js +4 -4
  16. package/dist/components/Message/hooks/useUserRole.d.ts.map +1 -1
  17. package/dist/components/Message/hooks/useUserRole.js +17 -3
  18. package/dist/components/Message/types.d.ts +2 -0
  19. package/dist/components/Message/types.d.ts.map +1 -1
  20. package/dist/components/Message/utils.d.ts +10 -1
  21. package/dist/components/Message/utils.d.ts.map +1 -1
  22. package/dist/components/Message/utils.js +13 -4
  23. package/dist/components/MessageActions/MessageActionsBox.js +1 -1
  24. package/dist/components/MessageList/VirtualizedMessageList.d.ts +0 -2
  25. package/dist/components/MessageList/VirtualizedMessageList.d.ts.map +1 -1
  26. package/dist/components/MessageList/VirtualizedMessageList.js +11 -8
  27. package/dist/context/MessageContext.d.ts +2 -0
  28. package/dist/context/MessageContext.d.ts.map +1 -1
  29. package/dist/css/index.css +1 -1
  30. package/dist/index.cjs.js +53 -29
  31. package/dist/index.cjs.js.map +1 -1
  32. package/dist/scss/Message.scss +1 -1
  33. package/dist/stories/hello.stories.js +1 -1
  34. package/dist/stories/message-status-readby-tooltip.stories.d.ts +4 -0
  35. package/dist/stories/message-status-readby-tooltip.stories.d.ts.map +1 -0
  36. package/dist/stories/message-status-readby-tooltip.stories.js +58 -0
  37. package/dist/stories/navigate-long-message-lists.stories.d.ts.map +1 -1
  38. package/dist/stories/navigate-long-message-lists.stories.js +22 -2
  39. package/dist/version.d.ts +1 -1
  40. package/dist/version.js +1 -1
  41. package/package.json +5 -5
package/dist/index.cjs.js CHANGED
@@ -2547,7 +2547,7 @@ var channelReducer = function (state, action) {
2547
2547
  }
2548
2548
  case 'loadMoreFinished': {
2549
2549
  var hasMore = action.hasMore, messages = action.messages;
2550
- return __assign(__assign({}, state), { hasMore: hasMore, loadingMore: false, messages: messages });
2550
+ return __assign(__assign({}, state), { hasMore: hasMore, loadingMore: false, messages: messages, suppressAutoscroll: false });
2551
2551
  }
2552
2552
  case 'loadMoreNewerFinished': {
2553
2553
  var hasMoreNewer = action.hasMoreNewer, messages = action.messages;
@@ -2568,7 +2568,7 @@ var channelReducer = function (state, action) {
2568
2568
  case 'setLoadingMore': {
2569
2569
  var loadingMore = action.loadingMore;
2570
2570
  // suppress the autoscroll behavior
2571
- return __assign(__assign({}, state), { loadingMore: loadingMore, suppressAutoscroll: true });
2571
+ return __assign(__assign({}, state), { loadingMore: loadingMore, suppressAutoscroll: loadingMore });
2572
2572
  }
2573
2573
  case 'setLoadingMoreNewer': {
2574
2574
  var loadingMoreNewer = action.loadingMoreNewer;
@@ -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'] ||
@@ -3166,15 +3180,24 @@ var getNonImageAttachments = function (message) {
3166
3180
  }
3167
3181
  return message.attachments.filter(function (item) { return item.type !== 'image'; });
3168
3182
  };
3169
- var getReadByTooltipText = function (users, t, client) {
3183
+ /**
3184
+ * Default Tooltip Username mapper implementation.
3185
+ *
3186
+ * @param user the user.
3187
+ */
3188
+ var mapToUserNameOrId = function (user) { return user.name || user.id; };
3189
+ var getReadByTooltipText = function (users, t, client, tooltipUserNameMapper) {
3170
3190
  var outStr = '';
3171
3191
  if (!t) {
3172
- throw new Error('`getReadByTooltipText was called, but translation function is not available`');
3192
+ throw new Error('getReadByTooltipText was called, but translation function is not available');
3193
+ }
3194
+ if (!tooltipUserNameMapper) {
3195
+ throw new Error('getReadByTooltipText was called, but tooltipUserNameMapper function is not available');
3173
3196
  }
3174
3197
  // first filter out client user, so restLength won't count it
3175
3198
  var otherUsers = users
3176
3199
  .filter(function (item) { return item && (client === null || client === void 0 ? void 0 : client.user) && item.id !== client.user.id; })
3177
- .map(function (item) { return item.name || item.id; });
3200
+ .map(tooltipUserNameMapper);
3178
3201
  var slicedArr = otherUsers.slice(0, 5);
3179
3202
  var restLength = otherUsers.length - slicedArr.length;
3180
3203
  if (slicedArr.length === 1) {
@@ -3193,7 +3216,7 @@ var getReadByTooltipText = function (users, t, client) {
3193
3216
  // example: "bob, joe, sam and 4 more"
3194
3217
  if (restLength === 0) {
3195
3218
  // mutate slicedArr to remove last user to display it separately
3196
- var lastUser = slicedArr.splice(slicedArr.length - 2, 1);
3219
+ var lastUser = slicedArr.splice(slicedArr.length - 1, 1);
3197
3220
  outStr = t('{{ commaSeparatedUsers }}, and {{ lastUser }}', {
3198
3221
  commaSeparatedUsers: slicedArr.join(', '),
3199
3222
  lastUser: lastUser,
@@ -3310,7 +3333,7 @@ var UnMemoizedMessageActionsBox = function (props) {
3310
3333
  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 },
3311
3334
  React__default['default'].createElement("div", { "aria-label": 'Message Options', className: 'str-chat__message-actions-list', role: 'listbox' },
3312
3335
  customMessageActions && (React__default['default'].createElement(CustomMessageActionsList, { customMessageActions: customMessageActions, message: message })),
3313
- 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'))),
3336
+ 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'))),
3314
3337
  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'))),
3315
3338
  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'))),
3316
3339
  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'))),
@@ -3446,10 +3469,10 @@ var Tooltip = function (props) {
3446
3469
 
3447
3470
  var UnMemoizedMessageStatus = function (props) {
3448
3471
  var _a;
3449
- var propAvatar = props.Avatar, _b = props.messageType, messageType = _b === void 0 ? 'simple' : _b;
3472
+ var propAvatar = props.Avatar, _b = props.messageType, messageType = _b === void 0 ? 'simple' : _b, _c = props.tooltipUserNameMapper, tooltipUserNameMapper = _c === void 0 ? mapToUserNameOrId : _c;
3450
3473
  var client = useChatContext('MessageStatus').client;
3451
3474
  var contextAvatar = useComponentContext('MessageStatus').Avatar;
3452
- var _c = useMessageContext('MessageStatus'), isMyMessage = _c.isMyMessage, lastReceivedId = _c.lastReceivedId, message = _c.message, readBy = _c.readBy, threadList = _c.threadList;
3475
+ var _d = useMessageContext('MessageStatus'), isMyMessage = _d.isMyMessage, lastReceivedId = _d.lastReceivedId, message = _d.message, readBy = _d.readBy, threadList = _d.threadList;
3453
3476
  var t = useTranslationContext('MessageStatus').t;
3454
3477
  var Avatar$1 = propAvatar || contextAvatar || Avatar;
3455
3478
  if (!isMyMessage() || message.type === 'error') {
@@ -3464,7 +3487,7 @@ var UnMemoizedMessageStatus = function (props) {
3464
3487
  if ((readBy === null || readBy === void 0 ? void 0 : readBy.length) && !threadList && !justReadByMe) {
3465
3488
  var lastReadUser = readBy.filter(function (item) { var _a; return item.id !== ((_a = client.user) === null || _a === void 0 ? void 0 : _a.id); })[0];
3466
3489
  return (React__default['default'].createElement("span", { className: "str-chat__message-" + messageType + "-status", "data-testid": 'message-status-read-by' },
3467
- React__default['default'].createElement(Tooltip, null, getReadByTooltipText(readBy, t, client)),
3490
+ React__default['default'].createElement(Tooltip, null, getReadByTooltipText(readBy, t, client, tooltipUserNameMapper)),
3468
3491
  React__default['default'].createElement(Avatar$1, { image: lastReadUser.image, name: lastReadUser.name || lastReadUser.id, size: 15, user: lastReadUser }),
3469
3492
  readBy.length > 2 && (React__default['default'].createElement("span", { className: "str-chat__message-" + messageType + "-status-number", "data-testid": 'message-status-read-by-many' }, readBy.length - 1))));
3470
3493
  }
@@ -6525,19 +6548,16 @@ var ChannelInner = function (props) {
6525
6548
  }
6526
6549
  });
6527
6550
  }); };
6528
- var createMessagePreview = function (text, attachments, parent, mentioned_users) {
6529
- var clientSideID = client.userID + "-" + nanoid.nanoid();
6530
- 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));
6531
- };
6532
6551
  var sendMessage = function (_a, customMessageData) {
6533
- 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;
6552
+ 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;
6534
6553
  return __awaiter(void 0, void 0, void 0, function () {
6535
6554
  var messagePreview;
6555
+ var _e;
6536
6556
  return __generator(this, function (_f) {
6537
6557
  switch (_f.label) {
6538
6558
  case 0:
6539
6559
  channel.state.filterErrorMessages();
6540
- messagePreview = createMessagePreview(text, attachments, parent, mentioned_users);
6560
+ 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));
6541
6561
  updateMessage(messagePreview);
6542
6562
  return [4 /*yield*/, doSendMessage(messagePreview, customMessageData)];
6543
6563
  case 1:
@@ -7671,7 +7691,7 @@ var UnMemoizedChannelList = function (props) {
7671
7691
  */
7672
7692
  var ChannelList = React__default['default'].memo(UnMemoizedChannelList);
7673
7693
 
7674
- var version = '9.1.4';
7694
+ var version = '9.3.0';
7675
7695
 
7676
7696
  var useChat = function (_a) {
7677
7697
  var _b, _c;
@@ -8122,7 +8142,7 @@ var Message = function (props) {
8122
8142
  }), canPin = _d.canPin, handlePin = _d.handlePin;
8123
8143
  var _e = useReactionClick(message, reactionSelectorRef, undefined, closeReactionSelectorOnClick), isReactionEnabled = _e.isReactionEnabled, onReactionListClick = _e.onReactionListClick, showDetailedReactions = _e.showDetailedReactions;
8124
8144
  var highlighted = highlightedMessageId === message.id;
8125
- 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 }));
8145
+ 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 }));
8126
8146
  };
8127
8147
 
8128
8148
  var MessageCommerceWithContext = function (props) {
@@ -9299,7 +9319,7 @@ var VirtualizedMessageListWithContext = function (props) {
9299
9319
  return isAtBottom ? stickToBottomScrollBehavior : false;
9300
9320
  };
9301
9321
  var messageRenderer = React.useCallback(function (messageList, virtuosoIndex) {
9302
- var _a, _b, _c, _d, _e, _f, _g, _h;
9322
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
9303
9323
  var streamMessageIndex = virtuosoIndex + numItemsPrepended - PREPEND_OFFSET;
9304
9324
  // use custom renderer supplied by client if present and skip the rest
9305
9325
  if (customMessageRenderer) {
@@ -9319,17 +9339,20 @@ var VirtualizedMessageListWithContext = function (props) {
9319
9339
  ((_a = message.user) === null || _a === void 0 ? void 0 : _a.id) === ((_b = messageList[streamMessageIndex - 1].user) === null || _b === void 0 ? void 0 : _b.id);
9320
9340
  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);
9321
9341
  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);
9322
- return (React__default['default'].createElement(Message, { closeReactionSelectorOnClick: closeReactionSelectorOnClick, customMessageActions: props.customMessageActions, endOfGroup: endOfGroup, firstOfGroup: firstOfGroup, groupedByUser: groupedByUser, message: message, Message: MessageUIComponent, messageActions: props.messageActions }));
9342
+ 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 }));
9323
9343
  }, [customMessageRenderer, shouldGroupByUser, numItemsPrepended]);
9344
+ var Item = React.useMemo(function () {
9345
+ // using 'display: inline-block'
9346
+ // traps CSS margins of the item elements, preventing incorrect item measurements
9347
+ 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' }))); };
9348
+ return Item;
9349
+ }, [customClasses === null || customClasses === void 0 ? void 0 : customClasses.virtualMessage]);
9324
9350
  var virtuosoComponents = React.useMemo(function () {
9325
9351
  var EmptyPlaceholder = function () { return (React__default['default'].createElement(React__default['default'].Fragment, null, EmptyStateIndicator$1 && React__default['default'].createElement(EmptyStateIndicator$1, { listType: 'message' }))); };
9326
9352
  var Header = function () {
9327
9353
  return loadingMore ? (React__default['default'].createElement("div", { className: 'str-chat__virtual-list__loading' },
9328
9354
  React__default['default'].createElement(LoadingIndicator$1, { size: 20 }))) : (React__default['default'].createElement(React__default['default'].Fragment, null));
9329
9355
  };
9330
- var virtualMessageClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.virtualMessage) || 'str-chat__virtual-list-message-wrapper';
9331
- // using 'display: inline-block' traps CSS margins of the item elements, preventing incorrect item measurements
9332
- var Item = function (props) { return React__default['default'].createElement("div", __assign({}, props, { className: virtualMessageClass })); };
9333
9356
  var Footer = function () {
9334
9357
  return TypingIndicator ? React__default['default'].createElement(TypingIndicator, { avatarSize: 24 }) : React__default['default'].createElement(React__default['default'].Fragment, null);
9335
9358
  };
@@ -9369,15 +9392,15 @@ var VirtualizedMessageListWithContext = function (props) {
9369
9392
  return null;
9370
9393
  return (React__default['default'].createElement(React__default['default'].Fragment, null,
9371
9394
  React__default['default'].createElement("div", { className: (customClasses === null || customClasses === void 0 ? void 0 : customClasses.virtualizedMessageList) || 'str-chat__virtual-list' },
9372
- 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 } : {})))),
9395
+ React__default['default'].createElement(reactVirtuoso.Virtuoso, __assign({ atBottomStateChange: atBottomStateChange, components: virtuosoComponents, computeItemKey: function (index) {
9396
+ return processedMessages[numItemsPrepended + index - PREPEND_OFFSET].id;
9397
+ }, 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 } : {})))),
9373
9398
  React__default['default'].createElement(MessageListNotifications$1, { hasNewMessages: newMessagesNotification, isNotAtLatestMessageSet: hasMoreNewer, MessageNotification: MessageNotification$1, notifications: notifications, scrollToBottom: scrollToBottom }),
9374
9399
  giphyPreviewMessage && React__default['default'].createElement(GiphyPreviewMessage$1, { message: giphyPreviewMessage })));
9375
9400
  };
9376
9401
  /**
9377
9402
  * The VirtualizedMessageList component renders a list of messages in a virtualized list.
9378
9403
  * 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).
9379
- *
9380
- * **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.
9381
9404
  */
9382
9405
  function VirtualizedMessageList(props) {
9383
9406
  var _a = useChannelActionContext('VirtualizedMessageList'), jumpToLatestMessage = _a.jumpToLatestMessage, loadMore = _a.loadMore, loadMoreNewer = _a.loadMoreNewer;
@@ -9624,6 +9647,7 @@ exports.itTranslations = itTranslations;
9624
9647
  exports.jaTranslations = jaTranslations;
9625
9648
  exports.koTranslations = koTranslations;
9626
9649
  exports.makeDateMessageId = makeDateMessageId;
9650
+ exports.mapToUserNameOrId = mapToUserNameOrId;
9627
9651
  exports.markDownRenderers = markDownRenderers;
9628
9652
  exports.matchMarkdownLinks = matchMarkdownLinks;
9629
9653
  exports.mentionsMarkdownPlugin = mentionsMarkdownPlugin;