@dxos/plugin-thread 0.8.1-main.303c73a → 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.
Files changed (143) hide show
  1. package/dist/lib/browser/ChannelContainer-6YTHIJPS.mjs +74 -0
  2. package/dist/lib/browser/ChannelContainer-6YTHIJPS.mjs.map +7 -0
  3. package/dist/lib/browser/{chunk-UPKU23DA.mjs → chunk-3BIHVVEA.mjs} +5 -5
  4. package/dist/lib/browser/chunk-3BIHVVEA.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-BNEWNQBO.mjs → chunk-K3NUEKPS.mjs} +14 -2
  6. package/dist/lib/browser/{chunk-BNEWNQBO.mjs.map → chunk-K3NUEKPS.mjs.map} +4 -4
  7. package/dist/lib/browser/{chunk-NAO3LZMZ.mjs → chunk-NOOMCX5E.mjs} +3 -2
  8. package/dist/lib/browser/chunk-NOOMCX5E.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-YK3ICB7G.mjs → chunk-OPDRTA7Q.mjs} +2 -2
  10. package/dist/lib/browser/{chunk-YK3ICB7G.mjs.map → chunk-OPDRTA7Q.mjs.map} +1 -1
  11. package/dist/lib/browser/{chunk-636QDHE3.mjs → chunk-WBJLUUOK.mjs} +1 -1
  12. package/dist/lib/browser/{chunk-636QDHE3.mjs.map → chunk-WBJLUUOK.mjs.map} +2 -2
  13. package/dist/lib/browser/index.mjs +25 -15
  14. package/dist/lib/browser/index.mjs.map +4 -4
  15. package/dist/lib/browser/{intent-resolver-FAFQ54NP.mjs → intent-resolver-WAVFYWIS.mjs} +5 -5
  16. package/dist/lib/browser/{intent-resolver-FAFQ54NP.mjs.map → intent-resolver-WAVFYWIS.mjs.map} +2 -2
  17. package/dist/lib/browser/{markdown-RPYOUBVR.mjs → markdown-R6VIT67G.mjs} +6 -6
  18. package/dist/lib/browser/markdown-R6VIT67G.mjs.map +7 -0
  19. package/dist/lib/browser/meta.json +1 -1
  20. package/dist/lib/browser/{react-surface-Y4MUSICN.mjs → react-surface-2MKPJW4D.mjs} +15 -28
  21. package/dist/lib/browser/react-surface-2MKPJW4D.mjs.map +7 -0
  22. package/dist/lib/browser/{settings-WQTE5AEZ.mjs → settings-2EJW5SUY.mjs} +3 -3
  23. package/dist/lib/browser/{state-GNFUURIC.mjs → state-HPUFZBB7.mjs} +4 -3
  24. package/dist/lib/browser/state-HPUFZBB7.mjs.map +7 -0
  25. package/dist/lib/browser/types.mjs +2 -2
  26. package/dist/lib/node/ChannelContainer-AVRYTS7L.cjs +98 -0
  27. package/dist/lib/node/ChannelContainer-AVRYTS7L.cjs.map +7 -0
  28. package/dist/lib/node/{chunk-AWSTZ2KN.cjs → chunk-E6HDHBUB.cjs} +28 -4
  29. package/dist/lib/node/chunk-E6HDHBUB.cjs.map +7 -0
  30. package/dist/lib/node/{chunk-RQR5Z23G.cjs → chunk-EHS2JT63.cjs} +12 -12
  31. package/dist/lib/node/chunk-EHS2JT63.cjs.map +7 -0
  32. package/dist/lib/node/{chunk-CMEMMYDL.cjs → chunk-GBL2K6YX.cjs} +6 -6
  33. package/dist/lib/node/{chunk-CMEMMYDL.cjs.map → chunk-GBL2K6YX.cjs.map} +1 -1
  34. package/dist/lib/node/{chunk-F735VMTN.cjs → chunk-ONLWOUYZ.cjs} +4 -4
  35. package/dist/lib/node/{chunk-F735VMTN.cjs.map → chunk-ONLWOUYZ.cjs.map} +2 -2
  36. package/dist/lib/node/{chunk-FPWNZ6TB.cjs → chunk-VEVJBOWK.cjs} +8 -7
  37. package/dist/lib/node/chunk-VEVJBOWK.cjs.map +7 -0
  38. package/dist/lib/node/index.cjs +62 -53
  39. package/dist/lib/node/index.cjs.map +4 -4
  40. package/dist/lib/node/{intent-resolver-DVBEXJ33.cjs → intent-resolver-ESZ7YDRL.cjs} +22 -22
  41. package/dist/lib/node/{intent-resolver-DVBEXJ33.cjs.map → intent-resolver-ESZ7YDRL.cjs.map} +2 -2
  42. package/dist/lib/node/{markdown-ELRGISXE.cjs → markdown-KJJCSWOZ.cjs} +12 -12
  43. package/dist/lib/node/markdown-KJJCSWOZ.cjs.map +7 -0
  44. package/dist/lib/node/meta.json +1 -1
  45. package/dist/lib/node/{react-surface-7HLTN5XS.cjs → react-surface-YJNIS6CL.cjs} +35 -48
  46. package/dist/lib/node/react-surface-YJNIS6CL.cjs.map +7 -0
  47. package/dist/lib/node/{settings-7VQYARM5.cjs → settings-5YWRJNSN.cjs} +8 -8
  48. package/dist/lib/node/{state-TQWEZ6B3.cjs → state-JMI5ZXZI.cjs} +8 -7
  49. package/dist/lib/node/state-JMI5ZXZI.cjs.map +7 -0
  50. package/dist/lib/node/types.cjs +4 -4
  51. package/dist/lib/node/types.cjs.map +1 -1
  52. package/dist/lib/node-esm/ChannelContainer-2ZU33KAF.mjs +75 -0
  53. package/dist/lib/node-esm/ChannelContainer-2ZU33KAF.mjs.map +7 -0
  54. package/dist/lib/node-esm/{chunk-FXUATCLW.mjs → chunk-42F2DTMM.mjs} +1 -1
  55. package/dist/lib/node-esm/{chunk-FXUATCLW.mjs.map → chunk-42F2DTMM.mjs.map} +2 -2
  56. package/dist/lib/node-esm/{chunk-33NDMQQQ.mjs → chunk-B5VGBXRR.mjs} +2 -2
  57. package/dist/lib/node-esm/{chunk-33NDMQQQ.mjs.map → chunk-B5VGBXRR.mjs.map} +1 -1
  58. package/dist/lib/node-esm/{chunk-HLWJTUWZ.mjs → chunk-L4C7BEQZ.mjs} +14 -2
  59. package/dist/lib/node-esm/{chunk-HLWJTUWZ.mjs.map → chunk-L4C7BEQZ.mjs.map} +4 -4
  60. package/dist/lib/node-esm/{chunk-CISLDOH7.mjs → chunk-RN3V7SYL.mjs} +5 -5
  61. package/dist/lib/node-esm/chunk-RN3V7SYL.mjs.map +7 -0
  62. package/dist/lib/node-esm/{chunk-ZJITX3TO.mjs → chunk-TXW5SIBN.mjs} +3 -2
  63. package/dist/lib/node-esm/chunk-TXW5SIBN.mjs.map +7 -0
  64. package/dist/lib/node-esm/index.mjs +25 -15
  65. package/dist/lib/node-esm/index.mjs.map +4 -4
  66. package/dist/lib/node-esm/{intent-resolver-DHVLBNCC.mjs → intent-resolver-YLBQTBSE.mjs} +5 -5
  67. package/dist/lib/node-esm/{intent-resolver-DHVLBNCC.mjs.map → intent-resolver-YLBQTBSE.mjs.map} +2 -2
  68. package/dist/lib/node-esm/{markdown-23OB7EZG.mjs → markdown-LF4X5O6L.mjs} +6 -6
  69. package/dist/lib/node-esm/markdown-LF4X5O6L.mjs.map +7 -0
  70. package/dist/lib/node-esm/meta.json +1 -1
  71. package/dist/lib/node-esm/{react-surface-AZHTTR6J.mjs → react-surface-ZEDBXBP3.mjs} +15 -28
  72. package/dist/lib/node-esm/react-surface-ZEDBXBP3.mjs.map +7 -0
  73. package/dist/lib/node-esm/{settings-SGMM7UDT.mjs → settings-5EZW6KK4.mjs} +3 -3
  74. package/dist/lib/node-esm/{state-7MLR27YG.mjs → state-PSZO57LP.mjs} +4 -3
  75. package/dist/lib/node-esm/state-PSZO57LP.mjs.map +7 -0
  76. package/dist/lib/node-esm/types.mjs +2 -2
  77. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  78. package/dist/types/src/capabilities/capabilities.d.ts +5 -0
  79. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  80. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  81. package/dist/types/src/components/ChannelContainer.d.ts +9 -0
  82. package/dist/types/src/components/ChannelContainer.d.ts.map +1 -0
  83. package/dist/types/src/components/index.d.ts +3 -2
  84. package/dist/types/src/components/index.d.ts.map +1 -1
  85. package/dist/types/src/events.d.ts +4 -0
  86. package/dist/types/src/events.d.ts.map +1 -0
  87. package/dist/types/src/index.d.ts +2 -0
  88. package/dist/types/src/index.d.ts.map +1 -1
  89. package/dist/types/src/meta.d.ts +2 -7
  90. package/dist/types/src/meta.d.ts.map +1 -1
  91. package/dist/types/src/types.d.ts +2 -0
  92. package/dist/types/src/types.d.ts.map +1 -1
  93. package/package.json +31 -30
  94. package/src/ThreadPlugin.tsx +2 -1
  95. package/src/capabilities/capabilities.ts +6 -0
  96. package/src/capabilities/intent-resolver.ts +1 -1
  97. package/src/capabilities/react-surface.tsx +5 -16
  98. package/src/capabilities/state.ts +1 -1
  99. package/src/components/ChannelContainer.tsx +80 -0
  100. package/src/components/ChatContainer.tsx +1 -1
  101. package/src/components/CommentContainer.tsx +1 -1
  102. package/src/components/MessageContainer.tsx +1 -1
  103. package/src/components/ThreadComplementary.tsx +1 -1
  104. package/src/components/index.ts +1 -1
  105. package/src/events.ts +11 -0
  106. package/src/extensions/threads.ts +2 -2
  107. package/src/index.ts +2 -0
  108. package/src/meta.ts +2 -2
  109. package/src/types.ts +2 -0
  110. package/dist/lib/browser/ThreadContainer-6OP5AG2W.mjs +0 -19
  111. package/dist/lib/browser/ThreadContainer-6OP5AG2W.mjs.map +0 -7
  112. package/dist/lib/browser/chunk-NAO3LZMZ.mjs.map +0 -7
  113. package/dist/lib/browser/chunk-UPKU23DA.mjs.map +0 -7
  114. package/dist/lib/browser/chunk-VOMIDDNO.mjs +0 -15
  115. package/dist/lib/browser/chunk-VOMIDDNO.mjs.map +0 -7
  116. package/dist/lib/browser/markdown-RPYOUBVR.mjs.map +0 -7
  117. package/dist/lib/browser/react-surface-Y4MUSICN.mjs.map +0 -7
  118. package/dist/lib/browser/state-GNFUURIC.mjs.map +0 -7
  119. package/dist/lib/node/ThreadContainer-LTKKLPXX.cjs +0 -45
  120. package/dist/lib/node/ThreadContainer-LTKKLPXX.cjs.map +0 -7
  121. package/dist/lib/node/chunk-AWSTZ2KN.cjs.map +0 -7
  122. package/dist/lib/node/chunk-BHFHFTHO.cjs +0 -50
  123. package/dist/lib/node/chunk-BHFHFTHO.cjs.map +0 -7
  124. package/dist/lib/node/chunk-FPWNZ6TB.cjs.map +0 -7
  125. package/dist/lib/node/chunk-RQR5Z23G.cjs.map +0 -7
  126. package/dist/lib/node/markdown-ELRGISXE.cjs.map +0 -7
  127. package/dist/lib/node/react-surface-7HLTN5XS.cjs.map +0 -7
  128. package/dist/lib/node/state-TQWEZ6B3.cjs.map +0 -7
  129. package/dist/lib/node-esm/ThreadContainer-SV74JFRH.mjs +0 -20
  130. package/dist/lib/node-esm/ThreadContainer-SV74JFRH.mjs.map +0 -7
  131. package/dist/lib/node-esm/chunk-CISLDOH7.mjs.map +0 -7
  132. package/dist/lib/node-esm/chunk-PJPVEO7E.mjs +0 -17
  133. package/dist/lib/node-esm/chunk-PJPVEO7E.mjs.map +0 -7
  134. package/dist/lib/node-esm/chunk-ZJITX3TO.mjs.map +0 -7
  135. package/dist/lib/node-esm/markdown-23OB7EZG.mjs.map +0 -7
  136. package/dist/lib/node-esm/react-surface-AZHTTR6J.mjs.map +0 -7
  137. package/dist/lib/node-esm/state-7MLR27YG.mjs.map +0 -7
  138. package/dist/types/src/components/ThreadContainer.d.ts +0 -7
  139. package/dist/types/src/components/ThreadContainer.d.ts.map +0 -1
  140. package/src/components/ThreadContainer.tsx +0 -22
  141. /package/dist/lib/browser/{settings-WQTE5AEZ.mjs.map → settings-2EJW5SUY.mjs.map} +0 -0
  142. /package/dist/lib/node/{settings-7VQYARM5.cjs.map → settings-5YWRJNSN.cjs.map} +0 -0
  143. /package/dist/lib/node-esm/{settings-SGMM7UDT.mjs.map → settings-5EZW6KK4.mjs.map} +0 -0
