@dxos/plugin-thread 0.6.12-main.78ddbdf → 0.6.12-main.7907542

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.
@@ -54,7 +54,7 @@ var ThreadSettings = ({ settings }) => {
54
54
 
55
55
  // packages/plugins/plugin-thread/src/components/CommentContainer.tsx
56
56
  import { CheckCircle, X } from "@phosphor-icons/react";
57
- import React2, { useCallback, useEffect, useMemo, useRef, useState } from "react";
57
+ import React2, { useCallback, useMemo, useRef, useState } from "react";
58
58
  import { create } from "@dxos/echo-schema";
59
59
  import { MessageType } from "@dxos/plugin-space/types";
60
60
  import { fullyQualifiedId, getSpace, useMembers } from "@dxos/react-client/echo";
@@ -110,14 +110,13 @@ var DeleteThreadButton = ({ onDelete }) => {
110
110
  classNames: "z-[21]"
111
111
  }, label, /* @__PURE__ */ React2.createElement(Tooltip.Arrow, null))));
112
112
  };
113
- var CommentContainer = ({ thread, detached, context, current, autoFocusTextbox, onAttend, onThreadDelete, onMessageDelete, onResolve, onComment }) => {
113
+ var CommentContainer = ({ thread, detached, context, current, onAttend, onThreadDelete, onMessageDelete, onResolve, onComment }) => {
114
114
  const identity = useIdentity();
115
115
  const space = getSpace(thread);
116
116
  const members = useMembers(space?.key);
117
117
  const activity = useStatus(space, fullyQualifiedId(thread));
118
118
  const { t } = useTranslation2(THREAD_PLUGIN);
119
119
  const threadScrollRef = useRef(null);
120
- const [autoFocus, setAutoFocus] = useState(!!autoFocusTextbox);
121
120
  const { themeMode } = useThemeContext();
122
121
  const textboxMetadata = getMessageMetadata(fullyQualifiedId(thread), identity);
123
122
  const [_count, _setCount] = useState(0);
@@ -137,11 +136,6 @@ var CommentContainer = ({ thread, detached, context, current, autoFocusTextbox,
137
136
  ], [
138
137
  _count
139
138
  ]);
140
- useEffect(() => {
141
- setAutoFocus(!!autoFocusTextbox);
142
- }, [
143
- autoFocusTextbox
144
- ]);
145
139
  const scrollToEnd = (behavior) => setTimeout(() => threadScrollRef.current?.scrollIntoView({
146
140
  behavior,
147
141
  block: "end"
@@ -160,7 +154,6 @@ var CommentContainer = ({ thread, detached, context, current, autoFocusTextbox,
160
154
  }));
161
155
  onComment?.(thread);
162
156
  messageRef.current = "";
163
- setAutoFocus(true);
164
157
  scrollToEnd("instant");
165
158
  rerenderEditor();
166
159
  return true;
@@ -199,7 +192,6 @@ var CommentContainer = ({ thread, detached, context, current, autoFocusTextbox,
199
192
  onDelete: (id) => onMessageDelete?.(id)
200
193
  })), /* @__PURE__ */ React2.createElement(MessageTextbox, {
201
194
  extensions,
202
- autoFocus,
203
195
  onSend: handleCreate,
204
196
  ...textboxMetadata
205
197
  }), /* @__PURE__ */ React2.createElement(ThreadFooter, {
@@ -213,29 +205,14 @@ var CommentContainer = ({ thread, detached, context, current, autoFocusTextbox,
213
205
 
214
206
  // packages/plugins/plugin-thread/src/components/CommentsContainer.tsx
215
207
  import { ChatText } from "@phosphor-icons/react";
216
- import React3, { useEffect as useEffect2 } from "react";
208
+ import React3, { useEffect } from "react";
217
209
  import { fullyQualifiedId as fullyQualifiedId2 } from "@dxos/react-client/echo";
218
- import { useTranslation as useTranslation3, Icon, Trans } from "@dxos/react-ui";
219
- import { PlankHeading } from "@dxos/react-ui-deck";
210
+ import { useTranslation as useTranslation3, Trans } from "@dxos/react-ui";
220
211
  import { descriptionText, mx as mx2 } from "@dxos/react-ui-theme";
221
- var CommentsHeading = ({ attendableId }) => {
222
- const { t } = useTranslation3(THREAD_PLUGIN);
223
- return /* @__PURE__ */ React3.createElement("div", {
224
- role: "none",
225
- className: "flex items-center"
226
- }, /* @__PURE__ */ React3.createElement(PlankHeading.Button, {
227
- attendableId
228
- }, /* @__PURE__ */ React3.createElement(Icon, {
229
- icon: "ph--quotes--regular",
230
- size: 5
231
- })), /* @__PURE__ */ React3.createElement(PlankHeading.Label, {
232
- attendableId
233
- }, t("comments heading")));
234
- };
235
- var CommentsContainer = ({ threads, detached = [], currentId, autoFocusCurrentTextbox, showResolvedThreads, onThreadAttend, onThreadDelete, onMessageDelete, onThreadToggleResolved, ...props }) => {
212
+ var CommentsContainer = ({ threads, detached = [], currentId, showResolvedThreads, onThreadAttend, onThreadDelete, onMessageDelete, onThreadToggleResolved, ...props }) => {
236
213
  const { t } = useTranslation3(THREAD_PLUGIN);
237
214
  const filteredThreads = showResolvedThreads ? threads : threads.filter((thread) => !(thread?.status === "resolved"));
238
- useEffect2(() => {
215
+ useEffect(() => {
239
216
  if (currentId) {
240
217
  document.getElementById(currentId)?.scrollIntoView({
241
218
  behavior: "smooth",
@@ -252,7 +229,6 @@ var CommentsContainer = ({ threads, detached = [], currentId, autoFocusCurrentTe
252
229
  thread,
253
230
  current: currentId === threadId,
254
231
  detached: detached.includes(threadId),
255
- autoFocusTextbox: autoFocusCurrentTextbox && currentId === threadId,
256
232
  ...onThreadAttend && {
257
233
  onAttend: () => onThreadAttend(thread)
258
234
  },
@@ -288,14 +264,14 @@ var ThreadMain = React4.lazy(() => import("./ThreadMain-ML3P4XSD.mjs"));
288
264
  var ThreadArticle = React4.lazy(() => import("./ThreadArticle-4VU752F4.mjs"));
289
265
 
290
266
  // packages/plugins/plugin-thread/src/components/ThreadComplementary.tsx
291
- import React5, { useEffect as useEffect3, useMemo as useMemo2 } from "react";
267
+ import React5, { useEffect as useEffect2, useMemo as useMemo2 } from "react";
292
268
  import { LayoutAction, useIntentDispatcher, useResolvePlugins } from "@dxos/app-framework";
293
269
  import { fullyQualifiedId as fullyQualifiedId3 } from "@dxos/react-client/echo";
294
270
  import { ScrollArea } from "@dxos/react-ui";
295
- import { createAttendableAttributes, useAttentionContext } from "@dxos/react-ui-attention";
271
+ import { useAttended } from "@dxos/react-ui-attention";
296
272
  import { nonNullable as nonNullable2 } from "@dxos/util";
297
273
  var providesThreadsConfig = (plugin) => "thread" in plugin.provides ? plugin : void 0;
298
- var ThreadComplementary = ({ role, subject, stagedThreads, current, focus, showResolvedThreads }) => {
274
+ var ThreadComplementary = ({ role, subject, stagedThreads, current, showResolvedThreads }) => {
299
275
  const dispatch = useIntentDispatcher();
300
276
  const threadsIntegrators = useResolvePlugins(providesThreadsConfig);
301
277
  const threadProvides = useMemo2(() => threadsIntegrators.map((p) => p.provides.thread), [
@@ -320,7 +296,7 @@ var ThreadComplementary = ({ role, subject, stagedThreads, current, focus, showR
320
296
  }, [
321
297
  threads
322
298
  ]);
323
- useEffect3(() => {
299
+ useEffect2(() => {
324
300
  if (!sort) {
325
301
  return;
326
302
  }
@@ -329,22 +305,17 @@ var ThreadComplementary = ({ role, subject, stagedThreads, current, focus, showR
329
305
  sort,
330
306
  threads
331
307
  ]);
332
- const { attended } = useAttentionContext("Thread Complementary");
308
+ const attended = useAttended();
333
309
  const qualifiedSubjectId = fullyQualifiedId3(subject);
334
- const attendableAttrs = createAttendableAttributes(qualifiedSubjectId);
335
310
  return /* @__PURE__ */ React5.createElement("div", {
336
311
  role: "none",
337
- className: "contents group/attention",
338
- ...attendableAttrs
339
- }, role === "complementary" && /* @__PURE__ */ React5.createElement(CommentsHeading, {
340
- attendableId: qualifiedSubjectId
341
- }), /* @__PURE__ */ React5.createElement(ScrollArea.Root, {
312
+ className: "contents"
313
+ }, /* @__PURE__ */ React5.createElement(ScrollArea.Root, {
342
314
  classNames: "row-span-2"
343
315
  }, /* @__PURE__ */ React5.createElement(ScrollArea.Viewport, null, /* @__PURE__ */ React5.createElement(CommentsContainer, {
344
316
  threads,
345
317
  detached: detachedIds,
346
- currentId: attended.has(qualifiedSubjectId) ? current : void 0,
347
- autoFocusCurrentTextbox: focus,
318
+ currentId: attended.includes(qualifiedSubjectId) ? current : void 0,
348
319
  showResolvedThreads,
349
320
  onThreadAttend: (thread) => {
350
321
  const threadId = fullyQualifiedId3(thread);
@@ -570,11 +541,12 @@ var ThreadPlugin = () => {
570
541
  return {
571
542
  id,
572
543
  type: "orphan-comments-for-subject",
573
- data: object,
544
+ data: null,
574
545
  properties: {
575
- icon: meta.icon,
546
+ icon: "ph--chat-text--regular",
576
547
  label,
577
- showResolvedThreads: viewState.showResolvedThreads
548
+ showResolvedThreads: viewState.showResolvedThreads,
549
+ object
578
550
  }
579
551
  };
580
552
  },
@@ -717,7 +689,6 @@ var ThreadPlugin = () => {
717
689
  subject: data.subject,
718
690
  stagedThreads: state.staging[fullyQualifiedId4(data.subject)],
719
691
  current: state.current,
720
- focus: true,
721
692
  showResolvedThreads
722
693
  });
723
694
  }
@@ -738,7 +709,7 @@ var ThreadPlugin = () => {
738
709
  } catch (e) {
739
710
  log.error("Subject does not support threads array", subject?.typename, {
740
711
  F: __dxlog_file,
741
- L: 332,
712
+ L: 331,
742
713
  S: void 0,
743
714
  C: (f, a) => f(...a)
744
715
  });
@@ -767,8 +738,7 @@ var ThreadPlugin = () => {
767
738
  {
768
739
  action: ThreadAction.SELECT,
769
740
  data: {
770
- current: fullyQualifiedId4(thread),
771
- focus: true
741
+ current: fullyQualifiedId4(thread)
772
742
  }
773
743
  },
774
744
  {
@@ -795,7 +765,6 @@ var ThreadPlugin = () => {
795
765
  }
796
766
  }
797
767
  case ThreadAction.SELECT: {
798
- state.focus = intent.data?.current === state.current ? state.focus : intent.data?.focus;
799
768
  state.current = intent.data?.current;
800
769
  return {
801
770
  data: true
@@ -1055,12 +1024,12 @@ var ThreadPlugin = () => {
1055
1024
  });
1056
1025
  }
1057
1026
  }),
1058
- createExternalCommentSync(doc.id, (sink) => effect(() => sink()), () => threads.value.filter((thread) => thread?.anchor).map((thread) => ({
1027
+ createExternalCommentSync(fullyQualifiedId4(doc), (sink) => effect(() => sink()), () => threads.value.filter((thread) => thread?.anchor).map((thread) => ({
1059
1028
  id: fullyQualifiedId4(thread),
1060
1029
  cursor: thread.anchor
1061
1030
  }))),
1062
1031
  comments({
1063
- id: doc.id,
1032
+ id: fullyQualifiedId4(doc),
1064
1033
  onCreate: ({ cursor }) => {
1065
1034
  const [start, end] = cursor.split(":");
1066
1035
  const name = doc.content && getTextInRange(createDocAccessor(doc.content, [
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/ThreadPlugin.tsx", "../../../src/components/index.ts", "../../../src/components/ThreadSettings.tsx", "../../../src/components/CommentContainer.tsx", "../../../src/components/CommentsContainer.tsx", "../../../src/components/ThreadComplementary.tsx", "../../../src/translations.ts", "../../../src/index.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { computed, effect } from '@preact/signals-core';\nimport React from 'react';\n\nimport {\n type IntentPluginProvides,\n LayoutAction,\n NavigationAction,\n type LocationProvides,\n type Plugin,\n type PluginDefinition,\n parseIntentPlugin,\n parseNavigationPlugin,\n resolvePlugin,\n isLayoutParts,\n parseMetadataResolverPlugin,\n} from '@dxos/app-framework';\nimport { type UnsubscribeCallback } from '@dxos/async';\nimport { type EchoReactiveObject, getTypename } from '@dxos/echo-schema';\nimport { create } from '@dxos/echo-schema';\nimport { LocalStorageStore } from '@dxos/local-storage';\nimport { log } from '@dxos/log';\nimport { parseClientPlugin } from '@dxos/plugin-client';\nimport { type ActionGroup, createExtension, isActionGroup, toSignal } from '@dxos/plugin-graph';\nimport { ObservabilityAction } from '@dxos/plugin-observability/meta';\nimport { SpaceAction } from '@dxos/plugin-space';\nimport { ThreadType, MessageType, ChannelType } from '@dxos/plugin-space/types';\nimport {\n getSpace,\n getTextInRange,\n createDocAccessor,\n fullyQualifiedId,\n loadObjectReferences,\n} from '@dxos/react-client/echo';\nimport { comments, createExternalCommentSync, listener } from '@dxos/react-ui-editor';\nimport { translations as threadTranslations } from '@dxos/react-ui-thread';\nimport { nonNullable } from '@dxos/util';\n\nimport { ThreadMain, ThreadSettings, ChatContainer, ChatHeading, ThreadArticle } from './components';\nimport { ThreadComplementary } from './components/ThreadComplementary';\nimport meta, { THREAD_ITEM, THREAD_PLUGIN } from './meta';\nimport translations from './translations';\nimport { ThreadAction, type ThreadPluginProvides, type ThreadSettingsProps } from './types';\n\ntype ThreadState = {\n /** An in-memory staging area for threads that are being drafted. */\n staging: Record<string, ThreadType[]>;\n current?: string | undefined;\n focus?: boolean;\n};\n\ntype SubjectId = string;\nconst initialViewState = { showResolvedThreads: false };\ntype ViewStore = Record<SubjectId, typeof initialViewState>;\n\n// TODO(Zan): More robust runtime check.\n\n// TODO(Zan): Every instance of `cursor` should be replaced with `anchor`.\nexport const ThreadPlugin = (): PluginDefinition<ThreadPluginProvides> => {\n const settings = new LocalStorageStore<ThreadSettingsProps>(THREAD_PLUGIN);\n const state = create<ThreadState>({ staging: {} });\n\n const viewStore = create<ViewStore>({});\n const getViewState = (subjectId: string) => {\n if (!viewStore[subjectId]) {\n viewStore[subjectId] = { ...initialViewState };\n }\n return viewStore[subjectId];\n };\n\n let navigationPlugin: Plugin<LocationProvides> | undefined;\n let intentPlugin: Plugin<IntentPluginProvides> | undefined;\n\n const unsubscribeCallbacks = [] as UnsubscribeCallback[];\n\n return {\n meta,\n ready: async (plugins) => {\n settings.prop({ key: 'standalone', type: LocalStorageStore.bool({ allowUndefined: true }) });\n\n navigationPlugin = resolvePlugin(plugins, parseNavigationPlugin);\n intentPlugin = resolvePlugin(plugins, parseIntentPlugin)!;\n },\n unload: async () => {\n unsubscribeCallbacks.forEach((unsubscribe) => unsubscribe());\n },\n provides: {\n settings: settings.values,\n metadata: {\n records: {\n [ChannelType.typename]: {\n placeholder: ['channel title placeholder', { ns: THREAD_PLUGIN }],\n icon: 'ph--chat--regular',\n // TODO(wittjosiah): Move out of metadata.\n loadReferences: (channel: ChannelType) => loadObjectReferences(channel, (channel) => channel.threads),\n },\n [ThreadType.typename]: {\n // TODO(wittjosiah): Move out of metadata.\n loadReferences: (thread: ThreadType) => loadObjectReferences(thread, (thread) => thread.messages),\n },\n [MessageType.typename]: {\n // TODO(wittjosiah): Move out of metadata.\n loadReferences: (message: MessageType) => [], // loadObjectReferences(message, (message) => [...message.parts, message.context]),\n },\n [THREAD_ITEM]: {\n parse: (item: EchoReactiveObject<any>, type: string) => {\n switch (type) {\n case 'node':\n return { id: item.id, label: item.title, data: item };\n case 'object':\n return item;\n case 'view-object':\n return { id: `${item.id}-view`, object: item };\n }\n },\n },\n },\n },\n translations: [...translations, ...threadTranslations],\n echo: { schema: [ChannelType, ThreadType, MessageType] },\n graph: {\n builder: (plugins) => {\n const client = resolvePlugin(plugins, parseClientPlugin)?.provides.client;\n const dispatch = resolvePlugin(plugins, parseIntentPlugin)?.provides.intent.dispatch;\n const metadataResolver = resolvePlugin(plugins, parseMetadataResolverPlugin)?.provides.metadata.resolver;\n\n if (!client || !dispatch || !metadataResolver) {\n return [];\n }\n\n return [\n createExtension({\n id: `${THREAD_PLUGIN}/comments-for-subject`,\n resolver: ({ id }) => {\n if (!id.endsWith('~comments')) {\n return;\n }\n\n // TODO(Zan): Find util (or make one).\n const subjectId = id.split('~').at(0);\n const [spaceId, objectId] = subjectId?.split(':') ?? [];\n const space = client.spaces.get().find((space) => space.id === spaceId);\n const object = toSignal(\n (onChange) => {\n const timeout = setTimeout(async () => {\n await space?.db.loadObjectById(objectId);\n onChange();\n });\n\n return () => clearTimeout(timeout);\n },\n () => space?.db.getObjectById(objectId),\n subjectId,\n );\n if (!object || !subjectId) {\n return;\n }\n\n const meta = metadataResolver(getTypename(object) ?? '');\n const label = meta.label?.(object) ||\n object.name ||\n meta.placeholder || ['unnamed object threads label', { ns: THREAD_PLUGIN }];\n\n const viewState = getViewState(subjectId);\n\n return {\n id,\n type: 'orphan-comments-for-subject',\n data: object,\n properties: {\n icon: meta.icon,\n label,\n showResolvedThreads: viewState.showResolvedThreads,\n },\n };\n },\n actions: ({ node }) => {\n const dataId = node.id.split('~').at(0);\n if (!node.id.endsWith('~comments') || !dataId) {\n return;\n }\n\n const [spaceId, objectId] = dataId.split(':');\n\n const viewState = getViewState(dataId);\n const toggle = () => {\n const newToggleState = !viewState.showResolvedThreads;\n viewState.showResolvedThreads = newToggleState;\n void dispatch({\n action: ObservabilityAction.SEND_EVENT,\n data: {\n name: 'threads.toggle-show-resolved',\n properties: { spaceId, threadId: objectId, showResolved: newToggleState },\n },\n });\n };\n\n return [\n {\n id: `${THREAD_PLUGIN}/toggle-show-resolved/${node.id}`,\n data: toggle,\n properties: {\n label: ['toggle show resolved', { ns: THREAD_PLUGIN }],\n menuItemType: 'toggle',\n isChecked: viewState.showResolvedThreads,\n testId: 'threadPlugin.toggleShowResolved',\n icon: viewState.showResolvedThreads ? 'ph--eye-slash--regular' : 'ph--eye--regular',\n },\n },\n ];\n },\n }),\n createExtension({\n id: ThreadAction.CREATE,\n filter: (node): node is ActionGroup =>\n !!settings.values.standalone && isActionGroup(node) && node.id.startsWith(SpaceAction.ADD_OBJECT),\n actions: ({ node }) => {\n const id = node.id.split('/').at(-1);\n const [spaceId, objectId] = id?.split(':') ?? [];\n const space = client.spaces.get().find((space) => space.id === spaceId);\n const object = objectId && space?.db.getObjectById(objectId);\n const target = objectId ? object : space;\n if (!target) {\n return;\n }\n\n return [\n {\n id: `${THREAD_PLUGIN}/create/${node.id}`,\n data: async () => {\n await dispatch([\n { plugin: THREAD_PLUGIN, action: ThreadAction.CREATE },\n { action: SpaceAction.ADD_OBJECT, data: { target } },\n { action: NavigationAction.OPEN },\n ]);\n },\n properties: {\n label: ['create channel label', { ns: THREAD_PLUGIN }],\n icon: 'ph--chat--regular',\n testId: 'threadPlugin.createObject',\n },\n },\n ];\n },\n }),\n ];\n },\n },\n surface: {\n component: ({ data, role }) => {\n switch (role) {\n case 'main': {\n return data.active instanceof ChannelType && data.active.threads[0] ? (\n <ThreadMain thread={data.active.threads[0]} />\n ) : null;\n }\n\n case 'settings': {\n return data.plugin === meta.id ? <ThreadSettings settings={settings.values} /> : null;\n }\n\n case 'article':\n case 'complementary': {\n const location = navigationPlugin?.provides.location;\n\n if (data.object instanceof ChannelType && data.object.threads[0]) {\n const channel = data.object;\n // TODO(zan): Maybe we should have utility for positional main object ids.\n if (isLayoutParts(location?.active) && location.active.main) {\n const layoutEntries = location.active.main;\n const currentPosition = layoutEntries.findIndex((entry) => channel.id === entry.id);\n if (currentPosition > 0) {\n const objectToTheLeft = layoutEntries[currentPosition - 1];\n const context = getSpace(data.object)?.db.getObjectById(objectToTheLeft.id);\n return <ThreadArticle thread={data.object.threads[0]} context={context} />;\n }\n }\n\n return <ThreadArticle thread={data.object.threads[0]} />;\n }\n\n if (data.subject instanceof ThreadType) {\n return (\n <>\n <ChatHeading attendableId={data.subject.id} />\n <ChatContainer thread={data.subject} />\n </>\n );\n }\n\n if (\n data.subject &&\n typeof data.subject === 'object' &&\n 'threads' in data.subject &&\n Array.isArray(data.subject.threads)\n ) {\n const { showResolvedThreads } = getViewState(fullyQualifiedId(data.subject));\n\n return (\n <ThreadComplementary\n role={role}\n subject={data.subject}\n stagedThreads={state.staging[fullyQualifiedId(data.subject)]}\n current={state.current}\n focus\n showResolvedThreads={showResolvedThreads}\n />\n );\n }\n }\n }\n\n return null;\n },\n },\n intent: {\n resolver: async (intent) => {\n switch (intent.action) {\n case ThreadAction.CREATE: {\n if (intent.data && intent.data.cursor !== undefined) {\n const { cursor, name, subject } = intent.data;\n\n // Seed the threads array if it does not exist.\n if (subject?.threads === undefined) {\n try {\n // Static schema will throw an error if subject does not support threads array property.\n subject.threads = [];\n } catch (e) {\n log.error('Subject does not support threads array', subject?.typename);\n return;\n }\n }\n\n const subjectId = fullyQualifiedId(subject);\n const thread = create(ThreadType, { name, anchor: cursor, messages: [], status: 'staged' });\n const stagingArea = state.staging[subjectId];\n if (stagingArea) {\n stagingArea.push(thread);\n } else {\n state.staging[subjectId] = [thread];\n }\n\n return {\n data: thread,\n intents: [\n [\n {\n action: ThreadAction.SELECT,\n data: { current: fullyQualifiedId(thread), focus: true },\n },\n {\n action: LayoutAction.SET_LAYOUT,\n data: {\n element: 'complementary',\n subject: subjectId,\n state: true,\n },\n },\n ],\n ],\n };\n } else {\n // NOTE: This is the standalone thread creation case.\n return { data: create(ChannelType, { threads: [create(ThreadType, { messages: [] })] }) };\n }\n }\n\n case ThreadAction.SELECT: {\n state.focus = intent.data?.current === state.current ? state.focus : intent.data?.focus;\n state.current = intent.data?.current;\n return { data: true };\n }\n\n case ThreadAction.TOGGLE_RESOLVED: {\n const { thread } = intent.data ?? {};\n if (!(thread instanceof ThreadType)) {\n return;\n }\n\n if (thread.status === 'active' || thread.status === undefined) {\n thread.status = 'resolved';\n } else if (thread.status === 'resolved') {\n thread.status = 'active';\n }\n\n const space = getSpace(thread);\n const spaceId = space?.id;\n\n return {\n intents: [\n [\n {\n action: ObservabilityAction.SEND_EVENT,\n data: { name: 'threads.toggle-resolved', properties: { threadId: thread.id, spaceId } },\n },\n ],\n ],\n };\n }\n\n case ThreadAction.DELETE: {\n const { subject, thread } = intent.data ?? {};\n if (\n !(thread instanceof ThreadType) ||\n !(subject && typeof subject === 'object' && 'threads' in subject)\n ) {\n return;\n }\n\n const subjectId = fullyQualifiedId(subject);\n const stagingArea = state.staging[subjectId];\n if (stagingArea) {\n // Check if we're deleting a thread that's in the staging area.\n // If so, remove it from the staging area without ceremony.\n const index = stagingArea.findIndex((t) => t.id === thread.id);\n if (index !== -1) {\n stagingArea.splice(index, 1);\n return { data: true };\n }\n }\n\n const space = getSpace(thread);\n if (!space || !subject.threads) {\n return;\n }\n\n if (!intent.undo) {\n const index = subject.threads.findIndex((t: any) => t?.id === thread.id);\n const cursor = subject.threads[index]?.anchor;\n if (index !== -1) {\n subject.threads?.splice(index, 1);\n }\n\n space.db.remove(thread);\n\n return {\n undoable: {\n message: translations[0]['en-US'][THREAD_PLUGIN]['thread deleted label'],\n data: { cursor },\n },\n intents: [\n [\n {\n action: ObservabilityAction.SEND_EVENT,\n data: { name: 'threads.delete', properties: { threadId: thread.id, spaceId: space.id } },\n },\n ],\n ],\n };\n } else if (intent.undo) {\n // TODO(wittjosiah): SDK should do this automatically.\n const savedThread = space.db.add(thread);\n subject.threads.push(savedThread);\n\n return {\n data: true,\n intents: [\n [\n {\n action: ObservabilityAction.SEND_EVENT,\n data: { name: 'threads.undo-delete', properties: { threadId: thread.id, spaceId: space.id } },\n },\n ],\n ],\n };\n }\n break;\n }\n\n case ThreadAction.ON_MESSAGE_ADD: {\n const { thread, subject } = intent.data ?? {};\n if (\n !(thread instanceof ThreadType) ||\n !(subject && typeof subject === 'object' && 'threads' in subject && Array.isArray(subject.threads))\n ) {\n return;\n }\n\n const subjectId = fullyQualifiedId(subject);\n const space = getSpace(subject);\n const intents = [];\n const analyticsProperties = { threadId: thread.id, spaceId: space?.id };\n\n if (state.staging[subjectId]?.find((t) => t === thread)) {\n // Move thread from staging to document.\n thread.status = 'active';\n subject.threads ? subject.threads.push(thread) : (subject.threads = [thread]);\n state.staging[subjectId] = state.staging[subjectId]?.filter((t) => t.id !== thread.id);\n\n intents.push({\n action: ObservabilityAction.SEND_EVENT,\n data: { name: 'threads.thread-created', properties: analyticsProperties },\n });\n }\n\n intents.push({\n action: ObservabilityAction.SEND_EVENT,\n data: {\n name: 'threads.message-added',\n properties: { ...analyticsProperties, threadLength: thread.messages.length },\n },\n });\n\n return {\n data: thread,\n intents: [intents],\n };\n }\n\n case ThreadAction.DELETE_MESSAGE: {\n const { subject, thread, messageId } = intent.data ?? {};\n const space = getSpace(subject);\n\n if (\n !(thread instanceof ThreadType) ||\n !(subject && typeof subject === 'object' && 'threads' in subject)\n ) {\n return;\n }\n\n if (!intent.undo) {\n const message = thread.messages.find((m) => m?.id === messageId);\n const messageIndex = thread.messages.findIndex((m) => m?.id === messageId);\n if (messageIndex === -1 || !message) {\n return undefined;\n }\n\n if (messageIndex === 0 && thread.messages.length === 1) {\n // If the message is the only message in the thread, delete the thread.\n return {\n intents: [[{ action: ThreadAction.DELETE, data: { subject, thread } }]],\n };\n } else {\n thread.messages.splice(messageIndex, 1);\n }\n\n return {\n undoable: {\n message: translations[0]['en-US'][THREAD_PLUGIN]['message deleted label'],\n data: { message, messageIndex },\n },\n intents: [\n [\n {\n action: ObservabilityAction.SEND_EVENT,\n data: {\n name: 'threads.message.delete',\n properties: { threadId: thread.id, spaceId: space?.id },\n },\n },\n ],\n ],\n };\n } else if (intent.undo) {\n const message = intent.data?.message;\n const messageIndex = intent.data?.messageIndex;\n\n if (!(message instanceof MessageType) || !(typeof messageIndex === 'number')) {\n return;\n }\n\n thread.messages.splice(messageIndex, 0, message);\n\n return {\n data: true,\n intents: [\n [\n {\n action: ObservabilityAction.SEND_EVENT,\n data: {\n name: 'threads.message.undo-delete',\n properties: { threadId: thread.id, spaceId: space?.id },\n },\n },\n ],\n ],\n };\n }\n }\n }\n },\n },\n markdown: {\n // TODO(burdon): Factor out extension factory into separate file (for simplicity).\n extensions: ({ document: doc }) => {\n const space = doc && getSpace(doc);\n if (!doc || !space) {\n // Include no-op comments extension here to ensure that the facets are always present when they are expected.\n // TODO(wittjosiah): The Editor should only look for these facets when comments are available.\n return [comments()];\n }\n\n // TODO(Zan): When we have the deepsignal specific equivalent of this we should use that instead.\n const threads = computed(() =>\n [...doc.threads.filter(nonNullable), ...(state.staging[fullyQualifiedId(doc)] ?? [])].filter(\n (thread) => !(thread?.status === 'resolved'),\n ),\n );\n\n return [\n listener({\n onChange: () => {\n doc.threads.forEach((thread) => {\n if (thread?.anchor) {\n const [start, end] = thread.anchor.split(':');\n const name = doc.content && getTextInRange(createDocAccessor(doc.content, ['content']), start, end);\n // TODO(burdon): This seems unsafe; review.\n // Only update if the name has changed, otherwise this will cause an infinite loop.\n // Skip if the name is empty - this means comment text was deleted, but thread name should remain.\n if (name && name !== thread.name) {\n thread.name = name;\n }\n }\n });\n },\n }),\n createExternalCommentSync(\n doc.id,\n (sink) => effect(() => sink()),\n () =>\n threads.value\n .filter((thread) => thread?.anchor)\n .map((thread) => ({ id: fullyQualifiedId(thread), cursor: thread.anchor! })),\n ),\n comments({\n id: doc.id,\n onCreate: ({ cursor }) => {\n const [start, end] = cursor.split(':');\n const name = doc.content && getTextInRange(createDocAccessor(doc.content, ['content']), start, end);\n\n void intentPlugin?.provides.intent.dispatch({\n action: ThreadAction.CREATE,\n data: {\n cursor,\n name,\n subject: doc,\n },\n });\n },\n onDelete: ({ id }) => {\n // If the thread is in the staging area, remove it.\n const stagingArea = state.staging[fullyQualifiedId(doc)];\n if (stagingArea) {\n const index = stagingArea.findIndex((thread) => fullyQualifiedId(thread) === id);\n if (index !== -1) {\n stagingArea.splice(index, 1);\n }\n }\n\n const thread = doc.threads.find((thread) => thread?.id === id);\n if (thread) {\n thread.anchor = undefined;\n }\n },\n onUpdate: ({ id, cursor }) => {\n const thread =\n state.staging[fullyQualifiedId(doc)]?.find((thread) => fullyQualifiedId(thread) === id) ??\n doc.threads.find((thread) => thread?.id === id);\n\n if (thread instanceof ThreadType && thread.anchor) {\n const [start, end] = thread.anchor.split(':');\n thread.name = doc.content && getTextInRange(createDocAccessor(doc.content, ['content']), start, end);\n thread.anchor = cursor;\n }\n },\n onSelect: ({ selection: { current, closest } }) => {\n const dispatch = intentPlugin?.provides.intent.dispatch;\n if (dispatch) {\n void dispatch([{ action: ThreadAction.SELECT, data: { current: current ?? closest } }]);\n }\n },\n }),\n ];\n },\n },\n },\n };\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\n// Lazily load components for content surfaces.\nexport const ThreadMain = React.lazy(() => import('./ThreadMain'));\nexport const ThreadArticle = React.lazy(() => import('./ThreadArticle'));\n\n// TODO(wittjosiah): Suspense boundary for sidebar?\nexport * from './ThreadSettings';\nexport * from './CommentContainer';\nexport * from './MessageContainer';\nexport * from './CommentsContainer';\nexport * from './ChatContainer';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { SettingsValue } from '@dxos/plugin-settings';\nimport { Input, useTranslation } from '@dxos/react-ui';\n\nimport { THREAD_PLUGIN } from '../meta';\nimport type { ThreadSettingsProps } from '../types';\n\nexport const ThreadSettings = ({ settings }: { settings: ThreadSettingsProps }) => {\n const { t } = useTranslation(THREAD_PLUGIN);\n\n return (\n <>\n <SettingsValue label={t('settings standalone label')}>\n <Input.Switch checked={settings.standalone} onCheckedChange={(checked) => (settings.standalone = !!checked)} />\n </SettingsValue>\n </>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { CheckCircle, X } from '@phosphor-icons/react';\nimport React, { useCallback, useEffect, 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 { Button, Tag, Tooltip, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { createBasicExtensions, createThemeExtensions, listener } from '@dxos/react-ui-editor';\nimport {\n getSize,\n hoverableControlItem,\n hoverableControls,\n hoverableFocusedWithinControls,\n mx,\n} from '@dxos/react-ui-theme';\nimport { MessageTextbox, type MessageTextboxProps, Thread, ThreadFooter, ThreadHeading } 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\nconst sizeClass = getSize(4);\n\nconst ToggleResolvedButton = ({\n isResolved,\n onResolve,\n}: {\n isResolved: boolean | undefined;\n onResolve: () => void;\n}) => {\n const { t } = useTranslation(THREAD_PLUGIN);\n const label = t(isResolved ? 'mark as unresolved label' : 'mark as resolved label');\n return (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <Button\n variant='ghost'\n data-testid='thread.toggle-resolved'\n onClick={onResolve}\n classNames={['min-bs-0 p-1', !isResolved && hoverableControlItem]}\n >\n <span className='sr-only'>{label}</span>\n {isResolved ? <CheckCircle className={sizeClass} weight='fill' /> : <CheckCircle className={sizeClass} />}\n </Button>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content classNames={'z-[21]'}>\n {label}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n );\n};\n\nconst DeleteThreadButton = ({ onDelete }: { onDelete: () => void }) => {\n const { t } = useTranslation(THREAD_PLUGIN);\n const label = t('delete thread label');\n return (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <Button\n variant='ghost'\n data-testid='thread.delete'\n onClick={onDelete}\n classNames={['min-bs-0 p-1', hoverableControlItem]}\n >\n <span className='sr-only'>{label}</span>\n <X className={sizeClass} />\n </Button>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content classNames='z-[21]'>\n {label}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n );\n};\n\nexport const CommentContainer = ({\n thread,\n detached,\n context,\n current,\n autoFocusTextbox,\n onAttend,\n onThreadDelete,\n onMessageDelete,\n onResolve,\n onComment,\n}: 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 const threadScrollRef = useRef<HTMLDivElement | null>(null);\n const [autoFocus, setAutoFocus] = useState(!!autoFocusTextbox);\n const { themeMode } = useThemeContext();\n\n const textboxMetadata = getMessageMetadata(fullyQualifiedId(thread), identity);\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 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 [_count],\n );\n\n // TODO(thure): Because of the way the `autoFocus` property is handled by TextEditor,\n // this is the least-bad way of moving focus at the right time, though it is an anti-pattern.\n // Refactor to behave more like <input/>’s `autoFocus` or `autofocus` (yes, they’re different).\n useEffect(() => {\n setAutoFocus(!!autoFocusTextbox);\n }, [autoFocusTextbox]);\n\n // TODO(thure): Factor out.\n const scrollToEnd = (behavior: ScrollBehavior) =>\n setTimeout(() => threadScrollRef.current?.scrollIntoView({ behavior, block: 'end' }), 10);\n\n const handleCreate: MessageTextboxProps['onSend'] = useCallback(() => {\n if (!messageRef.current) {\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 onComment?.(thread);\n\n messageRef.current = '';\n setAutoFocus(true);\n scrollToEnd('instant');\n rerenderEditor();\n\n // TODO(burdon): Scroll to bottom.\n return true;\n }, [thread, identity]);\n\n return (\n <Thread onClickCapture={onAttend} onFocusCapture={onAttend} current={current} id={fullyQualifiedId(thread)}>\n <div\n role='none'\n className={mx(\n 'col-span-2 grid grid-cols-[var(--rail-size)_1fr_min-content]',\n hoverableControls,\n hoverableFocusedWithinControls,\n )}\n >\n {detached ? (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <ThreadHeading detached>{thread.name ?? t('thread title placeholder')}</ThreadHeading>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content classNames='z-[21]' side='top'>\n {t('detached thread label')}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n ) : (\n <ThreadHeading>{thread.name ?? t('thread title placeholder')}</ThreadHeading>\n )}\n <div className='flex flex-row items-center pli-1'>\n {thread.status === 'staged' && <Tag palette='neutral'>{t('draft button')}</Tag>}\n {onResolve && !(thread?.status === 'staged') && (\n <ToggleResolvedButton isResolved={thread?.status === 'resolved'} onResolve={onResolve} />\n )}\n {onThreadDelete && <DeleteThreadButton onDelete={onThreadDelete} />}\n </div>\n </div>\n {thread.messages.filter(nonNullable).map((message) => (\n <MessageContainer\n key={message.id}\n message={message}\n members={members}\n onDelete={(id: string) => onMessageDelete?.(id)}\n />\n ))}\n <MessageTextbox extensions={extensions} autoFocus={autoFocus} onSend={handleCreate} {...textboxMetadata} />\n <ThreadFooter activity={activity}>{t('activity message')}</ThreadFooter>\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 </Thread>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { ChatText } from '@phosphor-icons/react';\nimport React, { useEffect } from 'react';\n\nimport { type ThreadType } from '@dxos/plugin-space/types';\nimport { fullyQualifiedId } from '@dxos/react-client/echo';\nimport { useTranslation, Icon, Trans } from '@dxos/react-ui';\nimport { PlankHeading } from '@dxos/react-ui-deck';\nimport { descriptionText, mx } from '@dxos/react-ui-theme';\n\nimport { CommentContainer } from './CommentContainer';\nimport { type ThreadContainerProps } from './types';\nimport { THREAD_PLUGIN } from '../meta';\n\nexport type ThreadsContainerProps = Omit<\n ThreadContainerProps,\n 'thread' | 'detached' | 'onAttend' | 'onThreadDelete' | 'onMessageDelete' | 'current' | 'autoFocus'\n> & {\n threads: ThreadType[];\n /**\n * Threads that are no longer anchored to a position in the object.\n */\n detached?: string[];\n currentId?: string;\n autoFocusCurrentTextbox?: boolean;\n showResolvedThreads?: boolean;\n onThreadAttend?: (thread: ThreadType) => void;\n onThreadDelete?: (thread: ThreadType) => void;\n onMessageDelete?: (thread: ThreadType, messageId: string) => void;\n onThreadToggleResolved?: (thread: ThreadType) => void;\n onComment?: (thread: ThreadType) => void;\n};\n\nexport const CommentsHeading = ({ attendableId }: { attendableId?: string }) => {\n const { t } = useTranslation(THREAD_PLUGIN);\n\n return (\n <div role='none' className='flex items-center'>\n <PlankHeading.Button attendableId={attendableId}>\n <Icon icon='ph--quotes--regular' size={5} />\n </PlankHeading.Button>\n <PlankHeading.Label attendableId={attendableId}>{t('comments heading')}</PlankHeading.Label>\n </div>\n );\n};\n\n/**\n * Comment threads.\n */\nexport const CommentsContainer = ({\n threads,\n detached = [],\n currentId,\n autoFocusCurrentTextbox,\n showResolvedThreads,\n onThreadAttend,\n onThreadDelete,\n onMessageDelete,\n onThreadToggleResolved,\n ...props\n}: ThreadsContainerProps) => {\n const { t } = useTranslation(THREAD_PLUGIN);\n const filteredThreads = showResolvedThreads ? threads : threads.filter((thread) => !(thread?.status === 'resolved'));\n\n useEffect(() => {\n if (currentId) {\n document.getElementById(currentId)?.scrollIntoView({ behavior: 'smooth', block: 'end' });\n }\n }, [currentId]);\n\n return (\n <>\n {filteredThreads.length > 0 ? (\n filteredThreads.map((thread) => {\n const threadId = fullyQualifiedId(thread);\n return (\n <CommentContainer\n key={threadId}\n thread={thread}\n current={currentId === threadId}\n detached={detached.includes(threadId)}\n autoFocusTextbox={autoFocusCurrentTextbox && currentId === threadId}\n {...(onThreadAttend && { onAttend: () => onThreadAttend(thread) })}\n {...(onThreadDelete && { onThreadDelete: () => onThreadDelete(thread) })}\n {...(onMessageDelete && { onMessageDelete: (messageId: string) => onMessageDelete(thread, messageId) })}\n {...(onThreadToggleResolved && { onResolve: () => onThreadToggleResolved(thread) })}\n {...props}\n />\n );\n })\n ) : (\n <div\n role='alert'\n className={mx(\n descriptionText,\n 'place-self-center border border-dashed border-neutral-400/50 rounded-lg text-center p-4 m-4',\n )}\n >\n <h2 className='mbe-2 font-medium text-baseText'>{t('no comments title')}</h2>\n <p>\n <Trans\n {...{\n t,\n i18nKey: 'no comments message',\n components: {\n commentIcon: <ChatText className='inline-block' />,\n },\n }}\n />\n </p>\n </div>\n )}\n </>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useEffect, useMemo } from 'react';\n\nimport { LayoutAction, type Plugin, useIntentDispatcher, useResolvePlugins } from '@dxos/app-framework';\nimport { type ThreadType } from '@dxos/plugin-space';\nimport { fullyQualifiedId } from '@dxos/react-client/echo';\nimport { ScrollArea } from '@dxos/react-ui';\nimport { createAttendableAttributes, useAttentionContext } from '@dxos/react-ui-attention';\nimport { nonNullable } from '@dxos/util';\n\nimport { CommentsContainer, CommentsHeading } from '../components';\nimport { THREAD_PLUGIN } from '../meta';\nimport { ThreadAction, type ThreadProvides } from '../types';\n\nconst providesThreadsConfig = (plugin: any): Plugin<ThreadProvides<any>> | undefined =>\n 'thread' in plugin.provides ? (plugin as Plugin<ThreadProvides<any>>) : undefined;\n\nexport const ThreadComplementary = ({\n role,\n subject,\n stagedThreads,\n current,\n focus,\n showResolvedThreads,\n}: {\n role: string;\n subject: any;\n stagedThreads: ThreadType[] | undefined;\n current?: string;\n focus?: boolean;\n showResolvedThreads?: boolean;\n}) => {\n const dispatch = useIntentDispatcher();\n\n const threadsIntegrators = useResolvePlugins(providesThreadsConfig);\n const threadProvides = useMemo(() => threadsIntegrators.map((p) => p.provides.thread), [threadsIntegrators]);\n const createSort = useMemo(\n () => threadProvides.find((p) => p.predicate(subject))?.createSort,\n [threadProvides, subject],\n );\n const sort = useMemo(() => createSort?.(subject), [createSort, subject]);\n\n const threads = useMemo(() => {\n return subject.threads.concat(stagedThreads ?? []).filter(nonNullable) as ThreadType[];\n }, [JSON.stringify(subject.threads), JSON.stringify(stagedThreads)]);\n\n const detachedIds = useMemo(() => {\n return threads.filter(({ anchor }) => !anchor).map((thread) => fullyQualifiedId(thread));\n }, [threads]);\n\n useEffect(() => {\n if (!sort) {\n return;\n }\n threads.sort((a, b) => sort(a?.anchor, b?.anchor));\n }, [sort, threads]);\n\n // TODO(Zan): Maybe we should have a hook for this?\n const { attended } = useAttentionContext('Thread Complementary');\n const qualifiedSubjectId = fullyQualifiedId(subject);\n\n const attendableAttrs = createAttendableAttributes(qualifiedSubjectId);\n\n return (\n <div role='none' className='contents group/attention' {...attendableAttrs}>\n {role === 'complementary' && <CommentsHeading attendableId={qualifiedSubjectId} />}\n <ScrollArea.Root classNames='row-span-2'>\n <ScrollArea.Viewport>\n <CommentsContainer\n threads={threads}\n detached={detachedIds}\n currentId={attended.has(qualifiedSubjectId) ? current : undefined}\n autoFocusCurrentTextbox={focus}\n showResolvedThreads={showResolvedThreads}\n onThreadAttend={(thread) => {\n const threadId = fullyQualifiedId(thread);\n if (current !== threadId) {\n current = threadId;\n\n void dispatch?.([\n {\n action: LayoutAction.SCROLL_INTO_VIEW,\n data: {\n id: fullyQualifiedId(subject),\n thread: threadId,\n cursor: thread.anchor,\n },\n },\n ]);\n }\n }}\n onThreadDelete={(thread) => {\n return dispatch({ plugin: THREAD_PLUGIN, action: ThreadAction.DELETE, data: { subject, thread } });\n }}\n onMessageDelete={(thread, messageId) =>\n dispatch({\n plugin: THREAD_PLUGIN,\n action: ThreadAction.DELETE_MESSAGE,\n data: { subject, thread, messageId },\n })\n }\n onThreadToggleResolved={(thread) =>\n dispatch({ plugin: THREAD_PLUGIN, action: ThreadAction.TOGGLE_RESOLVED, data: { thread } })\n }\n onComment={(thread) => {\n void dispatch({ action: ThreadAction.ON_MESSAGE_ADD, data: { thread, subject } });\n }}\n />\n <div role='none' className='bs-10' />\n <ScrollArea.Scrollbar>\n <ScrollArea.Thumb />\n </ScrollArea.Scrollbar>\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n </div>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { THREAD_PLUGIN } from './meta';\n\nexport default [\n {\n 'en-US': {\n [THREAD_PLUGIN]: {\n 'plugin name': 'Threads',\n 'channel name placeholder': 'New channel',\n 'channel title label': 'Title',\n 'delete channel label': 'Delete channel',\n 'create channel label': 'Create channel',\n 'message placeholder': 'Reply…',\n 'settings standalone label': 'Enable channel creation (experimental)',\n 'activity message': 'Processing…',\n 'anonymous label': 'Anonymous',\n 'delete message block label': 'Delete message block',\n 'detached thread label': 'Referenced content was removed',\n 'delete thread label': 'Delete thread',\n 'thread deleted label': 'You deleted a thread.',\n 'message deleted label': 'You deleted a message.',\n 'comments heading': 'Comments',\n 'chat heading': 'Chat',\n 'draft button': 'DRAFT',\n 'no comments title': 'No comments (yet)',\n 'no comments message':\n 'To start a comment thread, select a range of text in a document and click the <commentIcon></commentIcon> Create comment button in the toolbar.',\n 'toggle show resolved': 'Show resolved',\n 'unnamed object threads label': 'Threads',\n 'mark as resolved label': 'Mark as resolved',\n 'mark as unresolved label': 'Mark as unresolved',\n 'save message label': 'Save',\n 'edit message label': 'Edit',\n 'delete message label': 'Delete message',\n },\n },\n },\n];\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { ThreadPlugin } from './ThreadPlugin';\n\nexport default ThreadPlugin;\n\nexport * from './hooks';\nexport * from './types';\n\nexport * from './ThreadPlugin';\n"],
5
- "mappings": "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",
6
- "names": ["computed", "effect", "React", "LayoutAction", "NavigationAction", "parseIntentPlugin", "parseNavigationPlugin", "resolvePlugin", "isLayoutParts", "parseMetadataResolverPlugin", "getTypename", "create", "LocalStorageStore", "log", "parseClientPlugin", "createExtension", "isActionGroup", "toSignal", "ObservabilityAction", "SpaceAction", "ThreadType", "MessageType", "ChannelType", "getSpace", "getTextInRange", "createDocAccessor", "fullyQualifiedId", "loadObjectReferences", "comments", "createExternalCommentSync", "listener", "translations", "threadTranslations", "nonNullable", "React", "React", "SettingsValue", "Input", "useTranslation", "ThreadSettings", "settings", "t", "useTranslation", "THREAD_PLUGIN", "SettingsValue", "label", "Input", "Switch", "checked", "standalone", "onCheckedChange", "CheckCircle", "X", "React", "useCallback", "useEffect", "useMemo", "useRef", "useState", "create", "MessageType", "fullyQualifiedId", "getSpace", "useMembers", "useIdentity", "Button", "Tag", "Tooltip", "useThemeContext", "useTranslation", "createBasicExtensions", "createThemeExtensions", "listener", "getSize", "hoverableControlItem", "hoverableControls", "hoverableFocusedWithinControls", "mx", "MessageTextbox", "Thread", "ThreadFooter", "ThreadHeading", "nonNullable", "sizeClass", "getSize", "ToggleResolvedButton", "isResolved", "onResolve", "t", "useTranslation", "THREAD_PLUGIN", "label", "React", "Tooltip", "Root", "Trigger", "asChild", "Button", "variant", "data-testid", "onClick", "classNames", "hoverableControlItem", "span", "className", "CheckCircle", "weight", "Portal", "Content", "Arrow", "DeleteThreadButton", "onDelete", "X", "CommentContainer", "thread", "detached", "context", "current", "autoFocusTextbox", "onAttend", "onThreadDelete", "onMessageDelete", "onComment", "identity", "useIdentity", "space", "getSpace", "members", "useMembers", "key", "activity", "useStatus", "fullyQualifiedId", "threadScrollRef", "useRef", "autoFocus", "setAutoFocus", "useState", "themeMode", "useThemeContext", "textboxMetadata", "getMessageMetadata", "_count", "_setCount", "rerenderEditor", "count", "messageRef", "extensions", "useMemo", "createBasicExtensions", "placeholder", "createThemeExtensions", "listener", "onChange", "text", "command", "useEffect", "scrollToEnd", "behavior", "setTimeout", "scrollIntoView", "block", "handleCreate", "useCallback", "messages", "push", "create", "MessageType", "sender", "identityKey", "toHex", "timestamp", "Date", "toISOString", "Thread", "onClickCapture", "onFocusCapture", "id", "div", "role", "mx", "hoverableControls", "hoverableFocusedWithinControls", "ThreadHeading", "name", "side", "status", "Tag", "palette", "filter", "nonNullable", "map", "message", "MessageContainer", "MessageTextbox", "onSend", "ThreadFooter", "ref", "ChatText", "React", "useEffect", "fullyQualifiedId", "useTranslation", "Icon", "Trans", "PlankHeading", "descriptionText", "mx", "CommentsHeading", "attendableId", "t", "useTranslation", "THREAD_PLUGIN", "React", "div", "role", "className", "PlankHeading", "Button", "Icon", "icon", "size", "Label", "CommentsContainer", "threads", "detached", "currentId", "autoFocusCurrentTextbox", "showResolvedThreads", "onThreadAttend", "onThreadDelete", "onMessageDelete", "onThreadToggleResolved", "props", "filteredThreads", "filter", "thread", "status", "useEffect", "document", "getElementById", "scrollIntoView", "behavior", "block", "length", "map", "threadId", "fullyQualifiedId", "CommentContainer", "key", "current", "includes", "autoFocusTextbox", "onAttend", "messageId", "onResolve", "mx", "descriptionText", "h2", "p", "Trans", "i18nKey", "components", "commentIcon", "ChatText", "ThreadMain", "React", "lazy", "ThreadArticle", "React", "useEffect", "useMemo", "LayoutAction", "useIntentDispatcher", "useResolvePlugins", "fullyQualifiedId", "ScrollArea", "createAttendableAttributes", "useAttentionContext", "nonNullable", "providesThreadsConfig", "plugin", "provides", "undefined", "ThreadComplementary", "role", "subject", "stagedThreads", "current", "focus", "showResolvedThreads", "dispatch", "useIntentDispatcher", "threadsIntegrators", "useResolvePlugins", "threadProvides", "useMemo", "map", "p", "thread", "createSort", "find", "predicate", "sort", "threads", "concat", "filter", "nonNullable", "JSON", "stringify", "detachedIds", "anchor", "fullyQualifiedId", "useEffect", "a", "b", "attended", "useAttentionContext", "qualifiedSubjectId", "attendableAttrs", "createAttendableAttributes", "React", "div", "className", "CommentsHeading", "attendableId", "ScrollArea", "Root", "classNames", "Viewport", "CommentsContainer", "detached", "currentId", "has", "autoFocusCurrentTextbox", "onThreadAttend", "threadId", "action", "LayoutAction", "SCROLL_INTO_VIEW", "data", "id", "cursor", "onThreadDelete", "THREAD_PLUGIN", "ThreadAction", "DELETE", "onMessageDelete", "messageId", "DELETE_MESSAGE", "onThreadToggleResolved", "TOGGLE_RESOLVED", "onComment", "ON_MESSAGE_ADD", "Scrollbar", "Thumb", "THREAD_PLUGIN", "initialViewState", "showResolvedThreads", "ThreadPlugin", "settings", "LocalStorageStore", "THREAD_PLUGIN", "state", "create", "staging", "viewStore", "getViewState", "subjectId", "navigationPlugin", "intentPlugin", "unsubscribeCallbacks", "meta", "ready", "plugins", "prop", "key", "type", "bool", "allowUndefined", "resolvePlugin", "parseNavigationPlugin", "parseIntentPlugin", "unload", "forEach", "unsubscribe", "provides", "values", "metadata", "records", "ChannelType", "typename", "placeholder", "ns", "icon", "loadReferences", "channel", "loadObjectReferences", "threads", "ThreadType", "thread", "messages", "MessageType", "message", "THREAD_ITEM", "parse", "item", "id", "label", "title", "data", "object", "translations", "threadTranslations", "echo", "schema", "graph", "builder", "client", "parseClientPlugin", "dispatch", "intent", "metadataResolver", "parseMetadataResolverPlugin", "resolver", "createExtension", "endsWith", "split", "at", "spaceId", "objectId", "space", "spaces", "get", "find", "toSignal", "onChange", "timeout", "setTimeout", "db", "loadObjectById", "clearTimeout", "getObjectById", "getTypename", "name", "viewState", "properties", "actions", "node", "dataId", "toggle", "newToggleState", "action", "ObservabilityAction", "SEND_EVENT", "threadId", "showResolved", "menuItemType", "isChecked", "testId", "ThreadAction", "CREATE", "filter", "standalone", "isActionGroup", "startsWith", "SpaceAction", "ADD_OBJECT", "target", "plugin", "NavigationAction", "OPEN", "surface", "component", "role", "active", "React", "ThreadMain", "ThreadSettings", "location", "isLayoutParts", "main", "layoutEntries", "currentPosition", "findIndex", "entry", "objectToTheLeft", "context", "getSpace", "ThreadArticle", "subject", "ChatHeading", "attendableId", "ChatContainer", "Array", "isArray", "fullyQualifiedId", "ThreadComplementary", "stagedThreads", "current", "focus", "cursor", "undefined", "e", "log", "error", "anchor", "status", "stagingArea", "push", "intents", "SELECT", "LayoutAction", "SET_LAYOUT", "element", "TOGGLE_RESOLVED", "DELETE", "index", "t", "splice", "undo", "remove", "undoable", "savedThread", "add", "ON_MESSAGE_ADD", "analyticsProperties", "threadLength", "length", "DELETE_MESSAGE", "messageId", "m", "messageIndex", "markdown", "extensions", "document", "doc", "comments", "computed", "nonNullable", "listener", "start", "end", "content", "getTextInRange", "createDocAccessor", "createExternalCommentSync", "sink", "effect", "value", "map", "onCreate", "onDelete", "onUpdate", "onSelect", "selection", "closest", "ThreadPlugin"]
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { computed, effect } from '@preact/signals-core';\nimport React from 'react';\n\nimport {\n type IntentPluginProvides,\n LayoutAction,\n NavigationAction,\n type LocationProvides,\n type Plugin,\n type PluginDefinition,\n parseIntentPlugin,\n parseNavigationPlugin,\n resolvePlugin,\n isLayoutParts,\n parseMetadataResolverPlugin,\n} from '@dxos/app-framework';\nimport { type UnsubscribeCallback } from '@dxos/async';\nimport { type EchoReactiveObject, getTypename } from '@dxos/echo-schema';\nimport { create } from '@dxos/echo-schema';\nimport { LocalStorageStore } from '@dxos/local-storage';\nimport { log } from '@dxos/log';\nimport { parseClientPlugin } from '@dxos/plugin-client';\nimport { type ActionGroup, createExtension, isActionGroup, toSignal } from '@dxos/plugin-graph';\nimport { ObservabilityAction } from '@dxos/plugin-observability/meta';\nimport { SpaceAction } from '@dxos/plugin-space';\nimport { ThreadType, MessageType, ChannelType } from '@dxos/plugin-space/types';\nimport {\n getSpace,\n getTextInRange,\n createDocAccessor,\n fullyQualifiedId,\n loadObjectReferences,\n} from '@dxos/react-client/echo';\nimport { comments, createExternalCommentSync, listener } from '@dxos/react-ui-editor';\nimport { translations as threadTranslations } from '@dxos/react-ui-thread';\nimport { nonNullable } from '@dxos/util';\n\nimport { ThreadMain, ThreadSettings, ChatContainer, ChatHeading, ThreadArticle } from './components';\nimport { ThreadComplementary } from './components/ThreadComplementary';\nimport meta, { THREAD_ITEM, THREAD_PLUGIN } from './meta';\nimport translations from './translations';\nimport { ThreadAction, type ThreadPluginProvides, type ThreadSettingsProps } from './types';\n\ntype ThreadState = {\n /** An in-memory staging area for threads that are being drafted. */\n staging: Record<string, ThreadType[]>;\n current?: string | undefined;\n};\n\ntype SubjectId = string;\nconst initialViewState = { showResolvedThreads: false };\ntype ViewStore = Record<SubjectId, typeof initialViewState>;\n\n// TODO(Zan): More robust runtime check.\n\n// TODO(Zan): Every instance of `cursor` should be replaced with `anchor`.\nexport const ThreadPlugin = (): PluginDefinition<ThreadPluginProvides> => {\n const settings = new LocalStorageStore<ThreadSettingsProps>(THREAD_PLUGIN);\n const state = create<ThreadState>({ staging: {} });\n\n const viewStore = create<ViewStore>({});\n const getViewState = (subjectId: string) => {\n if (!viewStore[subjectId]) {\n viewStore[subjectId] = { ...initialViewState };\n }\n return viewStore[subjectId];\n };\n\n let navigationPlugin: Plugin<LocationProvides> | undefined;\n let intentPlugin: Plugin<IntentPluginProvides> | undefined;\n\n const unsubscribeCallbacks = [] as UnsubscribeCallback[];\n\n return {\n meta,\n ready: async (plugins) => {\n settings.prop({ key: 'standalone', type: LocalStorageStore.bool({ allowUndefined: true }) });\n\n navigationPlugin = resolvePlugin(plugins, parseNavigationPlugin);\n intentPlugin = resolvePlugin(plugins, parseIntentPlugin)!;\n },\n unload: async () => {\n unsubscribeCallbacks.forEach((unsubscribe) => unsubscribe());\n },\n provides: {\n settings: settings.values,\n metadata: {\n records: {\n [ChannelType.typename]: {\n placeholder: ['channel title placeholder', { ns: THREAD_PLUGIN }],\n icon: 'ph--chat--regular',\n // TODO(wittjosiah): Move out of metadata.\n loadReferences: (channel: ChannelType) => loadObjectReferences(channel, (channel) => channel.threads),\n },\n [ThreadType.typename]: {\n // TODO(wittjosiah): Move out of metadata.\n loadReferences: (thread: ThreadType) => loadObjectReferences(thread, (thread) => thread.messages),\n },\n [MessageType.typename]: {\n // TODO(wittjosiah): Move out of metadata.\n loadReferences: (message: MessageType) => [], // loadObjectReferences(message, (message) => [...message.parts, message.context]),\n },\n [THREAD_ITEM]: {\n parse: (item: EchoReactiveObject<any>, type: string) => {\n switch (type) {\n case 'node':\n return { id: item.id, label: item.title, data: item };\n case 'object':\n return item;\n case 'view-object':\n return { id: `${item.id}-view`, object: item };\n }\n },\n },\n },\n },\n translations: [...translations, ...threadTranslations],\n echo: { schema: [ChannelType, ThreadType, MessageType] },\n graph: {\n builder: (plugins) => {\n const client = resolvePlugin(plugins, parseClientPlugin)?.provides.client;\n const dispatch = resolvePlugin(plugins, parseIntentPlugin)?.provides.intent.dispatch;\n const metadataResolver = resolvePlugin(plugins, parseMetadataResolverPlugin)?.provides.metadata.resolver;\n\n if (!client || !dispatch || !metadataResolver) {\n return [];\n }\n\n return [\n createExtension({\n id: `${THREAD_PLUGIN}/comments-for-subject`,\n resolver: ({ id }) => {\n if (!id.endsWith('~comments')) {\n return;\n }\n\n // TODO(Zan): Find util (or make one).\n const subjectId = id.split('~').at(0);\n const [spaceId, objectId] = subjectId?.split(':') ?? [];\n const space = client.spaces.get().find((space) => space.id === spaceId);\n const object = toSignal(\n (onChange) => {\n const timeout = setTimeout(async () => {\n await space?.db.loadObjectById(objectId);\n onChange();\n });\n\n return () => clearTimeout(timeout);\n },\n () => space?.db.getObjectById(objectId),\n subjectId,\n );\n if (!object || !subjectId) {\n return;\n }\n\n const meta = metadataResolver(getTypename(object) ?? '');\n const label = meta.label?.(object) ||\n object.name ||\n meta.placeholder || ['unnamed object threads label', { ns: THREAD_PLUGIN }];\n\n const viewState = getViewState(subjectId);\n\n return {\n id,\n type: 'orphan-comments-for-subject',\n data: null,\n properties: {\n icon: 'ph--chat-text--regular',\n label,\n showResolvedThreads: viewState.showResolvedThreads,\n object,\n },\n };\n },\n actions: ({ node }) => {\n const dataId = node.id.split('~').at(0);\n if (!node.id.endsWith('~comments') || !dataId) {\n return;\n }\n\n const [spaceId, objectId] = dataId.split(':');\n\n const viewState = getViewState(dataId);\n const toggle = () => {\n const newToggleState = !viewState.showResolvedThreads;\n viewState.showResolvedThreads = newToggleState;\n void dispatch({\n action: ObservabilityAction.SEND_EVENT,\n data: {\n name: 'threads.toggle-show-resolved',\n properties: { spaceId, threadId: objectId, showResolved: newToggleState },\n },\n });\n };\n\n return [\n {\n id: `${THREAD_PLUGIN}/toggle-show-resolved/${node.id}`,\n data: toggle,\n properties: {\n label: ['toggle show resolved', { ns: THREAD_PLUGIN }],\n menuItemType: 'toggle',\n isChecked: viewState.showResolvedThreads,\n testId: 'threadPlugin.toggleShowResolved',\n icon: viewState.showResolvedThreads ? 'ph--eye-slash--regular' : 'ph--eye--regular',\n },\n },\n ];\n },\n }),\n createExtension({\n id: ThreadAction.CREATE,\n filter: (node): node is ActionGroup =>\n !!settings.values.standalone && isActionGroup(node) && node.id.startsWith(SpaceAction.ADD_OBJECT),\n actions: ({ node }) => {\n const id = node.id.split('/').at(-1);\n const [spaceId, objectId] = id?.split(':') ?? [];\n const space = client.spaces.get().find((space) => space.id === spaceId);\n const object = objectId && space?.db.getObjectById(objectId);\n const target = objectId ? object : space;\n if (!target) {\n return;\n }\n\n return [\n {\n id: `${THREAD_PLUGIN}/create/${node.id}`,\n data: async () => {\n await dispatch([\n { plugin: THREAD_PLUGIN, action: ThreadAction.CREATE },\n { action: SpaceAction.ADD_OBJECT, data: { target } },\n { action: NavigationAction.OPEN },\n ]);\n },\n properties: {\n label: ['create channel label', { ns: THREAD_PLUGIN }],\n icon: 'ph--chat--regular',\n testId: 'threadPlugin.createObject',\n },\n },\n ];\n },\n }),\n ];\n },\n },\n surface: {\n component: ({ data, role }) => {\n switch (role) {\n case 'main': {\n return data.active instanceof ChannelType && data.active.threads[0] ? (\n <ThreadMain thread={data.active.threads[0]} />\n ) : null;\n }\n\n case 'settings': {\n return data.plugin === meta.id ? <ThreadSettings settings={settings.values} /> : null;\n }\n\n case 'article':\n case 'complementary': {\n const location = navigationPlugin?.provides.location;\n\n if (data.object instanceof ChannelType && data.object.threads[0]) {\n const channel = data.object;\n // TODO(zan): Maybe we should have utility for positional main object ids.\n if (isLayoutParts(location?.active) && location.active.main) {\n const layoutEntries = location.active.main;\n const currentPosition = layoutEntries.findIndex((entry) => channel.id === entry.id);\n if (currentPosition > 0) {\n const objectToTheLeft = layoutEntries[currentPosition - 1];\n const context = getSpace(data.object)?.db.getObjectById(objectToTheLeft.id);\n return <ThreadArticle thread={data.object.threads[0]} context={context} />;\n }\n }\n\n return <ThreadArticle thread={data.object.threads[0]} />;\n }\n\n if (data.subject instanceof ThreadType) {\n return (\n <>\n <ChatHeading attendableId={data.subject.id} />\n <ChatContainer thread={data.subject} />\n </>\n );\n }\n\n if (\n data.subject &&\n typeof data.subject === 'object' &&\n 'threads' in data.subject &&\n Array.isArray(data.subject.threads)\n ) {\n const { showResolvedThreads } = getViewState(fullyQualifiedId(data.subject));\n\n return (\n <ThreadComplementary\n role={role}\n subject={data.subject}\n stagedThreads={state.staging[fullyQualifiedId(data.subject)]}\n current={state.current}\n showResolvedThreads={showResolvedThreads}\n />\n );\n }\n }\n }\n\n return null;\n },\n },\n intent: {\n resolver: async (intent) => {\n switch (intent.action) {\n case ThreadAction.CREATE: {\n if (intent.data && intent.data.cursor !== undefined) {\n const { cursor, name, subject } = intent.data;\n\n // Seed the threads array if it does not exist.\n if (subject?.threads === undefined) {\n try {\n // Static schema will throw an error if subject does not support threads array property.\n subject.threads = [];\n } catch (e) {\n log.error('Subject does not support threads array', subject?.typename);\n return;\n }\n }\n\n const subjectId = fullyQualifiedId(subject);\n const thread = create(ThreadType, { name, anchor: cursor, messages: [], status: 'staged' });\n const stagingArea = state.staging[subjectId];\n if (stagingArea) {\n stagingArea.push(thread);\n } else {\n state.staging[subjectId] = [thread];\n }\n\n return {\n data: thread,\n intents: [\n [\n {\n action: ThreadAction.SELECT,\n data: { current: fullyQualifiedId(thread) },\n },\n {\n action: LayoutAction.SET_LAYOUT,\n data: {\n element: 'complementary',\n subject: subjectId,\n state: true,\n },\n },\n ],\n ],\n };\n } else {\n // NOTE: This is the standalone thread creation case.\n return { data: create(ChannelType, { threads: [create(ThreadType, { messages: [] })] }) };\n }\n }\n\n case ThreadAction.SELECT: {\n state.current = intent.data?.current;\n return { data: true };\n }\n\n case ThreadAction.TOGGLE_RESOLVED: {\n const { thread } = intent.data ?? {};\n if (!(thread instanceof ThreadType)) {\n return;\n }\n\n if (thread.status === 'active' || thread.status === undefined) {\n thread.status = 'resolved';\n } else if (thread.status === 'resolved') {\n thread.status = 'active';\n }\n\n const space = getSpace(thread);\n const spaceId = space?.id;\n\n return {\n intents: [\n [\n {\n action: ObservabilityAction.SEND_EVENT,\n data: { name: 'threads.toggle-resolved', properties: { threadId: thread.id, spaceId } },\n },\n ],\n ],\n };\n }\n\n case ThreadAction.DELETE: {\n const { subject, thread } = intent.data ?? {};\n if (\n !(thread instanceof ThreadType) ||\n !(subject && typeof subject === 'object' && 'threads' in subject)\n ) {\n return;\n }\n\n const subjectId = fullyQualifiedId(subject);\n const stagingArea = state.staging[subjectId];\n if (stagingArea) {\n // Check if we're deleting a thread that's in the staging area.\n // If so, remove it from the staging area without ceremony.\n const index = stagingArea.findIndex((t) => t.id === thread.id);\n if (index !== -1) {\n stagingArea.splice(index, 1);\n return { data: true };\n }\n }\n\n const space = getSpace(thread);\n if (!space || !subject.threads) {\n return;\n }\n\n if (!intent.undo) {\n const index = subject.threads.findIndex((t: any) => t?.id === thread.id);\n const cursor = subject.threads[index]?.anchor;\n if (index !== -1) {\n subject.threads?.splice(index, 1);\n }\n\n space.db.remove(thread);\n\n return {\n undoable: {\n message: translations[0]['en-US'][THREAD_PLUGIN]['thread deleted label'],\n data: { cursor },\n },\n intents: [\n [\n {\n action: ObservabilityAction.SEND_EVENT,\n data: { name: 'threads.delete', properties: { threadId: thread.id, spaceId: space.id } },\n },\n ],\n ],\n };\n } else if (intent.undo) {\n // TODO(wittjosiah): SDK should do this automatically.\n const savedThread = space.db.add(thread);\n subject.threads.push(savedThread);\n\n return {\n data: true,\n intents: [\n [\n {\n action: ObservabilityAction.SEND_EVENT,\n data: { name: 'threads.undo-delete', properties: { threadId: thread.id, spaceId: space.id } },\n },\n ],\n ],\n };\n }\n break;\n }\n\n case ThreadAction.ON_MESSAGE_ADD: {\n const { thread, subject } = intent.data ?? {};\n if (\n !(thread instanceof ThreadType) ||\n !(subject && typeof subject === 'object' && 'threads' in subject && Array.isArray(subject.threads))\n ) {\n return;\n }\n\n const subjectId = fullyQualifiedId(subject);\n const space = getSpace(subject);\n const intents = [];\n const analyticsProperties = { threadId: thread.id, spaceId: space?.id };\n\n if (state.staging[subjectId]?.find((t) => t === thread)) {\n // Move thread from staging to document.\n thread.status = 'active';\n subject.threads ? subject.threads.push(thread) : (subject.threads = [thread]);\n state.staging[subjectId] = state.staging[subjectId]?.filter((t) => t.id !== thread.id);\n\n intents.push({\n action: ObservabilityAction.SEND_EVENT,\n data: { name: 'threads.thread-created', properties: analyticsProperties },\n });\n }\n\n intents.push({\n action: ObservabilityAction.SEND_EVENT,\n data: {\n name: 'threads.message-added',\n properties: { ...analyticsProperties, threadLength: thread.messages.length },\n },\n });\n\n return {\n data: thread,\n intents: [intents],\n };\n }\n\n case ThreadAction.DELETE_MESSAGE: {\n const { subject, thread, messageId } = intent.data ?? {};\n const space = getSpace(subject);\n\n if (\n !(thread instanceof ThreadType) ||\n !(subject && typeof subject === 'object' && 'threads' in subject)\n ) {\n return;\n }\n\n if (!intent.undo) {\n const message = thread.messages.find((m) => m?.id === messageId);\n const messageIndex = thread.messages.findIndex((m) => m?.id === messageId);\n if (messageIndex === -1 || !message) {\n return undefined;\n }\n\n if (messageIndex === 0 && thread.messages.length === 1) {\n // If the message is the only message in the thread, delete the thread.\n return {\n intents: [[{ action: ThreadAction.DELETE, data: { subject, thread } }]],\n };\n } else {\n thread.messages.splice(messageIndex, 1);\n }\n\n return {\n undoable: {\n message: translations[0]['en-US'][THREAD_PLUGIN]['message deleted label'],\n data: { message, messageIndex },\n },\n intents: [\n [\n {\n action: ObservabilityAction.SEND_EVENT,\n data: {\n name: 'threads.message.delete',\n properties: { threadId: thread.id, spaceId: space?.id },\n },\n },\n ],\n ],\n };\n } else if (intent.undo) {\n const message = intent.data?.message;\n const messageIndex = intent.data?.messageIndex;\n\n if (!(message instanceof MessageType) || !(typeof messageIndex === 'number')) {\n return;\n }\n\n thread.messages.splice(messageIndex, 0, message);\n\n return {\n data: true,\n intents: [\n [\n {\n action: ObservabilityAction.SEND_EVENT,\n data: {\n name: 'threads.message.undo-delete',\n properties: { threadId: thread.id, spaceId: space?.id },\n },\n },\n ],\n ],\n };\n }\n }\n }\n },\n },\n markdown: {\n // TODO(burdon): Factor out extension factory into separate file (for simplicity).\n extensions: ({ document: doc }) => {\n const space = doc && getSpace(doc);\n if (!doc || !space) {\n // Include no-op comments extension here to ensure that the facets are always present when they are expected.\n // TODO(wittjosiah): The Editor should only look for these facets when comments are available.\n return [comments()];\n }\n\n // TODO(Zan): When we have the deepsignal specific equivalent of this we should use that instead.\n const threads = computed(() =>\n [...doc.threads.filter(nonNullable), ...(state.staging[fullyQualifiedId(doc)] ?? [])].filter(\n (thread) => !(thread?.status === 'resolved'),\n ),\n );\n\n return [\n listener({\n onChange: () => {\n doc.threads.forEach((thread) => {\n if (thread?.anchor) {\n const [start, end] = thread.anchor.split(':');\n const name = doc.content && getTextInRange(createDocAccessor(doc.content, ['content']), start, end);\n // TODO(burdon): This seems unsafe; review.\n // Only update if the name has changed, otherwise this will cause an infinite loop.\n // Skip if the name is empty - this means comment text was deleted, but thread name should remain.\n if (name && name !== thread.name) {\n thread.name = name;\n }\n }\n });\n },\n }),\n createExternalCommentSync(\n fullyQualifiedId(doc),\n (sink) => effect(() => sink()),\n () =>\n threads.value\n .filter((thread) => thread?.anchor)\n .map((thread) => ({ id: fullyQualifiedId(thread), cursor: thread.anchor! })),\n ),\n comments({\n id: fullyQualifiedId(doc),\n onCreate: ({ cursor }) => {\n const [start, end] = cursor.split(':');\n const name = doc.content && getTextInRange(createDocAccessor(doc.content, ['content']), start, end);\n\n void intentPlugin?.provides.intent.dispatch({\n action: ThreadAction.CREATE,\n data: {\n cursor,\n name,\n subject: doc,\n },\n });\n },\n onDelete: ({ id }) => {\n // If the thread is in the staging area, remove it.\n const stagingArea = state.staging[fullyQualifiedId(doc)];\n if (stagingArea) {\n const index = stagingArea.findIndex((thread) => fullyQualifiedId(thread) === id);\n if (index !== -1) {\n stagingArea.splice(index, 1);\n }\n }\n\n const thread = doc.threads.find((thread) => thread?.id === id);\n if (thread) {\n thread.anchor = undefined;\n }\n },\n onUpdate: ({ id, cursor }) => {\n const thread =\n state.staging[fullyQualifiedId(doc)]?.find((thread) => fullyQualifiedId(thread) === id) ??\n doc.threads.find((thread) => thread?.id === id);\n\n if (thread instanceof ThreadType && thread.anchor) {\n const [start, end] = thread.anchor.split(':');\n thread.name = doc.content && getTextInRange(createDocAccessor(doc.content, ['content']), start, end);\n thread.anchor = cursor;\n }\n },\n onSelect: ({ selection: { current, closest } }) => {\n const dispatch = intentPlugin?.provides.intent.dispatch;\n if (dispatch) {\n void dispatch([{ action: ThreadAction.SELECT, data: { current: current ?? closest } }]);\n }\n },\n }),\n ];\n },\n },\n },\n };\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\n// Lazily load components for content surfaces.\nexport const ThreadMain = React.lazy(() => import('./ThreadMain'));\nexport const ThreadArticle = React.lazy(() => import('./ThreadArticle'));\n\n// TODO(wittjosiah): Suspense boundary for sidebar?\nexport * from './ThreadSettings';\nexport * from './CommentContainer';\nexport * from './MessageContainer';\nexport * from './CommentsContainer';\nexport * from './ChatContainer';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { SettingsValue } from '@dxos/plugin-settings';\nimport { Input, useTranslation } from '@dxos/react-ui';\n\nimport { THREAD_PLUGIN } from '../meta';\nimport type { ThreadSettingsProps } from '../types';\n\nexport const ThreadSettings = ({ settings }: { settings: ThreadSettingsProps }) => {\n const { t } = useTranslation(THREAD_PLUGIN);\n\n return (\n <>\n <SettingsValue label={t('settings standalone label')}>\n <Input.Switch checked={settings.standalone} onCheckedChange={(checked) => (settings.standalone = !!checked)} />\n </SettingsValue>\n </>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { CheckCircle, X } from '@phosphor-icons/react';\nimport React, { useCallback, 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 { Button, Tag, Tooltip, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { createBasicExtensions, createThemeExtensions, listener } from '@dxos/react-ui-editor';\nimport {\n getSize,\n hoverableControlItem,\n hoverableControls,\n hoverableFocusedWithinControls,\n mx,\n} from '@dxos/react-ui-theme';\nimport { MessageTextbox, type MessageTextboxProps, Thread, ThreadFooter, ThreadHeading } 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\nconst sizeClass = getSize(4);\n\nconst ToggleResolvedButton = ({\n isResolved,\n onResolve,\n}: {\n isResolved: boolean | undefined;\n onResolve: () => void;\n}) => {\n const { t } = useTranslation(THREAD_PLUGIN);\n const label = t(isResolved ? 'mark as unresolved label' : 'mark as resolved label');\n return (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <Button\n variant='ghost'\n data-testid='thread.toggle-resolved'\n onClick={onResolve}\n classNames={['min-bs-0 p-1', !isResolved && hoverableControlItem]}\n >\n <span className='sr-only'>{label}</span>\n {isResolved ? <CheckCircle className={sizeClass} weight='fill' /> : <CheckCircle className={sizeClass} />}\n </Button>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content classNames={'z-[21]'}>\n {label}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n );\n};\n\nconst DeleteThreadButton = ({ onDelete }: { onDelete: () => void }) => {\n const { t } = useTranslation(THREAD_PLUGIN);\n const label = t('delete thread label');\n return (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <Button\n variant='ghost'\n data-testid='thread.delete'\n onClick={onDelete}\n classNames={['min-bs-0 p-1', hoverableControlItem]}\n >\n <span className='sr-only'>{label}</span>\n <X className={sizeClass} />\n </Button>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content classNames='z-[21]'>\n {label}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n );\n};\n\nexport const CommentContainer = ({\n thread,\n detached,\n context,\n current,\n onAttend,\n onThreadDelete,\n onMessageDelete,\n onResolve,\n onComment,\n}: 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 const threadScrollRef = useRef<HTMLDivElement | null>(null);\n const { themeMode } = useThemeContext();\n\n const textboxMetadata = getMessageMetadata(fullyQualifiedId(thread), identity);\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 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 [_count],\n );\n\n // TODO(thure): Factor out.\n const scrollToEnd = (behavior: ScrollBehavior) =>\n setTimeout(() => threadScrollRef.current?.scrollIntoView({ behavior, block: 'end' }), 10);\n\n const handleCreate: MessageTextboxProps['onSend'] = useCallback(() => {\n if (!messageRef.current) {\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 onComment?.(thread);\n\n messageRef.current = '';\n scrollToEnd('instant');\n rerenderEditor();\n\n // TODO(burdon): Scroll to bottom.\n return true;\n }, [thread, identity]);\n\n return (\n <Thread onClickCapture={onAttend} onFocusCapture={onAttend} current={current} id={fullyQualifiedId(thread)}>\n <div\n role='none'\n className={mx(\n 'col-span-2 grid grid-cols-[var(--rail-size)_1fr_min-content]',\n hoverableControls,\n hoverableFocusedWithinControls,\n )}\n >\n {detached ? (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <ThreadHeading detached>{thread.name ?? t('thread title placeholder')}</ThreadHeading>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content classNames='z-[21]' side='top'>\n {t('detached thread label')}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n ) : (\n <ThreadHeading>{thread.name ?? t('thread title placeholder')}</ThreadHeading>\n )}\n <div className='flex flex-row items-center pli-1'>\n {thread.status === 'staged' && <Tag palette='neutral'>{t('draft button')}</Tag>}\n {onResolve && !(thread?.status === 'staged') && (\n <ToggleResolvedButton isResolved={thread?.status === 'resolved'} onResolve={onResolve} />\n )}\n {onThreadDelete && <DeleteThreadButton onDelete={onThreadDelete} />}\n </div>\n </div>\n {thread.messages.filter(nonNullable).map((message) => (\n <MessageContainer\n key={message.id}\n message={message}\n members={members}\n onDelete={(id: string) => onMessageDelete?.(id)}\n />\n ))}\n {/*\n TODO(wittjosiah): Can't autofocus this generally.\n There can be multiple threads with inputs and they can't all be focused.\n Also, it steals focus from documents when first rendered.\n Need to find a way to autofocus in one scenario only: when a new thread is created.\n */}\n <MessageTextbox extensions={extensions} onSend={handleCreate} {...textboxMetadata} />\n <ThreadFooter activity={activity}>{t('activity message')}</ThreadFooter>\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 </Thread>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { ChatText } from '@phosphor-icons/react';\nimport React, { useEffect } from 'react';\n\nimport { type ThreadType } from '@dxos/plugin-space/types';\nimport { fullyQualifiedId } from '@dxos/react-client/echo';\nimport { useTranslation, Trans } from '@dxos/react-ui';\nimport { descriptionText, mx } from '@dxos/react-ui-theme';\n\nimport { CommentContainer } from './CommentContainer';\nimport { type ThreadContainerProps } from './types';\nimport { THREAD_PLUGIN } from '../meta';\n\nexport type ThreadsContainerProps = Omit<\n ThreadContainerProps,\n 'thread' | 'detached' | 'onAttend' | 'onThreadDelete' | 'onMessageDelete' | 'current' | 'autoFocus'\n> & {\n threads: ThreadType[];\n /**\n * Threads that are no longer anchored to a position in the object.\n */\n detached?: string[];\n currentId?: string;\n showResolvedThreads?: boolean;\n onThreadAttend?: (thread: ThreadType) => void;\n onThreadDelete?: (thread: ThreadType) => void;\n onMessageDelete?: (thread: ThreadType, messageId: string) => void;\n onThreadToggleResolved?: (thread: ThreadType) => void;\n onComment?: (thread: ThreadType) => void;\n};\n\n/**\n * Comment threads.\n */\nexport const CommentsContainer = ({\n threads,\n detached = [],\n currentId,\n showResolvedThreads,\n onThreadAttend,\n onThreadDelete,\n onMessageDelete,\n onThreadToggleResolved,\n ...props\n}: ThreadsContainerProps) => {\n const { t } = useTranslation(THREAD_PLUGIN);\n const filteredThreads = showResolvedThreads ? threads : threads.filter((thread) => !(thread?.status === 'resolved'));\n\n useEffect(() => {\n if (currentId) {\n document.getElementById(currentId)?.scrollIntoView({ behavior: 'smooth', block: 'end' });\n }\n }, [currentId]);\n\n return (\n <>\n {filteredThreads.length > 0 ? (\n filteredThreads.map((thread) => {\n const threadId = fullyQualifiedId(thread);\n return (\n <CommentContainer\n key={threadId}\n thread={thread}\n current={currentId === threadId}\n detached={detached.includes(threadId)}\n {...(onThreadAttend && { onAttend: () => onThreadAttend(thread) })}\n {...(onThreadDelete && { onThreadDelete: () => onThreadDelete(thread) })}\n {...(onMessageDelete && { onMessageDelete: (messageId: string) => onMessageDelete(thread, messageId) })}\n {...(onThreadToggleResolved && { onResolve: () => onThreadToggleResolved(thread) })}\n {...props}\n />\n );\n })\n ) : (\n <div\n role='alert'\n className={mx(\n descriptionText,\n 'place-self-center border border-dashed border-neutral-400/50 rounded-lg text-center p-4 m-4',\n )}\n >\n <h2 className='mbe-2 font-medium text-baseText'>{t('no comments title')}</h2>\n <p>\n <Trans\n {...{\n t,\n i18nKey: 'no comments message',\n components: {\n commentIcon: <ChatText className='inline-block' />,\n },\n }}\n />\n </p>\n </div>\n )}\n </>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useEffect, useMemo } from 'react';\n\nimport { LayoutAction, type Plugin, useIntentDispatcher, useResolvePlugins } from '@dxos/app-framework';\nimport { type ThreadType } from '@dxos/plugin-space';\nimport { fullyQualifiedId } from '@dxos/react-client/echo';\nimport { ScrollArea } from '@dxos/react-ui';\nimport { useAttended } from '@dxos/react-ui-attention';\nimport { nonNullable } from '@dxos/util';\n\nimport { CommentsContainer } from '../components';\nimport { THREAD_PLUGIN } from '../meta';\nimport { ThreadAction, type ThreadProvides } from '../types';\n\nconst providesThreadsConfig = (plugin: any): Plugin<ThreadProvides<any>> | undefined =>\n 'thread' in plugin.provides ? (plugin as Plugin<ThreadProvides<any>>) : undefined;\n\nexport const ThreadComplementary = ({\n role,\n subject,\n stagedThreads,\n current,\n showResolvedThreads,\n}: {\n role: string;\n subject: any;\n stagedThreads: ThreadType[] | undefined;\n current?: string;\n showResolvedThreads?: boolean;\n}) => {\n const dispatch = useIntentDispatcher();\n\n const threadsIntegrators = useResolvePlugins(providesThreadsConfig);\n const threadProvides = useMemo(() => threadsIntegrators.map((p) => p.provides.thread), [threadsIntegrators]);\n const createSort = useMemo(\n () => threadProvides.find((p) => p.predicate(subject))?.createSort,\n [threadProvides, subject],\n );\n const sort = useMemo(() => createSort?.(subject), [createSort, subject]);\n\n const threads = useMemo(() => {\n return subject.threads.concat(stagedThreads ?? []).filter(nonNullable) as ThreadType[];\n }, [JSON.stringify(subject.threads), JSON.stringify(stagedThreads)]);\n\n const detachedIds = useMemo(() => {\n return threads.filter(({ anchor }) => !anchor).map((thread) => fullyQualifiedId(thread));\n }, [threads]);\n\n useEffect(() => {\n if (!sort) {\n return;\n }\n threads.sort((a, b) => sort(a?.anchor, b?.anchor));\n }, [sort, threads]);\n\n const attended = useAttended();\n const qualifiedSubjectId = fullyQualifiedId(subject);\n\n return (\n <div role='none' className='contents'>\n <ScrollArea.Root classNames='row-span-2'>\n <ScrollArea.Viewport>\n <CommentsContainer\n threads={threads}\n detached={detachedIds}\n currentId={attended.includes(qualifiedSubjectId) ? current : undefined}\n showResolvedThreads={showResolvedThreads}\n onThreadAttend={(thread) => {\n const threadId = fullyQualifiedId(thread);\n if (current !== threadId) {\n current = threadId;\n\n void dispatch?.([\n {\n action: LayoutAction.SCROLL_INTO_VIEW,\n data: {\n id: fullyQualifiedId(subject),\n thread: threadId,\n cursor: thread.anchor,\n },\n },\n ]);\n }\n }}\n onThreadDelete={(thread) => {\n return dispatch({ plugin: THREAD_PLUGIN, action: ThreadAction.DELETE, data: { subject, thread } });\n }}\n onMessageDelete={(thread, messageId) =>\n dispatch({\n plugin: THREAD_PLUGIN,\n action: ThreadAction.DELETE_MESSAGE,\n data: { subject, thread, messageId },\n })\n }\n onThreadToggleResolved={(thread) =>\n dispatch({ plugin: THREAD_PLUGIN, action: ThreadAction.TOGGLE_RESOLVED, data: { thread } })\n }\n onComment={(thread) => {\n void dispatch({ action: ThreadAction.ON_MESSAGE_ADD, data: { thread, subject } });\n }}\n />\n <div role='none' className='bs-10' />\n <ScrollArea.Scrollbar>\n <ScrollArea.Thumb />\n </ScrollArea.Scrollbar>\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n </div>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { THREAD_PLUGIN } from './meta';\n\nexport default [\n {\n 'en-US': {\n [THREAD_PLUGIN]: {\n 'plugin name': 'Threads',\n 'channel name placeholder': 'New channel',\n 'channel title label': 'Title',\n 'delete channel label': 'Delete channel',\n 'create channel label': 'Create channel',\n 'message placeholder': 'Reply…',\n 'settings standalone label': 'Enable channel creation (experimental)',\n 'activity message': 'Processing…',\n 'anonymous label': 'Anonymous',\n 'delete message block label': 'Delete message block',\n 'detached thread label': 'Referenced content was removed',\n 'delete thread label': 'Delete thread',\n 'thread deleted label': 'You deleted a thread.',\n 'message deleted label': 'You deleted a message.',\n 'comments heading': 'Comments',\n 'chat heading': 'Chat',\n 'draft button': 'DRAFT',\n 'no comments title': 'No comments (yet)',\n 'no comments message':\n 'To start a comment thread, select a range of text in a document and click the <commentIcon></commentIcon> Create comment button in the toolbar.',\n 'toggle show resolved': 'Show resolved',\n 'unnamed object threads label': 'Threads',\n 'mark as resolved label': 'Mark as resolved',\n 'mark as unresolved label': 'Mark as unresolved',\n 'save message label': 'Save',\n 'edit message label': 'Edit',\n 'delete message label': 'Delete message',\n },\n },\n },\n];\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { ThreadPlugin } from './ThreadPlugin';\n\nexport default ThreadPlugin;\n\nexport * from './hooks';\nexport * from './types';\n\nexport * from './ThreadPlugin';\n"],
5
+ "mappings": "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",
6
+ "names": ["computed", "effect", "React", "LayoutAction", "NavigationAction", "parseIntentPlugin", "parseNavigationPlugin", "resolvePlugin", "isLayoutParts", "parseMetadataResolverPlugin", "getTypename", "create", "LocalStorageStore", "log", "parseClientPlugin", "createExtension", "isActionGroup", "toSignal", "ObservabilityAction", "SpaceAction", "ThreadType", "MessageType", "ChannelType", "getSpace", "getTextInRange", "createDocAccessor", "fullyQualifiedId", "loadObjectReferences", "comments", "createExternalCommentSync", "listener", "translations", "threadTranslations", "nonNullable", "React", "React", "SettingsValue", "Input", "useTranslation", "ThreadSettings", "settings", "t", "useTranslation", "THREAD_PLUGIN", "SettingsValue", "label", "Input", "Switch", "checked", "standalone", "onCheckedChange", "CheckCircle", "X", "React", "useCallback", "useMemo", "useRef", "useState", "create", "MessageType", "fullyQualifiedId", "getSpace", "useMembers", "useIdentity", "Button", "Tag", "Tooltip", "useThemeContext", "useTranslation", "createBasicExtensions", "createThemeExtensions", "listener", "getSize", "hoverableControlItem", "hoverableControls", "hoverableFocusedWithinControls", "mx", "MessageTextbox", "Thread", "ThreadFooter", "ThreadHeading", "nonNullable", "sizeClass", "getSize", "ToggleResolvedButton", "isResolved", "onResolve", "t", "useTranslation", "THREAD_PLUGIN", "label", "React", "Tooltip", "Root", "Trigger", "asChild", "Button", "variant", "data-testid", "onClick", "classNames", "hoverableControlItem", "span", "className", "CheckCircle", "weight", "Portal", "Content", "Arrow", "DeleteThreadButton", "onDelete", "X", "CommentContainer", "thread", "detached", "context", "current", "onAttend", "onThreadDelete", "onMessageDelete", "onComment", "identity", "useIdentity", "space", "getSpace", "members", "useMembers", "key", "activity", "useStatus", "fullyQualifiedId", "threadScrollRef", "useRef", "themeMode", "useThemeContext", "textboxMetadata", "getMessageMetadata", "_count", "_setCount", "useState", "rerenderEditor", "count", "messageRef", "extensions", "useMemo", "createBasicExtensions", "placeholder", "createThemeExtensions", "listener", "onChange", "text", "command", "scrollToEnd", "behavior", "setTimeout", "scrollIntoView", "block", "handleCreate", "useCallback", "messages", "push", "create", "MessageType", "sender", "identityKey", "toHex", "timestamp", "Date", "toISOString", "Thread", "onClickCapture", "onFocusCapture", "id", "div", "role", "mx", "hoverableControls", "hoverableFocusedWithinControls", "ThreadHeading", "name", "side", "status", "Tag", "palette", "filter", "nonNullable", "map", "message", "MessageContainer", "MessageTextbox", "onSend", "ThreadFooter", "ref", "ChatText", "React", "useEffect", "fullyQualifiedId", "useTranslation", "Trans", "descriptionText", "mx", "CommentsContainer", "threads", "detached", "currentId", "showResolvedThreads", "onThreadAttend", "onThreadDelete", "onMessageDelete", "onThreadToggleResolved", "props", "t", "useTranslation", "THREAD_PLUGIN", "filteredThreads", "filter", "thread", "status", "useEffect", "document", "getElementById", "scrollIntoView", "behavior", "block", "React", "length", "map", "threadId", "fullyQualifiedId", "CommentContainer", "key", "current", "includes", "onAttend", "messageId", "onResolve", "div", "role", "className", "mx", "descriptionText", "h2", "p", "Trans", "i18nKey", "components", "commentIcon", "ChatText", "ThreadMain", "React", "lazy", "ThreadArticle", "React", "useEffect", "useMemo", "LayoutAction", "useIntentDispatcher", "useResolvePlugins", "fullyQualifiedId", "ScrollArea", "useAttended", "nonNullable", "providesThreadsConfig", "plugin", "provides", "undefined", "ThreadComplementary", "role", "subject", "stagedThreads", "current", "showResolvedThreads", "dispatch", "useIntentDispatcher", "threadsIntegrators", "useResolvePlugins", "threadProvides", "useMemo", "map", "p", "thread", "createSort", "find", "predicate", "sort", "threads", "concat", "filter", "nonNullable", "JSON", "stringify", "detachedIds", "anchor", "fullyQualifiedId", "useEffect", "a", "b", "attended", "useAttended", "qualifiedSubjectId", "React", "div", "className", "ScrollArea", "Root", "classNames", "Viewport", "CommentsContainer", "detached", "currentId", "includes", "onThreadAttend", "threadId", "action", "LayoutAction", "SCROLL_INTO_VIEW", "data", "id", "cursor", "onThreadDelete", "THREAD_PLUGIN", "ThreadAction", "DELETE", "onMessageDelete", "messageId", "DELETE_MESSAGE", "onThreadToggleResolved", "TOGGLE_RESOLVED", "onComment", "ON_MESSAGE_ADD", "Scrollbar", "Thumb", "THREAD_PLUGIN", "initialViewState", "showResolvedThreads", "ThreadPlugin", "settings", "LocalStorageStore", "THREAD_PLUGIN", "state", "create", "staging", "viewStore", "getViewState", "subjectId", "navigationPlugin", "intentPlugin", "unsubscribeCallbacks", "meta", "ready", "plugins", "prop", "key", "type", "bool", "allowUndefined", "resolvePlugin", "parseNavigationPlugin", "parseIntentPlugin", "unload", "forEach", "unsubscribe", "provides", "values", "metadata", "records", "ChannelType", "typename", "placeholder", "ns", "icon", "loadReferences", "channel", "loadObjectReferences", "threads", "ThreadType", "thread", "messages", "MessageType", "message", "THREAD_ITEM", "parse", "item", "id", "label", "title", "data", "object", "translations", "threadTranslations", "echo", "schema", "graph", "builder", "client", "parseClientPlugin", "dispatch", "intent", "metadataResolver", "parseMetadataResolverPlugin", "resolver", "createExtension", "endsWith", "split", "at", "spaceId", "objectId", "space", "spaces", "get", "find", "toSignal", "onChange", "timeout", "setTimeout", "db", "loadObjectById", "clearTimeout", "getObjectById", "getTypename", "name", "viewState", "properties", "actions", "node", "dataId", "toggle", "newToggleState", "action", "ObservabilityAction", "SEND_EVENT", "threadId", "showResolved", "menuItemType", "isChecked", "testId", "ThreadAction", "CREATE", "filter", "standalone", "isActionGroup", "startsWith", "SpaceAction", "ADD_OBJECT", "target", "plugin", "NavigationAction", "OPEN", "surface", "component", "role", "active", "React", "ThreadMain", "ThreadSettings", "location", "isLayoutParts", "main", "layoutEntries", "currentPosition", "findIndex", "entry", "objectToTheLeft", "context", "getSpace", "ThreadArticle", "subject", "ChatHeading", "attendableId", "ChatContainer", "Array", "isArray", "fullyQualifiedId", "ThreadComplementary", "stagedThreads", "current", "cursor", "undefined", "e", "log", "error", "anchor", "status", "stagingArea", "push", "intents", "SELECT", "LayoutAction", "SET_LAYOUT", "element", "TOGGLE_RESOLVED", "DELETE", "index", "t", "splice", "undo", "remove", "undoable", "savedThread", "add", "ON_MESSAGE_ADD", "analyticsProperties", "threadLength", "length", "DELETE_MESSAGE", "messageId", "m", "messageIndex", "markdown", "extensions", "document", "doc", "comments", "computed", "nonNullable", "listener", "start", "end", "content", "getTextInRange", "createDocAccessor", "createExternalCommentSync", "sink", "effect", "value", "map", "onCreate", "onDelete", "onUpdate", "onSelect", "selection", "closest", "ThreadPlugin"]
7
7
  }