@dxos/plugin-thread 0.8.3-main.672df60 → 0.8.3-staging.0fa589b
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-LGYSQMC7.mjs → ChannelContainer-PKFBVENP.mjs} +4 -4
- package/dist/lib/browser/{ChatContainer-JWRI73OG.mjs → ChatContainer-RSOKYAMK.mjs} +2 -2
- package/dist/lib/browser/{app-graph-builder-K3CFBN7V.mjs → app-graph-builder-OY7R7EJP.mjs} +11 -11
- package/dist/lib/browser/app-graph-builder-OY7R7EJP.mjs.map +7 -0
- package/dist/lib/browser/chunk-6NBVNXTM.mjs +21 -0
- package/dist/lib/browser/{chunk-WDOQXTI2.mjs → chunk-AEXWNS6Z.mjs} +5 -3
- package/dist/lib/browser/chunk-AEXWNS6Z.mjs.map +7 -0
- package/dist/lib/browser/{chunk-KMVGJG23.mjs → chunk-PG5CTFKK.mjs} +50 -45
- package/dist/lib/browser/chunk-PG5CTFKK.mjs.map +7 -0
- package/dist/lib/browser/{chunk-G3TS64FP.mjs → chunk-TAFSCSUR.mjs} +4 -4
- package/dist/lib/browser/chunk-TAFSCSUR.mjs.map +7 -0
- package/dist/lib/browser/{chunk-5PGLGDIP.mjs → chunk-XZKBN3NS.mjs} +35 -35
- package/dist/lib/browser/chunk-XZKBN3NS.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +35 -9
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/{intent-resolver-YUYZCTLF.mjs → intent-resolver-FK2MDVDT.mjs} +24 -26
- package/dist/lib/browser/intent-resolver-FK2MDVDT.mjs.map +7 -0
- package/dist/lib/browser/{markdown-4EC3OCF2.mjs → markdown-TE5SWWNJ.mjs} +9 -9
- package/dist/lib/browser/markdown-TE5SWWNJ.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{react-root-EECCWHCW.mjs → react-root-NK3A4VG7.mjs} +6 -6
- package/dist/lib/browser/{react-surface-5QLZAFDL.mjs → react-surface-VXUJKSOG.mjs} +12 -12
- package/dist/lib/browser/react-surface-VXUJKSOG.mjs.map +7 -0
- package/dist/lib/browser/{settings-KVBQQSO5.mjs → settings-RB2RSLXV.mjs} +4 -4
- package/dist/lib/browser/settings-RB2RSLXV.mjs.map +7 -0
- package/dist/lib/browser/types/index.mjs +1 -1
- package/dist/lib/node/{ChannelContainer-5EKNEH56.cjs → ChannelContainer-YS5YT2ML.cjs} +9 -9
- package/dist/lib/node/{ChannelContainer-5EKNEH56.cjs.map → ChannelContainer-YS5YT2ML.cjs.map} +2 -2
- package/dist/lib/node/{ChatContainer-EE3FPSYO.cjs → ChatContainer-GCOM3M56.cjs} +8 -8
- package/dist/lib/node/{ChatContainer-EE3FPSYO.cjs.map → ChatContainer-GCOM3M56.cjs.map} +2 -2
- package/dist/lib/node/{app-graph-builder-IRE3GYKE.cjs → app-graph-builder-PBHJNDQY.cjs} +21 -21
- package/dist/lib/node/app-graph-builder-PBHJNDQY.cjs.map +7 -0
- package/dist/lib/node/{chunk-4B3PPXA6.cjs → chunk-E3WBZTTI.cjs} +12 -12
- package/dist/lib/node/chunk-E3WBZTTI.cjs.map +7 -0
- package/dist/lib/node/{chunk-U7NOIXN6.cjs → chunk-ERG7G6FF.cjs} +10 -10
- package/dist/lib/node/{chunk-JLHENFGK.cjs → chunk-IP533AMV.cjs} +76 -71
- package/dist/lib/node/chunk-IP533AMV.cjs.map +7 -0
- package/dist/lib/node/{chunk-6B3M6XRE.cjs → chunk-UM36TPCT.cjs} +37 -37
- package/dist/lib/node/chunk-UM36TPCT.cjs.map +7 -0
- package/dist/lib/node/{chunk-TKHJVC2C.cjs → chunk-ZGDN3XBR.cjs} +8 -6
- package/dist/lib/node/chunk-ZGDN3XBR.cjs.map +7 -0
- package/dist/lib/node/index.cjs +45 -19
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/{intent-resolver-MZ3HADNY.cjs → intent-resolver-SYSJ5SJG.cjs} +50 -52
- package/dist/lib/node/intent-resolver-SYSJ5SJG.cjs.map +7 -0
- package/dist/lib/node/{markdown-NJDPXIKD.cjs → markdown-GQIPJS2F.cjs} +27 -27
- package/dist/lib/node/markdown-GQIPJS2F.cjs.map +7 -0
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/{react-root-IAYQ2DBO.cjs → react-root-6HHDMULJ.cjs} +10 -10
- package/dist/lib/node/{react-surface-AVC5VVIS.cjs → react-surface-NBH42NN2.cjs} +24 -24
- package/dist/lib/node/react-surface-NBH42NN2.cjs.map +7 -0
- package/dist/lib/node/{settings-H45P5YO2.cjs → settings-4LQSFEDK.cjs} +7 -7
- package/dist/lib/node/settings-4LQSFEDK.cjs.map +7 -0
- package/dist/lib/node/types/index.cjs +6 -6
- package/dist/lib/node/types/index.cjs.map +1 -1
- package/dist/lib/node-esm/{ChannelContainer-KFS2RWWW.mjs → ChannelContainer-O4QJII2P.mjs} +4 -4
- package/dist/lib/node-esm/{ChatContainer-UJYPQMLV.mjs → ChatContainer-F6CSADV7.mjs} +2 -2
- package/dist/lib/node-esm/{app-graph-builder-I5VMPLE4.mjs → app-graph-builder-BAHBHYWI.mjs} +11 -11
- package/dist/lib/node-esm/app-graph-builder-BAHBHYWI.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-X6AUQDTE.mjs → chunk-2RNIPFDA.mjs} +35 -35
- package/dist/lib/node-esm/chunk-2RNIPFDA.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-ODUB4GAB.mjs → chunk-O63QJPQX.mjs} +7 -7
- package/dist/lib/node-esm/{chunk-POKXRTII.mjs → chunk-P6RLFCNT.mjs} +4 -4
- package/dist/lib/node-esm/chunk-P6RLFCNT.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-J323VQ4P.mjs → chunk-UJMPYKT3.mjs} +5 -3
- package/dist/lib/node-esm/chunk-UJMPYKT3.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-MNJ3V4XM.mjs → chunk-UZWVVFT3.mjs} +50 -45
- package/dist/lib/node-esm/chunk-UZWVVFT3.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +35 -9
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/{intent-resolver-CU22OPAH.mjs → intent-resolver-BU73VYW3.mjs} +24 -26
- package/dist/lib/node-esm/intent-resolver-BU73VYW3.mjs.map +7 -0
- package/dist/lib/node-esm/{markdown-HRGGO7IA.mjs → markdown-HJUWNBLS.mjs} +9 -9
- package/dist/lib/node-esm/markdown-HJUWNBLS.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{react-root-NQMUEI6Z.mjs → react-root-RUXOAQNW.mjs} +6 -6
- package/dist/lib/node-esm/{react-surface-Z4X5VLMY.mjs → react-surface-ELXFYKP6.mjs} +12 -12
- package/dist/lib/node-esm/react-surface-ELXFYKP6.mjs.map +7 -0
- package/dist/lib/node-esm/{settings-IJGUOU3F.mjs → settings-EA7DFSM6.mjs} +4 -4
- package/dist/lib/node-esm/settings-EA7DFSM6.mjs.map +7 -0
- package/dist/lib/node-esm/types/index.mjs +1 -1
- package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/settings.d.ts.map +1 -1
- 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/Comments.stories.d.ts.map +1 -1
- package/dist/types/src/components/CommentsContainer.d.ts +1 -1
- package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
- package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
- package/dist/types/src/components/ThreadComplementary.d.ts.map +1 -1
- package/dist/types/src/components/testing.d.ts +2 -103
- package/dist/types/src/components/testing.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +128 -2
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/schema.d.ts +117 -301
- package/dist/types/src/types/schema.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +153 -828
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/package.json +42 -42
- package/src/ThreadPlugin.tsx +29 -6
- package/src/capabilities/app-graph-builder.ts +9 -9
- package/src/capabilities/intent-resolver.ts +26 -26
- package/src/capabilities/react-surface.tsx +7 -7
- package/src/capabilities/settings.ts +7 -2
- package/src/components/Call/Toolbar.tsx +3 -3
- package/src/components/ChannelContainer.tsx +18 -22
- package/src/components/Chat.stories.tsx +4 -4
- package/src/components/ChatContainer.tsx +6 -6
- package/src/components/CommentContainer.tsx +2 -2
- package/src/components/Comments.stories.tsx +15 -5
- package/src/components/CommentsContainer.tsx +21 -24
- package/src/components/MessageContainer.tsx +20 -20
- package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +2 -2
- package/src/components/ThreadComplementary.tsx +19 -15
- package/src/components/testing.ts +5 -5
- package/src/extensions/threads.ts +7 -7
- package/src/testing/stories.ts +3 -3
- package/src/translations.ts +7 -2
- package/src/types/schema.ts +8 -4
- package/dist/lib/browser/app-graph-builder-K3CFBN7V.mjs.map +0 -7
- package/dist/lib/browser/chunk-5PGLGDIP.mjs.map +0 -7
- package/dist/lib/browser/chunk-CF2MXRCH.mjs +0 -21
- package/dist/lib/browser/chunk-G3TS64FP.mjs.map +0 -7
- package/dist/lib/browser/chunk-KMVGJG23.mjs.map +0 -7
- package/dist/lib/browser/chunk-WDOQXTI2.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-YUYZCTLF.mjs.map +0 -7
- package/dist/lib/browser/markdown-4EC3OCF2.mjs.map +0 -7
- package/dist/lib/browser/react-surface-5QLZAFDL.mjs.map +0 -7
- package/dist/lib/browser/settings-KVBQQSO5.mjs.map +0 -7
- package/dist/lib/node/app-graph-builder-IRE3GYKE.cjs.map +0 -7
- package/dist/lib/node/chunk-4B3PPXA6.cjs.map +0 -7
- package/dist/lib/node/chunk-6B3M6XRE.cjs.map +0 -7
- package/dist/lib/node/chunk-JLHENFGK.cjs.map +0 -7
- package/dist/lib/node/chunk-TKHJVC2C.cjs.map +0 -7
- package/dist/lib/node/intent-resolver-MZ3HADNY.cjs.map +0 -7
- package/dist/lib/node/markdown-NJDPXIKD.cjs.map +0 -7
- package/dist/lib/node/react-surface-AVC5VVIS.cjs.map +0 -7
- package/dist/lib/node/settings-H45P5YO2.cjs.map +0 -7
- package/dist/lib/node-esm/app-graph-builder-I5VMPLE4.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-J323VQ4P.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-MNJ3V4XM.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-POKXRTII.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-X6AUQDTE.mjs.map +0 -7
- package/dist/lib/node-esm/intent-resolver-CU22OPAH.mjs.map +0 -7
- package/dist/lib/node-esm/markdown-HRGGO7IA.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-Z4X5VLMY.mjs.map +0 -7
- package/dist/lib/node-esm/settings-IJGUOU3F.mjs.map +0 -7
- /package/dist/lib/browser/{ChannelContainer-LGYSQMC7.mjs.map → ChannelContainer-PKFBVENP.mjs.map} +0 -0
- /package/dist/lib/browser/{ChatContainer-JWRI73OG.mjs.map → ChatContainer-RSOKYAMK.mjs.map} +0 -0
- /package/dist/lib/browser/{chunk-CF2MXRCH.mjs.map → chunk-6NBVNXTM.mjs.map} +0 -0
- /package/dist/lib/browser/{react-root-EECCWHCW.mjs.map → react-root-NK3A4VG7.mjs.map} +0 -0
- /package/dist/lib/node/{chunk-U7NOIXN6.cjs.map → chunk-ERG7G6FF.cjs.map} +0 -0
- /package/dist/lib/node/{react-root-IAYQ2DBO.cjs.map → react-root-6HHDMULJ.cjs.map} +0 -0
- /package/dist/lib/node-esm/{ChannelContainer-KFS2RWWW.mjs.map → ChannelContainer-O4QJII2P.mjs.map} +0 -0
- /package/dist/lib/node-esm/{ChatContainer-UJYPQMLV.mjs.map → ChatContainer-F6CSADV7.mjs.map} +0 -0
- /package/dist/lib/node-esm/{chunk-ODUB4GAB.mjs.map → chunk-O63QJPQX.mjs.map} +0 -0
- /package/dist/lib/node-esm/{react-root-NQMUEI6Z.mjs.map → react-root-RUXOAQNW.mjs.map} +0 -0
|
@@ -9,9 +9,9 @@ import React, { useEffect } from 'react';
|
|
|
9
9
|
|
|
10
10
|
import { IntentPlugin } from '@dxos/app-framework';
|
|
11
11
|
import { withPluginManager } from '@dxos/app-framework/testing';
|
|
12
|
-
import {
|
|
12
|
+
import { Obj, Query, Relation, Type } from '@dxos/echo';
|
|
13
13
|
import { faker } from '@dxos/random';
|
|
14
|
-
import {
|
|
14
|
+
import { useQuery, useSpace } from '@dxos/react-client/echo';
|
|
15
15
|
import { useIdentity } from '@dxos/react-client/halo';
|
|
16
16
|
import { type ClientRepeatedComponentProps, ClientRepeater } from '@dxos/react-client/testing';
|
|
17
17
|
import { AnchoredTo, DataType } from '@dxos/schema';
|
|
@@ -32,11 +32,21 @@ const Story = ({ spaceKey }: ClientRepeatedComponentProps) => {
|
|
|
32
32
|
useEffect(() => {
|
|
33
33
|
if (identity && space) {
|
|
34
34
|
const t = setTimeout(async () => {
|
|
35
|
-
const object = space.db.add(
|
|
35
|
+
const object = space.db.add(Obj.make(Type.Expando, {}));
|
|
36
36
|
const thread1 = space.db.add(createCommentThread(identity));
|
|
37
37
|
const thread2 = space.db.add(createCommentThread(identity));
|
|
38
|
-
space.db.add(
|
|
39
|
-
|
|
38
|
+
space.db.add(
|
|
39
|
+
Relation.make(AnchoredTo, {
|
|
40
|
+
[Relation.Source]: thread1,
|
|
41
|
+
[Relation.Target]: object,
|
|
42
|
+
}),
|
|
43
|
+
);
|
|
44
|
+
space.db.add(
|
|
45
|
+
Relation.make(AnchoredTo, {
|
|
46
|
+
[Relation.Source]: thread2,
|
|
47
|
+
[Relation.Target]: object,
|
|
48
|
+
}),
|
|
49
|
+
);
|
|
40
50
|
});
|
|
41
51
|
|
|
42
52
|
return () => clearTimeout(t);
|
|
@@ -2,13 +2,11 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import { ChatText } from '@phosphor-icons/react';
|
|
6
5
|
import React, { useEffect } from 'react';
|
|
7
6
|
|
|
8
|
-
import {
|
|
7
|
+
import { Relation } from '@dxos/echo';
|
|
9
8
|
import { fullyQualifiedId } from '@dxos/react-client/echo';
|
|
10
|
-
import {
|
|
11
|
-
import { descriptionMessage, mx } from '@dxos/react-ui-theme';
|
|
9
|
+
import { Callout, Icon, Trans, useTranslation } from '@dxos/react-ui';
|
|
12
10
|
import { type AnchoredTo } from '@dxos/schema';
|
|
13
11
|
|
|
14
12
|
import { CommentContainer, type CommentContainerProps } from './CommentContainer';
|
|
@@ -28,9 +26,9 @@ export const CommentsContainer = ({ anchors, currentId, showResolvedThreads, ...
|
|
|
28
26
|
const { t } = useTranslation(THREAD_PLUGIN);
|
|
29
27
|
// TODO(wittjosiah): There seems to be a race between thread and anchor being deleted.
|
|
30
28
|
const filteredAnchors = showResolvedThreads
|
|
31
|
-
? anchors.filter((anchor) => !!anchor
|
|
29
|
+
? anchors.filter((anchor) => !!Relation.getSource(anchor))
|
|
32
30
|
: anchors.filter((anchor) => {
|
|
33
|
-
const thread = anchor
|
|
31
|
+
const thread = Relation.getSource(anchor);
|
|
34
32
|
return thread && thread.status !== 'resolved';
|
|
35
33
|
});
|
|
36
34
|
|
|
@@ -40,30 +38,29 @@ export const CommentsContainer = ({ anchors, currentId, showResolvedThreads, ...
|
|
|
40
38
|
}
|
|
41
39
|
}, [currentId]);
|
|
42
40
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
const threadId = fullyQualifiedId(thread);
|
|
49
|
-
return <CommentContainer key={threadId} anchor={anchor} current={currentId === threadId} {...props} />;
|
|
50
|
-
})
|
|
51
|
-
) : (
|
|
52
|
-
<div role='alert' className={mx(descriptionMessage, 'place-self-center rounded-lg text-center m-4')}>
|
|
53
|
-
<h2 className='mbe-2 font-medium text-baseText'>{t('no comments title')}</h2>
|
|
54
|
-
<p>
|
|
41
|
+
if (filteredAnchors.length === 0) {
|
|
42
|
+
return (
|
|
43
|
+
<div role='none' className='plb-cardSpacingBlock pli-cardSpacingInline'>
|
|
44
|
+
<Callout.Root>
|
|
45
|
+
<Callout.Title>
|
|
55
46
|
<Trans
|
|
56
47
|
{...{
|
|
57
48
|
t,
|
|
58
49
|
i18nKey: 'no comments message',
|
|
59
50
|
components: {
|
|
60
|
-
commentIcon: <
|
|
51
|
+
commentIcon: <Icon icon='ph--chat-text--regular' size={4} classNames='inline-block' />,
|
|
61
52
|
},
|
|
62
53
|
}}
|
|
63
54
|
/>
|
|
64
|
-
</
|
|
65
|
-
</
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
55
|
+
</Callout.Title>
|
|
56
|
+
</Callout.Root>
|
|
57
|
+
</div>
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return filteredAnchors.map((anchor) => {
|
|
62
|
+
const thread = Relation.getSource(anchor) as ThreadType;
|
|
63
|
+
const threadId = fullyQualifiedId(thread);
|
|
64
|
+
return <CommentContainer key={threadId} anchor={anchor} current={currentId === threadId} {...props} />;
|
|
65
|
+
});
|
|
69
66
|
};
|
|
@@ -7,9 +7,10 @@ import { Check, PencilSimple, X } from '@phosphor-icons/react';
|
|
|
7
7
|
import React, { forwardRef, useCallback, useEffect, useRef, useState } from 'react';
|
|
8
8
|
|
|
9
9
|
import { Surface } from '@dxos/app-framework';
|
|
10
|
+
import { type Obj, type Type } from '@dxos/echo';
|
|
10
11
|
import { RefArray } from '@dxos/live-object';
|
|
11
12
|
import { PublicKey } from '@dxos/react-client';
|
|
12
|
-
import { type
|
|
13
|
+
import { type SpaceMember } from '@dxos/react-client/echo';
|
|
13
14
|
import { useIdentity, type Identity } from '@dxos/react-client/halo';
|
|
14
15
|
import { Button, ButtonGroup, Tooltip, useOnTransition, useThemeContext, useTranslation } from '@dxos/react-ui';
|
|
15
16
|
import { createBasicExtensions, createThemeExtensions, useTextEditor } from '@dxos/react-ui-editor';
|
|
@@ -96,7 +97,7 @@ export const MessageContainer = ({ message, members, editable = false, onDelete
|
|
|
96
97
|
);
|
|
97
98
|
};
|
|
98
99
|
|
|
99
|
-
const MessagePart = ({ part }: { part: Expando }) => {
|
|
100
|
+
const MessagePart = ({ part }: { part: Type.Expando }) => {
|
|
100
101
|
return <MessageBlockObjectTile subject={part} />;
|
|
101
102
|
};
|
|
102
103
|
|
|
@@ -147,21 +148,20 @@ const TextboxBlock = ({
|
|
|
147
148
|
return <div role='none' ref={parentRef} className='mie-4' {...focusAttributes} />;
|
|
148
149
|
};
|
|
149
150
|
|
|
150
|
-
const MessageBlockObjectTile = forwardRef<HTMLDivElement, { subject:
|
|
151
|
-
(
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
);
|
|
151
|
+
const MessageBlockObjectTile = forwardRef<HTMLDivElement, { subject: Obj.Any }>(({ subject }, forwardedRef) => {
|
|
152
|
+
// TODO(burdon): Use annotation to get title.
|
|
153
|
+
let title = (subject as any).name ?? (subject as any).title ?? (subject as any).type ?? 'Object';
|
|
154
|
+
if (typeof title !== 'string') {
|
|
155
|
+
title = title?.content ?? '';
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return (
|
|
159
|
+
<div
|
|
160
|
+
role='group'
|
|
161
|
+
className={mx('grid col-span-3 py-1 pr-4', hoverableControls, hoverableFocusedWithinControls)}
|
|
162
|
+
ref={forwardedRef}
|
|
163
|
+
>
|
|
164
|
+
<Surface role='card' limit={1} data={{ subject }} fallback={title} />
|
|
165
|
+
</div>
|
|
166
|
+
);
|
|
167
|
+
});
|
|
@@ -6,7 +6,7 @@ import React, { useEffect, useState, type CSSProperties, type PropsWithChildren
|
|
|
6
6
|
|
|
7
7
|
import { Icon, IconButton, useTranslation, type ThemedClassName } from '@dxos/react-ui';
|
|
8
8
|
import { Waveform } from '@dxos/react-ui-sfx';
|
|
9
|
-
import {
|
|
9
|
+
import { groupHoverControlItemWithTransition, mx } from '@dxos/react-ui-theme';
|
|
10
10
|
|
|
11
11
|
import { THREAD_PLUGIN } from '../../meta';
|
|
12
12
|
|
|
@@ -89,7 +89,7 @@ export const ResponsiveGridItem = <T extends object = any>({
|
|
|
89
89
|
{onClick && (
|
|
90
90
|
<div className='z-10 absolute top-1 right-1 flex'>
|
|
91
91
|
<IconButton
|
|
92
|
-
classNames={mx('p-1 min-bs-1 rounded',
|
|
92
|
+
classNames={mx('p-1 min-bs-1 rounded', groupHoverControlItemWithTransition)}
|
|
93
93
|
iconOnly
|
|
94
94
|
icon={pinned ? 'ph--x--regular' : 'ph--arrows-out--regular'}
|
|
95
95
|
size={pinned ? 5 : 4}
|
|
@@ -5,17 +5,17 @@
|
|
|
5
5
|
import React, { useCallback, useMemo } from 'react';
|
|
6
6
|
|
|
7
7
|
import {
|
|
8
|
-
|
|
8
|
+
Capabilities,
|
|
9
9
|
LayoutAction,
|
|
10
|
+
createIntent,
|
|
10
11
|
useCapability,
|
|
11
12
|
useCapabilities,
|
|
12
13
|
useIntentDispatcher,
|
|
13
|
-
Capabilities,
|
|
14
14
|
} from '@dxos/app-framework';
|
|
15
|
-
import { Filter,
|
|
15
|
+
import { Filter, Obj, Query, Relation } from '@dxos/echo';
|
|
16
16
|
import { fullyQualifiedId, getSpace, useQuery } from '@dxos/react-client/echo';
|
|
17
17
|
import { useIdentity } from '@dxos/react-client/halo';
|
|
18
|
-
import { useTranslation } from '@dxos/react-ui';
|
|
18
|
+
import { useThemeContext, useTranslation } from '@dxos/react-ui';
|
|
19
19
|
import { useAttended } from '@dxos/react-ui-attention';
|
|
20
20
|
import { StackItem } from '@dxos/react-ui-stack';
|
|
21
21
|
import { Tabs } from '@dxos/react-ui-tabs';
|
|
@@ -30,9 +30,12 @@ export const ThreadComplementary = ({ subject }: { subject: any }) => {
|
|
|
30
30
|
const { dispatchPromise: dispatch } = useIntentDispatcher();
|
|
31
31
|
const identity = useIdentity();
|
|
32
32
|
const { t } = useTranslation(THREAD_PLUGIN);
|
|
33
|
+
const { tx } = useThemeContext();
|
|
34
|
+
const subjectId = fullyQualifiedId(subject);
|
|
33
35
|
|
|
34
36
|
const { state, getViewState } = useCapability(ThreadCapabilities.MutableState);
|
|
35
|
-
const
|
|
37
|
+
const drafts = state.drafts[subjectId];
|
|
38
|
+
const viewState = useMemo(() => getViewState(subjectId), [getViewState, subjectId]);
|
|
36
39
|
const { showResolvedThreads } = viewState;
|
|
37
40
|
const onChangeViewState = useCallback(
|
|
38
41
|
(nextValue: string) => {
|
|
@@ -40,24 +43,25 @@ export const ThreadComplementary = ({ subject }: { subject: any }) => {
|
|
|
40
43
|
},
|
|
41
44
|
[viewState],
|
|
42
45
|
);
|
|
43
|
-
const drafts = state.drafts[fullyQualifiedId(subject)];
|
|
44
46
|
|
|
45
47
|
const anchorSorts = useCapabilities(Capabilities.AnchorSort);
|
|
46
|
-
const sort = useMemo(
|
|
48
|
+
const sort = useMemo(
|
|
49
|
+
() => anchorSorts.find(({ key }) => key === Obj.getTypename(subject))?.sort,
|
|
50
|
+
[anchorSorts, subject],
|
|
51
|
+
);
|
|
47
52
|
|
|
48
53
|
const space = getSpace(subject);
|
|
49
54
|
const objectsAnchoredTo = useQuery(space, Query.select(Filter.ids(subject.id)).targetOf(AnchoredTo));
|
|
50
55
|
const anchors = objectsAnchoredTo
|
|
51
56
|
.toSorted((a, b) => sort?.(a, b) ?? 0)
|
|
52
|
-
.filter((anchor) =>
|
|
57
|
+
.filter((anchor) => Obj.instanceOf(ThreadType, Relation.getSource(anchor)))
|
|
53
58
|
.concat(drafts ?? []);
|
|
54
59
|
|
|
55
60
|
const attended = useAttended();
|
|
56
|
-
const qualifiedSubjectId = fullyQualifiedId(subject);
|
|
57
61
|
|
|
58
62
|
const handleAttend = useCallback(
|
|
59
63
|
(anchor: AnchoredTo) => {
|
|
60
|
-
const thread = anchor
|
|
64
|
+
const thread = Relation.getSource(anchor) as ThreadType;
|
|
61
65
|
const threadId = fullyQualifiedId(thread);
|
|
62
66
|
|
|
63
67
|
if (state.current !== threadId) {
|
|
@@ -87,7 +91,7 @@ export const ThreadComplementary = ({ subject }: { subject: any }) => {
|
|
|
87
91
|
createIntent(ThreadAction.AddMessage, { anchor, subject, sender: { identityDid: identity?.did }, text }),
|
|
88
92
|
);
|
|
89
93
|
|
|
90
|
-
const thread = anchor
|
|
94
|
+
const thread = Relation.getSource(anchor) as ThreadType;
|
|
91
95
|
state.current = fullyQualifiedId(thread);
|
|
92
96
|
},
|
|
93
97
|
[dispatch, identity, subject],
|
|
@@ -95,7 +99,7 @@ export const ThreadComplementary = ({ subject }: { subject: any }) => {
|
|
|
95
99
|
|
|
96
100
|
const handleResolve = useCallback(
|
|
97
101
|
(anchor: AnchoredTo) =>
|
|
98
|
-
dispatch(createIntent(ThreadAction.ToggleResolved, { thread: anchor
|
|
102
|
+
dispatch(createIntent(ThreadAction.ToggleResolved, { thread: Relation.getSource(anchor) as ThreadType })),
|
|
99
103
|
[dispatch],
|
|
100
104
|
);
|
|
101
105
|
|
|
@@ -113,7 +117,7 @@ export const ThreadComplementary = ({ subject }: { subject: any }) => {
|
|
|
113
117
|
const comments = (
|
|
114
118
|
<CommentsContainer
|
|
115
119
|
anchors={anchors}
|
|
116
|
-
currentId={attended.includes(
|
|
120
|
+
currentId={attended.includes(subjectId) ? state.current : undefined}
|
|
117
121
|
showResolvedThreads={showResolvedThreads}
|
|
118
122
|
onAttend={handleAttend}
|
|
119
123
|
onComment={handleComment}
|
|
@@ -127,11 +131,11 @@ export const ThreadComplementary = ({ subject }: { subject: any }) => {
|
|
|
127
131
|
<StackItem.Content toolbar>
|
|
128
132
|
<Tabs.Root
|
|
129
133
|
value={showResolvedThreads ? 'all' : 'unresolved'}
|
|
130
|
-
onValueChange={onChangeViewState}
|
|
131
134
|
orientation='horizontal'
|
|
132
135
|
classNames='contents [&_[role="tabpanel"]]:min-bs-0 [&_[role="tabpanel"]]:overflow-y-auto [&_[role="tabpanel"]]:scrollbar-thin'
|
|
136
|
+
onValueChange={onChangeViewState}
|
|
133
137
|
>
|
|
134
|
-
<Tabs.Tablist classNames='
|
|
138
|
+
<Tabs.Tablist classNames={tx('toolbar.root', 'toolbar', {})}>
|
|
135
139
|
<Tabs.Tab value='unresolved' classNames='text-sm'>
|
|
136
140
|
{t('show unresolved label')}
|
|
137
141
|
</Tabs.Tab>
|
|
@@ -2,20 +2,20 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
import { Obj, Ref } from '@dxos/echo';
|
|
5
6
|
import { IdentityDid } from '@dxos/keys';
|
|
6
|
-
import { live, makeRef } from '@dxos/live-object';
|
|
7
7
|
import { faker } from '@dxos/random';
|
|
8
8
|
import { type Identity } from '@dxos/react-client/halo';
|
|
9
9
|
import { DataType } from '@dxos/schema';
|
|
10
10
|
|
|
11
11
|
import { ThreadType } from '../types';
|
|
12
12
|
|
|
13
|
-
export const createCommentThread = (identity: Identity) => {
|
|
14
|
-
return
|
|
13
|
+
export const createCommentThread = (identity: Identity): ThreadType => {
|
|
14
|
+
return Obj.make(ThreadType, {
|
|
15
15
|
messages: faker.helpers.multiple(
|
|
16
16
|
() =>
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
Ref.make(
|
|
18
|
+
Obj.make(DataType.Message, {
|
|
19
19
|
sender: {
|
|
20
20
|
identityDid: faker.datatype.boolean() ? identity.did : IdentityDid.random(),
|
|
21
21
|
},
|
|
@@ -7,7 +7,7 @@ import { EditorView } from '@codemirror/view';
|
|
|
7
7
|
import { computed, effect } from '@preact/signals-core';
|
|
8
8
|
|
|
9
9
|
import { createIntent, type PromiseIntentDispatcher } from '@dxos/app-framework';
|
|
10
|
-
import { Filter,
|
|
10
|
+
import { Filter, Obj, Query, Relation } from '@dxos/echo';
|
|
11
11
|
import { type DocumentType } from '@dxos/plugin-markdown/types';
|
|
12
12
|
import { getSpace, getTextInRange, createDocAccessor, fullyQualifiedId, getSource } from '@dxos/react-client/echo';
|
|
13
13
|
import { comments, createExternalCommentSync } from '@dxos/react-ui-editor';
|
|
@@ -40,8 +40,8 @@ export const threads = (state: ThreadState, doc?: DocumentType, dispatch?: Promi
|
|
|
40
40
|
const anchors = computed(() =>
|
|
41
41
|
query.objects
|
|
42
42
|
.filter((anchor) => {
|
|
43
|
-
const thread = anchor
|
|
44
|
-
return
|
|
43
|
+
const thread = Relation.getSource(anchor);
|
|
44
|
+
return Obj.instanceOf(ThreadType, thread) && thread.status !== 'resolved';
|
|
45
45
|
})
|
|
46
46
|
.concat(state.drafts[fullyQualifiedId(doc)] ?? []),
|
|
47
47
|
);
|
|
@@ -60,7 +60,7 @@ export const threads = (state: ThreadState, doc?: DocumentType, dispatch?: Promi
|
|
|
60
60
|
// Only update if the name has changed, otherwise this will cause an infinite loop.
|
|
61
61
|
// Skip if the name is empty; this means comment text was deleted, but thread name should remain.
|
|
62
62
|
const name = getName(doc, anchor.anchor);
|
|
63
|
-
const thread = anchor
|
|
63
|
+
const thread = Relation.getSource(anchor) as ThreadType;
|
|
64
64
|
if (name && name !== thread.name) {
|
|
65
65
|
thread.name = name;
|
|
66
66
|
}
|
|
@@ -75,7 +75,7 @@ export const threads = (state: ThreadState, doc?: DocumentType, dispatch?: Promi
|
|
|
75
75
|
() =>
|
|
76
76
|
anchors.value
|
|
77
77
|
.filter((anchor) => anchor.anchor)
|
|
78
|
-
.map((anchor) => ({ id: fullyQualifiedId(anchor
|
|
78
|
+
.map((anchor) => ({ id: fullyQualifiedId(Relation.getSource(anchor)), cursor: anchor.anchor })),
|
|
79
79
|
),
|
|
80
80
|
|
|
81
81
|
comments({
|
|
@@ -101,7 +101,7 @@ export const threads = (state: ThreadState, doc?: DocumentType, dispatch?: Promi
|
|
|
101
101
|
onUpdate: ({ id, cursor }) => {
|
|
102
102
|
const draft = state.drafts[fullyQualifiedId(doc)]?.find((thread) => fullyQualifiedId(thread) === id);
|
|
103
103
|
if (draft) {
|
|
104
|
-
const thread = draft
|
|
104
|
+
const thread = Relation.getSource(draft) as ThreadType;
|
|
105
105
|
thread.name = getName(doc, cursor);
|
|
106
106
|
draft.anchor = cursor;
|
|
107
107
|
}
|
|
@@ -109,7 +109,7 @@ export const threads = (state: ThreadState, doc?: DocumentType, dispatch?: Promi
|
|
|
109
109
|
const relation = query.objects.find((object) => getSource(object).id === id);
|
|
110
110
|
if (relation) {
|
|
111
111
|
const thread = getSource(relation);
|
|
112
|
-
if (
|
|
112
|
+
if (Obj.instanceOf(ThreadType, thread)) {
|
|
113
113
|
thread.name = getName(doc, cursor);
|
|
114
114
|
relation.anchor = cursor;
|
|
115
115
|
}
|
package/src/testing/stories.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { IntentPlugin, SettingsPlugin } from '@dxos/app-framework';
|
|
6
|
-
import {
|
|
6
|
+
import { Obj } from '@dxos/echo';
|
|
7
7
|
import { ClientPlugin } from '@dxos/plugin-client';
|
|
8
8
|
import { GraphPlugin } from '@dxos/plugin-graph';
|
|
9
9
|
import { SpacePlugin } from '@dxos/plugin-space';
|
|
@@ -23,8 +23,8 @@ export const createThreadPlugins = async () => [
|
|
|
23
23
|
},
|
|
24
24
|
onSpacesReady: async (_, client) => {
|
|
25
25
|
await client.spaces.default.waitUntilReady();
|
|
26
|
-
const thread =
|
|
27
|
-
client.spaces.default.db.add(
|
|
26
|
+
const thread = Obj.make(ThreadType, { messages: [] });
|
|
27
|
+
client.spaces.default.db.add(Obj.make(ChannelType, { defaultThread: Ref.make(thread), threads: [] }));
|
|
28
28
|
},
|
|
29
29
|
config: new Config({
|
|
30
30
|
runtime: {
|
package/src/translations.ts
CHANGED
|
@@ -2,14 +2,19 @@
|
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
import { Type } from '@dxos/echo';
|
|
6
|
+
|
|
5
7
|
import { THREAD_PLUGIN } from './meta';
|
|
6
8
|
import { ChannelType } from './types';
|
|
7
9
|
|
|
8
10
|
export default [
|
|
9
11
|
{
|
|
10
12
|
'en-US': {
|
|
11
|
-
[ChannelType
|
|
13
|
+
[Type.getTypename(ChannelType)]: {
|
|
12
14
|
'typename label': 'Channel',
|
|
15
|
+
'typename label_zero': 'Channels',
|
|
16
|
+
'typename label_one': 'Channel',
|
|
17
|
+
'typename label_other': 'Channels',
|
|
13
18
|
'object name placeholder': 'New channel',
|
|
14
19
|
},
|
|
15
20
|
[THREAD_PLUGIN]: {
|
|
@@ -39,7 +44,7 @@ export default [
|
|
|
39
44
|
'open comments panel label': 'Show Comments',
|
|
40
45
|
'comments label': 'Comments',
|
|
41
46
|
'show all label': 'All comments',
|
|
42
|
-
'show unresolved label': 'Unresolved
|
|
47
|
+
'show unresolved label': 'Unresolved comments',
|
|
43
48
|
|
|
44
49
|
'channel companion label': 'Channel',
|
|
45
50
|
'call panel label': 'Active Call',
|
package/src/types/schema.ts
CHANGED
|
@@ -13,17 +13,21 @@ export const ThreadStatus = Schema.Union(
|
|
|
13
13
|
Schema.Literal('resolved'),
|
|
14
14
|
);
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
const _ThreadType = Schema.Struct({
|
|
17
17
|
name: Schema.optional(Schema.String),
|
|
18
18
|
status: Schema.optional(ThreadStatus),
|
|
19
19
|
messages: Schema.mutable(Schema.Array(Type.Ref(DataType.Message))),
|
|
20
20
|
}).pipe(Type.Obj({ typename: 'dxos.org/type/Thread', version: '0.1.0' }));
|
|
21
|
-
export
|
|
21
|
+
export interface ThreadType extends Schema.Schema.Type<typeof _ThreadType> {}
|
|
22
|
+
export const ThreadType: Type.obj<Schema.Schema<ThreadType, Schema.Schema.Encoded<typeof _ThreadType>, never>> =
|
|
23
|
+
_ThreadType;
|
|
22
24
|
|
|
23
|
-
|
|
25
|
+
const _ChannelType = Schema.Struct({
|
|
24
26
|
name: Schema.optional(Schema.String),
|
|
25
27
|
defaultThread: Type.Ref(ThreadType),
|
|
26
28
|
// TODO(wittjosiah): Should be an "ordered collection".
|
|
27
29
|
threads: Schema.mutable(Schema.Array(Type.Ref(ThreadType))),
|
|
28
30
|
}).pipe(Type.Obj({ typename: 'dxos.org/type/Channel', version: '0.1.0' }));
|
|
29
|
-
export
|
|
31
|
+
export interface ChannelType extends Schema.Schema.Type<typeof _ChannelType> {}
|
|
32
|
+
export const ChannelType: Type.obj<Schema.Schema<ChannelType, Schema.Schema.Encoded<typeof _ChannelType>, never>> =
|
|
33
|
+
_ChannelType;
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/app-graph-builder.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Rx } from '@effect-rx/rx-react';\nimport { Option, pipe } from 'effect';\n\nimport { Capabilities, contributes, createIntent, type PluginContext } from '@dxos/app-framework';\nimport { getTypename, isInstanceOf } from '@dxos/echo-schema';\nimport { AttentionCapabilities } from '@dxos/plugin-attention';\nimport { PLANK_COMPANION_TYPE, ATTENDABLE_PATH_SEPARATOR, DECK_COMPANION_TYPE } from '@dxos/plugin-deck/types';\nimport { createExtension, ROOT_ID, rxFromSignal } from '@dxos/plugin-graph';\nimport { fullyQualifiedId, isEchoObject } from '@dxos/react-client/echo';\n\nimport { ThreadCapabilities } from './capabilities';\nimport { meta, THREAD_PLUGIN } from '../meta';\nimport { ChannelType, ThreadAction } from '../types';\nimport { getAnchor } from '../util';\n\nexport default (context: PluginContext) => {\n const resolve = (typename: string) =>\n context.getCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {};\n\n return contributes(Capabilities.AppGraphBuilder, [\n createExtension({\n id: `${THREAD_PLUGIN}/active-call`,\n connector: (node) =>\n Rx.make((get) =>\n pipe(\n get(node),\n Option.flatMap((node) => (node.id === ROOT_ID ? Option.some(node) : Option.none())),\n Option.map((node) => {\n const [call] = get(context.capabilities(ThreadCapabilities.CallManager));\n return get(\n rxFromSignal(() =>\n call?.joined\n ? [\n {\n id: `${node.id}${ATTENDABLE_PATH_SEPARATOR}active-call`,\n type: DECK_COMPANION_TYPE,\n data: null,\n properties: {\n label: ['call panel label', { ns: THREAD_PLUGIN }],\n icon: 'ph--video-conference--regular',\n position: 'hoist',\n disposition: 'hidden',\n },\n },\n ]\n : [],\n ),\n );\n }),\n Option.getOrElse(() => []),\n ),\n ),\n }),\n // TODO(wittjosiah): The channel shouldn't become the companion during a call.\n // Alternative: the call/meeting/thread should be a child node of the channel and that should be opened.\n createExtension({\n id: `${THREAD_PLUGIN}/channel-chat-companion`,\n connector: (node) => {\n return Rx.make((get) => {\n return pipe(\n get(node),\n Option.flatMap((node) => (isInstanceOf(ChannelType, node.data) ? Option.some(node.data) : Option.none())),\n Option.map((channel) => {\n const callManager = context.getCapability(ThreadCapabilities.CallManager);\n const joined = get(\n rxFromSignal(() => callManager.joined && callManager.roomId === fullyQualifiedId(channel)),\n );\n if (!joined) {\n return [];\n }\n\n return [\n {\n id: `${fullyQualifiedId(channel)}${ATTENDABLE_PATH_SEPARATOR}chat`,\n type: PLANK_COMPANION_TYPE,\n data: 'chat',\n properties: {\n label: ['channel companion label', { ns: THREAD_PLUGIN }],\n icon: 'ph--hash--regular',\n position: 'hoist',\n disposition: 'hidden',\n },\n },\n ];\n }),\n Option.getOrElse(() => []),\n );\n });\n },\n }),\n createExtension({\n id: `${meta.id}/comments-companion`,\n connector: (node) =>\n Rx.make((get) =>\n pipe(\n get(node),\n Option.flatMap((node) => {\n if (!isEchoObject(node.data) || isInstanceOf(ChannelType, node.data)) {\n return Option.none();\n }\n const metadata = resolve(getTypename(node.data)!);\n return typeof metadata.comments === 'string' ? Option.some(node) : Option.none();\n }),\n Option.map((node) => [\n {\n id: [node.id, 'comments'].join(ATTENDABLE_PATH_SEPARATOR),\n type: PLANK_COMPANION_TYPE,\n data: 'comments',\n properties: {\n label: ['comments label', { ns: meta.id }],\n icon: 'ph--chat-text--regular',\n disposition: 'hidden',\n position: 'hoist',\n },\n },\n ]),\n Option.getOrElse(() => []),\n ),\n ),\n }),\n createExtension({\n id: `${meta.id}/comment-toolbar`,\n actions: (node) =>\n Rx.make((get) =>\n pipe(\n get(node),\n Option.flatMap((node) => {\n if (!isEchoObject(node.data) || isInstanceOf(ChannelType, node.data)) {\n return Option.none();\n }\n const metadata = resolve(getTypename(node.data)!);\n return typeof metadata.comments === 'string' ? Option.some(node.data) : Option.none();\n }),\n Option.map((object) => {\n const selectionManager = context.getCapability(AttentionCapabilities.Selection);\n const toolbar = get(context.capabilities(ThreadCapabilities.State))[0]?.state.toolbar ?? {};\n const disabled = get(\n rxFromSignal(() => {\n const metadata = resolve(getTypename(object)!);\n const selection = selectionManager.getSelection(fullyQualifiedId(object), metadata.selectionMode);\n const anchor = getAnchor(selection);\n const invalidSelection = !anchor;\n const overlappingComment = toolbar[fullyQualifiedId(object)];\n return (metadata.comments === 'anchored' && invalidSelection) || overlappingComment;\n }),\n );\n\n return [\n {\n id: `${fullyQualifiedId(object)}/comment`,\n data: () => {\n const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);\n const metadata = resolve(getTypename(object)!);\n const selection = selectionManager.getSelection(fullyQualifiedId(object));\n // TODO(wittjosiah): Use presence of selection to determine if the comment should be anchored.\n // Requires all components which support selection (e.g. table/kanban) to support anchored comments.\n const anchor = metadata.comments === 'anchored' ? getAnchor(selection) : Date.now().toString();\n const name = metadata.getAnchorLabel?.(object, anchor);\n void dispatch(createIntent(ThreadAction.Create, { anchor, name, subject: object }));\n },\n properties: {\n label: ['add comment label', { ns: meta.id }],\n icon: 'ph--chat-text--regular',\n disposition: 'toolbar',\n disabled,\n testId: 'thread.comment.add',\n },\n },\n ];\n }),\n Option.getOrElse(() => []),\n ),\n ),\n }),\n ]);\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["Rx", "Option", "pipe", "Capabilities", "contributes", "createIntent", "getTypename", "isInstanceOf", "AttentionCapabilities", "PLANK_COMPANION_TYPE", "ATTENDABLE_PATH_SEPARATOR", "DECK_COMPANION_TYPE", "createExtension", "ROOT_ID", "rxFromSignal", "fullyQualifiedId", "isEchoObject", "context", "resolve", "typename", "getCapabilities", "Capabilities", "Metadata", "find", "id", "metadata", "contributes", "AppGraphBuilder", "createExtension", "THREAD_PLUGIN", "connector", "node", "Rx", "make", "get", "pipe", "Option", "flatMap", "ROOT_ID", "some", "none", "map", "call", "capabilities", "ThreadCapabilities", "CallManager", "rxFromSignal", "joined", "ATTENDABLE_PATH_SEPARATOR", "type", "DECK_COMPANION_TYPE", "data", "properties", "label", "ns", "icon", "position", "disposition", "getOrElse", "isInstanceOf", "ChannelType", "channel", "callManager", "getCapability", "roomId", "fullyQualifiedId", "PLANK_COMPANION_TYPE", "meta", "isEchoObject", "getTypename", "comments", "join", "actions", "object", "selectionManager", "AttentionCapabilities", "Selection", "toolbar", "State", "state", "disabled", "selection", "getSelection", "selectionMode", "anchor", "getAnchor", "invalidSelection", "overlappingComment", "dispatchPromise", "dispatch", "IntentDispatcher", "Date", "now", "toString", "name", "getAnchorLabel", "createIntent", "ThreadAction", "Create", "subject", "testId"]
|
|
7
|
-
}
|