@dxos/plugin-thread 0.6.12-main.5cc132e → 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.
Files changed (72) hide show
  1. package/dist/lib/browser/{ThreadArticle-6L6BGE4Z.mjs → ThreadArticle-4VU752F4.mjs} +3 -3
  2. package/dist/lib/{node-esm/ThreadMain-DU6LBSN3.mjs → browser/ThreadMain-ML3P4XSD.mjs} +3 -3
  3. package/dist/lib/browser/{chunk-5IBJO53M.mjs → chunk-7NUYW5IW.mjs} +2 -5
  4. package/dist/lib/browser/chunk-7NUYW5IW.mjs.map +7 -0
  5. package/dist/lib/{node-esm/chunk-U5UVX4ZP.mjs → browser/chunk-GJRBBPXI.mjs} +2 -2
  6. package/dist/lib/browser/{chunk-AVC4CGJM.mjs → chunk-XF5QKI75.mjs} +8 -6
  7. package/dist/lib/browser/chunk-XF5QKI75.mjs.map +7 -0
  8. package/dist/lib/browser/index.mjs +46 -111
  9. package/dist/lib/browser/index.mjs.map +3 -3
  10. package/dist/lib/browser/meta.json +1 -1
  11. package/dist/lib/browser/meta.mjs +1 -1
  12. package/dist/lib/browser/types.mjs +2 -2
  13. package/dist/lib/node/{ThreadArticle-7BWXVIJ4.cjs → ThreadArticle-ERUHPHVT.cjs} +7 -7
  14. package/dist/lib/node/{ThreadMain-XSRB6NKJ.cjs → ThreadMain-6DN7FDNB.cjs} +7 -7
  15. package/dist/lib/node/{chunk-BWBONZGU.cjs → chunk-6EVXCSDS.cjs} +5 -18
  16. package/dist/lib/node/chunk-6EVXCSDS.cjs.map +7 -0
  17. package/dist/lib/node/{chunk-4B2ARV7L.cjs → chunk-FXD3DYMO.cjs} +6 -6
  18. package/dist/lib/node/{chunk-T7TXCNHL.cjs → chunk-PZVUW4W2.cjs} +61 -59
  19. package/dist/lib/node/chunk-PZVUW4W2.cjs.map +7 -0
  20. package/dist/lib/node/index.cjs +145 -210
  21. package/dist/lib/node/index.cjs.map +3 -3
  22. package/dist/lib/node/meta.cjs +4 -4
  23. package/dist/lib/node/meta.cjs.map +1 -1
  24. package/dist/lib/node/meta.json +1 -1
  25. package/dist/lib/node/types.cjs +3 -3
  26. package/dist/lib/node/types.cjs.map +1 -1
  27. package/dist/lib/node-esm/{ThreadArticle-6L6BGE4Z.mjs → ThreadArticle-NKI5F4W5.mjs} +4 -3
  28. package/dist/lib/node-esm/{ThreadArticle-6L6BGE4Z.mjs.map → ThreadArticle-NKI5F4W5.mjs.map} +1 -1
  29. package/dist/lib/{browser/ThreadMain-DU6LBSN3.mjs → node-esm/ThreadMain-2A3VQLCW.mjs} +4 -3
  30. package/dist/lib/node-esm/{ThreadMain-DU6LBSN3.mjs.map → ThreadMain-2A3VQLCW.mjs.map} +1 -1
  31. package/dist/lib/node-esm/{chunk-AVC4CGJM.mjs → chunk-A44C4MTQ.mjs} +9 -6
  32. package/dist/lib/node-esm/chunk-A44C4MTQ.mjs.map +7 -0
  33. package/dist/lib/node-esm/{chunk-5IBJO53M.mjs → chunk-Y475KZTX.mjs} +4 -5
  34. package/dist/lib/node-esm/chunk-Y475KZTX.mjs.map +7 -0
  35. package/dist/lib/{browser/chunk-U5UVX4ZP.mjs → node-esm/chunk-YO46JGAE.mjs} +3 -2
  36. package/dist/lib/node-esm/{chunk-U5UVX4ZP.mjs.map → chunk-YO46JGAE.mjs.map} +1 -1
  37. package/dist/lib/node-esm/index.mjs +47 -111
  38. package/dist/lib/node-esm/index.mjs.map +3 -3
  39. package/dist/lib/node-esm/meta.json +1 -1
  40. package/dist/lib/node-esm/meta.mjs +2 -1
  41. package/dist/lib/node-esm/types.mjs +3 -2
  42. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  43. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  44. package/dist/types/src/components/CommentContainer.d.ts +1 -1
  45. package/dist/types/src/components/CommentContainer.d.ts.map +1 -1
  46. package/dist/types/src/components/CommentsContainer.d.ts +1 -5
  47. package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
  48. package/dist/types/src/components/ThreadComplementary.d.ts +1 -2
  49. package/dist/types/src/components/ThreadComplementary.d.ts.map +1 -1
  50. package/dist/types/src/components/testing.d.ts +2 -0
  51. package/dist/types/src/components/testing.d.ts.map +1 -1
  52. package/dist/types/src/meta.d.ts +1 -4
  53. package/dist/types/src/meta.d.ts.map +1 -1
  54. package/package.json +33 -33
  55. package/src/ThreadPlugin.tsx +31 -78
  56. package/src/components/ChatContainer.tsx +3 -4
  57. package/src/components/CommentContainer.tsx +8 -12
  58. package/src/components/CommentsContainer.tsx +1 -18
  59. package/src/components/ThreadComplementary.tsx +5 -12
  60. package/src/meta.tsx +1 -5
  61. package/dist/lib/browser/chunk-5IBJO53M.mjs.map +0 -7
  62. package/dist/lib/browser/chunk-AVC4CGJM.mjs.map +0 -7
  63. package/dist/lib/node/chunk-BWBONZGU.cjs.map +0 -7
  64. package/dist/lib/node/chunk-T7TXCNHL.cjs.map +0 -7
  65. package/dist/lib/node-esm/chunk-5IBJO53M.mjs.map +0 -7
  66. package/dist/lib/node-esm/chunk-AVC4CGJM.mjs.map +0 -7
  67. /package/dist/lib/browser/{ThreadArticle-6L6BGE4Z.mjs.map → ThreadArticle-4VU752F4.mjs.map} +0 -0
  68. /package/dist/lib/browser/{ThreadMain-DU6LBSN3.mjs.map → ThreadMain-ML3P4XSD.mjs.map} +0 -0
  69. /package/dist/lib/browser/{chunk-U5UVX4ZP.mjs.map → chunk-GJRBBPXI.mjs.map} +0 -0
  70. /package/dist/lib/node/{ThreadArticle-7BWXVIJ4.cjs.map → ThreadArticle-ERUHPHVT.cjs.map} +0 -0
  71. /package/dist/lib/node/{ThreadMain-XSRB6NKJ.cjs.map → ThreadMain-6DN7FDNB.cjs.map} +0 -0
  72. /package/dist/lib/node/{chunk-4B2ARV7L.cjs.map → chunk-FXD3DYMO.cjs.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  ChatContainer
3
- } from "./chunk-AVC4CGJM.mjs";
4
- import "./chunk-5IBJO53M.mjs";
3
+ } from "./chunk-XF5QKI75.mjs";
4
+ import "./chunk-7NUYW5IW.mjs";
5
5
 
