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
@@ -5489,7 +5489,7 @@ function resolveAllAttention(events, context) {
5489
5489
  let index2 = -1;
5490
5490
  let open;
5491
5491
  let group;
5492
- let text7;
5492
+ let text8;
5493
5493
  let openingSequence;
5494
5494
  let closingSequence;
5495
5495
  let use;
@@ -5527,7 +5527,7 @@ function resolveAllAttention(events, context) {
5527
5527
  },
5528
5528
  end
5529
5529
  };
5530
- text7 = {
5530
+ text8 = {
5531
5531
  type: use > 1 ? "strongText" : "emphasisText",
5532
5532
  start: {
5533
5533
  ...events[open][1].end
@@ -5555,9 +5555,9 @@ function resolveAllAttention(events, context) {
5555
5555
  if (events[open][1].end.offset - events[open][1].start.offset) {
5556
5556
  nextEvents = push(nextEvents, [["enter", events[open][1], context], ["exit", events[open][1], context]]);
5557
5557
  }
5558
- nextEvents = push(nextEvents, [["enter", group, context], ["enter", openingSequence, context], ["exit", openingSequence, context], ["enter", text7, context]]);
5558
+ nextEvents = push(nextEvents, [["enter", group, context], ["enter", openingSequence, context], ["exit", openingSequence, context], ["enter", text8, context]]);
5559
5559
  nextEvents = push(nextEvents, resolveAll(context.parser.constructs.insideSpan.null, events.slice(open + 1, index2), context));
5560
- nextEvents = push(nextEvents, [["exit", text7, context], ["enter", closingSequence, context], ["exit", closingSequence, context], ["exit", group, context]]);
5560
+ nextEvents = push(nextEvents, [["exit", text8, context], ["enter", closingSequence, context], ["exit", closingSequence, context], ["exit", group, context]]);
5561
5561
  if (events[index2][1].end.offset - events[index2][1].start.offset) {
5562
5562
  offset = 2;
5563
5563
  nextEvents = push(nextEvents, [["enter", events[index2][1], context], ["exit", events[index2][1], context]]);
@@ -6999,7 +6999,7 @@ function resolveHeadingAtx(events, context) {
6999
6999
  let contentEnd = events.length - 2;
7000
7000
  let contentStart = 3;
7001
7001
  let content3;
7002
- let text7;
7002
+ let text8;
7003
7003
  if (events[contentStart][1].type === "whitespace") {
7004
7004
  contentStart += 2;
7005
7005
  }
@@ -7015,13 +7015,13 @@ function resolveHeadingAtx(events, context) {
7015
7015
  start: events[contentStart][1].start,
7016
7016
  end: events[contentEnd][1].end
7017
7017
  };
7018
- text7 = {
7018
+ text8 = {
7019
7019
  type: "chunkText",
7020
7020
  start: events[contentStart][1].start,
7021
7021
  end: events[contentEnd][1].end,
7022
7022
  contentType: "text"
7023
7023
  };
7024
- splice(events, contentStart, contentEnd - contentStart + 1, [["enter", content3, context], ["enter", text7, context], ["exit", text7, context], ["exit", content3, context]]);
7024
+ splice(events, contentStart, contentEnd - contentStart + 1, [["enter", content3, context], ["enter", text8, context], ["exit", text8, context], ["exit", content3, context]]);
7025
7025
  }
7026
7026
  return events;
7027
7027
  }
@@ -7911,7 +7911,7 @@ function resolveToLabelEnd(events, context) {
7911
7911
  ...events[close][1].end
7912
7912
  }
7913
7913
  };
7914
- const text7 = {
7914
+ const text8 = {
7915
7915
  type: "labelText",
7916
7916
  start: {
7917
7917
  ...events[open + offset + 2][1].end
@@ -7922,9 +7922,9 @@ function resolveToLabelEnd(events, context) {
7922
7922
  };
7923
7923
  media = [["enter", group, context], ["enter", label, context]];
7924
7924
  media = push(media, events.slice(open + 1, open + offset + 3));
7925
- media = push(media, [["enter", text7, context]]);
7925
+ media = push(media, [["enter", text8, context]]);
7926
7926
  media = push(media, resolveAll(context.parser.constructs.insideSpan.null, events.slice(open + offset + 4, close - 3), context));
7927
- media = push(media, [["exit", text7, context], events[close - 2], events[close - 1], ["exit", label, context]]);
7927
+ media = push(media, [["exit", text8, context], events[close - 2], events[close - 1], ["exit", label, context]]);
7928
7928
  media = push(media, events.slice(close + 1));
7929
7929
  media = push(media, [["exit", group, context]]);
7930
7930
  splice(events, open, events.length, media);
@@ -8304,7 +8304,7 @@ var setextUnderline = {
8304
8304
  function resolveToSetextUnderline(events, context) {
8305
8305
  let index2 = events.length;
8306
8306
  let content3;
8307
- let text7;
8307
+ let text8;
8308
8308
  let definition3;
8309
8309
  while (index2--) {
8310
8310
  if (events[index2][0] === "enter") {
@@ -8313,7 +8313,7 @@ function resolveToSetextUnderline(events, context) {
8313
8313
  break;
8314
8314
  }
8315
8315
  if (events[index2][1].type === "paragraph") {
8316
- text7 = index2;
8316
+ text8 = index2;
8317
8317
  }
8318
8318
  } else {
8319
8319
  if (events[index2][1].type === "content") {
@@ -8327,15 +8327,15 @@ function resolveToSetextUnderline(events, context) {
8327
8327
  const heading3 = {
8328
8328
  type: "setextHeading",
8329
8329
  start: {
8330
- ...events[text7][1].start
8330
+ ...events[text8][1].start
8331
8331
  },
8332
8332
  end: {
8333
8333
  ...events[events.length - 1][1].end
8334
8334
  }
8335
8335
  };
8336
- events[text7][1].type = "setextHeadingText";
8336
+ events[text8][1].type = "setextHeadingText";
8337
8337
  if (definition3) {
8338
- events.splice(text7, 0, ["enter", heading3, context]);
8338
+ events.splice(text8, 0, ["enter", heading3, context]);
8339
8339
  events.splice(definition3 + 1, 0, ["exit", events[content3][1], context]);
8340
8340
  events[content3][1].end = {
8341
8341
  ...events[definition3][1].end
@@ -8439,10 +8439,10 @@ function initializeFactory(field) {
8439
8439
  function initializeText(effects) {
8440
8440
  const self2 = this;
8441
8441
  const constructs2 = this.parser.constructs[field];
8442
- const text7 = effects.attempt(constructs2, start2, notText);
8442
+ const text8 = effects.attempt(constructs2, start2, notText);
8443
8443
  return start2;
8444
8444
  function start2(code4) {
8445
- return atBreak(code4) ? text7(code4) : notText(code4);
8445
+ return atBreak(code4) ? text8(code4) : notText(code4);
8446
8446
  }
8447
8447
  function notText(code4) {
8448
8448
  if (code4 === null) {
@@ -8456,7 +8456,7 @@ function initializeFactory(field) {
8456
8456
  function data(code4) {
8457
8457
  if (atBreak(code4)) {
8458
8458
  effects.exit("data");
8459
- return text7(code4);
8459
+ return text8(code4);
8460
8460
  }
8461
8461
  effects.consume(code4);
8462
8462
  return data;
@@ -9475,7 +9475,7 @@ function compiler(options) {
9475
9475
  const siblings = node2.children;
9476
9476
  let tail = siblings[siblings.length - 1];
9477
9477
  if (!tail || tail.type !== "text") {
9478
- tail = text7();
9478
+ tail = text8();
9479
9479
  tail.position = {
9480
9480
  start: point3(token.start),
9481
9481
  // @ts-expect-error: we’ll add `end` later.
@@ -9720,7 +9720,7 @@ function compiler(options) {
9720
9720
  children: []
9721
9721
  };
9722
9722
  }
9723
- function text7() {
9723
+ function text8() {
9724
9724
  return {
9725
9725
  type: "text",
9726
9726
  value: ""
@@ -10002,13 +10002,13 @@ function image(state, node2) {
10002
10002
 
10003
10003
  // node_modules/mdast-util-to-hast/lib/handlers/inline-code.js
10004
10004
  function inlineCode(state, node2) {
10005
- const text7 = { type: "text", value: node2.value.replace(/\r?\n|\r/g, " ") };
10006
- state.patch(node2, text7);
10005
+ const text8 = { type: "text", value: node2.value.replace(/\r?\n|\r/g, " ") };
10006
+ state.patch(node2, text8);
10007
10007
  const result = {
10008
10008
  type: "element",
10009
10009
  tagName: "code",
10010
10010
  properties: {},
10011
- children: [text7]
10011
+ children: [text8]
10012
10012
  };
10013
10013
  state.patch(node2, result);
10014
10014
  return state.applyData(node2, result);
@@ -12838,6 +12838,65 @@ var transform = (tree) => {
12838
12838
  };
12839
12839
  var htmlToTextPlugin = () => transform;
12840
12840
 
12841
+ // src/components/Message/renderText/remarkPlugins/imageToLink.ts
12842
+ var text5 = (value) => ({ type: "text", value });
12843
+ function imageToLink({ getTextLabelFrom = "url" } = {}) {
12844
+ return (tree) => {
12845
+ const visitor2 = (node2, index2, parent) => {
12846
+ if (parent == null || index2 == null) return;
12847
+ const label = node2[getTextLabelFrom] ?? node2.url;
12848
+ const link3 = {
12849
+ children: [text5(label)],
12850
+ title: node2.title ?? node2.alt ?? node2.url,
12851
+ type: "link",
12852
+ url: node2.url
12853
+ };
12854
+ parent.children.splice(index2, 1, link3);
12855
+ return [SKIP, index2 + 1];
12856
+ };
12857
+ visit(tree, "image", visitor2);
12858
+ };
12859
+ }
12860
+
12861
+ // src/components/Message/renderText/remarkPlugins/plusPlusToEmphasis.ts
12862
+ var INS_REGEX = /\+\+(\S(?:[\s\S]*?\S)?)\+\+/g;
12863
+ var IGNORE_NODE_TYPES = /* @__PURE__ */ new Set([
12864
+ "code",
12865
+ "inlineCode",
12866
+ "link",
12867
+ "linkReference",
12868
+ "definition",
12869
+ "math",
12870
+ "inlineMath"
12871
+ ]);
12872
+ var plusPlusToEmphasis = () => {
12873
+ const visitor2 = (node2, index2, parent) => {
12874
+ if (IGNORE_NODE_TYPES.has(node2.type)) return SKIP;
12875
+ if (node2.type !== "text" || parent == null || typeof index2 !== "number") return;
12876
+ const value = node2.value;
12877
+ INS_REGEX.lastIndex = 0;
12878
+ let match;
12879
+ let last = 0;
12880
+ const out = [];
12881
+ while (match = INS_REGEX.exec(value)) {
12882
+ const [full, inner] = match;
12883
+ const start2 = match.index;
12884
+ if (start2 > last) out.push({ type: "text", value: value.slice(last, start2) });
12885
+ out.push({
12886
+ children: [{ type: "text", value: inner }],
12887
+ data: { hName: "ins" },
12888
+ type: "emphasis"
12889
+ });
12890
+ last = start2 + full.length;
12891
+ }
12892
+ if (out.length === 0) return;
12893
+ if (last < value.length) out.push({ type: "text", value: value.slice(last) });
12894
+ parent.children.splice(index2, 1, ...out);
12895
+ return [SKIP, index2 + out.length];
12896
+ };
12897
+ return (tree) => visit(tree, visitor2);
12898
+ };
12899
+
12841
12900
  // node_modules/ccount/index.js
12842
12901
  function ccount(value, character) {
12843
12902
  const source = String(value);
@@ -14026,12 +14085,12 @@ function linkReference2(node2, _, state, info) {
14026
14085
  let subexit = state.enter("label");
14027
14086
  const tracker = state.createTracker(info);
14028
14087
  let value = tracker.move("[");
14029
- const text7 = state.containerPhrasing(node2, {
14088
+ const text8 = state.containerPhrasing(node2, {
14030
14089
  before: value,
14031
14090
  after: "]",
14032
14091
  ...tracker.current()
14033
14092
  });
14034
- value += tracker.move(text7 + "][");
14093
+ value += tracker.move(text8 + "][");
14035
14094
  subexit();
14036
14095
  const stack = state.stack;
14037
14096
  state.stack = [];
@@ -14044,7 +14103,7 @@ function linkReference2(node2, _, state, info) {
14044
14103
  subexit();
14045
14104
  state.stack = stack;
14046
14105
  exit3();
14047
- if (type === "full" || !text7 || text7 !== reference) {
14106
+ if (type === "full" || !text8 || text8 !== reference) {
14048
14107
  value += tracker.move(reference + "]");
14049
14108
  } else if (type === "shortcut") {
14050
14109
  value = value.slice(0, -1);
@@ -14289,7 +14348,7 @@ function strongPeek(_, _1, state) {
14289
14348
  }
14290
14349
 
14291
14350
  // node_modules/mdast-util-to-markdown/lib/handle/text.js
14292
- function text5(node2, _, state, info) {
14351
+ function text6(node2, _, state, info) {
14293
14352
  return state.safe(node2.value, info);
14294
14353
  }
14295
14354
 
@@ -14330,7 +14389,7 @@ var handle = {
14330
14389
  paragraph: paragraph2,
14331
14390
  root: root3,
14332
14391
  strong: strong2,
14333
- text: text5,
14392
+ text: text6,
14334
14393
  thematicBreak: thematicBreak3
14335
14394
  };
14336
14395
 
@@ -14618,27 +14677,27 @@ var emailAutolink = {
14618
14677
  tokenize: tokenizeEmailAutolink,
14619
14678
  previous: previousEmail
14620
14679
  };
14621
- var text6 = {};
14680
+ var text7 = {};
14622
14681
  function gfmAutolinkLiteral() {
14623
14682
  return {
14624
- text: text6
14683
+ text: text7
14625
14684
  };
14626
14685
  }
14627
14686
  var code3 = 48;
14628
14687
  while (code3 < 123) {
14629
- text6[code3] = emailAutolink;
14688
+ text7[code3] = emailAutolink;
14630
14689
  code3++;
14631
14690
  if (code3 === 58) code3 = 65;
14632
14691
  else if (code3 === 91) code3 = 97;
14633
14692
  }
14634
- text6[43] = emailAutolink;
14635
- text6[45] = emailAutolink;
14636
- text6[46] = emailAutolink;
14637
- text6[95] = emailAutolink;
14638
- text6[72] = [emailAutolink, protocolAutolink];
14639
- text6[104] = [emailAutolink, protocolAutolink];
14640
- text6[87] = [emailAutolink, wwwAutolink];
14641
- text6[119] = [emailAutolink, wwwAutolink];
14693
+ text7[43] = emailAutolink;
14694
+ text7[45] = emailAutolink;
14695
+ text7[46] = emailAutolink;
14696
+ text7[95] = emailAutolink;
14697
+ text7[72] = [emailAutolink, protocolAutolink];
14698
+ text7[104] = [emailAutolink, protocolAutolink];
14699
+ text7[87] = [emailAutolink, wwwAutolink];
14700
+ text7[119] = [emailAutolink, wwwAutolink];
14642
14701
  function tokenizeEmailAutolink(effects, ok3, nok) {
14643
14702
  const self2 = this;
14644
14703
  let dot;
@@ -15237,17 +15296,17 @@ function gfmStrikethrough(options) {
15237
15296
  start: Object.assign({}, events[open][1].start),
15238
15297
  end: Object.assign({}, events[index2][1].end)
15239
15298
  };
15240
- const text7 = {
15299
+ const text8 = {
15241
15300
  type: "strikethroughText",
15242
15301
  start: Object.assign({}, events[open][1].end),
15243
15302
  end: Object.assign({}, events[index2][1].start)
15244
15303
  };
15245
- const nextEvents = [["enter", strikethrough2, context], ["enter", events[open][1], context], ["exit", events[open][1], context], ["enter", text7, context]];
15304
+ const nextEvents = [["enter", strikethrough2, context], ["enter", events[open][1], context], ["exit", events[open][1], context], ["enter", text8, context]];
15246
15305
  const insideSpan2 = context.parser.constructs.insideSpan.null;
15247
15306
  if (insideSpan2) {
15248
15307
  splice(nextEvents, nextEvents.length, 0, resolveAll(insideSpan2, events.slice(open + 1, index2), context));
15249
15308
  }
15250
- splice(nextEvents, nextEvents.length, 0, [["exit", text7, context], ["enter", events[index2][1], context], ["exit", events[index2][1], context], ["exit", strikethrough2, context]]);
15309
+ splice(nextEvents, nextEvents.length, 0, [["exit", text8, context], ["enter", events[index2][1], context], ["exit", events[index2][1], context], ["exit", strikethrough2, context]]);
15251
15310
  splice(events, open - 1, index2 - open + 3, nextEvents);
15252
15311
  index2 = open + nextEvents.length - 2;
15253
15312
  break;
@@ -16288,9 +16347,11 @@ var InfiniteScrollPaginator = (props) => {
16288
16347
  // src/components/ChannelPreview/utils.tsx
16289
16348
  var remarkPlugins = [
16290
16349
  htmlToTextPlugin,
16291
- [remarkGfm, { singleTilde: false }]
16350
+ [remarkGfm, { singleTilde: false }],
16351
+ plusPlusToEmphasis,
16352
+ imageToLink
16292
16353
  ];
16293
- var renderPreviewText = (text7) => /* @__PURE__ */ import_react32.default.createElement(Markdown, { remarkPlugins, skipHtml: true }, text7);
16354
+ var renderPreviewText = (text8) => /* @__PURE__ */ import_react32.default.createElement(Markdown, { remarkPlugins, skipHtml: true }, text8);
16294
16355
  var getLatestPollVote = (latestVotesByOption) => {
16295
16356
  let latestVote;
16296
16357
  for (const optionVotes of Object.values(latestVotesByOption)) {
@@ -16477,6 +16538,9 @@ var ChannelPreview = (props) => {
16477
16538
  const [lastMessage, setLastMessage] = (0, import_react35.useState)(
16478
16539
  channel.state.messages[channel.state.messages.length - 1]
16479
16540
  );
16541
+ const [latestMessagePreview, setLatestMessagePreview] = (0, import_react35.useState)(
16542
+ () => getLatestMessagePreview2(channel, t, userLanguage, isMessageAIGenerated)
16543
+ );
16480
16544
  const [unread, setUnread] = (0, import_react35.useState)(0);
16481
16545
  const { messageDeliveryStatus } = useMessageDeliveryStatus({
16482
16546
  channel,
@@ -16515,12 +16579,18 @@ var ChannelPreview = (props) => {
16515
16579
  );
16516
16580
  (0, import_react35.useEffect)(() => {
16517
16581
  refreshUnreadCount();
16582
+ setLatestMessagePreview(
16583
+ getLatestMessagePreview2(channel, t, userLanguage, isMessageAIGenerated)
16584
+ );
16518
16585
  const handleEvent = (event) => {
16519
16586
  const deletedMessagesInAnotherChannel = event.type === "user.messages.deleted" && event.cid && event.cid !== channel.cid;
16520
16587
  if (deletedMessagesInAnotherChannel) return;
16521
16588
  setLastMessage(
16522
16589
  channel.state.latestMessages[channel.state.latestMessages.length - 1]
16523
16590
  );
16591
+ setLatestMessagePreview(
16592
+ getLatestMessagePreview2(channel, t, userLanguage, isMessageAIGenerated)
16593
+ );
16524
16594
  refreshUnreadCount();
16525
16595
  };
16526
16596
  channel.on("message.new", handleEvent);
@@ -16537,14 +16607,17 @@ var ChannelPreview = (props) => {
16537
16607
  channel.off("message.undeleted", handleEvent);
16538
16608
  channel.off("channel.truncated", handleEvent);
16539
16609
  };
16540
- }, [channel, client, refreshUnreadCount, channelUpdateCount]);
16541
- if (!Preview) return null;
16542
- const latestMessagePreview = getLatestMessagePreview2(
16610
+ }, [
16543
16611
  channel,
16612
+ client,
16613
+ refreshUnreadCount,
16614
+ channelUpdateCount,
16615
+ getLatestMessagePreview2,
16544
16616
  t,
16545
16617
  userLanguage,
16546
16618
  isMessageAIGenerated
16547
- );
16619
+ ]);
16620
+ if (!Preview) return null;
16548
16621
  return /* @__PURE__ */ import_react35.default.createElement(
16549
16622
  Preview,
16550
16623
  {
@@ -16588,7 +16661,10 @@ var useMessageComposer = () => {
16588
16661
  if (editing && cachedEditedMessage) {
16589
16662
  const tag = import_stream_chat2.MessageComposer.constructTag(cachedEditedMessage);
16590
16663
  const cachedComposer = queueCache.get(tag);
16591
- if (cachedComposer) return cachedComposer;
16664
+ if (cachedComposer) {
16665
+ cachedComposer.editedMessage = cachedEditedMessage;
16666
+ return cachedComposer;
16667
+ }
16592
16668
  return new import_stream_chat2.MessageComposer({
16593
16669
  client,
16594
16670
  composition: cachedEditedMessage,