stream-chat-react 10.14.1 → 10.16.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 (127) hide show
  1. package/dist/browser.full-bundle.js +6587 -6455
  2. package/dist/browser.full-bundle.js.map +1 -1
  3. package/dist/browser.full-bundle.min.js +5 -5
  4. package/dist/browser.full-bundle.min.js.map +1 -1
  5. package/dist/components/AutoCompleteTextarea/List.js +1 -1
  6. package/dist/components/Avatar/Avatar.d.ts.map +1 -1
  7. package/dist/components/Avatar/Avatar.js +1 -1
  8. package/dist/components/ChannelList/ChannelList.d.ts.map +1 -1
  9. package/dist/components/ChannelList/ChannelList.js +2 -1
  10. package/dist/components/Chat/hooks/useChannelsQueryState.d.ts +3 -3
  11. package/dist/components/Chat/hooks/useChannelsQueryState.d.ts.map +1 -1
  12. package/dist/components/Chat/hooks/useChannelsQueryState.js +1 -1
  13. package/dist/components/DateSeparator/DateSeparator.js +1 -1
  14. package/dist/components/EventComponent/EventComponent.js +1 -1
  15. package/dist/components/Message/FixedHeightMessage.js +1 -1
  16. package/dist/components/Message/MessageText.js +2 -2
  17. package/dist/components/Message/index.d.ts +1 -0
  18. package/dist/components/Message/index.d.ts.map +1 -1
  19. package/dist/components/Message/index.js +1 -0
  20. package/dist/components/Message/renderText/Anchor.d.ts +4 -0
  21. package/dist/components/Message/renderText/Anchor.d.ts.map +1 -0
  22. package/dist/components/Message/renderText/Anchor.js +10 -0
  23. package/dist/components/Message/renderText/Emoji.d.ts +3 -0
  24. package/dist/components/Message/renderText/Emoji.d.ts.map +1 -0
  25. package/dist/components/Message/renderText/Emoji.js +5 -0
  26. package/dist/components/Message/renderText/Mention.d.ts +18 -0
  27. package/dist/components/Message/renderText/Mention.d.ts.map +1 -0
  28. package/dist/components/Message/renderText/Mention.js +5 -0
  29. package/dist/components/Message/renderText/index.d.ts +5 -0
  30. package/dist/components/Message/renderText/index.d.ts.map +1 -0
  31. package/dist/components/Message/renderText/index.js +3 -0
  32. package/dist/components/Message/renderText/regex.d.ts +5 -0
  33. package/dist/components/Message/renderText/regex.d.ts.map +1 -0
  34. package/dist/components/Message/renderText/regex.js +21 -0
  35. package/dist/components/Message/renderText/rehypePlugins.d.ts +7 -0
  36. package/dist/components/Message/renderText/rehypePlugins.d.ts.map +1 -0
  37. package/dist/components/Message/renderText/rehypePlugins.js +60 -0
  38. package/dist/components/Message/renderText/renderText.d.ts +21 -0
  39. package/dist/components/Message/renderText/renderText.d.ts.map +1 -0
  40. package/dist/components/Message/renderText/renderText.js +126 -0
  41. package/dist/components/Message/types.d.ts +1 -1
  42. package/dist/components/Message/types.d.ts.map +1 -1
  43. package/dist/components/Message/utils.d.ts +1 -0
  44. package/dist/components/Message/utils.d.ts.map +1 -1
  45. package/dist/components/Message/utils.js +8 -0
  46. package/dist/components/MessageInput/hooks/useCommandTrigger.d.ts.map +1 -1
  47. package/dist/components/MessageInput/hooks/useCommandTrigger.js +21 -2
  48. package/dist/components/MessageList/MessageList.d.ts.map +1 -1
  49. package/dist/components/MessageList/MessageList.js +1 -3
  50. package/dist/components/MessageList/VirtualizedMessageList.d.ts +36 -6
  51. package/dist/components/MessageList/VirtualizedMessageList.d.ts.map +1 -1
  52. package/dist/components/MessageList/VirtualizedMessageList.js +39 -122
  53. package/dist/components/MessageList/VirtualizedMessageListComponents.d.ts +23 -0
  54. package/dist/components/MessageList/VirtualizedMessageListComponents.d.ts.map +1 -0
  55. package/dist/components/MessageList/VirtualizedMessageListComponents.js +70 -0
  56. package/dist/components/MessageList/hooks/MessageList/index.d.ts +5 -0
  57. package/dist/components/MessageList/hooks/MessageList/index.d.ts.map +1 -0
  58. package/dist/components/MessageList/hooks/MessageList/index.js +4 -0
  59. package/dist/components/MessageList/hooks/{useEnrichedMessages.d.ts → MessageList/useEnrichedMessages.d.ts} +3 -3
  60. package/dist/components/MessageList/hooks/MessageList/useEnrichedMessages.d.ts.map +1 -0
  61. package/dist/components/MessageList/hooks/{useEnrichedMessages.js → MessageList/useEnrichedMessages.js} +3 -3
  62. package/dist/components/MessageList/hooks/{useMessageListElements.d.ts → MessageList/useMessageListElements.d.ts} +4 -4
  63. package/dist/components/MessageList/hooks/MessageList/useMessageListElements.d.ts.map +1 -0
  64. package/dist/components/MessageList/hooks/{useMessageListElements.js → MessageList/useMessageListElements.js} +9 -9
  65. package/dist/components/MessageList/hooks/{useMessageListScrollManager.d.ts → MessageList/useMessageListScrollManager.d.ts} +2 -2
  66. package/dist/components/MessageList/hooks/MessageList/useMessageListScrollManager.d.ts.map +1 -0
  67. package/dist/components/MessageList/hooks/{useMessageListScrollManager.js → MessageList/useMessageListScrollManager.js} +1 -1
  68. package/dist/components/MessageList/hooks/{useScrollLocationLogic.d.ts → MessageList/useScrollLocationLogic.d.ts} +2 -2
  69. package/dist/components/MessageList/hooks/MessageList/useScrollLocationLogic.d.ts.map +1 -0
  70. package/dist/components/MessageList/hooks/VirtualizedMessageList/index.d.ts +7 -0
  71. package/dist/components/MessageList/hooks/VirtualizedMessageList/index.d.ts.map +1 -0
  72. package/dist/components/MessageList/hooks/VirtualizedMessageList/index.js +6 -0
  73. package/dist/components/MessageList/hooks/{useGiphyPreview.d.ts → VirtualizedMessageList/useGiphyPreview.d.ts} +2 -2
  74. package/dist/components/MessageList/hooks/VirtualizedMessageList/useGiphyPreview.d.ts.map +1 -0
  75. package/dist/components/MessageList/hooks/{useGiphyPreview.js → VirtualizedMessageList/useGiphyPreview.js} +1 -1
  76. package/dist/components/MessageList/hooks/VirtualizedMessageList/useMessageSetKey.d.ts +10 -0
  77. package/dist/components/MessageList/hooks/VirtualizedMessageList/useMessageSetKey.d.ts.map +1 -0
  78. package/dist/components/MessageList/hooks/VirtualizedMessageList/useMessageSetKey.js +20 -0
  79. package/dist/components/MessageList/hooks/{useNewMessageNotification.d.ts → VirtualizedMessageList/useNewMessageNotification.d.ts} +2 -2
  80. package/dist/components/MessageList/hooks/VirtualizedMessageList/useNewMessageNotification.d.ts.map +1 -0
  81. package/dist/components/MessageList/hooks/{usePrependMessagesCount.d.ts → VirtualizedMessageList/usePrependMessagesCount.d.ts} +2 -2
  82. package/dist/components/MessageList/hooks/VirtualizedMessageList/usePrependMessagesCount.d.ts.map +1 -0
  83. package/dist/components/MessageList/hooks/VirtualizedMessageList/useScrollToBottomOnNewMessage.d.ts +12 -0
  84. package/dist/components/MessageList/hooks/VirtualizedMessageList/useScrollToBottomOnNewMessage.d.ts.map +1 -0
  85. package/dist/components/MessageList/hooks/VirtualizedMessageList/useScrollToBottomOnNewMessage.js +28 -0
  86. package/dist/components/MessageList/hooks/{useShouldForceScrollToBottom.d.ts → VirtualizedMessageList/useShouldForceScrollToBottom.d.ts} +2 -2
  87. package/dist/components/MessageList/hooks/VirtualizedMessageList/useShouldForceScrollToBottom.d.ts.map +1 -0
  88. package/dist/components/MessageList/hooks/index.d.ts +7 -7
  89. package/dist/components/MessageList/hooks/index.d.ts.map +1 -1
  90. package/dist/components/MessageList/hooks/index.js +7 -7
  91. package/dist/context/MessageContext.d.ts +1 -1
  92. package/dist/context/MessageContext.d.ts.map +1 -1
  93. package/dist/i18n/Streami18n.d.ts +4 -3
  94. package/dist/i18n/Streami18n.d.ts.map +1 -1
  95. package/dist/i18n/Streami18n.js +3 -4
  96. package/dist/index.cjs.js +653 -592
  97. package/dist/index.cjs.js.map +1 -1
  98. package/dist/index.d.ts +0 -1
  99. package/dist/index.d.ts.map +1 -1
  100. package/dist/index.js +0 -2
  101. package/dist/utils/generateRandomId.d.ts +6 -0
  102. package/dist/utils/generateRandomId.d.ts.map +1 -0
  103. package/dist/utils/generateRandomId.js +5 -0
  104. package/dist/utils/getWholeChar.d.ts +2 -0
  105. package/dist/utils/getWholeChar.d.ts.map +1 -0
  106. package/dist/utils/getWholeChar.js +26 -0
  107. package/dist/utils/index.d.ts +4 -0
  108. package/dist/utils/index.d.ts.map +1 -0
  109. package/dist/utils/index.js +3 -0
  110. package/dist/version.d.ts +1 -1
  111. package/dist/version.js +1 -1
  112. package/package.json +1 -1
  113. package/dist/components/MessageList/hooks/useEnrichedMessages.d.ts.map +0 -1
  114. package/dist/components/MessageList/hooks/useGiphyPreview.d.ts.map +0 -1
  115. package/dist/components/MessageList/hooks/useMessageListElements.d.ts.map +0 -1
  116. package/dist/components/MessageList/hooks/useMessageListScrollManager.d.ts.map +0 -1
  117. package/dist/components/MessageList/hooks/useNewMessageNotification.d.ts.map +0 -1
  118. package/dist/components/MessageList/hooks/usePrependMessagesCount.d.ts.map +0 -1
  119. package/dist/components/MessageList/hooks/useScrollLocationLogic.d.ts.map +0 -1
  120. package/dist/components/MessageList/hooks/useShouldForceScrollToBottom.d.ts.map +0 -1
  121. package/dist/utils.d.ts +0 -42
  122. package/dist/utils.d.ts.map +0 -1
  123. package/dist/utils.js +0 -253
  124. /package/dist/components/MessageList/hooks/{useScrollLocationLogic.js → MessageList/useScrollLocationLogic.js} +0 -0
  125. /package/dist/components/MessageList/hooks/{useNewMessageNotification.js → VirtualizedMessageList/useNewMessageNotification.js} +0 -0
  126. /package/dist/components/MessageList/hooks/{usePrependMessagesCount.js → VirtualizedMessageList/usePrependMessagesCount.js} +0 -0
  127. /package/dist/components/MessageList/hooks/{useShouldForceScrollToBottom.js → VirtualizedMessageList/useShouldForceScrollToBottom.js} +0 -0
package/dist/index.cjs.js CHANGED
@@ -34,10 +34,7 @@ var linkify = require('linkifyjs');
34
34
  var _defineProperty$2 = require('@babel/runtime/helpers/defineProperty');
35
35
  var _slicedToArray$2 = require('@babel/runtime/helpers/slicedToArray');
36
36
  var emojiRegex = require('emoji-regex');
37
- var crypto = require('crypto');
38
37
  var uniqBy = require('lodash.uniqby');
39
- var ReactIs = require('react-is');
40
- var path$1 = require('path');
41
38
  var _objectWithoutProperties$1 = require('@babel/runtime/helpers/objectWithoutProperties');
42
39
  var _extends = require('@babel/runtime/helpers/extends');
43
40
  var _typeof = require('@babel/runtime/helpers/typeof');
@@ -49,11 +46,14 @@ var _possibleConstructorReturn = require('@babel/runtime/helpers/possibleConstru
49
46
  var _getPrototypeOf = require('@babel/runtime/helpers/getPrototypeOf');
50
47
  var Textarea = require('react-textarea-autosize');
51
48
  var getCaretCoordinates = require('textarea-caret');
49
+ var ReactIs = require('react-is');
52
50
  var debounce$1 = require('lodash.debounce');
53
51
  var throttle = require('lodash.throttle');
54
52
  var streamChat = require('stream-chat');
53
+ var crypto = require('crypto');
55
54
  var deepequal = require('react-fast-compare');
56
55
  var ReactDOM = require('react-dom');
56
+ var path$1 = require('path');
57
57
  var reactVirtuoso = require('react-virtuoso');
58
58
  var nimbleEmoji = require('emoji-mart/dist/components/emoji/nimble-emoji');
59
59
  var nimblePicker = require('emoji-mart/dist/components/picker/nimble-picker');
@@ -98,10 +98,7 @@ var linkify__namespace = /*#__PURE__*/_interopNamespace(linkify);
98
98
  var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty$2);