6
6
  // packages/plugins/plugin-thread/src/components/ThreadArticle.tsx
7
7
  import React from "react";
@@ -15,4 +15,4 @@ var ThreadArticle_default = ThreadArticle;
15
15
  export {
16
16
  ThreadArticle_default as default
17
17
  };
18
- //# sourceMappingURL=ThreadArticle-6L6BGE4Z.mjs.map
18
+ //# sourceMappingURL=ThreadArticle-4VU752F4.mjs.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  ChatContainer
3
- } from "./chunk-AVC4CGJM.mjs";
4
- import "./chunk-5IBJO53M.mjs";
3
+ } from "./chunk-XF5QKI75.mjs";
4
+ import "./chunk-7NUYW5IW.mjs";
5
5
 
6
6
  // packages/plugins/plugin-thread/src/components/ThreadMain.tsx
7
7
  import React from "react";
@@ -23,4 +23,4 @@ var ThreadMain_default = ThreadMain;
23
23
  export {
24
24
  ThreadMain_default as default
25
25
  };
26
- //# sourceMappingURL=ThreadMain-DU6LBSN3.mjs.map
26
+ //# sourceMappingURL=ThreadMain-ML3P4XSD.mjs.map
@@ -1,6 +1,4 @@
1
1
  // packages/plugins/plugin-thread/src/meta.tsx
2
- import { Chat } from "@phosphor-icons/react";
3
- import React from "react";
4
2
  import { pluginMeta } from "@dxos/app-framework";
5
3
  var THREAD_PLUGIN = "dxos.org/plugin/thread";
6
4
  var THREAD_ITEM = `${THREAD_PLUGIN}/item`;
@@ -9,8 +7,7 @@ var meta_default = pluginMeta({
9
7
  name: "Threads",
10
8
  // TODO(wittjosiah): Update once scope of threads expands.
11
9
  description: "Comment threads on documents.",
12
- iconComponent: (props) => /* @__PURE__ */ React.createElement(Chat, props),
13
- iconSymbol: "ph--chat--regular"
10
+ icon: "ph--chat--regular"
14
11
  });
15
12
 
16
13
  export {
@@ -18,4 +15,4 @@ export {
18
15
  THREAD_ITEM,
19
16
  meta_default
20
17
  };
21
- //# sourceMappingURL=chunk-5IBJO53M.mjs.map
18
+ //# sourceMappingURL=chunk-7NUYW5IW.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/meta.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { pluginMeta } from '@dxos/app-framework';\n\nexport const THREAD_PLUGIN = 'dxos.org/plugin/thread';\nexport const THREAD_ITEM = `${THREAD_PLUGIN}/item`;\n\nexport default pluginMeta({\n id: THREAD_PLUGIN,\n name: 'Threads',\n // TODO(wittjosiah): Update once scope of threads expands.\n description: 'Comment threads on documents.',\n icon: 'ph--chat--regular',\n});\n"],
5
+ "mappings": ";AAIA,SAASA,kBAAkB;AAEpB,IAAMC,gBAAgB;AACtB,IAAMC,cAAc,GAAGD,aAAAA;AAE9B,IAAA,eAAeE,WAAW;EACxBC,IAAIH;EACJI,MAAM;;EAENC,aAAa;EACbC,MAAM;AACR,CAAA;",
6
+ "names": ["pluginMeta", "THREAD_PLUGIN", "THREAD_ITEM", "pluginMeta", "id", "name", "description", "icon"]
7
+ }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  THREAD_PLUGIN
3
- } from "./chunk-5IBJO53M.mjs";
3
+ } from "./chunk-7NUYW5IW.mjs";
4
4
 
5
5
  // packages/plugins/plugin-thread/src/types.ts
6
6
  var THREAD_ACTION = `${THREAD_PLUGIN}/action`;
@@ -17,4 +17,4 @@ var ThreadAction;
17
17
  export {
18
18
  ThreadAction
19
19
  };
20
- //# sourceMappingURL=chunk-U5UVX4ZP.mjs.map
20
+ //# sourceMappingURL=chunk-GJRBBPXI.mjs.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  THREAD_ITEM,
3
3
  THREAD_PLUGIN
4
- } from "./chunk-5IBJO53M.mjs";
4
+ } from "./chunk-7NUYW5IW.mjs";
5
5
 
6
6
  // packages/plugins/plugin-thread/src/hooks/useStatus.ts
7
7
  import { useEffect, useState } from "react";
@@ -72,14 +72,13 @@ var useOnEditAnalytics = (message, editing) => {
72
72
  };
73
73
 
74
74
  // packages/plugins/plugin-thread/src/components/ChatContainer.tsx
75
- import { Chat } from "@phosphor-icons/react";
76
75
  import React2, { useLayoutEffect, useMemo, useRef as useRef2, useState as useState3 } from "react";
77
76
  import { create } from "@dxos/echo-schema";
78
77
  import { MessageType } from "@dxos/plugin-space/types";
79
78
  import { fullyQualifiedId, getSpace as getSpace2, useMembers } from "@dxos/react-client/echo";
80
79
  import { useIdentity as useIdentity2 } from "@dxos/react-client/halo";
81
- import { ScrollArea, useThemeContext as useThemeContext2, useTranslation as useTranslation2 } from "@dxos/react-ui";
82
- import { PlankHeading, plankHeadingIconProps } from "@dxos/react-ui-deck";
80
+ import { Icon, ScrollArea, useThemeContext as useThemeContext2, useTranslation as useTranslation2 } from "@dxos/react-ui";
81
+ import { PlankHeading } from "@dxos/react-ui-deck";
83
82
  import { createBasicExtensions as createBasicExtensions2, createThemeExtensions as createThemeExtensions2, listener } from "@dxos/react-ui-editor";
84
83
  import { mx as mx3 } from "@dxos/react-ui-theme";
85
84
  import { MessageTextbox, Thread, ThreadFooter, threadLayout } from "@dxos/react-ui-thread";
@@ -304,7 +303,10 @@ var ChatHeading = ({ attendableId }) => {
304
303
  className: "flex items-center"
305
304
  }, /* @__PURE__ */ React2.createElement(PlankHeading.Button, {
306
305
  attendableId
307
- }, /* @__PURE__ */ React2.createElement(Chat, plankHeadingIconProps)), /* @__PURE__ */ React2.createElement(PlankHeading.Label, {
306
+ }, /* @__PURE__ */ React2.createElement(Icon, {
307
+ icon: "ph--chat--regular",
308
+ size: 5
309
+ })), /* @__PURE__ */ React2.createElement(PlankHeading.Label, {
308
310
  attendableId
309
311
  }, t("chat heading")));
310
312
  };
@@ -407,4 +409,4 @@ export {
407
409
  ChatHeading,
408
410
  ChatContainer
409
411
  };
