stream-chat-react 11.12.1 → 11.12.2

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 (30) hide show
  1. package/dist/{Window-40a618cb.js → Window-44a85f63.js} +230 -94
  2. package/dist/browser.full-bundle.js +309 -138
  3. package/dist/browser.full-bundle.js.map +1 -1
  4. package/dist/browser.full-bundle.min.js +3 -3
  5. package/dist/browser.full-bundle.min.js.map +1 -1
  6. package/dist/components/Channel/Channel.d.ts.map +1 -1
  7. package/dist/components/Channel/Channel.js +122 -47
  8. package/dist/components/Channel/utils.d.ts +27 -0
  9. package/dist/components/Channel/utils.d.ts.map +1 -1
  10. package/dist/components/Channel/utils.js +56 -0
  11. package/dist/components/Emojis/index.cjs.js +1 -1
  12. package/dist/components/MessageList/VirtualizedMessageList.d.ts +1 -0
  13. package/dist/components/MessageList/VirtualizedMessageList.d.ts.map +1 -1
  14. package/dist/components/MessageList/VirtualizedMessageList.js +1 -0
  15. package/dist/components/MessageList/VirtualizedMessageListComponents.d.ts.map +1 -1
  16. package/dist/components/MessageList/VirtualizedMessageListComponents.js +20 -7
  17. package/dist/components/MessageList/hooks/useMarkRead.js +2 -3
  18. package/dist/components/MessageList/renderMessages.d.ts +5 -5
  19. package/dist/components/MessageList/renderMessages.d.ts.map +1 -1
  20. package/dist/components/MessageList/renderMessages.js +44 -22
  21. package/dist/components/MessageList/utils.d.ts +10 -1
  22. package/dist/components/MessageList/utils.d.ts.map +1 -1
  23. package/dist/components/MessageList/utils.js +3 -0
  24. package/dist/constants/limits.d.ts +1 -0
  25. package/dist/constants/limits.d.ts.map +1 -1
  26. package/dist/constants/limits.js +1 -0
  27. package/dist/index.cjs.js +67 -31
  28. package/dist/version.d.ts +1 -1
  29. package/dist/version.js +1 -1
  30. package/package.json +1 -1
@@ -1,35 +1,57 @@
1
1
  import { __assign } from "tslib";
2
2
  import React, { Fragment } from 'react';
3
- import { isDate } from '../../context';
3
+ import { isDateSeparatorMessage } from './utils';
4
+ import { Message } from '../Message';
4
5
  import { CUSTOM_MESSAGE_TYPE } from '../../constants/messageTypes';
