@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.
- package/dist/lib/browser/{ThreadArticle-6L6BGE4Z.mjs → ThreadArticle-4VU752F4.mjs} +3 -3
- package/dist/lib/{node-esm/ThreadMain-DU6LBSN3.mjs → browser/ThreadMain-ML3P4XSD.mjs} +3 -3
- package/dist/lib/browser/{chunk-5IBJO53M.mjs → chunk-7NUYW5IW.mjs} +2 -5
- package/dist/lib/browser/chunk-7NUYW5IW.mjs.map +7 -0
- package/dist/lib/{node-esm/chunk-U5UVX4ZP.mjs → browser/chunk-GJRBBPXI.mjs} +2 -2
- package/dist/lib/browser/{chunk-AVC4CGJM.mjs → chunk-XF5QKI75.mjs} +8 -6
- package/dist/lib/browser/chunk-XF5QKI75.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +46 -111
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/meta.mjs +1 -1
- package/dist/lib/browser/types.mjs +2 -2
- package/dist/lib/node/{ThreadArticle-7BWXVIJ4.cjs → ThreadArticle-ERUHPHVT.cjs} +7 -7
- package/dist/lib/node/{ThreadMain-XSRB6NKJ.cjs → ThreadMain-6DN7FDNB.cjs} +7 -7
- package/dist/lib/node/{chunk-BWBONZGU.cjs → chunk-6EVXCSDS.cjs} +5 -18
- package/dist/lib/node/chunk-6EVXCSDS.cjs.map +7 -0
- package/dist/lib/node/{chunk-4B2ARV7L.cjs → chunk-FXD3DYMO.cjs} +6 -6
- package/dist/lib/node/{chunk-T7TXCNHL.cjs → chunk-PZVUW4W2.cjs} +61 -59
- package/dist/lib/node/chunk-PZVUW4W2.cjs.map +7 -0
- package/dist/lib/node/index.cjs +145 -210
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/meta.cjs +4 -4
- package/dist/lib/node/meta.cjs.map +1 -1
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/types.cjs +3 -3
- package/dist/lib/node/types.cjs.map +1 -1
- package/dist/lib/node-esm/{ThreadArticle-6L6BGE4Z.mjs → ThreadArticle-NKI5F4W5.mjs} +4 -3
- package/dist/lib/node-esm/{ThreadArticle-6L6BGE4Z.mjs.map → ThreadArticle-NKI5F4W5.mjs.map} +1 -1
- package/dist/lib/{browser/ThreadMain-DU6LBSN3.mjs → node-esm/ThreadMain-2A3VQLCW.mjs} +4 -3
- package/dist/lib/node-esm/{ThreadMain-DU6LBSN3.mjs.map → ThreadMain-2A3VQLCW.mjs.map} +1 -1
- package/dist/lib/node-esm/{chunk-AVC4CGJM.mjs → chunk-A44C4MTQ.mjs} +9 -6
- package/dist/lib/node-esm/chunk-A44C4MTQ.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-5IBJO53M.mjs → chunk-Y475KZTX.mjs} +4 -5
- package/dist/lib/node-esm/chunk-Y475KZTX.mjs.map +7 -0
- package/dist/lib/{browser/chunk-U5UVX4ZP.mjs → node-esm/chunk-YO46JGAE.mjs} +3 -2
- package/dist/lib/node-esm/{chunk-U5UVX4ZP.mjs.map → chunk-YO46JGAE.mjs.map} +1 -1
- package/dist/lib/node-esm/index.mjs +47 -111
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/meta.mjs +2 -1
- package/dist/lib/node-esm/types.mjs +3 -2
- package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
- package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
- package/dist/types/src/components/CommentContainer.d.ts +1 -1
- package/dist/types/src/components/CommentContainer.d.ts.map +1 -1
- package/dist/types/src/components/CommentsContainer.d.ts +1 -5
- package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
- package/dist/types/src/components/ThreadComplementary.d.ts +1 -2
- package/dist/types/src/components/ThreadComplementary.d.ts.map +1 -1
- package/dist/types/src/components/testing.d.ts +2 -0
- package/dist/types/src/components/testing.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +1 -4
- package/dist/types/src/meta.d.ts.map +1 -1
- package/package.json +33 -33
- package/src/ThreadPlugin.tsx +31 -78
- package/src/components/ChatContainer.tsx +3 -4
- package/src/components/CommentContainer.tsx +8 -12
- package/src/components/CommentsContainer.tsx +1 -18
- package/src/components/ThreadComplementary.tsx +5 -12
- package/src/meta.tsx +1 -5
- package/dist/lib/browser/chunk-5IBJO53M.mjs.map +0 -7
- package/dist/lib/browser/chunk-AVC4CGJM.mjs.map +0 -7
- package/dist/lib/node/chunk-BWBONZGU.cjs.map +0 -7
- package/dist/lib/node/chunk-T7TXCNHL.cjs.map +0 -7
- package/dist/lib/node-esm/chunk-5IBJO53M.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-AVC4CGJM.mjs.map +0 -7
- /package/dist/lib/browser/{ThreadArticle-6L6BGE4Z.mjs.map → ThreadArticle-4VU752F4.mjs.map} +0 -0
- /package/dist/lib/browser/{ThreadMain-DU6LBSN3.mjs.map → ThreadMain-ML3P4XSD.mjs.map} +0 -0
- /package/dist/lib/browser/{chunk-U5UVX4ZP.mjs.map → chunk-GJRBBPXI.mjs.map} +0 -0
- /package/dist/lib/node/{ThreadArticle-7BWXVIJ4.cjs.map → ThreadArticle-ERUHPHVT.cjs.map} +0 -0
- /package/dist/lib/node/{ThreadMain-XSRB6NKJ.cjs.map → ThreadMain-6DN7FDNB.cjs.map} +0 -0
- /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-
|
|
4
|
-
import "./chunk-
|
|
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-
|
|
18
|
+
//# sourceMappingURL=ThreadArticle-4VU752F4.mjs.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ChatContainer
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
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-
|
|
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
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
20
|
+
//# sourceMappingURL=chunk-GJRBBPXI.mjs.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
THREAD_ITEM,
|
|
3
3
|
THREAD_PLUGIN
|
|
4
|
-
} from "./chunk-
|
|
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
|
|
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(
|
|
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-
|
|
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-
|
|
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-
|
|
13
|
+
} from "./chunk-XF5QKI75.mjs";
|
|
14
14
|
import {
|
|
15
15
|
THREAD_ITEM,
|
|
16
16
|
THREAD_PLUGIN,
|
|
17
17
|
meta_default
|
|
18
|
-
} from "./chunk-
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
|
218
|
-
import React3, { useEffect
|
|
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
|
|
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
|
-
|
|
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-
|
|
287
|
-
var ThreadArticle = React4.lazy(() => import("./ThreadArticle-
|
|
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
|
|
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 {
|
|
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,
|
|
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
|
-
|
|
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
|
|
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
|
|
337
|
-
|
|
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.
|
|
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:
|
|
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
|
|
581
|
-
const [spaceId, objectId] =
|
|
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
|
|
584
|
-
|
|
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
|
|
588
|
-
const label =
|
|
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(
|
|
540
|
+
const viewState = getViewState(subjectId);
|
|
595
541
|
return {
|
|
596
542
|
id,
|
|
597
543
|
type: "orphan-comments-for-subject",
|
|
598
|
-
data:
|
|
544
|
+
data: null,
|
|
599
545
|
properties: {
|
|
600
|
-
icon:
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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
|
|
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
|
|
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, [
|