410
- //# sourceMappingURL=chunk-AVC4CGJM.mjs.map
412
+ //# sourceMappingURL=chunk-XF5QKI75.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/hooks/useStatus.ts", "../../../src/hooks/analytics.ts", "../../../src/components/ChatContainer.tsx", "../../../src/components/MessageContainer.tsx", "../../../src/components/command-extension.ts", "../../../src/util.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\nimport { type Space } from '@dxos/react-client/echo';\n\n// TODO(burdon): Generalize and factor out.\nexport const useStatus = (space?: Space, channel?: string) => {\n const [processing, setProcessing] = useState(false);\n useEffect(() => {\n if (!space || !channel) {\n return;\n }\n\n const unsubscribe = space.listen(`status/${channel}`, (status) => {\n const { event } = status.payload ?? {};\n setProcessing(event === 'processing');\n });\n\n const t = setInterval(() => {\n setProcessing((prev: any) => {\n if (typeof prev?.ts === 'number' && Date.now() - prev.ts > 30_000) {\n return undefined;\n } else {\n return prev;\n }\n });\n }, 1_000);\n\n return () => {\n unsubscribe();\n clearInterval(t);\n };\n }, [space, channel]);\n\n return processing;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useCallback } from 'react';\n\nimport { useIntentDispatcher } from '@dxos/app-framework';\nimport { type ReactiveObject } from '@dxos/echo-schema';\nimport { ObservabilityAction } from '@dxos/plugin-observability/meta';\nimport { getSpace } from '@dxos/react-client/echo';\nimport { useOnTransition } from '@dxos/react-ui';\n\nexport const useAnalyticsCallback = (spaceId: string | undefined, name: string, meta?: any) => {\n const dispatch = useIntentDispatcher();\n\n return useCallback(\n (dynamicMeta?: any) => {\n void dispatch({\n action: ObservabilityAction.SEND_EVENT,\n data: {\n name,\n properties: { ...meta, ...dynamicMeta, spaceId },\n },\n });\n },\n [dispatch, name, meta, spaceId],\n );\n};\n\nexport const useOnEditAnalytics = (message: ReactiveObject<any>, editing: boolean) => {\n const space = getSpace(message);\n\n const onEditAnalytics = useAnalyticsCallback(space?.id, 'threads.comment-edited', {\n messageId: message.id,\n messageLength: message.text.length,\n });\n\n useOnTransition(editing, true, false, onEditAnalytics);\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useLayoutEffect, useMemo, useRef, useState } from 'react';\n\nimport { create } from '@dxos/echo-schema';\nimport { MessageType } from '@dxos/plugin-space/types';\nimport { fullyQualifiedId, getSpace, useMembers } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { Icon, ScrollArea, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { PlankHeading } from '@dxos/react-ui-deck';\nimport { createBasicExtensions, createThemeExtensions, listener } from '@dxos/react-ui-editor';\nimport { mx } from '@dxos/react-ui-theme';\nimport { MessageTextbox, type MessageTextboxProps, Thread, ThreadFooter, threadLayout } from '@dxos/react-ui-thread';\nimport { nonNullable } from '@dxos/util';\n\nimport { MessageContainer } from './MessageContainer';\nimport { command } from './command-extension';\nimport { type ThreadContainerProps } from './types';\nimport { useStatus } from '../hooks';\nimport { THREAD_PLUGIN } from '../meta';\nimport { getMessageMetadata } from '../util';\n\nexport const ChatHeading = ({ attendableId }: { attendableId?: string }) => {\n const { t } = useTranslation(THREAD_PLUGIN);\n return (\n <div role='none' className='flex items-center'>\n <PlankHeading.Button attendableId={attendableId}>\n <Icon icon='ph--chat--regular' size={5} />\n </PlankHeading.Button>\n <PlankHeading.Label attendableId={attendableId}>{t('chat heading')}</PlankHeading.Label>\n </div>\n );\n};\n\nexport const ChatContainer = ({ thread, context, current, autoFocusTextbox }: ThreadContainerProps) => {\n const identity = useIdentity()!;\n const space = getSpace(thread);\n const members = useMembers(space?.key);\n const activity = useStatus(space, fullyQualifiedId(thread));\n const { t } = useTranslation(THREAD_PLUGIN);\n // TODO(wittjosiah): This is a hack to reset the editor after a message is sent.\n const [_count, _setCount] = useState(0);\n const rerenderEditor = () => _setCount((count) => count + 1);\n const [autoFocus, setAutoFocus] = useState(autoFocusTextbox);\n const threadScrollRef = useRef<HTMLDivElement | null>(null);\n const { themeMode } = useThemeContext();\n\n const textboxMetadata = getMessageMetadata(fullyQualifiedId(thread), identity);\n const messageRef = useRef('');\n const extensions = useMemo(\n () => [\n createBasicExtensions({ placeholder: t('message placeholder') }),\n createThemeExtensions({ themeMode }),\n listener({ onChange: (text) => (messageRef.current = text) }),\n command,\n ],\n [themeMode, _count],\n );\n\n // TODO(thure): Factor out.\n // TODO(thure): `flex-col-reverse` does not work to start the container scrolled to the end while also using\n // `ScrollArea`. This is the least-bad way I found to scroll to the end on mount. Note that 0ms was insufficient\n // for the desired effect; this is likely hardware-dependent and should be reevaluated.\n const scrollToEnd = (behavior: ScrollBehavior) =>\n setTimeout(() => threadScrollRef.current?.scrollIntoView({ behavior, block: 'end' }), 10);\n\n useLayoutEffect(() => {\n scrollToEnd('instant');\n }, []);\n\n // TODO(burdon): Change to model.\n const handleCreate: MessageTextboxProps['onSend'] = () => {\n if (!messageRef.current?.length) {\n return false;\n }\n\n thread.messages.push(\n create(MessageType, {\n sender: { identityKey: identity.identityKey.toHex() },\n timestamp: new Date().toISOString(),\n text: messageRef.current,\n context,\n }),\n );\n\n messageRef.current = '';\n setAutoFocus(true);\n scrollToEnd('smooth');\n rerenderEditor();\n return true;\n };\n\n const handleDelete = (id: string) => {\n const messageIndex = thread.messages.filter(nonNullable).findIndex((message) => message.id === id);\n if (messageIndex !== -1) {\n thread.messages.splice(messageIndex, 1);\n }\n };\n\n return (\n <Thread\n current={current}\n id={fullyQualifiedId(thread)}\n classNames='bs-full grid-rows-[1fr_min-content_min-content] overflow-hidden transition-[padding-block-end] [[data-sidebar-inline-start-state=open]_&]:lg:pbe-0'\n >\n <ScrollArea.Root classNames='col-span-2'>\n <ScrollArea.Viewport classNames='overflow-anchored after:overflow-anchor after:block after:bs-px after:-mbs-px [&>div]:min-bs-full [&>div]:!grid [&>div]:grid-rows-[1fr_0]'>\n <div role='none' className={mx(threadLayout, 'place-self-end')}>\n {thread.messages.filter(nonNullable).map((message) => (\n <MessageContainer key={message.id} message={message} members={members} onDelete={handleDelete} />\n ))}\n </div>\n {/* NOTE(thure): This can’t also be the `overflow-anchor` because `ScrollArea` injects an interceding node that contains this necessary ref’d element. */}\n <div role='none' className='bs-px -mbs-px' ref={threadScrollRef} />\n <ScrollArea.Scrollbar>\n <ScrollArea.Thumb />\n </ScrollArea.Scrollbar>\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n <MessageTextbox extensions={extensions} autoFocus={autoFocus} onSend={handleCreate} {...textboxMetadata} />\n <ThreadFooter activity={activity}>{t('activity message')}</ThreadFooter>\n </Thread>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { EditorView } from '@codemirror/view';\nimport { Check, PencilSimple, X } from '@phosphor-icons/react';\nimport React, { forwardRef, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { Surface } from '@dxos/app-framework';\nimport { type Expando, type EchoReactiveObject } from '@dxos/echo-schema';\nimport { type MessageType } from '@dxos/plugin-space/types';\nimport { PublicKey } from '@dxos/react-client';\nimport { type SpaceMember } from '@dxos/react-client/echo';\nimport { useIdentity, type Identity } from '@dxos/react-client/halo';\nimport {\n Button,\n ButtonGroup,\n DensityProvider,\n Tooltip,\n useOnTransition,\n useThemeContext,\n useTranslation,\n} from '@dxos/react-ui';\nimport { createBasicExtensions, createThemeExtensions, useTextEditor } from '@dxos/react-ui-editor';\nimport { Mosaic, type MosaicTileComponent } from '@dxos/react-ui-mosaic';\nimport {\n getSize,\n hoverableControlItem,\n hoverableControls,\n hoverableFocusedWithinControls,\n mx,\n} from '@dxos/react-ui-theme';\nimport { MessageHeading, MessageRoot } from '@dxos/react-ui-thread';\nimport { nonNullable } from '@dxos/util';\n\nimport { command } from './command-extension';\nimport { useOnEditAnalytics } from '../hooks';\nimport { THREAD_ITEM, THREAD_PLUGIN } from '../meta';\nimport { getMessageMetadata } from '../util';\n\nconst messageControlClassNames = ['p-1 min-bs-0 transition-opacity items-start', hoverableControlItem];\n\nexport const MessageContainer = ({\n message,\n members,\n onDelete,\n}: {\n message: MessageType;\n members: SpaceMember[];\n onDelete?: (id: string) => void;\n}) => {\n const senderIdentity = members.find(\n (member) => message.sender.identityKey && PublicKey.equals(member.identity.identityKey, message.sender.identityKey),\n )?.identity;\n const messageMetadata = getMessageMetadata(message.id, senderIdentity);\n const userIsAuthor = useIdentity()?.identityKey.toHex() === messageMetadata.authorId;\n const [editing, setEditing] = useState(false);\n const handleDelete = useCallback(() => onDelete?.(message.id), [message, onDelete]);\n const { t } = useTranslation(THREAD_PLUGIN);\n const editLabel = t(editing ? 'save message label' : 'edit message label');\n const deleteLabel = t('delete message label');\n\n return (\n <MessageRoot {...messageMetadata} classNames={[hoverableControls, hoverableFocusedWithinControls]}>\n <MessageHeading authorName={messageMetadata.authorName} timestamp={messageMetadata.timestamp}>\n <ButtonGroup classNames='mie-1'>\n {userIsAuthor && (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <Button\n variant='ghost'\n data-testid={editing ? 'thread.message.save' : 'thread.message.edit'}\n classNames={messageControlClassNames}\n onClick={() => setEditing((editing) => !editing)}\n >\n <span className='sr-only'>{editLabel}</span>\n {editing ? <Check className={getSize(4)} /> : <PencilSimple className={getSize(4)} />}\n </Button>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content classNames='z-[21]'>\n {editLabel}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n )}\n {onDelete && (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <Button\n variant='ghost'\n data-testid='thread.message.delete'\n classNames={messageControlClassNames}\n onClick={() => handleDelete()}\n >\n <span className='sr-only'>{deleteLabel}</span>\n <X className={getSize(4)} />\n </Button>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content classNames='z-[21]'>\n {deleteLabel}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n )}\n </ButtonGroup>\n </MessageHeading>\n <TextboxBlock message={message} isAuthor={userIsAuthor} editing={editing} />\n {message.parts?.filter(nonNullable).map((part, index) => <MessagePart key={index} part={part} />)}\n </MessageRoot>\n );\n};\n\nconst MessagePart = ({ part }: { part: Expando }) => {\n return (\n <Mosaic.Container id={part.id}>\n <Mosaic.DraggableTile type={THREAD_ITEM} path={part.id} item={part} Component={MessageBlockObjectTile} />\n </Mosaic.Container>\n );\n};\n\nconst TextboxBlock = ({\n message,\n isAuthor,\n editing,\n}: {\n message: MessageType;\n editing?: boolean;\n isAuthor?: boolean;\n identity?: Identity;\n}) => {\n const { themeMode } = useThemeContext();\n const inMemoryContentRef = useRef(message.text);\n\n const handleDocumentChange = useCallback((newState: string) => {\n inMemoryContentRef.current = newState;\n }, []);\n\n const saveDocumentChange = useCallback(() => {\n message.text = inMemoryContentRef.current;\n }, [message]);\n\n useOnTransition(editing, true, false, saveDocumentChange);\n\n const { parentRef, focusAttributes, view } = useTextEditor(\n () => ({\n initialValue: message.text,\n extensions: [\n createBasicExtensions({ readonly: !isAuthor || !editing }),\n createThemeExtensions({ themeMode }),\n command,\n EditorView.updateListener.of((update) => {\n if (update.docChanged) {\n handleDocumentChange(update.state.doc.toString());\n }\n }),\n ],\n }),\n [message.text, editing, isAuthor, themeMode, handleDocumentChange],\n );\n\n useEffect(() => {\n editing && view?.focus();\n }, [editing, view]);\n\n useOnEditAnalytics(message, !!editing);\n\n return <div role='none' ref={parentRef} className='mie-4' {...focusAttributes} />;\n};\n\nconst MessageBlockObjectTile: MosaicTileComponent<EchoReactiveObject<any>> = forwardRef(\n ({ draggableStyle, draggableProps, item, active, ...props }, forwardedRef) => {\n let title = item.name ?? item.title ?? item.__typename ?? 'Object';\n if (typeof title !== 'string') {\n title = title?.content ?? '';\n }\n\n return (\n <div\n role='group'\n className={mx('grid col-span-3 py-1 pr-4', hoverableControls, hoverableFocusedWithinControls)}\n style={draggableStyle}\n ref={forwardedRef}\n >\n <DensityProvider density='fine'>\n <Surface\n role='card'\n limit={1}\n data={{ content: item }}\n draggableProps={draggableProps}\n fallback={title}\n {...props}\n />\n </DensityProvider>\n </div>\n );\n },\n);\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { StreamLanguage, HighlightStyle, syntaxHighlighting } from '@codemirror/language';\nimport { type Extension } from '@codemirror/state';\n\nimport { tags } from '@dxos/react-ui-editor';\nimport { mx, tagRoot } from '@dxos/react-ui-theme';\n\n/**\n * https://github.com/codemirror/stream-parser/blob/main/test/test-stream-parser.ts\n */\nconst parser = StreamLanguage.define<{ count: number }>({\n startState: () => ({ count: 0 }),\n token: (stream, state) => {\n state.count++;\n if (stream.eatSpace()) {\n return null;\n }\n if (state.count === 1 && stream.match(/^(\\/\\w+)/)) {\n return 'tagName';\n }\n stream.next();\n return null;\n },\n});\n\nconst styles = HighlightStyle.define([\n {\n tag: tags.tagName,\n class: mx(tagRoot({ palette: 'cyan' }), 'text-baseText font-medium'),\n },\n]);\n\nexport const command: Extension = [parser, syntaxHighlighting(styles)];\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { generateName } from '@dxos/display-name';\nimport { type PublicKey } from '@dxos/react-client';\nimport { type Identity } from '@dxos/react-client/halo';\nimport { type MessageMetadata } from '@dxos/react-ui-thread';\nimport { hexToFallback } from '@dxos/util';\n\nexport type MessagePropertiesProvider = (identityKey: PublicKey | undefined) => MessageMetadata;\n\nexport const getMessageMetadata = (id: string, identity?: Identity): MessageMetadata => {\n const fallback = hexToFallback(identity?.identityKey.toHex() ?? '0');\n return {\n id,\n authorId: identity?.identityKey.toHex(),\n authorName:\n identity?.profile?.displayName ??\n (identity?.identityKey ? generateName(identity.identityKey.toHex()) : undefined),\n authorAvatarProps: {\n hue: identity?.profile?.data?.hue ?? fallback.hue,\n emoji: identity?.profile?.data?.emoji ?? fallback.emoji,\n },\n };\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["useEffect", "useState", "useStatus", "space", "channel", "processing", "setProcessing", "useState", "useEffect", "unsubscribe", "listen", "status", "event", "payload", "t", "setInterval", "prev", "ts", "Date", "now", "undefined", "clearInterval", "useCallback", "useIntentDispatcher", "ObservabilityAction", "getSpace", "useOnTransition", "useAnalyticsCallback", "spaceId", "name", "meta", "dispatch", "useIntentDispatcher", "useCallback", "dynamicMeta", "action", "ObservabilityAction", "SEND_EVENT", "data", "properties", "useOnEditAnalytics", "message", "editing", "space", "getSpace", "onEditAnalytics", "id", "messageId", "messageLength", "text", "length", "useOnTransition", "React", "useLayoutEffect", "useMemo", "useRef", "useState", "create", "MessageType", "fullyQualifiedId", "getSpace", "useMembers", "useIdentity", "Icon", "ScrollArea", "useThemeContext", "useTranslation", "PlankHeading", "createBasicExtensions", "createThemeExtensions", "listener", "mx", "MessageTextbox", "Thread", "ThreadFooter", "threadLayout", "nonNullable", "EditorView", "Check", "PencilSimple", "X", "React", "forwardRef", "useCallback", "useEffect", "useRef", "useState", "Surface", "PublicKey", "useIdentity", "Button", "ButtonGroup", "DensityProvider", "Tooltip", "useOnTransition", "useThemeContext", "useTranslation", "createBasicExtensions", "createThemeExtensions", "useTextEditor", "Mosaic", "getSize", "hoverableControlItem", "hoverableControls", "hoverableFocusedWithinControls", "mx", "MessageHeading", "MessageRoot", "nonNullable", "StreamLanguage", "HighlightStyle", "syntaxHighlighting", "tags", "mx", "tagRoot", "parser", "StreamLanguage", "define", "startState", "count", "token", "stream", "state", "eatSpace", "match", "next", "styles", "HighlightStyle", "tag", "tags", "tagName", "class", "mx", "tagRoot", "palette", "command", "syntaxHighlighting", "generateName", "hexToFallback", "getMessageMetadata", "id", "identity", "fallback", "hexToFallback", "identityKey", "toHex", "authorId", "authorName", "profile", "displayName", "generateName", "undefined", "authorAvatarProps", "hue", "data", "emoji", "messageControlClassNames", "hoverableControlItem", "MessageContainer", "message", "members", "onDelete", "senderIdentity", "find", "member", "sender", "identityKey", "PublicKey", "equals", "identity", "messageMetadata", "getMessageMetadata", "id", "userIsAuthor", "useIdentity", "toHex", "authorId", "editing", "setEditing", "useState", "handleDelete", "useCallback", "t", "useTranslation", "THREAD_PLUGIN", "editLabel", "deleteLabel", "MessageRoot", "classNames", "hoverableControls", "hoverableFocusedWithinControls", "MessageHeading", "authorName", "timestamp", "ButtonGroup", "Tooltip", "Root", "Trigger", "asChild", "Button", "variant", "data-testid", "onClick", "span", "className", "Check", "getSize", "PencilSimple", "Portal", "Content", "Arrow", "X", "TextboxBlock", "isAuthor", "parts", "filter", "nonNullable", "map", "part", "index", "MessagePart", "key", "Mosaic", "Container", "DraggableTile", "type", "THREAD_ITEM", "path", "item", "Component", "MessageBlockObjectTile", "themeMode", "useThemeContext", "inMemoryContentRef", "useRef", "text", "handleDocumentChange", "newState", "current", "saveDocumentChange", "useOnTransition", "parentRef", "focusAttributes", "view", "useTextEditor", "initialValue", "extensions", "createBasicExtensions", "readonly", "createThemeExtensions", "command", "EditorView", "updateListener", "of", "update", "docChanged", "state", "doc", "toString", "useEffect", "focus", "useOnEditAnalytics", "div", "role", "ref", "forwardRef", "draggableStyle", "draggableProps", "active", "props", "forwardedRef", "title", "name", "__typename", "content", "mx", "style", "DensityProvider", "density", "Surface", "limit", "data", "fallback", "ChatHeading", "attendableId", "t", "useTranslation", "THREAD_PLUGIN", "React", "div", "role", "className", "PlankHeading", "Button", "Icon", "icon", "size", "Label", "ChatContainer", "thread", "context", "current", "autoFocusTextbox", "identity", "useIdentity", "space", "getSpace", "members", "useMembers", "key", "activity", "useStatus", "fullyQualifiedId", "_count", "_setCount", "useState", "rerenderEditor", "count", "autoFocus", "setAutoFocus", "threadScrollRef", "useRef", "themeMode", "useThemeContext", "textboxMetadata", "getMessageMetadata", "messageRef", "extensions", "useMemo", "createBasicExtensions", "placeholder", "createThemeExtensions", "listener", "onChange", "text", "command", "scrollToEnd", "behavior", "setTimeout", "scrollIntoView", "block", "useLayoutEffect", "handleCreate", "length", "messages", "push", "create", "MessageType", "sender", "identityKey", "toHex", "timestamp", "Date", "toISOString", "handleDelete", "id", "messageIndex", "filter", "nonNullable", "findIndex", "message", "splice", "Thread", "classNames", "ScrollArea", "Root", "Viewport", "mx", "threadLayout", "map", "MessageContainer", "onDelete", "ref", "Scrollbar", "Thumb", "MessageTextbox", "onSend", "ThreadFooter"]
7
+ }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ThreadAction
3
- } from "./chunk-U5UVX4ZP.mjs";
3
+ } from "./chunk-GJRBBPXI.mjs";
4
4
  import {
5
5
  ChatContainer,
6
6
  ChatHeading,
@@ -10,29 +10,27 @@ import {
10
10
  useAnalyticsCallback,
11
11
  useOnEditAnalytics,
12
12
  useStatus
13
- } from "./chunk-AVC4CGJM.mjs";
13
+ } from "./chunk-XF5QKI75.mjs";
14
14
  import {
15
15
  THREAD_ITEM,
16
16
  THREAD_PLUGIN,
17
17
  meta_default
18
- } from "./chunk-5IBJO53M.mjs";
18
+ } from "./chunk-7NUYW5IW.mjs";
19
19
 