99
99
  var _slicedToArray__default = /*#__PURE__*/_interopDefaultLegacy(_slicedToArray$2);
100
100
  var emojiRegex__default = /*#__PURE__*/_interopDefaultLegacy(emojiRegex);
101
- var crypto__default = /*#__PURE__*/_interopDefaultLegacy(crypto);
102
101
  var uniqBy__default = /*#__PURE__*/_interopDefaultLegacy(uniqBy);
103
- var ReactIs__default = /*#__PURE__*/_interopDefaultLegacy(ReactIs);
104
- var path__default = /*#__PURE__*/_interopDefaultLegacy(path$1);
105
102
  var _objectWithoutProperties__default = /*#__PURE__*/_interopDefaultLegacy(_objectWithoutProperties$1);
106
103
  var _extends__default = /*#__PURE__*/_interopDefaultLegacy(_extends);
107
104
  var _typeof__default = /*#__PURE__*/_interopDefaultLegacy(_typeof);
@@ -113,10 +110,13 @@ var _possibleConstructorReturn__default = /*#__PURE__*/_interopDefaultLegacy(_po
113
110
  var _getPrototypeOf__default = /*#__PURE__*/_interopDefaultLegacy(_getPrototypeOf);
114
111
  var Textarea__default = /*#__PURE__*/_interopDefaultLegacy(Textarea);
115
112
  var getCaretCoordinates__default = /*#__PURE__*/_interopDefaultLegacy(getCaretCoordinates);
113
+ var ReactIs__default = /*#__PURE__*/_interopDefaultLegacy(ReactIs);
116
114
  var debounce__default = /*#__PURE__*/_interopDefaultLegacy(debounce$1);
117
115
  var throttle__default = /*#__PURE__*/_interopDefaultLegacy(throttle);
116
+ var crypto__default = /*#__PURE__*/_interopDefaultLegacy(crypto);
118
117
  var deepequal__default = /*#__PURE__*/_interopDefaultLegacy(deepequal);
119
118
  var ReactDOM__namespace = /*#__PURE__*/_interopNamespace(ReactDOM);
119
+ var path__default = /*#__PURE__*/_interopDefaultLegacy(path$1);
120
120
  var nimbleEmoji__default = /*#__PURE__*/_interopDefaultLegacy(nimbleEmoji);
121
121
  var nimblePicker__default = /*#__PURE__*/_interopDefaultLegacy(nimblePicker);
122
122
 
@@ -1064,11 +1064,10 @@ var Streami18n = /** @class */ (function () {
1064
1064
  keySeparator: false,
1065
1065
  lng: this.currentLanguage,
1066
1066
  nsSeparator: false,
1067
- parseMissingKeyHandler: function (key) {
1068
- _this.logger("Streami18n: Missing translation for key: ".concat(key));
1069
- return key;
1070
- },
1071
1067
  };
1068
+ if (finalOptions.parseMissingKeyHandler) {
1069
+ this.i18nextConfig.parseMissingKeyHandler = finalOptions.parseMissingKeyHandler;
1070
+ }
1072
1071
  this.validateCurrentLanguage();
1073
1072
  var dayjsLocaleConfigForLanguage = finalOptions.dayjsLocaleConfigForLanguage;
1074
1073
  if (dayjsLocaleConfigForLanguage) {
@@ -4331,7 +4330,7 @@ var getAttachmentType = function (attachment) {
4331
4330
  return 'unsupported';
4332
4331
  };
4333
4332
 
4334
- var Item = /*#__PURE__*/React__default["default"].forwardRef(function Item(props, innerRef) {
4333
+ var Item$1 = /*#__PURE__*/React__default["default"].forwardRef(function Item(props, innerRef) {
4335
4334
  var className = props.className,
4336
4335
  Component = props.component,
4337
4336
  item = props.item,
@@ -4378,29 +4377,29 @@ var Item = /*#__PURE__*/React__default["default"].forwardRef(function Item(props
4378
4377
  }))));
4379
4378
  });
4380
4379
 
4381
- let urlAlphabet =
4382
- 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict';
4383
-
4384
- const POOL_SIZE_MULTIPLIER = 128;
4385
- let pool, poolOffset;
4386
- let fillPool = bytes => {
4387
- if (!pool || pool.length < bytes) {
4388
- pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER);
4389
- crypto__default["default"].randomFillSync(pool);
4390
- poolOffset = 0;
4391
- } else if (poolOffset + bytes > pool.length) {
4392
- crypto__default["default"].randomFillSync(pool);
4393
- poolOffset = 0;
4394
- }
4395
- poolOffset += bytes;
4396
- };
4397
- let nanoid = (size = 21) => {
4398
- fillPool((size -= 0));
4399
- let id = '';
4400
- for (let i = poolOffset - size; i < poolOffset; i++) {
4401
- id += urlAlphabet[pool[i] & 63];
4402
- }
4403
- return id
4380
+ var DefaultSuggestionListHeader = function (props) {
4381
+ var currentTrigger = props.currentTrigger, value = props.value;
4382
+ var t = useTranslationContext('DefaultSuggestionListHeader').t;
4383
+ var triggerIndex = value.lastIndexOf(currentTrigger);
4384
+ if (currentTrigger === '/') {
4385
+ return (React__default["default"].createElement(React__default["default"].Fragment, null,
4386
+ t('Commands matching'),
4387
+ " ",
4388
+ React__default["default"].createElement("strong", null, value.slice(triggerIndex + 1))));
4389
+ }
4390
+ if (currentTrigger === ':') {
4391
+ return (React__default["default"].createElement(React__default["default"].Fragment, null,
4392
+ t('Emoji matching'),
4393
+ " ",
4394
+ React__default["default"].createElement("strong", null, value.slice(triggerIndex + 1))));
4395
+ }
4396
+ if (currentTrigger === '@') {
4397
+ return (React__default["default"].createElement(React__default["default"].Fragment, null,
4398
+ t('People matching'),
4399
+ " ",
4400
+ React__default["default"].createElement("strong", null, value.slice(triggerIndex + 1))));
4401
+ }
4402
+ return null;
4404
4403
  };
4405
4404
 
4406
4405
  /**
@@ -5079,6 +5078,351 @@ function toFunction$1(replace) {
5079
5078
  return typeof replace === 'function' ? replace : () => replace
5080
5079
  }
5081
5080
 
5081
+ /**
5082
+ * @typedef {import('unist').Node} Node
5083
+ * @typedef {import('unist').Parent} Parent
5084
+ * @typedef {import('unist').Literal} Literal
5085
+ * @typedef {Object.<string, unknown>} Props
5086
+ * @typedef {Array.<Node>|string} ChildrenOrValue
5087
+ *
5088
+ * @typedef {(<T extends string, P extends Record<string, unknown>, C extends Node[]>(type: T, props: P, children: C) => {type: T, children: C} & P)} BuildParentWithProps
5089
+ * @typedef {(<T extends string, P extends Record<string, unknown>>(type: T, props: P, value: string) => {type: T, value: string} & P)} BuildLiteralWithProps
5090
+ * @typedef {(<T extends string, P extends Record<string, unknown>>(type: T, props: P) => {type: T} & P)} BuildVoidWithProps
5091
+ * @typedef {(<T extends string, C extends Node[]>(type: T, children: C) => {type: T, children: C})} BuildParent
5092
+ * @typedef {(<T extends string>(type: T, value: string) => {type: T, value: string})} BuildLiteral
5093
+ * @typedef {(<T extends string>(type: T) => {type: T})} BuildVoid
5094
+ */
5095
+
5096
+ var u = /**
5097
+ * @type {BuildVoid & BuildVoidWithProps & BuildLiteral & BuildLiteralWithProps & BuildParent & BuildParentWithProps}
5098
+ */ (
5099
+ /**
5100
+ * @param {string} type Type of node
5101
+ * @param {Props|ChildrenOrValue} [props] Additional properties for node (or `children` or `value`)
5102
+ * @param {ChildrenOrValue} [value] `children` or `value` of node
5103
+ * @returns {Node}
5104
+ */
5105
+ function (type, props, value) {
5106
+ /** @type {Node} */
5107
+ var node = {type: String(type)};
5108
+
5109
+ if (
5110
+ (value === undefined || value === null) &&
5111
+ (typeof props === 'string' || Array.isArray(props))
5112
+ ) {
5113
+ value = props;
5114
+ } else {
5115
+ Object.assign(node, props);
5116
+ }
5117
+
5118
+ if (Array.isArray(value)) {
5119
+ node.children = value;
5120
+ } else if (value !== undefined && value !== null) {
5121
+ node.value = String(value);
5122
+ }
5123
+
5124
+ return node
5125
+ }
5126
+ );
5127
+
5128
+ /**
5129
+ * @param {string} d
5130
+ * @returns {string}
5131
+ */
5132
+ function color(d) {
5133
+ return '\u001B[33m' + d + '\u001B[39m'
5134
+ }
5135
+
5136
+ /**
5137
+ * @typedef {import('unist').Node} Node
5138
+ * @typedef {import('unist').Parent} Parent
5139
+ * @typedef {import('unist-util-is').Test} Test
5140
+ * @typedef {import('./complex-types.js').Action} Action
5141
+ * @typedef {import('./complex-types.js').Index} Index
5142
+ * @typedef {import('./complex-types.js').ActionTuple} ActionTuple
5143
+ * @typedef {import('./complex-types.js').VisitorResult} VisitorResult
5144
+ * @typedef {import('./complex-types.js').Visitor} Visitor
5145
+ */
5146
+
5147
+ /**
5148
+ * Continue traversing as normal
5149
+ */
5150
+ const CONTINUE = true;
5151
+ /**
5152
+ * Do not traverse this node’s children
5153
+ */
5154
+ const SKIP = 'skip';
5155
+ /**
5156
+ * Stop traversing immediately
5157
+ */
5158
+ const EXIT = false;
5159
+
5160
+ /**
5161
+ * Visit children of tree which pass test.
5162
+ *
5163
+ * @param tree
5164
+ * Tree to walk
5165
+ * @param [test]
5166
+ * `unist-util-is`-compatible test
5167
+ * @param visitor
5168
+ * Function called for nodes that pass `test`.
5169
+ * @param [reverse=false]
5170
+ * Traverse in reverse preorder (NRL) instead of preorder (NLR) (default).
5171
+ */
5172
+ const visitParents =
5173
+ /**
5174
+ * @type {(
5175
+ * (<Tree extends Node, Check extends Test>(tree: Tree, test: Check, visitor: import('./complex-types.js').BuildVisitor<Tree, Check>, reverse?: boolean) => void) &
5176
+ * (<Tree extends Node>(tree: Tree, visitor: import('./complex-types.js').BuildVisitor<Tree>, reverse?: boolean) => void)
5177
+ * )}
5178
+ */
5179
+ (
5180
+ /**
5181
+ * @param {Node} tree
5182
+ * @param {Test} test
5183
+ * @param {import('./complex-types.js').Visitor<Node>} visitor
5184
+ * @param {boolean} [reverse=false]
5185
+ */
5186
+ function (tree, test, visitor, reverse) {
5187
+ if (typeof test === 'function' && typeof visitor !== 'function') {
5188
+ reverse = visitor;
5189
+ // @ts-expect-error no visitor given, so `visitor` is test.
5190
+ visitor = test;
5191
+ test = null;
5192
+ }
5193
+
5194
+ const is = convert(test);
5195
+ const step = reverse ? -1 : 1;
5196
+
5197
+ factory(tree, null, [])();
5198
+
5199
+ /**
5200
+ * @param {Node} node
5201
+ * @param {number?} index
5202
+ * @param {Array<Parent>} parents
5203
+ */
5204
+ function factory(node, index, parents) {
5205
+ /** @type {Record<string, unknown>} */
5206
+ // @ts-expect-error: hush
5207
+ const value = typeof node === 'object' && node !== null ? node : {};
5208
+ /** @type {string|undefined} */
5209
+ let name;
5210
+
5211
+ if (typeof value.type === 'string') {
5212
+ name =
5213
+ typeof value.tagName === 'string'
5214
+ ? value.tagName
5215
+ : typeof value.name === 'string'
5216
+ ? value.name
5217
+ : undefined;
5218
+
5219
+ Object.defineProperty(visit, 'name', {
5220
+ value:
5221
+ 'node (' +
5222
+ color(value.type + (name ? '<' + name + '>' : '')) +
5223
+ ')'
5224
+ });
5225
+ }
5226
+
5227
+ return visit
5228
+
5229
+ function visit() {
5230
+ /** @type {ActionTuple} */
5231
+ let result = [];
5232
+ /** @type {ActionTuple} */
5233
+ let subresult;
5234
+ /** @type {number} */
5235
+ let offset;
5236
+ /** @type {Array<Parent>} */
5237
+ let grandparents;
5238
+
5239
+ if (!test || is(node, index, parents[parents.length - 1] || null)) {
5240
+ result = toResult(visitor(node, parents));
5241
+
5242
+ if (result[0] === EXIT) {
5243
+ return result
5244
+ }
5245
+ }
5246
+
5247
+ // @ts-expect-error looks like a parent.
5248
+ if (node.children && result[0] !== SKIP) {
5249
+ // @ts-expect-error looks like a parent.
5250
+ offset = (reverse ? node.children.length : -1) + step;
5251
+ // @ts-expect-error looks like a parent.
5252
+ grandparents = parents.concat(node);
5253
+
5254
+ // @ts-expect-error looks like a parent.
5255
+ while (offset > -1 && offset < node.children.length) {
5256
+ // @ts-expect-error looks like a parent.
5257
+ subresult = factory(node.children[offset], offset, grandparents)();
5258
+
5259
+ if (subresult[0] === EXIT) {
5260
+ return subresult
5261
+ }
5262
+
5263
+ offset =
5264
+ typeof subresult[1] === 'number' ? subresult[1] : offset + step;
5265
+ }
5266
+ }
5267
+
5268
+ return result
5269
+ }
5270
+ }
5271
+ }
5272
+ );
5273
+
5274
+ /**
5275
+ * @param {VisitorResult} value
5276
+ * @returns {ActionTuple}
5277
+ */
5278
+ function toResult(value) {
5279
+ if (Array.isArray(value)) {
5280
+ return value
5281
+ }
5282
+
5283
+ if (typeof value === 'number') {
5284
+ return [CONTINUE, value]
5285
+ }
5286
+
5287
+ return [value]
5288
+ }
5289
+
5290
+ /**
5291
+ * @typedef {import('unist').Node} Node
5292
+ * @typedef {import('unist').Parent} Parent
5293
+ * @typedef {import('unist-util-is').Test} Test
5294
+ * @typedef {import('unist-util-visit-parents').VisitorResult} VisitorResult
5295
+ * @typedef {import('./complex-types.js').Visitor} Visitor
5296
+ */
5297
+
5298
+ /**
5299
+ * Visit children of tree which pass test.
5300
+ *
5301
+ * @param tree
5302
+ * Tree to walk
5303
+ * @param [test]
5304
+ * `unist-util-is`-compatible test
5305
+ * @param visitor
5306
+ * Function called for nodes that pass `test`.
5307
+ * @param reverse
5308
+ * Traverse in reverse preorder (NRL) instead of preorder (NLR) (default).
5309
+ */
5310
+ const visit =
5311
+ /**
5312
+ * @type {(
5313
+ * (<Tree extends Node, Check extends Test>(tree: Tree, test: Check, visitor: import('./complex-types.js').BuildVisitor<Tree, Check>, reverse?: boolean) => void) &
5314
+ * (<Tree extends Node>(tree: Tree, visitor: import('./complex-types.js').BuildVisitor<Tree>, reverse?: boolean) => void)
5315
+ * )}
5316
+ */
5317
+ (
5318
+ /**
5319
+ * @param {Node} tree
5320
+ * @param {Test} test
5321
+ * @param {import('./complex-types.js').Visitor} visitor
5322
+ * @param {boolean} [reverse]
5323
+ */
5324
+ function (tree, test, visitor, reverse) {
5325
+ if (typeof test === 'function' && typeof visitor !== 'function') {
5326
+ reverse = visitor;
5327
+ visitor = test;
5328
+ test = null;
5329
+ }
5330
+
5331
+ visitParents(tree, test, overload, reverse);
5332
+
5333
+ /**
5334
+ * @param {Node} node
5335
+ * @param {Array<Parent>} parents
5336
+ */
5337
+ function overload(node, parents) {
5338
+ const parent = parents[parents.length - 1];
5339
+ return visitor(
5340
+ node,
5341
+ parent ? parent.children.indexOf(node) : null,
5342
+ parent
5343
+ )
5344
+ }
5345
+ }
5346
+ );
5347
+
5348
+ function escapeRegExp(text) {
5349
+ return text.replace(/[-[\]{}()*+?.,/\\^$|#]/g, '\\$&');
5350
+ }
5351
+ var detectHttp = /(http(s?):\/\/)?(www\.)?/;
5352
+ var messageCodeBlocks = function (message) {
5353
+ var codeRegex = /```[a-z]*\n[\s\S]*?\n```|`[a-z]*[\s\S]*?`/gm;
5354
+ var matches = message.match(codeRegex);
5355
+ return matches || [];
5356
+ };
5357
+ var matchMarkdownLinks = function (message) {
5358
+ var regexMdLinks = /\[([^[]+)\](\(.*\))/gm;
5359
+ var matches = message.match(regexMdLinks);
5360
+ var singleMatch = /\[([^[]+)\]\((.*)\)/;
5361
+ var links = matches
5362
+ ? matches.map(function (match) {
5363
+ var i = singleMatch.exec(match);
5364
+ return i && [i[1], i[2]];
5365
+ })
5366
+ : [];
5367
+ return links.flat();
5368
+ };
5369
+
5370
+ var mentionsMarkdownPlugin = function (mentioned_users) { return function () {
5371
+ var mentioned_usernames = mentioned_users
5372
+ .map(function (user) { return user.name || user.id; })
5373
+ .filter(Boolean)
5374
+ .map(escapeRegExp);
5375
+ var mentionedUsersRegex = new RegExp(mentioned_usernames.map(function (username) { return "@".concat(username); }).join('|'), 'g');
5376
+ var replace = function (match) {
5377
+ var usernameOrId = match.replace('@', '');
5378
+ var user = mentioned_users.find(function (_a) {
5379
+ var id = _a.id, name = _a.name;
5380
+ return name === usernameOrId || id === usernameOrId;
5381
+ });
5382
+ return u('element', { mentionedUser: user, tagName: 'mention' }, [u('text', match)]);
5383
+ };
5384
+ var transform = function (tree) {
5385
+ if (!mentioned_usernames.length)
5386
+ return tree;
5387
+ // handles special cases of mentions where user.name is an e-mail
5388
+ // Remark GFM translates all e-mail-like text nodes to links creating
5389
+ // two separate child nodes "@" and "your.name@as.email" instead of
5390
+ // keeping it as one text node with value "@your.name@as.email"
5391
+ // this piece finds these two separated nodes and merges them together
5392
+ // before "replace" function takes over
5393
+ visit(tree, function (node, index, parent) {
5394
+ var _a;
5395
+ if (index === null)
5396
+ return;
5397
+ if (!parent)
5398
+ return;
5399
+ var nextChild = parent.children.at(index + 1);
5400
+ var nextChildHref = (_a = nextChild === null || nextChild === void 0 ? void 0 : nextChild.properties) === null || _a === void 0 ? void 0 : _a.href;
5401
+ if (node.type === 'text' &&
5402
+ // text value has to have @ sign at the end of the string
5403
+ // and no other characters except whitespace can precede it
5404
+ // valid cases: "text @", "@", " @"
5405
+ // invalid cases: "text@", "@text",
5406
+ /.?\s?@$|^@$/.test(node.value) &&
5407
+ (nextChildHref === null || nextChildHref === void 0 ? void 0 : nextChildHref.startsWith('mailto:'))) {
5408
+ var newTextValue = node.value.replace(/@$/, '');
5409
+ var username = nextChildHref.replace('mailto:', '');
5410
+ parent.children[index] = u('text', newTextValue);
5411
+ parent.children[index + 1] = u('text', "@".concat(username));
5412
+ }
5413
+ });
5414
+ return findAndReplace$1(tree, mentionedUsersRegex, replace);
5415
+ };
5416
+ return transform;
5417
+ }; };
5418
+ var emojiMarkdownPlugin = function () {
5419
+ var replace = function (match) {
5420
+ return u('element', { tagName: 'emoji' }, [u('text', match)]);
5421
+ };
5422
+ var transform = function (node) { return findAndReplace$1(node, emojiRegex__default["default"](), replace); };
5423
+ return transform;
5424
+ };
5425
+
5082
5426
  const protocols = ['http', 'https', 'mailto', 'tel'];
5083
5427
 
5084
5428
  /**
@@ -17874,53 +18218,6 @@ function remarkParse(options) {
17874
18218
  Object.assign(this, {Parser: parser});
17875
18219
  }
17876
18220
 
17877
- /**
17878
- * @typedef {import('unist').Node} Node
17879
- * @typedef {import('unist').Parent} Parent
17880
- * @typedef {import('unist').Literal} Literal
17881
- * @typedef {Object.<string, unknown>} Props
17882
- * @typedef {Array.<Node>|string} ChildrenOrValue
17883
- *
17884
- * @typedef {(<T extends string, P extends Record<string, unknown>, C extends Node[]>(type: T, props: P, children: C) => {type: T, children: C} & P)} BuildParentWithProps
17885
- * @typedef {(<T extends string, P extends Record<string, unknown>>(type: T, props: P, value: string) => {type: T, value: string} & P)} BuildLiteralWithProps
17886
- * @typedef {(<T extends string, P extends Record<string, unknown>>(type: T, props: P) => {type: T} & P)} BuildVoidWithProps
17887
- * @typedef {(<T extends string, C extends Node[]>(type: T, children: C) => {type: T, children: C})} BuildParent
17888
- * @typedef {(<T extends string>(type: T, value: string) => {type: T, value: string})} BuildLiteral
17889
- * @typedef {(<T extends string>(type: T) => {type: T})} BuildVoid
17890
- */
17891
-
17892
- var u = /**
17893
- * @type {BuildVoid & BuildVoidWithProps & BuildLiteral & BuildLiteralWithProps & BuildParent & BuildParentWithProps}
17894
- */ (
17895
- /**
17896
- * @param {string} type Type of node
17897
- * @param {Props|ChildrenOrValue} [props] Additional properties for node (or `children` or `value`)
17898
- * @param {ChildrenOrValue} [value] `children` or `value` of node
17899
- * @returns {Node}
17900
- */
17901
- function (type, props, value) {
17902
- /** @type {Node} */
17903
- var node = {type: String(type)};
17904
-
17905
- if (
17906
- (value === undefined || value === null) &&
17907
- (typeof props === 'string' || Array.isArray(props))
17908
- ) {
17909
- value = props;
17910
- } else {
17911
- Object.assign(node, props);
17912
- }
17913
-
17914
- if (Array.isArray(value)) {
17915
- node.children = value;
17916
- } else if (value !== undefined && value !== null) {
17917
- node.value = String(value);
17918
- }
17919
-
17920
- return node
17921
- }
17922
- );
17923
-
17924
18221
  /**
17925
18222
  * @typedef {import('mdast').Root|import('mdast').Parent['children'][number]} MdastNode
17926
18223
  * @typedef {import('./index.js').H} H
@@ -18028,226 +18325,6 @@ function all(h, parent) {
18028
18325
  return values
18029
18326
  }
18030
18327
 
18031
- /**
18032
- * @param {string} d
18033
- * @returns {string}
18034
- */
18035
- function color(d) {
18036
- return '\u001B[33m' + d + '\u001B[39m'
18037
- }
18038
-
18039
- /**
18040
- * @typedef {import('unist').Node} Node
18041
- * @typedef {import('unist').Parent} Parent
18042
- * @typedef {import('unist-util-is').Test} Test
18043
- * @typedef {import('./complex-types.js').Action} Action
18044
- * @typedef {import('./complex-types.js').Index} Index
18045
- * @typedef {import('./complex-types.js').ActionTuple} ActionTuple
18046
- * @typedef {import('./complex-types.js').VisitorResult} VisitorResult
18047
- * @typedef {import('./complex-types.js').Visitor} Visitor
18048
- */
18049
-
18050
- /**
18051
- * Continue traversing as normal
18052
- */
18053
- const CONTINUE = true;
18054
- /**
18055
- * Do not traverse this node’s children
18056
- */
18057
- const SKIP = 'skip';
18058
- /**
18059
- * Stop traversing immediately
18060
- */
18061
- const EXIT = false;
18062
-
18063
- /**
18064
- * Visit children of tree which pass test.
18065
- *
18066
- * @param tree
18067
- * Tree to walk
18068
- * @param [test]
18069
- * `unist-util-is`-compatible test
18070
- * @param visitor
18071
- * Function called for nodes that pass `test`.
18072
- * @param [reverse=false]
18073
- * Traverse in reverse preorder (NRL) instead of preorder (NLR) (default).
18074
- */
18075
- const visitParents =
18076
- /**
18077
- * @type {(
18078
- * (<Tree extends Node, Check extends Test>(tree: Tree, test: Check, visitor: import('./complex-types.js').BuildVisitor<Tree, Check>, reverse?: boolean) => void) &
18079
- * (<Tree extends Node>(tree: Tree, visitor: import('./complex-types.js').BuildVisitor<Tree>, reverse?: boolean) => void)
18080
- * )}
18081
- */
18082
- (
18083
- /**
18084
- * @param {Node} tree
18085
- * @param {Test} test
18086
- * @param {import('./complex-types.js').Visitor<Node>} visitor
18087
- * @param {boolean} [reverse=false]
18088
- */
18089
- function (tree, test, visitor, reverse) {
18090
- if (typeof test === 'function' && typeof visitor !== 'function') {
18091
- reverse = visitor;
18092
- // @ts-expect-error no visitor given, so `visitor` is test.
18093
- visitor = test;
18094
- test = null;
18095
- }
18096
-
18097
- const is = convert(test);
18098
- const step = reverse ? -1 : 1;
18099
-
18100
- factory(tree, null, [])();
18101
-
18102
- /**
18103
- * @param {Node} node
18104
- * @param {number?} index
18105
- * @param {Array<Parent>} parents
18106
- */
18107
- function factory(node, index, parents) {
18108
- /** @type {Record<string, unknown>} */
18109
- // @ts-expect-error: hush
18110
- const value = typeof node === 'object' && node !== null ? node : {};
18111
- /** @type {string|undefined} */
18112
- let name;
18113
-
18114
- if (typeof value.type === 'string') {
18115
- name =
18116
- typeof value.tagName === 'string'
18117
- ? value.tagName
18118
- : typeof value.name === 'string'
18119
- ? value.name
18120
- : undefined;
18121
-
18122
- Object.defineProperty(visit, 'name', {
18123
- value:
18124
- 'node (' +
18125
- color(value.type + (name ? '<' + name + '>' : '')) +
18126
- ')'
18127
- });
18128
- }
18129
-
18130
- return visit
18131
-
18132
- function visit() {
18133
- /** @type {ActionTuple} */
18134
- let result = [];
18135
- /** @type {ActionTuple} */
18136
- let subresult;
18137
- /** @type {number} */
18138
- let offset;
18139
- /** @type {Array<Parent>} */
18140
- let grandparents;
18141
-
18142
- if (!test || is(node, index, parents[parents.length - 1] || null)) {
18143
- result = toResult(visitor(node, parents));
18144
-
18145
- if (result[0] === EXIT) {
18146
- return result
18147
- }
18148
- }
18149
-
18150
- // @ts-expect-error looks like a parent.
18151
- if (node.children && result[0] !== SKIP) {
18152
- // @ts-expect-error looks like a parent.
18153
- offset = (reverse ? node.children.length : -1) + step;
18154
- // @ts-expect-error looks like a parent.
18155
- grandparents = parents.concat(node);
18156
-
18157
- // @ts-expect-error looks like a parent.
18158
- while (offset > -1 && offset < node.children.length) {
18159
- // @ts-expect-error looks like a parent.
18160
- subresult = factory(node.children[offset], offset, grandparents)();
18161
-
18162
- if (subresult[0] === EXIT) {
18163
- return subresult
18164
- }
18165
-
18166
- offset =
18167
- typeof subresult[1] === 'number' ? subresult[1] : offset + step;
18168
- }
18169
- }
18170
-
18171
- return result
18172
- }
18173
- }
18174
- }
18175
- );
18176
-
18177
- /**
18178
- * @param {VisitorResult} value
18179
- * @returns {ActionTuple}
18180
- */
18181
- function toResult(value) {
18182
- if (Array.isArray(value)) {
18183
- return value
18184
- }
18185
-
18186
- if (typeof value === 'number') {
18187
- return [CONTINUE, value]
18188
- }
18189
-
18190
- return [value]
18191
- }
18192
-
18193
- /**
18194
- * @typedef {import('unist').Node} Node
18195
- * @typedef {import('unist').Parent} Parent
18196
- * @typedef {import('unist-util-is').Test} Test
18197
- * @typedef {import('unist-util-visit-parents').VisitorResult} VisitorResult
18198
- * @typedef {import('./complex-types.js').Visitor} Visitor
18199
- */
18200
-
18201
- /**
18202
- * Visit children of tree which pass test.
18203
- *
18204
- * @param tree
18205
- * Tree to walk
18206
- * @param [test]
18207
- * `unist-util-is`-compatible test
18208
- * @param visitor
18209
- * Function called for nodes that pass `test`.
18210
- * @param reverse
18211
- * Traverse in reverse preorder (NRL) instead of preorder (NLR) (default).
18212
- */
18213
- const visit =
18214
- /**
18215
- * @type {(
18216
- * (<Tree extends Node, Check extends Test>(tree: Tree, test: Check, visitor: import('./complex-types.js').BuildVisitor<Tree, Check>, reverse?: boolean) => void) &
18217
- * (<Tree extends Node>(tree: Tree, visitor: import('./complex-types.js').BuildVisitor<Tree>, reverse?: boolean) => void)
18218
- * )}
18219
- */
18220
- (
18221
- /**
18222
- * @param {Node} tree
18223
- * @param {Test} test
18224
- * @param {import('./complex-types.js').Visitor} visitor
18225
- * @param {boolean} [reverse]
18226
- */
18227
- function (tree, test, visitor, reverse) {
18228
- if (typeof test === 'function' && typeof visitor !== 'function') {
18229
- reverse = visitor;
18230
- visitor = test;
18231
- test = null;
18232
- }
18233
-
18234
- visitParents(tree, test, overload, reverse);
18235
-
18236
- /**
18237
- * @param {Node} node
18238
- * @param {Array<Parent>} parents
18239
- */
18240
- function overload(node, parents) {
18241
- const parent = parents[parents.length - 1];
18242
- return visitor(
18243
- node,
18244
- parent ? parent.children.indexOf(node) : null,
18245
- parent
18246
- )
18247
- }
18248
- }
18249
- );
18250
-
18251
18328
  /**
18252
18329
  * @typedef {import('unist').Position} Position
18253
18330
  * @typedef {import('unist').Node} Node
@@ -26097,14 +26174,26 @@ function remarkGfm(options = {}) {
26097
26174
  }
26098
26175
  }
26099
26176
 
26100
- var isOnlyEmojis = function (text) {
26101
- if (!text)
26102
- return false;
26103
- var noEmojis = text.replace(emojiRegex__default["default"](), '');
26104
- var noSpace = noEmojis.replace(/[\s\n]/gm, '');
26105
- return !noSpace;
26177
+ var Emoji = function (_a) {
26178
+ var children = _a.children;
26179
+ return (React__default["default"].createElement("span", { className: 'inline-text-emoji', "data-testid": 'inline-text-emoji' }, children));
26180
+ };
26181
+
26182
+ var Anchor = function (_a) {
26183
+ var children = _a.children, href = _a.href;
26184
+ var isEmail = href === null || href === void 0 ? void 0 : href.startsWith('mailto:');
26185
+ var isUrl = href === null || href === void 0 ? void 0 : href.startsWith('http');
26186
+ if (!href || (!isEmail && !isUrl))
26187
+ return React__default["default"].createElement(React__default["default"].Fragment, null, children);
26188
+ return (React__default["default"].createElement("a", { className: clsx({ 'str-chat__message-url-link': isUrl }), href: href, rel: 'nofollow noreferrer noopener', target: '_blank' }, children));
26189
+ };
26190
+
26191
+ var Mention = function (_a) {
26192
+ var children = _a.children, mentionedUser = _a.node.mentionedUser;
26193
+ return (React__default["default"].createElement("span", { className: 'str-chat__message-mention', "data-user-id": mentionedUser.id }, children));
26106
26194
  };
26107
- var allowedMarkups = [
26195
+
26196
+ var defaultAllowedTagNames = [
26108
26197
  'html',
26109
26198
  'text',
26110
26199
  'br',
@@ -26123,24 +26212,6 @@ var allowedMarkups = [
26123
26212
  'emoji',
26124
26213
  'mention',
26125
26214
  ];
26126
- var matchMarkdownLinks = function (message) {
26127
- var regexMdLinks = /\[([^[]+)\](\(.*\))/gm;
26128
- var matches = message.match(regexMdLinks);
26129
- var singleMatch = /\[([^[]+)\]\((.*)\)/;
26130
- var links = matches
26131
- ? matches.map(function (match) {
26132
- var i = singleMatch.exec(match);
26133
- return i && [i[1], i[2]];
26134
- })
26135
- : [];
26136
- return links.flat();
26137
- };
26138
- var messageCodeBlocks = function (message) {
26139
- var codeRegex = /```[a-z]*\n[\s\S]*?\n```|`[a-z]*[\s\S]*?`/gm;
26140
- var matches = message.match(codeRegex);
26141
- return matches || [];
26142
- };
26143
- var detectHttp = /(http(s?):\/\/)?(www\.)?/;
26144
26215
  function formatUrlForDisplay(url) {
26145
26216
  try {
26146
26217
  return decodeURIComponent(url).replace(detectHttp, '');
@@ -26157,84 +26228,15 @@ function encodeDecode(url) {
26157
26228
  return url;
26158
26229
  }
26159
26230
  }
26160
- var Anchor = function (_a) {
26161
- var children = _a.children, href = _a.href;
26162
- var isEmail = href === null || href === void 0 ? void 0 : href.startsWith('mailto:');
26163
- var isUrl = href === null || href === void 0 ? void 0 : href.startsWith('http');
26164
- if (!href || (!isEmail && !isUrl))
26165
- return React__default["default"].createElement(React__default["default"].Fragment, null, children);
26166
- return (React__default["default"].createElement("a", { className: clsx({ 'str-chat__message-url-link': isUrl }), href: href, rel: 'nofollow noreferrer noopener', target: '_blank' }, children));
26167
- };
26168
- var Emoji = function (_a) {
26169
- var children = _a.children;
26170
- return (React__default["default"].createElement("span", { className: 'inline-text-emoji', "data-testid": 'inline-text-emoji' }, children));
26171
- };
26172
- var Mention = function (_a) {
26173
- var children = _a.children, mentionedUser = _a.node.mentionedUser;
26174
- return (React__default["default"].createElement("span", { className: 'str-chat__message-mention', "data-user-id": mentionedUser.id }, children));
26175
- };
26231
+ var transformLinkUri = function (uri) { return (uri.startsWith('app://') ? uri : uriTransformer(uri)); };
26232
+ var getPluginsForward = function (plugins) { return plugins; };
26176
26233
  var markDownRenderers = {
26177
26234
  a: Anchor,
26178
26235
  emoji: Emoji,
26179
26236
  mention: Mention,
26180
26237
  };
26181
- var emojiMarkdownPlugin = function () {
26182
- var replace = function (match) {
26183
- return u('element', { tagName: 'emoji' }, [u('text', match)]);
26184
- };
26185
- var transform = function (node) { return findAndReplace$1(node, emojiRegex__default["default"](), replace); };
26186
- return transform;
26187
- };
26188
- var mentionsMarkdownPlugin = function (mentioned_users) { return function () {
26189
- var mentioned_usernames = mentioned_users
26190
- .map(function (user) { return user.name || user.id; })
26191
- .filter(Boolean)
26192
- .map(escapeRegExp);
26193
- var mentionedUsersRegex = new RegExp(mentioned_usernames.map(function (username) { return "@".concat(username); }).join('|'), 'g');
26194
- var replace = function (match) {
26195
- var usernameOrId = match.replace('@', '');
26196
- var user = mentioned_users.find(function (_a) {
26197
- var id = _a.id, name = _a.name;
26198
- return name === usernameOrId || id === usernameOrId;
26199
- });
26200
- return u('element', { mentionedUser: user, tagName: 'mention' }, [u('text', match)]);
26201
- };
26202
- var transform = function (tree) {
26203
- if (!mentioned_usernames.length)
26204
- return tree;
26205
- // handles special cases of mentions where user.name is an e-mail
26206
- // Remark GFM translates all e-mail-like text nodes to links creating
26207
- // two separate child nodes "@" and "your.name@as.email" instead of
26208
- // keeping it as one text node with value "@your.name@as.email"
26209
- // this piece finds these two separated nodes and merges them together
26210
- // before "replace" function takes over
26211
- visit(tree, function (node, index, parent) {
26212
- var _a;
26213
- if (index === null)
26214
- return;
26215
- if (!parent)
26216
- return;
26217
- var nextChild = parent.children.at(index + 1);
26218
- var nextChildHref = (_a = nextChild === null || nextChild === void 0 ? void 0 : nextChild.properties) === null || _a === void 0 ? void 0 : _a.href;
26219
- if (node.type === 'text' &&
26220
- // text value has to have @ sign at the end of the string
26221
- // and no other characters except whitespace can precede it
26222
- // valid cases: "text @", "@", " @"
26223
- // invalid cases: "text@", "@text",
26224
- /.?\s?@$|^@$/.test(node.value) &&
26225
- (nextChildHref === null || nextChildHref === void 0 ? void 0 : nextChildHref.startsWith('mailto:'))) {
26226
- var newTextValue = node.value.replace(/@$/, '');
26227
- var username = nextChildHref.replace('mailto:', '');
26228
- parent.children[index] = u('text', newTextValue);
26229
- parent.children[index + 1] = u('text', "@".concat(username));
26230
- }
26231
- });
26232
- return findAndReplace$1(tree, mentionedUsersRegex, replace);
26233
- };
26234
- return transform;
26235
- }; };
26236
26238
  var renderText = function (text, mentionedUsers, _a) {
26237
- var _b = _a === void 0 ? {} : _a, customMarkDownRenderers = _b.customMarkDownRenderers;
26239
+ var _b = _a === void 0 ? {} : _a, _c = _b.allowedTagNames, allowedTagNames = _c === void 0 ? defaultAllowedTagNames : _c, customMarkDownRenderers = _b.customMarkDownRenderers, _d = _b.getRehypePlugins, getRehypePlugins = _d === void 0 ? getPluginsForward : _d, _e = _b.getRemarkPlugins, getRemarkPlugins = _e === void 0 ? getPluginsForward : _e;
26238
26240
  // take the @ mentions and turn them into markdown?
26239
26241
  // translate links
26240
26242
  if (!text)
@@ -26282,6 +26284,7 @@ var renderText = function (text, mentionedUsers, _a) {
26282
26284
  catch (e) {
26283
26285
  }
26284
26286
  });
26287
+ var remarkPlugins = [[remarkGfm, { singleTilde: false }]];
26285
26288
  var rehypePlugins = [emojiMarkdownPlugin];
26286
26289
  if (mentionedUsers === null || mentionedUsers === void 0 ? void 0 : mentionedUsers.length) {
26287
26290
  rehypePlugins.push(mentionsMarkdownPlugin(mentionedUsers));
@@ -26302,65 +26305,7 @@ var renderText = function (text, mentionedUsers, _a) {
26302
26305
  };
26303
26306
  }
26304
26307
  var rehypeComponents = __assign(__assign({}, markDownRenderers), customMarkDownRenderers);
26305
- return (React__default["default"].createElement(ReactMarkdown, { allowedElements: allowedMarkups, components: rehypeComponents, rehypePlugins: rehypePlugins, remarkPlugins: [[remarkGfm, { singleTilde: false }]], skipHtml: true, transformLinkUri: function (uri) { return (uri.startsWith('app://') ? uri : uriTransformer(uri)); }, unwrapDisallowed: true }, newText));
26306
- };
26307
- function escapeRegExp(text) {
26308
- return text.replace(/[-[\]{}()*+?.,/\\^$|#]/g, '\\$&');
26309
- }
26310
- /**
26311
- * @deprecated will be removed in the next major release
26312
- */
26313
- var generateRandomId = nanoid;
26314
- // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charAt#getting_whole_characters
26315
- var getWholeChar = function (str, i) {
26316
- var code = str.charCodeAt(i);
26317
- if (Number.isNaN(code))
26318
- return '';
26319
- if (code < 0xd800 || code > 0xdfff)
26320
- return str.charAt(i);
26321
- if (0xd800 <= code && code <= 0xdbff) {
26322
- if (str.length <= i + 1) {
26323
- throw 'High surrogate without following low surrogate';
26324
- }
26325
- var next = str.charCodeAt(i + 1);
26326
- if (0xdc00 > next || next > 0xdfff) {
26327
- throw 'High surrogate without following low surrogate';
26328
- }
26329
- return str.charAt(i) + str.charAt(i + 1);
26330
- }
26331
- if (i === 0) {
26332
- throw 'Low surrogate without preceding high surrogate';
26333
- }
26334
- var prev = str.charCodeAt(i - 1);
26335
- if (0xd800 > prev || prev > 0xdbff) {
26336
- throw 'Low surrogate without preceding high surrogate';
26337
- }
26338
- return '';
26339
- };
26340
-
26341
- var DefaultSuggestionListHeader = function (props) {
26342
- var currentTrigger = props.currentTrigger, value = props.value;
26343
- var t = useTranslationContext('DefaultSuggestionListHeader').t;
26344
- var triggerIndex = value.lastIndexOf(currentTrigger);
26345
- if (currentTrigger === '/') {
26346
- return (React__default["default"].createElement(React__default["default"].Fragment, null,
26347
- t('Commands matching'),
26348
- " ",
26349
- React__default["default"].createElement("strong", null, value.slice(triggerIndex + 1))));
26350
- }
26351
- if (currentTrigger === ':') {
26352
- return (React__default["default"].createElement(React__default["default"].Fragment, null,
26353
- t('Emoji matching'),
26354
- " ",
26355
- React__default["default"].createElement("strong", null, value.slice(triggerIndex + 1))));
26356
- }
26357
- if (currentTrigger === '@') {
26358
- return (React__default["default"].createElement(React__default["default"].Fragment, null,
26359
- t('People matching'),
26360
- " ",
26361
- React__default["default"].createElement("strong", null, value.slice(triggerIndex + 1))));
26362
- }
26363
- return null;
26308
+ return (React__default["default"].createElement(ReactMarkdown, { allowedElements: allowedTagNames, components: rehypeComponents, rehypePlugins: getRehypePlugins(rehypePlugins), remarkPlugins: getRemarkPlugins(remarkPlugins), skipHtml: true, transformLinkUri: transformLinkUri, unwrapDisallowed: true }, newText));
26364
26309
  };
26365
26310
 
26366
26311
  function ownKeys$1(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
@@ -26386,7 +26331,7 @@ var List = function List(_ref) {
26386
26331
  AutocompleteSuggestionItem = _useComponentContext.AutocompleteSuggestionItem;
26387
26332
  var _useChatContext = useChatContext('SuggestionList'),
26388
26333
  themeVersion = _useChatContext.themeVersion;
26389
- var SuggestionItem = PropSuggestionItem || AutocompleteSuggestionItem || Item;
26334
+ var SuggestionItem = PropSuggestionItem || AutocompleteSuggestionItem || Item$1;
26390
26335
  var SuggestionHeader = PropHeader || AutocompleteSuggestionHeader || DefaultSuggestionListHeader;
26391
26336
  var _useState = React.useState(undefined),
26392
26337
  _useState2 = _slicedToArray__default["default"](_useState, 2),
@@ -26563,6 +26508,33 @@ var UnMemoizedCommandItem = function (props) {
26563
26508
  };
26564
26509
  var CommandItem = React__default["default"].memo(UnMemoizedCommandItem);
26565
26510
 
26511
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charAt#getting_whole_characters
26512
+ var getWholeChar = function (str, i) {
26513
+ var code = str.charCodeAt(i);
26514
+ if (Number.isNaN(code))
26515
+ return '';
26516
+ if (code < 0xd800 || code > 0xdfff)
26517
+ return str.charAt(i);
26518
+ if (0xd800 <= code && code <= 0xdbff) {
26519
+ if (str.length <= i + 1) {
26520
+ throw 'High surrogate without following low surrogate';
26521
+ }
26522
+ var next = str.charCodeAt(i + 1);
26523
+ if (0xdc00 > next || next > 0xdfff) {
26524
+ throw 'High surrogate without following low surrogate';
26525
+ }
26526
+ return str.charAt(i) + str.charAt(i + 1);
26527
+ }
26528
+ if (i === 0) {
26529
+ throw 'Low surrogate without preceding high surrogate';
26530
+ }
26531
+ var prev = str.charCodeAt(i - 1);
26532
+ if (0xd800 > prev || prev > 0xdbff) {
26533
+ throw 'Low surrogate without preceding high surrogate';
26534
+ }
26535
+ return '';
26536
+ };
26537
+
26566
26538
  /**
26567
26539
  * A round avatar image with fallback to username's first letter
26568
26540
  */
@@ -27265,6 +27237,31 @@ ReactTextareaAutocomplete.propTypes = {
27265
27237
  value: PropTypes__default["default"].string
27266
27238
  };
27267
27239
 
27240
+ let urlAlphabet =
27241
+ 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict';
27242
+
27243
+ const POOL_SIZE_MULTIPLIER = 128;
27244
+ let pool, poolOffset;
27245
+ let fillPool = bytes => {
27246
+ if (!pool || pool.length < bytes) {
27247
+ pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER);
27248
+ crypto__default["default"].randomFillSync(pool);
27249
+ poolOffset = 0;
27250
+ } else if (poolOffset + bytes > pool.length) {
27251
+ crypto__default["default"].randomFillSync(pool);
27252
+ poolOffset = 0;
27253
+ }
27254
+ poolOffset += bytes;
27255
+ };
27256
+ let nanoid = (size = 21) => {
27257
+ fillPool((size -= 0));
27258
+ let id = '';
27259
+ for (let i = poolOffset - size; i < poolOffset; i++) {
27260
+ id += urlAlphabet[pool[i] & 63];
27261
+ }
27262
+ return id
27263
+ };
27264
+
27268
27265
  var channelReducer = function (state, action) {
27269
27266
  var _a;
27270
27267
  switch (action.type) {
@@ -28003,6 +28000,13 @@ var getReadByTooltipText = function (users, t, client, tooltipUserNameMapper) {
28003
28000
  }
28004
28001
  return outStr;
28005
28002
  };
28003
+ var isOnlyEmojis = function (text) {
28004
+ if (!text)
28005
+ return false;
28006
+ var noEmojis = text.replace(emojiRegex__default["default"](), '');
28007
+ var noSpace = noEmojis.replace(/[\s\n]/gm, '');
28008
+ return !noSpace;
28009
+ };
28006
28010
 
28007
28011
  var CustomMessageActionsList = function (props) {
28008
28012
  var customMessageActions = props.customMessageActions, message = props.message;
@@ -30438,6 +30442,7 @@ var CooldownTimer = function (_a) {
30438
30442
  var useCommandTrigger = function () {
30439
30443
  var themeVersion = useChatContext('useCommandTrigger').themeVersion;
30440
30444
  var channelConfig = useChannelStateContext('useCommandTrigger').channelConfig;
30445
+ var t = useTranslationContext('useCommandTrigger').t;
30441
30446
  var commands = channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.commands;
30442
30447
  return {
30443
30448
  component: CommandItem,
@@ -30446,7 +30451,7 @@ var useCommandTrigger = function () {
30446
30451
  return [];
30447
30452
  }
30448
30453
  var selectedCommands = commands.filter(function (command) { var _a; return ((_a = command.name) === null || _a === void 0 ? void 0 : _a.indexOf(query)) !== -1; });
30449
- // sort alphabetically unless the you're matching the first char
30454
+ // sort alphabetically unless you're matching the first char
30450
30455
  selectedCommands.sort(function (a, b) {
30451
30456
  var _a, _b;
30452
30457
  var nameA = (_a = a.name) === null || _a === void 0 ? void 0 : _a.toLowerCase();
@@ -30470,8 +30475,25 @@ var useCommandTrigger = function () {
30470
30475
  });
30471
30476
  var result = selectedCommands.slice(0, themeVersion === '2' ? 5 : 10);
30472
30477
  if (onReady)
30473
- onReady(result.filter(function (result) {
30478
+ onReady(result
30479
+ .filter(function (result) {
30474
30480
  return result.name !== undefined;
30481
+ })
30482
+ .map(function (commandData) {
30483
+ var translatedCommandData = {
30484
+ name: t("".concat(commandData.name, "-command-name"), {
30485
+ defaultValue: commandData.name,
30486
+ }),
30487
+ };
30488
+ if (commandData.args)
30489
+ translatedCommandData.args = t("".concat(commandData.name, "-command-args"), {
30490
+ defaultValue: commandData.args,
30491
+ });
30492
+ if (commandData.description)
30493
+ translatedCommandData.description = t("".concat(commandData.name, "-command-description"), {
30494
+ defaultValue: commandData.description,
30495
+ });
30496
+ return translatedCommandData;
30475
30497
  }), query);
30476
30498
  return result;
30477
30499
  },
@@ -34994,7 +35016,8 @@ var UnMemoizedChannelList = function (props) {
34994
35016
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
34995
35017
  React__default["default"].createElement("div", { className: className, ref: channelListRef },
34996
35018
  showChannelSearch && (React__default["default"].createElement(ChannelSearch$1, __assign({ onSearch: onSearch, onSearchExit: onSearchExit, setChannels: setChannels }, additionalChannelSearchProps))),
34997
- showChannelList && (React__default["default"].createElement(List, { error: channelsQueryState.error, loadedChannels: sendChannelsToList ? loadedChannels : undefined, loading: channelsQueryState.queryInProgress === 'reload', LoadingErrorIndicator: LoadingErrorIndicator, LoadingIndicator: LoadingIndicator, setChannels: setChannels }, !(loadedChannels === null || loadedChannels === void 0 ? void 0 : loadedChannels.length) ? (React__default["default"].createElement(EmptyStateIndicator$1, { listType: 'channel' })) : (React__default["default"].createElement(Paginator, { hasNextPage: hasNextPage, isLoading: channelsQueryState.queryInProgress === 'load-more', loadNextPage: loadNextPage }, renderChannels
35019
+ showChannelList && (React__default["default"].createElement(List, { error: channelsQueryState.error, loadedChannels: sendChannelsToList ? loadedChannels : undefined, loading: !!channelsQueryState.queryInProgress &&
35020
+ ['reload', 'uninitialized'].includes(channelsQueryState.queryInProgress), LoadingErrorIndicator: LoadingErrorIndicator, LoadingIndicator: LoadingIndicator, setChannels: setChannels }, !(loadedChannels === null || loadedChannels === void 0 ? void 0 : loadedChannels.length) ? (React__default["default"].createElement(EmptyStateIndicator$1, { listType: 'channel' })) : (React__default["default"].createElement(Paginator, { hasNextPage: hasNextPage, isLoading: channelsQueryState.queryInProgress === 'load-more', loadNextPage: loadNextPage }, renderChannels
34998
35021
  ? renderChannels(loadedChannels, renderChannel)
34999
35022
  : loadedChannels.map(function (channel) { return renderChannel(channel); }))))))));
35000
35023
  };
@@ -35003,7 +35026,7 @@ var UnMemoizedChannelList = function (props) {
35003
35026
  */
35004
35027
  var ChannelList = React__default["default"].memo(UnMemoizedChannelList);
35005
35028
 
35006
- var version = '10.14.1';
35029
+ var version = '10.16.0';
35007
35030
 
35008
35031
  var useChat = function (_a) {
35009
35032
  var _b, _c;
@@ -35135,7 +35158,7 @@ var useCreateChatContext = function (value) {
35135
35158
 
35136
35159
  var useChannelsQueryState = function () {
35137
35160
  var _a = React.useState(null), error = _a[0], setError = _a[1];
35138
- var _b = React.useState(null), queryInProgress = _b[0], setQueryInProgress = _b[1];
35161
+ var _b = React.useState('uninitialized'), queryInProgress = _b[0], setQueryInProgress = _b[1];
35139
35162
  return {
35140
35163
  error: error,
35141
35164
  queryInProgress: queryInProgress,
@@ -35227,7 +35250,7 @@ var UnMemoizedDateSeparator = function (props) {
35227
35250
  messageCreatedAt: messageCreatedAt,
35228
35251
  tDateTimeParser: tDateTimeParser,
35229
35252
  });
35230
- return (React__default["default"].createElement("div", { className: 'str-chat__date-separator' },
35253
+ return (React__default["default"].createElement("div", { className: 'str-chat__date-separator', "data-testid": 'date-separator' },
35231
35254
  (position === 'right' || position === 'center') && (React__default["default"].createElement("hr", { className: 'str-chat__date-separator-line' })),
35232
35255
  React__default["default"].createElement("div", { className: 'str-chat__date-separator-date' }, unread ? "".concat(t('New'), " - ").concat(formattedDate) : formattedDate),
35233
35256
  (position === 'left' || position === 'center') && (React__default["default"].createElement("hr", { className: 'str-chat__date-separator-line' }))));
@@ -35247,7 +35270,7 @@ var UnMemoizedEventComponent = function (props) {
35247
35270
  var _e = message.created_at, created_at = _e === void 0 ? '' : _e, event = message.event, text = message.text, type = message.type;
35248
35271
  var getDateOptions = { messageCreatedAt: created_at.toString(), tDateTimeParser: tDateTimeParser };
35249
35272
  if (type === 'system')
35250
- return (React__default["default"].createElement("div", { className: 'str-chat__message--system' },
35273
+ return (React__default["default"].createElement("div", { className: 'str-chat__message--system', "data-testid": 'message-system' },
35251
35274
  React__default["default"].createElement("div", { className: 'str-chat__message--system__text' },
35252
35275
  React__default["default"].createElement("div", { className: 'str-chat__message--system__line' }),
35253
35276
  React__default["default"].createElement("p", null, text),
@@ -36529,23 +36552,6 @@ var UnMemoizedScrollToBottomButton = function (props) {
36529
36552
  };
36530
36553
  var ScrollToBottomButton = React__default["default"].memo(UnMemoizedScrollToBottomButton);
36531
36554
 
36532
- var useGiphyPreview = function (separateGiphyPreview) {
36533
- var _a = React.useState(), giphyPreviewMessage = _a[0], setGiphyPreviewMessage = _a[1];
36534
- var client = useChatContext('useGiphyPreview').client;
36535
- React.useEffect(function () {
36536
- var handleEvent = function (event) {
36537
- var message = event.message, user = event.user;
36538
- if ((message === null || message === void 0 ? void 0 : message.command) === 'giphy' && (user === null || user === void 0 ? void 0 : user.id) === client.userID) {
36539
- setGiphyPreviewMessage(undefined);
36540
- }
36541
- };
36542
- if (separateGiphyPreview)
36543
- client.on('message.new', handleEvent);
36544
- return function () { return client.off('message.new', handleEvent); };
36545
- }, [separateGiphyPreview]);
36546
- return { giphyPreviewMessage: giphyPreviewMessage, setGiphyPreviewMessage: setGiphyPreviewMessage };
36547
- };
36548
-
36549
36555
  function useNewMessageNotification(messages, currentUserId, hasMoreNewer) {
36550
36556
  var _a = React.useState(false), newMessagesNotification = _a[0], setNewMessagesNotification = _a[1];
36551
36557
  var _b = React.useState(true), isMessageListScrolledToBottom = _b[0], setIsMessageListScrolledToBottom = _b[1];
@@ -36669,7 +36675,134 @@ function useShouldForceScrollToBottom(messages, currentUserId) {
36669
36675
  return recheckForNewOwnMessage;
36670
36676
  }
36671
36677
 
36678
+ var useGiphyPreview = function (separateGiphyPreview) {
36679
+ var _a = React.useState(), giphyPreviewMessage = _a[0], setGiphyPreviewMessage = _a[1];
36680
+ var client = useChatContext('useGiphyPreview').client;
36681
+ React.useEffect(function () {
36682
+ var handleEvent = function (event) {
36683
+ var message = event.message, user = event.user;
36684
+ if ((message === null || message === void 0 ? void 0 : message.command) === 'giphy' && (user === null || user === void 0 ? void 0 : user.id) === client.userID) {
36685
+ setGiphyPreviewMessage(undefined);
36686
+ }
36687
+ };
36688
+ if (separateGiphyPreview)
36689
+ client.on('message.new', handleEvent);
36690
+ return function () { return client.off('message.new', handleEvent); };
36691
+ }, [separateGiphyPreview]);
36692
+ return { giphyPreviewMessage: giphyPreviewMessage, setGiphyPreviewMessage: setGiphyPreviewMessage };
36693
+ };
36694
+
36695
+ var useMessageSetKey = function (_a) {
36696
+ var messages = _a.messages;
36697
+ /**
36698
+ * Logic to update the key of the virtuoso component when the list jumps to a new location.
36699
+ */
36700
+ var _b = React.useState(+new Date()), messageSetKey = _b[0], setMessageSetKey = _b[1];
36701
+ var firstMessageId = React.useRef();
36702
+ React.useEffect(function () {
36703
+ var _a;
36704
+ var continuousSet = messages === null || messages === void 0 ? void 0 : messages.find(function (message) { return message.id === firstMessageId.current; });
36705
+ if (!continuousSet) {
36706
+ setMessageSetKey(+new Date());
36707
+ }
36708
+ firstMessageId.current = (_a = messages === null || messages === void 0 ? void 0 : messages[0]) === null || _a === void 0 ? void 0 : _a.id;
36709
+ }, [messages]);
36710
+ return {
36711
+ messageSetKey: messageSetKey,
36712
+ };
36713
+ };
36714
+
36715
+ var useScrollToBottomOnNewMessage = function (_a) {
36716
+ var messages = _a.messages, scrollToBottom = _a.scrollToBottom, scrollToLatestMessageOnFocus = _a.scrollToLatestMessageOnFocus;
36717
+ var _b = React__default["default"].useState(false), newMessagesReceivedInBackground = _b[0], setNewMessagesReceivedInBackground = _b[1];
36718
+ var resetNewMessagesReceivedInBackground = React.useCallback(function () {
36719
+ setNewMessagesReceivedInBackground(false);
36720
+ }, []);
36721
+ React.useEffect(function () {
36722
+ setNewMessagesReceivedInBackground(true);
36723
+ }, [messages]);
36724
+ var scrollToBottomIfConfigured = React.useCallback(function (event) {
36725
+ if (!scrollToLatestMessageOnFocus ||
36726
+ !newMessagesReceivedInBackground ||
36727
+ event.target !== window)
36728
+ return;
36729
+ setTimeout(scrollToBottom, 100);
36730
+ }, [scrollToLatestMessageOnFocus, scrollToBottom, newMessagesReceivedInBackground]);
36731
+ React.useEffect(function () {
36732
+ if (typeof window !== 'undefined') {
36733
+ window.addEventListener('focus', scrollToBottomIfConfigured);
36734
+ window.addEventListener('blur', resetNewMessagesReceivedInBackground);
36735
+ }
36736
+ return function () {
36737
+ window.removeEventListener('focus', scrollToBottomIfConfigured);
36738
+ window.removeEventListener('blur', resetNewMessagesReceivedInBackground);
36739
+ };
36740
+ }, [scrollToBottomIfConfigured]);
36741
+ };
36742
+
36672
36743
  var PREPEND_OFFSET = Math.pow(10, 7);
36744
+ function calculateItemIndex(virtuosoIndex, numItemsPrepended) {
36745
+ return virtuosoIndex + numItemsPrepended - PREPEND_OFFSET;
36746
+ }
36747
+ function calculateFirstItemIndex(numItemsPrepended) {
36748
+ return PREPEND_OFFSET - numItemsPrepended;
36749
+ }
36750
+ // using 'display: inline-block'
36751
+ // traps CSS margins of the item elements, preventing incorrect item measurements
36752
+ var Item = function (_a) {
36753
+ var _b;
36754
+ var _c;
36755
+ var context = _a.context, props = __rest(_a, ["context"]);
36756
+ if (!context)
36757
+ return React__default["default"].createElement(React__default["default"].Fragment, null);
36758
+ var message = context.processedMessages[calculateItemIndex(props['data-item-index'], context.numItemsPrepended)];
36759
+ var groupStyles = context.messageGroupStyles[message.id];
36760
+ return (React__default["default"].createElement("div", __assign({}, props, { className: ((_c = context === null || context === void 0 ? void 0 : context.customClasses) === null || _c === void 0 ? void 0 : _c.virtualMessage) ||
36761
+ clsx('str-chat__virtual-list-message-wrapper str-chat__li', (_b = {},
36762
+ _b["str-chat__li--".concat(groupStyles)] = groupStyles,
36763
+ _b)) })));
36764
+ };
36765
+ var Header = function (_a) {
36766
+ var context = _a.context;
36767
+ var _b = useComponentContext('VirtualizedMessageListHeader').LoadingIndicator, LoadingIndicator$1 = _b === void 0 ? LoadingIndicator : _b;
36768
+ if (!(context === null || context === void 0 ? void 0 : context.loadingMore))
36769
+ return null;
36770
+ return LoadingIndicator$1 ? (React__default["default"].createElement("div", { className: 'str-chat__virtual-list__loading' },
36771
+ React__default["default"].createElement(LoadingIndicator$1, { size: 20 }))) : ((context === null || context === void 0 ? void 0 : context.head) || null);
36772
+ };
36773
+ var EmptyPlaceholder = function (_a) {
36774
+ var context = _a.context;
36775
+ var _b = useComponentContext('VirtualizedMessageList').EmptyStateIndicator, EmptyStateIndicator$1 = _b === void 0 ? EmptyStateIndicator : _b;
36776
+ return (React__default["default"].createElement(React__default["default"].Fragment, null, EmptyStateIndicator$1 && (React__default["default"].createElement(EmptyStateIndicator$1, { listType: (context === null || context === void 0 ? void 0 : context.threadList) ? 'thread' : 'message' }))));
36777
+ };
36778
+ var Footer = function () {
36779
+ var TypingIndicator = useComponentContext('VirtualizedMessageList').TypingIndicator;
36780
+ return TypingIndicator ? React__default["default"].createElement(TypingIndicator, { avatarSize: 24 }) : null;
36781
+ };
36782
+ var messageRenderer = function (virtuosoIndex, _data, virtuosoContext) {
36783
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
36784
+ var additionalMessageInputProps = virtuosoContext.additionalMessageInputProps, closeReactionSelectorOnClick = virtuosoContext.closeReactionSelectorOnClick, customMessageActions = virtuosoContext.customMessageActions, customMessageRenderer = virtuosoContext.customMessageRenderer, DateSeparator = virtuosoContext.DateSeparator, lastReceivedMessageId = virtuosoContext.lastReceivedMessageId, MessageUIComponent = virtuosoContext.Message, messageActions = virtuosoContext.messageActions, MessageSystem = virtuosoContext.MessageSystem, numItemsPrepended = virtuosoContext.numItemsPrepended, ownMessagesReadByOthers = virtuosoContext.ownMessagesReadByOthers, messageList = virtuosoContext.processedMessages, shouldGroupByUser = virtuosoContext.shouldGroupByUser, virtuosoRef = virtuosoContext.virtuosoRef;
36785
+ var streamMessageIndex = calculateItemIndex(virtuosoIndex, numItemsPrepended);
36786
+ if (customMessageRenderer) {
36787
+ return customMessageRenderer(messageList, streamMessageIndex);
36788
+ }
36789
+ var message = messageList[streamMessageIndex];
36790
+ if (!message)
36791
+ return React__default["default"].createElement("div", { style: { height: '1px' } }); // returning null or zero height breaks the virtuoso
36792
+ if (message.customType === CUSTOM_MESSAGE_TYPE.date && message.date && isDate(message.date)) {
36793
+ return DateSeparator ? React__default["default"].createElement(DateSeparator, { date: message.date, unread: message.unread }) : null;
36794
+ }
36795
+ if (message.type === 'system') {
36796
+ return MessageSystem ? React__default["default"].createElement(MessageSystem, { message: message }) : null;
36797
+ }
36798
+ var groupedByUser = shouldGroupByUser &&
36799
+ streamMessageIndex > 0 &&
36800
+ ((_a = message.user) === null || _a === void 0 ? void 0 : _a.id) === ((_b = messageList[streamMessageIndex - 1].user) === null || _b === void 0 ? void 0 : _b.id);
36801
+ var firstOfGroup = shouldGroupByUser && ((_c = message.user) === null || _c === void 0 ? void 0 : _c.id) !== ((_e = (_d = messageList[streamMessageIndex - 1]) === null || _d === void 0 ? void 0 : _d.user) === null || _e === void 0 ? void 0 : _e.id);
36802
+ var endOfGroup = shouldGroupByUser && ((_f = message.user) === null || _f === void 0 ? void 0 : _f.id) !== ((_h = (_g = messageList[streamMessageIndex + 1]) === null || _g === void 0 ? void 0 : _g.user) === null || _h === void 0 ? void 0 : _h.id);
36803
+ return (React__default["default"].createElement(Message, { additionalMessageInputProps: additionalMessageInputProps, autoscrollToBottom: (_j = virtuosoRef.current) === null || _j === void 0 ? void 0 : _j.autoscrollToBottom, closeReactionSelectorOnClick: closeReactionSelectorOnClick, customMessageActions: customMessageActions, endOfGroup: endOfGroup, firstOfGroup: firstOfGroup, groupedByUser: groupedByUser, lastReceivedId: lastReceivedMessageId, message: message, Message: MessageUIComponent, messageActions: messageActions, readBy: ownMessagesReadByOthers[message.id] || [] }));
36804
+ };
36805
+
36673
36806
  function captureResizeObserverExceededError(e) {
36674
36807
  if (e.message === 'ResizeObserver loop completed with undelivered notifications.' ||
36675
36808
  e.message === 'ResizeObserver loop limit exceeded') {
@@ -36700,19 +36833,21 @@ function calculateInitialTopMostItemIndex(messages, highlightedMessageId) {
36700
36833
  return messages.length - 1;
36701
36834
  }
36702
36835
  var VirtualizedMessageListWithContext = function (props) {
36703
- var additionalVirtuosoProps = props.additionalVirtuosoProps, channel = props.channel, closeReactionSelectorOnClick = props.closeReactionSelectorOnClick, customMessageRenderer = props.customMessageRenderer, defaultItemHeight = props.defaultItemHeight, _a = props.disableDateSeparator, disableDateSeparator = _a === void 0 ? true : _a, groupStyles = props.groupStyles, hasMore = props.hasMore, hasMoreNewer = props.hasMoreNewer, head = props.head, _b = props.hideDeletedMessages, hideDeletedMessages = _b === void 0 ? false : _b, _c = props.hideNewMessageSeparator, hideNewMessageSeparator = _c === void 0 ? false : _c, highlightedMessageId = props.highlightedMessageId, jumpToLatestMessage = props.jumpToLatestMessage, loadingMore = props.loadingMore, loadMore = props.loadMore, loadMoreNewer = props.loadMoreNewer, propMessage = props.Message, _d = props.messageLimit, messageLimit = _d === void 0 ? 100 : _d, messages = props.messages, notifications = props.notifications,
36836
+ var additionalMessageInputProps = props.additionalMessageInputProps, _a = props.additionalVirtuosoProps, additionalVirtuosoProps = _a === void 0 ? {} : _a, channel = props.channel, closeReactionSelectorOnClick = props.closeReactionSelectorOnClick, customMessageActions = props.customMessageActions, customMessageRenderer = props.customMessageRenderer, defaultItemHeight = props.defaultItemHeight, _b = props.disableDateSeparator, disableDateSeparator = _b === void 0 ? true : _b, groupStyles = props.groupStyles, hasMore = props.hasMore, hasMoreNewer = props.hasMoreNewer, head = props.head, _c = props.hideDeletedMessages, hideDeletedMessages = _c === void 0 ? false : _c, _d = props.hideNewMessageSeparator, hideNewMessageSeparator = _d === void 0 ? false : _d, highlightedMessageId = props.highlightedMessageId, jumpToLatestMessage = props.jumpToLatestMessage, loadingMore = props.loadingMore, loadMore = props.loadMore, loadMoreNewer = props.loadMoreNewer, MessageUIComponentFromProps = props.Message, messageActions = props.messageActions, _e = props.messageLimit, messageLimit = _e === void 0 ? 100 : _e, messages = props.messages, notifications = props.notifications,
36704
36837
  // TODO: refactor to scrollSeekPlaceHolderConfiguration and components.ScrollSeekPlaceholder, like the Virtuoso Component
36705
- _e = props.overscan,
36838
+ _f = props.overscan,
36706
36839
  // TODO: refactor to scrollSeekPlaceHolderConfiguration and components.ScrollSeekPlaceholder, like the Virtuoso Component
36707
- overscan = _e === void 0 ? 0 : _e, read = props.read, _f = props.returnAllReadData, returnAllReadData = _f === void 0 ? false : _f, scrollSeekPlaceHolder = props.scrollSeekPlaceHolder, _g = props.scrollToLatestMessageOnFocus, scrollToLatestMessageOnFocus = _g === void 0 ? false : _g, _h = props.separateGiphyPreview, separateGiphyPreview = _h === void 0 ? false : _h, _j = props.shouldGroupByUser, shouldGroupByUser = _j === void 0 ? false : _j, _k = props.stickToBottomScrollBehavior, stickToBottomScrollBehavior = _k === void 0 ? 'smooth' : _k, suppressAutoscroll = props.suppressAutoscroll, threadList = props.threadList;
36840
+ overscan = _f === void 0 ? 0 : _f, read = props.read, _g = props.returnAllReadData, returnAllReadData = _g === void 0 ? false : _g, scrollSeekPlaceHolder = props.scrollSeekPlaceHolder, _h = props.scrollToLatestMessageOnFocus, scrollToLatestMessageOnFocus = _h === void 0 ? false : _h, _j = props.separateGiphyPreview, separateGiphyPreview = _j === void 0 ? false : _j, _k = props.shouldGroupByUser, shouldGroupByUser = _k === void 0 ? false : _k, _l = props.stickToBottomScrollBehavior, stickToBottomScrollBehavior = _l === void 0 ? 'smooth' : _l, suppressAutoscroll = props.suppressAutoscroll, threadList = props.threadList;
36841
+ var virtuosoComponentsFromProps = additionalVirtuosoProps.components, overridingVirtuosoProps = __rest(additionalVirtuosoProps, ["components"]);
36708
36842
  // Stops errors generated from react-virtuoso to bubble up
36709
36843
  // to Sentry or other tracking tools.
36710
36844
  useCaptureResizeObserverExceededError();
36711
- var _l = useComponentContext('VirtualizedMessageList'), _m = _l.DateSeparator, DateSeparator$1 = _m === void 0 ? DateSeparator : _m, _o = _l.EmptyStateIndicator, EmptyStateIndicator$1 = _o === void 0 ? EmptyStateIndicator : _o, _p = _l.GiphyPreviewMessage, GiphyPreviewMessage$1 = _p === void 0 ? GiphyPreviewMessage : _p, _q = _l.LoadingIndicator, LoadingIndicator$1 = _q === void 0 ? LoadingIndicator : _q, _r = _l.MessageListNotifications, MessageListNotifications$1 = _r === void 0 ? MessageListNotifications : _r, _s = _l.MessageNotification, MessageNotification$1 = _s === void 0 ? MessageNotification : _s, _t = _l.MessageSystem, MessageSystem = _t === void 0 ? EventComponent : _t, _u = _l.TypingIndicator, TypingIndicator = _u === void 0 ? null : _u, _v = _l.VirtualMessage, contextMessage = _v === void 0 ? MessageSimple : _v;
36712
- var _w = useChatContext('VirtualizedMessageList'), client = _w.client, customClasses = _w.customClasses;
36845
+ var _m = useComponentContext('VirtualizedMessageList'), _o = _m.DateSeparator, DateSeparator$1 = _o === void 0 ? DateSeparator : _o, _p = _m.GiphyPreviewMessage, GiphyPreviewMessage$1 = _p === void 0 ? GiphyPreviewMessage : _p, _q = _m.MessageListNotifications, MessageListNotifications$1 = _q === void 0 ? MessageListNotifications : _q, _r = _m.MessageNotification, MessageNotification$1 = _r === void 0 ? MessageNotification : _r, _s = _m.MessageSystem, MessageSystem = _s === void 0 ? EventComponent : _s, _t = _m.VirtualMessage, MessageUIComponentFromContext = _t === void 0 ? MessageSimple : _t;
36846
+ var MessageUIComponent = MessageUIComponentFromProps || MessageUIComponentFromContext;
36847
+ var _u = useChatContext('VirtualizedMessageList'), client = _u.client, customClasses = _u.customClasses;
36848
+ var virtuoso = React.useRef(null);
36713
36849
  var lastRead = React.useMemo(function () { var _a; return (_a = channel.lastRead) === null || _a === void 0 ? void 0 : _a.call(channel); }, [channel]);
36714
- var MessageUIComponent = propMessage || contextMessage;
36715
- var _x = useGiphyPreview(separateGiphyPreview), giphyPreviewMessage = _x.giphyPreviewMessage, setGiphyPreviewMessage = _x.setGiphyPreviewMessage;
36850
+ var _v = useGiphyPreview(separateGiphyPreview), giphyPreviewMessage = _v.giphyPreviewMessage, setGiphyPreviewMessage = _v.setGiphyPreviewMessage;
36716
36851
  var processedMessages = React.useMemo(function () {
36717
36852
  if (typeof messages === 'undefined') {
36718
36853
  return [];
@@ -36761,9 +36896,8 @@ var VirtualizedMessageListWithContext = function (props) {
36761
36896
  }, {});
36762
36897
  },
36763
36898
  // processedMessages were incorrectly rebuilt with a new object identity at some point, hence the .length usage
36764
- [processedMessages.length, shouldGroupByUser]);
36765
- var virtuoso = React.useRef(null);
36766
- var _y = useNewMessageNotification(processedMessages, client.userID, hasMoreNewer), atBottom = _y.atBottom, isMessageListScrolledToBottom = _y.isMessageListScrolledToBottom, newMessagesNotification = _y.newMessagesNotification, setIsMessageListScrolledToBottom = _y.setIsMessageListScrolledToBottom, setNewMessagesNotification = _y.setNewMessagesNotification;
36899
+ [processedMessages.length, shouldGroupByUser, groupStylesFn]);
36900
+ var _w = useNewMessageNotification(processedMessages, client.userID, hasMoreNewer), atBottom = _w.atBottom, isMessageListScrolledToBottom = _w.isMessageListScrolledToBottom, newMessagesNotification = _w.newMessagesNotification, setIsMessageListScrolledToBottom = _w.setIsMessageListScrolledToBottom, setNewMessagesNotification = _w.setNewMessagesNotification;
36767
36901
  var scrollToBottom = React.useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
36768
36902
  return __generator(this, function (_a) {
36769
36903
  switch (_a.label) {
@@ -36790,44 +36924,9 @@ var VirtualizedMessageListWithContext = function (props) {
36790
36924
  hasMoreNewer,
36791
36925
  jumpToLatestMessage,
36792
36926
  ]);
36793
- var _z = React__default["default"].useState(false), newMessagesReceivedInBackground = _z[0], setNewMessagesReceivedInBackground = _z[1];
36794
- var resetNewMessagesReceivedInBackground = React.useCallback(function () {
36795
- setNewMessagesReceivedInBackground(false);
36796
- }, []);
36797
- React.useEffect(function () {
36798
- setNewMessagesReceivedInBackground(true);
36799
- }, [messages]);
36800
- var scrollToBottomIfConfigured = React.useCallback(function (event) {
36801
- if (scrollToLatestMessageOnFocus && event.target === window) {
36802
- if (newMessagesReceivedInBackground) {
36803
- setTimeout(scrollToBottom, 100);
36804
- }
36805
- }
36806
- }, [scrollToLatestMessageOnFocus, scrollToBottom, newMessagesReceivedInBackground]);
36807
- React.useEffect(function () {
36808
- if (typeof window !== 'undefined') {
36809
- window.addEventListener('focus', scrollToBottomIfConfigured);
36810
- window.addEventListener('blur', resetNewMessagesReceivedInBackground);
36811
- }
36812
- return function () {
36813
- window.removeEventListener('focus', scrollToBottomIfConfigured);
36814
- window.removeEventListener('blur', resetNewMessagesReceivedInBackground);
36815
- };
36816
- }, [scrollToBottomIfConfigured]);
36927
+ useScrollToBottomOnNewMessage({ messages: messages, scrollToBottom: scrollToBottom, scrollToLatestMessageOnFocus: scrollToLatestMessageOnFocus });
36817
36928
  var numItemsPrepended = usePrependedMessagesCount(processedMessages, !disableDateSeparator);
36818
- /**
36819
- * Logic to update the key of the virtuoso component when the list jumps to a new location.
36820
- */
36821
- var _0 = React.useState(+new Date()), messageSetKey = _0[0], setMessageSetKey = _0[1];
36822
- var firstMessageId = React.useRef();
36823
- React.useEffect(function () {
36824
- var _a;
36825
- var continuousSet = messages === null || messages === void 0 ? void 0 : messages.find(function (message) { return message.id === firstMessageId.current; });
36826
- if (!continuousSet) {
36827
- setMessageSetKey(+new Date());
36828
- }
36829
- firstMessageId.current = (_a = messages === null || messages === void 0 ? void 0 : messages[0]) === null || _a === void 0 ? void 0 : _a.id;
36830
- }, [messages]);
36929
+ var messageSetKey = useMessageSetKey({ messages: messages }).messageSetKey;
36831
36930
  var shouldForceScrollToBottom = useShouldForceScrollToBottom(processedMessages, client.userID);
36832
36931
  var followOutput = function (isAtBottom) {
36833
36932
  if (hasMoreNewer || suppressAutoscroll) {
@@ -36839,63 +36938,10 @@ var VirtualizedMessageListWithContext = function (props) {
36839
36938
  // a message from another user has been received - don't scroll to bottom unless already there
36840
36939
  return isAtBottom ? stickToBottomScrollBehavior : false;
36841
36940
  };
36842
- var messageRenderer = React.useCallback(function (messageList, virtuosoIndex, virtuosoContext) {
36843
- var _a, _b, _c, _d, _e, _f, _g, _h, _j;
36844
- var lastReceivedMessageId = virtuosoContext.lastReceivedMessageId, ownMessagesReadByOthers = virtuosoContext.ownMessagesReadByOthers;
36845
- var streamMessageIndex = virtuosoIndex + numItemsPrepended - PREPEND_OFFSET;
36846
- // use custom renderer supplied by client if present and skip the rest
36847
- if (customMessageRenderer) {
36848
- return customMessageRenderer(messageList, streamMessageIndex);
36849
- }
36850
- var message = messageList[streamMessageIndex];
36851
- if (message.customType === CUSTOM_MESSAGE_TYPE.date && message.date && isDate(message.date)) {
36852
- return React__default["default"].createElement(DateSeparator$1, { date: message.date, unread: message.unread });
36853
- }
36854
- if (!message)
36855
- return React__default["default"].createElement("div", { style: { height: '1px' } }); // returning null or zero height breaks the virtuoso
36856
- if (message.type === 'system') {
36857
- return React__default["default"].createElement(MessageSystem, { message: message });
36858
- }
36859
- var groupedByUser = shouldGroupByUser &&
36860
- streamMessageIndex > 0 &&
36861
- ((_a = message.user) === null || _a === void 0 ? void 0 : _a.id) === ((_b = messageList[streamMessageIndex - 1].user) === null || _b === void 0 ? void 0 : _b.id);
36862
- var firstOfGroup = shouldGroupByUser && ((_c = message.user) === null || _c === void 0 ? void 0 : _c.id) !== ((_e = (_d = messageList[streamMessageIndex - 1]) === null || _d === void 0 ? void 0 : _d.user) === null || _e === void 0 ? void 0 : _e.id);
36863
- var endOfGroup = shouldGroupByUser && ((_f = message.user) === null || _f === void 0 ? void 0 : _f.id) !== ((_h = (_g = messageList[streamMessageIndex + 1]) === null || _g === void 0 ? void 0 : _g.user) === null || _h === void 0 ? void 0 : _h.id);
36864
- return (React__default["default"].createElement(Message, { additionalMessageInputProps: props.additionalMessageInputProps, autoscrollToBottom: (_j = virtuoso.current) === null || _j === void 0 ? void 0 : _j.autoscrollToBottom, closeReactionSelectorOnClick: closeReactionSelectorOnClick, customMessageActions: props.customMessageActions, endOfGroup: endOfGroup, firstOfGroup: firstOfGroup, groupedByUser: groupedByUser, lastReceivedId: lastReceivedMessageId, message: message, Message: MessageUIComponent, messageActions: props.messageActions, readBy: ownMessagesReadByOthers[message.id] || [] }));
36865
- }, [customMessageRenderer, shouldGroupByUser, numItemsPrepended]);
36866
- var Item = React.useMemo(function () {
36867
- // using 'display: inline-block'
36868
- // traps CSS margins of the item elements, preventing incorrect item measurements
36869
- var Item = function (props) {
36870
- var _a;
36871
- var _b;
36872
- var context = props.context;
36873
- var streamMessageIndex = props['data-item-index'] + context.numItemsPrepended - PREPEND_OFFSET;
36874
- var message = context.processedMessages[streamMessageIndex];
36875
- var groupStyles = context.messageGroupStyles[message.id] || '';
36876
- return (React__default["default"].createElement("div", __assign({}, props, { className: ((_b = context === null || context === void 0 ? void 0 : context.customClasses) === null || _b === void 0 ? void 0 : _b.virtualMessage) ||
36877
- clsx('str-chat__virtual-list-message-wrapper str-chat__li', (_a = {},
36878
- _a["str-chat__li--".concat(groupStyles)] = groupStyles,
36879
- _a)) })));
36880
- };
36881
- return Item;
36941
+ var computeItemKey = React.useCallback(function (index, _, _a) {
36942
+ var numItemsPrepended = _a.numItemsPrepended, processedMessages = _a.processedMessages;
36943
+ return processedMessages[calculateItemIndex(index, numItemsPrepended)].id;
36882
36944
  }, []);
36883
- var virtuosoComponents = React.useMemo(function () {
36884
- var EmptyPlaceholder = function () { return (React__default["default"].createElement(React__default["default"].Fragment, null, EmptyStateIndicator$1 && (React__default["default"].createElement(EmptyStateIndicator$1, { listType: threadList ? 'thread' : 'message' })))); };
36885
- var Header = function () {
36886
- return loadingMore ? (React__default["default"].createElement("div", { className: 'str-chat__virtual-list__loading' },
36887
- React__default["default"].createElement(LoadingIndicator$1, { size: 20 }))) : (head || null);
36888
- };
36889
- var Footer = function () {
36890
- return TypingIndicator ? React__default["default"].createElement(TypingIndicator, { avatarSize: 24 }) : React__default["default"].createElement(React__default["default"].Fragment, null);
36891
- };
36892
- return {
36893
- EmptyPlaceholder: EmptyPlaceholder,
36894
- Footer: Footer,
36895
- Header: Header,
36896
- Item: Item,
36897
- };
36898
- }, [loadingMore, head, Item]);
36899
36945
  var atBottomStateChange = function (isAtBottom) {
36900
36946
  atBottom.current = isAtBottom;
36901
36947
  setIsMessageListScrolledToBottom(isAtBottom);
@@ -36927,18 +36973,27 @@ var VirtualizedMessageListWithContext = function (props) {
36927
36973
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
36928
36974
  React__default["default"].createElement(MessageListMainPanel, null,
36929
36975
  React__default["default"].createElement("div", { className: (customClasses === null || customClasses === void 0 ? void 0 : customClasses.virtualizedMessageList) || 'str-chat__virtual-list' },
36930
- React__default["default"].createElement(reactVirtuoso.Virtuoso, __assign({ atBottomStateChange: atBottomStateChange, atBottomThreshold: 200, className: 'str-chat__message-list-scroll', components: virtuosoComponents, computeItemKey: function (index) {
36931
- return processedMessages[numItemsPrepended + index - PREPEND_OFFSET].id;
36932
- }, context: {
36976
+ React__default["default"].createElement(reactVirtuoso.Virtuoso, __assign({ atBottomStateChange: atBottomStateChange, atBottomThreshold: 200, className: 'str-chat__message-list-scroll', components: __assign({ EmptyPlaceholder: EmptyPlaceholder, Footer: Footer, Header: Header, Item: Item }, virtuosoComponentsFromProps), computeItemKey: computeItemKey, context: {
36977
+ additionalMessageInputProps: additionalMessageInputProps,
36978
+ closeReactionSelectorOnClick: closeReactionSelectorOnClick,
36933
36979
  customClasses: customClasses,
36980
+ customMessageActions: customMessageActions,
36981
+ customMessageRenderer: customMessageRenderer,
36982
+ DateSeparator: DateSeparator$1,
36983
+ head: head,
36934
36984
  lastReceivedMessageId: lastReceivedMessageId,
36985
+ loadingMore: loadingMore,
36986
+ Message: MessageUIComponent,
36987
+ messageActions: messageActions,
36935
36988
  messageGroupStyles: messageGroupStyles,
36989
+ MessageSystem: MessageSystem,
36936
36990
  numItemsPrepended: numItemsPrepended,
36937
36991
  ownMessagesReadByOthers: ownMessagesReadByOthers,
36938
36992
  processedMessages: processedMessages,
36939
- }, endReached: endReached, firstItemIndex: PREPEND_OFFSET - numItemsPrepended, followOutput: followOutput, increaseViewportBy: { bottom: 200, top: 0 }, initialTopMostItemIndex: calculateInitialTopMostItemIndex(processedMessages, highlightedMessageId), itemContent: function (i, _, context) {
36940
- return messageRenderer(processedMessages, i, context);
36941
- }, itemSize: fractionalItemSize, key: messageSetKey, overscan: overscan, ref: virtuoso, startReached: startReached, style: { overflowX: 'hidden' }, totalCount: processedMessages.length }, additionalVirtuosoProps, (scrollSeekPlaceHolder ? { scrollSeek: scrollSeekPlaceHolder } : {}), (defaultItemHeight ? { defaultItemHeight: defaultItemHeight } : {}))))),
36993
+ shouldGroupByUser: shouldGroupByUser,
36994
+ threadList: threadList,
36995
+ virtuosoRef: virtuoso,
36996
+ }, endReached: endReached, firstItemIndex: calculateFirstItemIndex(numItemsPrepended), followOutput: followOutput, increaseViewportBy: { bottom: 200, top: 0 }, initialTopMostItemIndex: calculateInitialTopMostItemIndex(processedMessages, highlightedMessageId), itemContent: messageRenderer, itemSize: fractionalItemSize, key: messageSetKey, overscan: overscan, ref: virtuoso, startReached: startReached, style: { overflowX: 'hidden' }, totalCount: processedMessages.length }, overridingVirtuosoProps, (scrollSeekPlaceHolder ? { scrollSeek: scrollSeekPlaceHolder } : {}), (defaultItemHeight ? { defaultItemHeight: defaultItemHeight } : {}))))),
36942
36997
  React__default["default"].createElement(MessageListNotifications$1, { hasNewMessages: newMessagesNotification, isMessageListScrolledToBottom: isMessageListScrolledToBottom, isNotAtLatestMessageSet: hasMoreNewer, MessageNotification: MessageNotification$1, notifications: notifications, scrollToBottom: scrollToBottom, threadList: threadList }),
36943
36998
  giphyPreviewMessage && React__default["default"].createElement(GiphyPreviewMessage$1, { message: giphyPreviewMessage })));
36944
36999
  };
@@ -37046,6 +37101,11 @@ var UnMemoizedWindow = function (props) {
37046
37101
  */
37047
37102
  var Window = React__default["default"].memo(UnMemoizedWindow);
37048
37103
 
37104
+ /**
37105
+ * @deprecated will be removed in the next major release
37106
+ */
37107
+ var generateRandomId = nanoid;
37108
+
37049
37109
  // @ts-expect-error
37050
37110
 
37051
37111
  var DefaultEmoji = /*#__PURE__*/Object.freeze({
@@ -37099,7 +37159,7 @@ exports.CooldownTimer = CooldownTimer;
37099
37159
  exports.DateSeparator = DateSeparator;
37100
37160
  exports.DefaultSuggestionList = List;
37101
37161
  exports.DefaultSuggestionListHeader = DefaultSuggestionListHeader;
37102
- exports.DefaultSuggestionListItem = Item;
37162
+ exports.DefaultSuggestionListItem = Item$1;
37103
37163
  exports.DefaultTriggerProvider = DefaultTriggerProvider;
37104
37164
  exports.DeliveredCheckIcon = DeliveredCheckIcon;
37105
37165
  exports.DownloadIcon = DownloadIcon;
@@ -37207,6 +37267,7 @@ exports.areMessagePropsEqual = areMessagePropsEqual;
37207
37267
  exports.areMessageUIPropsEqual = areMessageUIPropsEqual;
37208
37268
  exports.darkModeTheme = darkModeTheme;
37209
37269
  exports.deTranslations = deTranslations;
37270
+ exports.defaultAllowedTagNames = defaultAllowedTagNames;
37210
37271
  exports.defaultDateTimeParser = defaultDateTimeParser;
37211
37272
  exports.defaultPinPermissions = defaultPinPermissions;
37212
37273
  exports.defaultScrollToItem = defaultScrollToItem;