stream-chat-react 10.4.1 → 10.4.3

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 (40) hide show
  1. package/dist/browser.full-bundle.js +46 -32
  2. package/dist/browser.full-bundle.js.map +1 -1
  3. package/dist/browser.full-bundle.min.js +3 -3
  4. package/dist/browser.full-bundle.min.js.map +1 -1
  5. package/dist/components/Chat/Chat.d.ts.map +1 -1
  6. package/dist/components/Chat/Chat.js +6 -3
  7. package/dist/components/InfiniteScrollPaginator/InfiniteScroll.d.ts +0 -1
  8. package/dist/components/InfiniteScrollPaginator/InfiniteScroll.d.ts.map +1 -1
  9. package/dist/components/InfiniteScrollPaginator/InfiniteScroll.js +9 -7
  10. package/dist/components/MessageInput/hooks/useCooldownTimer.d.ts.map +1 -1
  11. package/dist/components/MessageInput/hooks/useCooldownTimer.js +26 -13
  12. package/dist/components/MessageInput/hooks/useUserTrigger.d.ts.map +1 -1
  13. package/dist/components/MessageInput/hooks/useUserTrigger.js +2 -1
  14. package/dist/components/MessageList/MessageList.d.ts +5 -1
  15. package/dist/components/MessageList/MessageList.d.ts.map +1 -1
  16. package/dist/components/MessageList/MessageList.js +4 -2
  17. package/dist/components/MessageList/hooks/useMessageListScrollManager.d.ts +1 -0
  18. package/dist/components/MessageList/hooks/useMessageListScrollManager.d.ts.map +1 -1
  19. package/dist/components/MessageList/hooks/useMessageListScrollManager.js +6 -5
  20. package/dist/components/MessageList/hooks/useScrollLocationLogic.d.ts +1 -1
  21. package/dist/components/MessageList/hooks/useScrollLocationLogic.d.ts.map +1 -1
  22. package/dist/components/MessageList/hooks/useScrollLocationLogic.js +2 -1
  23. package/dist/css/index.css +1 -1
  24. package/dist/css/v2/index.css +1 -1
  25. package/dist/css/v2/index.css.map +1 -1
  26. package/dist/css/v2/index.layout.css +1 -1
  27. package/dist/css/v2/index.layout.css.map +1 -1
  28. package/dist/index.cjs.js +45 -31
  29. package/dist/index.cjs.js.map +1 -1
  30. package/dist/scss/Card.scss +1 -1
  31. package/dist/scss/ChannelHeader.scss +1 -1
  32. package/dist/scss/MessageInput.scss +1 -1
  33. package/dist/scss/TypingIndicator.scss +1 -1
  34. package/dist/scss/_variables.scss +1 -1
  35. package/dist/scss/v2/AttachmentList/AttachmentList-layout.scss +11 -13
  36. package/dist/scss/v2/Message/Message-theme.scss +4 -0
  37. package/dist/utils.js +1 -1
  38. package/dist/version.d.ts +1 -1
  39. package/dist/version.js +1 -1
  40. package/package.json +8 -8