20
20
  // packages/plugins/plugin-thread/src/ThreadPlugin.tsx
21
- import { Chat } from "@phosphor-icons/react";
22
21
  import { computed, effect } from "@preact/signals-core";
23
22
  import React6 from "react";
24
- import { LayoutAction as LayoutAction2, NavigationAction, parseIntentPlugin, parseNavigationPlugin, resolvePlugin, parseGraphPlugin, SLUG_PATH_SEPARATOR, SLUG_COLLECTION_INDICATOR, isLayoutParts, parseMetadataResolverPlugin } from "@dxos/app-framework";
23
+ import { LayoutAction as LayoutAction2, NavigationAction, parseIntentPlugin, parseNavigationPlugin, resolvePlugin, isLayoutParts, parseMetadataResolverPlugin } from "@dxos/app-framework";
25
24
  import { getTypename } from "@dxos/echo-schema";
26
25
  import { create as create2 } from "@dxos/echo-schema";
27
26
  import { LocalStorageStore } from "@dxos/local-storage";
28
27
  import { log } from "@dxos/log";
29
- import { parseAttentionPlugin } from "@dxos/plugin-attention";
30
28
  import { parseClientPlugin } from "@dxos/plugin-client";
31
- import { createExtension, isActionGroup } from "@dxos/plugin-graph";
29
+ import { createExtension, isActionGroup, toSignal } from "@dxos/plugin-graph";
32
30
  import { ObservabilityAction } from "@dxos/plugin-observability/meta";
