@dxos/plugin-thread 0.8.0 → 0.8.1-main.81238a8
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/ChannelContainer-6YTHIJPS.mjs +74 -0
- package/dist/lib/browser/ChannelContainer-6YTHIJPS.mjs.map +7 -0
- package/dist/lib/browser/{chunk-UPKU23DA.mjs → chunk-3BIHVVEA.mjs} +5 -5
- package/dist/lib/browser/chunk-3BIHVVEA.mjs.map +7 -0
- package/dist/lib/browser/{chunk-BNEWNQBO.mjs → chunk-K3NUEKPS.mjs} +14 -2
- package/dist/lib/browser/{chunk-BNEWNQBO.mjs.map → chunk-K3NUEKPS.mjs.map} +4 -4
- package/dist/lib/browser/{chunk-NAO3LZMZ.mjs → chunk-NOOMCX5E.mjs} +3 -2
- package/dist/lib/browser/chunk-NOOMCX5E.mjs.map +7 -0
- package/dist/lib/browser/{chunk-YK3ICB7G.mjs → chunk-OPDRTA7Q.mjs} +2 -2
- package/dist/lib/browser/{chunk-YK3ICB7G.mjs.map → chunk-OPDRTA7Q.mjs.map} +1 -1
- package/dist/lib/browser/{chunk-636QDHE3.mjs → chunk-WBJLUUOK.mjs} +1 -1
- package/dist/lib/browser/{chunk-636QDHE3.mjs.map → chunk-WBJLUUOK.mjs.map} +2 -2
- package/dist/lib/browser/index.mjs +25 -15
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/{intent-resolver-FAFQ54NP.mjs → intent-resolver-WAVFYWIS.mjs} +5 -5
- package/dist/lib/browser/{intent-resolver-FAFQ54NP.mjs.map → intent-resolver-WAVFYWIS.mjs.map} +2 -2
- package/dist/lib/browser/{markdown-RPYOUBVR.mjs → markdown-R6VIT67G.mjs} +6 -6
- package/dist/lib/browser/markdown-R6VIT67G.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{react-surface-Y4MUSICN.mjs → react-surface-2MKPJW4D.mjs} +15 -28
- package/dist/lib/browser/react-surface-2MKPJW4D.mjs.map +7 -0
- package/dist/lib/browser/{settings-WQTE5AEZ.mjs → settings-2EJW5SUY.mjs} +3 -3
- package/dist/lib/browser/{state-GNFUURIC.mjs → state-HPUFZBB7.mjs} +4 -3
- package/dist/lib/browser/state-HPUFZBB7.mjs.map +7 -0
- package/dist/lib/browser/types.mjs +2 -2
- package/dist/lib/node/ChannelContainer-AVRYTS7L.cjs +98 -0
- package/dist/lib/node/ChannelContainer-AVRYTS7L.cjs.map +7 -0
- package/dist/lib/node/{chunk-AWSTZ2KN.cjs → chunk-E6HDHBUB.cjs} +28 -4
- package/dist/lib/node/chunk-E6HDHBUB.cjs.map +7 -0
- package/dist/lib/node/{chunk-RQR5Z23G.cjs → chunk-EHS2JT63.cjs} +12 -12
- package/dist/lib/node/chunk-EHS2JT63.cjs.map +7 -0
- package/dist/lib/node/{chunk-CMEMMYDL.cjs → chunk-GBL2K6YX.cjs} +6 -6
- package/dist/lib/node/{chunk-CMEMMYDL.cjs.map → chunk-GBL2K6YX.cjs.map} +1 -1
- package/dist/lib/node/{chunk-F735VMTN.cjs → chunk-ONLWOUYZ.cjs} +4 -4
- package/dist/lib/node/{chunk-F735VMTN.cjs.map → chunk-ONLWOUYZ.cjs.map} +2 -2
- package/dist/lib/node/{chunk-FPWNZ6TB.cjs → chunk-VEVJBOWK.cjs} +8 -7
- package/dist/lib/node/chunk-VEVJBOWK.cjs.map +7 -0
- package/dist/lib/node/index.cjs +62 -53
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/{intent-resolver-DVBEXJ33.cjs → intent-resolver-ESZ7YDRL.cjs} +22 -22
- package/dist/lib/node/{intent-resolver-DVBEXJ33.cjs.map → intent-resolver-ESZ7YDRL.cjs.map} +2 -2
- package/dist/lib/node/{markdown-ELRGISXE.cjs → markdown-KJJCSWOZ.cjs} +12 -12
- package/dist/lib/node/markdown-KJJCSWOZ.cjs.map +7 -0
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/{react-surface-7HLTN5XS.cjs → react-surface-YJNIS6CL.cjs} +35 -48
- package/dist/lib/node/react-surface-YJNIS6CL.cjs.map +7 -0
- package/dist/lib/node/{settings-7VQYARM5.cjs → settings-5YWRJNSN.cjs} +8 -8
- package/dist/lib/node/{state-TQWEZ6B3.cjs → state-JMI5ZXZI.cjs} +8 -7
- package/dist/lib/node/state-JMI5ZXZI.cjs.map +7 -0
- package/dist/lib/node/types.cjs +4 -4
- package/dist/lib/node/types.cjs.map +1 -1
- package/dist/lib/node-esm/ChannelContainer-2ZU33KAF.mjs +75 -0
- package/dist/lib/node-esm/ChannelContainer-2ZU33KAF.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-FXUATCLW.mjs → chunk-42F2DTMM.mjs} +1 -1
- package/dist/lib/node-esm/{chunk-FXUATCLW.mjs.map → chunk-42F2DTMM.mjs.map} +2 -2
- package/dist/lib/node-esm/{chunk-33NDMQQQ.mjs → chunk-B5VGBXRR.mjs} +2 -2
- package/dist/lib/node-esm/{chunk-33NDMQQQ.mjs.map → chunk-B5VGBXRR.mjs.map} +1 -1
- package/dist/lib/node-esm/{chunk-HLWJTUWZ.mjs → chunk-L4C7BEQZ.mjs} +14 -2
- package/dist/lib/node-esm/{chunk-HLWJTUWZ.mjs.map → chunk-L4C7BEQZ.mjs.map} +4 -4
- package/dist/lib/node-esm/{chunk-CISLDOH7.mjs → chunk-RN3V7SYL.mjs} +5 -5
- package/dist/lib/node-esm/chunk-RN3V7SYL.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-ZJITX3TO.mjs → chunk-TXW5SIBN.mjs} +3 -2
- package/dist/lib/node-esm/chunk-TXW5SIBN.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +25 -15
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/{intent-resolver-DHVLBNCC.mjs → intent-resolver-YLBQTBSE.mjs} +5 -5
- package/dist/lib/node-esm/{intent-resolver-DHVLBNCC.mjs.map → intent-resolver-YLBQTBSE.mjs.map} +2 -2
- package/dist/lib/node-esm/{markdown-23OB7EZG.mjs → markdown-LF4X5O6L.mjs} +6 -6
- package/dist/lib/node-esm/markdown-LF4X5O6L.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{react-surface-AZHTTR6J.mjs → react-surface-ZEDBXBP3.mjs} +15 -28
- package/dist/lib/node-esm/react-surface-ZEDBXBP3.mjs.map +7 -0
- package/dist/lib/node-esm/{settings-SGMM7UDT.mjs → settings-5EZW6KK4.mjs} +3 -3
- package/dist/lib/node-esm/{state-7MLR27YG.mjs → state-PSZO57LP.mjs} +4 -3
- package/dist/lib/node-esm/state-PSZO57LP.mjs.map +7 -0
- package/dist/lib/node-esm/types.mjs +2 -2
- package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/capabilities.d.ts +5 -0
- package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/components/ChannelContainer.d.ts +9 -0
- package/dist/types/src/components/ChannelContainer.d.ts.map +1 -0
- package/dist/types/src/components/ChatContainer.d.ts +3 -2
- package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
- package/dist/types/src/components/CommentContainer.d.ts +2 -1
- package/dist/types/src/components/CommentContainer.d.ts.map +1 -1
- package/dist/types/src/components/CommentsContainer.d.ts +2 -1
- package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
- package/dist/types/src/components/MessageContainer.d.ts +2 -1
- package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
- package/dist/types/src/components/ThreadComplementary.d.ts +2 -1
- package/dist/types/src/components/ThreadComplementary.d.ts.map +1 -1
- package/dist/types/src/components/ThreadSettings.d.ts +2 -1
- package/dist/types/src/components/ThreadSettings.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +3 -2
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/components/testing.d.ts +38 -38
- package/dist/types/src/components/testing.d.ts.map +1 -1
- package/dist/types/src/events.d.ts +4 -0
- package/dist/types/src/events.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +2 -0
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +2 -7
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/types.d.ts +2 -0
- package/dist/types/src/types.d.ts.map +1 -1
- package/package.json +31 -30
- package/src/ThreadPlugin.tsx +2 -1
- package/src/capabilities/capabilities.ts +6 -0
- package/src/capabilities/intent-resolver.ts +1 -1
- package/src/capabilities/react-surface.tsx +5 -16
- package/src/capabilities/state.ts +1 -1
- package/src/components/ChannelContainer.tsx +80 -0
- package/src/components/ChatContainer.tsx +1 -1
- package/src/components/CommentContainer.tsx +1 -1
- package/src/components/MessageContainer.tsx +1 -1
- package/src/components/ThreadComplementary.tsx +1 -1
- package/src/components/index.ts +1 -1
- package/src/events.ts +11 -0
- package/src/extensions/threads.ts +2 -2
- package/src/index.ts +2 -0
- package/src/meta.ts +2 -2
- package/src/types.ts +2 -0
- package/dist/lib/browser/ThreadContainer-6OP5AG2W.mjs +0 -19
- package/dist/lib/browser/ThreadContainer-6OP5AG2W.mjs.map +0 -7
- package/dist/lib/browser/chunk-NAO3LZMZ.mjs.map +0 -7
- package/dist/lib/browser/chunk-UPKU23DA.mjs.map +0 -7
- package/dist/lib/browser/chunk-VOMIDDNO.mjs +0 -15
- package/dist/lib/browser/chunk-VOMIDDNO.mjs.map +0 -7
- package/dist/lib/browser/markdown-RPYOUBVR.mjs.map +0 -7
- package/dist/lib/browser/react-surface-Y4MUSICN.mjs.map +0 -7
- package/dist/lib/browser/state-GNFUURIC.mjs.map +0 -7
- package/dist/lib/node/ThreadContainer-LTKKLPXX.cjs +0 -45
- package/dist/lib/node/ThreadContainer-LTKKLPXX.cjs.map +0 -7
- package/dist/lib/node/chunk-AWSTZ2KN.cjs.map +0 -7
- package/dist/lib/node/chunk-BHFHFTHO.cjs +0 -50
- package/dist/lib/node/chunk-BHFHFTHO.cjs.map +0 -7
- package/dist/lib/node/chunk-FPWNZ6TB.cjs.map +0 -7
- package/dist/lib/node/chunk-RQR5Z23G.cjs.map +0 -7
- package/dist/lib/node/markdown-ELRGISXE.cjs.map +0 -7
- package/dist/lib/node/react-surface-7HLTN5XS.cjs.map +0 -7
- package/dist/lib/node/state-TQWEZ6B3.cjs.map +0 -7
- package/dist/lib/node-esm/ThreadContainer-SV74JFRH.mjs +0 -20
- package/dist/lib/node-esm/ThreadContainer-SV74JFRH.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-CISLDOH7.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-PJPVEO7E.mjs +0 -17
- package/dist/lib/node-esm/chunk-PJPVEO7E.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-ZJITX3TO.mjs.map +0 -7
- package/dist/lib/node-esm/markdown-23OB7EZG.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-AZHTTR6J.mjs.map +0 -7
- package/dist/lib/node-esm/state-7MLR27YG.mjs.map +0 -7
- package/dist/types/src/components/ThreadContainer.d.ts +0 -7
- package/dist/types/src/components/ThreadContainer.d.ts.map +0 -1
- package/src/components/ThreadContainer.tsx +0 -22
- /package/dist/lib/browser/{settings-WQTE5AEZ.mjs.map → settings-2EJW5SUY.mjs.map} +0 -0
- /package/dist/lib/node/{settings-7VQYARM5.cjs.map → settings-5YWRJNSN.cjs.map} +0 -0
- /package/dist/lib/node-esm/{settings-SGMM7UDT.mjs.map → settings-5EZW6KK4.mjs.map} +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/plugin-thread",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.1-main.81238a8",
|
|
4
4
|
"description": "DXOS Threads Surface plugin",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -39,29 +39,30 @@
|
|
|
39
39
|
"@preact/signals-core": "^1.6.0",
|
|
40
40
|
"date-fns": "^3.3.1",
|
|
41
41
|
"lodash.get": "^4.4.2",
|
|
42
|
-
"@dxos/
|
|
43
|
-
"@dxos/
|
|
44
|
-
"@dxos/
|
|
45
|
-
"@dxos/
|
|
46
|
-
"@dxos/
|
|
47
|
-
"@dxos/
|
|
48
|
-
"@dxos/
|
|
49
|
-
"@dxos/
|
|
50
|
-
"@dxos/
|
|
51
|
-
"@dxos/plugin-
|
|
52
|
-
"@dxos/plugin-
|
|
53
|
-
"@dxos/plugin-markdown": "0.8.
|
|
54
|
-
"@dxos/plugin-
|
|
55
|
-
"@dxos/plugin-
|
|
56
|
-
"@dxos/
|
|
57
|
-
"@dxos/react-ui-attention": "0.8.
|
|
58
|
-
"@dxos/react-ui-
|
|
59
|
-
"@dxos/react-
|
|
60
|
-
"@dxos/react-ui-
|
|
61
|
-
"@dxos/react-ui-
|
|
62
|
-
"@dxos/react-ui-
|
|
63
|
-
"@dxos/
|
|
64
|
-
"@dxos/
|
|
42
|
+
"@dxos/app-framework": "0.8.1-main.81238a8",
|
|
43
|
+
"@dxos/async": "0.8.1-main.81238a8",
|
|
44
|
+
"@dxos/display-name": "0.8.1-main.81238a8",
|
|
45
|
+
"@dxos/echo-schema": "0.8.1-main.81238a8",
|
|
46
|
+
"@dxos/invariant": "0.8.1-main.81238a8",
|
|
47
|
+
"@dxos/live-object": "0.8.1-main.81238a8",
|
|
48
|
+
"@dxos/log": "0.8.1-main.81238a8",
|
|
49
|
+
"@dxos/local-storage": "0.8.1-main.81238a8",
|
|
50
|
+
"@dxos/plugin-attention": "0.8.1-main.81238a8",
|
|
51
|
+
"@dxos/plugin-client": "0.8.1-main.81238a8",
|
|
52
|
+
"@dxos/plugin-graph": "0.8.1-main.81238a8",
|
|
53
|
+
"@dxos/plugin-markdown": "0.8.1-main.81238a8",
|
|
54
|
+
"@dxos/plugin-deck": "0.8.1-main.81238a8",
|
|
55
|
+
"@dxos/plugin-observability": "0.8.1-main.81238a8",
|
|
56
|
+
"@dxos/plugin-space": "0.8.1-main.81238a8",
|
|
57
|
+
"@dxos/react-ui-attention": "0.8.1-main.81238a8",
|
|
58
|
+
"@dxos/react-ui-editor": "0.8.1-main.81238a8",
|
|
59
|
+
"@dxos/react-client": "0.8.1-main.81238a8",
|
|
60
|
+
"@dxos/react-ui-form": "0.8.1-main.81238a8",
|
|
61
|
+
"@dxos/react-ui-menu": "0.8.1-main.81238a8",
|
|
62
|
+
"@dxos/react-ui-stack": "0.8.1-main.81238a8",
|
|
63
|
+
"@dxos/react-ui-tabs": "0.8.1-main.81238a8",
|
|
64
|
+
"@dxos/react-ui-thread": "0.8.1-main.81238a8",
|
|
65
|
+
"@dxos/util": "0.8.1-main.81238a8"
|
|
65
66
|
},
|
|
66
67
|
"devDependencies": {
|
|
67
68
|
"@phosphor-icons/react": "^2.1.5",
|
|
@@ -71,17 +72,17 @@
|
|
|
71
72
|
"react": "~18.2.0",
|
|
72
73
|
"react-dom": "~18.2.0",
|
|
73
74
|
"vite": "5.4.7",
|
|
74
|
-
"@dxos/random": "0.8.
|
|
75
|
-
"@dxos/react-ui": "0.8.
|
|
76
|
-
"@dxos/react-ui-theme": "0.8.
|
|
77
|
-
"@dxos/storybook-utils": "0.8.
|
|
75
|
+
"@dxos/random": "0.8.1-main.81238a8",
|
|
76
|
+
"@dxos/react-ui": "0.8.1-main.81238a8",
|
|
77
|
+
"@dxos/react-ui-theme": "0.8.1-main.81238a8",
|
|
78
|
+
"@dxos/storybook-utils": "0.8.1-main.81238a8"
|
|
78
79
|
},
|
|
79
80
|
"peerDependencies": {
|
|
80
81
|
"@phosphor-icons/react": "^2.1.5",
|
|
81
82
|
"react": "~18.2.0",
|
|
82
83
|
"react-dom": "~18.2.0",
|
|
83
|
-
"@dxos/react-ui": "0.8.
|
|
84
|
-
"@dxos/react-ui-theme": "0.8.
|
|
84
|
+
"@dxos/react-ui": "0.8.1-main.81238a8",
|
|
85
|
+
"@dxos/react-ui-theme": "0.8.1-main.81238a8"
|
|
85
86
|
},
|
|
86
87
|
"publishConfig": {
|
|
87
88
|
"access": "public"
|
package/src/ThreadPlugin.tsx
CHANGED
|
@@ -12,6 +12,7 @@ import { type ReactiveEchoObject, RefArray } from '@dxos/react-client/echo';
|
|
|
12
12
|
import { translations as threadTranslations } from '@dxos/react-ui-thread';
|
|
13
13
|
|
|
14
14
|
import { IntentResolver, Markdown, ReactSurface, ThreadState } from './capabilities';
|
|
15
|
+
import { ThreadEvents as LocalThreadEvents } from './events';
|
|
15
16
|
import { meta, THREAD_ITEM, THREAD_PLUGIN } from './meta';
|
|
16
17
|
import translations from './translations';
|
|
17
18
|
import { ThreadAction } from './types';
|
|
@@ -128,7 +129,7 @@ export const ThreadPlugin = () =>
|
|
|
128
129
|
id: `${meta.id}/module/react-surface`,
|
|
129
130
|
activatesOn: Events.SetupReactSurface,
|
|
130
131
|
// TODO(wittjosiah): Should occur before the comments thread is loaded when surfaces activation is more granular.
|
|
131
|
-
activatesBefore: [ThreadEvents.SetupThread],
|
|
132
|
+
activatesBefore: [ThreadEvents.SetupThread, LocalThreadEvents.SetupActivity],
|
|
132
133
|
activate: ReactSurface,
|
|
133
134
|
}),
|
|
134
135
|
defineModule({
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { defineCapability } from '@dxos/app-framework';
|
|
6
|
+
import { type MenuActionProperties } from '@dxos/react-ui-menu';
|
|
6
7
|
import { type DeepReadonly } from '@dxos/util';
|
|
7
8
|
|
|
8
9
|
import { THREAD_PLUGIN } from '../meta';
|
|
@@ -16,4 +17,9 @@ export namespace ThreadCapabilities {
|
|
|
16
17
|
export const MutableState = defineCapability<{ state: ThreadState; getViewState: GetViewState }>(
|
|
17
18
|
`${THREAD_PLUGIN}/capability/state`,
|
|
18
19
|
);
|
|
20
|
+
|
|
21
|
+
export type Activity = Omit<MenuActionProperties, 'variant' | 'checked'> & {
|
|
22
|
+
id: string;
|
|
23
|
+
};
|
|
24
|
+
export const Activity = defineCapability<Activity>(`${THREAD_PLUGIN}/capability/activity`);
|
|
19
25
|
}
|
|
@@ -10,7 +10,7 @@ import { SettingsStore } from '@dxos/local-storage';
|
|
|
10
10
|
import { ChannelType, type ThreadType } from '@dxos/plugin-space/types';
|
|
11
11
|
import { getSpace } from '@dxos/react-client/echo';
|
|
12
12
|
|
|
13
|
-
import {
|
|
13
|
+
import { ChannelContainer, ThreadComplementary, ThreadSettings } from '../components';
|
|
14
14
|
import { THREAD_PLUGIN } from '../meta';
|
|
15
15
|
import { type ThreadSettingsProps } from '../types';
|
|
16
16
|
|
|
@@ -21,23 +21,12 @@ export default () =>
|
|
|
21
21
|
role: 'article',
|
|
22
22
|
filter: (data): data is { subject: ChannelType } =>
|
|
23
23
|
data.subject instanceof ChannelType && !!data.subject.threads[0],
|
|
24
|
-
component: ({ data, role }) => {
|
|
24
|
+
component: ({ data: { subject: channel }, role }) => {
|
|
25
25
|
const layout = useLayout();
|
|
26
|
-
const channel = data.subject;
|
|
27
|
-
void channel.threads[0].load();
|
|
28
|
-
const thread = channel.threads[0].target;
|
|
29
|
-
if (!thread) {
|
|
30
|
-
return null;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
26
|
const currentPosition = layout.active.findIndex((id) => id === channel.id);
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
return <ThreadContainer role={role} thread={thread} context={context} />;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
return <ThreadContainer role={role} thread={thread} />;
|
|
27
|
+
const objectToTheLeft = layout.active[currentPosition - 1];
|
|
28
|
+
const context = currentPosition > 0 ? getSpace(channel)?.db.getObjectById(objectToTheLeft) : undefined;
|
|
29
|
+
return <ChannelContainer role={role} channel={channel} context={context} />;
|
|
41
30
|
},
|
|
42
31
|
}),
|
|
43
32
|
createSurface({
|
|
@@ -11,7 +11,7 @@ import { type ThreadState, type ViewStore } from '../types';
|
|
|
11
11
|
const initialViewState = { showResolvedThreads: false };
|
|
12
12
|
|
|
13
13
|
export default () => {
|
|
14
|
-
const state = create<ThreadState>({ drafts: {} });
|
|
14
|
+
const state = create<ThreadState>({ activities: {}, drafts: {} });
|
|
15
15
|
const viewStore = create<ViewStore>({});
|
|
16
16
|
|
|
17
17
|
const getViewState = (subjectId: string) => {
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import React, { useCallback, type ComponentProps } from 'react';
|
|
6
|
+
|
|
7
|
+
import { Surface, useCapabilities, useCapability } from '@dxos/app-framework';
|
|
8
|
+
import { type NodeArg } from '@dxos/plugin-graph';
|
|
9
|
+
import { type ChannelType } from '@dxos/plugin-space/types';
|
|
10
|
+
import { fullyQualifiedId } from '@dxos/react-client/echo';
|
|
11
|
+
import { createEditorActionGroup } from '@dxos/react-ui-editor';
|
|
12
|
+
import {
|
|
13
|
+
createMenuAction,
|
|
14
|
+
MenuProvider,
|
|
15
|
+
ToolbarMenu,
|
|
16
|
+
type ToolbarMenuActionGroupProperties,
|
|
17
|
+
useMenuActions,
|
|
18
|
+
type MenuAction,
|
|
19
|
+
} from '@dxos/react-ui-menu';
|
|
20
|
+
import { StackItem } from '@dxos/react-ui-stack';
|
|
21
|
+
|
|
22
|
+
import { ChatContainer } from './ChatContainer';
|
|
23
|
+
import { ThreadCapabilities } from '../capabilities';
|
|
24
|
+
|
|
25
|
+
const useActivitiesMenu = (activities: ThreadCapabilities.Activity[], activity: string | undefined) => {
|
|
26
|
+
return useMenuActions(() => ({
|
|
27
|
+
nodes: [
|
|
28
|
+
createEditorActionGroup('activities', {
|
|
29
|
+
variant: 'toggleGroup',
|
|
30
|
+
selectCardinality: 'single',
|
|
31
|
+
value: activity,
|
|
32
|
+
} as ToolbarMenuActionGroupProperties) as NodeArg<any>,
|
|
33
|
+
...activities.map(({ id, ...properties }) =>
|
|
34
|
+
createMenuAction(id, {
|
|
35
|
+
...properties,
|
|
36
|
+
checked: true,
|
|
37
|
+
}),
|
|
38
|
+
),
|
|
39
|
+
],
|
|
40
|
+
edges: [
|
|
41
|
+
{ source: 'root', target: 'activities' },
|
|
42
|
+
...activities.map((activity) => ({ source: 'activities', target: activity.id })),
|
|
43
|
+
],
|
|
44
|
+
}));
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const ChannelContainer = ({
|
|
48
|
+
role,
|
|
49
|
+
channel,
|
|
50
|
+
context,
|
|
51
|
+
}: Pick<ComponentProps<typeof ChatContainer>, 'context'> & { channel: ChannelType; role: string }) => {
|
|
52
|
+
const { state } = useCapability(ThreadCapabilities.MutableState);
|
|
53
|
+
const currentActivity = state.activities[channel.id];
|
|
54
|
+
const activities = useCapabilities(ThreadCapabilities.Activity);
|
|
55
|
+
const menu = useActivitiesMenu(activities, currentActivity);
|
|
56
|
+
const handleAction = useCallback(
|
|
57
|
+
(action: MenuAction) => (state.activities[channel.id] = currentActivity === action.id ? undefined : action.id),
|
|
58
|
+
[currentActivity],
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
const thread = channel.threads[0].target;
|
|
62
|
+
if (!thread) {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return (
|
|
67
|
+
<StackItem.Content toolbar>
|
|
68
|
+
<MenuProvider {...menu} onAction={handleAction} attendableId={fullyQualifiedId(channel)}>
|
|
69
|
+
<ToolbarMenu />
|
|
70
|
+
</MenuProvider>
|
|
71
|
+
{currentActivity ? (
|
|
72
|
+
<Surface role={`channel-activity--${currentActivity}`} data={{ subject: channel }} />
|
|
73
|
+
) : (
|
|
74
|
+
<ChatContainer thread={thread} context={context} />
|
|
75
|
+
)}
|
|
76
|
+
</StackItem.Content>
|
|
77
|
+
);
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
export default ChannelContainer;
|
|
@@ -110,7 +110,7 @@ export const ChatContainer = ({ thread, context, current, autoFocusTextbox }: Th
|
|
|
110
110
|
<ScrollArea.Root classNames='col-span-2'>
|
|
111
111
|
<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]'>
|
|
112
112
|
<div role='none' className={mx(threadLayout, 'place-self-end')}>
|
|
113
|
-
{RefArray.
|
|
113
|
+
{RefArray.targets(thread.messages ?? []).map((message) => (
|
|
114
114
|
<MessageContainer key={message.id} message={message} members={members} onDelete={handleDelete} />
|
|
115
115
|
))}
|
|
116
116
|
</div>
|
|
@@ -179,7 +179,7 @@ export const CommentContainer = ({
|
|
|
179
179
|
</div>
|
|
180
180
|
</div>
|
|
181
181
|
{/** TODO(dmaretskyi): How's `thread.messages` undefined? */}
|
|
182
|
-
{RefArray.
|
|
182
|
+
{RefArray.targets(thread.messages?.filter(isNonNullable) ?? []).map((message) => (
|
|
183
183
|
<MessageContainer key={message.id} message={message} members={members} onDelete={handleMessageDelete} />
|
|
184
184
|
))}
|
|
185
185
|
{/*
|
|
@@ -100,7 +100,7 @@ export const MessageContainer = ({
|
|
|
100
100
|
</ButtonGroup>
|
|
101
101
|
</MessageHeading>
|
|
102
102
|
<TextboxBlock message={message} isAuthor={userIsAuthor} editing={editing} />
|
|
103
|
-
{RefArray.
|
|
103
|
+
{RefArray.targets(message.parts ?? []).map((part, index) => (
|
|
104
104
|
<MessagePart key={index} part={part} />
|
|
105
105
|
))}
|
|
106
106
|
</MessageRoot>
|
|
@@ -42,7 +42,7 @@ export const ThreadComplementary = ({ subject }: { subject: any }) => {
|
|
|
42
42
|
);
|
|
43
43
|
const sort = useMemo(() => createSort?.(subject), [createSort, subject]);
|
|
44
44
|
|
|
45
|
-
const threadObjects = RefArray.
|
|
45
|
+
const threadObjects = RefArray.targets(subject.threads ?? []);
|
|
46
46
|
|
|
47
47
|
const threads = useMemo(() => {
|
|
48
48
|
return threadObjects.concat(drafts ?? []).filter(isNonNullable) as ThreadType[];
|
package/src/components/index.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import { lazy } from 'react';
|
|
6
6
|
|
|
7
|
-
export const
|
|
7
|
+
export const ChannelContainer = lazy(() => import('./ChannelContainer'));
|
|
8
8
|
|
|
9
9
|
// TODO(wittjosiah): Suspense boundary for sidebar?
|
|
10
10
|
export * from './CommentContainer';
|
package/src/events.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { Events } from '@dxos/app-framework';
|
|
6
|
+
|
|
7
|
+
import { THREAD_PLUGIN } from './meta';
|
|
8
|
+
|
|
9
|
+
export namespace ThreadEvents {
|
|
10
|
+
export const SetupActivity = Events.createStateEvent(`${THREAD_PLUGIN}/setup-activity`);
|
|
11
|
+
}
|
|
@@ -37,7 +37,7 @@ export const threads = (state: ThreadState, doc?: DocumentType, dispatch?: Promi
|
|
|
37
37
|
|
|
38
38
|
// TODO(Zan): When we have the deepsignal specific equivalent of this we should use that instead.
|
|
39
39
|
const threads = computed(() =>
|
|
40
|
-
[...RefArray.
|
|
40
|
+
[...RefArray.targets(doc.threads), ...(state.drafts[fullyQualifiedId(doc)] ?? [])].filter(
|
|
41
41
|
(thread) => !(thread?.status === 'resolved'),
|
|
42
42
|
),
|
|
43
43
|
);
|
|
@@ -45,7 +45,7 @@ export const threads = (state: ThreadState, doc?: DocumentType, dispatch?: Promi
|
|
|
45
45
|
return [
|
|
46
46
|
EditorView.updateListener.of((update) => {
|
|
47
47
|
if (update.docChanged) {
|
|
48
|
-
RefArray.
|
|
48
|
+
RefArray.targets(doc.threads).forEach((thread) => {
|
|
49
49
|
if (thread.anchor) {
|
|
50
50
|
// Only update if the name has changed, otherwise this will cause an infinite loop.
|
|
51
51
|
// Skip if the name is empty; this means comment text was deleted, but thread name should remain.
|
package/src/index.ts
CHANGED
package/src/meta.ts
CHANGED
|
@@ -7,10 +7,10 @@ import { type PluginMeta } from '@dxos/app-framework';
|
|
|
7
7
|
export const THREAD_PLUGIN = 'dxos.org/plugin/thread';
|
|
8
8
|
export const THREAD_ITEM = `${THREAD_PLUGIN}/item`;
|
|
9
9
|
|
|
10
|
-
export const meta = {
|
|
10
|
+
export const meta: PluginMeta = {
|
|
11
11
|
id: THREAD_PLUGIN,
|
|
12
12
|
name: 'Threads',
|
|
13
13
|
description: 'Add comment threads to objects.',
|
|
14
14
|
icon: 'ph--chat--regular',
|
|
15
15
|
source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-thread',
|
|
16
|
-
}
|
|
16
|
+
};
|
package/src/types.ts
CHANGED
|
@@ -80,6 +80,8 @@ export type ViewState = { showResolvedThreads: boolean };
|
|
|
80
80
|
export type ViewStore = Record<SubjectId, ViewState>;
|
|
81
81
|
|
|
82
82
|
export type ThreadState = {
|
|
83
|
+
/** Current channel activity. */
|
|
84
|
+
activities: Record<string, string | undefined>;
|
|
83
85
|
/** In-memory draft threads. */
|
|
84
86
|
drafts: Record<string, ThreadType[]>;
|
|
85
87
|
current?: string | undefined;
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ChatContainer
|
|
3
|
-
} from "./chunk-UPKU23DA.mjs";
|
|
4
|
-
import "./chunk-BNEWNQBO.mjs";
|
|
5
|
-
import "./chunk-636QDHE3.mjs";
|
|
6
|
-
|
|
7
|
-
// packages/plugins/plugin-thread/src/components/ThreadContainer.tsx
|
|
8
|
-
import React from "react";
|
|
9
|
-
import { StackItem } from "@dxos/react-ui-stack";
|
|
10
|
-
var ThreadContainer = ({ role, ...props }) => {
|
|
11
|
-
return /* @__PURE__ */ React.createElement(StackItem.Content, {
|
|
12
|
-
toolbar: false
|
|
13
|
-
}, /* @__PURE__ */ React.createElement(ChatContainer, props));
|
|
14
|
-
};
|
|
15
|
-
var ThreadContainer_default = ThreadContainer;
|
|
16
|
-
export {
|
|
17
|
-
ThreadContainer_default as default
|
|
18
|
-
};
|
|
19
|
-
//# sourceMappingURL=ThreadContainer-6OP5AG2W.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/components/ThreadContainer.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { type ComponentProps } from 'react';\n\nimport { StackItem } from '@dxos/react-ui-stack';\n\nimport { ChatContainer } from './ChatContainer';\n\nconst ThreadContainer = ({\n role,\n ...props\n}: Pick<ComponentProps<typeof ChatContainer>, 'thread' | 'context'> & { role: string }) => {\n return (\n <StackItem.Content toolbar={false}>\n <ChatContainer {...props} />\n </StackItem.Content>\n );\n};\n\nexport default ThreadContainer;\n"],
|
|
5
|
-
"mappings": ";;;;;;;AAIA,OAAOA,WAAoC;AAE3C,SAASC,iBAAiB;AAI1B,IAAMC,kBAAkB,CAAC,EACvBC,MACA,GAAGC,MAAAA,MACiF;AACpF,SACE,sBAAA,cAACC,UAAUC,SAAO;IAACC,SAAS;KAC1B,sBAAA,cAACC,eAAkBJ,KAAAA,CAAAA;AAGzB;AAEA,IAAA,0BAAeF;",
|
|
6
|
-
"names": ["React", "StackItem", "ThreadContainer", "role", "props", "StackItem", "Content", "toolbar", "ChatContainer"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/capabilities.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { defineCapability } from '@dxos/app-framework';\nimport { type DeepReadonly } from '@dxos/util';\n\nimport { THREAD_PLUGIN } from '../meta';\nimport { type ViewState, type ThreadState } from '../types';\n\nexport namespace ThreadCapabilities {\n type GetViewState = (subjectId: string) => ViewState;\n export const State = defineCapability<{ state: DeepReadonly<ThreadState>; getViewState: GetViewState }>(\n `${THREAD_PLUGIN}/capability/state`,\n );\n export const MutableState = defineCapability<{ state: ThreadState; getViewState: GetViewState }>(\n `${THREAD_PLUGIN}/capability/state`,\n );\n}\n"],
|
|
5
|
-
"mappings": ";;;;;AAIA,SAASA,wBAAwB;;UAMhBC,qBAAAA;sBAEFC,QAAQC,iBACnB,GAAGC,aAAAA,mBAAgC;sBAExBC,eAAeF,iBAC1B,GAAGC,aAAAA,mBAAgC;AAEvC,GARiBH,uBAAAA,qBAAAA,CAAAA,EAAAA;",
|
|
6
|
-
"names": ["defineCapability", "ThreadCapabilities", "State", "defineCapability", "THREAD_PLUGIN", "MutableState"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/components/ChatContainer.tsx", "../../../src/components/MessageContainer.tsx", "../../../src/components/command-extension.ts", "../../../src/util.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useLayoutEffect, useMemo, useRef, useState } from 'react';\n\nimport { Ref } from '@dxos/echo-schema';\nimport { create, makeRef, RefArray } from '@dxos/live-object';\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 { createBasicExtensions, createThemeExtensions, listener } from '@dxos/react-ui-editor';\nimport { StackItem } from '@dxos/react-ui-stack';\nimport { mx } from '@dxos/react-ui-theme';\nimport { MessageTextbox, type MessageTextboxProps, Thread, ThreadFooter, threadLayout } from '@dxos/react-ui-thread';\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 <StackItem.SigilButton attendableId={attendableId}>\n <Icon icon='ph--chat--regular' size={5} />\n </StackItem.SigilButton>\n <StackItem.HeadingLabel attendableId={attendableId}>{t('chat heading')}</StackItem.HeadingLabel>\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 makeRef(\n create(MessageType, {\n sender: { identityKey: identity.identityKey.toHex() },\n timestamp: new Date().toISOString(),\n text: messageRef.current,\n context: context ? makeRef(context) : undefined,\n }),\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.findIndex(Ref.hasObjectId(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 {RefArray.allResolvedTargets(thread.messages ?? []).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 { RefArray } from '@dxos/live-object';\nimport { type MessageType } from '@dxos/plugin-space/types';\nimport { PublicKey } from '@dxos/react-client';\nimport { type ReactiveEchoObject, type Expando, type SpaceMember } from '@dxos/react-client/echo';\nimport { useIdentity, type Identity } from '@dxos/react-client/halo';\nimport { Button, ButtonGroup, Tooltip, useOnTransition, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { createBasicExtensions, createThemeExtensions, useTextEditor } from '@dxos/react-ui-editor';\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';\n\nimport { command } from './command-extension';\nimport { useOnEditAnalytics } from '../hooks';\nimport { THREAD_PLUGIN } from '../meta';\nimport { getMessageMetadata } from '../util';\n\n// TODO(thure): #8149\nconst messageControlClassNames = ['!p-1 !min-bs-0 transition-opacity', 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>\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>\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 {RefArray.allResolvedTargets(message.parts ?? []).map((part, index) => (\n <MessagePart key={index} part={part} />\n ))}\n </MessageRoot>\n );\n};\n\nconst MessagePart = ({ part }: { part: Expando }) => {\n return <MessageBlockObjectTile subject={part} />;\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 = forwardRef<HTMLDivElement, { subject: ReactiveEchoObject<any> }>(\n ({ subject }, forwardedRef) => {\n let title = subject.name ?? subject.title ?? subject.type ?? '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 ref={forwardedRef}\n >\n <Surface role='card' limit={1} data={{ subject }} fallback={title} />\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 } 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 { tag: tags.tagName, class: mx('dx-tag dx-tag--indigo text-baseText font-medium') },\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": ["React", "useLayoutEffect", "useMemo", "useRef", "useState", "Ref", "create", "makeRef", "RefArray", "MessageType", "fullyQualifiedId", "getSpace", "useMembers", "useIdentity", "Icon", "ScrollArea", "useThemeContext", "useTranslation", "createBasicExtensions", "createThemeExtensions", "listener", "StackItem", "mx", "MessageTextbox", "Thread", "ThreadFooter", "threadLayout", "EditorView", "Check", "PencilSimple", "X", "React", "forwardRef", "useCallback", "useEffect", "useRef", "useState", "Surface", "RefArray", "PublicKey", "useIdentity", "Button", "ButtonGroup", "Tooltip", "useOnTransition", "useThemeContext", "useTranslation", "createBasicExtensions", "createThemeExtensions", "useTextEditor", "getSize", "hoverableControlItem", "hoverableControls", "hoverableFocusedWithinControls", "mx", "MessageHeading", "MessageRoot", "StreamLanguage", "HighlightStyle", "syntaxHighlighting", "tags", "mx", "parser", "StreamLanguage", "define", "startState", "count", "token", "stream", "state", "eatSpace", "match", "next", "styles", "HighlightStyle", "tag", "tags", "tagName", "class", "mx", "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", "RefArray", "allResolvedTargets", "parts", "map", "part", "index", "MessagePart", "key", "MessageBlockObjectTile", "subject", "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", "forwardedRef", "title", "name", "type", "content", "mx", "Surface", "limit", "data", "fallback", "ChatContainer", "thread", "context", "current", "autoFocusTextbox", "identity", "useIdentity", "space", "getSpace", "members", "useMembers", "key", "activity", "useStatus", "fullyQualifiedId", "t", "useTranslation", "THREAD_PLUGIN", "_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", "makeRef", "create", "MessageType", "sender", "identityKey", "toHex", "timestamp", "Date", "toISOString", "undefined", "handleDelete", "id", "messageIndex", "findIndex", "Ref", "hasObjectId", "splice", "React", "Thread", "classNames", "ScrollArea", "Root", "Viewport", "div", "role", "className", "mx", "threadLayout", "RefArray", "allResolvedTargets", "map", "message", "MessageContainer", "onDelete", "ref", "Scrollbar", "Thumb", "MessageTextbox", "onSend", "ThreadFooter"]
|
|
7
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
// packages/plugins/plugin-thread/src/capabilities/index.ts
|
|
2
|
-
import { lazy } from "@dxos/app-framework";
|
|
3
|
-
var IntentResolver = lazy(() => import("./intent-resolver-FAFQ54NP.mjs"));
|
|
4
|
-
var Markdown = lazy(() => import("./markdown-RPYOUBVR.mjs"));
|
|
5
|
-
var ReactSurface = lazy(() => import("./react-surface-Y4MUSICN.mjs"));
|
|
6
|
-
var ThreadSettings = lazy(() => import("./settings-WQTE5AEZ.mjs"));
|
|
7
|
-
var ThreadState = lazy(() => import("./state-GNFUURIC.mjs"));
|
|
8
|
-
|
|
9
|
-
export {
|
|
10
|
-
IntentResolver,
|
|
11
|
-
Markdown,
|
|
12
|
-
ReactSurface,
|
|
13
|
-
ThreadState
|
|
14
|
-
};
|
|
15
|
-
//# sourceMappingURL=chunk-VOMIDDNO.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/index.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { lazy } from '@dxos/app-framework';\n\nexport const IntentResolver = lazy(() => import('./intent-resolver'));\nexport const Markdown = lazy(() => import('./markdown'));\nexport const ReactSurface = lazy(() => import('./react-surface'));\nexport const ThreadSettings = lazy(() => import('./settings'));\nexport const ThreadState = lazy(() => import('./state'));\n\nexport * from './capabilities';\n"],
|
|
5
|
-
"mappings": ";AAIA,SAASA,YAAY;AAEd,IAAMC,iBAAiBC,KAAK,MAAM,OAAO,gCAAA,CAAA;AACzC,IAAMC,WAAWD,KAAK,MAAM,OAAO,yBAAA,CAAA;AACnC,IAAME,eAAeF,KAAK,MAAM,OAAO,8BAAA,CAAA;AACvC,IAAMG,iBAAiBH,KAAK,MAAM,OAAO,yBAAA,CAAA;AACzC,IAAMI,cAAcJ,KAAK,MAAM,OAAO,sBAAA,CAAA;",
|
|
6
|
-
"names": ["lazy", "IntentResolver", "lazy", "Markdown", "ReactSurface", "ThreadSettings", "ThreadState"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/markdown.ts", "../../../src/extensions/threads.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capabilities, contributes, type PluginsContext } from '@dxos/app-framework';\nimport { MarkdownCapabilities } from '@dxos/plugin-markdown';\n\nimport { ThreadCapabilities } from './capabilities';\nimport { threads } from '../extensions';\n\nexport default (context: PluginsContext) =>\n contributes(MarkdownCapabilities.Extensions, [\n ({ document: doc }) => {\n const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);\n const { state } = context.requestCapability(ThreadCapabilities.MutableState);\n return threads(state, doc, dispatch);\n },\n ]);\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type Extension } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport { computed, effect } from '@preact/signals-core';\n\nimport { createIntent, type PromiseIntentDispatcher } from '@dxos/app-framework';\nimport { Ref } from '@dxos/echo-schema';\nimport { RefArray } from '@dxos/live-object';\nimport { type DocumentType } from '@dxos/plugin-markdown/types';\nimport { ThreadType } from '@dxos/plugin-space/types';\nimport { getSpace, getTextInRange, createDocAccessor, fullyQualifiedId } from '@dxos/react-client/echo';\nimport { comments, createExternalCommentSync } from '@dxos/react-ui-editor';\n\nimport { ThreadAction, type ThreadState } from '../types';\n\n// TODO(burdon): Factor out.\nconst getName = (doc: DocumentType, anchor: string): string | undefined => {\n if (doc.content) {\n const [start, end] = anchor.split(':');\n return getTextInRange(createDocAccessor(doc.content.target!, ['content']), start, end);\n }\n};\n\n/**\n * Construct plugins.\n */\nexport const threads = (state: ThreadState, doc?: DocumentType, dispatch?: PromiseIntentDispatcher): Extension => {\n const space = doc && getSpace(doc);\n if (!doc || !space || !dispatch) {\n // Include no-op comments extension here to ensure that the facets are always present when they are expected.\n // TODO(wittjosiah): The Editor should only look for these facets when comments are available.\n return [comments()];\n }\n\n // TODO(Zan): When we have the deepsignal specific equivalent of this we should use that instead.\n const threads = computed(() =>\n [...RefArray.allResolvedTargets(doc.threads), ...(state.drafts[fullyQualifiedId(doc)] ?? [])].filter(\n (thread) => !(thread?.status === 'resolved'),\n ),\n );\n\n return [\n EditorView.updateListener.of((update) => {\n if (update.docChanged) {\n RefArray.allResolvedTargets(doc.threads).forEach((thread) => {\n if (thread.anchor) {\n // Only update if the name has changed, otherwise this will cause an infinite loop.\n // Skip if the name is empty; this means comment text was deleted, but thread name should remain.\n const name = getName(doc, thread.anchor);\n if (name && name !== thread.name) {\n thread.name = name;\n }\n }\n });\n }\n }),\n\n createExternalCommentSync(\n fullyQualifiedId(doc),\n (sink) => effect(() => sink()),\n () =>\n threads.value\n .filter((thread) => thread?.anchor)\n .map((thread) => ({ id: fullyQualifiedId(thread), cursor: thread.anchor! })),\n ),\n\n comments({\n id: fullyQualifiedId(doc),\n onCreate: ({ cursor }) => {\n const name = getName(doc, cursor);\n void dispatch(createIntent(ThreadAction.Create, { cursor, name, subject: doc }));\n },\n onDelete: ({ id }) => {\n const draft = state.drafts[fullyQualifiedId(doc)];\n if (draft) {\n const index = draft.findIndex((thread) => fullyQualifiedId(thread) === id);\n if (index !== -1) {\n draft.splice(index, 1);\n }\n }\n\n const thread = doc.threads.find(Ref.hasObjectId(id))?.target;\n if (thread) {\n thread.anchor = undefined;\n }\n },\n onUpdate: ({ id, cursor }) => {\n const thread =\n state.drafts[fullyQualifiedId(doc)]?.find((thread) => fullyQualifiedId(thread) === id) ??\n doc.threads.find(Ref.hasObjectId(id))?.target;\n\n if (thread instanceof ThreadType && thread.anchor) {\n thread.name = getName(doc, thread.anchor);\n thread.anchor = cursor;\n }\n },\n onSelect: ({ selection }) => {\n const current = selection.current ?? selection.closest;\n if (current) {\n void dispatch(createIntent(ThreadAction.Select, { current, skipOpen: true }));\n }\n },\n }),\n ];\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["Capabilities", "contributes", "MarkdownCapabilities", "EditorView", "computed", "effect", "createIntent", "Ref", "RefArray", "ThreadType", "getSpace", "getTextInRange", "createDocAccessor", "fullyQualifiedId", "comments", "createExternalCommentSync", "getName", "doc", "anchor", "content", "start", "end", "split", "getTextInRange", "createDocAccessor", "target", "threads", "state", "dispatch", "space", "getSpace", "comments", "computed", "RefArray", "allResolvedTargets", "drafts", "fullyQualifiedId", "filter", "thread", "status", "EditorView", "updateListener", "of", "update", "docChanged", "forEach", "name", "createExternalCommentSync", "sink", "effect", "value", "map", "id", "cursor", "onCreate", "createIntent", "ThreadAction", "Create", "subject", "onDelete", "draft", "index", "findIndex", "splice", "find", "Ref", "hasObjectId", "undefined", "onUpdate", "ThreadType", "onSelect", "selection", "current", "closest", "Select", "skipOpen", "context", "contributes", "MarkdownCapabilities", "Extensions", "document", "doc", "dispatchPromise", "dispatch", "requestCapability", "Capabilities", "IntentDispatcher", "state", "ThreadCapabilities", "MutableState", "threads"]
|
|
7
|
-
}
|