@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.
Files changed (158) hide show
  1. package/dist/lib/browser/{ChannelContainer-LGYSQMC7.mjs → ChannelContainer-PKFBVENP.mjs} +4 -4
  2. package/dist/lib/browser/{ChatContainer-JWRI73OG.mjs → ChatContainer-RSOKYAMK.mjs} +2 -2
  3. package/dist/lib/browser/{app-graph-builder-K3CFBN7V.mjs → app-graph-builder-OY7R7EJP.mjs} +11 -11
  4. package/dist/lib/browser/app-graph-builder-OY7R7EJP.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-6NBVNXTM.mjs +21 -0
  6. package/dist/lib/browser/{chunk-WDOQXTI2.mjs → chunk-AEXWNS6Z.mjs} +5 -3
  7. package/dist/lib/browser/chunk-AEXWNS6Z.mjs.map +7 -0
  8. package/dist/lib/browser/{chunk-KMVGJG23.mjs → chunk-PG5CTFKK.mjs} +50 -45
  9. package/dist/lib/browser/chunk-PG5CTFKK.mjs.map +7 -0
  10. package/dist/lib/browser/{chunk-G3TS64FP.mjs → chunk-TAFSCSUR.mjs} +4 -4
  11. package/dist/lib/browser/chunk-TAFSCSUR.mjs.map +7 -0
  12. package/dist/lib/browser/{chunk-5PGLGDIP.mjs → chunk-XZKBN3NS.mjs} +35 -35
  13. package/dist/lib/browser/chunk-XZKBN3NS.mjs.map +7 -0
  14. package/dist/lib/browser/index.mjs +35 -9
  15. package/dist/lib/browser/index.mjs.map +3 -3
  16. package/dist/lib/browser/{intent-resolver-YUYZCTLF.mjs → intent-resolver-FK2MDVDT.mjs} +24 -26
  17. package/dist/lib/browser/intent-resolver-FK2MDVDT.mjs.map +7 -0
  18. package/dist/lib/browser/{markdown-4EC3OCF2.mjs → markdown-TE5SWWNJ.mjs} +9 -9
  19. package/dist/lib/browser/markdown-TE5SWWNJ.mjs.map +7 -0
  20. package/dist/lib/browser/meta.json +1 -1
  21. package/dist/lib/browser/{react-root-EECCWHCW.mjs → react-root-NK3A4VG7.mjs} +6 -6
  22. package/dist/lib/browser/{react-surface-5QLZAFDL.mjs → react-surface-VXUJKSOG.mjs} +12 -12
  23. package/dist/lib/browser/react-surface-VXUJKSOG.mjs.map +7 -0
  24. package/dist/lib/browser/{settings-KVBQQSO5.mjs → settings-RB2RSLXV.mjs} +4 -4
  25. package/dist/lib/browser/settings-RB2RSLXV.mjs.map +7 -0
  26. package/dist/lib/browser/types/index.mjs +1 -1
  27. package/dist/lib/node/{ChannelContainer-5EKNEH56.cjs → ChannelContainer-YS5YT2ML.cjs} +9 -9
  28. package/dist/lib/node/{ChannelContainer-5EKNEH56.cjs.map → ChannelContainer-YS5YT2ML.cjs.map} +2 -2
  29. package/dist/lib/node/{ChatContainer-EE3FPSYO.cjs → ChatContainer-GCOM3M56.cjs} +8 -8
  30. package/dist/lib/node/{ChatContainer-EE3FPSYO.cjs.map → ChatContainer-GCOM3M56.cjs.map} +2 -2
  31. package/dist/lib/node/{app-graph-builder-IRE3GYKE.cjs → app-graph-builder-PBHJNDQY.cjs} +21 -21
  32. package/dist/lib/node/app-graph-builder-PBHJNDQY.cjs.map +7 -0
  33. package/dist/lib/node/{chunk-4B3PPXA6.cjs → chunk-E3WBZTTI.cjs} +12 -12
  34. package/dist/lib/node/chunk-E3WBZTTI.cjs.map +7 -0
  35. package/dist/lib/node/{chunk-U7NOIXN6.cjs → chunk-ERG7G6FF.cjs} +10 -10
  36. package/dist/lib/node/{chunk-JLHENFGK.cjs → chunk-IP533AMV.cjs} +76 -71
  37. package/dist/lib/node/chunk-IP533AMV.cjs.map +7 -0
  38. package/dist/lib/node/{chunk-6B3M6XRE.cjs → chunk-UM36TPCT.cjs} +37 -37
  39. package/dist/lib/node/chunk-UM36TPCT.cjs.map +7 -0
  40. package/dist/lib/node/{chunk-TKHJVC2C.cjs → chunk-ZGDN3XBR.cjs} +8 -6
  41. package/dist/lib/node/chunk-ZGDN3XBR.cjs.map +7 -0
  42. package/dist/lib/node/index.cjs +45 -19
  43. package/dist/lib/node/index.cjs.map +3 -3
  44. package/dist/lib/node/{intent-resolver-MZ3HADNY.cjs → intent-resolver-SYSJ5SJG.cjs} +50 -52
  45. package/dist/lib/node/intent-resolver-SYSJ5SJG.cjs.map +7 -0
  46. package/dist/lib/node/{markdown-NJDPXIKD.cjs → markdown-GQIPJS2F.cjs} +27 -27
  47. package/dist/lib/node/markdown-GQIPJS2F.cjs.map +7 -0
  48. package/dist/lib/node/meta.json +1 -1
  49. package/dist/lib/node/{react-root-IAYQ2DBO.cjs → react-root-6HHDMULJ.cjs} +10 -10
  50. package/dist/lib/node/{react-surface-AVC5VVIS.cjs → react-surface-NBH42NN2.cjs} +24 -24
  51. package/dist/lib/node/react-surface-NBH42NN2.cjs.map +7 -0
  52. package/dist/lib/node/{settings-H45P5YO2.cjs → settings-4LQSFEDK.cjs} +7 -7
  53. package/dist/lib/node/settings-4LQSFEDK.cjs.map +7 -0
  54. package/dist/lib/node/types/index.cjs +6 -6
  55. package/dist/lib/node/types/index.cjs.map +1 -1
  56. package/dist/lib/node-esm/{ChannelContainer-KFS2RWWW.mjs → ChannelContainer-O4QJII2P.mjs} +4 -4
  57. package/dist/lib/node-esm/{ChatContainer-UJYPQMLV.mjs → ChatContainer-F6CSADV7.mjs} +2 -2
  58. package/dist/lib/node-esm/{app-graph-builder-I5VMPLE4.mjs → app-graph-builder-BAHBHYWI.mjs} +11 -11
  59. package/dist/lib/node-esm/app-graph-builder-BAHBHYWI.mjs.map +7 -0
  60. package/dist/lib/node-esm/{chunk-X6AUQDTE.mjs → chunk-2RNIPFDA.mjs} +35 -35
  61. package/dist/lib/node-esm/chunk-2RNIPFDA.mjs.map +7 -0
  62. package/dist/lib/node-esm/{chunk-ODUB4GAB.mjs → chunk-O63QJPQX.mjs} +7 -7
  63. package/dist/lib/node-esm/{chunk-POKXRTII.mjs → chunk-P6RLFCNT.mjs} +4 -4
  64. package/dist/lib/node-esm/chunk-P6RLFCNT.mjs.map +7 -0
  65. package/dist/lib/node-esm/{chunk-J323VQ4P.mjs → chunk-UJMPYKT3.mjs} +5 -3
  66. package/dist/lib/node-esm/chunk-UJMPYKT3.mjs.map +7 -0
  67. package/dist/lib/node-esm/{chunk-MNJ3V4XM.mjs → chunk-UZWVVFT3.mjs} +50 -45
  68. package/dist/lib/node-esm/chunk-UZWVVFT3.mjs.map +7 -0
  69. package/dist/lib/node-esm/index.mjs +35 -9
  70. package/dist/lib/node-esm/index.mjs.map +3 -3
  71. package/dist/lib/node-esm/{intent-resolver-CU22OPAH.mjs → intent-resolver-BU73VYW3.mjs} +24 -26
  72. package/dist/lib/node-esm/intent-resolver-BU73VYW3.mjs.map +7 -0
  73. package/dist/lib/node-esm/{markdown-HRGGO7IA.mjs → markdown-HJUWNBLS.mjs} +9 -9
  74. package/dist/lib/node-esm/markdown-HJUWNBLS.mjs.map +7 -0
  75. package/dist/lib/node-esm/meta.json +1 -1
  76. package/dist/lib/node-esm/{react-root-NQMUEI6Z.mjs → react-root-RUXOAQNW.mjs} +6 -6
  77. package/dist/lib/node-esm/{react-surface-Z4X5VLMY.mjs → react-surface-ELXFYKP6.mjs} +12 -12
  78. package/dist/lib/node-esm/react-surface-ELXFYKP6.mjs.map +7 -0
  79. package/dist/lib/node-esm/{settings-IJGUOU3F.mjs → settings-EA7DFSM6.mjs} +4 -4
  80. package/dist/lib/node-esm/settings-EA7DFSM6.mjs.map +7 -0
  81. package/dist/lib/node-esm/types/index.mjs +1 -1
  82. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  83. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  84. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  85. package/dist/types/src/components/ChatContainer.d.ts +3 -2
  86. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  87. package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
  88. package/dist/types/src/components/CommentsContainer.d.ts +1 -1
  89. package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
  90. package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
  91. package/dist/types/src/components/ThreadComplementary.d.ts.map +1 -1
  92. package/dist/types/src/components/testing.d.ts +2 -103
  93. package/dist/types/src/components/testing.d.ts.map +1 -1
  94. package/dist/types/src/translations.d.ts +128 -2
  95. package/dist/types/src/translations.d.ts.map +1 -1
  96. package/dist/types/src/types/schema.d.ts +117 -301
  97. package/dist/types/src/types/schema.d.ts.map +1 -1
  98. package/dist/types/src/types/types.d.ts +153 -828
  99. package/dist/types/src/types/types.d.ts.map +1 -1
  100. package/package.json +42 -42
  101. package/src/ThreadPlugin.tsx +29 -6
  102. package/src/capabilities/app-graph-builder.ts +9 -9
  103. package/src/capabilities/intent-resolver.ts +26 -26
  104. package/src/capabilities/react-surface.tsx +7 -7
  105. package/src/capabilities/settings.ts +7 -2
  106. package/src/components/Call/Toolbar.tsx +3 -3
  107. package/src/components/ChannelContainer.tsx +18 -22
  108. package/src/components/Chat.stories.tsx +4 -4
  109. package/src/components/ChatContainer.tsx +6 -6
  110. package/src/components/CommentContainer.tsx +2 -2
  111. package/src/components/Comments.stories.tsx +15 -5
  112. package/src/components/CommentsContainer.tsx +21 -24
  113. package/src/components/MessageContainer.tsx +20 -20
  114. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +2 -2
  115. package/src/components/ThreadComplementary.tsx +19 -15
  116. package/src/components/testing.ts +5 -5
  117. package/src/extensions/threads.ts +7 -7
  118. package/src/testing/stories.ts +3 -3
  119. package/src/translations.ts +7 -2
  120. package/src/types/schema.ts +8 -4
  121. package/dist/lib/browser/app-graph-builder-K3CFBN7V.mjs.map +0 -7
  122. package/dist/lib/browser/chunk-5PGLGDIP.mjs.map +0 -7
  123. package/dist/lib/browser/chunk-CF2MXRCH.mjs +0 -21
  124. package/dist/lib/browser/chunk-G3TS64FP.mjs.map +0 -7
  125. package/dist/lib/browser/chunk-KMVGJG23.mjs.map +0 -7
  126. package/dist/lib/browser/chunk-WDOQXTI2.mjs.map +0 -7
  127. package/dist/lib/browser/intent-resolver-YUYZCTLF.mjs.map +0 -7
  128. package/dist/lib/browser/markdown-4EC3OCF2.mjs.map +0 -7
  129. package/dist/lib/browser/react-surface-5QLZAFDL.mjs.map +0 -7
  130. package/dist/lib/browser/settings-KVBQQSO5.mjs.map +0 -7
  131. package/dist/lib/node/app-graph-builder-IRE3GYKE.cjs.map +0 -7
  132. package/dist/lib/node/chunk-4B3PPXA6.cjs.map +0 -7
  133. package/dist/lib/node/chunk-6B3M6XRE.cjs.map +0 -7
  134. package/dist/lib/node/chunk-JLHENFGK.cjs.map +0 -7
  135. package/dist/lib/node/chunk-TKHJVC2C.cjs.map +0 -7
  136. package/dist/lib/node/intent-resolver-MZ3HADNY.cjs.map +0 -7
  137. package/dist/lib/node/markdown-NJDPXIKD.cjs.map +0 -7
  138. package/dist/lib/node/react-surface-AVC5VVIS.cjs.map +0 -7
  139. package/dist/lib/node/settings-H45P5YO2.cjs.map +0 -7
  140. package/dist/lib/node-esm/app-graph-builder-I5VMPLE4.mjs.map +0 -7
  141. package/dist/lib/node-esm/chunk-J323VQ4P.mjs.map +0 -7
  142. package/dist/lib/node-esm/chunk-MNJ3V4XM.mjs.map +0 -7
  143. package/dist/lib/node-esm/chunk-POKXRTII.mjs.map +0 -7
  144. package/dist/lib/node-esm/chunk-X6AUQDTE.mjs.map +0 -7
  145. package/dist/lib/node-esm/intent-resolver-CU22OPAH.mjs.map +0 -7
  146. package/dist/lib/node-esm/markdown-HRGGO7IA.mjs.map +0 -7
  147. package/dist/lib/node-esm/react-surface-Z4X5VLMY.mjs.map +0 -7
  148. package/dist/lib/node-esm/settings-IJGUOU3F.mjs.map +0 -7
  149. /package/dist/lib/browser/{ChannelContainer-LGYSQMC7.mjs.map → ChannelContainer-PKFBVENP.mjs.map} +0 -0
  150. /package/dist/lib/browser/{ChatContainer-JWRI73OG.mjs.map → ChatContainer-RSOKYAMK.mjs.map} +0 -0
  151. /package/dist/lib/browser/{chunk-CF2MXRCH.mjs.map → chunk-6NBVNXTM.mjs.map} +0 -0
  152. /package/dist/lib/browser/{react-root-EECCWHCW.mjs.map → react-root-NK3A4VG7.mjs.map} +0 -0
  153. /package/dist/lib/node/{chunk-U7NOIXN6.cjs.map → chunk-ERG7G6FF.cjs.map} +0 -0
  154. /package/dist/lib/node/{react-root-IAYQ2DBO.cjs.map → react-root-6HHDMULJ.cjs.map} +0 -0
  155. /package/dist/lib/node-esm/{ChannelContainer-KFS2RWWW.mjs.map → ChannelContainer-O4QJII2P.mjs.map} +0 -0
  156. /package/dist/lib/node-esm/{ChatContainer-UJYPQMLV.mjs.map → ChatContainer-F6CSADV7.mjs.map} +0 -0
  157. /package/dist/lib/node-esm/{chunk-ODUB4GAB.mjs.map → chunk-O63QJPQX.mjs.map} +0 -0
  158. /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 { Expando, Query, RelationSourceId, RelationTargetId } from '@dxos/echo-schema';
