@dxos/plugin-thread 0.6.11-staging.e6894a4 → 0.6.12-main.15a606f

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 (83) hide show
  1. package/dist/lib/browser/{ThreadArticle-O64ZECMF.mjs → ThreadArticle-4VU752F4.mjs} +3 -3
  2. package/dist/lib/browser/{ThreadMain-ZDCRC6RG.mjs → ThreadMain-ML3P4XSD.mjs} +3 -3
  3. package/dist/lib/browser/{chunk-5IBJO53M.mjs → chunk-7NUYW5IW.mjs} +2 -5
  4. package/dist/lib/browser/chunk-7NUYW5IW.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-GKPZHUT3.mjs → chunk-GJRBBPXI.mjs} +2 -2
  6. package/dist/lib/browser/{chunk-GKPZHUT3.mjs.map → chunk-GJRBBPXI.mjs.map} +1 -1
  7. package/dist/lib/browser/{chunk-P7ZE5N5M.mjs → chunk-XF5QKI75.mjs} +13 -11
  8. package/dist/lib/browser/chunk-XF5QKI75.mjs.map +7 -0
  9. package/dist/lib/browser/index.mjs +237 -210
  10. package/dist/lib/browser/index.mjs.map +4 -4
  11. package/dist/lib/browser/meta.json +1 -1
  12. package/dist/lib/browser/meta.mjs +1 -1
  13. package/dist/lib/browser/types.mjs +2 -2
  14. package/dist/lib/node/{ThreadArticle-DO56JXBU.cjs → ThreadArticle-ERUHPHVT.cjs} +7 -7
  15. package/dist/lib/node/{ThreadMain-XJX75GHG.cjs → ThreadMain-6DN7FDNB.cjs} +7 -7
  16. package/dist/lib/node/{chunk-BWBONZGU.cjs → chunk-6EVXCSDS.cjs} +5 -18
  17. package/dist/lib/node/chunk-6EVXCSDS.cjs.map +7 -0
  18. package/dist/lib/node/{chunk-D5GOVXHS.cjs → chunk-FXD3DYMO.cjs} +6 -6
  19. package/dist/lib/node/{chunk-D5GOVXHS.cjs.map → chunk-FXD3DYMO.cjs.map} +1 -1
  20. package/dist/lib/node/{chunk-5PZNPPQF.cjs → chunk-PZVUW4W2.cjs} +65 -63
  21. package/dist/lib/node/chunk-PZVUW4W2.cjs.map +7 -0
  22. package/dist/lib/node/index.cjs +324 -299
  23. package/dist/lib/node/index.cjs.map +4 -4
  24. package/dist/lib/node/meta.cjs +4 -4
  25. package/dist/lib/node/meta.cjs.map +1 -1
  26. package/dist/lib/node/meta.json +1 -1
  27. package/dist/lib/node/types.cjs +3 -3
  28. package/dist/lib/node/types.cjs.map +1 -1
  29. package/dist/lib/node-esm/ThreadArticle-NKI5F4W5.mjs +19 -0
  30. package/dist/lib/node-esm/ThreadArticle-NKI5F4W5.mjs.map +7 -0
  31. package/dist/lib/node-esm/ThreadMain-2A3VQLCW.mjs +27 -0
  32. package/dist/lib/node-esm/ThreadMain-2A3VQLCW.mjs.map +7 -0
  33. package/dist/lib/node-esm/chunk-A44C4MTQ.mjs +413 -0
  34. package/dist/lib/node-esm/chunk-A44C4MTQ.mjs.map +7 -0
  35. package/dist/lib/node-esm/chunk-Y475KZTX.mjs +20 -0
  36. package/dist/lib/node-esm/chunk-Y475KZTX.mjs.map +7 -0
  37. package/dist/lib/node-esm/chunk-YO46JGAE.mjs +21 -0
  38. package/dist/lib/node-esm/chunk-YO46JGAE.mjs.map +7 -0
  39. package/dist/lib/node-esm/index.mjs +1133 -0
  40. package/dist/lib/node-esm/index.mjs.map +7 -0
  41. package/dist/lib/node-esm/meta.json +1 -0
  42. package/dist/lib/node-esm/meta.mjs +12 -0
  43. package/dist/lib/node-esm/meta.mjs.map +7 -0
  44. package/dist/lib/node-esm/types.mjs +9 -0
  45. package/dist/lib/node-esm/types.mjs.map +7 -0
  46. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  47. package/dist/types/src/components/Chat.stories.d.ts +0 -1
  48. package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
  49. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  50. package/dist/types/src/components/CommentContainer.d.ts.map +1 -1
  51. package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
  52. package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
  53. package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
  54. package/dist/types/src/components/ThreadComplementary.d.ts +11 -0
  55. package/dist/types/src/components/ThreadComplementary.d.ts.map +1 -0
  56. package/dist/types/src/components/testing.d.ts +2 -0
  57. package/dist/types/src/components/testing.d.ts.map +1 -1
  58. package/dist/types/src/meta.d.ts +1 -4
  59. package/dist/types/src/meta.d.ts.map +1 -1
  60. package/dist/types/src/types.d.ts +1 -1
  61. package/dist/types/src/types.d.ts.map +1 -1
  62. package/package.json +37 -34
  63. package/src/ThreadPlugin.tsx +70 -190
  64. package/src/components/Chat.stories.tsx +3 -3
  65. package/src/components/ChatContainer.tsx +7 -8
  66. package/src/components/CommentContainer.tsx +10 -7
  67. package/src/components/Comments.stories.tsx +10 -15
  68. package/src/components/CommentsContainer.tsx +22 -18
  69. package/src/components/MessageContainer.tsx +2 -1
  70. package/src/components/ThreadComplementary.tsx +120 -0
  71. package/src/meta.tsx +1 -5
  72. package/src/types.ts +1 -1
  73. package/dist/lib/browser/chunk-5IBJO53M.mjs.map +0 -7
  74. package/dist/lib/browser/chunk-P7ZE5N5M.mjs.map +0 -7
  75. package/dist/lib/node/chunk-5PZNPPQF.cjs.map +0 -7
  76. package/dist/lib/node/chunk-BWBONZGU.cjs.map +0 -7
  77. package/dist/types/src/types.test.d.ts +0 -2
  78. package/dist/types/src/types.test.d.ts.map +0 -1
  79. package/src/types.test.ts +0 -13
  80. /package/dist/lib/browser/{ThreadArticle-O64ZECMF.mjs.map → ThreadArticle-4VU752F4.mjs.map} +0 -0
  81. /package/dist/lib/browser/{ThreadMain-ZDCRC6RG.mjs.map → ThreadMain-ML3P4XSD.mjs.map} +0 -0
  82. /package/dist/lib/node/{ThreadArticle-DO56JXBU.cjs.map → ThreadArticle-ERUHPHVT.cjs.map} +0 -0
  83. /package/dist/lib/node/{ThreadMain-XJX75GHG.cjs.map → ThreadMain-6DN7FDNB.cjs.map} +0 -0
