stream-chat-react 10.14.1 → 10.15.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 (117) hide show
  1. package/dist/browser.full-bundle.js +6528 -6421
  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/DateSeparator/DateSeparator.js +1 -1
  9. package/dist/components/EventComponent/EventComponent.js +1 -1
  10. package/dist/components/Message/FixedHeightMessage.js +1 -1
  11. package/dist/components/Message/MessageText.js +2 -2
  12. package/dist/components/Message/index.d.ts +1 -0
  13. package/dist/components/Message/index.d.ts.map +1 -1
  14. package/dist/components/Message/index.js +1 -0
  15. package/dist/components/Message/renderText/Anchor.d.ts +4 -0
  16. package/dist/components/Message/renderText/Anchor.d.ts.map +1 -0
  17. package/dist/components/Message/renderText/Anchor.js +10 -0
  18. package/dist/components/Message/renderText/Emoji.d.ts +3 -0
  19. package/dist/components/Message/renderText/Emoji.d.ts.map +1 -0
  20. package/dist/components/Message/renderText/Emoji.js +5 -0
  21. package/dist/components/Message/renderText/Mention.d.ts +18 -0
  22. package/dist/components/Message/renderText/Mention.d.ts.map +1 -0
  23. package/dist/components/Message/renderText/Mention.js +5 -0
  24. package/dist/components/Message/renderText/index.d.ts +5 -0
  25. package/dist/components/Message/renderText/index.d.ts.map +1 -0
  26. package/dist/components/Message/renderText/index.js +3 -0
  27. package/dist/components/Message/renderText/regex.d.ts +5 -0
  28. package/dist/components/Message/renderText/regex.d.ts.map +1 -0
  29. package/dist/components/Message/renderText/regex.js +21 -0
  30. package/dist/components/Message/renderText/rehypePlugins.d.ts +7 -0
  31. package/dist/components/Message/renderText/rehypePlugins.d.ts.map +1 -0
  32. package/dist/components/Message/renderText/rehypePlugins.js +60 -0
  33. package/dist/components/Message/renderText/renderText.d.ts +21 -0
  34. package/dist/components/Message/renderText/renderText.d.ts.map +1 -0
  35. package/dist/components/Message/renderText/renderText.js +126 -0
  36. package/dist/components/Message/types.d.ts +1 -1
  37. package/dist/components/Message/types.d.ts.map +1 -1
  38. package/dist/components/Message/utils.d.ts +1 -0
  39. package/dist/components/Message/utils.d.ts.map +1 -1
  40. package/dist/components/Message/utils.js +8 -0
  41. package/dist/components/MessageList/MessageList.d.ts.map +1 -1
  42. package/dist/components/MessageList/MessageList.js +1 -3
  43. package/dist/components/MessageList/VirtualizedMessageList.d.ts +36 -6
  44. package/dist/components/MessageList/VirtualizedMessageList.d.ts.map +1 -1
  45. package/dist/components/MessageList/VirtualizedMessageList.js +39 -122
  46. package/dist/components/MessageList/VirtualizedMessageListComponents.d.ts +23 -0
  47. package/dist/components/MessageList/VirtualizedMessageListComponents.d.ts.map +1 -0
  48. package/dist/components/MessageList/VirtualizedMessageListComponents.js +70 -0
  49. package/dist/components/MessageList/hooks/MessageList/index.d.ts +5 -0
  50. package/dist/components/MessageList/hooks/MessageList/index.d.ts.map +1 -0
  51. package/dist/components/MessageList/hooks/MessageList/index.js +4 -0
  52. package/dist/components/MessageList/hooks/{useEnrichedMessages.d.ts → MessageList/useEnrichedMessages.d.ts} +3 -3
  53. package/dist/components/MessageList/hooks/MessageList/useEnrichedMessages.d.ts.map +1 -0
  54. package/dist/components/MessageList/hooks/{useEnrichedMessages.js → MessageList/useEnrichedMessages.js} +3 -3
  55. package/dist/components/MessageList/hooks/{useMessageListElements.d.ts → MessageList/useMessageListElements.d.ts} +4 -4
  56. package/dist/components/MessageList/hooks/MessageList/useMessageListElements.d.ts.map +1 -0
  57. package/dist/components/MessageList/hooks/{useMessageListElements.js → MessageList/useMessageListElements.js} +9 -9
  58. package/dist/components/MessageList/hooks/{useMessageListScrollManager.d.ts → MessageList/useMessageListScrollManager.d.ts} +2 -2
  59. package/dist/components/MessageList/hooks/MessageList/useMessageListScrollManager.d.ts.map +1 -0
  60. package/dist/components/MessageList/hooks/{useMessageListScrollManager.js → MessageList/useMessageListScrollManager.js} +1 -1
  61. package/dist/components/MessageList/hooks/{useScrollLocationLogic.d.ts → MessageList/useScrollLocationLogic.d.ts} +2 -2
  62. package/dist/components/MessageList/hooks/MessageList/useScrollLocationLogic.d.ts.map +1 -0
  63. package/dist/components/MessageList/hooks/VirtualizedMessageList/index.d.ts +7 -0
  64. package/dist/components/MessageList/hooks/VirtualizedMessageList/index.d.ts.map +1 -0
  65. package/dist/components/MessageList/hooks/VirtualizedMessageList/index.js +6 -0
  66. package/dist/components/MessageList/hooks/{useGiphyPreview.d.ts → VirtualizedMessageList/useGiphyPreview.d.ts} +2 -2
  67. package/dist/components/MessageList/hooks/VirtualizedMessageList/useGiphyPreview.d.ts.map +1 -0
  68. package/dist/components/MessageList/hooks/{useGiphyPreview.js → VirtualizedMessageList/useGiphyPreview.js} +1 -1
  69. package/dist/components/MessageList/hooks/VirtualizedMessageList/useMessageSetKey.d.ts +10 -0
  70. package/dist/components/MessageList/hooks/VirtualizedMessageList/useMessageSetKey.d.ts.map +1 -0
  71. package/dist/components/MessageList/hooks/VirtualizedMessageList/useMessageSetKey.js +20 -0
  72. package/dist/components/MessageList/hooks/{useNewMessageNotification.d.ts → VirtualizedMessageList/useNewMessageNotification.d.ts} +2 -2
  73. package/dist/components/MessageList/hooks/VirtualizedMessageList/useNewMessageNotification.d.ts.map +1 -0
  74. package/dist/components/MessageList/hooks/{usePrependMessagesCount.d.ts → VirtualizedMessageList/usePrependMessagesCount.d.ts} +2 -2
  75. package/dist/components/MessageList/hooks/VirtualizedMessageList/usePrependMessagesCount.d.ts.map +1 -0
  76. package/dist/components/MessageList/hooks/VirtualizedMessageList/useScrollToBottomOnNewMessage.d.ts +12 -0
  77. package/dist/components/MessageList/hooks/VirtualizedMessageList/useScrollToBottomOnNewMessage.d.ts.map +1 -0
  78. package/dist/components/MessageList/hooks/VirtualizedMessageList/useScrollToBottomOnNewMessage.js +28 -0
  79. package/dist/components/MessageList/hooks/{useShouldForceScrollToBottom.d.ts → VirtualizedMessageList/useShouldForceScrollToBottom.d.ts} +2 -2
  80. package/dist/components/MessageList/hooks/VirtualizedMessageList/useShouldForceScrollToBottom.d.ts.map +1 -0
  81. package/dist/components/MessageList/hooks/index.d.ts +7 -7
  82. package/dist/components/MessageList/hooks/index.d.ts.map +1 -1
  83. package/dist/components/MessageList/hooks/index.js +7 -7
  84. package/dist/context/MessageContext.d.ts +1 -1
  85. package/dist/context/MessageContext.d.ts.map +1 -1
  86. package/dist/index.cjs.js +627 -584
  87. package/dist/index.cjs.js.map +1 -1
  88. package/dist/index.d.ts +0 -1
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +0 -2
  91. package/dist/utils/generateRandomId.d.ts +6 -0
  92. package/dist/utils/generateRandomId.d.ts.map +1 -0
  93. package/dist/utils/generateRandomId.js +5 -0
  94. package/dist/utils/getWholeChar.d.ts +2 -0
  95. package/dist/utils/getWholeChar.d.ts.map +1 -0
  96. package/dist/utils/getWholeChar.js +26 -0
  97. package/dist/utils/index.d.ts +4 -0
  98. package/dist/utils/index.d.ts.map +1 -0
  99. package/dist/utils/index.js +3 -0
  100. package/dist/version.d.ts +1 -1
  101. package/dist/version.js +1 -1
  102. package/package.json +1 -1
  103. package/dist/components/MessageList/hooks/useEnrichedMessages.d.ts.map +0 -1
  104. package/dist/components/MessageList/hooks/useGiphyPreview.d.ts.map +0 -1
  105. package/dist/components/MessageList/hooks/useMessageListElements.d.ts.map +0 -1
  106. package/dist/components/MessageList/hooks/useMessageListScrollManager.d.ts.map +0 -1
  107. package/dist/components/MessageList/hooks/useNewMessageNotification.d.ts.map +0 -1
  108. package/dist/components/MessageList/hooks/usePrependMessagesCount.d.ts.map +0 -1
  109. package/dist/components/MessageList/hooks/useScrollLocationLogic.d.ts.map +0 -1
  110. package/dist/components/MessageList/hooks/useShouldForceScrollToBottom.d.ts.map +0 -1
  111. package/dist/utils.d.ts +0 -42
  112. package/dist/utils.d.ts.map +0 -1
  113. package/dist/utils.js +0 -253
  114. /package/dist/components/MessageList/hooks/{useScrollLocationLogic.js → MessageList/useScrollLocationLogic.js} +0 -0
  115. /package/dist/components/MessageList/hooks/{useNewMessageNotification.js → VirtualizedMessageList/useNewMessageNotification.js} +0 -0
  116. /package/dist/components/MessageList/hooks/{usePrependMessagesCount.js → VirtualizedMessageList/usePrependMessagesCount.js} +0 -0
  117. /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
 