33
31
  import { SpaceAction } from "@dxos/plugin-space";
34
32
  import { ThreadType, MessageType as MessageType2, ChannelType } from "@dxos/plugin-space/types";
35
- import { getSpace as getSpace2, getTextInRange, Filter, createDocAccessor, fullyQualifiedId as fullyQualifiedId4, loadObjectReferences } from "@dxos/react-client/echo";
33
+ import { getSpace as getSpace2, getTextInRange, createDocAccessor, fullyQualifiedId as fullyQualifiedId4, loadObjectReferences } from "@dxos/react-client/echo";
36
34
  import { comments, createExternalCommentSync, listener as listener2 } from "@dxos/react-ui-editor";
37
35
  import { translations as threadTranslations } from "@dxos/react-ui-thread";
38
36
  import { nonNullable as nonNullable3 } from "@dxos/util";
@@ -56,7 +54,7 @@ var ThreadSettings = ({ settings }) => {
56
54
 
57
55
  // packages/plugins/plugin-thread/src/components/CommentContainer.tsx
58
56
  import { CheckCircle, X } from "@phosphor-icons/react";
59
- import React2, { useCallback, useEffect, useMemo, useRef, useState } from "react";
57
+ import React2, { useCallback, useMemo, useRef, useState } from "react";
60
58
  import { create } from "@dxos/echo-schema";
61
59
  import { MessageType } from "@dxos/plugin-space/types";
62
60
  import { fullyQualifiedId, getSpace, useMembers } from "@dxos/react-client/echo";
@@ -112,14 +110,13 @@ var DeleteThreadButton = ({ onDelete }) => {
112
110
  classNames: "z-[21]"
113
111
  }, label, /* @__PURE__ */ React2.createElement(Tooltip.Arrow, null))));
