stream-chat-react 13.6.6 → 13.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/components/Channel/Channel.d.ts +1 -1
  2. package/dist/components/Channel/Channel.js +2 -0
  3. package/dist/components/ChannelPreview/ChannelPreview.js +13 -2
  4. package/dist/components/ChannelPreview/utils.js +3 -1
  5. package/dist/components/Chat/hooks/useChat.js +1 -1
  6. package/dist/components/Message/MessageSimple.js +2 -2
  7. package/dist/components/Message/QuotedMessage.js +3 -1
  8. package/dist/components/Message/hooks/useActionHandler.js +6 -5
  9. package/dist/components/Message/renderText/remarkPlugins/imageToLink.d.ts +12 -0
  10. package/dist/components/Message/renderText/remarkPlugins/imageToLink.js +27 -0
  11. package/dist/components/Message/renderText/remarkPlugins/index.d.ts +2 -0
  12. package/dist/components/Message/renderText/remarkPlugins/index.js +2 -0
  13. package/dist/components/Message/renderText/remarkPlugins/plusPlusToEmphasis.d.ts +6 -0
  14. package/dist/components/Message/renderText/remarkPlugins/plusPlusToEmphasis.js +64 -0
  15. package/dist/components/Message/renderText/renderText.js +4 -1
  16. package/dist/components/MessageInput/EditMessageForm.d.ts +2 -1
  17. package/dist/components/MessageInput/hooks/useMessageComposer.js +3 -1
  18. package/dist/components/Poll/PollActions/PollActions.js +2 -1
  19. package/dist/components/TextareaComposer/TextareaComposer.js +4 -1
  20. package/dist/context/ComponentContext.d.ts +3 -1
  21. package/dist/experimental/index.browser.cjs +125 -49
  22. package/dist/experimental/index.browser.cjs.map +4 -4
  23. package/dist/experimental/index.node.cjs +125 -49
  24. package/dist/experimental/index.node.cjs.map +4 -4
  25. package/dist/i18n/TranslationBuilder/notifications/NotificationTranslationTopic.js +2 -1
  26. package/dist/i18n/TranslationBuilder/notifications/attachmentUpload.d.ts +1 -0
  27. package/dist/i18n/TranslationBuilder/notifications/attachmentUpload.js +5 -0
  28. package/dist/index.browser.cjs +1414 -1314
  29. package/dist/index.browser.cjs.map +4 -4
  30. package/dist/index.node.cjs +1416 -1314
  31. package/dist/index.node.cjs.map +4 -4
  32. package/dist/plugins/Emojis/index.browser.cjs +4 -1
  33. package/dist/plugins/Emojis/index.browser.cjs.map +2 -2
  34. package/dist/plugins/Emojis/index.node.cjs +4 -1
  35. package/dist/plugins/Emojis/index.node.cjs.map +2 -2
  36. package/dist/types/defaultDataInterfaces.d.ts +2 -0
  37. package/dist/utils/useStableCallback.d.ts +25 -0
  38. package/dist/utils/useStableCallback.js +29 -0
  39. package/package.json +3 -4
@@ -3366,7 +3366,7 @@ function resolveAllAttention(events, context) {
3366
3366
  let index2 = -1;
3367
3367
  let open;
3368
3368
  let group;
3369
- let text7;
3369
+ let text8;
3370
3370
  let openingSequence;
3371
3371
  let closingSequence;
3372
3372
  let use;
@@ -3404,7 +3404,7 @@ function resolveAllAttention(events, context) {
3404
3404
  },
3405
3405
  end
3406
3406
  };