@@ -26,8 +26,8 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  mod
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var chunk_5PZNPPQF_exports = {};
30
- __export(chunk_5PZNPPQF_exports, {
29
+ var chunk_PZVUW4W2_exports = {};
30
+ __export(chunk_PZVUW4W2_exports, {
31
31
  ChatContainer: () => ChatContainer,
32
32
  ChatHeading: () => ChatHeading,
33
33
  MessageContainer: () => MessageContainer,
@@ -37,16 +37,15 @@ __export(chunk_5PZNPPQF_exports, {
37
37
  useOnEditAnalytics: () => useOnEditAnalytics,
38
38
  useStatus: () => useStatus
39
39
  });
40
- module.exports = __toCommonJS(chunk_5PZNPPQF_exports);
41
- var import_chunk_BWBONZGU = require("./chunk-BWBONZGU.cjs");
40
+ module.exports = __toCommonJS(chunk_PZVUW4W2_exports);
41
+ var import_chunk_6EVXCSDS = require("./chunk-6EVXCSDS.cjs");
42
42
  var import_react = require("react");
43
43
  var import_react2 = require("react");
44
44
  var import_app_framework = require("@dxos/app-framework");
45
45
  var import_meta = require("@dxos/plugin-observability/meta");
46
46
  var import_echo = require("@dxos/react-client/echo");
47
47
  var import_react_ui = require("@dxos/react-ui");
48
- var import_react3 = require("@phosphor-icons/react");
49
- var import_react4 = __toESM(require("react"));
48
+ var import_react3 = __toESM(require("react"));
50
49
  var import_echo_schema = require("@dxos/echo-schema");
51
50
  var import_types = require("@dxos/plugin-space/types");
52
51
  var import_echo2 = require("@dxos/react-client/echo");
@@ -58,8 +57,8 @@ var import_react_ui_theme = require("@dxos/react-ui-theme");
58
57
  var import_react_ui_thread = require("@dxos/react-ui-thread");
59
58
  var import_util = require("@dxos/util");
60
59
  var import_view = require("@codemirror/view");
61
- var import_react5 = require("@phosphor-icons/react");
62
- var import_react6 = __toESM(require("react"));
60
+ var import_react4 = require("@phosphor-icons/react");
61
+ var import_react5 = __toESM(require("react"));
63
62
  var import_app_framework2 = require("@dxos/app-framework");
64
63
  var import_react_client = require("@dxos/react-client");
65
64
  var import_halo2 = require("@dxos/react-client/halo");
@@ -180,67 +179,67 @@ var MessageContainer = ({ message, members, onDelete }) => {
180
179
  const senderIdentity = members.find((member) => message.sender.identityKey && import_react_client.PublicKey.equals(member.identity.identityKey, message.sender.identityKey))?.identity;
181
180
  const messageMetadata = getMessageMetadata(message.id, senderIdentity);
182
181
  const userIsAuthor = (0, import_halo2.useIdentity)()?.identityKey.toHex() === messageMetadata.authorId;
183
- const [editing, setEditing] = (0, import_react6.useState)(false);
184
- const handleDelete = (0, import_react6.useCallback)(() => onDelete?.(message.id), [
182
+ const [editing, setEditing] = (0, import_react5.useState)(false);
183
+ const handleDelete = (0, import_react5.useCallback)(() => onDelete?.(message.id), [
185
184
  message,
186
185
  onDelete
187
186
  ]);
188
- const { t } = (0, import_react_ui3.useTranslation)(import_chunk_BWBONZGU.THREAD_PLUGIN);
187
+ const { t } = (0, import_react_ui3.useTranslation)(import_chunk_6EVXCSDS.THREAD_PLUGIN);
189
188
  const editLabel = t(editing ? "save message label" : "edit message label");
190
189
  const deleteLabel = t("delete message label");
191
- return /* @__PURE__ */ import_react6.default.createElement(import_react_ui_thread2.MessageRoot, {
190
+ return /* @__PURE__ */ import_react5.default.createElement(import_react_ui_thread2.MessageRoot, {
192
191
  ...messageMetadata,
193
192
  classNames: [
194
193
  import_react_ui_theme2.hoverableControls,
195
194
  import_react_ui_theme2.hoverableFocusedWithinControls
196
195
  ]
197
- }, /* @__PURE__ */ import_react6.default.createElement(import_react_ui_thread2.MessageHeading, {
196
+ }, /* @__PURE__ */ import_react5.default.createElement(import_react_ui_thread2.MessageHeading, {
198
197
  authorName: messageMetadata.authorName,
199
198
  timestamp: messageMetadata.timestamp
200
- }, /* @__PURE__ */ import_react6.default.createElement(import_react_ui3.ButtonGroup, {
199
+ }, /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.ButtonGroup, {
201
200
  classNames: "mie-1"
202
- }, userIsAuthor && /* @__PURE__ */ import_react6.default.createElement(import_react_ui3.Tooltip.Root, null, /* @__PURE__ */ import_react6.default.createElement(import_react_ui3.Tooltip.Trigger, {
201
+ }, userIsAuthor && /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Tooltip.Root, null, /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Tooltip.Trigger, {
203
202
  asChild: true
204
- }, /* @__PURE__ */ import_react6.default.createElement(import_react_ui3.Button, {
203
+ }, /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Button, {
205
204
  variant: "ghost",
206
205
  "data-testid": editing ? "thread.message.save" : "thread.message.edit",
207
206
  classNames: messageControlClassNames,
208
207
  onClick: () => setEditing((editing2) => !editing2)
209
- }, /* @__PURE__ */ import_react6.default.createElement("span", {
208
+ }, /* @__PURE__ */ import_react5.default.createElement("span", {
210
209
  className: "sr-only"
211
- }, editLabel), editing ? /* @__PURE__ */ import_react6.default.createElement(import_react5.Check, {
210
+ }, editLabel), editing ? /* @__PURE__ */ import_react5.default.createElement(import_react4.Check, {
212
211
  className: (0, import_react_ui_theme2.getSize)(4)
213
- }) : /* @__PURE__ */ import_react6.default.createElement(import_react5.PencilSimple, {
212
+ }) : /* @__PURE__ */ import_react5.default.createElement(import_react4.PencilSimple, {
214
213
  className: (0, import_react_ui_theme2.getSize)(4)
215
- }))), /* @__PURE__ */ import_react6.default.createElement(import_react_ui3.Tooltip.Portal, null, /* @__PURE__ */ import_react6.default.createElement(import_react_ui3.Tooltip.Content, {
214
+ }))), /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Tooltip.Portal, null, /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Tooltip.Content, {
216
215
  classNames: "z-[21]"
217
- }, editLabel, /* @__PURE__ */ import_react6.default.createElement(import_react_ui3.Tooltip.Arrow, null)))), onDelete && /* @__PURE__ */ import_react6.default.createElement(import_react_ui3.Tooltip.Root, null, /* @__PURE__ */ import_react6.default.createElement(import_react_ui3.Tooltip.Trigger, {
216
+ }, editLabel, /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Tooltip.Arrow, null)))), onDelete && /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Tooltip.Root, null, /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Tooltip.Trigger, {
218
217
  asChild: true
219
- }, /* @__PURE__ */ import_react6.default.createElement(import_react_ui3.Button, {
218
+ }, /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Button, {
220
219
  variant: "ghost",
221
220
  "data-testid": "thread.message.delete",
222
221
  classNames: messageControlClassNames,
223
- onClick: handleDelete
224
- }, /* @__PURE__ */ import_react6.default.createElement("span", {
222
+ onClick: () => handleDelete()
223
+ }, /* @__PURE__ */ import_react5.default.createElement("span", {
225
224
  className: "sr-only"
226
- }, deleteLabel), /* @__PURE__ */ import_react6.default.createElement(import_react5.X, {
225
+ }, deleteLabel), /* @__PURE__ */ import_react5.default.createElement(import_react4.X, {
227
226
  className: (0, import_react_ui_theme2.getSize)(4)
228
- }))), /* @__PURE__ */ import_react6.default.createElement(import_react_ui3.Tooltip.Portal, null, /* @__PURE__ */ import_react6.default.createElement(import_react_ui3.Tooltip.Content, {
227
+ }))), /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Tooltip.Portal, null, /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Tooltip.Content, {
229
228
  classNames: "z-[21]"
230
- }, deleteLabel, /* @__PURE__ */ import_react6.default.createElement(import_react_ui3.Tooltip.Arrow, null)))))), /* @__PURE__ */ import_react6.default.createElement(TextboxBlock, {
229
+ }, deleteLabel, /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Tooltip.Arrow, null)))))), /* @__PURE__ */ import_react5.default.createElement(TextboxBlock, {
231
230
  message,
232
231
  isAuthor: userIsAuthor,
233
232
  editing
234
- }), message.parts?.filter(import_util2.nonNullable).map((part, index) => /* @__PURE__ */ import_react6.default.createElement(MessagePart, {
233
+ }), message.parts?.filter(import_util2.nonNullable).map((part, index) => /* @__PURE__ */ import_react5.default.createElement(MessagePart, {
235
234
  key: index,
236
235
  part
237
236
  })));