5
- import { Message } from '../Message/Message';
6
6
  export function defaultRenderMessages(_a) {
7
7
  var channelUnreadUiState = _a.channelUnreadUiState, components = _a.components, customClasses = _a.customClasses, lastReceivedId = _a.lastReceivedMessageId, messageGroupStyles = _a.messageGroupStyles, messages = _a.messages, readData = _a.readData, messageProps = _a.sharedMessageProps;
8
8
  var DateSeparator = components.DateSeparator, HeaderComponent = components.HeaderComponent, MessageSystem = components.MessageSystem, UnreadMessagesSeparator = components.UnreadMessagesSeparator;
9
- return messages.map(function (message, index) {
10
- if (message.customType === CUSTOM_MESSAGE_TYPE.date && message.date && isDate(message.date)) {
11
- return (React.createElement("li", { key: "".concat(message.date.toISOString(), "-i") },
9
+ var renderedMessages = [];
10
+ var firstMessage;
11
+ for (var index = 0; index < messages.length; index++) {
12
+ var message = messages[index];
13
+ if (isDateSeparatorMessage(message)) {
14
+ renderedMessages.push(React.createElement("li", { key: "".concat(message.date.toISOString(), "-i") },
12
15
  React.createElement(DateSeparator, { date: message.date, formatDate: messageProps.formatDate, unread: message.unread })));
13
16
  }
14
- if (message.customType === CUSTOM_MESSAGE_TYPE.intro && HeaderComponent) {
15
- return (React.createElement("li", { key: 'intro' },
17
+ else if (message.customType === CUSTOM_MESSAGE_TYPE.intro && HeaderComponent) {
18
+ renderedMessages.push(React.createElement("li", { key: 'intro' },
16
19
  React.createElement(HeaderComponent, null)));
17
20
  }
18
- if (message.type === 'system') {
19
- return (React.createElement("li", { key: message.id || message.created_at },
21
+ else if (message.type === 'system') {
22
+ renderedMessages.push(React.createElement("li", { key: message.id || message.created_at },
20
23
  React.createElement(MessageSystem, { message: message })));
21
24
  }
22
- var groupStyles = messageGroupStyles[message.id] || '';
23
- var messageClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.message) || "str-chat__li str-chat__li--".concat(groupStyles);
24
- var isNewestMessage = index === messages.length - 1;
25
- var isLastReadMessage = (channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.last_read_message_id) === message.id;
26
- var showUnreadSeparator = isLastReadMessage &&
27
- !isNewestMessage &&
28
- ((channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.first_unread_message_id) || (channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.unread_messages) > 0); // unread count can be 0 if the user marks unread only own messages
29
- return (React.createElement(Fragment, { key: message.id || message.created_at },
30
- React.createElement("li", { className: messageClass, "data-message-id": message.id, "data-testid": messageClass },
31
- React.createElement(Message, __assign({ groupStyles: [groupStyles], lastReceivedId: lastReceivedId, message: message, readBy: readData[message.id] || [] }, messageProps))),
32
- showUnreadSeparator && UnreadMessagesSeparator && (React.createElement("li", { className: 'str-chat__li str-chat__unread-messages-separator-wrapper' },
33
- React.createElement(UnreadMessagesSeparator, { unreadCount: channelUnreadUiState.unread_messages })))));
34
- });
25
+ else {
26
+ if (!firstMessage) {
27
+ firstMessage = message;
28
+ }
29
+ var groupStyles = messageGroupStyles[message.id] || '';
30
+ var messageClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.message) || "str-chat__li str-chat__li--".concat(groupStyles);
31
+ var createdAtTimestamp = message.created_at && new Date(message.created_at).getTime();
32
+ var lastReadTimestamp = channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.last_read.getTime();
33
+ var isFirstMessage = (firstMessage === null || firstMessage === void 0 ? void 0 : firstMessage.id) && firstMessage.id === message.id;
34
+ var isNewestMessage = index === messages.length - 1;
35
+ var isLastReadMessage = (channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.last_read_message_id) === message.id ||
36
+ (!(channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.unread_messages) && createdAtTimestamp === lastReadTimestamp);
37
+ var isFirstUnreadMessage = (channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.first_unread_message_id) === message.id ||
38
+ (!!(channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.unread_messages) &&
39
+ !!createdAtTimestamp &&
40
+ !!lastReadTimestamp &&
41
+ createdAtTimestamp > lastReadTimestamp &&
42
+ isFirstMessage);
43
+ var showUnreadSeparatorAbove = !(channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.last_read_message_id) && isFirstUnreadMessage;
44
+ var showUnreadSeparatorBelow = isLastReadMessage &&
45
+ !isNewestMessage &&
46
+ ((channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.first_unread_message_id) || !!(channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.unread_messages)); // this part has to be here as we do not mark channel read when sending a message
47
+ renderedMessages.push(React.createElement(Fragment, { key: message.id || message.created_at },
48
+ showUnreadSeparatorAbove && UnreadMessagesSeparator && (React.createElement("li", { className: 'str-chat__li str-chat__unread-messages-separator-wrapper' },
49
+ React.createElement(UnreadMessagesSeparator, { unreadCount: channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.unread_messages }))),
50
+ React.createElement("li", { className: messageClass, "data-message-id": message.id, "data-testid": messageClass },
51
+ React.createElement(Message, __assign({ groupStyles: [groupStyles], lastReceivedId: lastReceivedId, message: message, readBy: readData[message.id] || [] }, messageProps))),
52
+ showUnreadSeparatorBelow && UnreadMessagesSeparator && (React.createElement("li", { className: 'str-chat__li str-chat__unread-messages-separator-wrapper' },
53
+ React.createElement(UnreadMessagesSeparator, { unreadCount: channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.unread_messages })))));
54
+ }
55
+ }
56
+ return renderedMessages;
35
57
  }
@@ -1,5 +1,6 @@
1
1
  /// <reference types="react" />
2
- import type { UserResponse } from 'stream-chat';
2
+ import { CUSTOM_MESSAGE_TYPE } from '../../constants/messageTypes';
3
+ import type { MessageLabel, UserResponse } from 'stream-chat';
3
4
  import type { DefaultStreamChatGenerics } from '../../types/types';
4
5
  import type { StreamMessage } from '../../context/ChannelStateContext';
5
6
  type ProcessMessagesParams<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> = {
@@ -44,5 +45,13 @@ export type GroupStyle = '' | 'middle' | 'top' | 'bottom' | 'single';
44
45
  export declare const getGroupStyles: <StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>(message: StreamMessage<StreamChatGenerics>, previousMessage: StreamMessage<StreamChatGenerics>, nextMessage: StreamMessage<StreamChatGenerics>, noGroupByUser: boolean) => GroupStyle;
45
46
  export declare const hasMoreMessagesProbably: (returnedCountMessages: number, limit: number) => boolean;
46
47
  export declare const hasNotMoreMessages: (returnedCountMessages: number, limit: number) => boolean;
48
+ type DateSeparatorMessage = {
49
+ customType: typeof CUSTOM_MESSAGE_TYPE.date;
50
+ date: Date;
51
+ id: string;
52
+ type: MessageLabel;
53
+ unread: boolean;
54
+ };
55
+ export declare function isDateSeparatorMessage<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>(message: StreamMessage<StreamChatGenerics>): message is DateSeparatorMessage;
47
56
  export {};
48
57
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/components/MessageList/utils.ts"],"names":[],"mappings":";AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAEnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAGvE,KAAK,qBAAqB,CACxB,kBAAkB,SAAS,yBAAyB,GAAG,yBAAyB,IAC9E;IACF,QAAQ,EAAE,aAAa,CAAC,kBAAkB,CAAC,EAAE,CAAC;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,4BAA4B;IAC5B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,2EAA2E;IAC3E,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,kEAAkE;IAClE,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,+FAA+F;IAC/F,sBAAsB,CAAC,EAAE,KAAK,CAAC,QAAQ,CACrC,KAAK,CAAC,cAAc,CAAC,aAAa,CAAC,kBAAkB,CAAC,GAAG,SAAS,CAAC,CACpE,CAAC;CACH,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,eAAe,8KAuF3B,CAAC;AAEF,eAAO,MAAM,iBAAiB,UAAW,MAAM,GAAG,IAAI,WAQrD,CAAC;AAGF,eAAO,MAAM,eAAe,oJAY3B,CAAC;AAEF,eAAO,MAAM,aAAa;eAIU,IAAI;;mCACnB,OAAO,uDAqC3B,CAAC;AAEF,eAAO,MAAM,WAAW,qJAIL,MAAM,wCAgDxB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,EAAE,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAErE,eAAO,MAAM,cAAc,oPAMV,OAAO,KACrB,UA2CF,CAAC;AAOF,eAAO,MAAM,uBAAuB,0BAA2B,MAAM,SAAS,MAAM,YACpD,CAAC;AAGjC,eAAO,MAAM,kBAAkB,0BAA2B,MAAM,SAAS,MAAM,YAChD,CAAC"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/components/MessageList/utils.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAInE,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAGvE,KAAK,qBAAqB,CACxB,kBAAkB,SAAS,yBAAyB,GAAG,yBAAyB,IAC9E;IACF,QAAQ,EAAE,aAAa,CAAC,kBAAkB,CAAC,EAAE,CAAC;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,4BAA4B;IAC5B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,2EAA2E;IAC3E,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,kEAAkE;IAClE,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,+FAA+F;IAC/F,sBAAsB,CAAC,EAAE,KAAK,CAAC,QAAQ,CACrC,KAAK,CAAC,cAAc,CAAC,aAAa,CAAC,kBAAkB,CAAC,GAAG,SAAS,CAAC,CACpE,CAAC;CACH,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,eAAe,8KAuF3B,CAAC;AAEF,eAAO,MAAM,iBAAiB,UAAW,MAAM,GAAG,IAAI,WAQrD,CAAC;AAGF,eAAO,MAAM,eAAe,oJAY3B,CAAC;AAEF,eAAO,MAAM,aAAa;eAIU,IAAI;;mCACnB,OAAO,uDAqC3B,CAAC;AAEF,eAAO,MAAM,WAAW,qJAIL,MAAM,wCAgDxB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,EAAE,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAErE,eAAO,MAAM,cAAc,oPAMV,OAAO,KACrB,UA2CF,CAAC;AAOF,eAAO,MAAM,uBAAuB,0BAA2B,MAAM,SAAS,MAAM,YACpD,CAAC;AAGjC,eAAO,MAAM,kBAAkB,0BAA2B,MAAM,SAAS,MAAM,YAChD,CAAC;AAEhC,KAAK,oBAAoB,GAAG;IAC1B,UAAU,EAAE,OAAO,mBAAmB,CAAC,IAAI,CAAC;IAC5C,IAAI,EAAE,IAAI,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,wBAAgB,sBAAsB,CACpC,kBAAkB,SAAS,yBAAyB,GAAG,yBAAyB,EAChF,OAAO,EAAE,aAAa,CAAC,kBAAkB,CAAC,GAAG,OAAO,IAAI,oBAAoB,CAE7E"}
@@ -226,3 +226,6 @@ export var hasMoreMessagesProbably = function (returnedCountMessages, limit) {
226
226
  export var hasNotMoreMessages = function (returnedCountMessages, limit) {
227
227
  return returnedCountMessages < limit;
228
228
  };
229
+ export function isDateSeparatorMessage(message) {
230
+ return message.customType === CUSTOM_MESSAGE_TYPE.date && !!message.date && isDate(message.date);
231
+ }
@@ -1,5 +1,6 @@
1
1
  export declare const DEFAULT_INITIAL_CHANNEL_PAGE_SIZE = 25;
2
2
  export declare const DEFAULT_NEXT_CHANNEL_PAGE_SIZE = 100;
3
+ export declare const DEFAULT_JUMP_TO_PAGE_SIZE = 100;
3
4
  export declare const DEFAULT_THREAD_PAGE_SIZE = 50;
4
5
  export declare const DEFAULT_LOAD_PAGE_SCROLL_THRESHOLD = 250;
5
6
  //# sourceMappingURL=limits.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"limits.d.ts","sourceRoot":"","sources":["../../src/constants/limits.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iCAAiC,KAAK,CAAC;AACpD,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAClD,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAC3C,eAAO,MAAM,kCAAkC,MAAM,CAAC"}
1
+ {"version":3,"file":"limits.d.ts","sourceRoot":"","sources":["../../src/constants/limits.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iCAAiC,KAAK,CAAC;AACpD,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAClD,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAC7C,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAC3C,eAAO,MAAM,kCAAkC,MAAM,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export var DEFAULT_INITIAL_CHANNEL_PAGE_SIZE = 25;
2
2
  export var DEFAULT_NEXT_CHANNEL_PAGE_SIZE = 100;
3
+ export var DEFAULT_JUMP_TO_PAGE_SIZE = 100;
3
4
  export var DEFAULT_THREAD_PAGE_SIZE = 50;
4
5
  export var DEFAULT_LOAD_PAGE_SCROLL_THRESHOLD = 250;
package/dist/index.cjs.js CHANGED
@@ -2,14 +2,14 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var Window = require('./Window-40a618cb.js');
5
+ var Window = require('./Window-44a85f63.js');
6
6
  var React = require('react');
7
7
  var streamChat = require('stream-chat');
8
- var reactVirtuoso = require('react-virtuoso');
9
8
  var throttle = require('lodash.throttle');
10
9
  require('emoji-regex');
11
10
  require('linkifyjs');
12
11
  require('lodash.uniqby');
12
+ var reactVirtuoso = require('react-virtuoso');
13
13
  require('@braintree/sanitize-url');
14
14
  require('react-image-gallery');
15
15
  require('react-dom');
@@ -425,7 +425,7 @@ var useMarkRead = function (_a) {
425
425
  unreadMessages > 0;
426
426
  };
427
427
  var onVisibilityChange = function () {
428
- if (shouldMarkRead(unreadCount))
428
+ if (shouldMarkRead(channel.countUnread()))
429
429
  markRead();
430
430
  };
431
431
  var handleMessageNew = function (event) {
@@ -447,7 +447,6 @@ var useMarkRead = function (_a) {
447
447
  }
448
448
  else if (newMessageToCurrentChannel &&
449
449
  mainChannelUpdated &&
450
- !isOwnMessage &&
451
450
  shouldMarkRead(channel.countUnread())) {
452
451
  markRead();
453
452
  }
@@ -456,7 +455,7 @@ var useMarkRead = function (_a) {
456
455
  document.addEventListener('visibilitychange', onVisibilityChange);
457
456
  var hasScrolledToBottom = previousRenderMessageListScrolledToBottom.current !== isMessageListScrolledToBottom &&
458
457
  isMessageListScrolledToBottom;
459
- if (shouldMarkRead(hasScrolledToBottom ? channel.countUnread() : unreadCount))
458
+ if (hasScrolledToBottom && shouldMarkRead(channel.countUnread()))
460
459
  markRead();
461
460
  previousRenderMessageListScrolledToBottom.current = isMessageListScrolledToBottom;
462
461
  return function () {
@@ -600,32 +599,54 @@ var InfiniteScroll = function (props) {
600
599
  function defaultRenderMessages(_a) {
601
600
  var channelUnreadUiState = _a.channelUnreadUiState, components = _a.components, customClasses = _a.customClasses, lastReceivedId = _a.lastReceivedMessageId, messageGroupStyles = _a.messageGroupStyles, messages = _a.messages, readData = _a.readData, messageProps = _a.sharedMessageProps;
602
601
  var DateSeparator = components.DateSeparator, HeaderComponent = components.HeaderComponent, MessageSystem = components.MessageSystem, UnreadMessagesSeparator = components.UnreadMessagesSeparator;
603
- return messages.map(function (message, index) {
604
- if (message.customType === Window.CUSTOM_MESSAGE_TYPE.date && message.date && Window.isDate(message.date)) {
605
- return (React__default["default"].createElement("li", { key: "".concat(message.date.toISOString(), "-i") },
602
+ var renderedMessages = [];
603
+ var firstMessage;
604
+ for (var index = 0; index < messages.length; index++) {
605
+ var message = messages[index];
606
+ if (Window.isDateSeparatorMessage(message)) {
607
+ renderedMessages.push(React__default["default"].createElement("li", { key: "".concat(message.date.toISOString(), "-i") },
606
608
  React__default["default"].createElement(DateSeparator, { date: message.date, formatDate: messageProps.formatDate, unread: message.unread })));
607
609
  }
608
- if (message.customType === Window.CUSTOM_MESSAGE_TYPE.intro && HeaderComponent) {
609
- return (React__default["default"].createElement("li", { key: 'intro' },
610
+ else if (message.customType === Window.CUSTOM_MESSAGE_TYPE.intro && HeaderComponent) {
611
+ renderedMessages.push(React__default["default"].createElement("li", { key: 'intro' },
610
612
  React__default["default"].createElement(HeaderComponent, null)));
611
613
  }
612
- if (message.type === 'system') {
613
- return (React__default["default"].createElement("li", { key: message.id || message.created_at },
614
+ else if (message.type === 'system') {
615
+ renderedMessages.push(React__default["default"].createElement("li", { key: message.id || message.created_at },
614
616
  React__default["default"].createElement(MessageSystem, { message: message })));
615
617
  }
616
- var groupStyles = messageGroupStyles[message.id] || '';
617
- var messageClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.message) || "str-chat__li str-chat__li--".concat(groupStyles);
618
- var isNewestMessage = index === messages.length - 1;
619
- var isLastReadMessage = (channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.last_read_message_id) === message.id;
620
- var showUnreadSeparator = isLastReadMessage &&
621
- !isNewestMessage &&
622
- ((channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.first_unread_message_id) || (channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.unread_messages) > 0); // unread count can be 0 if the user marks unread only own messages
623
- return (React__default["default"].createElement(React.Fragment, { key: message.id || message.created_at },
624
- React__default["default"].createElement("li", { className: messageClass, "data-message-id": message.id, "data-testid": messageClass },
625
- React__default["default"].createElement(Window.Message, Window.__assign({ groupStyles: [groupStyles], lastReceivedId: lastReceivedId, message: message, readBy: readData[message.id] || [] }, messageProps))),
626
- showUnreadSeparator && UnreadMessagesSeparator && (React__default["default"].createElement("li", { className: 'str-chat__li str-chat__unread-messages-separator-wrapper' },
627
- React__default["default"].createElement(UnreadMessagesSeparator, { unreadCount: channelUnreadUiState.unread_messages })))));
628
- });
618
+ else {
619
+ if (!firstMessage) {
620
+ firstMessage = message;
621
+ }
622
+ var groupStyles = messageGroupStyles[message.id] || '';
623
+ var messageClass = (customClasses === null || customClasses === void 0 ? void 0 : customClasses.message) || "str-chat__li str-chat__li--".concat(groupStyles);
624
+ var createdAtTimestamp = message.created_at && new Date(message.created_at).getTime();
625
+ var lastReadTimestamp = channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.last_read.getTime();
626
+ var isFirstMessage = (firstMessage === null || firstMessage === void 0 ? void 0 : firstMessage.id) && firstMessage.id === message.id;
627
+ var isNewestMessage = index === messages.length - 1;
628
+ var isLastReadMessage = (channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.last_read_message_id) === message.id ||
629
+ (!(channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.unread_messages) && createdAtTimestamp === lastReadTimestamp);
630
+ var isFirstUnreadMessage = (channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.first_unread_message_id) === message.id ||
631
+ (!!(channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.unread_messages) &&
632
+ !!createdAtTimestamp &&
633
+ !!lastReadTimestamp &&
634
+ createdAtTimestamp > lastReadTimestamp &&
635
+ isFirstMessage);
636
+ var showUnreadSeparatorAbove = !(channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.last_read_message_id) && isFirstUnreadMessage;
637
+ var showUnreadSeparatorBelow = isLastReadMessage &&
638
+ !isNewestMessage &&
639
+ ((channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.first_unread_message_id) || !!(channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.unread_messages)); // this part has to be here as we do not mark channel read when sending a message
640
+ renderedMessages.push(React__default["default"].createElement(React.Fragment, { key: message.id || message.created_at },
641
+ showUnreadSeparatorAbove && UnreadMessagesSeparator && (React__default["default"].createElement("li", { className: 'str-chat__li str-chat__unread-messages-separator-wrapper' },
642
+ React__default["default"].createElement(UnreadMessagesSeparator, { unreadCount: channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.unread_messages }))),
643
+ React__default["default"].createElement("li", { className: messageClass, "data-message-id": message.id, "data-testid": messageClass },
644
+ React__default["default"].createElement(Window.Message, Window.__assign({ groupStyles: [groupStyles], lastReceivedId: lastReceivedId, message: message, readBy: readData[message.id] || [] }, messageProps))),
645
+ showUnreadSeparatorBelow && UnreadMessagesSeparator && (React__default["default"].createElement("li", { className: 'str-chat__li str-chat__unread-messages-separator-wrapper' },
646
+ React__default["default"].createElement(UnreadMessagesSeparator, { unreadCount: channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.unread_messages })))));
647
+ }
648
+ }
649
+ return renderedMessages;
629
650
  }
630
651
 
631
652
  var MessageListWithContext = function (props) {
@@ -1048,7 +1069,7 @@ var Footer = function () {
1048
1069
  };
1049
1070
  var messageRenderer = function (virtuosoIndex, _data, virtuosoContext) {
1050
1071
  var _a, _b, _c, _d, _e, _f, _g;
1051
- var additionalMessageInputProps = virtuosoContext.additionalMessageInputProps, closeReactionSelectorOnClick = virtuosoContext.closeReactionSelectorOnClick, customMessageActions = virtuosoContext.customMessageActions, customMessageRenderer = virtuosoContext.customMessageRenderer, DateSeparator = virtuosoContext.DateSeparator, firstUnreadMessageId = virtuosoContext.firstUnreadMessageId, lastReadMessageId = virtuosoContext.lastReadMessageId, lastReceivedMessageId = virtuosoContext.lastReceivedMessageId, MessageUIComponent = virtuosoContext.Message, messageActions = virtuosoContext.messageActions, MessageSystem = virtuosoContext.MessageSystem, numItemsPrepended = virtuosoContext.numItemsPrepended, ownMessagesReadByOthers = virtuosoContext.ownMessagesReadByOthers, messageList = virtuosoContext.processedMessages, shouldGroupByUser = virtuosoContext.shouldGroupByUser, sortReactionDetails = virtuosoContext.sortReactionDetails, sortReactions = virtuosoContext.sortReactions, _h = virtuosoContext.unreadMessageCount, unreadMessageCount = _h === void 0 ? 0 : _h, UnreadMessagesSeparator = virtuosoContext.UnreadMessagesSeparator, virtuosoRef = virtuosoContext.virtuosoRef;
1072
+ var additionalMessageInputProps = virtuosoContext.additionalMessageInputProps, closeReactionSelectorOnClick = virtuosoContext.closeReactionSelectorOnClick, customMessageActions = virtuosoContext.customMessageActions, customMessageRenderer = virtuosoContext.customMessageRenderer, DateSeparator = virtuosoContext.DateSeparator, firstUnreadMessageId = virtuosoContext.firstUnreadMessageId, lastReadDate = virtuosoContext.lastReadDate, lastReadMessageId = virtuosoContext.lastReadMessageId, lastReceivedMessageId = virtuosoContext.lastReceivedMessageId, MessageUIComponent = virtuosoContext.Message, messageActions = virtuosoContext.messageActions, MessageSystem = virtuosoContext.MessageSystem, numItemsPrepended = virtuosoContext.numItemsPrepended, ownMessagesReadByOthers = virtuosoContext.ownMessagesReadByOthers, messageList = virtuosoContext.processedMessages, shouldGroupByUser = virtuosoContext.shouldGroupByUser, sortReactionDetails = virtuosoContext.sortReactionDetails, sortReactions = virtuosoContext.sortReactions, _h = virtuosoContext.unreadMessageCount, unreadMessageCount = _h === void 0 ? 0 : _h, UnreadMessagesSeparator = virtuosoContext.UnreadMessagesSeparator, virtuosoRef = virtuosoContext.virtuosoRef;
1052
1073
  var streamMessageIndex = calculateItemIndex(virtuosoIndex, numItemsPrepended);
1053
1074
  if (customMessageRenderer) {
1054
1075
  return customMessageRenderer(messageList, streamMessageIndex);
@@ -1056,7 +1077,7 @@ var messageRenderer = function (virtuosoIndex, _data, virtuosoContext) {
1056
1077
  var message = messageList[streamMessageIndex];
1057
1078
  if (!message)
1058
1079
  return React__default["default"].createElement("div", { style: { height: '1px' } }); // returning null or zero height breaks the virtuoso
1059
- if (message.customType === Window.CUSTOM_MESSAGE_TYPE.date && message.date && Window.isDate(message.date)) {
1080
+ if (Window.isDateSeparatorMessage(message)) {
1060
1081
  return DateSeparator ? React__default["default"].createElement(DateSeparator, { date: message.date, unread: message.unread }) : null;
1061
1082
  }
1062
1083
  if (message.type === 'system') {
@@ -1072,12 +1093,25 @@ var messageRenderer = function (virtuosoIndex, _data, virtuosoContext) {
1072
1093
  (maybePrevMessage && Window.isMessageEdited(maybePrevMessage)));
1073
1094
  var endOfGroup = shouldGroupByUser &&
1074
1095
  (((_e = message.user) === null || _e === void 0 ? void 0 : _e.id) !== ((_f = maybeNextMessage === null || maybeNextMessage === void 0 ? void 0 : maybeNextMessage.user) === null || _f === void 0 ? void 0 : _f.id) || Window.isMessageEdited(message));
1096
+ var createdAtTimestamp = message.created_at && new Date(message.created_at).getTime();
1097
+ var lastReadTimestamp = lastReadDate === null || lastReadDate === void 0 ? void 0 : lastReadDate.getTime();
1098
+ var isFirstMessage = streamMessageIndex === 0;
1075
1099
  var isNewestMessage = lastReadMessageId === lastReceivedMessageId;
1076
- var isLastReadMessage = message.id === lastReadMessageId;
1077
- var showUnreadSeparator = isLastReadMessage && !isNewestMessage && (firstUnreadMessageId || unreadMessageCount > 0); // unread count can be 0 if the user marks unread only own messages
1100
+ var isLastReadMessage = message.id === lastReadMessageId ||
1101
+ (!unreadMessageCount && createdAtTimestamp === lastReadTimestamp);
1102
+ var isFirstUnreadMessage = firstUnreadMessageId === message.id ||
1103
+ (!!unreadMessageCount &&
1104
+ createdAtTimestamp &&
1105
+ lastReadTimestamp &&
1106
+ createdAtTimestamp > lastReadTimestamp &&
1107
+ isFirstMessage);
1108
+ var showUnreadSeparatorAbove = !lastReadMessageId && isFirstUnreadMessage;
1109
+ var showUnreadSeparatorBelow = isLastReadMessage && !isNewestMessage && (firstUnreadMessageId || !!unreadMessageCount);
1078
1110
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
1111
+ showUnreadSeparatorAbove && (React__default["default"].createElement("div", { className: 'str-chat__unread-messages-separator-wrapper' },
1112
+ React__default["default"].createElement(UnreadMessagesSeparator, { unreadCount: unreadMessageCount }))),
1079
1113
  React__default["default"].createElement(Window.Message, { additionalMessageInputProps: additionalMessageInputProps, autoscrollToBottom: (_g = virtuosoRef.current) === null || _g === void 0 ? void 0 : _g.autoscrollToBottom, closeReactionSelectorOnClick: closeReactionSelectorOnClick, customMessageActions: customMessageActions, endOfGroup: endOfGroup, firstOfGroup: firstOfGroup, groupedByUser: groupedByUser, lastReceivedId: lastReceivedMessageId, message: message, Message: MessageUIComponent, messageActions: messageActions, readBy: ownMessagesReadByOthers[message.id] || [], sortReactionDetails: sortReactionDetails, sortReactions: sortReactions }),
1080
- showUnreadSeparator && (React__default["default"].createElement("div", { className: 'str-chat__unread-messages-separator-wrapper' },
1114
+ showUnreadSeparatorBelow && (React__default["default"].createElement("div", { className: 'str-chat__unread-messages-separator-wrapper' },
1081
1115
  React__default["default"].createElement(UnreadMessagesSeparator, { unreadCount: unreadMessageCount })))));
1082
1116
  };
1083
1117
 
@@ -1278,6 +1312,7 @@ var VirtualizedMessageListWithContext = function (props) {
1278
1312
  DateSeparator: DateSeparator,
1279
1313
  firstUnreadMessageId: channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.first_unread_message_id,
1280
1314
  head: head,
1315
+ lastReadDate: channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.last_read,
1281
1316
  lastReadMessageId: channelUnreadUiState === null || channelUnreadUiState === void 0 ? void 0 : channelUnreadUiState.last_read_message_id,
1282
1317
  lastReceivedMessageId: lastReceivedMessageId,
1283
1318
  loadingMore: loadingMore,
@@ -1310,7 +1345,7 @@ function VirtualizedMessageList(props) {
1310
1345
  return (React__default["default"].createElement(VirtualizedMessageListWithContext, Window.__assign({ channel: channel, channelUnreadUiState: channelUnreadUiState, hasMore: !!hasMore, hasMoreNewer: !!hasMoreNewer, highlightedMessageId: highlightedMessageId, jumpToLatestMessage: jumpToLatestMessage, loadingMore: !!loadingMore, loadingMoreNewer: !!loadingMoreNewer, loadMore: loadMore, loadMoreNewer: loadMoreNewer, messages: messages, notifications: notifications, read: read, suppressAutoscroll: suppressAutoscroll }, props)));
1311
1346
  }
1312
1347
 
1313
- var version = '11.12.1';
1348
+ var version = '11.12.2';
1314
1349
 
1315
1350
  var useChat = function (_a) {
1316
1351
  var _b, _c;
@@ -1844,6 +1879,7 @@ exports.insertIntro = Window.insertIntro;
1844
1879
  exports.isAudioAttachment = Window.isAudioAttachment;
1845
1880
  exports.isChannel = Window.isChannel;
1846
1881
  exports.isDate = Window.isDate;
1882
+ exports.isDateSeparatorMessage = Window.isDateSeparatorMessage;
1847
1883
  exports.isDayOrMoment = Window.isDayOrMoment;
1848
1884
  exports.isFileAttachment = Window.isFileAttachment;
1849
1885
  exports.isGalleryAttachmentType = Window.isGalleryAttachmentType;
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const version = "11.12.1";
1
+ export declare const version = "11.12.2";
2
2
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -1 +1 @@
1
- export var version = '11.12.1';
1
+ export var version = '11.12.2';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "stream-chat-react",
3
- "version": "11.12.1",
3
+ "version": "11.12.2",
4
4
  "description": "React components to create chat conversations or livestream style chat",
5
5
  "author": "GetStream",
6
6
  "homepage": "https://getstream.io/chat/",