stream-chat-react 6.6.0 → 6.8.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 (113) hide show
  1. package/README.md +1 -1
  2. package/dist/browser.full-bundle.js +2810 -336
  3. package/dist/browser.full-bundle.js.map +1 -1
  4. package/dist/browser.full-bundle.min.js +10 -3
  5. package/dist/browser.full-bundle.min.js.map +1 -1
  6. package/dist/components/AutoCompleteTextarea/Textarea.js +1 -1
  7. package/dist/components/Channel/Channel.d.ts +2 -0
  8. package/dist/components/Channel/Channel.d.ts.map +1 -1
  9. package/dist/components/Channel/Channel.js +17 -9
  10. package/dist/components/ChannelList/ChannelList.d.ts +3 -3
  11. package/dist/components/ChannelList/ChannelList.d.ts.map +1 -1
  12. package/dist/components/ChannelList/ChannelList.js +10 -6
  13. package/dist/components/ChannelList/hooks/useNotificationAddedToChannelListener.d.ts +1 -1
  14. package/dist/components/ChannelList/hooks/useNotificationAddedToChannelListener.d.ts.map +1 -1
  15. package/dist/components/ChannelList/hooks/useNotificationAddedToChannelListener.js +3 -2
  16. package/dist/components/ChannelList/hooks/useNotificationMessageNewListener.d.ts +1 -1
  17. package/dist/components/ChannelList/hooks/useNotificationMessageNewListener.d.ts.map +1 -1
  18. package/dist/components/ChannelList/hooks/useNotificationMessageNewListener.js +3 -3
  19. package/dist/components/ChannelPreview/ChannelPreview.d.ts.map +1 -1
  20. package/dist/components/ChannelPreview/ChannelPreview.js +10 -0
  21. package/dist/components/Chat/Chat.d.ts +3 -0
  22. package/dist/components/Chat/Chat.d.ts.map +1 -1
  23. package/dist/components/Chat/Chat.js +2 -1
  24. package/dist/components/Message/Message.d.ts.map +1 -1
  25. package/dist/components/Message/Message.js +1 -1
  26. package/dist/components/Message/MessageOptions.d.ts +3 -0
  27. package/dist/components/Message/MessageOptions.d.ts.map +1 -1
  28. package/dist/components/Message/MessageOptions.js +6 -6
  29. package/dist/components/Message/MessageSimple.d.ts.map +1 -1
  30. package/dist/components/Message/MessageSimple.js +4 -4
  31. package/dist/components/Message/MessageStatus.d.ts.map +1 -1
  32. package/dist/components/Message/MessageStatus.js +1 -1
  33. package/dist/components/Message/hooks/useReactionHandler.d.ts +1 -1
  34. package/dist/components/Message/hooks/useReactionHandler.d.ts.map +1 -1
  35. package/dist/components/Message/hooks/useReactionHandler.js +1 -5
  36. package/dist/components/Message/icons.d.ts +1 -0
  37. package/dist/components/Message/icons.d.ts.map +1 -1
  38. package/dist/components/Message/icons.js +2 -0
  39. package/dist/components/Message/types.d.ts +4 -0
  40. package/dist/components/Message/types.d.ts.map +1 -1
  41. package/dist/components/Message/utils.d.ts.map +1 -1
  42. package/dist/components/Message/utils.js +4 -0
  43. package/dist/components/MessageActions/MessageActions.d.ts +1 -0
  44. package/dist/components/MessageActions/MessageActions.d.ts.map +1 -1
  45. package/dist/components/MessageActions/MessageActions.js +6 -6
  46. package/dist/components/MessageInput/DefaultTriggerProvider.d.ts.map +1 -1
  47. package/dist/components/MessageInput/DefaultTriggerProvider.js +1 -0
  48. package/dist/components/MessageInput/MessageInput.d.ts +2 -0
  49. package/dist/components/MessageInput/MessageInput.d.ts.map +1 -1
  50. package/dist/components/MessageInput/hooks/useMessageInputState.d.ts +1 -0
  51. package/dist/components/MessageInput/hooks/useMessageInputState.d.ts.map +1 -1
  52. package/dist/components/MessageInput/hooks/useMessageInputState.js +6 -1
  53. package/dist/components/MessageInput/hooks/useMessageInputText.js +1 -1
  54. package/dist/components/MessageInput/hooks/useSubmitHandler.d.ts.map +1 -1
  55. package/dist/components/MessageInput/hooks/useSubmitHandler.js +2 -1
  56. package/dist/components/MessageInput/hooks/useUserTrigger.d.ts +1 -0
  57. package/dist/components/MessageInput/hooks/useUserTrigger.d.ts.map +1 -1
  58. package/dist/components/MessageInput/hooks/useUserTrigger.js +19 -13
  59. package/dist/components/MessageInput/hooks/utils.d.ts +15 -0
  60. package/dist/components/MessageInput/hooks/utils.d.ts.map +1 -0
  61. package/dist/components/MessageInput/hooks/utils.js +114 -0
  62. package/dist/components/MessageList/MessageList.d.ts.map +1 -1
  63. package/dist/components/MessageList/MessageList.js +5 -1
  64. package/dist/components/MessageList/VirtualizedMessageList.d.ts +2 -2
  65. package/dist/components/MessageList/VirtualizedMessageList.d.ts.map +1 -1
  66. package/dist/components/MessageList/VirtualizedMessageList.js +20 -12
  67. package/dist/components/MessageList/hooks/useMessageListElements.d.ts.map +1 -1
  68. package/dist/components/MessageList/hooks/useMessageListElements.js +4 -3
  69. package/dist/components/Thread/Thread.d.ts.map +1 -1
  70. package/dist/components/Thread/Thread.js +4 -1
  71. package/dist/components/UserItem/UserItem.js +1 -1
  72. package/dist/context/ChatContext.d.ts +4 -0
  73. package/dist/context/ChatContext.d.ts.map +1 -1
  74. package/dist/context/MessageContext.d.ts +4 -0
  75. package/dist/context/MessageContext.d.ts.map +1 -1
  76. package/dist/css/index.css +1 -7261
  77. package/dist/index.cjs.js +214 -83
  78. package/dist/index.cjs.js.map +1 -1
  79. package/dist/scss/ActionsBox.scss +2 -0
  80. package/dist/scss/Attachment.scss +4 -0
  81. package/dist/scss/AttachmentActions.scss +1 -0
  82. package/dist/scss/Audio.scss +2 -0
  83. package/dist/scss/Avatar.scss +2 -0
  84. package/dist/scss/Card.scss +6 -2
  85. package/dist/scss/ChannelHeader.scss +22 -3
  86. package/dist/scss/ChannelList.scss +5 -6
  87. package/dist/scss/ChannelSearch.scss +2 -4
  88. package/dist/scss/ChatDown.scss +1 -0
  89. package/dist/scss/DateSeparator.scss +3 -0
  90. package/dist/scss/EditMessageForm.scss +4 -0
  91. package/dist/scss/EventComponent.scss +4 -0
  92. package/dist/scss/Gallery.scss +7 -1
  93. package/dist/scss/LoadMoreButton.scss +1 -0
  94. package/dist/scss/Message.scss +82 -6
  95. package/dist/scss/MessageInput.scss +3 -0
  96. package/dist/scss/MessageInputFlat.scss +8 -1
  97. package/dist/scss/MessageList.scss +10 -0
  98. package/dist/scss/MessageRepliesCountButton.scss +1 -0
  99. package/dist/scss/MessageTeam.scss +3 -7
  100. package/dist/scss/Modal.scss +3 -0
  101. package/dist/scss/ReactionList.scss +18 -18
  102. package/dist/scss/ReactionSelector.scss +4 -0
  103. package/dist/scss/SimpleReactionsList.scss +2 -1
  104. package/dist/scss/Thread.scss +19 -0
  105. package/dist/scss/TypingIndicator.scss +7 -0
  106. package/dist/scss/VirtualMessage.scss +121 -6
  107. package/dist/scss/_base.scss +17 -2
  108. package/dist/version.d.ts +1 -1
  109. package/dist/version.js +1 -1
  110. package/package.json +9 -28
  111. package/CHANGELOG.md +0 -1520
  112. package/dist/css/index.js +0 -1
  113. package/dist/css/index.min.css +0 -1
package/dist/index.cjs.js CHANGED
@@ -1377,7 +1377,7 @@ var ReactTextareaAutocomplete = /*#__PURE__*/function (_React$Component) {
1377
1377
  };
1378
1378
  }
1379
1379
 
1380
- if (!textToReplace.text) {
1380
+ if (!textToReplace.text && currentTrigger !== ':') {
1381
1381
  throw new Error("Output \"text\" is not defined! Object should has shape {text: string, caretPosition: string | number}. Check the implementation for trigger \"".concat(currentTrigger, "\" and its token \"").concat(actualToken, "\"\n"));
1382
1382
  }
1383
1383
 
@@ -2191,6 +2191,8 @@ var MessageDeleted = function (props) {
2191
2191
  React__default['default'].createElement("div", { className: 'str-chat__message--deleted-inner' }, t('This message was deleted...'))));
2192
2192
  };
2193
2193
 
2194
+ var ActionsIcon = function () { return (React__default['default'].createElement("svg", { height: '4', viewBox: '0 0 11 4', width: '11', xmlns: 'http://www.w3.org/2000/svg' },
2195
+ React__default['default'].createElement("path", { d: 'M1.5 3a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm4 0a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm4 0a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3z', fillRule: 'nonzero' }))); };
2194
2196
  var ReplyIcon = function () { return (React__default['default'].createElement("svg", { height: '15', width: '18', xmlns: 'http://www.w3.org/2000/svg' },
2195
2197
  React__default['default'].createElement("path", { d: 'M.56 10.946H.06l-.002-.498L.025.92a.5.5 0 1 1 1-.004l.032 9.029H9.06v-4l9 4.5-9 4.5v-4H.56z', fillRule: 'nonzero' }))); };