12
+ import { Obj, Query, Relation, Type } from '@dxos/echo';
13
13
  import { faker } from '@dxos/random';
14
- import { live, useQuery, useSpace } from '@dxos/react-client/echo';
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(live(Expando, {}));
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(live(AnchoredTo, { [RelationSourceId]: thread1, [RelationTargetId]: object }));
39
- space.db.add(live(AnchoredTo, { [RelationSourceId]: thread2, [RelationTargetId]: object }));
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 { RelationSourceId } from '@dxos/echo-schema';
7
+ import { Relation } from '@dxos/echo';
9
8
  import { fullyQualifiedId } from '@dxos/react-client/echo';
10
- import { useTranslation, Trans } from '@dxos/react-ui';
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[RelationSourceId])
29
+ ? anchors.filter((anchor) => !!Relation.getSource(anchor))
32
30
  : anchors.filter((anchor) => {
33
- const thread = anchor[RelationSourceId];
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
- return (
44
- <>
45
- {filteredAnchors.length > 0 ? (
46
- filteredAnchors.map((anchor) => {
47
- const thread = anchor[RelationSourceId] as ThreadType;
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: <ChatText className='inline-block' />,
51
+ commentIcon: <Icon icon='ph--chat-text--regular' size={4} classNames='inline-block' />,
61
52
  },
62
53
  }}
63
54
  />
64
- </p>
65
- </div>
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 AnyLiveObject, type Expando, type SpaceMember } from '@dxos/react-client/echo';
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: AnyLiveObject<any> }>(
151
- ({ subject }, forwardedRef) => {
152
- let title = subject.name ?? subject.title ?? subject.type ?? 'Object';
153
- if (typeof title !== 'string') {
154
- title = title?.content ?? '';
155
- }
156
-
157
- return (
158
- <div
159
- role='group'
160
- className={mx('grid col-span-3 py-1 pr-4', hoverableControls, hoverableFocusedWithinControls)}
161
- ref={forwardedRef}
162
- >
163
- <Surface role='card' limit={1} data={{ subject }} fallback={title} />
164
- </div>
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 { hoverableHidden, mx } from '@dxos/react-ui-theme';
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', hoverableHidden)}
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
- createIntent,
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, getTypename, isInstanceOf, Query, RelationSourceId } from '@dxos/echo-schema';
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 viewState = getViewState(fullyQualifiedId(subject));
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(() => anchorSorts.find(({ key }) => key === getTypename(subject))?.sort, [anchorSorts, subject]);
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) => isInstanceOf(ThreadType, anchor[RelationSourceId]))
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[RelationSourceId] as ThreadType;
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[RelationSourceId] as ThreadType;
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[RelationSourceId] as ThreadType })),
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(qualifiedSubjectId) ? state.current : undefined}
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='p-1 gap-1 bs-[--rail-action] border-be border-separator'>
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 live(ThreadType, {
13
+ export const createCommentThread = (identity: Identity): ThreadType => {
14
+ return Obj.make(ThreadType, {
15
15
  messages: faker.helpers.multiple(
16
16
  () =>
17
- makeRef(
18
- live(DataType.Message, {
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, isInstanceOf, Query, RelationSourceId } from '@dxos/echo-schema';
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[RelationSourceId];
44
- return isInstanceOf(ThreadType, thread) && thread.status !== 'resolved';
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[RelationSourceId] as ThreadType;
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[RelationSourceId]), cursor: anchor.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[RelationSourceId] as ThreadType;
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 (isInstanceOf(ThreadType, thread)) {
112
+ if (Obj.instanceOf(ThreadType, thread)) {
113
113
  thread.name = getName(doc, cursor);
114
114
  relation.anchor = cursor;
115
115
  }
@@ -3,7 +3,7 @@
3
3
  //
4
4
 
5
5
  import { IntentPlugin, SettingsPlugin } from '@dxos/app-framework';
6
- import { live } from '@dxos/live-object';
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 = live(ThreadType, { messages: [] });
27
- client.spaces.default.db.add(live(ChannelType, { defaultThread: Ref.make(thread), threads: [] }));
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: {
@@ -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.typename]: {
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 only',
47
+ 'show unresolved label': 'Unresolved comments',
43
48
 
44
49
  'channel companion label': 'Channel',
45
50
  'call panel label': 'Active Call',
@@ -13,17 +13,21 @@ export const ThreadStatus = Schema.Union(
13
13
  Schema.Literal('resolved'),
14
14
  );
15
15
 
16
- export const ThreadType = Schema.Struct({
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 type ThreadType = Schema.Schema.Type<typeof ThreadType>;
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
- export const ChannelType = Schema.Struct({
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 type ChannelType = Schema.Schema.Type<typeof ChannelType>;
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
- }