238
237
  };
239
238
  var MessagePart = ({ part }) => {
240
- return /* @__PURE__ */ import_react6.default.createElement(import_react_ui_mosaic.Mosaic.Container, {
239
+ return /* @__PURE__ */ import_react5.default.createElement(import_react_ui_mosaic.Mosaic.Container, {
241
240
  id: part.id
242
- }, /* @__PURE__ */ import_react6.default.createElement(import_react_ui_mosaic.Mosaic.DraggableTile, {
243
- type: import_chunk_BWBONZGU.THREAD_ITEM,
241
+ }, /* @__PURE__ */ import_react5.default.createElement(import_react_ui_mosaic.Mosaic.DraggableTile, {
242
+ type: import_chunk_6EVXCSDS.THREAD_ITEM,
244
243
  path: part.id,
245
244
  item: part,
246
245
  Component: MessageBlockObjectTile
@@ -248,11 +247,11 @@ var MessagePart = ({ part }) => {
248
247
  };
249
248
  var TextboxBlock = ({ message, isAuthor, editing }) => {
250
249
  const { themeMode } = (0, import_react_ui3.useThemeContext)();
251
- const inMemoryContentRef = (0, import_react6.useRef)(message.text);
252
- const handleDocumentChange = (0, import_react6.useCallback)((newState) => {
250
+ const inMemoryContentRef = (0, import_react5.useRef)(message.text);
251
+ const handleDocumentChange = (0, import_react5.useCallback)((newState) => {
253
252
  inMemoryContentRef.current = newState;
254
253
  }, []);
255
- const saveDocumentChange = (0, import_react6.useCallback)(() => {
254
+ const saveDocumentChange = (0, import_react5.useCallback)(() => {
256
255
  message.text = inMemoryContentRef.current;
257
256
  }, [
258
257
  message
@@ -281,33 +280,33 @@ var TextboxBlock = ({ message, isAuthor, editing }) => {
281
280
  themeMode,
282
281
  handleDocumentChange
283
282
  ]);
284
- (0, import_react6.useEffect)(() => {
283
+ (0, import_react5.useEffect)(() => {
285
284
  editing && view?.focus();
286
285
  }, [
287
286
  editing,
288
287
  view
289
288
  ]);
290
289
  useOnEditAnalytics(message, !!editing);
291
- return /* @__PURE__ */ import_react6.default.createElement("div", {
290
+ return /* @__PURE__ */ import_react5.default.createElement("div", {
292
291
  role: "none",
293
292
  ref: parentRef,
294
293
  className: "mie-4",
295
294
  ...focusAttributes
296
295
  });
297
296
  };
298
- var MessageBlockObjectTile = /* @__PURE__ */ (0, import_react6.forwardRef)(({ draggableStyle, draggableProps, item, active, ...props }, forwardedRef) => {
297
+ var MessageBlockObjectTile = /* @__PURE__ */ (0, import_react5.forwardRef)(({ draggableStyle, draggableProps, item, active, ...props }, forwardedRef) => {
299
298
  let title = item.name ?? item.title ?? item.__typename ?? "Object";
300
299
  if (typeof title !== "string") {
301
300
  title = title?.content ?? "";
302
301
  }
303
- return /* @__PURE__ */ import_react6.default.createElement("div", {
302
+ return /* @__PURE__ */ import_react5.default.createElement("div", {
304
303
  role: "group",
305
304
  className: (0, import_react_ui_theme2.mx)("grid col-span-3 py-1 pr-4", import_react_ui_theme2.hoverableControls, import_react_ui_theme2.hoverableFocusedWithinControls),
306
305
  style: draggableStyle,
307
306
  ref: forwardedRef
308
- }, /* @__PURE__ */ import_react6.default.createElement(import_react_ui3.DensityProvider, {
307
+ }, /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.DensityProvider, {
309
308
  density: "fine"
310
- }, /* @__PURE__ */ import_react6.default.createElement(import_app_framework2.Surface, {
309
+ }, /* @__PURE__ */ import_react5.default.createElement(import_app_framework2.Surface, {
311
310
  role: "card",
312
311
  limit: 1,
313
312
  data: {
@@ -319,13 +318,16 @@ var MessageBlockObjectTile = /* @__PURE__ */ (0, import_react6.forwardRef)(({ dr
319
318
  })));
320
319
  });
321
320
  var ChatHeading = ({ attendableId }) => {
322
- const { t } = (0, import_react_ui2.useTranslation)(import_chunk_BWBONZGU.THREAD_PLUGIN);
323
- return /* @__PURE__ */ import_react4.default.createElement("div", {
321
+ const { t } = (0, import_react_ui2.useTranslation)(import_chunk_6EVXCSDS.THREAD_PLUGIN);
322
+ return /* @__PURE__ */ import_react3.default.createElement("div", {
324
323
  role: "none",
325
324
  className: "flex items-center"
326
- }, /* @__PURE__ */ import_react4.default.createElement(import_react_ui_deck.PlankHeading.Button, {
325
+ }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui_deck.PlankHeading.Button, {
327
326
  attendableId
328
- }, /* @__PURE__ */ import_react4.default.createElement(import_react3.Chat, import_react_ui_deck.plankHeadingIconProps)), /* @__PURE__ */ import_react4.default.createElement(import_react_ui_deck.PlankHeading.Label, {
327
+ }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.Icon, {
328
+ icon: "ph--chat--regular",
329
+ size: 5
330
+ })), /* @__PURE__ */ import_react3.default.createElement(import_react_ui_deck.PlankHeading.Label, {
329
331
  attendableId
330
332
  }, t("chat heading")));
331
333
  };
@@ -333,16 +335,16 @@ var ChatContainer = ({ thread, context, current, autoFocusTextbox }) => {
333
335
  const identity = (0, import_halo.useIdentity)();
334
336
  const space = (0, import_echo2.getSpace)(thread);
335
337
  const members = (0, import_echo2.useMembers)(space?.key);
336
- const activity = useStatus(space, thread.id);
337
- const { t } = (0, import_react_ui2.useTranslation)(import_chunk_BWBONZGU.THREAD_PLUGIN);
338
- const [_count, _setCount] = (0, import_react4.useState)(0);
338
+ const activity = useStatus(space, (0, import_echo2.fullyQualifiedId)(thread));
339
+ const { t } = (0, import_react_ui2.useTranslation)(import_chunk_6EVXCSDS.THREAD_PLUGIN);
340
+ const [_count, _setCount] = (0, import_react3.useState)(0);
339
341
  const rerenderEditor = () => _setCount((count) => count + 1);
340
- const [autoFocus, setAutoFocus] = (0, import_react4.useState)(autoFocusTextbox);
341
- const threadScrollRef = (0, import_react4.useRef)(null);
342
+ const [autoFocus, setAutoFocus] = (0, import_react3.useState)(autoFocusTextbox);
343
+ const threadScrollRef = (0, import_react3.useRef)(null);
342
344
  const { themeMode } = (0, import_react_ui2.useThemeContext)();
343
- const textboxMetadata = getMessageMetadata(thread.id, identity);
344
- const messageRef = (0, import_react4.useRef)("");
345
- const extensions = (0, import_react4.useMemo)(() => [
345
+ const textboxMetadata = getMessageMetadata((0, import_echo2.fullyQualifiedId)(thread), identity);
346
+ const messageRef = (0, import_react3.useRef)("");
347
+ const extensions = (0, import_react3.useMemo)(() => [
346
348
  (0, import_react_ui_editor.createBasicExtensions)({
347
349
  placeholder: t("message placeholder")
348
350
  }),
@@ -361,7 +363,7 @@ var ChatContainer = ({ thread, context, current, autoFocusTextbox }) => {
361
363
  behavior,
362
364
  block: "end"
363
365
  }), 10);
364
- (0, import_react4.useLayoutEffect)(() => {
366
+ (0, import_react3.useLayoutEffect)(() => {
365
367
  scrollToEnd("instant");
366
368
  }, []);
367
369
  const handleCreate = () => {
@@ -388,32 +390,32 @@ var ChatContainer = ({ thread, context, current, autoFocusTextbox }) => {
388
390
  thread.messages.splice(messageIndex, 1);
389
391
  }
390
392
  };
391
- return /* @__PURE__ */ import_react4.default.createElement(import_react_ui_thread.Thread, {
393
+ return /* @__PURE__ */ import_react3.default.createElement(import_react_ui_thread.Thread, {
392
394
  current,
393
- id: thread.id,
395
+ id: (0, import_echo2.fullyQualifiedId)(thread),
394
396
  classNames: "bs-full grid-rows-[1fr_min-content_min-content] overflow-hidden transition-[padding-block-end] [[data-sidebar-inline-start-state=open]_&]:lg:pbe-0"
395
- }, /* @__PURE__ */ import_react4.default.createElement(import_react_ui2.ScrollArea.Root, {
397
+ }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.ScrollArea.Root, {
396
398
  classNames: "col-span-2"
397
- }, /* @__PURE__ */ import_react4.default.createElement(import_react_ui2.ScrollArea.Viewport, {
399
+ }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.ScrollArea.Viewport, {
398
400
  classNames: "overflow-anchored after:overflow-anchor after:block after:bs-px after:-mbs-px [&>div]:min-bs-full [&>div]:!grid [&>div]:grid-rows-[1fr_0]"
399
- }, /* @__PURE__ */ import_react4.default.createElement("div", {
401
+ }, /* @__PURE__ */ import_react3.default.createElement("div", {
400
402
  role: "none",
401
403
  className: (0, import_react_ui_theme.mx)(import_react_ui_thread.threadLayout, "place-self-end")
402
- }, thread.messages.filter(import_util.nonNullable).map((message) => /* @__PURE__ */ import_react4.default.createElement(MessageContainer, {
404
+ }, thread.messages.filter(import_util.nonNullable).map((message) => /* @__PURE__ */ import_react3.default.createElement(MessageContainer, {
403
405
  key: message.id,
404
406
  message,
405
407
  members,
406
408
  onDelete: handleDelete
407
- }))), /* @__PURE__ */ import_react4.default.createElement("div", {
409
+ }))), /* @__PURE__ */ import_react3.default.createElement("div", {
408
410
  role: "none",
409
411
  className: "bs-px -mbs-px",
410
412
  ref: threadScrollRef
411
- }), /* @__PURE__ */ import_react4.default.createElement(import_react_ui2.ScrollArea.Scrollbar, null, /* @__PURE__ */ import_react4.default.createElement(import_react_ui2.ScrollArea.Thumb, null)))), /* @__PURE__ */ import_react4.default.createElement(import_react_ui_thread.MessageTextbox, {
413
+ }), /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.ScrollArea.Scrollbar, null, /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.ScrollArea.Thumb, null)))), /* @__PURE__ */ import_react3.default.createElement(import_react_ui_thread.MessageTextbox, {
412
414
  extensions,
413
415
  autoFocus,
414
416
  onSend: handleCreate,
415
417
  ...textboxMetadata
416
- }), /* @__PURE__ */ import_react4.default.createElement(import_react_ui_thread.ThreadFooter, {
418
+ }), /* @__PURE__ */ import_react3.default.createElement(import_react_ui_thread.ThreadFooter, {
417
419
  activity
418
420
  }, t("activity message")));
419
421
  };
@@ -428,4 +430,4 @@ var ChatContainer = ({ thread, context, current, autoFocusTextbox }) => {
428
430
  useOnEditAnalytics,
429
431
  useStatus
430
432
  });
431
- //# sourceMappingURL=chunk-5PZNPPQF.cjs.map
433
+ //# sourceMappingURL=chunk-PZVUW4W2.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/hooks/useStatus.ts", "../../../src/hooks/analytics.ts", "../../../src/components/ChatContainer.tsx", "../../../src/components/MessageContainer.tsx", "../../../src/components/command-extension.ts", "../../../src/util.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\nimport { type Space } from '@dxos/react-client/echo';\n\n// TODO(burdon): Generalize and factor out.\nexport const useStatus = (space?: Space, channel?: string) => {\n const [processing, setProcessing] = useState(false);\n useEffect(() => {\n if (!space || !channel) {\n return;\n }\n\n const unsubscribe = space.listen(`status/${channel}`, (status) => {\n const { event } = status.payload ?? {};\n setProcessing(event === 'processing');\n });\n\n const t = setInterval(() => {\n setProcessing((prev: any) => {\n if (typeof prev?.ts === 'number' && Date.now() - prev.ts > 30_000) {\n return undefined;\n } else {\n return prev;\n }\n });\n }, 1_000);\n\n return () => {\n unsubscribe();\n clearInterval(t);\n };\n }, [space, channel]);\n\n return processing;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useCallback } from 'react';\n\nimport { useIntentDispatcher } from '@dxos/app-framework';\nimport { type ReactiveObject } from '@dxos/echo-schema';\nimport { ObservabilityAction } from '@dxos/plugin-observability/meta';\nimport { getSpace } from '@dxos/react-client/echo';\nimport { useOnTransition } from '@dxos/react-ui';\n\nexport const useAnalyticsCallback = (spaceId: string | undefined, name: string, meta?: any) => {\n const dispatch = useIntentDispatcher();\n\n return useCallback(\n (dynamicMeta?: any) => {\n void dispatch({\n action: ObservabilityAction.SEND_EVENT,\n data: {\n name,\n properties: { ...meta, ...dynamicMeta, spaceId },\n },\n });\n },\n [dispatch, name, meta, spaceId],\n );\n};\n\nexport const useOnEditAnalytics = (message: ReactiveObject<any>, editing: boolean) => {\n const space = getSpace(message);\n\n const onEditAnalytics = useAnalyticsCallback(space?.id, 'threads.comment-edited', {\n messageId: message.id,\n messageLength: message.text.length,\n });\n\n useOnTransition(editing, true, false, onEditAnalytics);\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useLayoutEffect, useMemo, useRef, useState } from 'react';\n\nimport { create } from '@dxos/echo-schema';\nimport { MessageType } from '@dxos/plugin-space/types';\nimport { fullyQualifiedId, getSpace, useMembers } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { Icon, ScrollArea, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { PlankHeading } from '@dxos/react-ui-deck';\nimport { createBasicExtensions, createThemeExtensions, listener } from '@dxos/react-ui-editor';\nimport { mx } from '@dxos/react-ui-theme';\nimport { MessageTextbox, type MessageTextboxProps, Thread, ThreadFooter, threadLayout } from '@dxos/react-ui-thread';\nimport { nonNullable } from '@dxos/util';\n\nimport { MessageContainer } from './MessageContainer';\nimport { command } from './command-extension';\nimport { type ThreadContainerProps } from './types';\nimport { useStatus } from '../hooks';\nimport { THREAD_PLUGIN } from '../meta';\nimport { getMessageMetadata } from '../util';\n\nexport const ChatHeading = ({ attendableId }: { attendableId?: string }) => {\n const { t } = useTranslation(THREAD_PLUGIN);\n return (\n <div role='none' className='flex items-center'>\n <PlankHeading.Button attendableId={attendableId}>\n <Icon icon='ph--chat--regular' size={5} />\n </PlankHeading.Button>\n <PlankHeading.Label attendableId={attendableId}>{t('chat heading')}</PlankHeading.Label>\n </div>\n );\n};\n\nexport const ChatContainer = ({ thread, context, current, autoFocusTextbox }: ThreadContainerProps) => {\n const identity = useIdentity()!;\n const space = getSpace(thread);\n const members = useMembers(space?.key);\n const activity = useStatus(space, fullyQualifiedId(thread));\n const { t } = useTranslation(THREAD_PLUGIN);\n // TODO(wittjosiah): This is a hack to reset the editor after a message is sent.\n const [_count, _setCount] = useState(0);\n const rerenderEditor = () => _setCount((count) => count + 1);\n const [autoFocus, setAutoFocus] = useState(autoFocusTextbox);\n const threadScrollRef = useRef<HTMLDivElement | null>(null);\n const { themeMode } = useThemeContext();\n\n const textboxMetadata = getMessageMetadata(fullyQualifiedId(thread), identity);\n const messageRef = useRef('');\n const extensions = useMemo(\n () => [\n createBasicExtensions({ placeholder: t('message placeholder') }),\n createThemeExtensions({ themeMode }),\n listener({ onChange: (text) => (messageRef.current = text) }),\n command,\n ],\n [themeMode, _count],\n );\n\n // TODO(thure): Factor out.\n // TODO(thure): `flex-col-reverse` does not work to start the container scrolled to the end while also using\n // `ScrollArea`. This is the least-bad way I found to scroll to the end on mount. Note that 0ms was insufficient\n // for the desired effect; this is likely hardware-dependent and should be reevaluated.\n const scrollToEnd = (behavior: ScrollBehavior) =>\n setTimeout(() => threadScrollRef.current?.scrollIntoView({ behavior, block: 'end' }), 10);\n\n useLayoutEffect(() => {\n scrollToEnd('instant');\n }, []);\n\n // TODO(burdon): Change to model.\n const handleCreate: MessageTextboxProps['onSend'] = () => {\n if (!messageRef.current?.length) {\n return false;\n }\n\n thread.messages.push(\n create(MessageType, {\n sender: { identityKey: identity.identityKey.toHex() },\n timestamp: new Date().toISOString(),\n text: messageRef.current,\n context,\n }),\n );\n\n messageRef.current = '';\n setAutoFocus(true);\n scrollToEnd('smooth');\n rerenderEditor();\n return true;\n };\n\n const handleDelete = (id: string) => {\n const messageIndex = thread.messages.filter(nonNullable).findIndex((message) => message.id === id);\n if (messageIndex !== -1) {\n thread.messages.splice(messageIndex, 1);\n }\n };\n\n return (\n <Thread\n current={current}\n id={fullyQualifiedId(thread)}\n classNames='bs-full grid-rows-[1fr_min-content_min-content] overflow-hidden transition-[padding-block-end] [[data-sidebar-inline-start-state=open]_&]:lg:pbe-0'\n >\n <ScrollArea.Root classNames='col-span-2'>\n <ScrollArea.Viewport classNames='overflow-anchored after:overflow-anchor after:block after:bs-px after:-mbs-px [&>div]:min-bs-full [&>div]:!grid [&>div]:grid-rows-[1fr_0]'>\n <div role='none' className={mx(threadLayout, 'place-self-end')}>\n {thread.messages.filter(nonNullable).map((message) => (\n <MessageContainer key={message.id} message={message} members={members} onDelete={handleDelete} />\n ))}\n </div>\n {/* NOTE(thure): This can’t also be the `overflow-anchor` because `ScrollArea` injects an interceding node that contains this necessary ref’d element. */}\n <div role='none' className='bs-px -mbs-px' ref={threadScrollRef} />\n <ScrollArea.Scrollbar>\n <ScrollArea.Thumb />\n </ScrollArea.Scrollbar>\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n <MessageTextbox extensions={extensions} autoFocus={autoFocus} onSend={handleCreate} {...textboxMetadata} />\n <ThreadFooter activity={activity}>{t('activity message')}</ThreadFooter>\n </Thread>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { EditorView } from '@codemirror/view';\nimport { Check, PencilSimple, X } from '@phosphor-icons/react';\nimport React, { forwardRef, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { Surface } from '@dxos/app-framework';\nimport { type Expando, type EchoReactiveObject } from '@dxos/echo-schema';\nimport { type MessageType } from '@dxos/plugin-space/types';\nimport { PublicKey } from '@dxos/react-client';\nimport { type SpaceMember } from '@dxos/react-client/echo';\nimport { useIdentity, type Identity } from '@dxos/react-client/halo';\nimport {\n Button,\n ButtonGroup,\n DensityProvider,\n Tooltip,\n useOnTransition,\n useThemeContext,\n useTranslation,\n} from '@dxos/react-ui';\nimport { createBasicExtensions, createThemeExtensions, useTextEditor } from '@dxos/react-ui-editor';\nimport { Mosaic, type MosaicTileComponent } from '@dxos/react-ui-mosaic';\nimport {\n getSize,\n hoverableControlItem,\n hoverableControls,\n hoverableFocusedWithinControls,\n mx,\n} from '@dxos/react-ui-theme';\nimport { MessageHeading, MessageRoot } from '@dxos/react-ui-thread';\nimport { nonNullable } from '@dxos/util';\n\nimport { command } from './command-extension';\nimport { useOnEditAnalytics } from '../hooks';\nimport { THREAD_ITEM, THREAD_PLUGIN } from '../meta';\nimport { getMessageMetadata } from '../util';\n\nconst messageControlClassNames = ['p-1 min-bs-0 transition-opacity items-start', hoverableControlItem];\n\nexport const MessageContainer = ({\n message,\n members,\n onDelete,\n}: {\n message: MessageType;\n members: SpaceMember[];\n onDelete?: (id: string) => void;\n}) => {\n const senderIdentity = members.find(\n (member) => message.sender.identityKey && PublicKey.equals(member.identity.identityKey, message.sender.identityKey),\n )?.identity;\n const messageMetadata = getMessageMetadata(message.id, senderIdentity);\n const userIsAuthor = useIdentity()?.identityKey.toHex() === messageMetadata.authorId;\n const [editing, setEditing] = useState(false);\n const handleDelete = useCallback(() => onDelete?.(message.id), [message, onDelete]);\n const { t } = useTranslation(THREAD_PLUGIN);\n const editLabel = t(editing ? 'save message label' : 'edit message label');\n const deleteLabel = t('delete message label');\n\n return (\n <MessageRoot {...messageMetadata} classNames={[hoverableControls, hoverableFocusedWithinControls]}>\n <MessageHeading authorName={messageMetadata.authorName} timestamp={messageMetadata.timestamp}>\n <ButtonGroup classNames='mie-1'>\n {userIsAuthor && (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <Button\n variant='ghost'\n data-testid={editing ? 'thread.message.save' : 'thread.message.edit'}\n classNames={messageControlClassNames}\n onClick={() => setEditing((editing) => !editing)}\n >\n <span className='sr-only'>{editLabel}</span>\n {editing ? <Check className={getSize(4)} /> : <PencilSimple className={getSize(4)} />}\n </Button>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content classNames='z-[21]'>\n {editLabel}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n )}\n {onDelete && (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <Button\n variant='ghost'\n data-testid='thread.message.delete'\n classNames={messageControlClassNames}\n onClick={() => handleDelete()}\n >\n <span className='sr-only'>{deleteLabel}</span>\n <X className={getSize(4)} />\n </Button>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content classNames='z-[21]'>\n {deleteLabel}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n )}\n </ButtonGroup>\n </MessageHeading>\n <TextboxBlock message={message} isAuthor={userIsAuthor} editing={editing} />\n {message.parts?.filter(nonNullable).map((part, index) => <MessagePart key={index} part={part} />)}\n </MessageRoot>\n );\n};\n\nconst MessagePart = ({ part }: { part: Expando }) => {\n return (\n <Mosaic.Container id={part.id}>\n <Mosaic.DraggableTile type={THREAD_ITEM} path={part.id} item={part} Component={MessageBlockObjectTile} />\n </Mosaic.Container>\n );\n};\n\nconst TextboxBlock = ({\n message,\n isAuthor,\n editing,\n}: {\n message: MessageType;\n editing?: boolean;\n isAuthor?: boolean;\n identity?: Identity;\n}) => {\n const { themeMode } = useThemeContext();\n const inMemoryContentRef = useRef(message.text);\n\n const handleDocumentChange = useCallback((newState: string) => {\n inMemoryContentRef.current = newState;\n }, []);\n\n const saveDocumentChange = useCallback(() => {\n message.text = inMemoryContentRef.current;\n }, [message]);\n\n useOnTransition(editing, true, false, saveDocumentChange);\n\n const { parentRef, focusAttributes, view } = useTextEditor(\n () => ({\n initialValue: message.text,\n extensions: [\n createBasicExtensions({ readonly: !isAuthor || !editing }),\n createThemeExtensions({ themeMode }),\n command,\n EditorView.updateListener.of((update) => {\n if (update.docChanged) {\n handleDocumentChange(update.state.doc.toString());\n }\n }),\n ],\n }),\n [message.text, editing, isAuthor, themeMode, handleDocumentChange],\n );\n\n useEffect(() => {\n editing && view?.focus();\n }, [editing, view]);\n\n useOnEditAnalytics(message, !!editing);\n\n return <div role='none' ref={parentRef} className='mie-4' {...focusAttributes} />;\n};\n\nconst MessageBlockObjectTile: MosaicTileComponent<EchoReactiveObject<any>> = forwardRef(\n ({ draggableStyle, draggableProps, item, active, ...props }, forwardedRef) => {\n let title = item.name ?? item.title ?? item.__typename ?? 'Object';\n if (typeof title !== 'string') {\n title = title?.content ?? '';\n }\n\n return (\n <div\n role='group'\n className={mx('grid col-span-3 py-1 pr-4', hoverableControls, hoverableFocusedWithinControls)}\n style={draggableStyle}\n ref={forwardedRef}\n >\n <DensityProvider density='fine'>\n <Surface\n role='card'\n limit={1}\n data={{ content: item }}\n draggableProps={draggableProps}\n fallback={title}\n {...props}\n />\n </DensityProvider>\n </div>\n );\n },\n);\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { StreamLanguage, HighlightStyle, syntaxHighlighting } from '@codemirror/language';\nimport { type Extension } from '@codemirror/state';\n\nimport { tags } from '@dxos/react-ui-editor';\nimport { mx, tagRoot } from '@dxos/react-ui-theme';\n\n/**\n * https://github.com/codemirror/stream-parser/blob/main/test/test-stream-parser.ts\n */\nconst parser = StreamLanguage.define<{ count: number }>({\n startState: () => ({ count: 0 }),\n token: (stream, state) => {\n state.count++;\n if (stream.eatSpace()) {\n return null;\n }\n if (state.count === 1 && stream.match(/^(\\/\\w+)/)) {\n return 'tagName';\n }\n stream.next();\n return null;\n },\n});\n\nconst styles = HighlightStyle.define([\n {\n tag: tags.tagName,\n class: mx(tagRoot({ palette: 'cyan' }), 'text-baseText font-medium'),\n },\n]);\n\nexport const command: Extension = [parser, syntaxHighlighting(styles)];\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { generateName } from '@dxos/display-name';\nimport { type PublicKey } from '@dxos/react-client';\nimport { type Identity } from '@dxos/react-client/halo';\nimport { type MessageMetadata } from '@dxos/react-ui-thread';\nimport { hexToFallback } from '@dxos/util';\n\nexport type MessagePropertiesProvider = (identityKey: PublicKey | undefined) => MessageMetadata;\n\nexport const getMessageMetadata = (id: string, identity?: Identity): MessageMetadata => {\n const fallback = hexToFallback(identity?.identityKey.toHex() ?? '0');\n return {\n id,\n authorId: identity?.identityKey.toHex(),\n authorName:\n identity?.profile?.displayName ??\n (identity?.identityKey ? generateName(identity.identityKey.toHex()) : undefined),\n authorAvatarProps: {\n hue: identity?.profile?.data?.hue ?? fallback.hue,\n emoji: identity?.profile?.data?.emoji ?? fallback.emoji,\n },\n };\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["import_react", "import_echo", "import_react_ui", "import_app_framework", "import_halo", "import_react_ui_editor", "import_react_ui_theme", "import_react_ui_thread", "import_util", "useStatus", "space", "channel", "processing", "setProcessing", "useState", "useEffect", "unsubscribe", "listen", "status", "event", "payload", "t", "setInterval", "prev", "ts", "Date", "now", "undefined", "clearInterval", "useAnalyticsCallback", "spaceId", "name", "meta", "dispatch", "useIntentDispatcher", "useCallback", "dynamicMeta", "action", "ObservabilityAction", "SEND_EVENT", "data", "properties", "useOnEditAnalytics", "message", "editing", "getSpace", "onEditAnalytics", "id", "messageId", "messageLength", "text", "length", "useOnTransition", "parser", "StreamLanguage", "define", "startState", "count", "token", "stream", "state", "eatSpace", "match", "next", "styles", "HighlightStyle", "tag", "tags", "tagName", "class", "mx", "tagRoot", "palette", "command", "syntaxHighlighting", "getMessageMetadata", "identity", "fallback", "hexToFallback", "identityKey", "toHex", "authorId", "authorName", "profile", "displayName", "generateName", "authorAvatarProps", "hue", "emoji", "messageControlClassNames", "hoverableControlItem", "MessageContainer", "members", "onDelete", "senderIdentity", "find", "member", "sender", "PublicKey", "equals", "messageMetadata", "userIsAuthor", "useIdentity", "setEditing", "handleDelete", "useTranslation", "THREAD_PLUGIN", "editLabel", "deleteLabel", "React", "MessageRoot", "classNames", "hoverableControls", "hoverableFocusedWithinControls", "MessageHeading", "timestamp", "ButtonGroup", "Tooltip", "Root", "Trigger", "asChild", "Button", "variant", "data-testid", "onClick", "span", "className", "Check", "getSize", "PencilSimple", "Portal", "Content", "Arrow", "X", "TextboxBlock", "isAuthor", "parts", "filter", "nonNullable", "map", "part", "index", "MessagePart", "key", "Mosaic", "Container", "DraggableTile", "type", "THREAD_ITEM", "path", "item", "Component", "MessageBlockObjectTile", "themeMode", "useThemeContext", "inMemoryContentRef", "useRef", "handleDocumentChange", "newState", "current", "saveDocumentChange", "parentRef", "focusAttributes", "view", "useTextEditor", "initialValue", "extensions", "createBasicExtensions", "readonly", "createThemeExtensions", "EditorView", "updateListener", "of", "update", "docChanged", "doc", "toString", "focus", "div", "role", "ref", "forwardRef", "draggableStyle", "draggableProps", "active", "props", "forwardedRef", "title", "__typename", "content", "style", "DensityProvider", "density", "Surface", "limit", "ChatHeading", "attendableId", "PlankHeading", "Icon", "icon", "size", "Label", "ChatContainer", "thread", "context", "autoFocusTextbox", "useMembers", "activity", "fullyQualifiedId", "_count", "_setCount", "rerenderEditor", "autoFocus", "setAutoFocus", "threadScrollRef", "textboxMetadata", "messageRef", "useMemo", "placeholder", "listener", "onChange", "scrollToEnd", "behavior", "setTimeout", "scrollIntoView", "block", "useLayoutEffect", "handleCreate", "messages", "push", "create", "MessageType", "toISOString", "messageIndex", "findIndex", "splice", "Thread", "ScrollArea", "Viewport", "threadLayout", "Scrollbar", "Thumb", "MessageTextbox", "onSend", "ThreadFooter"]
7
+ }