@@ -1,22 +1,21 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
- import "./chunk-PJPVEO7E.mjs";
3
2
  import {
4
3
  MessageContainer,
5
4
  command,
6
5
  getMessageMetadata
7
- } from "./chunk-CISLDOH7.mjs";
6
+ } from "./chunk-RN3V7SYL.mjs";
8
7
  import {
9
8
  useStatus
10
- } from "./chunk-HLWJTUWZ.mjs";
9
+ } from "./chunk-L4C7BEQZ.mjs";
11
10
  import {
12
11
  ThreadAction
13
- } from "./chunk-33NDMQQQ.mjs";
12
+ } from "./chunk-B5VGBXRR.mjs";
14
13
  import {
15
14
  ThreadCapabilities
16
- } from "./chunk-ZJITX3TO.mjs";
15
+ } from "./chunk-TXW5SIBN.mjs";
17
16
  import {
18
17
  THREAD_PLUGIN
19
- } from "./chunk-FXUATCLW.mjs";
18
+ } from "./chunk-42F2DTMM.mjs";
20
19
 
21
20
  // packages/plugins/plugin-thread/src/capabilities/react-surface.tsx
22
21
  import React5 from "react";
@@ -167,7 +166,7 @@ var CommentContainer = ({ thread, detached, current, onAttend, onComment, onReso
167
166
  onResolve: handleResolve
168
167
  }), onThreadDelete && /* @__PURE__ */ React.createElement(DeleteThreadButton, {
169
168
  onDelete: handleThreadDelete
170
- }))), RefArray.allResolvedTargets(thread.messages?.filter(isNonNullable) ?? []).map((message) => /* @__PURE__ */ React.createElement(MessageContainer, {
169
+ }))), RefArray.targets(thread.messages?.filter(isNonNullable) ?? []).map((message) => /* @__PURE__ */ React.createElement(MessageContainer, {
171
170
  key: message.id,
172
171
  message,
173
172
  members,
@@ -262,7 +261,7 @@ var ThreadComplementary = ({ subject }) => {
262
261
  createSort,
263
262
  subject
264
263
  ]);
265
- const threadObjects = RefArray2.allResolvedTargets(subject.threads ?? []);
264
+ const threadObjects = RefArray2.targets(subject.threads ?? []);
266
265
  const threads = useMemo2(() => {
267
266
  return threadObjects.concat(drafts ?? []).filter(isNonNullable2);
268
267
  }, [
@@ -379,7 +378,7 @@ var ThreadSettings = ({ settings }) => {
379
378
  };
380
379
 
381
380
  // packages/plugins/plugin-thread/src/components/index.ts
382
- var ThreadContainer = lazy(() => import("./ThreadContainer-SV74JFRH.mjs"));
381
+ var ChannelContainer = lazy(() => import("./ChannelContainer-2ZU33KAF.mjs"));
383
382
 
384
383
  // packages/plugins/plugin-thread/src/capabilities/react-surface.tsx
385
384
  var react_surface_default = () => contributes(Capabilities.ReactSurface, [
@@ -387,27 +386,15 @@ var react_surface_default = () => contributes(Capabilities.ReactSurface, [
387
386
  id: `${THREAD_PLUGIN}/channel`,
388
387
  role: "article",
389
388
  filter: (data) => data.subject instanceof ChannelType && !!data.subject.threads[0],
390
- component: ({ data, role }) => {
389
+ component: ({ data: { subject: channel }, role }) => {
391
390
  const layout = useLayout();
392
- const channel = data.subject;
393
- void channel.threads[0].load();
394
- const thread = channel.threads[0].target;
395
- if (!thread) {
396
- return null;
397
- }
398
391
  const currentPosition = layout.active.findIndex((id) => id === channel.id);
399
- if (currentPosition > 0) {
400
- const objectToTheLeft = layout.active[currentPosition - 1];
401
- const context = getSpace2(channel)?.db.getObjectById(objectToTheLeft);
402
- return /* @__PURE__ */ React5.createElement(ThreadContainer, {
403
- role,
404
- thread,
405
- context
406
- });
407
- }
408
- return /* @__PURE__ */ React5.createElement(ThreadContainer, {
392
+ const objectToTheLeft = layout.active[currentPosition - 1];
393
+ const context = currentPosition > 0 ? getSpace2(channel)?.db.getObjectById(objectToTheLeft) : void 0;
394
+ return /* @__PURE__ */ React5.createElement(ChannelContainer, {
409
395
  role,
410
- thread
396
+ channel,
397
+ context
411
398
  });
412
399
  }
413
400
  }),
@@ -431,4 +418,4 @@ var react_surface_default = () => contributes(Capabilities.ReactSurface, [
431
418
  export {
432
419
  react_surface_default as default
433
420
  };
434
- //# sourceMappingURL=react-surface-AZHTTR6J.mjs.map
421
+ //# sourceMappingURL=react-surface-ZEDBXBP3.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/react-surface.tsx", "../../../src/components/index.ts", "../../../src/components/CommentContainer.tsx", "../../../src/components/CommentsContainer.tsx", "../../../src/components/ThreadComplementary.tsx", "../../../src/components/ThreadSettings.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Capabilities, contributes, createSurface, useLayout } from '@dxos/app-framework';\nimport { type Ref } from '@dxos/echo-schema';\nimport { SettingsStore } from '@dxos/local-storage';\nimport { ChannelType, type ThreadType } from '@dxos/plugin-space/types';\nimport { getSpace } from '@dxos/react-client/echo';\n\nimport { ChannelContainer, ThreadComplementary, ThreadSettings } from '../components';\nimport { THREAD_PLUGIN } from '../meta';\nimport { type ThreadSettingsProps } from '../types';\n\nexport default () =>\n contributes(Capabilities.ReactSurface, [\n createSurface({\n id: `${THREAD_PLUGIN}/channel`,\n role: 'article',\n filter: (data): data is { subject: ChannelType } =>\n data.subject instanceof ChannelType && !!data.subject.threads[0],\n component: ({ data: { subject: channel }, role }) => {\n const layout = useLayout();\n const currentPosition = layout.active.findIndex((id) => id === channel.id);\n const objectToTheLeft = layout.active[currentPosition - 1];\n const context = currentPosition > 0 ? getSpace(channel)?.db.getObjectById(objectToTheLeft) : undefined;\n return <ChannelContainer role={role} channel={channel} context={context} />;\n },\n }),\n createSurface({\n id: `${THREAD_PLUGIN}/thread`,\n role: 'complementary--comments',\n filter: (data): data is { subject: { threads: Ref<ThreadType>[] } } =>\n !!data.subject &&\n typeof data.subject === 'object' &&\n 'threads' in data.subject &&\n Array.isArray(data.subject.threads) &&\n !(data.subject instanceof ChannelType),\n component: ({ data }) => <ThreadComplementary subject={data.subject} />,\n }),\n createSurface({\n id: `${THREAD_PLUGIN}/settings`,\n role: 'article',\n filter: (data): data is { subject: SettingsStore<ThreadSettingsProps> } =>\n data.subject instanceof SettingsStore && data.subject.prefix === THREAD_PLUGIN,\n component: ({ data: { subject } }) => <ThreadSettings settings={subject.value} />,\n }),\n ]);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { lazy } from 'react';\n\nexport const ChannelContainer = lazy(() => import('./ChannelContainer'));\n\n// TODO(wittjosiah): Suspense boundary for sidebar?\nexport * from './CommentContainer';\nexport * from './CommentsContainer';\nexport * from './ChatContainer';\nexport * from './MessageContainer';\nexport * from './ThreadComplementary';\nexport * from './ThreadSettings';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { CheckCircle, X } from '@phosphor-icons/react';\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\n\nimport { RefArray } from '@dxos/live-object';\nimport { fullyQualifiedId, getSpace, useMembers } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { Button, Tag, Tooltip, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { createBasicExtensions, createThemeExtensions, listener } from '@dxos/react-ui-editor';\nimport {\n getSize,\n hoverableControlItem,\n hoverableControls,\n hoverableFocusedWithinControls,\n mx,\n} from '@dxos/react-ui-theme';\nimport { MessageTextbox, type MessageTextboxProps, Thread, ThreadFooter, ThreadHeading } from '@dxos/react-ui-thread';\nimport { isNonNullable } from '@dxos/util';\n\nimport { MessageContainer } from './MessageContainer';\nimport { command } from './command-extension';\nimport { type ThreadContainerProps } from './types';\nimport { useStatus } from '../hooks';\nimport { THREAD_PLUGIN } from '../meta';\nimport { getMessageMetadata } from '../util';\n\nconst sizeClass = getSize(4);\n\n// TODO(thure): #8149\nconst commentControlClassNames = '!p-1 !min-bs-0 transition-opacity';\n\nconst ToggleResolvedButton = ({\n isResolved,\n onResolve,\n}: {\n isResolved: boolean | undefined;\n onResolve: () => void;\n}) => {\n const { t } = useTranslation(THREAD_PLUGIN);\n const label = t(isResolved ? 'mark as unresolved label' : 'mark as resolved label');\n return (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <Button\n variant='ghost'\n data-testid='thread.toggle-resolved'\n onClick={onResolve}\n classNames={[commentControlClassNames, !isResolved && hoverableControlItem]}\n >\n <span className='sr-only'>{label}</span>\n {isResolved ? <CheckCircle className={sizeClass} weight='fill' /> : <CheckCircle className={sizeClass} />}\n </Button>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content>\n {label}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n );\n};\n\nconst DeleteThreadButton = ({ onDelete }: { onDelete: () => void }) => {\n const { t } = useTranslation(THREAD_PLUGIN);\n const label = t('delete thread label');\n return (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <Button\n variant='ghost'\n data-testid='thread.delete'\n onClick={onDelete}\n classNames={[commentControlClassNames, hoverableControlItem]}\n >\n <span className='sr-only'>{label}</span>\n <X className={sizeClass} />\n </Button>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content classNames='z-30'>\n {label}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n );\n};\n\nexport const CommentContainer = ({\n thread,\n detached,\n current,\n onAttend,\n onComment,\n onResolve,\n onMessageDelete,\n onThreadDelete,\n}: 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 const threadScrollRef = useRef<HTMLDivElement | null>(null);\n const { themeMode } = useThemeContext();\n\n const textboxMetadata = getMessageMetadata(fullyQualifiedId(thread), identity);\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 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 [_count],\n );\n\n // TODO(thure): Factor out.\n const scrollToEnd = (behavior: ScrollBehavior) =>\n setTimeout(() => threadScrollRef.current?.scrollIntoView({ behavior, block: 'end' }), 10);\n\n const handleAttend = useCallback(() => onAttend?.(thread), [onAttend, thread]);\n const handleResolve = useCallback(() => onResolve?.(thread), [onResolve, thread]);\n const handleMessageDelete = useCallback((id: string) => onMessageDelete?.(thread, id), [onMessageDelete, thread]);\n const handleThreadDelete = useCallback(() => onThreadDelete?.(thread), [onThreadDelete, thread]);\n\n const handleComment: MessageTextboxProps['onSend'] = useCallback(() => {\n if (!messageRef.current) {\n return false;\n }\n\n onComment?.(thread, messageRef.current);\n messageRef.current = '';\n scrollToEnd('instant');\n rerenderEditor();\n\n return true;\n }, [thread, identity]);\n\n return (\n <Thread onClickCapture={handleAttend} onFocusCapture={handleAttend} current={current} id={fullyQualifiedId(thread)}>\n <div\n role='none'\n className={mx(\n 'col-span-2 grid grid-cols-[var(--rail-size)_1fr_min-content]',\n hoverableControls,\n hoverableFocusedWithinControls,\n )}\n >\n {detached ? (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <ThreadHeading detached>{thread.name}</ThreadHeading>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content classNames='z-30' side='top'>\n {t('detached thread label')}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n ) : (\n <ThreadHeading>{thread.name}</ThreadHeading>\n )}\n <div className='flex flex-row items-center pli-1'>\n {thread.status === 'staged' && <Tag palette='neutral'>{t('draft button')}</Tag>}\n {onResolve && !(thread?.status === 'staged') && (\n <ToggleResolvedButton isResolved={thread?.status === 'resolved'} onResolve={handleResolve} />\n )}\n {onThreadDelete && <DeleteThreadButton onDelete={handleThreadDelete} />}\n </div>\n </div>\n {/** TODO(dmaretskyi): How's `thread.messages` undefined? */}\n {RefArray.targets(thread.messages?.filter(isNonNullable) ?? []).map((message) => (\n <MessageContainer key={message.id} message={message} members={members} onDelete={handleMessageDelete} />\n ))}\n {/*\n TODO(wittjosiah): Can't autofocus this generally.\n There can be multiple threads with inputs and they can't all be focused.\n Also, it steals focus from documents when first rendered.\n Need to find a way to autofocus in one scenario only: when a new thread is created.\n */}\n <MessageTextbox extensions={extensions} onSend={handleComment} {...textboxMetadata} />\n <ThreadFooter activity={activity}>{t('activity message')}</ThreadFooter>\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 </Thread>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { ChatText } from '@phosphor-icons/react';\nimport React, { useEffect } from 'react';\n\nimport { type ThreadType } from '@dxos/plugin-space/types';\nimport { fullyQualifiedId } from '@dxos/react-client/echo';\nimport { useTranslation, Trans } from '@dxos/react-ui';\nimport { descriptionText, mx } from '@dxos/react-ui-theme';\n\nimport { CommentContainer } from './CommentContainer';\nimport { type ThreadContainerProps } from './types';\nimport { THREAD_PLUGIN } from '../meta';\n\nexport type ThreadsContainerProps = Omit<ThreadContainerProps, 'thread' | 'detached' | 'current' | 'autoFocus'> & {\n threads: ThreadType[];\n /**\n * Threads that are no longer anchored to a position in the object.\n */\n detached?: string[];\n currentId?: string;\n showResolvedThreads?: boolean;\n};\n\n/**\n * Comment threads.\n */\nexport const CommentsContainer = ({\n threads,\n detached = [],\n currentId,\n showResolvedThreads,\n ...props\n}: ThreadsContainerProps) => {\n const { t } = useTranslation(THREAD_PLUGIN);\n const filteredThreads = showResolvedThreads ? threads : threads.filter((thread) => !(thread?.status === 'resolved'));\n\n useEffect(() => {\n if (currentId) {\n document.getElementById(currentId)?.scrollIntoView({ behavior: 'smooth', block: 'end' });\n }\n }, [currentId]);\n\n return (\n <>\n {filteredThreads.length > 0 ? (\n filteredThreads.map((thread) => {\n const threadId = fullyQualifiedId(thread);\n return (\n <CommentContainer\n key={threadId}\n thread={thread}\n current={currentId === threadId}\n detached={detached.includes(threadId)}\n {...props}\n />\n );\n })\n ) : (\n <div\n role='alert'\n className={mx(\n descriptionText,\n 'place-self-center border border-dashed border-unAccent rounded-lg text-center p-4 m-4',\n )}\n >\n <h2 className='mbe-2 font-medium text-baseText'>{t('no comments title')}</h2>\n <p>\n <Trans\n {...{\n t,\n i18nKey: 'no comments message',\n components: {\n commentIcon: <ChatText className='inline-block' />,\n },\n }}\n />\n </p>\n </div>\n )}\n </>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useMemo } from 'react';\n\nimport { createIntent, LayoutAction, useCapability, useCapabilities, useIntentDispatcher } from '@dxos/app-framework';\nimport { ThreadCapabilities } from '@dxos/plugin-space';\nimport { MessageType, type ThreadType } from '@dxos/plugin-space/types';\nimport { create, fullyQualifiedId, makeRef, RefArray } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { useTranslation } from '@dxos/react-ui';\nimport { useAttended } from '@dxos/react-ui-attention';\nimport { Tabs } from '@dxos/react-ui-tabs';\nimport { isNonNullable } from '@dxos/util';\n\nimport { ThreadCapabilities as LocalThreadCapabilities } from '../capabilities';\nimport { CommentsContainer } from '../components';\nimport { THREAD_PLUGIN } from '../meta';\nimport { ThreadAction } from '../types';\n\nexport const ThreadComplementary = ({ subject }: { subject: any }) => {\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n const identity = useIdentity();\n const { t } = useTranslation(THREAD_PLUGIN);\n\n const { state, getViewState } = useCapability(LocalThreadCapabilities.MutableState);\n const viewState = getViewState(fullyQualifiedId(subject));\n const { showResolvedThreads } = viewState;\n const onChangeViewState = useCallback(\n (nextValue: string) => {\n viewState.showResolvedThreads = nextValue === 'all';\n },\n [viewState],\n );\n const drafts = state.drafts[fullyQualifiedId(subject)];\n\n const threadsIntegrators = useCapabilities(ThreadCapabilities.Thread);\n const createSort = useMemo(\n () => threadsIntegrators.find((p) => p.predicate(subject))?.createSort,\n [threadsIntegrators, subject],\n );\n const sort = useMemo(() => createSort?.(subject), [createSort, subject]);\n\n const threadObjects = RefArray.targets(subject.threads ?? []);\n\n const threads = useMemo(() => {\n return threadObjects.concat(drafts ?? []).filter(isNonNullable) as ThreadType[];\n }, [JSON.stringify(threadObjects), JSON.stringify(drafts)]);\n\n const detachedIds = useMemo(() => {\n return threads.filter(({ anchor }) => !anchor).map((thread) => fullyQualifiedId(thread));\n }, [threads]);\n\n useEffect(() => {\n if (!sort) {\n return;\n }\n threads.sort((a, b) => sort(a?.anchor, b?.anchor));\n }, [sort, threads]);\n\n const attended = useAttended();\n const qualifiedSubjectId = fullyQualifiedId(subject);\n\n const handleAttend = useCallback(\n (thread: ThreadType) => {\n const threadId = fullyQualifiedId(thread);\n if (state.current !== threadId) {\n state.current = threadId;\n\n // TODO(wittjosiah): Should this be a thread-specific intent?\n // The layout doesn't know about threads and this working depends on other plugins conditionally handling it.\n // This may be overloading this intent or highjacking its intended purpose.\n void dispatch(\n createIntent(LayoutAction.ScrollIntoView, {\n part: 'current',\n subject: fullyQualifiedId(subject),\n options: {\n cursor: thread.anchor,\n ref: threadId,\n },\n }),\n );\n }\n },\n [state.current, dispatch, subject],\n );\n\n const handleComment = useCallback(\n async (thread: ThreadType, message: string) => {\n thread.messages.push(\n makeRef(\n create(MessageType, {\n sender: { identityKey: identity?.identityKey.toHex() },\n timestamp: new Date().toISOString(),\n text: message,\n // TODO(wittjosiah): Context based on attention.\n // context: context ? makeRef(context) : undefined,\n }),\n ),\n );\n\n await dispatch(createIntent(ThreadAction.OnMessageAdd, { thread, subject }));\n\n state.current = fullyQualifiedId(thread);\n },\n [dispatch, identity, subject],\n );\n\n const handleResolve = useCallback(\n (thread: ThreadType) => dispatch(createIntent(ThreadAction.ToggleResolved, { thread })),\n [dispatch],\n );\n\n const handleThreadDelete = useCallback(\n (thread: ThreadType) => dispatch(createIntent(ThreadAction.Delete, { thread, subject })),\n [dispatch, subject],\n );\n\n const handleMessageDelete = useCallback(\n (thread: ThreadType, messageId: string) =>\n dispatch(createIntent(ThreadAction.DeleteMessage, { thread, subject, messageId })),\n [dispatch, subject],\n );\n\n const comments = (\n <CommentsContainer\n threads={threads}\n detached={detachedIds}\n currentId={attended.includes(qualifiedSubjectId) ? state.current : undefined}\n showResolvedThreads={showResolvedThreads}\n onAttend={handleAttend}\n onComment={handleComment}\n onResolve={handleResolve}\n onMessageDelete={handleMessageDelete}\n onThreadDelete={handleThreadDelete}\n />\n );\n\n return (\n <Tabs.Root\n value={showResolvedThreads ? 'all' : 'unresolved'}\n onValueChange={onChangeViewState}\n orientation='horizontal'\n >\n <Tabs.Tablist classNames='p-1 gap-1 bs-[--rail-action] border-be border-separator'>\n <Tabs.Tab value='unresolved' classNames='text-sm'>\n {t('show unresolved label')}\n </Tabs.Tab>\n <Tabs.Tab value='all' classNames='text-sm'>\n {t('show all label')}\n </Tabs.Tab>\n </Tabs.Tablist>\n <Tabs.Tabpanel value='all'>{showResolvedThreads && comments}</Tabs.Tabpanel>\n <Tabs.Tabpanel value='unresolved'>{!showResolvedThreads && comments}</Tabs.Tabpanel>\n </Tabs.Root>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\n// import { useTranslation } from '@dxos/react-ui';\nimport { DeprecatedFormContainer } from '@dxos/react-ui-form';\n\n// import { THREAD_PLUGIN } from '../meta';\nimport type { ThreadSettingsProps } from '../types';\n\nexport const ThreadSettings = ({ settings }: { settings: ThreadSettingsProps }) => {\n // const { t } = useTranslation(THREAD_PLUGIN);\n\n return <DeprecatedFormContainer></DeprecatedFormContainer>;\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "Capabilities", "contributes", "createSurface", "useLayout", "SettingsStore", "ChannelType", "getSpace", "lazy", "CheckCircle", "X", "React", "useCallback", "useMemo", "useRef", "useState", "RefArray", "fullyQualifiedId", "getSpace", "useMembers", "useIdentity", "Button", "Tag", "Tooltip", "useThemeContext", "useTranslation", "createBasicExtensions", "createThemeExtensions", "listener", "getSize", "hoverableControlItem", "hoverableControls", "hoverableFocusedWithinControls", "mx", "MessageTextbox", "Thread", "ThreadFooter", "ThreadHeading", "isNonNullable", "sizeClass", "getSize", "commentControlClassNames", "ToggleResolvedButton", "isResolved", "onResolve", "t", "useTranslation", "THREAD_PLUGIN", "label", "Tooltip", "Root", "Trigger", "asChild", "Button", "variant", "data-testid", "onClick", "classNames", "hoverableControlItem", "span", "className", "CheckCircle", "weight", "Portal", "Content", "Arrow", "DeleteThreadButton", "onDelete", "X", "CommentContainer", "thread", "detached", "current", "onAttend", "onComment", "onMessageDelete", "onThreadDelete", "identity", "useIdentity", "space", "getSpace", "members", "useMembers", "key", "activity", "useStatus", "fullyQualifiedId", "threadScrollRef", "useRef", "themeMode", "useThemeContext", "textboxMetadata", "getMessageMetadata", "_count", "_setCount", "useState", "rerenderEditor", "count", "messageRef", "extensions", "useMemo", "createBasicExtensions", "placeholder", "createThemeExtensions", "listener", "onChange", "text", "command", "scrollToEnd", "behavior", "setTimeout", "scrollIntoView", "block", "handleAttend", "useCallback", "handleResolve", "handleMessageDelete", "id", "handleThreadDelete", "handleComment", "Thread", "onClickCapture", "onFocusCapture", "div", "role", "mx", "hoverableControls", "hoverableFocusedWithinControls", "ThreadHeading", "name", "side", "status", "Tag", "palette", "RefArray", "targets", "messages", "filter", "isNonNullable", "map", "message", "MessageContainer", "MessageTextbox", "onSend", "ThreadFooter", "ref", "ChatText", "React", "useEffect", "fullyQualifiedId", "useTranslation", "Trans", "descriptionText", "mx", "CommentsContainer", "threads", "detached", "currentId", "showResolvedThreads", "props", "t", "useTranslation", "THREAD_PLUGIN", "filteredThreads", "filter", "thread", "status", "useEffect", "document", "getElementById", "scrollIntoView", "behavior", "block", "React", "length", "map", "threadId", "fullyQualifiedId", "CommentContainer", "key", "current", "includes", "div", "role", "className", "mx", "descriptionText", "h2", "p", "Trans", "i18nKey", "components", "commentIcon", "ChatText", "React", "useCallback", "useEffect", "useMemo", "createIntent", "LayoutAction", "useCapability", "useCapabilities", "useIntentDispatcher", "ThreadCapabilities", "MessageType", "create", "fullyQualifiedId", "makeRef", "RefArray", "useIdentity", "useTranslation", "useAttended", "Tabs", "isNonNullable", "ThreadComplementary", "subject", "dispatchPromise", "dispatch", "useIntentDispatcher", "identity", "useIdentity", "t", "useTranslation", "THREAD_PLUGIN", "state", "getViewState", "useCapability", "LocalThreadCapabilities", "MutableState", "viewState", "fullyQualifiedId", "showResolvedThreads", "onChangeViewState", "useCallback", "nextValue", "drafts", "threadsIntegrators", "useCapabilities", "ThreadCapabilities", "Thread", "createSort", "useMemo", "find", "p", "predicate", "sort", "threadObjects", "RefArray", "targets", "threads", "concat", "filter", "isNonNullable", "JSON", "stringify", "detachedIds", "anchor", "map", "thread", "useEffect", "a", "b", "attended", "useAttended", "qualifiedSubjectId", "handleAttend", "threadId", "current", "createIntent", "LayoutAction", "ScrollIntoView", "part", "options", "cursor", "ref", "handleComment", "message", "messages", "push", "makeRef", "create", "MessageType", "sender", "identityKey", "toHex", "timestamp", "Date", "toISOString", "text", "ThreadAction", "OnMessageAdd", "handleResolve", "ToggleResolved", "handleThreadDelete", "Delete", "handleMessageDelete", "messageId", "DeleteMessage", "comments", "React", "CommentsContainer", "detached", "currentId", "includes", "undefined", "onAttend", "onComment", "onResolve", "onMessageDelete", "onThreadDelete", "Tabs", "Root", "value", "onValueChange", "orientation", "Tablist", "classNames", "Tab", "Tabpanel", "React", "DeprecatedFormContainer", "ThreadSettings", "settings", "React", "DeprecatedFormContainer", "ChannelContainer", "lazy", "contributes", "Capabilities", "ReactSurface", "createSurface", "id", "THREAD_PLUGIN", "role", "filter", "data", "subject", "ChannelType", "threads", "component", "channel", "layout", "useLayout", "currentPosition", "active", "findIndex", "objectToTheLeft", "context", "getSpace", "db", "getObjectById", "undefined", "React", "ChannelContainer", "Array", "isArray", "ThreadComplementary", "SettingsStore", "prefix", "ThreadSettings", "settings", "value"]
7
+ }
@@ -1,10 +1,10 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
2
  import {
3
3
  ThreadSettingsSchema
4
- } from "./chunk-33NDMQQQ.mjs";
4
+ } from "./chunk-B5VGBXRR.mjs";
5
5
  import {
6
6
  THREAD_PLUGIN
7
- } from "./chunk-FXUATCLW.mjs";
7
+ } from "./chunk-42F2DTMM.mjs";
8
8
 
9
9
  // packages/plugins/plugin-thread/src/capabilities/settings.ts
10
10
  import { Capabilities, contributes } from "@dxos/app-framework";
@@ -20,4 +20,4 @@ var settings_default = () => {
20
20
  export {
21
21
  settings_default as default
22
22
  };
23
- //# sourceMappingURL=settings-SGMM7UDT.mjs.map
23
+ //# sourceMappingURL=settings-5EZW6KK4.mjs.map
@@ -1,8 +1,8 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
2
  import {
3
3
  ThreadCapabilities
4
- } from "./chunk-ZJITX3TO.mjs";
5
- import "./chunk-FXUATCLW.mjs";
4
+ } from "./chunk-TXW5SIBN.mjs";
5
+ import "./chunk-42F2DTMM.mjs";
6
6
 
7
7
  // packages/plugins/plugin-thread/src/capabilities/state.ts
8
8
  import { contributes } from "@dxos/app-framework";
@@ -12,6 +12,7 @@ var initialViewState = {
12
12
  };
13
13
  var state_default = () => {
14
14
  const state = create({
15
+ activities: {},
15
16
  drafts: {}
16
17
  });
17
18
  const viewStore = create({});
@@ -31,4 +32,4 @@ var state_default = () => {
31
32
  export {
32
33
  state_default as default
33
34
  };
34
- //# sourceMappingURL=state-7MLR27YG.mjs.map
35
+ //# sourceMappingURL=state-PSZO57LP.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/state.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { contributes } from '@dxos/app-framework';\nimport { create } from '@dxos/live-object';\n\nimport { ThreadCapabilities } from './capabilities';\nimport { type ThreadState, type ViewStore } from '../types';\n\nconst initialViewState = { showResolvedThreads: false };\n\nexport default () => {\n const state = create<ThreadState>({ activities: {}, drafts: {} });\n const viewStore = create<ViewStore>({});\n\n const getViewState = (subjectId: string) => {\n if (!viewStore[subjectId]) {\n viewStore[subjectId] = { ...initialViewState };\n }\n return viewStore[subjectId];\n };\n\n return contributes(ThreadCapabilities.State, { state, getViewState });\n};\n"],
5
+ "mappings": ";;;;;;;AAIA,SAASA,mBAAmB;AAC5B,SAASC,cAAc;AAKvB,IAAMC,mBAAmB;EAAEC,qBAAqB;AAAM;AAEtD,IAAA,gBAAe,MAAA;AACb,QAAMC,QAAQC,OAAoB;IAAEC,YAAY,CAAC;IAAGC,QAAQ,CAAC;EAAE,CAAA;AAC/D,QAAMC,YAAYH,OAAkB,CAAC,CAAA;AAErC,QAAMI,eAAe,CAACC,cAAAA;AACpB,QAAI,CAACF,UAAUE,SAAAA,GAAY;AACzBF,gBAAUE,SAAAA,IAAa;QAAE,GAAGR;MAAiB;IAC/C;AACA,WAAOM,UAAUE,SAAAA;EACnB;AAEA,SAAOC,YAAYC,mBAAmBC,OAAO;IAAET;IAAOK;EAAa,CAAA;AACrE;",
6
+ "names": ["contributes", "create", "initialViewState", "showResolvedThreads", "state", "create", "activities", "drafts", "viewStore", "getViewState", "subjectId", "contributes", "ThreadCapabilities", "State"]
7
+ }
@@ -2,8 +2,8 @@ import { createRequire } from 'node:module';const require = createRequire(import
2
2
  import {
3
3
  ThreadAction,
4
4
  ThreadSettingsSchema
5
- } from "./chunk-33NDMQQQ.mjs";
6
- import "./chunk-FXUATCLW.mjs";
5
+ } from "./chunk-B5VGBXRR.mjs";
6
+ import "./chunk-42F2DTMM.mjs";
7
7
  export {
8
8
  ThreadAction,
9
9
  ThreadSettingsSchema
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadPlugin.d.ts","sourceRoot":"","sources":["../../../src/ThreadPlugin.tsx"],"names":[],"mappings":"AAoBA,eAAO,MAAM,YAAY,4CAsHrB,CAAC"}
1
+ {"version":3,"file":"ThreadPlugin.d.ts","sourceRoot":"","sources":["../../../src/ThreadPlugin.tsx"],"names":[],"mappings":"AAqBA,eAAO,MAAM,YAAY,4CAsHrB,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { type MenuActionProperties } from '@dxos/react-ui-menu';
1
2
  import { type DeepReadonly } from '@dxos/util';
2
3
  import { type ViewState, type ThreadState } from '../types';
3
4
  export declare namespace ThreadCapabilities {
@@ -10,6 +11,10 @@ export declare namespace ThreadCapabilities {
10
11
  state: ThreadState;
11
12
  getViewState: GetViewState;
12
13
  }>;
14
+ export type Activity = Omit<MenuActionProperties, 'variant' | 'checked'> & {
15
+ id: string;
16
+ };
17
+ export const Activity: import("@dxos/app-framework").InterfaceDef<Activity>;
13
18
  export {};
14
19
  }
15
20
  //# sourceMappingURL=capabilities.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../../../src/capabilities/capabilities.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5D,yBAAiB,kBAAkB,CAAC;IAClC,KAAK,YAAY,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,SAAS,CAAC;IACrD,MAAM,CAAC,MAAM,KAAK;eAA6B,YAAY,CAAC,WAAW,CAAC;sBAAgB,YAAY;MAEnG,CAAC;IACF,MAAM,CAAC,MAAM,YAAY;eAA6B,WAAW;sBAAgB,YAAY;MAE5F,CAAC;;CACH"}
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../../../src/capabilities/capabilities.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5D,yBAAiB,kBAAkB,CAAC;IAClC,KAAK,YAAY,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,SAAS,CAAC;IACrD,MAAM,CAAC,MAAM,KAAK;eAA6B,YAAY,CAAC,WAAW,CAAC;sBAAgB,YAAY;MAEnG,CAAC;IACF,MAAM,CAAC,MAAM,YAAY;eAA6B,WAAW;sBAAgB,YAAY;MAE5F,CAAC;IAEF,MAAM,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,EAAE,SAAS,GAAG,SAAS,CAAC,GAAG;QACzE,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC;IACF,MAAM,CAAC,MAAM,QAAQ,sDAAqE,CAAC;;CAC5F"}
@@ -1 +1 @@
1
- {"version":3,"file":"react-surface.d.ts","sourceRoot":"","sources":["../../../../src/capabilities/react-surface.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAyC,MAAM,qBAAqB,CAAC;;AAU1F,wBA4CK"}
1
+ {"version":3,"file":"react-surface.d.ts","sourceRoot":"","sources":["../../../../src/capabilities/react-surface.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAyC,MAAM,qBAAqB,CAAC;;AAU1F,wBAiCK"}
@@ -0,0 +1,9 @@
1
+ import React, { type ComponentProps } from 'react';
2
+ import { type ChannelType } from '@dxos/plugin-space/types';
3
+ import { ChatContainer } from './ChatContainer';
4
+ declare const ChannelContainer: ({ role, channel, context, }: Pick<ComponentProps<typeof ChatContainer>, "context"> & {
5
+ channel: ChannelType;
6
+ role: string;
7
+ }) => React.JSX.Element | null;
8
+ export default ChannelContainer;
9
+ //# sourceMappingURL=ChannelContainer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChannelContainer.d.ts","sourceRoot":"","sources":["../../../../src/components/ChannelContainer.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,EAAe,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AAIhE,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAa5D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAyBhD,QAAA,MAAM,gBAAgB,gCAInB,IAAI,CAAC,cAAc,CAAC,OAAO,aAAa,CAAC,EAAE,SAAS,CAAC,GAAG;IAAE,OAAO,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,6BA2BhG,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -1,6 +1,7 @@
1
- export declare const ThreadContainer: import("react").LazyExoticComponent<({ role, ...props }: Pick<import("react").ComponentProps<typeof import("./ChatContainer").ChatContainer>, "thread" | "context"> & {
1
+ export declare const ChannelContainer: import("react").LazyExoticComponent<({ role, channel, context, }: Pick<import("react").ComponentProps<typeof import("./ChatContainer").ChatContainer>, "context"> & {
2
+ channel: import("@dxos/plugin-space/types").ChannelType;
2
3
  role: string;
3
- }) => import("react").JSX.Element>;
4
+ }) => import("react").JSX.Element | null>;
4
5
  export * from './CommentContainer';
5
6
  export * from './CommentsContainer';
6
7
  export * from './ChatContainer';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/index.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,eAAe;;kCAA0C,CAAC;AAGvE,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/index.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,gBAAgB;;;yCAA2C,CAAC;AAGzE,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare namespace ThreadEvents {
2
+ const SetupActivity: import("@dxos/app-framework").ActivationEvent;
3
+ }
4
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/events.ts"],"names":[],"mappings":"AAQA,yBAAiB,YAAY,CAAC;IACrB,MAAM,aAAa,+CAA6D,CAAC;CACzF"}
@@ -1,3 +1,5 @@
1
+ export { ThreadCapabilities } from './capabilities';
2
+ export * from './events';
1
3
  export * from './hooks';
2
4
  export * from './meta';
3
5
  export * from './ThreadPlugin';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAIA,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AAEvB,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AAEvB,cAAc,gBAAgB,CAAC"}
@@ -1,10 +1,5 @@
1
+ import { type PluginMeta } from '@dxos/app-framework';
1
2
  export declare const THREAD_PLUGIN = "dxos.org/plugin/thread";
2
3
  export declare const THREAD_ITEM = "dxos.org/plugin/thread/item";
3
- export declare const meta: {
4
- id: string;
5
- name: string;
6
- description: string;
7
- icon: string;
8
- source: string;
9
- };
4
+ export declare const meta: PluginMeta;
10
5
  //# sourceMappingURL=meta.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../../../src/meta.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,aAAa,2BAA2B,CAAC;AACtD,eAAO,MAAM,WAAW,gCAA0B,CAAC;AAEnD,eAAO,MAAM,IAAI;;;;;;CAMK,CAAC"}
1
+ {"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../../../src/meta.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,eAAO,MAAM,aAAa,2BAA2B,CAAC;AACtD,eAAO,MAAM,WAAW,gCAA0B,CAAC;AAEnD,eAAO,MAAM,IAAI,EAAE,UAMlB,CAAC"}
@@ -86,6 +86,8 @@ export type ViewState = {
86
86
  };
87
87
  export type ViewStore = Record<SubjectId, ViewState>;
88
88
  export type ThreadState = {
89
+ /** Current channel activity. */
90
+ activities: Record<string, string | undefined>;
89
91
  /** In-memory draft threads. */
90
92
  drafts: Record<string, ThreadType[]>;
91
93
  current?: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,mBAAmB,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAKhF,yBAAiB,YAAY,CAAC;;;;;;;;;;;;;IAG5B,MAAM,OAAO,MAAO,SAAQ,WAS1B;KAAG;;;;;;;;;;IAEL,MAAM,OAAO,MAAO,SAAQ,WAM1B;KAAG;;;;;;;;;IAEL,MAAM,OAAO,cAAe,SAAQ,mBAKlC;KAAG;;;;;;;;;;;IAEL,MAAM,OAAO,MAAO,SAAQ,WAO1B;KAAG;;;;;;;;;;IAGL,MAAM,OAAO,YAAa,SAAQ,iBAMhC;KAAG;;;;;;;;;;;;;IAEL,MAAM,OAAO,aAAc,SAAQ,kBASjC;KAAG;;CACN;AAED,eAAO,MAAM,oBAAoB,yBAA0B,CAAC;AAE5D,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAE7E,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,KAAK,SAAS,GAAG,MAAM,CAAC;AACxB,MAAM,MAAM,SAAS,GAAG;IAAE,mBAAmB,EAAE,OAAO,CAAA;CAAE,CAAC;AACzD,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AAErD,MAAM,MAAM,WAAW,GAAG;IACxB,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,mBAAmB,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAKhF,yBAAiB,YAAY,CAAC;;;;;;;;;;;;;IAG5B,MAAM,OAAO,MAAO,SAAQ,WAS1B;KAAG;;;;;;;;;;IAEL,MAAM,OAAO,MAAO,SAAQ,WAM1B;KAAG;;;;;;;;;IAEL,MAAM,OAAO,cAAe,SAAQ,mBAKlC;KAAG;;;;;;;;;;;IAEL,MAAM,OAAO,MAAO,SAAQ,WAO1B;KAAG;;;;;;;;;;IAGL,MAAM,OAAO,YAAa,SAAQ,iBAMhC;KAAG;;;;;;;;;;;;;IAEL,MAAM,OAAO,aAAc,SAAQ,kBASjC;KAAG;;CACN;AAED,eAAO,MAAM,oBAAoB,yBAA0B,CAAC;AAE5D,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAE7E,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,KAAK,SAAS,GAAG,MAAM,CAAC;AACxB,MAAM,MAAM,SAAS,GAAG;IAAE,mBAAmB,EAAE,OAAO,CAAA;CAAE,CAAC;AACzD,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AAErD,MAAM,MAAM,WAAW,GAAG;IACxB,gCAAgC;IAChC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAC/C,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/plugin-thread",
3
- "version": "0.8.1-main.303c73a",
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/app-framework": "0.8.1-main.303c73a",
43
- "@dxos/async": "0.8.1-main.303c73a",
44
- "@dxos/echo-schema": "0.8.1-main.303c73a",
45
- "@dxos/display-name": "0.8.1-main.303c73a",
46
- "@dxos/invariant": "0.8.1-main.303c73a",
47
- "@dxos/local-storage": "0.8.1-main.303c73a",
48
- "@dxos/live-object": "0.8.1-main.303c73a",
49
- "@dxos/plugin-attention": "0.8.1-main.303c73a",
50
- "@dxos/plugin-client": "0.8.1-main.303c73a",
51
- "@dxos/log": "0.8.1-main.303c73a",
52
- "@dxos/plugin-deck": "0.8.1-main.303c73a",
53
- "@dxos/plugin-markdown": "0.8.1-main.303c73a",
54
- "@dxos/plugin-space": "0.8.1-main.303c73a",
55
- "@dxos/plugin-graph": "0.8.1-main.303c73a",
56
- "@dxos/plugin-observability": "0.8.1-main.303c73a",
57
- "@dxos/react-client": "0.8.1-main.303c73a",
58
- "@dxos/react-ui-attention": "0.8.1-main.303c73a",
59
- "@dxos/react-ui-editor": "0.8.1-main.303c73a",
60
- "@dxos/react-ui-stack": "0.8.1-main.303c73a",
61
- "@dxos/react-ui-tabs": "0.8.1-main.303c73a",
62
- "@dxos/react-ui-thread": "0.8.1-main.303c73a",
63
- "@dxos/react-ui-form": "0.8.1-main.303c73a",
64
- "@dxos/util": "0.8.1-main.303c73a"
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.1-main.303c73a",
75
- "@dxos/react-ui": "0.8.1-main.303c73a",
76
- "@dxos/storybook-utils": "0.8.1-main.303c73a",
77
- "@dxos/react-ui-theme": "0.8.1-main.303c73a"
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-theme": "0.8.1-main.303c73a",
84
- "@dxos/react-ui": "0.8.1-main.303c73a"
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"
@@ -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
  }
@@ -220,7 +220,7 @@ export default (context: PluginsContext) =>
220
220
  ],
221
221
  };
222
222
  } else {
223
- if (!messageIndex || !message) {
223
+ if (messageIndex === undefined || !message) {
224
224
  return;
225
225
  }
226
226
 
@@ -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 { ThreadContainer, ThreadComplementary, ThreadSettings } from '../components';
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
- if (currentPosition > 0) {
35
- const objectToTheLeft = layout.active[currentPosition - 1];
36
- const context = getSpace(channel)?.db.getObjectById(objectToTheLeft);
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) => {