2196
2198
  var DeliveredCheckIcon = function () { return (React__default['default'].createElement("svg", { height: '16', width: '16', xmlns: 'http://www.w3.org/2000/svg' },
@@ -2374,6 +2376,8 @@ var areMessagePropsEqual = function (prevProps, nextProps) {
2374
2376
  var nextMessage = nextProps.message, nextMessageUI = nextProps.Message;
2375
2377
  if (prevMessageUI !== nextMessageUI)
2376
2378
  return false;
2379
+ if (prevProps.endOfGroup !== nextProps.endOfGroup)
2380
+ return false;
2377
2381
  if (nextProps.showDetailedReactions !== prevProps.showDetailedReactions) {
2378
2382
  return false;
2379
2383
  }
@@ -2403,6 +2407,8 @@ var areMessageUIPropsEqual = function (prevProps, nextProps) {
2403
2407
  var nextLastReceivedId = nextProps.lastReceivedId, nextMessage = nextProps.message;
2404
2408
  if (prevProps.editing !== nextProps.editing)
2405
2409
  return false;
2410
+ if (prevProps.endOfGroup !== nextProps.endOfGroup)
2411
+ return false;
2406
2412
  if (((_a = prevProps.mutes) === null || _a === void 0 ? void 0 : _a.length) !== ((_b = nextProps.mutes) === null || _b === void 0 ? void 0 : _b.length))
2407
2413
  return false;
2408
2414
  if (((_c = prevProps.readBy) === null || _c === void 0 ? void 0 : _c.length) !== ((_d = nextProps.readBy) === null || _d === void 0 ? void 0 : _d.length))
@@ -2593,16 +2599,16 @@ var UnMemoizedMessageActionsBox = function (props) {
2593
2599
  var MessageActionsBox = React__default['default'].memo(UnMemoizedMessageActionsBox);
2594
2600
 
2595
2601
  var MessageActions = function (props) {
2596
- var _a = props.customWrapperClass, customWrapperClass = _a === void 0 ? '' : _a, propGetMessageActions = props.getMessageActions, propHandleDelete = props.handleDelete, propHandleFlag = props.handleFlag, propHandleMute = props.handleMute, propHandlePin = props.handlePin, inline = props.inline, propMessage = props.message, messageWrapperRef = props.messageWrapperRef, mine = props.mine;
2602
+ var _a = props.ActionsIcon, ActionsIcon$1 = _a === void 0 ? ActionsIcon : _a, _b = props.customWrapperClass, customWrapperClass = _b === void 0 ? '' : _b, propGetMessageActions = props.getMessageActions, propHandleDelete = props.handleDelete, propHandleFlag = props.handleFlag, propHandleMute = props.handleMute, propHandlePin = props.handlePin, inline = props.inline, propMessage = props.message, messageWrapperRef = props.messageWrapperRef, mine = props.mine;
2597
2603
  var mutes = useChatContext().mutes;
2598
- var _b = useMessageContext(), contextGetMessageActions = _b.getMessageActions, contextHandleDelete = _b.handleDelete, contextHandleFlag = _b.handleFlag, contextHandleMute = _b.handleMute, contextHandlePin = _b.handlePin, isMyMessage = _b.isMyMessage, contextMessage = _b.message, setEditingState = _b.setEditingState;
2604
+ var _c = useMessageContext(), customMessageActions = _c.customMessageActions, contextGetMessageActions = _c.getMessageActions, contextHandleDelete = _c.handleDelete, contextHandleFlag = _c.handleFlag, contextHandleMute = _c.handleMute, contextHandlePin = _c.handlePin, isMyMessage = _c.isMyMessage, contextMessage = _c.message, setEditingState = _c.setEditingState;
2599
2605
  var getMessageActions = propGetMessageActions || contextGetMessageActions;
2600
2606
  var handleDelete = propHandleDelete || contextHandleDelete;
2601
2607
  var handleFlag = propHandleFlag || contextHandleFlag;
2602
2608
  var handleMute = propHandleMute || contextHandleMute;
2603
2609
  var handlePin = propHandlePin || contextHandlePin;
2604
2610
  var message = propMessage || contextMessage;
2605
- var _c = React.useState(false), actionsBoxOpen = _c[0], setActionsBoxOpen = _c[1];
2611
+ var _d = React.useState(false), actionsBoxOpen = _d[0], setActionsBoxOpen = _d[1];
2606
2612
  var isMuted = React.useCallback(function () { return isUserMuted(message, mutes); }, [message, mutes]);
2607
2613
  var hideOptions = React.useCallback(function () { return setActionsBoxOpen(false); }, []);
2608
2614
  var messageActions = getMessageActions();
@@ -2626,12 +2632,11 @@ var MessageActions = function (props) {
2626
2632
  }
2627
2633
  return function () { return document.removeEventListener('click', hideOptions); };
2628
2634
  }, [actionsBoxOpen, hideOptions]);
2629
- if (messageActions.length === 0)
2635
+ if (!messageActions.length && !customMessageActions)
2630
2636
  return null;
2631
2637
  return (React__default['default'].createElement(MessageActionsWrapper, { customWrapperClass: customWrapperClass, inline: inline, setActionsBoxOpen: setActionsBoxOpen },
2632
2638
  React__default['default'].createElement(MessageActionsBox, { getMessageActions: getMessageActions, handleDelete: handleDelete, handleEdit: setEditingState, handleFlag: handleFlag, handleMute: handleMute, handlePin: handlePin, isUserMuted: isMuted, mine: mine ? mine() : isMyMessage(), open: actionsBoxOpen }),
2633
- React__default['default'].createElement("svg", { height: '4', viewBox: '0 0 11 4', width: '11', xmlns: 'http://www.w3.org/2000/svg' },
2634
- React__default['default'].createElement("path", { d: 'M1.5 3a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm4 0a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm4 0a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3z', fillRule: 'nonzero' }))));
2639
+ React__default['default'].createElement(ActionsIcon$1, null)));
2635
2640
  };
2636
2641
  var MessageActionsWrapper = function (props) {
2637
2642
  var children = props.children, customWrapperClass = props.customWrapperClass, inline = props.inline, setActionsBoxOpen = props.setActionsBoxOpen;
@@ -2652,11 +2657,11 @@ var MessageActionsWrapper = function (props) {
2652
2657
  };
2653
2658
 
2654
2659
  var UnMemoizedMessageOptions = function (props) {
2655
- var _a = props.displayLeft, displayLeft = _a === void 0 ? true : _a, _b = props.displayReplies, displayReplies = _b === void 0 ? true : _b, propHandleOpenThread = props.handleOpenThread, messageWrapperRef = props.messageWrapperRef, _c = props.theme, theme = _c === void 0 ? 'simple' : _c;
2656
- var _d = useMessageContext(), getMessageActions = _d.getMessageActions, contextHandleOpenThread = _d.handleOpenThread, initialMessage = _d.initialMessage, isMyMessage = _d.isMyMessage, message = _d.message, onReactionListClick = _d.onReactionListClick, threadList = _d.threadList;
2660
+ var _a = props.ActionsIcon, ActionsIcon$1 = _a === void 0 ? ActionsIcon : _a, _b = props.displayLeft, displayLeft = _b === void 0 ? true : _b, _c = props.displayReplies, displayReplies = _c === void 0 ? true : _c, propHandleOpenThread = props.handleOpenThread, messageWrapperRef = props.messageWrapperRef, _d = props.ReactionIcon, ReactionIcon$1 = _d === void 0 ? ReactionIcon : _d, _e = props.theme, theme = _e === void 0 ? 'simple' : _e, _f = props.ThreadIcon, ThreadIcon$1 = _f === void 0 ? ThreadIcon : _f;
2661
+ var _g = useMessageContext(), customMessageActions = _g.customMessageActions, getMessageActions = _g.getMessageActions, contextHandleOpenThread = _g.handleOpenThread, initialMessage = _g.initialMessage, isMyMessage = _g.isMyMessage, message = _g.message, onReactionListClick = _g.onReactionListClick, threadList = _g.threadList;
2657
2662
  var handleOpenThread = propHandleOpenThread || contextHandleOpenThread;
2658
2663
  var messageActions = getMessageActions();
2659
- var showActionsBox = showMessageActionsBox(messageActions);
2664
+ var showActionsBox = showMessageActionsBox(messageActions) || !!customMessageActions;
2660
2665
  var shouldShowReactions = messageActions.indexOf(MESSAGE_ACTIONS.react) > -1;
2661
2666
  var shouldShowReplies = messageActions.indexOf(MESSAGE_ACTIONS.reply) > -1 && displayReplies && !threadList;
2662
2667
  if (!message.type ||
@@ -2670,18 +2675,18 @@ var UnMemoizedMessageOptions = function (props) {
2670
2675
  }
2671
2676
  if (isMyMessage() && displayLeft) {
2672
2677
  return (React__default['default'].createElement("div", { className: "str-chat__message-" + theme + "__actions", "data-testid": 'message-options-left' },
2673
- showActionsBox && React__default['default'].createElement(MessageActions, { messageWrapperRef: messageWrapperRef }),
2678
+ showActionsBox && (React__default['default'].createElement(MessageActions, { ActionsIcon: ActionsIcon$1, messageWrapperRef: messageWrapperRef })),
2674
2679
  shouldShowReplies && (React__default['default'].createElement("div", { className: "str-chat__message-" + theme + "__actions__action str-chat__message-" + theme + "__actions__action--thread", "data-testid": 'thread-action', onClick: handleOpenThread },
2675
- React__default['default'].createElement(ThreadIcon, null))),
2680
+ React__default['default'].createElement(ThreadIcon$1, null))),
2676
2681
  shouldShowReactions && (React__default['default'].createElement("div", { className: "str-chat__message-" + theme + "__actions__action str-chat__message-" + theme + "__actions__action--reactions", "data-testid": 'message-reaction-action', onClick: onReactionListClick },
2677
- React__default['default'].createElement(ReactionIcon, null)))));
2682
+ React__default['default'].createElement(ReactionIcon$1, null)))));
2678
2683
  }
2679
2684
  return (React__default['default'].createElement("div", { className: "str-chat__message-" + theme + "__actions", "data-testid": 'message-options' },
2680
2685
  shouldShowReactions && (React__default['default'].createElement("div", { className: "str-chat__message-" + theme + "__actions__action str-chat__message-" + theme + "__actions__action--reactions", "data-testid": 'message-reaction-action', onClick: onReactionListClick },
2681
- React__default['default'].createElement(ReactionIcon, null))),
2686
+ React__default['default'].createElement(ReactionIcon$1, null))),
2682
2687
  shouldShowReplies && (React__default['default'].createElement("div", { className: "str-chat__message-" + theme + "__actions__action str-chat__message-" + theme + "__actions__action--thread", "data-testid": 'thread-action', onClick: handleOpenThread },
2683
- React__default['default'].createElement(ThreadIcon, null))),
2684
- showActionsBox && React__default['default'].createElement(MessageActions, { messageWrapperRef: messageWrapperRef })));
2688
+ React__default['default'].createElement(ThreadIcon$1, null))),
2689
+ showActionsBox && (React__default['default'].createElement(MessageActions, { ActionsIcon: ActionsIcon$1, messageWrapperRef: messageWrapperRef }))));
2685
2690
  };
2686
2691
  var MessageOptions = React__default['default'].memo(UnMemoizedMessageOptions);
2687
2692
 