@@ -4331,7 +4331,7 @@ var getAttachmentType = function (attachment) {
4331
4331
  return 'unsupported';
4332
4332
  };
4333
4333
 
4334
- var Item = /*#__PURE__*/React__default["default"].forwardRef(function Item(props, innerRef) {
4334
+ var Item$1 = /*#__PURE__*/React__default["default"].forwardRef(function Item(props, innerRef) {
4335
4335
  var className = props.className,
4336
4336
  Component = props.component,
4337
4337
  item = props.item,
@@ -4378,29 +4378,29 @@ var Item = /*#__PURE__*/React__default["default"].forwardRef(function Item(props
4378
4378
  }))));
4379
4379
  });
4380
4380
 
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
4381
+ var DefaultSuggestionListHeader = function (props) {
4382
+ var currentTrigger = props.currentTrigger, value = props.value;
4383
+ var t = useTranslationContext('DefaultSuggestionListHeader').t;
4384
+ var triggerIndex = value.lastIndexOf(currentTrigger);
4385
+ if (currentTrigger === '/') {
4386
+ return (React__default["default"].createElement(React__default["default"].Fragment, null,
4387
+ t('Commands matching'),
4388
+ " ",
4389
+ React__default["default"].createElement("strong", null, value.slice(triggerIndex + 1))));
4390
+ }
4391
+ if (currentTrigger === ':') {
4392
+ return (React__default["default"].createElement(React__default["default"].Fragment, null,
4393
+ t('Emoji matching'),
4394
+ " ",
4395
+ React__default["default"].createElement("strong", null, value.slice(triggerIndex + 1))));
4396
+ }
4397
+ if (currentTrigger === '@') {
4398
+ return (React__default["default"].createElement(React__default["default"].Fragment, null,
4399
+ t('People matching'),
4400
+ " ",
4401
+ React__default["default"].createElement("strong", null, value.slice(triggerIndex + 1))));
4402
+ }
4403
+ return null;
4404
4404
  };
4405
4405
 