114
112
  };
115
- var CommentContainer = ({ thread, detached, context, current, autoFocusTextbox, onAttend, onThreadDelete, onMessageDelete, onResolve, onComment }) => {
113
+ var CommentContainer = ({ thread, detached, context, current, onAttend, onThreadDelete, onMessageDelete, onResolve, onComment }) => {
116
114
  const identity = useIdentity();
117
115
  const space = getSpace(thread);
118
116
  const members = useMembers(space?.key);
119
117
  const activity = useStatus(space, fullyQualifiedId(thread));
120
118
  const { t } = useTranslation2(THREAD_PLUGIN);
121
119
  const threadScrollRef = useRef(null);
122
- const [autoFocus, setAutoFocus] = useState(!!autoFocusTextbox);
123
120
  const { themeMode } = useThemeContext();
124
121
  const textboxMetadata = getMessageMetadata(fullyQualifiedId(thread), identity);
125
122
  const [_count, _setCount] = useState(0);
@@ -139,11 +136,6 @@ var CommentContainer = ({ thread, detached, context, current, autoFocusTextbox,
139
136
  ], [
140
137
  _count
141
138
  ]);
142
- useEffect(() => {
143
- setAutoFocus(!!autoFocusTextbox);
144
- }, [
145
- autoFocusTextbox
146
- ]);
147
139
  const scrollToEnd = (behavior) => setTimeout(() => threadScrollRef.current?.scrollIntoView({
148
140
  behavior,
149
141
  block: "end"
@@ -162,7 +154,6 @@ var CommentContainer = ({ thread, detached, context, current, autoFocusTextbox,
162
154
  }));
163
155
  onComment?.(thread);
164
156
  messageRef.current = "";
165
- setAutoFocus(true);
166
157
  scrollToEnd("instant");
167
158
  rerenderEditor();
168
159
  return true;
@@ -201,7 +192,6 @@ var CommentContainer = ({ thread, detached, context, current, autoFocusTextbox,
201
192
  onDelete: (id) => onMessageDelete?.(id)
202
193
  })), /* @__PURE__ */ React2.createElement(MessageTextbox, {
203
194
  extensions,
204
- autoFocus,
205
195
  onSend: handleCreate,
206
196
  ...textboxMetadata
207
197
  }), /* @__PURE__ */ React2.createElement(ThreadFooter, {
@@ -214,27 +204,15 @@ var CommentContainer = ({ thread, detached, context, current, autoFocusTextbox,
214
204
  };
215
205
 
216
206
  // packages/plugins/plugin-thread/src/components/CommentsContainer.tsx
217
- import { ChatText, Quotes } from "@phosphor-icons/react";
218
- import React3, { useEffect as useEffect2 } from "react";
207
+ import { ChatText } from "@phosphor-icons/react";
208
+ import React3, { useEffect } from "react";
219
209
  import { fullyQualifiedId as fullyQualifiedId2 } from "@dxos/react-client/echo";
220
210
  import { useTranslation as useTranslation3, Trans } from "@dxos/react-ui";
221
- import { PlankHeading, plankHeadingIconProps } from "@dxos/react-ui-deck";
222
211
  import { descriptionText, mx as mx2 } from "@dxos/react-ui-theme";
223
- var CommentsHeading = ({ attendableId }) => {
224
- const { t } = useTranslation3(THREAD_PLUGIN);
225
- return /* @__PURE__ */ React3.createElement("div", {
226
- role: "none",
227
- className: "flex items-center"
228
- }, /* @__PURE__ */ React3.createElement(PlankHeading.Button, {
229
- attendableId
230
- }, /* @__PURE__ */ React3.createElement(Quotes, plankHeadingIconProps)), /* @__PURE__ */ React3.createElement(PlankHeading.Label, {
231
- attendableId
232
- }, t("comments heading")));
233
- };
234
- var CommentsContainer = ({ threads, detached = [], currentId, autoFocusCurrentTextbox, showResolvedThreads, onThreadAttend, onThreadDelete, onMessageDelete, onThreadToggleResolved, ...props }) => {
212
+ var CommentsContainer = ({ threads, detached = [], currentId, showResolvedThreads, onThreadAttend, onThreadDelete, onMessageDelete, onThreadToggleResolved, ...props }) => {
235
213
  const { t } = useTranslation3(THREAD_PLUGIN);
236
214
  const filteredThreads = showResolvedThreads ? threads : threads.filter((thread) => !(thread?.status === "resolved"));
237
- useEffect2(() => {
215
+ useEffect(() => {
238
216
  if (currentId) {
239
217
  document.getElementById(currentId)?.scrollIntoView({
240
218
  behavior: "smooth",
@@ -251,7 +229,6 @@ var CommentsContainer = ({ threads, detached = [], currentId, autoFocusCurrentTe
251
229
  thread,
252
230
  current: currentId === threadId,
253
231
  detached: detached.includes(threadId),
254
- autoFocusTextbox: autoFocusCurrentTextbox && currentId === threadId,
255
232
  ...onThreadAttend && {
256
233
  onAttend: () => onThreadAttend(thread)
257
234
  },
@@ -283,18 +260,18 @@ var CommentsContainer = ({ threads, detached = [], currentId, autoFocusCurrentTe
283
260
  };
284
261
 
285
262
  // packages/plugins/plugin-thread/src/components/index.ts
286
- var ThreadMain = React4.lazy(() => import("./ThreadMain-DU6LBSN3.mjs"));
287
- var ThreadArticle = React4.lazy(() => import("./ThreadArticle-6L6BGE4Z.mjs"));
263
+ var ThreadMain = React4.lazy(() => import("./ThreadMain-ML3P4XSD.mjs"));
264
+ var ThreadArticle = React4.lazy(() => import("./ThreadArticle-4VU752F4.mjs"));
288
265
 
289
266
  // packages/plugins/plugin-thread/src/components/ThreadComplementary.tsx
290
- import React5, { useEffect as useEffect3, useMemo as useMemo2 } from "react";
267
+ import React5, { useEffect as useEffect2, useMemo as useMemo2 } from "react";
291
268
  import { LayoutAction, useIntentDispatcher, useResolvePlugins } from "@dxos/app-framework";
292
269
  import { fullyQualifiedId as fullyQualifiedId3 } from "@dxos/react-client/echo";
293
270
  import { ScrollArea } from "@dxos/react-ui";
294
- import { createAttendableAttributes, useAttentionContext } from "@dxos/react-ui-attention";
271
+ import { useAttended } from "@dxos/react-ui-attention";
295
272
  import { nonNullable as nonNullable2 } from "@dxos/util";
296
273
  var providesThreadsConfig = (plugin) => "thread" in plugin.provides ? plugin : void 0;
297
- var ThreadComplementary = ({ role, subject, stagedThreads, current, focus, showResolvedThreads }) => {
274
+ var ThreadComplementary = ({ role, subject, stagedThreads, current, showResolvedThreads }) => {
298
275
  const dispatch = useIntentDispatcher();
299
276
  const threadsIntegrators = useResolvePlugins(providesThreadsConfig);
300
277
  const threadProvides = useMemo2(() => threadsIntegrators.map((p) => p.provides.thread), [
@@ -319,7 +296,7 @@ var ThreadComplementary = ({ role, subject, stagedThreads, current, focus, showR
319
296
  }, [
320
297
  threads
321
298
  ]);
322
- useEffect3(() => {
299
+ useEffect2(() => {
323
300
  if (!sort) {
324
301
  return;
325
302
  }
@@ -328,22 +305,17 @@ var ThreadComplementary = ({ role, subject, stagedThreads, current, focus, showR
328
305
  sort,
329
306
  threads
330
307
  ]);
331
- const { attended } = useAttentionContext("Thread Complementary");
308
+ const attended = useAttended();
332
309
  const qualifiedSubjectId = fullyQualifiedId3(subject);
333
- const attendableAttrs = createAttendableAttributes(qualifiedSubjectId);
334
310
  return /* @__PURE__ */ React5.createElement("div", {
335
311
  role: "none",
336
- className: "contents group/attention",
337
- ...attendableAttrs
338
- }, role === "complementary" && /* @__PURE__ */ React5.createElement(CommentsHeading, {
339
- attendableId: qualifiedSubjectId
340
- }), /* @__PURE__ */ React5.createElement(ScrollArea.Root, {
312
+ className: "contents"
313
+ }, /* @__PURE__ */ React5.createElement(ScrollArea.Root, {
341
314
  classNames: "row-span-2"
342
315
  }, /* @__PURE__ */ React5.createElement(ScrollArea.Viewport, null, /* @__PURE__ */ React5.createElement(CommentsContainer, {
343
316
  threads,
344
317
  detached: detachedIds,
345
- currentId: attended.has(qualifiedSubjectId) ? current : void 0,
346
- autoFocusCurrentTextbox: focus,
318
+ currentId: attended.includes(qualifiedSubjectId) ? current : void 0,
347
319
  showResolvedThreads,
348
320
  onThreadAttend: (thread) => {
349
321
  const threadId = fullyQualifiedId3(thread);
@@ -457,7 +429,6 @@ var ThreadPlugin = () => {
457
429
  }
458
430
  return viewStore[subjectId];
459
431
  };
460
- let attentionPlugin;
461
432
  let navigationPlugin;
462
433
  let intentPlugin;
463
434
  const unsubscribeCallbacks = [];
@@ -470,38 +441,8 @@ var ThreadPlugin = () => {
470
441
  allowUndefined: true
471
442
  })
472
443
  });
473
- attentionPlugin = resolvePlugin(plugins, parseAttentionPlugin);
474
444
  navigationPlugin = resolvePlugin(plugins, parseNavigationPlugin);
475
445
  intentPlugin = resolvePlugin(plugins, parseIntentPlugin);
476
- const graphPlugin = resolvePlugin(plugins, parseGraphPlugin);
477
- const client = resolvePlugin(plugins, parseClientPlugin)?.provides.client;
478
- if (!client) {
479
- return;
480
- }
481
- const channelsQuery = client.spaces.query(Filter.schema(ChannelType));
482
- const queryUnsubscribe = channelsQuery.subscribe();
483
- const unsubscribe = effect(() => {
484
- const attention = attentionPlugin?.provides.attention;
485
- if (!attention?.attended) {
486
- return;
487
- }
488
- const firstAttendedNodeWithComments = Array.from(attention.attended).map((id) => graphPlugin?.provides.graph.findNode(id)).find((node) => {
489
- const data = node?.data;
490
- return Array.isArray(data?.threads) && data.threads.length > 0;
491
- });
492
- if (firstAttendedNodeWithComments) {
493
- void intentPlugin?.provides.intent.dispatch({
494
- action: NavigationAction.OPEN,
495
- data: {
496
- activeParts: {
497
- complementary: `${firstAttendedNodeWithComments.id}${SLUG_PATH_SEPARATOR}comments`
498
- }
499
- }
500
- });
501
- }
502
- });
503
- unsubscribeCallbacks.push(queryUnsubscribe);
504
- unsubscribeCallbacks.push(unsubscribe);
505
446
  },
506
447
  unload: async () => {
507
448
  unsubscribeCallbacks.forEach((unsubscribe) => unsubscribe());
@@ -517,8 +458,7 @@ var ThreadPlugin = () => {
517
458
  ns: THREAD_PLUGIN
518
459
  }
519
460
  ],
520
- icon: (props) => /* @__PURE__ */ React6.createElement(Chat, props),
521
- iconSymbol: "ph--chat--regular",
461
+ icon: "ph--chat--regular",
522
462
  // TODO(wittjosiah): Move out of metadata.
523
463
  loadReferences: (channel) => loadObjectReferences(channel, (channel2) => channel2.threads)
524
464
  },
@@ -577,29 +517,36 @@ var ThreadPlugin = () => {
577
517
  if (!id.endsWith("~comments")) {
578
518
  return;
579
519
  }
580
- const docId = id.split("~").at(0);
581
- const [spaceId, objectId] = docId?.split(":") ?? [];
520
+ const subjectId = id.split("~").at(0);
521
+ const [spaceId, objectId] = subjectId?.split(":") ?? [];
582
522
  const space = client.spaces.get().find((space2) => space2.id === spaceId);
583
- const doc = space?.db.getObjectById(objectId);
584
- if (!doc || !docId) {
523
+ const object = toSignal((onChange) => {
524
+ const timeout = setTimeout(async () => {
525
+ await space?.db.loadObjectById(objectId);
526
+ onChange();
527
+ });
528
+ return () => clearTimeout(timeout);
529
+ }, () => space?.db.getObjectById(objectId), subjectId);
530
+ if (!object || !subjectId) {
585
531
  return;
586
532
  }
587
- const docMeta = metadataResolver(getTypename(doc) ?? "");
588
- const label = docMeta.label?.(doc) || doc.name || docMeta.placeholder || [
533
+ const meta = metadataResolver(getTypename(object) ?? "");
534
+ const label = meta.label?.(object) || object.name || meta.placeholder || [
589
535
  "unnamed object threads label",
590
536
  {
591
537
  ns: THREAD_PLUGIN
592
538
  }
593
539
  ];
594
- const viewState = getViewState(docId);
540
+ const viewState = getViewState(subjectId);
595
541
  return {
596
542
  id,
597
543
  type: "orphan-comments-for-subject",
598
- data: doc,
544
+ data: null,
599
545
  properties: {
600
- icon: meta_default.iconComponent,
546
+ icon: "ph--chat-text--regular",
601
547
  label,
602
- showResolvedThreads: viewState.showResolvedThreads
548
+ showResolvedThreads: viewState.showResolvedThreads,
549
+ object
603
550
  }
604
551
  };
605
552
  },
@@ -639,7 +586,7 @@ var ThreadPlugin = () => {
639
586
  menuItemType: "toggle",
640
587
  isChecked: viewState.showResolvedThreads,
641
588
  testId: "threadPlugin.toggleShowResolved",
642
- iconSymbol: viewState.showResolvedThreads ? "ph--eye-slash--regular" : "ph--eye--regular"
589
+ icon: viewState.showResolvedThreads ? "ph--eye-slash--regular" : "ph--eye--regular"
643
590
  }
644
591
  }
645
592
  ];
@@ -684,8 +631,7 @@ var ThreadPlugin = () => {
684
631
  ns: THREAD_PLUGIN
685
632
  }
686
633
  ],
687
- icon: (props) => /* @__PURE__ */ React6.createElement(Chat, props),
688
- iconSymbol: "ph--chat--regular",
634
+ icon: "ph--chat--regular",
689
635
  testId: "threadPlugin.createObject"
690
636
  }
691
637
  }
@@ -743,7 +689,6 @@ var ThreadPlugin = () => {
743
689
  subject: data.subject,
744
690
  stagedThreads: state.staging[fullyQualifiedId4(data.subject)],
745
691
  current: state.current,
746
- focus: true,
747
692
  showResolvedThreads
748
693
  });
749
694
  }
@@ -764,7 +709,7 @@ var ThreadPlugin = () => {
764
709
  } catch (e) {
765
710
  log.error("Subject does not support threads array", subject?.typename, {
766
711
  F: __dxlog_file,
767
- L: 369,
712
+ L: 331,
768
713
  S: void 0,
769
714
  C: (f, a) => f(...a)
770
715
  });
@@ -790,19 +735,10 @@ var ThreadPlugin = () => {
790
735
  data: thread,
791
736
  intents: [
792
737
  [
793
- {
794
- action: NavigationAction.OPEN,
795
- data: {
796
- activeParts: {
797
- complementary: `${subjectId}${SLUG_PATH_SEPARATOR}comments${SLUG_COLLECTION_INDICATOR}`
798
- }
799
- }
800
- },
801
738
  {
802
739
  action: ThreadAction.SELECT,
803
740
  data: {
804
- current: fullyQualifiedId4(thread),
805
- focus: true
741
+ current: fullyQualifiedId4(thread)
806
742
  }
807
743
  },
808
744
  {
@@ -829,7 +765,6 @@ var ThreadPlugin = () => {
829
765
  }
830
766
  }
831
767
  case ThreadAction.SELECT: {
832
- state.focus = intent.data?.current === state.current ? state.focus : intent.data?.focus;
833
768
  state.current = intent.data?.current;
834
769
  return {
835
770
  data: true
@@ -1089,12 +1024,12 @@ var ThreadPlugin = () => {
1089
1024
  });
1090
1025
  }
1091
1026
  }),
1092
- 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) => ({
1093
1028
  id: fullyQualifiedId4(thread),
1094
1029
  cursor: thread.anchor
1095
1030
  }))),
1096
1031
  comments({
1097
- id: doc.id,
1032
+ id: fullyQualifiedId4(doc),
1098
1033
  onCreate: ({ cursor }) => {
1099
1034
  const [start, end] = cursor.split(":");
1100
1035
  const name = doc.content && getTextInRange(createDocAccessor(doc.content, [