@@ -2743,7 +2748,7 @@ var UnMemoizedMessageStatus = function (props) {
2743
2748
  var lastReadUser = readBy.filter(function (item) { var _a; return item.id !== ((_a = client.user) === null || _a === void 0 ? void 0 : _a.id); })[0];
2744
2749
  return (React__default['default'].createElement("span", { className: "str-chat__message-" + messageType + "-status", "data-testid": 'message-status-read-by' },
2745
2750
  React__default['default'].createElement(Tooltip, null, getReadByTooltipText(readBy, t, client)),
2746
- React__default['default'].createElement(Avatar$1, { image: lastReadUser.image, name: lastReadUser.name, size: 15, user: lastReadUser }),
2751
+ React__default['default'].createElement(Avatar$1, { image: lastReadUser.image, name: lastReadUser.name || lastReadUser.id, size: 15, user: lastReadUser }),
2747
2752
  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))));
2748
2753
  }
2749
2754
  if (message.status === 'received' && message.id === lastReceivedId && !threadList) {
@@ -3106,7 +3111,7 @@ var usePinHandler = function (message, permissions, notifications) {
3106
3111
  return { canPin: canPin(), handlePin: handlePin };
3107
3112
  };
3108
3113
 
3109
- var reactionHandlerWarning = "Reaction handler was called, but it is missing one of its required arguments. \nMake sure the ChannelAction and ChannelState contexts are properly set and the hook is initialized with a valid message.";
3114
+ var reactionHandlerWarning = "Reaction handler was called, but it is missing one of its required arguments.\nMake sure the ChannelAction and ChannelState contexts are properly set and the hook is initialized with a valid message.";
3110
3115
  var useReactionHandler = function (message) {
3111
3116
  var updateMessage = useChannelActionContext().updateMessage;
3112
3117
  var channel = useChannelStateContext().channel;
@@ -3245,14 +3250,12 @@ var useReactionClick = function (message, reactionSelectorRef, messageWrapperRef
3245
3250
  if (showDetailedReactions && !hasListener.current) {
3246
3251
  hasListener.current = true;
3247
3252
  document.addEventListener('click', closeDetailedReactions);
3248
- document.addEventListener('touchend', closeDetailedReactions);
3249
3253
  if (messageWrapper) {
3250
3254
  messageWrapper.addEventListener('mouseleave', closeDetailedReactions);
3251
3255
  }
3252
3256
  }
3253
3257
  if (!showDetailedReactions && hasListener.current) {
3254
3258
  document.removeEventListener('click', closeDetailedReactions);
3255
- document.removeEventListener('touchend', closeDetailedReactions);
3256
3259
  if (messageWrapper) {
3257
3260
  messageWrapper.removeEventListener('mouseleave', closeDetailedReactions);
3258
3261
  }
@@ -3261,7 +3264,6 @@ var useReactionClick = function (message, reactionSelectorRef, messageWrapperRef
3261
3264
  return function () {
3262
3265
  if (hasListener.current) {
3263
3266
  document.removeEventListener('click', closeDetailedReactions);
3264
- document.removeEventListener('touchend', closeDetailedReactions);
3265
3267
  if (messageWrapper) {
3266
3268
  messageWrapper.removeEventListener('mouseleave', closeDetailedReactions);
3267
3269
  }
@@ -3273,7 +3275,6 @@ var useReactionClick = function (message, reactionSelectorRef, messageWrapperRef
3273
3275
  var messageWrapper = messageWrapperRef === null || messageWrapperRef === void 0 ? void 0 : messageWrapperRef.current;
3274
3276
  if (messageDeleted && hasListener.current) {
3275
3277
  document.removeEventListener('click', closeDetailedReactions);
3276
- document.removeEventListener('touchend', closeDetailedReactions);
3277
3278
  if (messageWrapper) {
3278
3279
  messageWrapper.removeEventListener('mouseleave', closeDetailedReactions);
3279
3280
  }
@@ -3511,6 +3512,85 @@ var useEmojiTrigger = function (emojiIndex) { return ({
3511
3512
  }); },
3512
3513
  }); };
3513
3514
 
3515
+ var accentsMap = {
3516
+ a: 'á|à|ã|â|À|Á|Ã|Â',
3517
+ c: 'ç|Ç',
3518
+ e: 'é|è|ê|É|È|Ê',
3519
+ i: 'í|ì|î|Í|Ì|Î',
3520
+ n: 'ñ|Ñ',
3521
+ o: 'ó|ò|ô|õ|Ó|Ò|Ô|Õ',
3522
+ u: 'ú|ù|û|ü|Ú|Ù|Û|Ü',
3523
+ };
3524
+ var removeDiacritics = function (text) {
3525
+ if (!text)
3526
+ return '';
3527
+ return Object.keys(accentsMap).reduce(function (acc, current) { return acc.replace(new RegExp(accentsMap[current], 'g'), current); }, text);
3528
+ };
3529
+ var calculateLevenshtein = function (query, name) {
3530
+ if (query.length === 0)
3531
+ return name.length;
3532
+ if (name.length === 0)
3533
+ return query.length;
3534
+ var matrix = [];
3535
+ var i;
3536
+ for (i = 0; i <= name.length; i++) {
3537
+ matrix[i] = [i];
3538
+ }
3539
+ var j;
3540
+ for (j = 0; j <= query.length; j++) {
3541
+ matrix[0][j] = j;
3542
+ }
3543
+ for (i = 1; i <= name.length; i++) {
3544
+ for (j = 1; j <= query.length; j++) {
3545
+ if (name.charAt(i - 1) === query.charAt(j - 1)) {
3546
+ matrix[i][j] = matrix[i - 1][j - 1];
3547
+ }
3548
+ else {
3549
+ matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, // substitution
3550
+ Math.min(matrix[i][j - 1] + 1, // insertion
3551
+ matrix[i - 1][j] + 1)); // deletion
3552
+ }
3553
+ }
3554
+ }
3555
+ return matrix[name.length][query.length];
3556
+ };
3557
+ var searchLocalUsers = function (params) {
3558
+ var ownUserId = params.ownUserId, query = params.query, useMentionsTransliteration = params.useMentionsTransliteration, users = params.users;
3559
+ var matchingUsers = users.filter(function (user) {
3560
+ if (user.id === ownUserId)
3561
+ return false;
3562
+ if (!query)
3563
+ return true;
3564
+ var updatedId = removeDiacritics(user.id).toLowerCase();
3565
+ var updatedName = removeDiacritics(user.name).toLowerCase();
3566
+ var updatedQuery = removeDiacritics(query).toLowerCase();
3567
+ if (useMentionsTransliteration) {
3568
+ (function () { return __awaiter(void 0, void 0, void 0, function () {
3569
+ var transliterate;
3570
+ return __generator(this, function (_a) {
3571
+ switch (_a.label) {
3572
+ case 0: return [4 /*yield*/, Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require('@sindresorhus/transliterate')); })];
3573
+ case 1:
3574
+ transliterate = (_a.sent()).default;
3575
+ updatedName = transliterate(user.name || '').toLowerCase();
3576
+ updatedQuery = transliterate(query).toLowerCase();
3577
+ updatedId = transliterate(user.id).toLowerCase();
3578
+ return [2 /*return*/];
3579
+ }
3580
+ });
3581
+ }); })();
3582
+ }
3583
+ if (updatedName) {
3584
+ var levenshtein_1 = calculateLevenshtein(updatedQuery, updatedName);
3585
+ if (updatedName.includes(updatedQuery) || levenshtein_1 <= 3)
3586
+ return true;
3587
+ }
3588
+ var levenshtein = calculateLevenshtein(updatedQuery, updatedId);
3589
+ return updatedId.includes(updatedQuery) || levenshtein <= 3;
3590
+ });
3591
+ return matchingUsers;
3592
+ };
3593
+
3514
3594
  /**
3515
3595
  * UI component for mentions rendered in suggestion list
3516
3596
  */
@@ -3527,13 +3607,13 @@ var UnMemoizedUserItem = function (props) {
3527
3607
  }));
3528
3608
  };
3529
3609
  return (React__default['default'].createElement("div", { className: 'str-chat__user-item' },
3530
- React__default['default'].createElement(Avatar$1, { image: entity.image, size: 20 }),
3610
+ React__default['default'].createElement(Avatar$1, { image: entity.image, name: entity.name || entity.id, size: 20 }),
3531
3611
  React__default['default'].createElement("span", { className: 'str-chat__user-item--name', "data-testid": 'user-item-name' }, renderName())));
3532
3612
  };
3533
3613
  var UserItem = React__default['default'].memo(UnMemoizedUserItem);
3534
3614
 