package/dist/index.cjs.js CHANGED
@@ -23797,7 +23797,7 @@ var mentionsMarkdownPlugin = function (mentioned_users) { return function () {
23797
23797
  // valid cases: "text @", "@", " @"
23798
23798
  // invalid cases: "text@", "@text",
23799
23799
  /.?\s?@$|^@$/.test(node.value) &&
23800
- nextChildHref.startsWith('mailto:')) {
23800
+ (nextChildHref === null || nextChildHref === void 0 ? void 0 : nextChildHref.startsWith('mailto:'))) {
23801
23801
  var newTextValue = node.value.replace(/@$/, '');
23802
23802
  var username = nextChildHref.replace('mailto:', '');
23803
23803
  parent.children[index] = u('text', newTextValue);
@@ -28364,7 +28364,8 @@ var useUserTrigger = function (params) {
28364
28364
  _a.label = 1;
28365
28365
  case 1:
28366
28366
  _a.trys.push([1, 3, , 4]);
28367
- return [4 /*yield*/, client.queryUsers(__assign({ $or: [{ id: { $autocomplete: query } }, { name: { $autocomplete: query } }], id: { $ne: client.userID } }, mentionQueryParams.filters), __assign({ id: 1 }, mentionQueryParams.sort), __assign({ limit: 10 }, mentionQueryParams.options))];
28367
+ return [4 /*yield*/, client.queryUsers(__assign({ $or: [{ id: { $autocomplete: query } }, { name: { $autocomplete: query } }], id: { $ne: client.userID } }, mentionQueryParams.filters), Array.isArray(mentionQueryParams.sort)
28368
+ ? __spreadArray([{ id: 1 }], mentionQueryParams.sort, true) : __assign({ id: 1 }, mentionQueryParams.sort), __assign({ limit: 10 }, mentionQueryParams.options))];
28368
28369
  case 2:
28369
28370
  users = (_a.sent()).users;
28370
28371
  if (onReady && users.length) {
@@ -30342,24 +30343,28 @@ var EditMessageForm = function () {
30342
30343
  };
30343
30344
 
30344
30345
  var useCooldownTimer = function () {
30346
+ var _a;
30345
30347
  var latestMessageDatesByChannels = useChatContext('useCooldownTimer').latestMessageDatesByChannels;
30346
- var channel = useChannelStateContext('useCooldownTimer').channel;
30347
- var _a = (channel.data ||
30348
- {}), cooldownInterval = _a.cooldown, own_capabilities = _a.own_capabilities;
30349
- var _b = React.useState(), cooldownRemaining = _b[0], setCooldownRemaining = _b[1];
30348
+ var _b = useChannelStateContext('useCooldownTimer'), channel = _b.channel, _c = _b.messages, messages = _c === void 0 ? [] : _c;
30349
+ var client = useChatContext('useCooldownTimer').client;
30350
+ var _d = React.useState(), cooldownRemaining = _d[0], setCooldownRemaining = _d[1];
30351
+ var _e = (channel.data ||
30352
+ {}), cooldownInterval = _e.cooldown, own_capabilities = _e.own_capabilities;
30350
30353
  var skipCooldown = !(own_capabilities === null || own_capabilities === void 0 ? void 0 : own_capabilities.includes('slow-mode'));
30354
+ var ownLatestMessageDate = React.useMemo(function () {
30355
+ var _a, _b;
30356
+ return (_a = latestMessageDatesByChannels[channel.cid]) !== null && _a !== void 0 ? _a : (_b = __spreadArray([], messages, true).sort(function (a, b) { var _a, _b; return ((_a = b.created_at) === null || _a === void 0 ? void 0 : _a.getTime()) - ((_b = a.created_at) === null || _b === void 0 ? void 0 : _b.getTime()); })
30357
+ .find(function (v) { var _a, _b; return ((_a = v.user) === null || _a === void 0 ? void 0 : _a.id) === ((_b = client.user) === null || _b === void 0 ? void 0 : _b.id); })) === null || _b === void 0 ? void 0 : _b.created_at;
30358
+ }, [messages, (_a = client.user) === null || _a === void 0 ? void 0 : _a.id, latestMessageDatesByChannels, channel.cid]);
30351
30359
  React.useEffect(function () {
30352
- var latestMessageDate = latestMessageDatesByChannels[channel.cid];
30353
- if (!cooldownInterval || !latestMessageDate) {
30360
+ if (skipCooldown || !cooldownInterval || !ownLatestMessageDate)
30354
30361
  return;
30355
- }
30356
- var remainingCooldown = Math.round(cooldownInterval - (new Date().getTime() - latestMessageDate.getTime()) / 1000);
30357
- if (remainingCooldown > 0 && !skipCooldown) {
30362
+ var remainingCooldown = Math.round(cooldownInterval - (new Date().getTime() - ownLatestMessageDate.getTime()) / 1000);
30363
+ if (remainingCooldown > 0)
30358
30364
  setCooldownRemaining(remainingCooldown);
30359
- }
30360
- }, [channel.id, cooldownInterval, latestMessageDatesByChannels[channel.cid]]);
30365
+ }, [cooldownInterval, ownLatestMessageDate, skipCooldown]);
30361
30366
  return {
30362
- cooldownInterval: cooldownInterval || 0,
30367
+ cooldownInterval: cooldownInterval !== null && cooldownInterval !== void 0 ? cooldownInterval : 0,
30363
30368
  cooldownRemaining: cooldownRemaining,
30364
30369
  setCooldownRemaining: setCooldownRemaining,
30365
30370
  };
@@ -33771,7 +33776,7 @@ var UnMemoizedChannelList = function (props) {
33771
33776
  */
33772
33777
  var ChannelList = React__default["default"].memo(UnMemoizedChannelList);
33773
33778
 
33774
- var version = '10.4.1';
33779
+ var version = '10.4.3';
33775
33780
 
33776
33781
  var useChat = function (_a) {
33777
33782
  var _b, _c;
@@ -33957,9 +33962,12 @@ var Chat = function (props) {
33957
33962
  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;
33958
33963
  var _e = useChat({ client: client, defaultLanguage: defaultLanguage, i18nInstance: i18nInstance, initialNavOpen: initialNavOpen }), channel = _e.channel, closeMobileNav = _e.closeMobileNav, getAppSettings = _e.getAppSettings, latestMessageDatesByChannels = _e.latestMessageDatesByChannels, mutes = _e.mutes, navOpen = _e.navOpen, openMobileNav = _e.openMobileNav, setActiveChannel = _e.setActiveChannel, translators = _e.translators;
33959
33964
  var channelsQueryState = useChannelsQueryState();
33960
- var themeVersion = (getComputedStyle(document.documentElement)
33961
- .getPropertyValue('--str-chat__theme-version')
33962
- .replace(' ', '') || '1');
33965
+ var themeVersion = typeof window !== 'undefined'
33966
+ ? (window
33967
+ .getComputedStyle(document.documentElement)
33968
+ .getPropertyValue('--str-chat__theme-version')
33969
+ .replace(' ', '') || '1')
33970
+ : '1';
33963
33971
  useCustomStyles(darkMode ? darkModeTheme : customStyles);
33964
33972
  var chatContextValue = useCreateChatContext({
33965
33973
  channel: channel,
@@ -34064,6 +34072,8 @@ var InfiniteScroll = function (props) {
34064
34072
  if (listenToScroll) {
34065
34073
  listenToScroll(offset, reverseOffset, threshold);
34066
34074
  }
34075
+ if (isLoading)
34076
+ return;
34067
34077
  if (reverseOffset < Number(threshold) &&
34068
34078
  typeof loadPreviousPageFn === 'function' &&
34069
34079
  hasPreviousPageFlag) {
@@ -34075,10 +34085,11 @@ var InfiniteScroll = function (props) {
34075
34085
  }, [
34076
34086
  hasPreviousPageFlag,
34077
34087
  hasNextPageFlag,
34078
- threshold,
34088
+ isLoading,
34079
34089
  listenToScroll,
34080
34090
  loadPreviousPageFn,
34081
34091
  loadNextPageFn,
34092
+ threshold,
34082
34093
  ]);
34083
34094
  React.useEffect(function () {
34084
34095
  deprecationAndReplacementWarning([
@@ -34088,19 +34099,18 @@ var InfiniteScroll = function (props) {
34088
34099
  [{ loadMore: loadMore }, { loadPreviousPage: loadPreviousPage }],
34089
34100
  ], 'InfiniteScroll');
34090
34101
  }, []);
34091
- React.useEffect(function () {
34102
+ React.useLayoutEffect(function () {
34092
34103
  var _a;
34093
34104
  var scrollElement = (_a = scrollComponent.current) === null || _a === void 0 ? void 0 : _a.parentNode;
34094
- if (isLoading || !scrollElement) {
34095
- return function () { return undefined; };
34096
- }
34105
+ if (!scrollElement)
34106
+ return;
34097
34107
  scrollElement.addEventListener('scroll', scrollListener, useCapture);
34098
34108
  scrollElement.addEventListener('resize', scrollListener, useCapture);
34099
34109
  return function () {
34100
34110
  scrollElement.removeEventListener('scroll', scrollListener, useCapture);
34101
34111
  scrollElement.removeEventListener('resize', scrollListener, useCapture);
34102
34112
  };
34103
- }, [initialLoad, isLoading, scrollListener, useCapture]);
34113
+ }, [initialLoad, scrollListener, useCapture]);
34104
34114
  React.useEffect(function () {
34105
34115
  var _a;
34106
34116
  var scrollElement = (_a = scrollComponent.current) === null || _a === void 0 ? void 0 : _a.parentNode;
@@ -34891,8 +34901,9 @@ var useMessageListElements = function (props) {
34891
34901
  return elements;
34892
34902
  };
34893
34903
 
34904
+ // FIXME: change this generic name to something like useAdjustScrollPositionToListSize
34894
34905
  function useMessageListScrollManager(params) {
34895
- var onScrollBy = params.onScrollBy, scrollContainerMeasures = params.scrollContainerMeasures, scrolledUpThreshold = params.scrolledUpThreshold, scrollToBottom = params.scrollToBottom, showNewMessages = params.showNewMessages;
34906
+ var loadMoreScrollThreshold = params.loadMoreScrollThreshold, onScrollBy = params.onScrollBy, scrollContainerMeasures = params.scrollContainerMeasures, scrolledUpThreshold = params.scrolledUpThreshold, scrollToBottom = params.scrollToBottom, showNewMessages = params.showNewMessages;
34896
34907
  var client = useChatContext('useMessageListScrollManager').client;
34897
34908
  var measures = React.useRef({
34898
34909
  offsetHeight: 0,
@@ -34900,7 +34911,7 @@ function useMessageListScrollManager(params) {
34900
34911
  });
34901
34912
  var messages = React.useRef();
34902
34913
  var scrollTop = React.useRef(0);
34903
- React.useEffect(function () {
34914
+ React.useLayoutEffect(function () {
34904
34915
  var _a, _b, _c;
34905
34916
  var prevMeasures = measures.current;
34906
34917
  var prevMessages = messages.current;
@@ -34914,8 +34925,8 @@ function useMessageListScrollManager(params) {
34914
34925
  if (prevMessages.length < newMessages.length) {
34915
34926
  // messages added to the top
34916
34927
  if ((lastPrevMessage === null || lastPrevMessage === void 0 ? void 0 : lastPrevMessage.id) === lastNewMessage.id) {
34917
- var listHeightDelta = newMeasures.scrollHeight - prevMeasures.scrollHeight;
34918
- if (scrollTop.current === 0) {
34928
+ if (scrollTop.current < loadMoreScrollThreshold) {
34929
+ var listHeightDelta = newMeasures.scrollHeight - prevMeasures.scrollHeight;
34919
34930
  onScrollBy(listHeightDelta);
34920
34931
  }
34921
34932
  }
@@ -34948,7 +34959,7 @@ function useMessageListScrollManager(params) {
34948
34959
  }
34949
34960
 
34950
34961
  var useScrollLocationLogic = function (params) {
34951
- var _a = params.messages, messages = _a === void 0 ? [] : _a, _b = params.scrolledUpThreshold, scrolledUpThreshold = _b === void 0 ? 200 : _b, hasMoreNewer = params.hasMoreNewer, suppressAutoscroll = params.suppressAutoscroll, listElement = params.listElement;
34962
+ var loadMoreScrollThreshold = params.loadMoreScrollThreshold, _a = params.messages, messages = _a === void 0 ? [] : _a, _b = params.scrolledUpThreshold, scrolledUpThreshold = _b === void 0 ? 200 : _b, hasMoreNewer = params.hasMoreNewer, suppressAutoscroll = params.suppressAutoscroll, listElement = params.listElement;
34952
34963
  var _c = React.useState(false), hasNewMessages = _c[0], setHasNewMessages = _c[1];
34953
34964
  var _d = React.useState(), wrapperRect = _d[0], setWrapperRect = _d[1];
34954
34965
  var _e = React.useState(true), isMessageListScrolledToBottom = _e[0], setIsMessageListScrolledToBottom = _e[1];
@@ -34972,6 +34983,7 @@ var useScrollLocationLogic = function (params) {
34972
34983
  }
34973
34984
  }, [listElement, hasMoreNewer]);
34974
34985
  var updateScrollTop = useMessageListScrollManager({
34986
+ loadMoreScrollThreshold: loadMoreScrollThreshold,
34975
34987
  messages: messages,
34976
34988
  onScrollBy: function (scrollBy) {
34977
34989
  listElement === null || listElement === void 0 ? void 0 : listElement.scrollBy({ top: scrollBy });
@@ -35120,16 +35132,18 @@ var MessageListMainPanel = function (_a) {
35120
35132
  };
35121
35133
 
35122
35134
  var MessageListWithContext = function (props) {
35123
- var channel = props.channel, _a = props.disableDateSeparator, disableDateSeparator = _a === void 0 ? false : _a, groupStyles = props.groupStyles, _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, // @deprecated in favor of `channelCapabilities` - TODO: remove in next major release
35135
+ var channel = props.channel, _a = props.disableDateSeparator, disableDateSeparator = _a === void 0 ? false : _a, groupStyles = props.groupStyles, _b = props.hideDeletedMessages, hideDeletedMessages = _b === void 0 ? false : _b, _c = props.hideNewMessageSeparator, hideNewMessageSeparator = _c === void 0 ? false : _c, internalInfiniteScrollProps = props.internalInfiniteScrollProps, _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, // @deprecated in favor of `channelCapabilities` - TODO: remove in next major release
35124
35136
  _h = props.returnAllReadData, // @deprecated in favor of `channelCapabilities` - TODO: remove in next major release
35125
35137
  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, _l = props.messageLimit, messageLimit = _l === void 0 ? 100 : _l, loadMoreCallback = props.loadMore, loadMoreNewerCallback = props.loadMoreNewer, _m = props.hasMoreNewer, hasMoreNewer = _m === void 0 ? false : _m, suppressAutoscroll = props.suppressAutoscroll, highlightedMessageId = props.highlightedMessageId, _o = props.jumpToLatestMessage, jumpToLatestMessage = _o === void 0 ? function () { return Promise.resolve(); } : _o;
35126
35138
  var _p = React__default["default"].useState(null), listElement = _p[0], setListElement = _p[1];
35127
35139
  var _q = React__default["default"].useState(null), ulElement = _q[0], setUlElement = _q[1];
35128
35140
  var customClasses = useChatContext('MessageList').customClasses;
35129
35141
  var _r = useComponentContext('MessageList'), _s = _r.EmptyStateIndicator, EmptyStateIndicator$1 = _s === void 0 ? EmptyStateIndicator : _s, _t = _r.LoadingIndicator, LoadingIndicator$1 = _t === void 0 ? LoadingIndicator : _t, _u = _r.MessageListNotifications, MessageListNotifications$1 = _u === void 0 ? MessageListNotifications : _u, _v = _r.MessageNotification, MessageNotification$1 = _v === void 0 ? MessageNotification : _v, _w = _r.TypingIndicator, TypingIndicator$1 = _w === void 0 ? TypingIndicator : _w;
35142
+ var loadMoreScrollThreshold = (internalInfiniteScrollProps === null || internalInfiniteScrollProps === void 0 ? void 0 : internalInfiniteScrollProps.threshold) || 250;
35130
35143
  var _x = useScrollLocationLogic({
35131
35144
  hasMoreNewer: hasMoreNewer,
35132
35145
  listElement: listElement,
35146
+ loadMoreScrollThreshold: loadMoreScrollThreshold,
35133
35147
  messages: messages,
35134
35148
  scrolledUpThreshold: props.scrolledUpThreshold,
35135
35149
  suppressAutoscroll: suppressAutoscroll,
@@ -35216,7 +35230,7 @@ var MessageListWithContext = function (props) {
35216
35230
  var showEmptyStateIndicator = elements.length === 0 && !threadList;
35217
35231
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
35218
35232
  React__default["default"].createElement(MessageListMainPanel, null,
35219
- React__default["default"].createElement("div", { className: "".concat(messageListClass, " ").concat(threadListClass), onScroll: onScroll, ref: setListElement, tabIndex: 0 }, showEmptyStateIndicator ? (React__default["default"].createElement(EmptyStateIndicator$1, { key: 'empty-state-indicator', listType: threadList ? 'thread' : 'message' })) : (React__default["default"].createElement(InfiniteScroll, __assign({ className: 'str-chat__reverse-infinite-scroll str-chat__message-list-scroll', "data-testid": 'reverse-infinite-scroll', hasNextPage: props.hasMoreNewer, hasPreviousPage: props.hasMore, head: props.head, isLoading: props.loadingMore, loader: React__default["default"].createElement("div", { className: 'str-chat__list__loading', key: 'loading-indicator' }, props.loadingMore && React__default["default"].createElement(LoadingIndicator$1, { size: 20 })), loadNextPage: loadMoreNewer, loadPreviousPage: loadMore }, props.internalInfiniteScrollProps),
35233
+ React__default["default"].createElement("div", { className: "".concat(messageListClass, " ").concat(threadListClass), onScroll: onScroll, ref: setListElement, tabIndex: 0 }, showEmptyStateIndicator ? (React__default["default"].createElement(EmptyStateIndicator$1, { key: 'empty-state-indicator', listType: threadList ? 'thread' : 'message' })) : (React__default["default"].createElement(InfiniteScroll, __assign({ className: 'str-chat__reverse-infinite-scroll str-chat__message-list-scroll', "data-testid": 'reverse-infinite-scroll', hasNextPage: props.hasMoreNewer, hasPreviousPage: props.hasMore, head: props.head, isLoading: props.loadingMore, loader: React__default["default"].createElement("div", { className: 'str-chat__list__loading', key: 'loading-indicator' }, props.loadingMore && React__default["default"].createElement(LoadingIndicator$1, { size: 20 })), loadNextPage: loadMoreNewer, loadPreviousPage: loadMore }, props.internalInfiniteScrollProps, { threshold: loadMoreScrollThreshold }),
35220
35234
  React__default["default"].createElement("ul", { className: 'str-chat__ul', ref: setUlElement }, elements),
35221
35235
  React__default["default"].createElement(TypingIndicator$1, { threadList: threadList }),
35222
35236
  React__default["default"].createElement("div", { key: 'bottom' }))))),