4406
4406
  /**
@@ -5079,6 +5079,351 @@ function toFunction$1(replace) {
5079
5079
  return typeof replace === 'function' ? replace : () => replace
5080
5080
  }
5081
5081
 
5082
+ /**
5083
+ * @typedef {import('unist').Node} Node
5084
+ * @typedef {import('unist').Parent} Parent
5085
+ * @typedef {import('unist').Literal} Literal
5086
+ * @typedef {Object.<string, unknown>} Props
5087
+ * @typedef {Array.<Node>|string} ChildrenOrValue
5088
+ *
5089
+ * @typedef {(<T extends string, P extends Record<string, unknown>, C extends Node[]>(type: T, props: P, children: C) => {type: T, children: C} & P)} BuildParentWithProps
5090
+ * @typedef {(<T extends string, P extends Record<string, unknown>>(type: T, props: P, value: string) => {type: T, value: string} & P)} BuildLiteralWithProps
5091
+ * @typedef {(<T extends string, P extends Record<string, unknown>>(type: T, props: P) => {type: T} & P)} BuildVoidWithProps
5092
+ * @typedef {(<T extends string, C extends Node[]>(type: T, children: C) => {type: T, children: C})} BuildParent
5093
+ * @typedef {(<T extends string>(type: T, value: string) => {type: T, value: string})} BuildLiteral
5094
+ * @typedef {(<T extends string>(type: T) => {type: T})} BuildVoid
5095
+ */
5096
+
5097
+ var u = /**
5098
+ * @type {BuildVoid & BuildVoidWithProps & BuildLiteral & BuildLiteralWithProps & BuildParent & BuildParentWithProps}
5099
+ */ (
5100
+ /**
5101
+ * @param {string} type Type of node
5102
+ * @param {Props|ChildrenOrValue} [props] Additional properties for node (or `children` or `value`)
5103
+ * @param {ChildrenOrValue} [value] `children` or `value` of node
5104
+ * @returns {Node}
5105
+ */
5106
+ function (type, props, value) {
5107
+ /** @type {Node} */
5108
+ var node = {type: String(type)};
5109
+
5110
+ if (
5111
+ (value === undefined || value === null) &&
5112
+ (typeof props === 'string' || Array.isArray(props))
5113
+ ) {
5114
+ value = props;
5115
+ } else {
5116
+ Object.assign(node, props);
5117
+ }
5118
+
5119
+ if (Array.isArray(value)) {
5120
+ node.children = value;
5121
+ } else if (value !== undefined && value !== null) {
5122
+ node.value = String(value);
5123
+ }
5124
+
5125
+ return node
5126
+ }
5127
+ );
5128
+
5129
+ /**
5130
+ * @param {string} d
5131
+ * @returns {string}
5132
+ */
5133
+ function color(d) {
5134
+ return '\u001B[33m' + d + '\u001B[39m'
5135
+ }
5136
+
5137
+ /**
5138
+ * @typedef {import('unist').Node} Node
5139
+ * @typedef {import('unist').Parent} Parent
5140
+ * @typedef {import('unist-util-is').Test} Test
5141
+ * @typedef {import('./complex-types.js').Action} Action
5142
+ * @typedef {import('./complex-types.js').Index} Index
5143
+ * @typedef {import('./complex-types.js').ActionTuple} ActionTuple
5144
+ * @typedef {import('./complex-types.js').VisitorResult} VisitorResult
5145
+ * @typedef {import('./complex-types.js').Visitor} Visitor
5146
+ */
5147
+
5148
+ /**
5149
+ * Continue traversing as normal
5150
+ */
5151
+ const CONTINUE = true;
5152
+ /**
5153
+ * Do not traverse this node’s children
5154
+ */
5155
+ const SKIP = 'skip';
5156
+ /**
5157
+ * Stop traversing immediately
5158
+ */
5159
+ const EXIT = false;
5160
+
5161
+ /**
5162
+ * Visit children of tree which pass test.
5163
+ *
5164
+ * @param tree
5165
+ * Tree to walk
5166
+ * @param [test]
5167
+ * `unist-util-is`-compatible test
5168
+ * @param visitor
5169
+ * Function called for nodes that pass `test`.
5170
+ * @param [reverse=false]
5171
+ * Traverse in reverse preorder (NRL) instead of preorder (NLR) (default).
5172
+ */
5173
+ const visitParents =
5174
+ /**
5175
+ * @type {(
5176
+ * (<Tree extends Node, Check extends Test>(tree: Tree, test: Check, visitor: import('./complex-types.js').BuildVisitor<Tree, Check>, reverse?: boolean) => void) &
5177
+ * (<Tree extends Node>(tree: Tree, visitor: import('./complex-types.js').BuildVisitor<Tree>, reverse?: boolean) => void)
5178
+ * )}
5179
+ */
5180
+ (
5181
+ /**
5182
+ * @param {Node} tree
5183
+ * @param {Test} test
5184
+ * @param {import('./complex-types.js').Visitor<Node>} visitor
5185
+ * @param {boolean} [reverse=false]
5186
+ */
5187
+ function (tree, test, visitor, reverse) {
5188
+ if (typeof test === 'function' && typeof visitor !== 'function') {
5189
+ reverse = visitor;
5190
+ // @ts-expect-error no visitor given, so `visitor` is test.
5191
+ visitor = test;
5192
+ test = null;
5193
+ }
5194
+
5195
+ const is = convert(test);
5196
+ const step = reverse ? -1 : 1;
5197
+
5198
+ factory(tree, null, [])();
5199
+
5200
+ /**
5201
+ * @param {Node} node
5202
+ * @param {number?} index
5203
+ * @param {Array<Parent>} parents
5204
+ */
5205
+ function factory(node, index, parents) {
5206
+ /** @type {Record<string, unknown>} */
5207
+ // @ts-expect-error: hush
5208
+ const value = typeof node === 'object' && node !== null ? node : {};
5209
+ /** @type {string|undefined} */
5210
+ let name;
5211
+
5212
+ if (typeof value.type === 'string') {
5213
+ name =
5214
+ typeof value.tagName === 'string'
5215
+ ? value.tagName
5216
+ : typeof value.name === 'string'
5217
+ ? value.name
5218
+ : undefined;
5219
+
5220
+ Object.defineProperty(visit, 'name', {
5221
+ value:
5222
+ 'node (' +
5223
+ color(value.type + (name ? '<' + name + '>' : '')) +
5224
+ ')'
5225
+ });
5226
+ }
5227
+
5228
+ return visit
5229
+
5230
+ function visit() {
5231
+ /** @type {ActionTuple} */
5232
+ let result = [];
5233
+ /** @type {ActionTuple} */
5234
+ let subresult;
5235
+ /** @type {number} */
5236
+ let offset;
5237
+ /** @type {Array<Parent>} */
5238
+ let grandparents;
5239
+
5240
+ if (!test || is(node, index, parents[parents.length - 1] || null)) {
5241
+ result = toResult(visitor(node, parents));
5242
+
5243
+ if (result[0] === EXIT) {
5244
+ return result
5245
+ }
5246
+ }
5247
+
5248
+ // @ts-expect-error looks like a parent.
5249
+ if (node.children && result[0] !== SKIP) {
5250
+ // @ts-expect-error looks like a parent.
5251
+ offset = (reverse ? node.children.length : -1) + step;
5252
+ // @ts-expect-error looks like a parent.
5253
+ grandparents = parents.concat(node);
5254
+
5255
+ // @ts-expect-error looks like a parent.
5256
+ while (offset > -1 && offset < node.children.length) {
5257
+ // @ts-expect-error looks like a parent.
5258
+ subresult = factory(node.children[offset], offset, grandparents)();
5259
+
5260
+ if (subresult[0] === EXIT) {
5261
+ return subresult
5262
+ }
5263
+
5264
+ offset =
5265
+ typeof subresult[1] === 'number' ? subresult[1] : offset + step;
5266
+ }
5267
+ }
5268
+
5269
+ return result
5270
+ }
5271
+ }
5272
+ }
5273
+ );
5274
+
5275
+ /**
5276
+ * @param {VisitorResult} value
5277
+ * @returns {ActionTuple}
5278
+ */
5279
+ function toResult(value) {
5280
+ if (Array.isArray(value)) {
5281
+ return value
5282
+ }
5283
+
5284
+ if (typeof value === 'number') {
5285
+ return [CONTINUE, value]
5286
+ }
5287
+
5288
+ return [value]
5289
+ }
5290
+
5291
+ /**
5292
+ * @typedef {import('unist').Node} Node
5293
+ * @typedef {import('unist').Parent} Parent
5294
+ * @typedef {import('unist-util-is').Test} Test
5295
+ * @typedef {import('unist-util-visit-parents').VisitorResult} VisitorResult
5296
+ * @typedef {import('./complex-types.js').Visitor} Visitor
5297
+ */
5298
+
5299
+ /**
5300
+ * Visit children of tree which pass test.
5301
+ *
5302
+ * @param tree
5303
+ * Tree to walk
5304
+ * @param [test]
5305
+ * `unist-util-is`-compatible test
5306
+ * @param visitor
5307
+ * Function called for nodes that pass `test`.
5308
+ * @param reverse
5309
+ * Traverse in reverse preorder (NRL) instead of preorder (NLR) (default).
5310
+ */
5311
+ const visit =
5312
+ /**
5313
+ * @type {(
5314
+ * (<Tree extends Node, Check extends Test>(tree: Tree, test: Check, visitor: import('./complex-types.js').BuildVisitor<Tree, Check>, reverse?: boolean) => void) &
5315
+ * (<Tree extends Node>(tree: Tree, visitor: import('./complex-types.js').BuildVisitor<Tree>, reverse?: boolean) => void)
5316
+ * )}
5317
+ */
5318
+ (
5319
+ /**
5320
+ * @param {Node} tree
5321
+ * @param {Test} test
5322
+ * @param {import('./complex-types.js').Visitor} visitor
5323
+ * @param {boolean} [reverse]
5324
+ */
5325
+ function (tree, test, visitor, reverse) {
5326
+ if (typeof test === 'function' && typeof visitor !== 'function') {
5327
+ reverse = visitor;
5328
+ visitor = test;
5329
+ test = null;
5330
+ }
5331
+
5332
+ visitParents(tree, test, overload, reverse);
5333
+
5334
+ /**
5335
+ * @param {Node} node
5336
+ * @param {Array<Parent>} parents
5337
+ */
5338
+ function overload(node, parents) {
5339
+ const parent = parents[parents.length - 1];
5340
+ return visitor(
5341
+ node,
5342
+ parent ? parent.children.indexOf(node) : null,
5343
+ parent
5344
+ )
5345
+ }
5346
+ }
5347
+ );
5348
+
5349
+ function escapeRegExp(text) {
5350
+ return text.replace(/[-[\]{}()*+?.,/\\^$|#]/g, '\\$&');
5351
+ }
5352
+ var detectHttp = /(http(s?):\/\/)?(www\.)?/;
5353
+ var messageCodeBlocks = function (message) {
5354
+ var codeRegex = /```[a-z]*\n[\s\S]*?\n```|`[a-z]*[\s\S]*?`/gm;
5355
+ var matches = message.match(codeRegex);
5356
+ return matches || [];
5357
+ };
5358
+ var matchMarkdownLinks = function (message) {
5359
+ var regexMdLinks = /\[([^[]+)\](\(.*\))/gm;
5360
+ var matches = message.match(regexMdLinks);
5361
+ var singleMatch = /\[([^[]+)\]\((.*)\)/;
5362
+ var links = matches
5363
+ ? matches.map(function (match) {
5364
+ var i = singleMatch.exec(match);
5365
+ return i && [i[1], i[2]];
5366
+ })
5367
+ : [];
5368
+ return links.flat();
5369
+ };
5370
+
5371
+ var mentionsMarkdownPlugin = function (mentioned_users) { return function () {
5372
+ var mentioned_usernames = mentioned_users
5373
+ .map(function (user) { return user.name || user.id; })
5374
+ .filter(Boolean)
5375
+ .map(escapeRegExp);
5376
+ var mentionedUsersRegex = new RegExp(mentioned_usernames.map(function (username) { return "@".concat(username); }).join('|'), 'g');
5377
+ var replace = function (match) {
5378
+ var usernameOrId = match.replace('@', '');
5379
+ var user = mentioned_users.find(function (_a) {
5380
+ var id = _a.id, name = _a.name;
5381
+ return name === usernameOrId || id === usernameOrId;
5382
+ });
5383
+ return u('element', { mentionedUser: user, tagName: 'mention' }, [u('text', match)]);
5384
+ };
5385
+ var transform = function (tree) {
5386
+ if (!mentioned_usernames.length)
5387
+ return tree;
5388
+ // handles special cases of mentions where user.name is an e-mail
5389
+ // Remark GFM translates all e-mail-like text nodes to links creating
5390
+ // two separate child nodes "@" and "your.name@as.email" instead of
5391
+ // keeping it as one text node with value "@your.name@as.email"
5392
+ // this piece finds these two separated nodes and merges them together
5393
+ // before "replace" function takes over
5394
+ visit(tree, function (node, index, parent) {
5395
+ var _a;
5396
+ if (index === null)
5397
+ return;
5398
+ if (!parent)
5399
+ return;
5400
+ var nextChild = parent.children.at(index + 1);
5401
+ var nextChildHref = (_a = nextChild === null || nextChild === void 0 ? void 0 : nextChild.properties) === null || _a === void 0 ? void 0 : _a.href;
5402
+ if (node.type === 'text' &&
5403
+ // text value has to have @ sign at the end of the string
5404
+ // and no other characters except whitespace can precede it
5405
+ // valid cases: "text @", "@", " @"
5406
+ // invalid cases: "text@", "@text",
5407
+ /.?\s?@$|^@$/.test(node.value) &&
5408
+ (nextChildHref === null || nextChildHref === void 0 ? void 0 : nextChildHref.startsWith('mailto:'))) {
5409
+ var newTextValue = node.value.replace(/@$/, '');
5410
+ var username = nextChildHref.replace('mailto:', '');
5411
+ parent.children[index] = u('text', newTextValue);
5412
+ parent.children[index + 1] = u('text', "@".concat(username));
5413
+ }
5414
+ });
5415
+ return findAndReplace$1(tree, mentionedUsersRegex, replace);
5416
+ };
5417
+ return transform;
5418
+ }; };
5419
+ var emojiMarkdownPlugin = function () {
5420
+ var replace = function (match) {
5421
+ return u('element', { tagName: 'emoji' }, [u('text', match)]);
5422
+ };
5423
+ var transform = function (node) { return findAndReplace$1(node, emojiRegex__default["default"](), replace); };
5424
+ return transform;
5425
+ };
5426
+
5082
5427
  const protocols = ['http', 'https', 'mailto', 'tel'];
5083
5428
 
5084
5429
  /**
@@ -17874,53 +18219,6 @@ function remarkParse(options) {
17874
18219
  Object.assign(this, {Parser: parser});
17875
18220
  }
17876
18221
 
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
18222
  /**
17925
18223
  * @typedef {import('mdast').Root|import('mdast').Parent['children'][number]} MdastNode
17926
18224
  * @typedef {import('./index.js').H} H
@@ -18028,226 +18326,6 @@ function all(h, parent) {
18028
18326
  return values
18029
18327
  }
18030
18328
 
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
18329
  /**
18252
18330
  * @typedef {import('unist').Position} Position
18253
18331
  * @typedef {import('unist').Node} Node
@@ -26097,14 +26175,26 @@ function remarkGfm(options = {}) {
26097
26175
  }
26098
26176
  }
26099
26177
 
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;
26178
+ var Emoji = function (_a) {
26179
+ var children = _a.children;
26180
+ return (React__default["default"].createElement("span", { className: 'inline-text-emoji', "data-testid": 'inline-text-emoji' }, children));
26181
+ };
26182
+
26183
+ var Anchor = function (_a) {
26184
+ var children = _a.children, href = _a.href;
26185
+ var isEmail = href === null || href === void 0 ? void 0 : href.startsWith('mailto:');
26186
+ var isUrl = href === null || href === void 0 ? void 0 : href.startsWith('http');
26187
+ if (!href || (!isEmail && !isUrl))
26188
+ return React__default["default"].createElement(React__default["default"].Fragment, null, children);
26189
+ return (React__default["default"].createElement("a", { className: clsx({ 'str-chat__message-url-link': isUrl }), href: href, rel: 'nofollow noreferrer noopener', target: '_blank' }, children));
26190
+ };
26191
+
26192
+ var Mention = function (_a) {
26193
+ var children = _a.children, mentionedUser = _a.node.mentionedUser;
26194
+ return (React__default["default"].createElement("span", { className: 'str-chat__message-mention', "data-user-id": mentionedUser.id }, children));
26106
26195
  };
26107
- var allowedMarkups = [
26196
+
26197
+ var defaultAllowedTagNames = [
26108
26198
  'html',
26109
26199
  'text',
26110
26200
  'br',
@@ -26123,24 +26213,6 @@ var allowedMarkups = [
26123
26213
  'emoji',
26124
26214
  'mention',
26125
26215
  ];
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
26216
  function formatUrlForDisplay(url) {
26145
26217
  try {
26146
26218
  return decodeURIComponent(url).replace(detectHttp, '');
@@ -26157,84 +26229,15 @@ function encodeDecode(url) {
26157
26229
  return url;
26158
26230
  }
26159
26231
  }
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
- };
26232
+ var transformLinkUri = function (uri) { return (uri.startsWith('app://') ? uri : uriTransformer(uri)); };
26233
+ var getPluginsForward = function (plugins) { return plugins; };
26176
26234
  var markDownRenderers = {
26177
26235
  a: Anchor,
26178
26236
  emoji: Emoji,
26179
26237
  mention: Mention,
26180
26238
  };
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
26239
  var renderText = function (text, mentionedUsers, _a) {
26237
- var _b = _a === void 0 ? {} : _a, customMarkDownRenderers = _b.customMarkDownRenderers;
26240
+ 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
26241
  // take the @ mentions and turn them into markdown?
26239
26242
  // translate links
26240
26243
  if (!text)
@@ -26282,6 +26285,7 @@ var renderText = function (text, mentionedUsers, _a) {
26282
26285
  catch (e) {
26283
26286
  }
26284
26287
  });
26288
+ var remarkPlugins = [[remarkGfm, { singleTilde: false }]];
26285
26289
  var rehypePlugins = [emojiMarkdownPlugin];
26286
26290
  if (mentionedUsers === null || mentionedUsers === void 0 ? void 0 : mentionedUsers.length) {
26287
26291
  rehypePlugins.push(mentionsMarkdownPlugin(mentionedUsers));
@@ -26302,65 +26306,7 @@ var renderText = function (text, mentionedUsers, _a) {
26302
26306
  };
26303
26307
  }
26304
26308
  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;
26309
+ return (React__default["default"].createElement(ReactMarkdown, { allowedElements: allowedTagNames, components: rehypeComponents, rehypePlugins: getRehypePlugins(rehypePlugins), remarkPlugins: getRemarkPlugins(remarkPlugins), skipHtml: true, transformLinkUri: transformLinkUri, unwrapDisallowed: true }, newText));
26364
26310
  };
26365
26311
 
26366
26312
  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 +26332,7 @@ var List = function List(_ref) {
26386
26332
  AutocompleteSuggestionItem = _useComponentContext.AutocompleteSuggestionItem;
26387
26333
  var _useChatContext = useChatContext('SuggestionList'),
26388
26334
  themeVersion = _useChatContext.themeVersion;
26389
- var SuggestionItem = PropSuggestionItem || AutocompleteSuggestionItem || Item;
26335
+ var SuggestionItem = PropSuggestionItem || AutocompleteSuggestionItem || Item$1;
26390
26336
  var SuggestionHeader = PropHeader || AutocompleteSuggestionHeader || DefaultSuggestionListHeader;
26391
26337
  var _useState = React.useState(undefined),
26392
26338
  _useState2 = _slicedToArray__default["default"](_useState, 2),
@@ -26563,6 +26509,33 @@ var UnMemoizedCommandItem = function (props) {
26563
26509
  };
26564
26510
  var CommandItem = React__default["default"].memo(UnMemoizedCommandItem);
26565
26511
 
26512
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charAt#getting_whole_characters
26513
+ var getWholeChar = function (str, i) {
26514
+ var code = str.charCodeAt(i);
26515
+ if (Number.isNaN(code))
26516
+ return '';
26517
+ if (code < 0xd800 || code > 0xdfff)
26518
+ return str.charAt(i);
26519
+ if (0xd800 <= code && code <= 0xdbff) {
26520
+ if (str.length <= i + 1) {
26521
+ throw 'High surrogate without following low surrogate';
26522
+ }
26523
+ var next = str.charCodeAt(i + 1);
26524
+ if (0xdc00 > next || next > 0xdfff) {
26525
+ throw 'High surrogate without following low surrogate';
26526
+ }
26527
+ return str.charAt(i) + str.charAt(i + 1);
26528
+ }
26529
+ if (i === 0) {
26530
+ throw 'Low surrogate without preceding high surrogate';
26531
+ }
26532
+ var prev = str.charCodeAt(i - 1);
26533
+ if (0xd800 > prev || prev > 0xdbff) {
26534
+ throw 'Low surrogate without preceding high surrogate';
26535
+ }
26536
+ return '';
26537
+ };
26538
+
26566
26539
  /**
26567
26540
  * A round avatar image with fallback to username's first letter
26568
26541
  */
@@ -27265,6 +27238,31 @@ ReactTextareaAutocomplete.propTypes = {
27265
27238
  value: PropTypes__default["default"].string
27266
27239
  };
27267
27240
 
27241
+ let urlAlphabet =
27242
+ 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict';
27243
+
27244
+ const POOL_SIZE_MULTIPLIER = 128;
27245
+ let pool, poolOffset;
27246
+ let fillPool = bytes => {
27247
+ if (!pool || pool.length < bytes) {
27248
+ pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER);
27249
+ crypto__default["default"].randomFillSync(pool);
27250
+ poolOffset = 0;
27251
+ } else if (poolOffset + bytes > pool.length) {
27252
+ crypto__default["default"].randomFillSync(pool);
27253
+ poolOffset = 0;
27254
+ }
27255
+ poolOffset += bytes;
27256
+ };
27257
+ let nanoid = (size = 21) => {
27258
+ fillPool((size -= 0));
27259
+ let id = '';
27260
+ for (let i = poolOffset - size; i < poolOffset; i++) {
27261
+ id += urlAlphabet[pool[i] & 63];
27262
+ }
27263
+ return id
27264
+ };
27265
+
27268
27266
  var channelReducer = function (state, action) {
27269
27267
  var _a;
27270
27268
  switch (action.type) {
@@ -28003,6 +28001,13 @@ var getReadByTooltipText = function (users, t, client, tooltipUserNameMapper) {
28003
28001
  }
28004
28002
  return outStr;
28005
28003
  };
28004
+ var isOnlyEmojis = function (text) {
28005
+ if (!text)
28006
+ return false;
28007
+ var noEmojis = text.replace(emojiRegex__default["default"](), '');
28008
+ var noSpace = noEmojis.replace(/[\s\n]/gm, '');
28009
+ return !noSpace;
28010
+ };
28006
28011
 
28007
28012
  var CustomMessageActionsList = function (props) {
28008
28013
  var customMessageActions = props.customMessageActions, message = props.message;
@@ -35003,7 +35008,7 @@ var UnMemoizedChannelList = function (props) {
35003
35008
  */
35004
35009
  var ChannelList = React__default["default"].memo(UnMemoizedChannelList);
35005
35010
 
35006
- var version = '10.14.1';
35011
+ var version = '10.15.0';
35007
35012
 
35008
35013
  var useChat = function (_a) {
35009
35014
  var _b, _c;
@@ -35227,7 +35232,7 @@ var UnMemoizedDateSeparator = function (props) {
35227
35232
  messageCreatedAt: messageCreatedAt,
35228
35233
  tDateTimeParser: tDateTimeParser,
35229
35234
  });
35230
- return (React__default["default"].createElement("div", { className: 'str-chat__date-separator' },
35235
+ return (React__default["default"].createElement("div", { className: 'str-chat__date-separator', "data-testid": 'date-separator' },
35231
35236
  (position === 'right' || position === 'center') && (React__default["default"].createElement("hr", { className: 'str-chat__date-separator-line' })),
35232
35237
  React__default["default"].createElement("div", { className: 'str-chat__date-separator-date' }, unread ? "".concat(t('New'), " - ").concat(formattedDate) : formattedDate),
35233
35238
  (position === 'left' || position === 'center') && (React__default["default"].createElement("hr", { className: 'str-chat__date-separator-line' }))));
@@ -35247,7 +35252,7 @@ var UnMemoizedEventComponent = function (props) {
35247
35252
  var _e = message.created_at, created_at = _e === void 0 ? '' : _e, event = message.event, text = message.text, type = message.type;
35248
35253
  var getDateOptions = { messageCreatedAt: created_at.toString(), tDateTimeParser: tDateTimeParser };
35249
35254
  if (type === 'system')
35250
- return (React__default["default"].createElement("div", { className: 'str-chat__message--system' },
35255
+ return (React__default["default"].createElement("div", { className: 'str-chat__message--system', "data-testid": 'message-system' },
35251
35256
  React__default["default"].createElement("div", { className: 'str-chat__message--system__text' },
35252
35257
  React__default["default"].createElement("div", { className: 'str-chat__message--system__line' }),
35253
35258
  React__default["default"].createElement("p", null, text),
@@ -36529,23 +36534,6 @@ var UnMemoizedScrollToBottomButton = function (props) {
36529
36534
  };
36530
36535
  var ScrollToBottomButton = React__default["default"].memo(UnMemoizedScrollToBottomButton);
36531
36536
 
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
36537
  function useNewMessageNotification(messages, currentUserId, hasMoreNewer) {
36550
36538
  var _a = React.useState(false), newMessagesNotification = _a[0], setNewMessagesNotification = _a[1];
36551
36539
  var _b = React.useState(true), isMessageListScrolledToBottom = _b[0], setIsMessageListScrolledToBottom = _b[1];
@@ -36669,7 +36657,134 @@ function useShouldForceScrollToBottom(messages, currentUserId) {
36669
36657
  return recheckForNewOwnMessage;
36670
36658
  }
36671
36659
 
36660
+ var useGiphyPreview = function (separateGiphyPreview) {
36661
+ var _a = React.useState(), giphyPreviewMessage = _a[0], setGiphyPreviewMessage = _a[1];
36662
+ var client = useChatContext('useGiphyPreview').client;
36663
+ React.useEffect(function () {
36664
+ var handleEvent = function (event) {
36665
+ var message = event.message, user = event.user;
36666
+ if ((message === null || message === void 0 ? void 0 : message.command) === 'giphy' && (user === null || user === void 0 ? void 0 : user.id) === client.userID) {
36667
+ setGiphyPreviewMessage(undefined);
36668
+ }
36669
+ };
36670
+ if (separateGiphyPreview)
36671
+ client.on('message.new', handleEvent);
36672
+ return function () { return client.off('message.new', handleEvent); };
36673
+ }, [separateGiphyPreview]);
36674
+ return { giphyPreviewMessage: giphyPreviewMessage, setGiphyPreviewMessage: setGiphyPreviewMessage };
36675
+ };
36676
+
36677
+ var useMessageSetKey = function (_a) {
36678
+ var messages = _a.messages;
36679
+ /**
36680
+ * Logic to update the key of the virtuoso component when the list jumps to a new location.
36681
+ */
36682
+ var _b = React.useState(+new Date()), messageSetKey = _b[0], setMessageSetKey = _b[1];
36683
+ var firstMessageId = React.useRef();
36684
+ React.useEffect(function () {
36685
+ var _a;
36686
+ var continuousSet = messages === null || messages === void 0 ? void 0 : messages.find(function (message) { return message.id === firstMessageId.current; });
36687
+ if (!continuousSet) {
36688
+ setMessageSetKey(+new Date());
36689
+ }
36690
+ firstMessageId.current = (_a = messages === null || messages === void 0 ? void 0 : messages[0]) === null || _a === void 0 ? void 0 : _a.id;
36691
+ }, [messages]);
36692
+ return {
36693
+ messageSetKey: messageSetKey,
36694
+ };
36695
+ };
36696
+
36697
+ var useScrollToBottomOnNewMessage = function (_a) {
36698
+ var messages = _a.messages, scrollToBottom = _a.scrollToBottom, scrollToLatestMessageOnFocus = _a.scrollToLatestMessageOnFocus;
36699
+ var _b = React__default["default"].useState(false), newMessagesReceivedInBackground = _b[0], setNewMessagesReceivedInBackground = _b[1];
36700
+ var resetNewMessagesReceivedInBackground = React.useCallback(function () {
36701
+ setNewMessagesReceivedInBackground(false);
36702
+ }, []);
36703
+ React.useEffect(function () {
36704
+ setNewMessagesReceivedInBackground(true);
36705
+ }, [messages]);
36706
+ var scrollToBottomIfConfigured = React.useCallback(function (event) {
36707
+ if (!scrollToLatestMessageOnFocus ||
36708
+ !newMessagesReceivedInBackground ||
36709
+ event.target !== window)
36710
+ return;
36711
+ setTimeout(scrollToBottom, 100);
36712
+ }, [scrollToLatestMessageOnFocus, scrollToBottom, newMessagesReceivedInBackground]);
36713
+ React.useEffect(function () {
36714
+ if (typeof window !== 'undefined') {
36715
+ window.addEventListener('focus', scrollToBottomIfConfigured);
36716
+ window.addEventListener('blur', resetNewMessagesReceivedInBackground);
36717
+ }
36718
+ return function () {
36719
+ window.removeEventListener('focus', scrollToBottomIfConfigured);
36720
+ window.removeEventListener('blur', resetNewMessagesReceivedInBackground);
36721
+ };
36722
+ }, [scrollToBottomIfConfigured]);
36723
+ };
36724
+
36672
36725
  var PREPEND_OFFSET = Math.pow(10, 7);
36726
+ function calculateItemIndex(virtuosoIndex, numItemsPrepended) {
36727
+ return virtuosoIndex + numItemsPrepended - PREPEND_OFFSET;
36728
+ }
36729
+ function calculateFirstItemIndex(numItemsPrepended) {
36730
+ return PREPEND_OFFSET - numItemsPrepended;
36731
+ }
36732
+ // using 'display: inline-block'
36733
+ // traps CSS margins of the item elements, preventing incorrect item measurements
36734
+ var Item = function (_a) {
36735
+ var _b;
36736
+ var _c;
36737
+ var context = _a.context, props = __rest(_a, ["context"]);
36738
+ if (!context)
36739
+ return React__default["default"].createElement(React__default["default"].Fragment, null);
36740
+ var message = context.processedMessages[calculateItemIndex(props['data-item-index'], context.numItemsPrepended)];
36741
+ var groupStyles = context.messageGroupStyles[message.id];
36742
+ 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) ||
36743
+ clsx('str-chat__virtual-list-message-wrapper str-chat__li', (_b = {},
36744
+ _b["str-chat__li--".concat(groupStyles)] = groupStyles,
36745
+ _b)) })));
36746
+ };
36747
+ var Header = function (_a) {
36748
+ var context = _a.context;
36749
+ var _b = useComponentContext('VirtualizedMessageListHeader').LoadingIndicator, LoadingIndicator$1 = _b === void 0 ? LoadingIndicator : _b;
36750
+ if (!(context === null || context === void 0 ? void 0 : context.loadingMore))
36751
+ return null;
36752
+ return LoadingIndicator$1 ? (React__default["default"].createElement("div", { className: 'str-chat__virtual-list__loading' },
36753
+ React__default["default"].createElement(LoadingIndicator$1, { size: 20 }))) : ((context === null || context === void 0 ? void 0 : context.head) || null);
36754
+ };
36755
+ var EmptyPlaceholder = function (_a) {
36756
+ var context = _a.context;
36757
+ var _b = useComponentContext('VirtualizedMessageList').EmptyStateIndicator, EmptyStateIndicator$1 = _b === void 0 ? EmptyStateIndicator : _b;
36758
+ 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' }))));
36759
+ };
36760
+ var Footer = function () {
36761
+ var TypingIndicator = useComponentContext('VirtualizedMessageList').TypingIndicator;
36762
+ return TypingIndicator ? React__default["default"].createElement(TypingIndicator, { avatarSize: 24 }) : null;
36763
+ };
36764
+ var messageRenderer = function (virtuosoIndex, _data, virtuosoContext) {
36765
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
36766
+ 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;
36767
+ var streamMessageIndex = calculateItemIndex(virtuosoIndex, numItemsPrepended);
36768
+ if (customMessageRenderer) {
36769
+ return customMessageRenderer(messageList, streamMessageIndex);
36770
+ }
36771
+ var message = messageList[streamMessageIndex];
36772
+ if (!message)
36773
+ return React__default["default"].createElement("div", { style: { height: '1px' } }); // returning null or zero height breaks the virtuoso
36774
+ if (message.customType === CUSTOM_MESSAGE_TYPE.date && message.date && isDate(message.date)) {
36775
+ return DateSeparator ? React__default["default"].createElement(DateSeparator, { date: message.date, unread: message.unread }) : null;
36776
+ }
36777
+ if (message.type === 'system') {
36778
+ return MessageSystem ? React__default["default"].createElement(MessageSystem, { message: message }) : null;
36779
+ }
36780
+ var groupedByUser = shouldGroupByUser &&
36781
+ streamMessageIndex > 0 &&
36782
+ ((_a = message.user) === null || _a === void 0 ? void 0 : _a.id) === ((_b = messageList[streamMessageIndex - 1].user) === null || _b === void 0 ? void 0 : _b.id);
36783
+ 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);
36784
+ 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);
36785
+ 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] || [] }));
36786
+ };
36787
+
36673
36788
  function captureResizeObserverExceededError(e) {
36674
36789
  if (e.message === 'ResizeObserver loop completed with undelivered notifications.' ||
36675
36790
  e.message === 'ResizeObserver loop limit exceeded') {
@@ -36700,19 +36815,21 @@ function calculateInitialTopMostItemIndex(messages, highlightedMessageId) {
36700
36815
  return messages.length - 1;
36701
36816
  }
36702
36817
  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,
36818
+ 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
36819
  // TODO: refactor to scrollSeekPlaceHolderConfiguration and components.ScrollSeekPlaceholder, like the Virtuoso Component
36705
- _e = props.overscan,
36820
+ _f = props.overscan,
36706
36821
  // 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;
36822
+ 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;
36823
+ var virtuosoComponentsFromProps = additionalVirtuosoProps.components, overridingVirtuosoProps = __rest(additionalVirtuosoProps, ["components"]);
36708
36824
  // Stops errors generated from react-virtuoso to bubble up
36709
36825
  // to Sentry or other tracking tools.
36710
36826
  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;
36827
+ 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;
36828
+ var MessageUIComponent = MessageUIComponentFromProps || MessageUIComponentFromContext;
36829
+ var _u = useChatContext('VirtualizedMessageList'), client = _u.client, customClasses = _u.customClasses;
36830
+ var virtuoso = React.useRef(null);
36713
36831
  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;
36832
+ var _v = useGiphyPreview(separateGiphyPreview), giphyPreviewMessage = _v.giphyPreviewMessage, setGiphyPreviewMessage = _v.setGiphyPreviewMessage;
36716
36833
  var processedMessages = React.useMemo(function () {
36717
36834
  if (typeof messages === 'undefined') {
36718
36835
  return [];
@@ -36761,9 +36878,8 @@ var VirtualizedMessageListWithContext = function (props) {
36761
36878
  }, {});
36762
36879
  },
36763
36880
  // 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;
36881
+ [processedMessages.length, shouldGroupByUser, groupStylesFn]);
36882
+ var _w = useNewMessageNotification(processedMessages, client.userID, hasMoreNewer), atBottom = _w.atBottom, isMessageListScrolledToBottom = _w.isMessageListScrolledToBottom, newMessagesNotification = _w.newMessagesNotification, setIsMessageListScrolledToBottom = _w.setIsMessageListScrolledToBottom, setNewMessagesNotification = _w.setNewMessagesNotification;
36767
36883
  var scrollToBottom = React.useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
36768
36884
  return __generator(this, function (_a) {
36769
36885
  switch (_a.label) {
@@ -36790,44 +36906,9 @@ var VirtualizedMessageListWithContext = function (props) {
36790
36906
  hasMoreNewer,
36791
36907
  jumpToLatestMessage,
36792
36908
  ]);
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]);
36909
+ useScrollToBottomOnNewMessage({ messages: messages, scrollToBottom: scrollToBottom, scrollToLatestMessageOnFocus: scrollToLatestMessageOnFocus });
36817
36910
  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]);
36911
+ var messageSetKey = useMessageSetKey({ messages: messages }).messageSetKey;
36831
36912
  var shouldForceScrollToBottom = useShouldForceScrollToBottom(processedMessages, client.userID);
36832
36913
  var followOutput = function (isAtBottom) {
36833
36914
  if (hasMoreNewer || suppressAutoscroll) {
@@ -36839,63 +36920,10 @@ var VirtualizedMessageListWithContext = function (props) {
36839
36920
  // a message from another user has been received - don't scroll to bottom unless already there
36840
36921
  return isAtBottom ? stickToBottomScrollBehavior : false;
36841
36922
  };
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;
36923
+ var computeItemKey = React.useCallback(function (index, _, _a) {
36924
+ var numItemsPrepended = _a.numItemsPrepended, processedMessages = _a.processedMessages;
36925
+ return processedMessages[calculateItemIndex(index, numItemsPrepended)].id;
36882
36926
  }, []);
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
36927
  var atBottomStateChange = function (isAtBottom) {
36900
36928
  atBottom.current = isAtBottom;
36901
36929
  setIsMessageListScrolledToBottom(isAtBottom);
@@ -36927,18 +36955,27 @@ var VirtualizedMessageListWithContext = function (props) {
36927
36955
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
36928
36956
  React__default["default"].createElement(MessageListMainPanel, null,
36929
36957
  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: {
36958
+ 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: {
36959
+ additionalMessageInputProps: additionalMessageInputProps,
36960
+ closeReactionSelectorOnClick: closeReactionSelectorOnClick,
36933
36961
  customClasses: customClasses,
36962
+ customMessageActions: customMessageActions,
36963
+ customMessageRenderer: customMessageRenderer,
36964
+ DateSeparator: DateSeparator$1,
36965
+ head: head,
36934
36966
  lastReceivedMessageId: lastReceivedMessageId,
36967
+ loadingMore: loadingMore,
36968
+ Message: MessageUIComponent,
36969
+ messageActions: messageActions,
36935
36970
  messageGroupStyles: messageGroupStyles,
36971
+ MessageSystem: MessageSystem,
36936
36972
  numItemsPrepended: numItemsPrepended,
36937
36973
  ownMessagesReadByOthers: ownMessagesReadByOthers,
36938
36974
  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 } : {}))))),
36975
+ shouldGroupByUser: shouldGroupByUser,
36976
+ threadList: threadList,
36977
+ virtuosoRef: virtuoso,
36978
+ }, 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
36979
  React__default["default"].createElement(MessageListNotifications$1, { hasNewMessages: newMessagesNotification, isMessageListScrolledToBottom: isMessageListScrolledToBottom, isNotAtLatestMessageSet: hasMoreNewer, MessageNotification: MessageNotification$1, notifications: notifications, scrollToBottom: scrollToBottom, threadList: threadList }),
36943
36980
  giphyPreviewMessage && React__default["default"].createElement(GiphyPreviewMessage$1, { message: giphyPreviewMessage })));
36944
36981
  };
@@ -37046,6 +37083,11 @@ var UnMemoizedWindow = function (props) {
37046
37083
  */
37047
37084
  var Window = React__default["default"].memo(UnMemoizedWindow);
37048
37085
 
37086
+ /**
37087
+ * @deprecated will be removed in the next major release
37088
+ */
37089
+ var generateRandomId = nanoid;
37090
+
37049
37091
  // @ts-expect-error
37050
37092
 
37051
37093
  var DefaultEmoji = /*#__PURE__*/Object.freeze({
@@ -37099,7 +37141,7 @@ exports.CooldownTimer = CooldownTimer;
37099
37141
  exports.DateSeparator = DateSeparator;
37100
37142
  exports.DefaultSuggestionList = List;
37101
37143
  exports.DefaultSuggestionListHeader = DefaultSuggestionListHeader;
37102
- exports.DefaultSuggestionListItem = Item;
37144
+ exports.DefaultSuggestionListItem = Item$1;
37103
37145
  exports.DefaultTriggerProvider = DefaultTriggerProvider;
37104
37146
  exports.DeliveredCheckIcon = DeliveredCheckIcon;
37105
37147
  exports.DownloadIcon = DownloadIcon;
@@ -37207,6 +37249,7 @@ exports.areMessagePropsEqual = areMessagePropsEqual;
37207
37249
  exports.areMessageUIPropsEqual = areMessageUIPropsEqual;
37208
37250
  exports.darkModeTheme = darkModeTheme;
37209
37251
  exports.deTranslations = deTranslations;
37252
+ exports.defaultAllowedTagNames = defaultAllowedTagNames;
37210
37253
  exports.defaultDateTimeParser = defaultDateTimeParser;
37211
37254
  exports.defaultPinPermissions = defaultPinPermissions;
37212
37255
  exports.defaultScrollToItem = defaultScrollToItem;