3535
3615
  var useUserTrigger = function (params) {
3536
- var disableMentions = params.disableMentions, mentionAllAppUsers = params.mentionAllAppUsers, _a = params.mentionQueryParams, mentionQueryParams = _a === void 0 ? {} : _a, onSelectUser = params.onSelectUser;
3616
+ var disableMentions = params.disableMentions, mentionAllAppUsers = params.mentionAllAppUsers, _a = params.mentionQueryParams, mentionQueryParams = _a === void 0 ? {} : _a, onSelectUser = params.onSelectUser, useMentionsTransliteration = params.useMentionsTransliteration;
3537
3617
  var _b = React.useState(false), searching = _b[0], setSearching = _b[1];
3538
3618
  var _c = useChatContext(), client = _c.client, mutes = _c.mutes;
3539
3619
  var channel = useChannelStateContext().channel;
@@ -3617,14 +3697,22 @@ var useUserTrigger = function (params) {
3617
3697
  return {
3618
3698
  callback: function (item) { return onSelectUser(item); },
3619
3699
  component: UserItem,
3620
- dataProvider: function (query, _, onReady) {
3700
+ dataProvider: function (query, text, onReady) {
3621
3701
  var _a;
3622
3702
  if (disableMentions)
3623
3703
  return;
3624
3704
  var filterMutes = function (data) {
3705
+ if (text.includes('/unmute') && !mutes.length) {
3706
+ return [];
3707
+ }
3625
3708
  if (!mutes.length)
3626
3709
  return data;
3627
- return data.filter(function (suggestion) { return mutes.some(function (mute) { return mute.target.id === suggestion.id; }); });
3710
+ if (text.includes('/unmute')) {
3711
+ return data.filter(function (suggestion) {
3712
+ return mutes.some(function (mute) { return mute.target.id === suggestion.id; });
3713
+ });
3714
+ }
3715
+ return data.filter(function (suggestion) { return mutes.every(function (mute) { return mute.target.id !== suggestion.id; }); });
3628
3716
  };
3629
3717
  if (mentionAllAppUsers) {
3630
3718
  return queryUsersThrottled(query, function (data) {
@@ -3640,16 +3728,13 @@ var useUserTrigger = function (params) {
3640
3728
  */
3641
3729
  if (!query || Object.values(members || {}).length < 100) {
3642
3730
  var users = getMembersAndWatchers();
3643
- var matchingUsers = users.filter(function (user) {
3644
- if (user.id === client.userID)
3645
- return false;
3646
- if (!query)
3647
- return true;
3648
- if (user.name !== undefined && user.name.toLowerCase().includes(query.toLowerCase())) {
3649
- return true;
3650
- }
3651
- return user.id.toLowerCase().includes(query.toLowerCase());
3652
- });
3731
+ var params_1 = {
3732
+ ownUserId: client.userID,
3733
+ query: query,
3734
+ useMentionsTransliteration: useMentionsTransliteration,
3735
+ users: users,
3736
+ };
3737
+ var matchingUsers = searchLocalUsers(params_1);
3653
3738
  var usersToShow = ((_a = mentionQueryParams.options) === null || _a === void 0 ? void 0 : _a.limit) || 10;
3654
3739
  var data = matchingUsers.slice(0, usersToShow);
3655
3740
  if (onReady)
@@ -3696,6 +3781,7 @@ var DefaultTriggerProvider = function (_a) {
3696
3781
  mentionAllAppUsers: currentValue.mentionAllAppUsers,
3697
3782
  mentionQueryParams: currentValue.mentionQueryParams,
3698
3783
  onSelectUser: currentValue.onSelectUser,
3784
+ useMentionsTransliteration: currentValue.useMentionsTransliteration,
3699
3785
  }),
3700
3786
  };
3701
3787
  var newValue = __assign(__assign({}, currentValue), { autocompleteTriggers: defaultAutocompleteTriggers });
@@ -4193,7 +4279,7 @@ var useAttachments = function (props, state, dispatch) {
4193
4279
 
4194
4280
  var useMessageInputText = function (props, state, dispatch) {
4195
4281
  var channel = useChannelStateContext().channel;
4196
- var additionalTextareaProps = props.additionalTextareaProps, focus = props.focus, parent = props.parent, publishTypingEvent = props.publishTypingEvent;
4282
+ var additionalTextareaProps = props.additionalTextareaProps, focus = props.focus, parent = props.parent, _a = props.publishTypingEvent, publishTypingEvent = _a === void 0 ? true : _a;
4197
4283
  var text = state.text;
4198
4284
  var textareaRef = React.useRef();
4199
4285
  // Focus
@@ -4394,10 +4480,11 @@ var useSubmitHandler = function (props, state, dispatch, numberOfUploads) {
4394
4480
  text: text,
4395
4481
  };
4396
4482
  if (!message) return [3 /*break*/, 5];
4483
+ delete message.i18n;
4397
4484
  _a.label = 1;
4398
4485
  case 1:
4399
4486
  _a.trys.push([1, 3, , 4]);
4400
- return [4 /*yield*/, editMessage(__assign(__assign({}, updatedMessage), { id: message.id }))];
4487
+ return [4 /*yield*/, editMessage(__assign(__assign({}, message), updatedMessage))];
4401
4488
  case 2:
4402
4489
  _a.sent();
4403
4490
  if (clearEditingState)
@@ -4511,6 +4598,7 @@ var initState = function (message) {
4511
4598
  imageOrder: [],
4512
4599
  imageUploads: __assign({}, emptyImageUploads),
4513
4600
  mentioned_users: [],
4601
+ setText: function () { return null; },
4514
4602
  text: '',
4515
4603
  };
4516
4604
  }
@@ -4562,6 +4650,7 @@ var initState = function (message) {
4562
4650
  imageOrder: imageOrder,
4563
4651
  imageUploads: imageUploads,
4564
4652
  mentioned_users: mentioned_users,
4653
+ setText: function () { return null; },
4565
4654
  text: message.text || '',
4566
4655
  };
4567
4656
  };
@@ -4650,12 +4739,15 @@ var useMessageInputState = function (props) {
4650
4739
  var onSelectUser = React.useCallback(function (item) {
4651
4740
  dispatch({ type: 'addMentionedUser', user: item });
4652
4741
  }, []);
4742
+ var setText = React.useCallback(function (text) {
4743
+ dispatch({ getNewText: function () { return text; }, type: 'setText' });
4744
+ }, []);
4653
4745
  return __assign(__assign({}, state), { closeCommandsList: closeCommandsList,
4654
4746
  /**
4655
4747
  * TODO: fix the below at some point because this type casting is wrong
4656
4748
  * and just forced to not have warnings currently with the unknown casting
4657
4749
  */
4658
- closeEmojiPicker: closeEmojiPicker, emojiIndex: useEmojiIndex(), emojiPickerRef: emojiPickerRef, handleChange: handleChange, handleEmojiKeyDown: handleEmojiKeyDown, handleSubmit: handleSubmit, insertText: insertText, isUploadEnabled: isUploadEnabled, maxFilesLeft: maxFilesLeft, numberOfUploads: numberOfUploads, onPaste: onPaste, onSelectEmoji: onSelectEmoji, onSelectUser: onSelectUser, openCommandsList: openCommandsList, openEmojiPicker: openEmojiPicker, removeFile: removeFile, removeImage: removeImage, showCommandsList: showCommandsList, textareaRef: textareaRef, uploadFile: uploadFile, uploadImage: uploadImage, uploadNewFiles: uploadNewFiles });
4750
+ closeEmojiPicker: closeEmojiPicker, emojiIndex: useEmojiIndex(), emojiPickerRef: emojiPickerRef, handleChange: handleChange, handleEmojiKeyDown: handleEmojiKeyDown, handleSubmit: handleSubmit, insertText: insertText, isUploadEnabled: isUploadEnabled, maxFilesLeft: maxFilesLeft, numberOfUploads: numberOfUploads, onPaste: onPaste, onSelectEmoji: onSelectEmoji, onSelectUser: onSelectUser, openCommandsList: openCommandsList, openEmojiPicker: openEmojiPicker, removeFile: removeFile, removeImage: removeImage, setText: setText, showCommandsList: showCommandsList, textareaRef: textareaRef, uploadFile: uploadFile, uploadImage: uploadImage, uploadNewFiles: uploadNewFiles });
4659
4751
  };
4660
4752
 
4661
4753
  var QuotedMessagePreviewHeader = function () {
@@ -5037,7 +5129,7 @@ var SimpleReactionsList = React__default['default'].memo(UnMemoizedSimpleReactio
5037
5129
 
5038
5130
  var MessageSimpleWithContext = function (props) {
5039
5131
  var _a;
5040
- var additionalMessageInputProps = props.additionalMessageInputProps, clearEditingState = props.clearEditingState, editing = props.editing, handleAction = props.handleAction, handleOpenThread = props.handleOpenThread, handleRetry = props.handleRetry, isMyMessage = props.isMyMessage, isReactionEnabled = props.isReactionEnabled, message = props.message, onUserClick = props.onUserClick, onUserHover = props.onUserHover, reactionSelectorRef = props.reactionSelectorRef, showDetailedReactions = props.showDetailedReactions, threadList = props.threadList;
5132
+ var additionalMessageInputProps = props.additionalMessageInputProps, clearEditingState = props.clearEditingState, editing = props.editing, endOfGroup = props.endOfGroup, firstOfGroup = props.firstOfGroup, groupedByUser = props.groupedByUser, handleAction = props.handleAction, handleOpenThread = props.handleOpenThread, handleRetry = props.handleRetry, isMyMessage = props.isMyMessage, isReactionEnabled = props.isReactionEnabled, message = props.message, onUserClick = props.onUserClick, onUserHover = props.onUserHover, reactionSelectorRef = props.reactionSelectorRef, showDetailedReactions = props.showDetailedReactions, threadList = props.threadList;
5041
5133
  var _b = useComponentContext(), Attachment = _b.Attachment, _c = _b.Avatar, Avatar$1 = _c === void 0 ? Avatar : _c, _d = _b.EditMessageInput, EditMessageInput = _d === void 0 ? EditMessageForm : _d, _e = _b.MessageDeleted, MessageDeleted$1 = _e === void 0 ? MessageDeleted : _e, _f = _b.MessageOptions, MessageOptions$1 = _f === void 0 ? MessageOptions : _f, _g = _b.MessageRepliesCountButton, MessageRepliesCountButton$1 = _g === void 0 ? MessageRepliesCountButton : _g, _h = _b.MessageStatus, MessageStatus$1 = _h === void 0 ? MessageStatus : _h, _j = _b.MessageTimestamp, MessageTimestamp$1 = _j === void 0 ? MessageTimestamp : _j, _k = _b.ReactionSelector, ReactionSelector$1 = _k === void 0 ? ReactionSelector : _k, _l = _b.ReactionsList, ReactionsList$1 = _l === void 0 ? ReactionsList : _l;
5042
5134
  var messageWrapperRef = React.useRef(null);
5043
5135
  var hasAttachment = messageHasAttachments(message);
@@ -5054,7 +5146,7 @@ var MessageSimpleWithContext = function (props) {
5054
5146
  return (React__default['default'].createElement(React__default['default'].Fragment, null,
5055
5147
  editing && (React__default['default'].createElement(Modal, { onClose: clearEditingState, open: editing },
5056
5148
  React__default['default'].createElement(MessageInput, __assign({ clearEditingState: clearEditingState, Input: EditMessageInput, message: message }, additionalMessageInputProps)))),
5057
- React__default['default'].createElement("div", { className: ("\n\t\t\t\t\t\t" + messageClasses + "\n\t\t\t\t\t\tstr-chat__message--" + message.type + "\n\t\t\t\t\t\tstr-chat__message--" + message.status + "\n\t\t\t\t\t\t" + (message.text ? 'str-chat__message--has-text' : 'has-no-text') + "\n\t\t\t\t\t\t" + (hasAttachment ? 'str-chat__message--has-attachment' : '') + "\n " + (hasReactions && isReactionEnabled ? 'str-chat__message--with-reactions' : '') + "\n " + (message.pinned ? 'pinned-message' : '') + "\n\t\t\t\t\t").trim(), key: message.id, ref: messageWrapperRef },
5149
+ React__default['default'].createElement("div", { className: ("\n\t\t\t\t\t\t" + messageClasses + "\n\t\t\t\t\t\tstr-chat__message--" + message.type + "\n\t\t\t\t\t\tstr-chat__message--" + message.status + "\n\t\t\t\t\t\t" + (message.text ? 'str-chat__message--has-text' : 'has-no-text') + "\n\t\t\t\t\t\t" + (hasAttachment ? 'str-chat__message--has-attachment' : '') + "\n " + (hasReactions && isReactionEnabled ? 'str-chat__message--with-reactions' : '') + "\n " + (message.pinned ? 'pinned-message' : '') + "\n " + (groupedByUser ? 'str-chat__virtual-message__wrapper--group' : '') + "\n " + (firstOfGroup ? 'str-chat__virtual-message__wrapper--first' : '') + "\n " + (endOfGroup ? 'str-chat__virtual-message__wrapper--end' : '') + "\n\t\t\t\t\t").trim(), key: message.id, ref: messageWrapperRef },
5058
5150
  React__default['default'].createElement(MessageStatus$1, null),
5059
5151
  message.user && (React__default['default'].createElement(Avatar$1, { image: message.user.image, name: message.user.name || message.user.id, onClick: onUserClick, onMouseOver: onUserHover, user: message.user })),
5060
5152
  React__default['default'].createElement("div", { className: 'str-chat__message-inner', "data-testid": 'message-inner', onClick: message.status === 'failed' && message.errorStatusCode !== 403
@@ -5069,9 +5161,9 @@ var MessageSimpleWithContext = function (props) {
5069
5161
  message.mml && (React__default['default'].createElement(MML, { actionHandler: handleAction, align: isMyMessage() ? 'right' : 'left', source: message.mml })),
5070
5162
  !threadList && !!message.reply_count && (React__default['default'].createElement("div", { className: 'str-chat__message-simple-reply-button' },
5071
5163
  React__default['default'].createElement(MessageRepliesCountButton$1, { onClick: handleOpenThread, reply_count: message.reply_count }))),
5072
- React__default['default'].createElement("div", { className: "str-chat__message-data str-chat__message-simple-data" },
5164
+ (!groupedByUser || endOfGroup) && (React__default['default'].createElement("div", { className: "str-chat__message-data str-chat__message-simple-data" },
5073
5165
  !isMyMessage() && message.user ? (React__default['default'].createElement("span", { className: 'str-chat__message-simple-name' }, message.user.name || message.user.id)) : null,
5074
- React__default['default'].createElement(MessageTimestamp$1, { calendar: true, customClass: 'str-chat__message-simple-timestamp' }))))));
5166
+ React__default['default'].createElement(MessageTimestamp$1, { calendar: true, customClass: 'str-chat__message-simple-timestamp' })))))));
5075
5167
  };
5076
5168
  var MemoizedMessageSimple = React__default['default'].memo(MessageSimpleWithContext, areMessageUIPropsEqual);
5077
5169
  /**
@@ -5115,8 +5207,8 @@ var UnMemoizedChannel = function (props) {
5115
5207
  return React__default['default'].createElement(ChannelInner, __assign({}, props, { channel: channel, key: channel.cid }));
5116
5208
  };
5117
5209
  var ChannelInner = function (props) {
5118
- var acceptedFiles = props.acceptedFiles, channel = props.channel, children = props.children, doMarkReadRequest = props.doMarkReadRequest, doSendMessageRequest = props.doSendMessageRequest, doUpdateMessageRequest = props.doUpdateMessageRequest, _a = props.emojiData, emojiData = _a === void 0 ? defaultEmojiData : _a, _b = props.LoadingErrorIndicator, LoadingErrorIndicator$1 = _b === void 0 ? LoadingErrorIndicator : _b, _c = props.LoadingIndicator, LoadingIndicator$1 = _c === void 0 ? LoadingIndicator : _c, maxNumberOfFiles = props.maxNumberOfFiles, _d = props.multipleUploads, multipleUploads = _d === void 0 ? true : _d, onMentionsClick = props.onMentionsClick, onMentionsHover = props.onMentionsHover;
5119
- var _e = useChatContext(), client = _e.client, mutes = _e.mutes, theme = _e.theme, useImageFlagEmojisOnWindows = _e.useImageFlagEmojisOnWindows;
5210
+ var acceptedFiles = props.acceptedFiles, activeUnreadHandler = props.activeUnreadHandler, channel = props.channel, children = props.children, doMarkReadRequest = props.doMarkReadRequest, doSendMessageRequest = props.doSendMessageRequest, doUpdateMessageRequest = props.doUpdateMessageRequest, _a = props.emojiData, emojiData = _a === void 0 ? defaultEmojiData : _a, _b = props.LoadingErrorIndicator, LoadingErrorIndicator$1 = _b === void 0 ? LoadingErrorIndicator : _b, _c = props.LoadingIndicator, LoadingIndicator$1 = _c === void 0 ? LoadingIndicator : _c, maxNumberOfFiles = props.maxNumberOfFiles, _d = props.multipleUploads, multipleUploads = _d === void 0 ? true : _d, onMentionsClick = props.onMentionsClick, onMentionsHover = props.onMentionsHover;
5211
+ var _e = useChatContext(), client = _e.client, customClasses = _e.customClasses, mutes = _e.mutes, theme = _e.theme, useImageFlagEmojisOnWindows = _e.useImageFlagEmojisOnWindows;
5120
5212
  var t = useTranslationContext().t;
5121
5213
  var _f = React.useState([]), notifications = _f[0], setNotifications = _f[1];
5122
5214
  var _g = React.useState(), quotedMessage = _g[0], setQuotedMessage = _g[1];
@@ -5185,7 +5277,12 @@ var ChannelInner = function (props) {
5185
5277
  }
5186
5278
  else if (((_e = channel.getConfig()) === null || _e === void 0 ? void 0 : _e.read_events) && !channel.muteStatus().muted) {
5187
5279
  var unread = channel.countUnread(lastRead.current);
5188
- document.title = "(" + unread + ") " + originalTitle.current;
5280
+ if (activeUnreadHandler) {
5281
+ activeUnreadHandler(unread, originalTitle.current);
5282
+ }
5283
+ else {
5284
+ document.title = "(" + unread + ") " + originalTitle.current;
5285
+ }
5189
5286
  }
5190
5287
  }
5191
5288
  }
@@ -5569,21 +5666,24 @@ var ChannelInner = function (props) {
5569
5666
  var typingContextValue = {
5570
5667
  typing: typing,
5571
5668
  };
5669
+ var chatClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.chat) || 'str-chat';
5670
+ var channelClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.channel) || 'str-chat-channel';
5671
+ var windowsEmojiClass = useImageFlagEmojisOnWindows && navigator.userAgent.match(/Win/)
5672
+ ? 'str-chat--windows-flags'
5673
+ : '';
5572
5674
  if (state.error) {
5573
- return (React__default['default'].createElement("div", { className: "str-chat str-chat-channel " + theme },
5675
+ return (React__default['default'].createElement("div", { className: chatClass + " " + channelClass + " " + theme },
5574
5676
  React__default['default'].createElement(LoadingErrorIndicator$1, { error: state.error })));
5575
5677
  }
5576
5678
  if (state.loading) {
5577
- return (React__default['default'].createElement("div", { className: "str-chat str-chat-channel " + theme },
5679
+ return (React__default['default'].createElement("div", { className: chatClass + " " + channelClass + " " + theme },
5578
5680
  React__default['default'].createElement(LoadingIndicator$1, { size: 25 })));
5579
5681
  }
5580
5682
  if (!(channel === null || channel === void 0 ? void 0 : channel.watch)) {
5581
- return (React__default['default'].createElement("div", { className: "str-chat str-chat-channel " + theme },
5683
+ return (React__default['default'].createElement("div", { className: chatClass + " " + channelClass + " " + theme },
5582
5684
  React__default['default'].createElement("div", null, t('Channel Missing'))));
5583
5685
  }
5584
- return (React__default['default'].createElement("div", { className: "str-chat str-chat-channel " + theme + (useImageFlagEmojisOnWindows && navigator.platform.match(/Win/)
5585
- ? ' str-chat--windows-flags'
5586
- : '') },
5686
+ return (React__default['default'].createElement("div", { className: chatClass + " " + channelClass + " " + theme + " " + windowsEmojiClass },
5587
5687
  React__default['default'].createElement(ChannelStateProvider, { value: channelStateContextValue },
5588
5688
  React__default['default'].createElement(ChannelActionProvider, { value: channelActionContextValue },
5589
5689
  React__default['default'].createElement(ComponentProvider, { value: componentContextValue },
@@ -5873,7 +5973,8 @@ var useMobileNavigation = function (channelListRef, navOpen, closeMobileNav) {
5873
5973
  }, [channelListRef, closeMobileNav, navOpen]);
5874
5974
  };
5875
5975
 
5876
- var useNotificationAddedToChannelListener = function (setChannels, customHandler) {
5976
+ var useNotificationAddedToChannelListener = function (setChannels, customHandler, allowNewMessagesFromUnfilteredChannels) {
5977
+ if (allowNewMessagesFromUnfilteredChannels === void 0) { allowNewMessagesFromUnfilteredChannels = true; }
5877
5978
  var client = useChatContext().client;
5878
5979
  React.useEffect(function () {
5879
5980
  var handleEvent = function (event) { return __awaiter(void 0, void 0, void 0, function () {
@@ -5886,7 +5987,7 @@ var useNotificationAddedToChannelListener = function (setChannels, customHandler
5886
5987
  customHandler(setChannels, event);
5887
5988
  return [3 /*break*/, 3];
5888
5989
  case 1:
5889
- if (!((_a = event.channel) === null || _a === void 0 ? void 0 : _a.type)) return [3 /*break*/, 3];
5990
+ if (!(allowNewMessagesFromUnfilteredChannels && ((_a = event.channel) === null || _a === void 0 ? void 0 : _a.type))) return [3 /*break*/, 3];
5890
5991
  return [4 /*yield*/, getChannel(client, event.channel.type, event.channel.id)];
5891
5992
  case 2:
5892
5993
  channel_1 = _b.sent();
@@ -5903,7 +6004,8 @@ var useNotificationAddedToChannelListener = function (setChannels, customHandler
5903
6004
  }, [customHandler]);
5904
6005
  };
5905
6006
 
5906
- var useNotificationMessageNewListener = function (setChannels, customHandler, setOffset) {
6007
+ var useNotificationMessageNewListener = function (setChannels, customHandler, setOffset, allowNewMessagesFromUnfilteredChannels) {
6008
+ if (allowNewMessagesFromUnfilteredChannels === void 0) { allowNewMessagesFromUnfilteredChannels = true; }
5907
6009
  var client = useChatContext().client;
5908
6010
  React.useEffect(function () {
5909
6011
  var handleEvent = function (event) { return __awaiter(void 0, void 0, void 0, function () {
@@ -5916,11 +6018,10 @@ var useNotificationMessageNewListener = function (setChannels, customHandler, se
5916
6018
  customHandler(setChannels, event);
5917
6019
  return [3 /*break*/, 3];
5918
6020
  case 1:
5919
- if (!((_a = event.channel) === null || _a === void 0 ? void 0 : _a.type)) return [3 /*break*/, 3];
6021
+ if (!(allowNewMessagesFromUnfilteredChannels && ((_a = event.channel) === null || _a === void 0 ? void 0 : _a.type))) return [3 /*break*/, 3];
5920
6022
  return [4 /*yield*/, getChannel(client, event.channel.type, event.channel.id)];
5921
6023
  case 2:
5922
6024
  channel_1 = _b.sent();
5923
- // move channel to starting position
5924
6025
  setChannels(function (channels) { return uniqBy__default['default'](__spreadArray([channel_1], channels), 'cid'); });
5925
6026
  _b.label = 3;
5926
6027
  case 3:
@@ -6150,6 +6251,16 @@ var ChannelPreview = function (props) {
6150
6251
  var _e = React.useState(0), unread = _e[0], setUnread = _e[1];
6151
6252
  var isActive = (activeChannel === null || activeChannel === void 0 ? void 0 : activeChannel.cid) === channel.cid;
6152
6253
  var muted = useIsChannelMuted(channel).muted;
6254
+ React.useEffect(function () {
6255
+ var handleEvent = function (event) {
6256
+ if (!event.cid)
6257
+ return setUnread(0);
6258
+ if (channel.cid === event.cid)
6259
+ setUnread(0);
6260
+ };
6261
+ client.on('notification.mark_read', handleEvent);
6262
+ return function () { return client.off('notification.mark_read', handleEvent); };
6263
+ }, []);
6153
6264
  React.useEffect(function () {
6154
6265
  if (isActive || muted) {
6155
6266
  setUnread(0);
@@ -6412,7 +6523,7 @@ var DEFAULT_OPTIONS = {};
6412
6523
  var DEFAULT_SORT = {};
6413
6524
  var UnMemoizedChannelList = function (props) {
6414
6525
  var additionalChannelSearchProps = props.additionalChannelSearchProps, _a = props.Avatar, Avatar$1 = _a === void 0 ? Avatar : _a, allowNewMessagesFromUnfilteredChannels = props.allowNewMessagesFromUnfilteredChannels, channelRenderFilterFn = props.channelRenderFilterFn, _b = props.ChannelSearch, ChannelSearch$1 = _b === void 0 ? ChannelSearch : _b, customActiveChannel = props.customActiveChannel, _c = props.EmptyStateIndicator, EmptyStateIndicator$1 = _c === void 0 ? EmptyStateIndicator : _c, filters = props.filters, _d = props.LoadingErrorIndicator, LoadingErrorIndicator = _d === void 0 ? ChatDown : _d, _e = props.LoadingIndicator, LoadingIndicator = _e === void 0 ? LoadingChannels : _e, _f = props.List, List = _f === void 0 ? ChannelListMessenger : _f, lockChannelOrder = props.lockChannelOrder, onAddedToChannel = props.onAddedToChannel, onChannelDeleted = props.onChannelDeleted, onChannelHidden = props.onChannelHidden, onChannelTruncated = props.onChannelTruncated, onChannelUpdated = props.onChannelUpdated, onChannelVisible = props.onChannelVisible, onMessageNew = props.onMessageNew, onRemovedFromChannel = props.onRemovedFromChannel, options = props.options, _g = props.Paginator, Paginator = _g === void 0 ? LoadMorePaginator : _g, Preview = props.Preview, _h = props.sendChannelsToList, sendChannelsToList = _h === void 0 ? false : _h, _j = props.setActiveChannelOnMount, setActiveChannelOnMount = _j === void 0 ? true : _j, _k = props.showChannelSearch, showChannelSearch = _k === void 0 ? false : _k, _l = props.sort, sort = _l === void 0 ? DEFAULT_SORT : _l, _m = props.watchers, watchers = _m === void 0 ? {} : _m;
6415
- var _o = useChatContext(), channel = _o.channel, client = _o.client, closeMobileNav = _o.closeMobileNav, _p = _o.navOpen, navOpen = _p === void 0 ? false : _p, setActiveChannel = _o.setActiveChannel, theme = _o.theme, useImageFlagEmojisOnWindows = _o.useImageFlagEmojisOnWindows;
6526
+ var _o = useChatContext(), channel = _o.channel, client = _o.client, closeMobileNav = _o.closeMobileNav, customClasses = _o.customClasses, _p = _o.navOpen, navOpen = _p === void 0 ? false : _p, setActiveChannel = _o.setActiveChannel, theme = _o.theme, useImageFlagEmojisOnWindows = _o.useImageFlagEmojisOnWindows;
6416
6527
  var channelListRef = React.useRef(null);
6417
6528
  var _q = React.useState(0), channelUpdateCount = _q[0], setChannelUpdateCount = _q[1];
6418
6529
  /**
@@ -6463,8 +6574,8 @@ var UnMemoizedChannelList = function (props) {
6463
6574
  var loadedChannels = channelRenderFilterFn ? channelRenderFilterFn(channels) : channels;
6464
6575
  useMobileNavigation(channelListRef, navOpen, closeMobileNav);
6465
6576
  useMessageNewListener(setChannels, lockChannelOrder, allowNewMessagesFromUnfilteredChannels);
6466
- useNotificationMessageNewListener(setChannels, onMessageNew, setOffset);
6467
- useNotificationAddedToChannelListener(setChannels, onAddedToChannel);
6577
+ useNotificationMessageNewListener(setChannels, onMessageNew, setOffset, allowNewMessagesFromUnfilteredChannels);
6578
+ useNotificationAddedToChannelListener(setChannels, onAddedToChannel, allowNewMessagesFromUnfilteredChannels);
6468
6579
  useNotificationRemovedFromChannelListener(setChannels, onRemovedFromChannel);
6469
6580
  useChannelDeletedListener(setChannels, onChannelDeleted);
6470
6581
  useChannelHiddenListener(setChannels, onChannelHidden);
@@ -6502,10 +6613,14 @@ var UnMemoizedChannelList = function (props) {
6502
6613
  return React__default['default'].createElement(ChannelPreview, __assign({}, previewProps));
6503
6614
  };
6504
6615
  var renderList = function () { return (React__default['default'].createElement(List, { error: status.error, loadedChannels: sendChannelsToList ? loadedChannels : undefined, loading: status.loadingChannels, LoadingErrorIndicator: LoadingErrorIndicator, LoadingIndicator: LoadingIndicator }, !loadedChannels || loadedChannels.length === 0 ? (React__default['default'].createElement(EmptyStateIndicator$1, { listType: 'channel' })) : (React__default['default'].createElement(Paginator, { hasNextPage: hasNextPage, loadNextPage: loadNextPage, refreshing: status.refreshing }, loadedChannels.map(renderChannel))))); };
6616
+ var chatClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.chat) || 'str-chat';
6617
+ var channelListClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.channelList) || 'str-chat-channel-list';
6618
+ var navigationClass = navOpen ? 'str-chat-channel-list--open' : '';
6619
+ var windowsEmojiClass = useImageFlagEmojisOnWindows && navigator.userAgent.match(/Win/)
6620
+ ? 'str-chat--windows-flags'
6621
+ : '';
6505
6622
  return (React__default['default'].createElement(React__default['default'].Fragment, null,
6506
- React__default['default'].createElement("div", { className: "str-chat str-chat-channel-list " + theme + " " + (navOpen ? 'str-chat-channel-list--open' : '') + " " + (useImageFlagEmojisOnWindows && navigator.platform.match(/Win/)
6507
- ? 'str-chat--windows-flags'
6508
- : ''), ref: channelListRef },
6623
+ React__default['default'].createElement("div", { className: chatClass + " " + channelListClass + " " + theme + " " + navigationClass + " " + windowsEmojiClass, ref: channelListRef },
6509
6624
  showChannelSearch && React__default['default'].createElement(ChannelSearch$1, __assign({}, additionalChannelSearchProps)),
6510
6625
  renderList())));
6511
6626
  };
@@ -7137,7 +7252,7 @@ var Streami18n = /** @class */ (function () {
7137
7252
  return Streami18n;
7138
7253
  }());
7139
7254
 
7140
- var version = '6.6.0';
7255
+ var version = '6.8.0';
7141
7256
 
7142
7257
  var useChat = function (_a) {
7143
7258
  var _b;
@@ -7255,7 +7370,7 @@ var useCustomStyles = function (customStyles) {
7255
7370
  * as it provides the ChatContext.
7256
7371
  */
7257
7372
  var Chat = function (props) {
7258
- var children = props.children, client = props.client, customStyles = props.customStyles, _a = props.darkMode, darkMode = _a === void 0 ? false : _a, defaultLanguage = props.defaultLanguage, i18nInstance = props.i18nInstance, _b = props.initialNavOpen, initialNavOpen = _b === void 0 ? true : _b, _c = props.theme, theme = _c === void 0 ? 'messaging light' : _c, _d = props.useImageFlagEmojisOnWindows, useImageFlagEmojisOnWindows = _d === void 0 ? false : _d;
7373
+ var children = props.children, client = props.client, customClasses = props.customClasses, customStyles = props.customStyles, _a = props.darkMode, darkMode = _a === void 0 ? false : _a, defaultLanguage = props.defaultLanguage, i18nInstance = props.i18nInstance, _b = props.initialNavOpen, initialNavOpen = _b === void 0 ? true : _b, _c = props.theme, theme = _c === void 0 ? 'messaging light' : _c, _d = props.useImageFlagEmojisOnWindows, useImageFlagEmojisOnWindows = _d === void 0 ? false : _d;
7259
7374
  var _e = useChat({ client: client, defaultLanguage: defaultLanguage, i18nInstance: i18nInstance, initialNavOpen: initialNavOpen }), channel = _e.channel, closeMobileNav = _e.closeMobileNav, mutes = _e.mutes, navOpen = _e.navOpen, openMobileNav = _e.openMobileNav, setActiveChannel = _e.setActiveChannel, translators = _e.translators;
7260
7375
  useCustomStyles(darkMode ? darkModeTheme : customStyles);
7261
7376
  if (!translators.t)
@@ -7264,6 +7379,7 @@ var Chat = function (props) {
7264
7379
  channel: channel,
7265
7380
  client: client,
7266
7381
  closeMobileNav: closeMobileNav,
7382
+ customClasses: customClasses,
7267
7383
  mutes: mutes,
7268
7384
  navOpen: navOpen,
7269
7385
  openMobileNav: openMobileNav,
@@ -7576,7 +7692,7 @@ var Message = function (props) {
7576
7692
  notify: addNotification,
7577
7693
  }), canPin = _c.canPin, handlePin = _c.handlePin;
7578
7694
  var _d = useReactionClick(message, reactionSelectorRef, undefined, closeReactionSelectorOnClick), isReactionEnabled = _d.isReactionEnabled, onReactionListClick = _d.onReactionListClick, showDetailedReactions = _d.showDetailedReactions;
7579
- return (React__default['default'].createElement(MemoizedMessage, { additionalMessageInputProps: props.additionalMessageInputProps, canPin: canPin, customMessageActions: props.customMessageActions, disableQuotedMessages: props.disableQuotedMessages, 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, 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 }));
7695
+ 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, 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 }));
7580
7696
  };
7581
7697
 
7582
7698
  var MessageCommerceWithContext = function (props) {
@@ -8111,8 +8227,8 @@ var useLastReadData = function (props) {
8111
8227
 
8112
8228
  var useMessageListElements = function (props) {
8113
8229
  var enrichedMessages = props.enrichedMessages, internalMessageProps = props.internalMessageProps, messageGroupStyles = props.messageGroupStyles, onMessageLoadCaptured = props.onMessageLoadCaptured, read = props.read, returnAllReadData = props.returnAllReadData, threadList = props.threadList;
8114
- var client = useChatContext().client;
8115
- var _a = useComponentContext(), _b = _a.DateSeparator, DateSeparator$1 = _b === void 0 ? DateSeparator : _b, HeaderComponent = _a.HeaderComponent, _c = _a.MessageSystem, MessageSystem = _c === void 0 ? EventComponent : _c;
8230
+ var _a = useChatContext(), client = _a.client, customClasses = _a.customClasses;
8231
+ var _b = useComponentContext(), _c = _b.DateSeparator, DateSeparator$1 = _c === void 0 ? DateSeparator : _c, HeaderComponent = _b.HeaderComponent, _d = _b.MessageSystem, MessageSystem = _d === void 0 ? EventComponent : _d;
8116
8232
  // get the readData, but only for messages submitted by the user themselves
8117
8233
  var readData = useLastReadData({
8118
8234
  messages: enrichedMessages,
@@ -8139,7 +8255,8 @@ var useMessageListElements = function (props) {
8139
8255
  React__default['default'].createElement(MessageSystem, { message: message })));
8140
8256
  }
8141
8257
  var groupStyles = messageGroupStyles[message.id] || '';
8142
- return (React__default['default'].createElement("li", { className: "str-chat__li str-chat__li--" + groupStyles, key: message.id || message.created_at, onLoadCapture: onMessageLoadCaptured },
8258
+ var messageClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.message) || "str-chat__li str-chat__li--" + groupStyles;
8259
+ return (React__default['default'].createElement("li", { className: messageClass, key: message.id || message.created_at, onLoadCapture: onMessageLoadCaptured },
8143
8260
  React__default['default'].createElement(Message, __assign({ groupStyles: [groupStyles], lastReceivedId: lastReceivedId, message: message, readBy: readData[message.id] || [], threadList: threadList }, internalMessageProps))));
8144
8261
  });
8145
8262
  }, [
@@ -8352,6 +8469,7 @@ var useInternalInfiniteScrollProps = function (props) {
8352
8469
  };
8353
8470
  var MessageListWithContext = function (props) {
8354
8471
  var channel = props.channel, _a = props.disableDateSeparator, disableDateSeparator = _a === void 0 ? false : _a, _b = props.hideDeletedMessages, hideDeletedMessages = _b === void 0 ? false : _b, _c = props.hideNewMessageSeparator, hideNewMessageSeparator = _c === void 0 ? false : _c, _d = props.messageActions, messageActions = _d === void 0 ? Object.keys(MESSAGE_ACTIONS) : _d, _e = props.messages, messages = _e === void 0 ? [] : _e, notifications = props.notifications, _f = props.noGroupByUser, noGroupByUser = _f === void 0 ? false : _f, _g = props.pinPermissions, pinPermissions = _g === void 0 ? defaultPinPermissions : _g, _h = props.returnAllReadData, returnAllReadData = _h === void 0 ? false : _h, _j = props.threadList, threadList = _j === void 0 ? false : _j, _k = props.unsafeHTML, unsafeHTML = _k === void 0 ? false : _k, headerPosition = props.headerPosition, read = props.read;
8472
+ var customClasses = useChatContext().customClasses;
8355
8473
  var _l = useComponentContext(), _m = _l.EmptyStateIndicator, EmptyStateIndicator$1 = _m === void 0 ? EmptyStateIndicator : _m, _o = _l.MessageListNotifications, MessageListNotifications = _o === void 0 ? DefaultMessageListNotifications : _o, _p = _l.MessageNotification, MessageNotification$1 = _p === void 0 ? MessageNotification : _p, _q = _l.TypingIndicator, TypingIndicator$1 = _q === void 0 ? TypingIndicator : _q;
8356
8474
  var _r = useScrollLocationLogic({
8357
8475
  messages: messages,
@@ -8402,8 +8520,10 @@ var MessageListWithContext = function (props) {
8402
8520
  threadList: threadList,
8403
8521
  });
8404
8522
  var finalInternalInfiniteScrollProps = useInternalInfiniteScrollProps(props);
8523
+ var messageListClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.messageList) || 'str-chat__list';
8524
+ var threadListClass = threadList ? (customClasses === null || customClasses === void 0 ? void 0 : customClasses.threadList) || 'str-chat__list--thread' : '';
8405
8525
  return (React__default['default'].createElement(React__default['default'].Fragment, null,
8406
- React__default['default'].createElement("div", { className: "str-chat__list " + (threadList ? 'str-chat__list--thread' : ''), onScroll: onScroll, ref: listRef }, !elements.length ? (React__default['default'].createElement(EmptyStateIndicator$1, { listType: 'message' })) : (React__default['default'].createElement(InfiniteScroll, __assign({ className: 'str-chat__reverse-infinite-scroll', "data-testid": 'reverse-infinite-scroll', isReverse: true, useWindow: false }, finalInternalInfiniteScrollProps),
8526
+ React__default['default'].createElement("div", { className: messageListClass + " " + threadListClass, onScroll: onScroll, ref: listRef }, !elements.length ? (React__default['default'].createElement(EmptyStateIndicator$1, { listType: 'message' })) : (React__default['default'].createElement(InfiniteScroll, __assign({ className: 'str-chat__reverse-infinite-scroll', "data-testid": 'reverse-infinite-scroll', isReverse: true, useWindow: false }, finalInternalInfiniteScrollProps),
8407
8527
  React__default['default'].createElement("ul", { className: 'str-chat__ul' }, elements),
8408
8528
  React__default['default'].createElement(TypingIndicator$1, { threadList: threadList }),
8409
8529
  React__default['default'].createElement("div", { key: 'bottom' })))),
@@ -8536,12 +8656,13 @@ var PREPEND_OFFSET = Math.pow(10, 7);
8536
8656
  var VirtualizedMessageListWithContext = function (props) {
8537
8657
  var channel = props.channel, closeReactionSelectorOnClick = props.closeReactionSelectorOnClick, customMessageRenderer = props.customMessageRenderer, defaultItemHeight = props.defaultItemHeight, _a = props.disableDateSeparator, disableDateSeparator = _a === void 0 ? true : _a, hasMore = props.hasMore, _b = props.hideDeletedMessages, hideDeletedMessages = _b === void 0 ? false : _b, _c = props.hideNewMessageSeparator, hideNewMessageSeparator = _c === void 0 ? false : _c, loadingMore = props.loadingMore, loadMore = props.loadMore, propMessage = props.Message, _d = props.messageLimit, messageLimit = _d === void 0 ? 100 : _d, messages = props.messages, _e = props.overscan, overscan = _e === void 0 ? 0 : _e,
8538
8658
  // TODO: refactor to scrollSeekPlaceHolderConfiguration and components.ScrollSeekPlaceholder, like the Virtuoso Component
8539
- scrollSeekPlaceHolder = props.scrollSeekPlaceHolder, _f = props.scrollToLatestMessageOnFocus, scrollToLatestMessageOnFocus = _f === void 0 ? false : _f, _g = props.separateGiphyPreview, separateGiphyPreview = _g === void 0 ? false : _g, _h = props.shouldGroupByUser, shouldGroupByUser = _h === void 0 ? false : _h, _j = props.stickToBottomScrollBehavior, stickToBottomScrollBehavior = _j === void 0 ? 'smooth' : _j, userId = props.userId;
8659
+ scrollSeekPlaceHolder = props.scrollSeekPlaceHolder, _f = props.scrollToLatestMessageOnFocus, scrollToLatestMessageOnFocus = _f === void 0 ? false : _f, _g = props.separateGiphyPreview, separateGiphyPreview = _g === void 0 ? false : _g, _h = props.shouldGroupByUser, shouldGroupByUser = _h === void 0 ? false : _h, _j = props.stickToBottomScrollBehavior, stickToBottomScrollBehavior = _j === void 0 ? 'smooth' : _j;
8540
8660
  var _k = useComponentContext(), _l = _k.DateSeparator, DateSeparator$1 = _l === void 0 ? DateSeparator : _l, _m = _k.EmptyStateIndicator, EmptyStateIndicator$1 = _m === void 0 ? EmptyStateIndicator : _m, _o = _k.GiphyPreviewMessage, GiphyPreviewMessage$1 = _o === void 0 ? GiphyPreviewMessage : _o, _p = _k.LoadingIndicator, LoadingIndicator$1 = _p === void 0 ? LoadingIndicator : _p, _q = _k.MessageNotification, MessageNotification$1 = _q === void 0 ? MessageNotification : _q, _r = _k.MessageSystem, MessageSystem = _r === void 0 ? EventComponent : _r, _s = _k.TypingIndicator, TypingIndicator = _s === void 0 ? null : _s, _t = _k.VirtualMessage, contextMessage = _t === void 0 ? MessageSimple : _t;
8661
+ var _u = useChatContext(), client = _u.client, customClasses = _u.customClasses;
8541
8662
  var t = useTranslationContext().t;
8542
8663
  var lastRead = React.useMemo(function () { var _a; return (_a = channel.lastRead) === null || _a === void 0 ? void 0 : _a.call(channel); }, [channel]);
8543
8664
  var MessageUIComponent = propMessage || contextMessage;
8544
- var _u = useGiphyPreview(separateGiphyPreview), giphyPreviewMessage = _u.giphyPreviewMessage, setGiphyPreviewMessage = _u.setGiphyPreviewMessage;
8665
+ var _v = useGiphyPreview(separateGiphyPreview), giphyPreviewMessage = _v.giphyPreviewMessage, setGiphyPreviewMessage = _v.setGiphyPreviewMessage;
8545
8666
  var processedMessages = React.useMemo(function () {
8546
8667
  if (typeof messages === 'undefined') {
8547
8668
  return [];
@@ -8560,7 +8681,7 @@ var VirtualizedMessageListWithContext = function (props) {
8560
8681
  messages: messages,
8561
8682
  separateGiphyPreview: separateGiphyPreview,
8562
8683
  setGiphyPreviewMessage: setGiphyPreviewMessage,
8563
- userId: userId,
8684
+ userId: client.userID || '',
8564
8685
  });
8565
8686
  }, [
8566
8687
  disableDateSeparator,
@@ -8569,10 +8690,10 @@ var VirtualizedMessageListWithContext = function (props) {
8569
8690
  lastRead,
8570
8691
  messages,
8571
8692
  messages === null || messages === void 0 ? void 0 : messages.length,
8572
- userId,
8693
+ client.userID,
8573
8694
  ]);
8574
8695
  var virtuoso = React.useRef(null);
8575
- var _v = useNewMessageNotification(processedMessages, userId), atBottom = _v.atBottom, newMessagesNotification = _v.newMessagesNotification, setNewMessagesNotification = _v.setNewMessagesNotification;
8696
+ var _w = useNewMessageNotification(processedMessages, client.userID), atBottom = _w.atBottom, newMessagesNotification = _w.newMessagesNotification, setNewMessagesNotification = _w.setNewMessagesNotification;
8576
8697
  var scrollToBottom = React.useCallback(function () {
8577
8698
  if (virtuoso.current) {
8578
8699
  virtuoso.current.scrollToIndex(processedMessages.length - 1);
@@ -8591,7 +8712,7 @@ var VirtualizedMessageListWithContext = function (props) {
8591
8712
  return function () { return window.removeEventListener('focus', scrollToBottomIfConfigured); };
8592
8713
  }, [scrollToBottomIfConfigured]);
8593
8714
  var numItemsPrepended = usePrependedMessagesCount(processedMessages);
8594
- var shouldForceScrollToBottom = useShouldForceScrollToBottom(processedMessages, userId);
8715
+ var shouldForceScrollToBottom = useShouldForceScrollToBottom(processedMessages, client.userID);
8595
8716
  var followOutput = function (isAtBottom) {
8596
8717
  if (shouldForceScrollToBottom()) {
8597
8718
  return isAtBottom ? stickToBottomScrollBehavior : 'auto';
@@ -8600,7 +8721,7 @@ var VirtualizedMessageListWithContext = function (props) {
8600
8721
  return isAtBottom ? stickToBottomScrollBehavior : false;
8601
8722
  };
8602
8723
  var messageRenderer = React.useCallback(function (messageList, virtuosoIndex) {
8603
- var _a, _b;
8724
+ var _a, _b, _c, _d, _e, _f, _g, _h;
8604
8725
  var streamMessageIndex = virtuosoIndex + numItemsPrepended - PREPEND_OFFSET;
8605
8726
  // use custom renderer supplied by client if present and skip the rest
8606
8727
  if (customMessageRenderer) {
@@ -8618,7 +8739,13 @@ var VirtualizedMessageListWithContext = function (props) {
8618
8739
  var groupedByUser = shouldGroupByUser &&
8619
8740
  streamMessageIndex > 0 &&
8620
8741
  ((_a = message.user) === null || _a === void 0 ? void 0 : _a.id) === ((_b = messageList[streamMessageIndex - 1].user) === null || _b === void 0 ? void 0 : _b.id);
8621
- return (React__default['default'].createElement(Message, { closeReactionSelectorOnClick: closeReactionSelectorOnClick, groupedByUser: groupedByUser, message: message, Message: MessageUIComponent }));
8742
+ var firstOfGroup = shouldGroupByUser &&
8743
+ streamMessageIndex > 0 &&
8744
+ ((_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);
8745
+ var endOfGroup = shouldGroupByUser &&
8746
+ streamMessageIndex > 0 &&
8747
+ ((_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);
8748
+ return (React__default['default'].createElement(Message, { closeReactionSelectorOnClick: closeReactionSelectorOnClick, customMessageActions: props.customMessageActions, endOfGroup: endOfGroup, firstOfGroup: firstOfGroup, groupedByUser: groupedByUser, message: message, Message: MessageUIComponent, messageActions: props.messageActions }));
8622
8749
  }, [customMessageRenderer, shouldGroupByUser, numItemsPrepended]);
8623
8750
  var virtuosoComponents = React.useMemo(function () {
8624
8751
  var EmptyPlaceholder = function () { return (React__default['default'].createElement(React__default['default'].Fragment, null, EmptyStateIndicator$1 && React__default['default'].createElement(EmptyStateIndicator$1, { listType: 'message' }))); };
@@ -8626,8 +8753,9 @@ var VirtualizedMessageListWithContext = function (props) {
8626
8753
  return loadingMore ? (React__default['default'].createElement("div", { className: 'str-chat__virtual-list__loading' },
8627
8754
  React__default['default'].createElement(LoadingIndicator$1, { size: 20 }))) : (React__default['default'].createElement(React__default['default'].Fragment, null));
8628
8755
  };
8756
+ var virtualMessageClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.virtualMessage) || 'str-chat__virtual-list-message-wrapper';
8629
8757
  // using 'display: inline-block' traps CSS margins of the item elements, preventing incorrect item measurements
8630
- var Item = function (props) { return (React__default['default'].createElement("div", __assign({}, props, { className: 'str-chat__virtual-list-message-wrapper' }))); };
8758
+ var Item = function (props) { return React__default['default'].createElement("div", __assign({}, props, { className: virtualMessageClass })); };
8631
8759
  var Footer = function () {
8632
8760
  return TypingIndicator ? React__default['default'].createElement(TypingIndicator, { avatarSize: 24 }) : React__default['default'].createElement(React__default['default'].Fragment, null);
8633
8761
  };
@@ -8651,8 +8779,9 @@ var VirtualizedMessageListWithContext = function (props) {
8651
8779
  };
8652
8780
  if (!processedMessages)
8653
8781
  return null;
8782
+ var virtualizedMessageListClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.virtualizedMessageList) || 'str-chat__virtual-list';
8654
8783
  return (React__default['default'].createElement(React__default['default'].Fragment, null,
8655
- React__default['default'].createElement("div", { className: 'str-chat__virtual-list' },
8784
+ React__default['default'].createElement("div", { className: virtualizedMessageListClass },
8656
8785
  React__default['default'].createElement(reactVirtuoso.Virtuoso, __assign({ atBottomStateChange: atBottomStateChange, components: virtuosoComponents, firstItemIndex: PREPEND_OFFSET - numItemsPrepended, followOutput: followOutput, initialTopMostItemIndex: processedMessages.length ? processedMessages.length - 1 : 0, itemContent: function (i) { return messageRenderer(processedMessages, i); }, overscan: overscan, ref: virtuoso, startReached: startReached, style: { overflowX: 'hidden' }, totalCount: processedMessages.length }, (scrollSeekPlaceHolder ? { scrollSeek: scrollSeekPlaceHolder } : {}), (defaultItemHeight ? { defaultItemHeight: defaultItemHeight } : {}))),
8657
8786
  React__default['default'].createElement("div", { className: 'str-chat__list-notifications' },
8658
8787
  React__default['default'].createElement(MessageNotification$1, { onClick: scrollToBottom, showNotification: newMessagesNotification }, t('New Messages!')))),
@@ -8667,9 +8796,8 @@ var VirtualizedMessageListWithContext = function (props) {
8667
8796
  function VirtualizedMessageList(props) {
8668
8797
  var loadMore = useChannelActionContext().loadMore;
8669
8798
  var _a = useChannelStateContext(), channel = _a.channel, hasMore = _a.hasMore, loadingMore = _a.loadingMore, contextMessages = _a.messages;
8670
- var client = useChatContext().client;
8671
8799
  var messages = props.messages || contextMessages;
8672
- return (React__default['default'].createElement(VirtualizedMessageListWithContext, __assign({ channel: channel, hasMore: !!hasMore, loadingMore: !!loadingMore, loadMore: loadMore, messages: messages, userId: client.userID || '' }, props)));
8800
+ return (React__default['default'].createElement(VirtualizedMessageListWithContext, __assign({ channel: channel, hasMore: !!hasMore, loadingMore: !!loadingMore, loadMore: loadMore, messages: messages }, props)));
8673
8801
  }
8674
8802
 
8675
8803
  /**
@@ -8711,6 +8839,7 @@ var ThreadInner = function (props) {
8711
8839
  var additionalMessageInputProps = props.additionalMessageInputProps, additionalMessageListProps = props.additionalMessageListProps, additionalParentMessageProps = props.additionalParentMessageProps, additionalVirtualizedMessageListProps = props.additionalVirtualizedMessageListProps, _a = props.autoFocus, autoFocus = _a === void 0 ? true : _a, _b = props.fullWidth, fullWidth = _b === void 0 ? false : _b, PropInput = props.Input, PropMessage = props.Message, virtualized = props.virtualized;
8712
8840
  var _c = useChannelStateContext(), thread = _c.thread, threadHasMore = _c.threadHasMore, threadLoadingMore = _c.threadLoadingMore, threadMessages = _c.threadMessages;
8713
8841
  var _d = useChannelActionContext(), closeThread = _d.closeThread, loadMoreThread = _d.loadMoreThread;
8842
+ var customClasses = useChatContext().customClasses;
8714
8843
  var _e = useComponentContext(), ContextInput = _e.ThreadInput, ContextMessage = _e.Message, _f = _e.ThreadHeader, ThreadHeader = _f === void 0 ? DefaultThreadHeader : _f, _g = _e.ThreadStart, ThreadStart = _g === void 0 ? DefaultThreadStart : _g, _h = _e.VirtualMessage, VirtualMessage = _h === void 0 ? FixedHeightMessage : _h;
8715
8844
  var messageList = React.useRef(null);
8716
8845
  var ThreadInput = PropInput || (additionalMessageInputProps === null || additionalMessageInputProps === void 0 ? void 0 : additionalMessageInputProps.Input) || ContextInput || MessageInputSmall;
@@ -8733,7 +8862,8 @@ var ThreadInner = function (props) {
8733
8862
  }, [threadMessages === null || threadMessages === void 0 ? void 0 : threadMessages.length]);
8734
8863
  if (!thread)
8735
8864
  return null;
8736
- return (React__default['default'].createElement("div", { className: "str-chat__thread " + (fullWidth ? 'str-chat__thread--full' : '') },
8865
+ var threadClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.thread) || 'str-chat__thread';
8866
+ return (React__default['default'].createElement("div", { className: threadClass + " " + (fullWidth ? 'str-chat__thread--full' : '') },
8737
8867
  React__default['default'].createElement(ThreadHeader, { closeThread: closeThread, thread: thread }),
8738
8868
  React__default['default'].createElement("div", { className: 'str-chat__thread-list', ref: messageList },
8739
8869
  React__default['default'].createElement(Message, __assign({ initialMessage: true, message: thread, Message: ThreadMessage || FallbackMessage, threadList: true }, additionalParentMessageProps)),
@@ -8755,6 +8885,7 @@ var UnMemoizedWindow = function (props) {
8755
8885
  */
8756
8886
  var Window = React__default['default'].memo(UnMemoizedWindow);
8757
8887
 
8888
+ exports.ActionsIcon = ActionsIcon;
8758
8889
  exports.Attachment = Attachment;
8759
8890
  exports.AttachmentActions = AttachmentActions;
8760
8891
  exports.Audio = Audio;