3407
- text7 = {
3407
+ text8 = {
3408
3408
  type: use > 1 ? "strongText" : "emphasisText",
3409
3409
  start: {
3410
3410
  ...events[open][1].end
@@ -3432,9 +3432,9 @@ function resolveAllAttention(events, context) {
3432
3432
  if (events[open][1].end.offset - events[open][1].start.offset) {
3433
3433
  nextEvents = push(nextEvents, [["enter", events[open][1], context], ["exit", events[open][1], context]]);
3434
3434
  }
3435
- nextEvents = push(nextEvents, [["enter", group, context], ["enter", openingSequence, context], ["exit", openingSequence, context], ["enter", text7, context]]);
3435
+ nextEvents = push(nextEvents, [["enter", group, context], ["enter", openingSequence, context], ["exit", openingSequence, context], ["enter", text8, context]]);
3436
3436
  nextEvents = push(nextEvents, resolveAll(context.parser.constructs.insideSpan.null, events.slice(open + 1, index2), context));
3437
- nextEvents = push(nextEvents, [["exit", text7, context], ["enter", closingSequence, context], ["exit", closingSequence, context], ["exit", group, context]]);
3437
+ nextEvents = push(nextEvents, [["exit", text8, context], ["enter", closingSequence, context], ["exit", closingSequence, context], ["exit", group, context]]);
3438
3438
  if (events[index2][1].end.offset - events[index2][1].start.offset) {
3439
3439
  offset = 2;
3440
3440
  nextEvents = push(nextEvents, [["enter", events[index2][1], context], ["exit", events[index2][1], context]]);
@@ -4876,7 +4876,7 @@ function resolveHeadingAtx(events, context) {
4876
4876
  let contentEnd = events.length - 2;
4877
4877
  let contentStart = 3;
4878
4878
  let content3;
4879
- let text7;
4879
+ let text8;
4880
4880
  if (events[contentStart][1].type === "whitespace") {
4881
4881
  contentStart += 2;
4882
4882
  }
@@ -4892,13 +4892,13 @@ function resolveHeadingAtx(events, context) {
4892
4892
  start: events[contentStart][1].start,
4893
4893
  end: events[contentEnd][1].end
4894
4894
  };
4895
- text7 = {
4895
+ text8 = {
4896
4896
  type: "chunkText",
4897
4897
  start: events[contentStart][1].start,
4898
4898
  end: events[contentEnd][1].end,
4899
4899
  contentType: "text"
4900
4900
  };
4901
- splice(events, contentStart, contentEnd - contentStart + 1, [["enter", content3, context], ["enter", text7, context], ["exit", text7, context], ["exit", content3, context]]);
4901
+ splice(events, contentStart, contentEnd - contentStart + 1, [["enter", content3, context], ["enter", text8, context], ["exit", text8, context], ["exit", content3, context]]);
4902
4902
  }
4903
4903
  return events;
4904
4904
  }
@@ -5788,7 +5788,7 @@ function resolveToLabelEnd(events, context) {
5788
5788
  ...events[close][1].end
5789
5789
  }
5790
5790
  };
5791
- const text7 = {
5791
+ const text8 = {
5792
5792
  type: "labelText",
5793
5793
  start: {
5794
5794
  ...events[open + offset + 2][1].end
@@ -5799,9 +5799,9 @@ function resolveToLabelEnd(events, context) {
5799
5799
  };
5800
5800
  media = [["enter", group, context], ["enter", label, context]];
5801
5801
  media = push(media, events.slice(open + 1, open + offset + 3));
5802
- media = push(media, [["enter", text7, context]]);
5802
+ media = push(media, [["enter", text8, context]]);
5803
5803
  media = push(media, resolveAll(context.parser.constructs.insideSpan.null, events.slice(open + offset + 4, close - 3), context));
5804
- media = push(media, [["exit", text7, context], events[close - 2], events[close - 1], ["exit", label, context]]);
5804
+ media = push(media, [["exit", text8, context], events[close - 2], events[close - 1], ["exit", label, context]]);
5805
5805
  media = push(media, events.slice(close + 1));
5806
5806
  media = push(media, [["exit", group, context]]);
5807
5807
  splice(events, open, events.length, media);
@@ -6181,7 +6181,7 @@ var setextUnderline = {
6181
6181
  function resolveToSetextUnderline(events, context) {
6182
6182
  let index2 = events.length;
6183
6183
  let content3;
6184
- let text7;
6184
+ let text8;
6185
6185
  let definition3;
6186
6186
  while (index2--) {
6187
6187
  if (events[index2][0] === "enter") {
@@ -6190,7 +6190,7 @@ function resolveToSetextUnderline(events, context) {
6190
6190
  break;
6191
6191
  }
6192
6192
  if (events[index2][1].type === "paragraph") {
6193
- text7 = index2;
6193
+ text8 = index2;
6194
6194
  }
6195
6195
  } else {
6196
6196
  if (events[index2][1].type === "content") {
@@ -6204,15 +6204,15 @@ function resolveToSetextUnderline(events, context) {
6204
6204
  const heading3 = {
6205
6205
  type: "setextHeading",
6206
6206
  start: {
6207
- ...events[text7][1].start
6207
+ ...events[text8][1].start
6208
6208
  },
6209
6209
  end: {
6210
6210
  ...events[events.length - 1][1].end
6211
6211
  }
6212
6212
  };
6213
- events[text7][1].type = "setextHeadingText";
6213
+ events[text8][1].type = "setextHeadingText";
6214
6214
  if (definition3) {
6215
- events.splice(text7, 0, ["enter", heading3, context]);
6215
+ events.splice(text8, 0, ["enter", heading3, context]);
6216
6216
  events.splice(definition3 + 1, 0, ["exit", events[content3][1], context]);
6217
6217
  events[content3][1].end = {
6218
6218
  ...events[definition3][1].end
@@ -6316,10 +6316,10 @@ function initializeFactory(field) {
6316
6316
  function initializeText(effects) {
6317
6317
  const self2 = this;
6318
6318
  const constructs2 = this.parser.constructs[field];
6319
- const text7 = effects.attempt(constructs2, start2, notText);
6319
+ const text8 = effects.attempt(constructs2, start2, notText);
6320
6320
  return start2;
6321
6321
  function start2(code4) {
6322
- return atBreak(code4) ? text7(code4) : notText(code4);
6322
+ return atBreak(code4) ? text8(code4) : notText(code4);
6323
6323
  }
6324
6324
  function notText(code4) {
6325
6325
  if (code4 === null) {
@@ -6333,7 +6333,7 @@ function initializeFactory(field) {
6333
6333
  function data(code4) {
6334
6334
  if (atBreak(code4)) {
6335
6335
  effects.exit("data");
6336
- return text7(code4);
6336
+ return text8(code4);
6337
6337
  }
6338
6338
  effects.consume(code4);
6339
6339
  return data;
@@ -7352,7 +7352,7 @@ function compiler(options) {
7352
7352
  const siblings = node2.children;
7353
7353
  let tail = siblings[siblings.length - 1];
7354
7354
  if (!tail || tail.type !== "text") {
7355
- tail = text7();
7355
+ tail = text8();
7356
7356
  tail.position = {
7357
7357
  start: point3(token.start),
7358
7358
  // @ts-expect-error: we’ll add `end` later.
@@ -7597,7 +7597,7 @@ function compiler(options) {
7597
7597
  children: []
7598
7598
  };
7599
7599
  }
7600
- function text7() {
7600
+ function text8() {
7601
7601
  return {
7602
7602
  type: "text",
7603
7603
  value: ""
@@ -7879,13 +7879,13 @@ function image(state, node2) {
7879
7879
 
7880
7880
  // node_modules/mdast-util-to-hast/lib/handlers/inline-code.js
7881
7881
  function inlineCode(state, node2) {
7882
- const text7 = { type: "text", value: node2.value.replace(/\r?\n|\r/g, " ") };
7883
- state.patch(node2, text7);
7882
+ const text8 = { type: "text", value: node2.value.replace(/\r?\n|\r/g, " ") };
7883
+ state.patch(node2, text8);
7884
7884
  const result = {
7885
7885
  type: "element",
7886
7886
  tagName: "code",
7887
7887
  properties: {},
7888
- children: [text7]
7888
+ children: [text8]
7889
7889
  };
7890
7890
  state.patch(node2, result);
7891
7891
  return state.applyData(node2, result);
@@ -10968,6 +10968,65 @@ var transform = (tree) => {
10968
10968
  };
10969
10969
  var htmlToTextPlugin = () => transform;
10970
10970
 
10971
+ // src/components/Message/renderText/remarkPlugins/imageToLink.ts
10972
+ var text5 = (value) => ({ type: "text", value });
10973
+ function imageToLink({ getTextLabelFrom = "url" } = {}) {
10974
+ return (tree) => {
10975
+ const visitor2 = (node2, index2, parent) => {
10976
+ if (parent == null || index2 == null) return;
10977
+ const label = node2[getTextLabelFrom] ?? node2.url;
10978
+ const link3 = {
10979
+ children: [text5(label)],
10980
+ title: node2.title ?? node2.alt ?? node2.url,
10981
+ type: "link",
10982
+ url: node2.url
10983
+ };
10984
+ parent.children.splice(index2, 1, link3);
10985
+ return [SKIP, index2 + 1];
10986
+ };
10987
+ visit(tree, "image", visitor2);
10988
+ };
10989
+ }
10990
+
10991
+ // src/components/Message/renderText/remarkPlugins/plusPlusToEmphasis.ts
10992
+ var INS_REGEX = /\+\+(\S(?:[\s\S]*?\S)?)\+\+/g;
10993
+ var IGNORE_NODE_TYPES = /* @__PURE__ */ new Set([
10994
+ "code",
10995
+ "inlineCode",
10996
+ "link",
10997
+ "linkReference",
10998
+ "definition",
10999
+ "math",
11000
+ "inlineMath"
11001
+ ]);
11002
+ var plusPlusToEmphasis = () => {
11003
+ const visitor2 = (node2, index2, parent) => {
11004
+ if (IGNORE_NODE_TYPES.has(node2.type)) return SKIP;
11005
+ if (node2.type !== "text" || parent == null || typeof index2 !== "number") return;
11006
+ const value = node2.value;
11007
+ INS_REGEX.lastIndex = 0;
11008
+ let match;
11009
+ let last = 0;
11010
+ const out = [];
11011
+ while (match = INS_REGEX.exec(value)) {
11012
+ const [full, inner] = match;
11013
+ const start2 = match.index;
11014
+ if (start2 > last) out.push({ type: "text", value: value.slice(last, start2) });
11015
+ out.push({
11016
+ children: [{ type: "text", value: inner }],
11017
+ data: { hName: "ins" },
11018
+ type: "emphasis"
11019
+ });
11020
+ last = start2 + full.length;
11021
+ }
11022
+ if (out.length === 0) return;
11023
+ if (last < value.length) out.push({ type: "text", value: value.slice(last) });
11024
+ parent.children.splice(index2, 1, ...out);
11025
+ return [SKIP, index2 + out.length];
11026
+ };
11027
+ return (tree) => visit(tree, visitor2);
11028
+ };
11029
+
10971
11030
  // node_modules/ccount/index.js
10972
11031
  function ccount(value, character) {
10973
11032
  const source = String(value);
@@ -12156,12 +12215,12 @@ function linkReference2(node2, _, state, info) {
12156
12215
  let subexit = state.enter("label");
12157
12216
  const tracker = state.createTracker(info);
12158
12217
  let value = tracker.move("[");
12159
- const text7 = state.containerPhrasing(node2, {
12218
+ const text8 = state.containerPhrasing(node2, {
12160
12219
  before: value,
12161
12220
  after: "]",
12162
12221
  ...tracker.current()
12163
12222
  });
12164
- value += tracker.move(text7 + "][");
12223
+ value += tracker.move(text8 + "][");
12165
12224
  subexit();
12166
12225
  const stack = state.stack;
12167
12226
  state.stack = [];
@@ -12174,7 +12233,7 @@ function linkReference2(node2, _, state, info) {
12174
12233
  subexit();
12175
12234
  state.stack = stack;
12176
12235
  exit3();
12177
- if (type === "full" || !text7 || text7 !== reference) {
12236
+ if (type === "full" || !text8 || text8 !== reference) {
12178
12237
  value += tracker.move(reference + "]");
12179
12238
  } else if (type === "shortcut") {
12180
12239
  value = value.slice(0, -1);
@@ -12419,7 +12478,7 @@ function strongPeek(_, _1, state) {
12419
12478
  }
12420
12479
 
12421
12480
  // node_modules/mdast-util-to-markdown/lib/handle/text.js
12422
- function text5(node2, _, state, info) {
12481
+ function text6(node2, _, state, info) {
12423
12482
  return state.safe(node2.value, info);
12424
12483
  }
12425
12484
 
@@ -12460,7 +12519,7 @@ var handle = {
12460
12519
  paragraph: paragraph2,
12461
12520
  root: root3,
12462
12521
  strong: strong2,
12463
- text: text5,
12522
+ text: text6,
12464
12523
  thematicBreak: thematicBreak3
12465
12524
  };
12466
12525
 
@@ -12748,27 +12807,27 @@ var emailAutolink = {
12748
12807
  tokenize: tokenizeEmailAutolink,
12749
12808
  previous: previousEmail
12750
12809
  };
12751
- var text6 = {};
12810
+ var text7 = {};
12752
12811
  function gfmAutolinkLiteral() {
12753
12812
  return {
12754
- text: text6
12813
+ text: text7
12755
12814
  };
12756
12815
  }
12757
12816
  var code3 = 48;
12758
12817
  while (code3 < 123) {
12759
- text6[code3] = emailAutolink;
12818
+ text7[code3] = emailAutolink;
12760
12819
  code3++;
12761
12820
  if (code3 === 58) code3 = 65;
12762
12821
  else if (code3 === 91) code3 = 97;
12763
12822
  }
12764
- text6[43] = emailAutolink;
12765
- text6[45] = emailAutolink;
12766
- text6[46] = emailAutolink;
12767
- text6[95] = emailAutolink;
12768
- text6[72] = [emailAutolink, protocolAutolink];
12769
- text6[104] = [emailAutolink, protocolAutolink];
12770
- text6[87] = [emailAutolink, wwwAutolink];
12771
- text6[119] = [emailAutolink, wwwAutolink];
12823
+ text7[43] = emailAutolink;
12824
+ text7[45] = emailAutolink;
12825
+ text7[46] = emailAutolink;
12826
+ text7[95] = emailAutolink;
12827
+ text7[72] = [emailAutolink, protocolAutolink];
12828
+ text7[104] = [emailAutolink, protocolAutolink];
12829
+ text7[87] = [emailAutolink, wwwAutolink];
12830
+ text7[119] = [emailAutolink, wwwAutolink];
12772
12831
  function tokenizeEmailAutolink(effects, ok3, nok) {
12773
12832
  const self2 = this;
12774
12833
  let dot;
@@ -13367,17 +13426,17 @@ function gfmStrikethrough(options) {
13367
13426
  start: Object.assign({}, events[open][1].start),
13368
13427
  end: Object.assign({}, events[index2][1].end)
13369
13428
  };
13370
- const text7 = {
13429
+ const text8 = {
13371
13430
  type: "strikethroughText",
13372
13431
  start: Object.assign({}, events[open][1].end),
13373
13432
  end: Object.assign({}, events[index2][1].start)
13374
13433
  };
13375
- const nextEvents = [["enter", strikethrough2, context], ["enter", events[open][1], context], ["exit", events[open][1], context], ["enter", text7, context]];
13434
+ const nextEvents = [["enter", strikethrough2, context], ["enter", events[open][1], context], ["exit", events[open][1], context], ["enter", text8, context]];
13376
13435
  const insideSpan2 = context.parser.constructs.insideSpan.null;
13377
13436
  if (insideSpan2) {
13378
13437
  splice(nextEvents, nextEvents.length, 0, resolveAll(insideSpan2, events.slice(open + 1, index2), context));
13379
13438
  }
13380
- splice(nextEvents, nextEvents.length, 0, [["exit", text7, context], ["enter", events[index2][1], context], ["exit", events[index2][1], context], ["exit", strikethrough2, context]]);
13439
+ splice(nextEvents, nextEvents.length, 0, [["exit", text8, context], ["enter", events[index2][1], context], ["exit", events[index2][1], context], ["exit", strikethrough2, context]]);
13381
13440
  splice(events, open - 1, index2 - open + 3, nextEvents);
13382
13441
  index2 = open + nextEvents.length - 2;
13383
13442
  break;
@@ -14418,9 +14477,11 @@ var InfiniteScrollPaginator = (props) => {
14418
14477
  // src/components/ChannelPreview/utils.tsx
14419
14478
  var remarkPlugins = [
14420
14479
  htmlToTextPlugin,
14421
- [remarkGfm, { singleTilde: false }]
14480
+ [remarkGfm, { singleTilde: false }],
14481
+ plusPlusToEmphasis,
14482
+ imageToLink
14422
14483
  ];
14423
- var renderPreviewText = (text7) => /* @__PURE__ */ import_react32.default.createElement(Markdown, { remarkPlugins, skipHtml: true }, text7);
14484
+ var renderPreviewText = (text8) => /* @__PURE__ */ import_react32.default.createElement(Markdown, { remarkPlugins, skipHtml: true }, text8);
14424
14485
  var getLatestPollVote = (latestVotesByOption) => {
14425
14486
  let latestVote;
14426
14487
  for (const optionVotes of Object.values(latestVotesByOption)) {
@@ -14607,6 +14668,9 @@ var ChannelPreview = (props) => {
14607
14668
  const [lastMessage, setLastMessage] = (0, import_react35.useState)(
14608
14669
  channel.state.messages[channel.state.messages.length - 1]
14609
14670
  );
14671
+ const [latestMessagePreview, setLatestMessagePreview] = (0, import_react35.useState)(
14672
+ () => getLatestMessagePreview2(channel, t, userLanguage, isMessageAIGenerated)
14673
+ );
14610
14674
  const [unread, setUnread] = (0, import_react35.useState)(0);
14611
14675
  const { messageDeliveryStatus } = useMessageDeliveryStatus({
14612
14676
  channel,
@@ -14645,12 +14709,18 @@ var ChannelPreview = (props) => {
14645
14709
  );
14646
14710
  (0, import_react35.useEffect)(() => {
14647
14711
  refreshUnreadCount();
14712
+ setLatestMessagePreview(
14713
+ getLatestMessagePreview2(channel, t, userLanguage, isMessageAIGenerated)
14714
+ );
14648
14715
  const handleEvent = (event) => {
14649
14716
  const deletedMessagesInAnotherChannel = event.type === "user.messages.deleted" && event.cid && event.cid !== channel.cid;
14650
14717
  if (deletedMessagesInAnotherChannel) return;
14651
14718
  setLastMessage(
14652
14719
  channel.state.latestMessages[channel.state.latestMessages.length - 1]
14653
14720
  );
14721
+ setLatestMessagePreview(
14722
+ getLatestMessagePreview2(channel, t, userLanguage, isMessageAIGenerated)
14723
+ );
14654
14724
  refreshUnreadCount();
14655
14725
  };
14656
14726
  channel.on("message.new", handleEvent);
@@ -14667,14 +14737,17 @@ var ChannelPreview = (props) => {
14667
14737
  channel.off("message.undeleted", handleEvent);
14668
14738
  channel.off("channel.truncated", handleEvent);
14669
14739
  };
14670
- }, [channel, client, refreshUnreadCount, channelUpdateCount]);
14671
- if (!Preview) return null;
14672
- const latestMessagePreview = getLatestMessagePreview2(
14740
+ }, [
14673
14741
  channel,
14742
+ client,
14743
+ refreshUnreadCount,
14744
+ channelUpdateCount,
14745
+ getLatestMessagePreview2,
14674
14746
  t,
14675
14747
  userLanguage,
14676
14748
  isMessageAIGenerated
14677
- );
14749
+ ]);
14750
+ if (!Preview) return null;
14678
14751
  return /* @__PURE__ */ import_react35.default.createElement(
14679
14752
  Preview,
14680
14753
  {
@@ -14718,7 +14791,10 @@ var useMessageComposer = () => {
14718
14791
  if (editing && cachedEditedMessage) {
14719
14792
  const tag = import_stream_chat2.MessageComposer.constructTag(cachedEditedMessage);
14720
14793
  const cachedComposer = queueCache.get(tag);
14721
- if (cachedComposer) return cachedComposer;
14794
+ if (cachedComposer) {
14795
+ cachedComposer.editedMessage = cachedEditedMessage;
14796
+ return cachedComposer;
14797
+ }
14722
14798
  return new import_stream_chat2.MessageComposer({
14723
14799
  client,
14724
14800
  composition: cachedEditedMessage,