@dxos/plugin-thread 0.7.5-main.9d26e3a → 0.7.5-main.9d2a38b

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 (182) hide show
  1. package/dist/lib/browser/ThreadContainer-4VLBSBI7.mjs +19 -0
  2. package/dist/lib/browser/ThreadContainer-4VLBSBI7.mjs.map +7 -0
  3. package/dist/lib/browser/app-graph-builder-Q7A2ZRUA.mjs +121 -0
  4. package/dist/lib/browser/app-graph-builder-Q7A2ZRUA.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-2B3EXYZ7.mjs +18 -0
  6. package/dist/lib/browser/chunk-2B3EXYZ7.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-ENERBDYI.mjs → chunk-636QDHE3.mjs} +3 -3
  8. package/dist/lib/browser/chunk-636QDHE3.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-BNEWNQBO.mjs +71 -0
  10. package/dist/lib/browser/chunk-BNEWNQBO.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-OD2IZKRP.mjs → chunk-GQONSZ3J.mjs} +19 -83
  12. package/dist/lib/browser/chunk-GQONSZ3J.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-NAO3LZMZ.mjs +16 -0
  14. package/dist/lib/browser/chunk-NAO3LZMZ.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-6KTMQPL4.mjs → chunk-NO5AZLUZ.mjs} +7 -3
  16. package/dist/lib/browser/chunk-NO5AZLUZ.mjs.map +7 -0
  17. package/dist/lib/browser/index.mjs +149 -939
  18. package/dist/lib/browser/index.mjs.map +4 -4
  19. package/dist/lib/browser/intent-resolver-PIEZ3LKQ.mjs +275 -0
  20. package/dist/lib/browser/intent-resolver-PIEZ3LKQ.mjs.map +7 -0
  21. package/dist/lib/browser/markdown-2NBXKXCY.mjs +112 -0
  22. package/dist/lib/browser/markdown-2NBXKXCY.mjs.map +7 -0
  23. package/dist/lib/browser/meta.json +1 -1
  24. package/dist/lib/browser/react-surface-CHCZO4TI.mjs +412 -0
  25. package/dist/lib/browser/react-surface-CHCZO4TI.mjs.map +7 -0
  26. package/dist/lib/browser/settings-TKOPRXSU.mjs +22 -0
  27. package/dist/lib/browser/settings-TKOPRXSU.mjs.map +7 -0
  28. package/dist/lib/browser/state-GNFUURIC.mjs +33 -0
  29. package/dist/lib/browser/state-GNFUURIC.mjs.map +7 -0
  30. package/dist/lib/browser/types.mjs +6 -4
  31. package/dist/lib/node/{ThreadArticle-ZCNMFBAO.cjs → ThreadContainer-VOYLV4UL.cjs} +14 -13
  32. package/dist/lib/node/ThreadContainer-VOYLV4UL.cjs.map +7 -0
  33. package/dist/lib/node/app-graph-builder-ZXW5KUDK.cjs +135 -0
  34. package/dist/lib/node/app-graph-builder-ZXW5KUDK.cjs.map +7 -0
  35. package/dist/lib/node/{chunk-2CB5AVBL.cjs → chunk-6PUGKCPR.cjs} +69 -135
  36. package/dist/lib/node/chunk-6PUGKCPR.cjs.map +7 -0
  37. package/dist/lib/node/{chunk-VW2P26MZ.cjs → chunk-AUVKOX5Q.cjs} +13 -8
  38. package/dist/lib/node/chunk-AUVKOX5Q.cjs.map +7 -0
  39. package/dist/lib/node/chunk-AWSTZ2KN.cjs +93 -0
  40. package/dist/lib/node/chunk-AWSTZ2KN.cjs.map +7 -0
  41. package/dist/lib/node/{chunk-IC2NICNC.cjs → chunk-F735VMTN.cjs} +7 -7
  42. package/dist/lib/node/chunk-F735VMTN.cjs.map +7 -0
  43. package/dist/lib/node/{meta.cjs → chunk-FPWNZ6TB.cjs} +13 -10
  44. package/dist/lib/node/chunk-FPWNZ6TB.cjs.map +7 -0
  45. package/dist/lib/node/{ThreadMain-5AYGCXXP.cjs → chunk-ZRN7B26W.cjs} +26 -23
  46. package/dist/lib/node/chunk-ZRN7B26W.cjs.map +7 -0
  47. package/dist/lib/node/index.cjs +147 -933
  48. package/dist/lib/node/index.cjs.map +4 -4
  49. package/dist/lib/node/intent-resolver-X5O3SVLF.cjs +287 -0
  50. package/dist/lib/node/intent-resolver-X5O3SVLF.cjs.map +7 -0
  51. package/dist/lib/node/markdown-FWRKMSKV.cjs +122 -0
  52. package/dist/lib/node/markdown-FWRKMSKV.cjs.map +7 -0
  53. package/dist/lib/node/meta.json +1 -1
  54. package/dist/lib/node/react-surface-LO7S2HPR.cjs +414 -0
  55. package/dist/lib/node/react-surface-LO7S2HPR.cjs.map +7 -0
  56. package/dist/lib/node/settings-TH4YSUVU.cjs +36 -0
  57. package/dist/lib/node/settings-TH4YSUVU.cjs.map +7 -0
  58. package/dist/lib/node/state-TQWEZ6B3.cjs +49 -0
  59. package/dist/lib/node/state-TQWEZ6B3.cjs.map +7 -0
  60. package/dist/lib/node/types.cjs +6 -4
  61. package/dist/lib/node/types.cjs.map +2 -2
  62. package/dist/lib/node-esm/ThreadContainer-7DZY2MWA.mjs +20 -0
  63. package/dist/lib/node-esm/ThreadContainer-7DZY2MWA.mjs.map +7 -0
  64. package/dist/lib/node-esm/app-graph-builder-ATS6HGE6.mjs +122 -0
  65. package/dist/lib/node-esm/app-graph-builder-ATS6HGE6.mjs.map +7 -0
  66. package/dist/lib/node-esm/{chunk-RMYATBXM.mjs → chunk-B3CF35MY.mjs} +7 -3
  67. package/dist/lib/node-esm/chunk-B3CF35MY.mjs.map +7 -0
  68. package/dist/lib/node-esm/{chunk-AQ74G3GY.mjs → chunk-DYFIKKDT.mjs} +19 -83
  69. package/dist/lib/node-esm/chunk-DYFIKKDT.mjs.map +7 -0
  70. package/dist/lib/node-esm/{chunk-7QRGG25F.mjs → chunk-FXUATCLW.mjs} +3 -3
  71. package/dist/lib/node-esm/chunk-FXUATCLW.mjs.map +7 -0
  72. package/dist/lib/node-esm/chunk-GS2OILYF.mjs +20 -0
  73. package/dist/lib/node-esm/chunk-GS2OILYF.mjs.map +7 -0
  74. package/dist/lib/node-esm/chunk-HLWJTUWZ.mjs +73 -0
  75. package/dist/lib/node-esm/chunk-HLWJTUWZ.mjs.map +7 -0
  76. package/dist/lib/node-esm/chunk-ZJITX3TO.mjs +17 -0
  77. package/dist/lib/node-esm/chunk-ZJITX3TO.mjs.map +7 -0
  78. package/dist/lib/node-esm/index.mjs +149 -939
  79. package/dist/lib/node-esm/index.mjs.map +4 -4
  80. package/dist/lib/node-esm/intent-resolver-XJWT5X6T.mjs +276 -0
  81. package/dist/lib/node-esm/intent-resolver-XJWT5X6T.mjs.map +7 -0
  82. package/dist/lib/node-esm/markdown-6AQFDAW3.mjs +113 -0
  83. package/dist/lib/node-esm/markdown-6AQFDAW3.mjs.map +7 -0
  84. package/dist/lib/node-esm/meta.json +1 -1
  85. package/dist/lib/node-esm/react-surface-LAF3QIPB.mjs +413 -0
  86. package/dist/lib/node-esm/react-surface-LAF3QIPB.mjs.map +7 -0
  87. package/dist/lib/node-esm/settings-KEDRR7RM.mjs +23 -0
  88. package/dist/lib/node-esm/settings-KEDRR7RM.mjs.map +7 -0
  89. package/dist/lib/node-esm/state-7MLR27YG.mjs +34 -0
  90. package/dist/lib/node-esm/state-7MLR27YG.mjs.map +7 -0
  91. package/dist/lib/node-esm/types.mjs +6 -4
  92. package/dist/types/src/ThreadPlugin.d.ts +1 -3
  93. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  94. package/dist/types/src/capabilities/app-graph-builder.d.ts +180 -0
  95. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
  96. package/dist/types/src/capabilities/capabilities.d.ts +15 -0
  97. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -0
  98. package/dist/types/src/capabilities/index.d.ts +187 -0
  99. package/dist/types/src/capabilities/index.d.ts.map +1 -0
  100. package/dist/types/src/capabilities/intent-resolver.d.ts +4 -0
  101. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -0
  102. package/dist/types/src/capabilities/markdown.d.ts +4 -0
  103. package/dist/types/src/capabilities/markdown.d.ts.map +1 -0
  104. package/dist/types/src/capabilities/react-surface.d.ts +4 -0
  105. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  106. package/dist/types/src/capabilities/settings.d.ts +4 -0
  107. package/dist/types/src/capabilities/settings.d.ts.map +1 -0
  108. package/dist/types/src/capabilities/state.d.ts +7 -0
  109. package/dist/types/src/capabilities/state.d.ts.map +1 -0
  110. package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
  111. package/dist/types/src/components/CommentContainer.d.ts +1 -1
  112. package/dist/types/src/components/CommentContainer.d.ts.map +1 -1
  113. package/dist/types/src/components/CommentsContainer.d.ts +2 -7
  114. package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
  115. package/dist/types/src/components/ThreadComplementary.d.ts +1 -5
  116. package/dist/types/src/components/ThreadComplementary.d.ts.map +1 -1
  117. package/dist/types/src/components/ThreadContainer.d.ts +7 -0
  118. package/dist/types/src/components/ThreadContainer.d.ts.map +1 -0
  119. package/dist/types/src/components/index.d.ts +3 -15
  120. package/dist/types/src/components/index.d.ts.map +1 -1
  121. package/dist/types/src/components/types.d.ts +5 -5
  122. package/dist/types/src/components/types.d.ts.map +1 -1
  123. package/dist/types/src/index.d.ts +1 -3
  124. package/dist/types/src/index.d.ts.map +1 -1
  125. package/dist/types/src/meta.d.ts +1 -2
  126. package/dist/types/src/meta.d.ts.map +1 -1
  127. package/dist/types/src/translations.d.ts +3 -0
  128. package/dist/types/src/translations.d.ts.map +1 -1
  129. package/dist/types/src/types.d.ts +10 -14
  130. package/dist/types/src/types.d.ts.map +1 -1
  131. package/dist/types/tsconfig.tsbuildinfo +1 -1
  132. package/package.json +30 -38
  133. package/src/ThreadPlugin.tsx +105 -470
  134. package/src/capabilities/app-graph-builder.ts +120 -0
  135. package/src/capabilities/capabilities.ts +19 -0
  136. package/src/capabilities/index.ts +14 -0
  137. package/src/capabilities/intent-resolver.ts +223 -0
  138. package/src/capabilities/markdown.ts +18 -0
  139. package/src/capabilities/react-surface.tsx +61 -0
  140. package/src/capabilities/settings.ts +14 -0
  141. package/src/capabilities/state.ts +25 -0
  142. package/src/components/Chat.stories.tsx +25 -23
  143. package/src/components/CommentContainer.tsx +16 -30
  144. package/src/components/CommentsContainer.tsx +1 -17
  145. package/src/components/ThreadComplementary.tsx +82 -48
  146. package/src/components/ThreadContainer.tsx +22 -0
  147. package/src/components/index.ts +1 -2
  148. package/src/components/types.ts +5 -5
  149. package/src/index.ts +1 -5
  150. package/src/meta.ts +1 -1
  151. package/src/translations.ts +1 -0
  152. package/src/types.ts +10 -29
  153. package/dist/lib/browser/ThreadArticle-EWLTNU6Z.mjs +0 -18
  154. package/dist/lib/browser/ThreadArticle-EWLTNU6Z.mjs.map +0 -7
  155. package/dist/lib/browser/ThreadMain-ABEDFWHC.mjs +0 -26
  156. package/dist/lib/browser/ThreadMain-ABEDFWHC.mjs.map +0 -7
  157. package/dist/lib/browser/chunk-6KTMQPL4.mjs.map +0 -7
  158. package/dist/lib/browser/chunk-ENERBDYI.mjs.map +0 -7
  159. package/dist/lib/browser/chunk-OD2IZKRP.mjs.map +0 -7
  160. package/dist/lib/browser/meta.mjs +0 -11
  161. package/dist/lib/browser/meta.mjs.map +0 -7
  162. package/dist/lib/node/ThreadArticle-ZCNMFBAO.cjs.map +0 -7
  163. package/dist/lib/node/ThreadMain-5AYGCXXP.cjs.map +0 -7
  164. package/dist/lib/node/chunk-2CB5AVBL.cjs.map +0 -7
  165. package/dist/lib/node/chunk-IC2NICNC.cjs.map +0 -7
  166. package/dist/lib/node/chunk-VW2P26MZ.cjs.map +0 -7
  167. package/dist/lib/node/meta.cjs.map +0 -7
  168. package/dist/lib/node-esm/ThreadArticle-F37HYTOU.mjs +0 -19
  169. package/dist/lib/node-esm/ThreadArticle-F37HYTOU.mjs.map +0 -7
  170. package/dist/lib/node-esm/ThreadMain-OL6ZHNZY.mjs +0 -27
  171. package/dist/lib/node-esm/ThreadMain-OL6ZHNZY.mjs.map +0 -7
  172. package/dist/lib/node-esm/chunk-7QRGG25F.mjs.map +0 -7
  173. package/dist/lib/node-esm/chunk-AQ74G3GY.mjs.map +0 -7
  174. package/dist/lib/node-esm/chunk-RMYATBXM.mjs.map +0 -7
  175. package/dist/lib/node-esm/meta.mjs +0 -12
  176. package/dist/lib/node-esm/meta.mjs.map +0 -7
  177. package/dist/types/src/components/ThreadArticle.d.ts +0 -5
  178. package/dist/types/src/components/ThreadArticle.d.ts.map +0 -1
  179. package/dist/types/src/components/ThreadMain.d.ts +0 -7
  180. package/dist/types/src/components/ThreadMain.d.ts.map +0 -1
  181. package/src/components/ThreadArticle.tsx +0 -18
  182. package/src/components/ThreadMain.tsx +0 -27
@@ -1,428 +1,34 @@
1
1
  import {
2
- ThreadAction
3
- } from "./chunk-6KTMQPL4.mjs";
2
+ AppGraphBuilder,
3
+ IntentResolver,
4
+ Markdown,
5
+ ReactSurface,
6
+ ThreadSettings,
7
+ ThreadState
8
+ } from "./chunk-2B3EXYZ7.mjs";
9
+ import "./chunk-NAO3LZMZ.mjs";
4
10
  import {
5
- MessageContainer,
6
- command,
7
- getMessageMetadata,
8
11
  useAnalyticsCallback,
9
12
  useOnEditAnalytics,
10
13
  useStatus
11
- } from "./chunk-OD2IZKRP.mjs";
14
+ } from "./chunk-BNEWNQBO.mjs";
15
+ import {
16
+ ThreadAction
17
+ } from "./chunk-NO5AZLUZ.mjs";
12
18
  import {
13
19
  THREAD_ITEM,
14
20
  THREAD_PLUGIN,
15
- meta_default
16
- } from "./chunk-ENERBDYI.mjs";
21
+ meta
22
+ } from "./chunk-636QDHE3.mjs";
17
23
 
18
24
  // packages/plugins/plugin-thread/src/ThreadPlugin.tsx
19
- import React5 from "react";
20
- import { createIntent as createIntent3, createResolver, createSurface, isLayoutParts, LayoutAction as LayoutAction2, NavigationAction, parseIntentPlugin, parseMetadataResolverPlugin, parseNavigationPlugin, resolvePlugin } from "@dxos/app-framework";
21
- import { Ref as Ref2 } from "@dxos/echo-schema";
22
- import { LocalStorageStore } from "@dxos/local-storage";
23
- import { log } from "@dxos/log";
24
- import { parseClientPlugin } from "@dxos/plugin-client/types";
25
- import { createExtension, toSignal } from "@dxos/plugin-graph";
26
- import { ObservabilityAction } from "@dxos/plugin-observability/types";
27
- import { memoizeQuery } from "@dxos/plugin-space";
28
- import { ChannelType as ChannelType2, MessageType as MessageType2, ThreadType as ThreadType2 } from "@dxos/plugin-space/types";
29
- import { create as create2, fullyQualifiedId as fullyQualifiedId5, getSpace as getSpace3, getTypename, makeRef as makeRef2, parseId, RefArray as RefArray4, SpaceState } from "@dxos/react-client/echo";
25
+ import { allOf, Capabilities, contributes, createIntent, defineModule, definePlugin, Events, oneOf } from "@dxos/app-framework";
26
+ import { ClientCapabilities, ClientEvents } from "@dxos/plugin-client";
27
+ import { DeckCapabilities } from "@dxos/plugin-deck";
28
+ import { ChannelType as ChannelType2, MessageType, ThreadType } from "@dxos/plugin-space/types";
29
+ import { RefArray } from "@dxos/react-client/echo";
30
30
  import { translations as threadTranslations } from "@dxos/react-ui-thread";
31
31
 
32
- // packages/plugins/plugin-thread/src/components/index.ts
33
- import { lazy } from "react";
34
-
35
- // packages/plugins/plugin-thread/src/components/CommentContainer.tsx
36
- import { CheckCircle, X } from "@phosphor-icons/react";
37
- import React, { useCallback, useMemo, useRef, useState } from "react";
38
- import { create, makeRef, RefArray } from "@dxos/live-object";
39
- import { MessageType } from "@dxos/plugin-space/types";
40
- import { fullyQualifiedId, getSpace, useMembers } from "@dxos/react-client/echo";
41
- import { useIdentity } from "@dxos/react-client/halo";
42
- import { Button, Tag, Tooltip, useThemeContext, useTranslation } from "@dxos/react-ui";
43
- import { createBasicExtensions, createThemeExtensions, listener } from "@dxos/react-ui-editor";
44
- import { getSize, hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from "@dxos/react-ui-theme";
45
- import { MessageTextbox, Thread, ThreadFooter, ThreadHeading } from "@dxos/react-ui-thread";
46
- import { nonNullable } from "@dxos/util";
47
- var sizeClass = getSize(4);
48
- var commentControlClassNames = "!p-1 !min-bs-0 transition-opacity";
49
- var ToggleResolvedButton = ({ isResolved, onResolve }) => {
50
- const { t } = useTranslation(THREAD_PLUGIN);
51
- const label = t(isResolved ? "mark as unresolved label" : "mark as resolved label");
52
- return /* @__PURE__ */ React.createElement(Tooltip.Root, null, /* @__PURE__ */ React.createElement(Tooltip.Trigger, {
53
- asChild: true
54
- }, /* @__PURE__ */ React.createElement(Button, {
55
- variant: "ghost",
56
- "data-testid": "thread.toggle-resolved",
57
- onClick: onResolve,
58
- classNames: [
59
- commentControlClassNames,
60
- !isResolved && hoverableControlItem
61
- ]
62
- }, /* @__PURE__ */ React.createElement("span", {
63
- className: "sr-only"
64
- }, label), isResolved ? /* @__PURE__ */ React.createElement(CheckCircle, {
65
- className: sizeClass,
66
- weight: "fill"
67
- }) : /* @__PURE__ */ React.createElement(CheckCircle, {
68
- className: sizeClass
69
- }))), /* @__PURE__ */ React.createElement(Tooltip.Portal, null, /* @__PURE__ */ React.createElement(Tooltip.Content, null, label, /* @__PURE__ */ React.createElement(Tooltip.Arrow, null))));
70
- };
71
- var DeleteThreadButton = ({ onDelete }) => {
72
- const { t } = useTranslation(THREAD_PLUGIN);
73
- const label = t("delete thread label");
74
- return /* @__PURE__ */ React.createElement(Tooltip.Root, null, /* @__PURE__ */ React.createElement(Tooltip.Trigger, {
75
- asChild: true
76
- }, /* @__PURE__ */ React.createElement(Button, {
77
- variant: "ghost",
78
- "data-testid": "thread.delete",
79
- onClick: onDelete,
80
- classNames: [
81
- commentControlClassNames,
82
- hoverableControlItem
83
- ]
84
- }, /* @__PURE__ */ React.createElement("span", {
85
- className: "sr-only"
86
- }, label), /* @__PURE__ */ React.createElement(X, {
87
- className: sizeClass
88
- }))), /* @__PURE__ */ React.createElement(Tooltip.Portal, null, /* @__PURE__ */ React.createElement(Tooltip.Content, {
89
- classNames: "z-30"
90
- }, label, /* @__PURE__ */ React.createElement(Tooltip.Arrow, null))));
91
- };
92
- var CommentContainer = ({ thread, detached, context, current, onAttend, onThreadDelete, onMessageDelete, onResolve, onComment }) => {
93
- const identity = useIdentity();
94
- const space = getSpace(thread);
95
- const members = useMembers(space?.key);
96
- const activity = useStatus(space, fullyQualifiedId(thread));
97
- const { t } = useTranslation(THREAD_PLUGIN);
98
- const threadScrollRef = useRef(null);
99
- const { themeMode } = useThemeContext();
100
- const textboxMetadata = getMessageMetadata(fullyQualifiedId(thread), identity);
101
- const [_count, _setCount] = useState(0);
102
- const rerenderEditor = () => _setCount((count) => count + 1);
103
- const messageRef = useRef("");
104
- const extensions = useMemo(() => [
105
- createBasicExtensions({
106
- placeholder: t("message placeholder")
107
- }),
108
- createThemeExtensions({
109
- themeMode
110
- }),
111
- listener({
112
- onChange: (text) => messageRef.current = text
113
- }),
114
- command
115
- ], [
116
- _count
117
- ]);
118
- const scrollToEnd = (behavior) => setTimeout(() => threadScrollRef.current?.scrollIntoView({
119
- behavior,
120
- block: "end"
121
- }), 10);
122
- const handleCreate = useCallback(() => {
123
- if (!messageRef.current) {
124
- return false;
125
- }
126
- thread.messages.push(makeRef(create(MessageType, {
127
- sender: {
128
- identityKey: identity.identityKey.toHex()
129
- },
130
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
131
- text: messageRef.current,
132
- context: context ? makeRef(context) : void 0
133
- })));
134
- onComment?.(thread);
135
- messageRef.current = "";
136
- scrollToEnd("instant");
137
- rerenderEditor();
138
- return true;
139
- }, [
140
- thread,
141
- identity
142
- ]);
143
- return /* @__PURE__ */ React.createElement(Thread, {
144
- onClickCapture: onAttend,
145
- onFocusCapture: onAttend,
146
- current,
147
- id: fullyQualifiedId(thread)
148
- }, /* @__PURE__ */ React.createElement("div", {
149
- role: "none",
150
- className: mx("col-span-2 grid grid-cols-[var(--rail-size)_1fr_min-content]", hoverableControls, hoverableFocusedWithinControls)
151
- }, detached ? /* @__PURE__ */ React.createElement(Tooltip.Root, null, /* @__PURE__ */ React.createElement(Tooltip.Trigger, {
152
- asChild: true
153
- }, /* @__PURE__ */ React.createElement(ThreadHeading, {
154
- detached: true
155
- }, thread.name)), /* @__PURE__ */ React.createElement(Tooltip.Portal, null, /* @__PURE__ */ React.createElement(Tooltip.Content, {
156
- classNames: "z-30",
157
- side: "top"
158
- }, t("detached thread label"), /* @__PURE__ */ React.createElement(Tooltip.Arrow, null)))) : /* @__PURE__ */ React.createElement(ThreadHeading, null, thread.name), /* @__PURE__ */ React.createElement("div", {
159
- className: "flex flex-row items-center pli-1"
160
- }, thread.status === "staged" && /* @__PURE__ */ React.createElement(Tag, {
161
- palette: "neutral"
162
- }, t("draft button")), onResolve && !(thread?.status === "staged") && /* @__PURE__ */ React.createElement(ToggleResolvedButton, {
163
- isResolved: thread?.status === "resolved",
164
- onResolve
165
- }), onThreadDelete && /* @__PURE__ */ React.createElement(DeleteThreadButton, {
166
- onDelete: onThreadDelete
167
- }))), RefArray.allResolvedTargets(thread.messages?.filter(nonNullable) ?? []).map((message) => /* @__PURE__ */ React.createElement(MessageContainer, {
168
- key: message.id,
169
- message,
170
- members,
171
- onDelete: (id) => onMessageDelete?.(id)
172
- })), /* @__PURE__ */ React.createElement(MessageTextbox, {
173
- extensions,
174
- onSend: handleCreate,
175
- ...textboxMetadata
176
- }), /* @__PURE__ */ React.createElement(ThreadFooter, {
177
- activity
178
- }, t("activity message")), /* @__PURE__ */ React.createElement("div", {
179
- role: "none",
180
- className: "bs-px -mbs-px",
181
- ref: threadScrollRef
182
- }));
183
- };
184
-
185
- // packages/plugins/plugin-thread/src/components/CommentsContainer.tsx
186
- import { ChatText } from "@phosphor-icons/react";
187
- import React2, { useEffect } from "react";
188
- import { fullyQualifiedId as fullyQualifiedId2 } from "@dxos/react-client/echo";
189
- import { useTranslation as useTranslation2, Trans } from "@dxos/react-ui";
190
- import { descriptionText, mx as mx2 } from "@dxos/react-ui-theme";
191
- var CommentsContainer = ({ threads: threads2, detached = [], currentId, showResolvedThreads, onThreadAttend, onThreadDelete, onMessageDelete, onThreadToggleResolved, ...props }) => {
192
- const { t } = useTranslation2(THREAD_PLUGIN);
193
- const filteredThreads = showResolvedThreads ? threads2 : threads2.filter((thread) => !(thread?.status === "resolved"));
194
- useEffect(() => {
195
- if (currentId) {
196
- document.getElementById(currentId)?.scrollIntoView({
197
- behavior: "smooth",
198
- block: "end"
199
- });
200
- }
201
- }, [
202
- currentId
203
- ]);
204
- return /* @__PURE__ */ React2.createElement(React2.Fragment, null, filteredThreads.length > 0 ? filteredThreads.map((thread) => {
205
- const threadId = fullyQualifiedId2(thread);
206
- return /* @__PURE__ */ React2.createElement(CommentContainer, {
207
- key: threadId,
208
- thread,
209
- current: currentId === threadId,
210
- detached: detached.includes(threadId),
211
- ...onThreadAttend && {
212
- onAttend: () => onThreadAttend(thread)
213
- },
214
- ...onThreadDelete && {
215
- onThreadDelete: () => onThreadDelete(thread)
216
- },
217
- ...onMessageDelete && {
218
- onMessageDelete: (messageId) => onMessageDelete(thread, messageId)
219
- },
220
- ...onThreadToggleResolved && {
221
- onResolve: () => onThreadToggleResolved(thread)
222
- },
223
- ...props
224
- });
225
- }) : /* @__PURE__ */ React2.createElement("div", {
226
- role: "alert",
227
- className: mx2(descriptionText, "place-self-center border border-dashed border-unAccent rounded-lg text-center p-4 m-4")
228
- }, /* @__PURE__ */ React2.createElement("h2", {
229
- className: "mbe-2 font-medium text-baseText"
230
- }, t("no comments title")), /* @__PURE__ */ React2.createElement("p", null, /* @__PURE__ */ React2.createElement(Trans, {
231
- t,
232
- i18nKey: "no comments message",
233
- components: {
234
- commentIcon: /* @__PURE__ */ React2.createElement(ChatText, {
235
- className: "inline-block"
236
- })
237
- }
238
- }))));
239
- };
240
-
241
- // packages/plugins/plugin-thread/src/components/ThreadComplementary.tsx
242
- import React3, { useEffect as useEffect2, useMemo as useMemo2 } from "react";
243
- import { createIntent, LayoutAction, useIntentDispatcher, useResolvePlugins } from "@dxos/app-framework";
244
- import { fullyQualifiedId as fullyQualifiedId3, RefArray as RefArray2 } from "@dxos/react-client/echo";
245
- import { useAttended } from "@dxos/react-ui-attention";
246
- import { nonNullable as nonNullable2 } from "@dxos/util";
247
- var providesThreadsConfig = (plugin) => "thread" in plugin.provides ? plugin : void 0;
248
- var ThreadComplementary = ({ subject, drafts, current, showResolvedThreads }) => {
249
- const { dispatchPromise: dispatch } = useIntentDispatcher();
250
- const threadsIntegrators = useResolvePlugins(providesThreadsConfig);
251
- const threadProvides = useMemo2(() => threadsIntegrators.map((p) => p.provides.thread), [
252
- threadsIntegrators
253
- ]);
254
- const createSort = useMemo2(() => threadProvides.find((p) => p.predicate(subject))?.createSort, [
255
- threadProvides,
256
- subject
257
- ]);
258
- const sort = useMemo2(() => createSort?.(subject), [
259
- createSort,
260
- subject
261
- ]);
262
- const threadObjects = RefArray2.allResolvedTargets(subject.threads ?? []);
263
- const threads2 = useMemo2(() => {
264
- return threadObjects.concat(drafts ?? []).filter(nonNullable2);
265
- }, [
266
- JSON.stringify(threadObjects),
267
- JSON.stringify(drafts)
268
- ]);
269
- const detachedIds = useMemo2(() => {
270
- return threads2.filter(({ anchor }) => !anchor).map((thread) => fullyQualifiedId3(thread));
271
- }, [
272
- threads2
273
- ]);
274
- useEffect2(() => {
275
- if (!sort) {
276
- return;
277
- }
278
- threads2.sort((a, b) => sort(a?.anchor, b?.anchor));
279
- }, [
280
- sort,
281
- threads2
282
- ]);
283
- const attended = useAttended();
284
- const qualifiedSubjectId = fullyQualifiedId3(subject);
285
- return /* @__PURE__ */ React3.createElement(CommentsContainer, {
286
- threads: threads2,
287
- detached: detachedIds,
288
- currentId: attended.includes(qualifiedSubjectId) ? current : void 0,
289
- showResolvedThreads,
290
- onThreadAttend: (thread) => {
291
- const threadId = fullyQualifiedId3(thread);
292
- if (current !== threadId) {
293
- current = threadId;
294
- void dispatch?.(createIntent(LayoutAction.ScrollIntoView, {
295
- id: fullyQualifiedId3(subject),
296
- cursor: thread.anchor,
297
- ref: threadId
298
- }));
299
- }
300
- },
301
- onThreadDelete: (thread) => dispatch(createIntent(ThreadAction.Delete, {
302
- thread,
303
- subject
304
- })),
305
- onMessageDelete: (thread, messageId) => dispatch(createIntent(ThreadAction.DeleteMessage, {
306
- thread,
307
- subject,
308
- messageId
309
- })),
310
- onThreadToggleResolved: (thread) => dispatch(createIntent(ThreadAction.ToggleResolved, {
311
- thread
312
- })),
313
- onComment: (thread) => dispatch(createIntent(ThreadAction.OnMessageAdd, {
314
- thread,
315
- subject
316
- }))
317
- });
318
- };
319
-
320
- // packages/plugins/plugin-thread/src/components/ThreadSettings.tsx
321
- import React4 from "react";
322
- import { Input, useTranslation as useTranslation3 } from "@dxos/react-ui";
323
- import { DeprecatedFormInput } from "@dxos/react-ui-form";
324
- var ThreadSettings = ({ settings }) => {
325
- const { t } = useTranslation3(THREAD_PLUGIN);
326
- return /* @__PURE__ */ React4.createElement(React4.Fragment, null, /* @__PURE__ */ React4.createElement(DeprecatedFormInput, {
327
- label: t("settings standalone label")
328
- }, /* @__PURE__ */ React4.createElement(Input.Switch, {
329
- checked: settings.standalone,
330
- onCheckedChange: (checked) => settings.standalone = !!checked
331
- })));
332
- };
333
-
334
- // packages/plugins/plugin-thread/src/components/index.ts
335
- var ThreadMain = lazy(() => import("./ThreadMain-ABEDFWHC.mjs"));
336
- var ThreadArticle = lazy(() => import("./ThreadArticle-EWLTNU6Z.mjs"));
337
-
338
- // packages/plugins/plugin-thread/src/extensions/threads.ts
339
- import { EditorView } from "@codemirror/view";
340
- import { computed, effect } from "@preact/signals-core";
341
- import { createIntent as createIntent2 } from "@dxos/app-framework";
342
- import { Ref } from "@dxos/echo-schema";
343
- import { RefArray as RefArray3 } from "@dxos/live-object";
344
- import { ThreadType } from "@dxos/plugin-space/types";
345
- import { getSpace as getSpace2, getTextInRange, createDocAccessor, fullyQualifiedId as fullyQualifiedId4 } from "@dxos/react-client/echo";
346
- import { comments, createExternalCommentSync } from "@dxos/react-ui-editor";
347
- var getName = (doc, anchor) => {
348
- if (doc.content) {
349
- const [start, end] = anchor.split(":");
350
- return getTextInRange(createDocAccessor(doc.content.target, [
351
- "content"
352
- ]), start, end);
353
- }
354
- };
355
- var threads = (state, doc, dispatch) => {
356
- const space = doc && getSpace2(doc);
357
- if (!doc || !space || !dispatch) {
358
- return [
359
- comments()
360
- ];
361
- }
362
- const threads2 = computed(() => [
363
- ...RefArray3.allResolvedTargets(doc.threads),
364
- ...state.drafts[fullyQualifiedId4(doc)] ?? []
365
- ].filter((thread) => !(thread?.status === "resolved")));
366
- return [
367
- EditorView.updateListener.of((update) => {
368
- if (update.docChanged) {
369
- RefArray3.allResolvedTargets(doc.threads).forEach((thread) => {
370
- if (thread.anchor) {
371
- const name = getName(doc, thread.anchor);
372
- if (name && name !== thread.name) {
373
- thread.name = name;
374
- }
375
- }
376
- });
377
- }
378
- }),
379
- createExternalCommentSync(fullyQualifiedId4(doc), (sink) => effect(() => sink()), () => threads2.value.filter((thread) => thread?.anchor).map((thread) => ({
380
- id: fullyQualifiedId4(thread),
381
- cursor: thread.anchor
382
- }))),
383
- comments({
384
- id: fullyQualifiedId4(doc),
385
- onCreate: ({ cursor }) => {
386
- const name = getName(doc, cursor);
387
- void dispatch(createIntent2(ThreadAction.Create, {
388
- cursor,
389
- name,
390
- subject: doc
391
- }));
392
- },
393
- onDelete: ({ id }) => {
394
- const draft = state.drafts[fullyQualifiedId4(doc)];
395
- if (draft) {
396
- const index = draft.findIndex((thread2) => fullyQualifiedId4(thread2) === id);
397
- if (index !== -1) {
398
- draft.splice(index, 1);
399
- }
400
- }
401
- const thread = doc.threads.find(Ref.hasObjectId(id))?.target;
402
- if (thread) {
403
- thread.anchor = void 0;
404
- }
405
- },
406
- onUpdate: ({ id, cursor }) => {
407
- const thread = state.drafts[fullyQualifiedId4(doc)]?.find((thread2) => fullyQualifiedId4(thread2) === id) ?? doc.threads.find(Ref.hasObjectId(id))?.target;
408
- if (thread instanceof ThreadType && thread.anchor) {
409
- thread.name = getName(doc, thread.anchor);
410
- thread.anchor = cursor;
411
- }
412
- },
413
- onSelect: ({ selection }) => {
414
- const current = selection.current ?? selection.closest;
415
- if (current) {
416
- void dispatch(createIntent2(ThreadAction.Select, {
417
- current,
418
- skipOpen: true
419
- }));
420
- }
421
- }
422
- })
423
- ];
424
- };
425
-
426
32
  // packages/plugins/plugin-thread/src/translations.ts
427
33
  import { ChannelType } from "@dxos/plugin-space/types";
428
34
  var translations_default = [
@@ -458,551 +64,155 @@ var translations_default = [
458
64
  "save message label": "Save",
459
65
  "edit message label": "Edit",
460
66
  "delete message label": "Delete message",
461
- "open comments panel label": "Show Comments"
67
+ "open comments panel label": "Show Comments",
68
+ "comments panel label": "Comments"
462
69
  }
463
70
  }
464
71
  }
465
72
  ];
466
73
 
467
74
  // packages/plugins/plugin-thread/src/ThreadPlugin.tsx
468
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/plugin-thread/src/ThreadPlugin.tsx";
469
- var initialViewState = {
470
- showResolvedThreads: false
471
- };
472
- var ThreadPlugin = () => {
473
- const settings = new LocalStorageStore(THREAD_PLUGIN);
474
- const state = create2({
475
- drafts: {}
476
- });
477
- const viewStore = create2({});
478
- const getViewState = (subjectId) => {
479
- if (!viewStore[subjectId]) {
480
- viewStore[subjectId] = {
481
- ...initialViewState
482
- };
483
- }
484
- return viewStore[subjectId];
485
- };
486
- let intentPlugin;
487
- const unsubscribeCallbacks = [];
488
- return {
489
- meta: meta_default,
490
- initialize: async () => {
491
- settings.prop({
492
- key: "standalone",
493
- type: LocalStorageStore.bool({
494
- allowUndefined: true
495
- })
496
- });
497
- return {
498
- echo: {
499
- system: [
500
- ThreadType2,
501
- MessageType2
75
+ var ThreadPlugin = () => definePlugin(meta, [
76
+ defineModule({
77
+ id: `${meta.id}/module/settings`,
78
+ activatesOn: Events.SetupSettings,
79
+ activate: ThreadSettings
80
+ }),
81
+ defineModule({
82
+ id: `${meta.id}/module/state`,
83
+ activatesOn: Events.Startup,
84
+ activate: ThreadState
85
+ }),
86
+ defineModule({
87
+ id: `${meta.id}/module/translations`,
88
+ activatesOn: Events.SetupTranslations,
89
+ activate: () => contributes(Capabilities.Translations, [
90
+ ...translations_default,
91
+ ...threadTranslations
92
+ ])
93
+ }),
94
+ defineModule({
95
+ id: `${meta.id}/module/metadata`,
96
+ activatesOn: oneOf(Events.Startup, Events.SetupAppGraph),
97
+ activate: () => [
98
+ contributes(Capabilities.Metadata, {
99
+ id: ChannelType2.typename,
100
+ metadata: {
101
+ createObject: (props) => createIntent(ThreadAction.Create, props),
102
+ placeholder: [
103
+ "channel name placeholder",
104
+ {
105
+ ns: THREAD_PLUGIN
106
+ }
502
107
  ],
503
- // TODO(wittjosiah): Requires reload.
504
- ...settings.values.standalone ? {
505
- schema: [
506
- ChannelType2
507
- ]
508
- } : {}
108
+ icon: "ph--chat--regular",
109
+ // TODO(wittjosiah): Move out of metadata.
110
+ loadReferences: async (channel) => await RefArray.loadAll(channel.threads ?? [])
509
111
  }
510
- };
511
- },
512
- ready: async ({ plugins }) => {
513
- intentPlugin = resolvePlugin(plugins, parseIntentPlugin);
514
- },
515
- unload: async () => {
516
- unsubscribeCallbacks.forEach((unsubscribe) => unsubscribe());
517
- },
518
- provides: {
519
- settings: settings.values,
520
- metadata: {
521
- records: {
522
- [ChannelType2.typename]: {
523
- createObject: (props) => createIntent3(ThreadAction.Create, props),
524
- placeholder: [
525
- "channel name placeholder",
526
- {
527
- ns: THREAD_PLUGIN
528
- }
529
- ],
530
- icon: "ph--chat--regular",
531
- // TODO(wittjosiah): Move out of metadata.
532
- loadReferences: async (channel) => await RefArray4.loadAll(channel.threads ?? [])
533
- },
534
- [ThreadType2.typename]: {
535
- // TODO(wittjosiah): Move out of metadata.
536
- loadReferences: async (thread) => await RefArray4.loadAll(thread.messages ?? [])
537
- },
538
- [MessageType2.typename]: {
539
- // TODO(wittjosiah): Move out of metadata.
540
- loadReferences: (message) => []
541
- },
542
- [THREAD_ITEM]: {
543
- parse: (item, type) => {
544
- switch (type) {
545
- case "node":
546
- return {
547
- id: item.id,
548
- label: item.title,
549
- data: item
550
- };
551
- case "object":
552
- return item;
553
- case "view-object":
554
- return {
555
- id: `${item.id}-view`,
556
- object: item
557
- };
558
- }
559
- }
560
- }
112
+ }),
113
+ contributes(Capabilities.Metadata, {
114
+ id: ThreadType.typename,
115
+ metadata: {
116
+ // TODO(wittjosiah): Move out of metadata.
117
+ loadReferences: async (thread) => await RefArray.loadAll(thread.messages ?? [])
561
118
  }
562
- },
563
- translations: [
564
- ...translations_default,
565
- ...threadTranslations
566
- ],
567
- complementary: {
568
- panels: [
569
- {
570
- id: "comments",
571
- label: [
572
- "open comments panel label",
573
- {
574
- ns: THREAD_PLUGIN
575
- }
576
- ],
577
- icon: "ph--chat-text--regular"
578
- }
579
- ]
580
- },
581
- graph: {
582
- builder: (plugins) => {
583
- const client = resolvePlugin(plugins, parseClientPlugin)?.provides.client;
584
- const dispatch = resolvePlugin(plugins, parseIntentPlugin)?.provides.intent.dispatchPromise;
585
- const metadataResolver = resolvePlugin(plugins, parseMetadataResolverPlugin)?.provides.metadata.resolver;
586
- if (!client || !dispatch || !metadataResolver) {
587
- return [];
588
- }
589
- const type = "orphan-comments-for-subject";
590
- const icon = "ph--chat-text--regular";
591
- return [
592
- createExtension({
593
- id: `${THREAD_PLUGIN}/comments-for-subject`,
594
- resolver: ({ id }) => {
595
- if (!id.endsWith("~comments")) {
596
- return;
597
- }
598
- const [subjectId] = id.split("~");
599
- const { spaceId, objectId } = parseId(subjectId);
600
- const spaces = toSignal((onChange) => client.spaces.subscribe(() => onChange()).unsubscribe, () => client.spaces.get());
601
- const space = spaces?.find((space2) => space2.id === spaceId && space2.state.get() === SpaceState.SPACE_READY);
602
- if (!objectId) {
603
- return {
604
- id,
605
- type,
606
- data: null,
607
- properties: {
608
- icon,
609
- label: [
610
- "unnamed object threads label",
611
- {
612
- ns: THREAD_PLUGIN
613
- }
614
- ],
615
- showResolvedThreads: false,
616
- object: null,
617
- space
618
- }
619
- };
620
- }
621
- const [object] = memoizeQuery(space, {
622
- id: objectId
623
- });
624
- if (!object || !subjectId) {
625
- return;
626
- }
627
- const meta = metadataResolver(getTypename(object) ?? "");
628
- const label = meta.label?.(object) || object.name || meta.placeholder || [
629
- "unnamed object threads label",
630
- {
631
- ns: THREAD_PLUGIN
632
- }
633
- ];
634
- const viewState = getViewState(subjectId);
119
+ }),
120
+ contributes(Capabilities.Metadata, {
121
+ id: MessageType.typename,
122
+ metadata: {
123
+ // TODO(wittjosiah): Move out of metadata.
124
+ loadReferences: (message) => []
125
+ }
126
+ }),
127
+ contributes(Capabilities.Metadata, {
128
+ id: THREAD_ITEM,
129
+ metadata: {
130
+ parse: (item, type) => {
131
+ switch (type) {
132
+ case "node":
635
133
  return {
636
- id,
637
- type,
638
- data: null,
639
- properties: {
640
- icon,
641
- label,
642
- showResolvedThreads: viewState.showResolvedThreads,
643
- object
644
- }
645
- };
646
- },
647
- actions: ({ node }) => {
648
- const dataId = node.id.split("~").at(0);
649
- if (!node.id.endsWith("~comments") || !dataId) {
650
- return;
651
- }
652
- const [spaceId, objectId] = dataId.split(":");
653
- const viewState = getViewState(dataId);
654
- const toggle = async () => {
655
- const newToggleState = !viewState.showResolvedThreads;
656
- viewState.showResolvedThreads = newToggleState;
657
- await dispatch(createIntent3(ObservabilityAction.SendEvent, {
658
- name: "threads.toggle-show-resolved",
659
- properties: {
660
- spaceId,
661
- threadId: objectId,
662
- showResolved: newToggleState
663
- }
664
- }));
134
+ id: item.id,
135
+ label: item.title,
136
+ data: item
665
137
  };
666
- return [
667
- {
668
- id: `${THREAD_PLUGIN}/toggle-show-resolved/${node.id}`,
669
- data: toggle,
670
- properties: {
671
- label: [
672
- "toggle show resolved",
673
- {
674
- ns: THREAD_PLUGIN
675
- }
676
- ],
677
- menuItemType: "toggle",
678
- isChecked: viewState.showResolvedThreads,
679
- testId: "threadPlugin.toggleShowResolved",
680
- icon: viewState.showResolvedThreads ? "ph--eye-slash--regular" : "ph--eye--regular"
681
- }
682
- }
683
- ];
684
- }
685
- })
686
- ];
687
- }
688
- },
689
- surface: {
690
- definitions: ({ plugins }) => {
691
- const location = resolvePlugin(plugins, parseNavigationPlugin)?.provides.location;
692
- return [
693
- createSurface({
694
- id: `${THREAD_PLUGIN}/channel`,
695
- role: "article",
696
- filter: (data) => data.subject instanceof ChannelType2 && !!data.subject.threads[0],
697
- component: ({ data }) => {
698
- const channel = data.subject;
699
- const thread = channel.threads[0].target;
700
- if (isLayoutParts(location?.active) && location.active.main) {
701
- const layoutEntries = location.active.main;
702
- const currentPosition = layoutEntries.findIndex((entry) => channel.id === entry.id);
703
- if (currentPosition > 0) {
704
- const objectToTheLeft = layoutEntries[currentPosition - 1];
705
- const context = getSpace3(channel)?.db.getObjectById(objectToTheLeft.id);
706
- return /* @__PURE__ */ React5.createElement(ThreadArticle, {
707
- thread,
708
- context
709
- });
710
- }
711
- }
712
- return /* @__PURE__ */ React5.createElement(ThreadArticle, {
713
- thread
714
- });
715
- }
716
- }),
717
- createSurface({
718
- id: `${THREAD_PLUGIN}/thread`,
719
- role: "complementary--comments",
720
- filter: (data) => !!data.subject && typeof data.subject === "object" && "threads" in data.subject && Array.isArray(data.subject.threads) && !(data.subject instanceof ChannelType2),
721
- component: ({ data }) => {
722
- const { showResolvedThreads } = getViewState(fullyQualifiedId5(data.subject));
723
- return /* @__PURE__ */ React5.createElement(ThreadComplementary, {
724
- subject: data.subject,
725
- drafts: state.drafts[fullyQualifiedId5(data.subject)],
726
- current: state.current,
727
- showResolvedThreads
728
- });
729
- }
730
- }),
731
- createSurface({
732
- id: `${THREAD_PLUGIN}/settings`,
733
- role: "settings",
734
- filter: (data) => data.plugin === THREAD_PLUGIN,
735
- component: () => /* @__PURE__ */ React5.createElement(ThreadSettings, {
736
- settings: settings.values
737
- })
738
- })
739
- ];
740
- }
741
- },
742
- intent: {
743
- resolvers: () => [
744
- createResolver(ThreadAction.Create, ({ name, cursor, subject }) => {
745
- if (cursor && subject) {
746
- if (subject?.threads === void 0) {
747
- try {
748
- subject.threads = [];
749
- } catch (err) {
750
- log.error("Subject does not support threads array", subject?.typename, {
751
- F: __dxlog_file,
752
- L: 314,
753
- S: void 0,
754
- C: (f, a) => f(...a)
755
- });
756
- return;
757
- }
758
- }
759
- const subjectId = fullyQualifiedId5(subject);
760
- const thread = create2(ThreadType2, {
761
- name,
762
- anchor: cursor,
763
- messages: [],
764
- status: "staged"
765
- });
766
- const draft = state.drafts[subjectId];
767
- if (draft) {
768
- draft.push(thread);
769
- } else {
770
- state.drafts[subjectId] = [
771
- thread
772
- ];
773
- }
774
- return {
775
- data: {
776
- object: thread
777
- },
778
- intents: [
779
- createIntent3(ThreadAction.Select, {
780
- current: fullyQualifiedId5(thread)
781
- }),
782
- createIntent3(NavigationAction.Open, {
783
- activeParts: {
784
- complementary: "comments"
785
- }
786
- }),
787
- createIntent3(LayoutAction2.SetLayout, {
788
- element: "complementary",
789
- state: true
790
- })
791
- ]
792
- };
793
- } else {
794
- return {
795
- data: {
796
- object: create2(ChannelType2, {
797
- threads: [
798
- makeRef2(create2(ThreadType2, {
799
- messages: []
800
- }))
801
- ]
802
- })
803
- }
804
- };
805
- }
806
- }),
807
- createResolver(ThreadAction.Select, ({ current, skipOpen }) => {
808
- state.current = current;
809
- return {
810
- intents: !skipOpen ? [
811
- createIntent3(NavigationAction.Open, {
812
- activeParts: {
813
- complementary: "comments"
814
- }
815
- })
816
- ] : void 0
817
- };
818
- }),
819
- createResolver(ThreadAction.ToggleResolved, ({ thread }) => {
820
- if (thread.status === "active" || thread.status === void 0) {
821
- thread.status = "resolved";
822
- } else if (thread.status === "resolved") {
823
- thread.status = "active";
824
- }
825
- const space = getSpace3(thread);
826
- const spaceId = space?.id;
827
- return {
828
- intents: [
829
- createIntent3(ObservabilityAction.SendEvent, {
830
- name: "threads.toggle-resolved",
831
- properties: {
832
- threadId: thread.id,
833
- spaceId
834
- }
835
- })
836
- ]
837
- };
838
- }),
839
- createResolver(ThreadAction.Delete, ({ subject, thread }, undo) => {
840
- const subjectId = fullyQualifiedId5(subject);
841
- const draft = state.drafts[subjectId];
842
- if (draft) {
843
- const index = draft.findIndex((t) => t.id === thread.id);
844
- if (index !== -1) {
845
- draft.splice(index, 1);
846
- return;
847
- }
848
- }
849
- const space = getSpace3(thread);
850
- if (!space || !subject.threads) {
851
- return;
852
- }
853
- if (!undo) {
854
- const index = subject.threads.findIndex((t) => t?.id === thread.id);
855
- const cursor = subject.threads[index]?.anchor;
856
- if (index !== -1) {
857
- subject.threads?.splice(index, 1);
858
- }
859
- space.db.remove(thread);
860
- return {
861
- undoable: {
862
- message: [
863
- "thread deleted label",
864
- {
865
- ns: THREAD_PLUGIN
866
- }
867
- ],
868
- data: {
869
- cursor
870
- }
871
- },
872
- intents: [
873
- createIntent3(ObservabilityAction.SendEvent, {
874
- name: "threads.delete",
875
- properties: {
876
- threadId: thread.id,
877
- spaceId: space.id
878
- }
879
- })
880
- ]
881
- };
882
- } else {
883
- const savedThread = space.db.add(thread);
884
- subject.threads.push(savedThread);
885
- return {
886
- intents: [
887
- createIntent3(ObservabilityAction.SendEvent, {
888
- name: "threads.undo-delete",
889
- properties: {
890
- threadId: thread.id,
891
- spaceId: space.id
892
- }
893
- })
894
- ]
895
- };
896
- }
897
- }),
898
- createResolver(ThreadAction.OnMessageAdd, ({ thread, subject }) => {
899
- const subjectId = fullyQualifiedId5(subject);
900
- const space = getSpace3(subject);
901
- const intents = [];
902
- const analyticsProperties = {
903
- threadId: thread.id,
904
- spaceId: space?.id
905
- };
906
- if (state.drafts[subjectId]?.find((t) => t === thread)) {
907
- thread.status = "active";
908
- subject.threads ? subject.threads.push(makeRef2(thread)) : subject.threads = [
909
- makeRef2(thread)
910
- ];
911
- state.drafts[subjectId] = state.drafts[subjectId]?.filter(({ id }) => id !== thread.id);
912
- intents.push(createIntent3(ObservabilityAction.SendEvent, {
913
- name: "threads.thread-created",
914
- properties: analyticsProperties
915
- }));
916
- }
917
- intents.push(createIntent3(ObservabilityAction.SendEvent, {
918
- name: "threads.message-added",
919
- properties: {
920
- ...analyticsProperties,
921
- threadLength: thread.messages.length
922
- }
923
- }));
924
- return {
925
- intents
926
- };
927
- }),
928
- createResolver(ThreadAction.DeleteMessage, ({ subject, thread, messageId, message, messageIndex }, undo) => {
929
- const space = getSpace3(subject);
930
- if (!undo) {
931
- const messageIndex2 = thread.messages.findIndex(Ref2.hasObjectId(messageId));
932
- const message2 = thread.messages[messageIndex2]?.target;
933
- if (!message2) {
934
- return;
935
- }
936
- if (messageIndex2 === 0 && thread.messages.length === 1) {
138
+ case "object":
139
+ return item;
140
+ case "view-object":
937
141
  return {
938
- intents: [
939
- createIntent3(ThreadAction.Delete, {
940
- subject,
941
- thread
942
- })
943
- ]
142
+ id: `${item.id}-view`,
143
+ object: item
944
144
  };
945
- } else {
946
- thread.messages.splice(messageIndex2, 1);
947
- }
948
- return {
949
- undoable: {
950
- message: [
951
- "message deleted label",
952
- {
953
- ns: THREAD_PLUGIN
954
- }
955
- ],
956
- data: {
957
- message: message2,
958
- messageIndex: messageIndex2
959
- }
960
- },
961
- intents: [
962
- createIntent3(ObservabilityAction.SendEvent, {
963
- name: "threads.message.delete",
964
- properties: {
965
- threadId: thread.id,
966
- spaceId: space?.id
967
- }
968
- })
969
- ]
970
- };
971
- } else {
972
- if (!messageIndex || !message) {
973
- return;
974
- }
975
- thread.messages.splice(messageIndex, 0, makeRef2(message));
976
- return {
977
- intents: [
978
- createIntent3(ObservabilityAction.SendEvent, {
979
- name: "threads.message.undo-delete",
980
- properties: {
981
- threadId: thread.id,
982
- spaceId: space?.id
983
- }
984
- })
985
- ]
986
- };
987
145
  }
988
- })
989
- ]
990
- },
991
- markdown: {
992
- extensions: ({ document: doc }) => {
993
- return threads(state, doc, intentPlugin?.provides.intent.dispatchPromise);
146
+ }
994
147
  }
148
+ })
149
+ ]
150
+ }),
151
+ defineModule({
152
+ id: `${meta.id}/module/schema`,
153
+ activatesOn: ClientEvents.SetupClient,
154
+ activate: () => contributes(ClientCapabilities.SystemSchema, [
155
+ ThreadType,
156
+ MessageType
157
+ ])
158
+ }),
159
+ defineModule({
160
+ id: `${meta.id}/module/channel-schema`,
161
+ activatesOn: allOf(Events.SettingsReady, ClientEvents.ClientReady),
162
+ activate: (context) => {
163
+ const client = context.requestCapability(ClientCapabilities.Client);
164
+ const settings = context.requestCapability(Capabilities.SettingsStore).getStore(THREAD_PLUGIN).value;
165
+ if (settings.standalone) {
166
+ client.addTypes([
167
+ ChannelType2
168
+ ]);
169
+ return contributes(ClientCapabilities.Schema, [
170
+ ChannelType2
171
+ ]);
995
172
  }
173
+ return [];
996
174
  }
997
- };
998
- };
999
-
1000
- // packages/plugins/plugin-thread/src/index.ts
1001
- var src_default = ThreadPlugin;
175
+ }),
176
+ defineModule({
177
+ id: `${meta.id}/module/complementary-panel`,
178
+ activatesOn: Events.Startup,
179
+ activate: () => contributes(DeckCapabilities.ComplementaryPanel, {
180
+ id: "comments",
181
+ label: [
182
+ "comments panel label",
183
+ {
184
+ ns: THREAD_PLUGIN
185
+ }
186
+ ],
187
+ icon: "ph--chat-text--regular"
188
+ })
189
+ }),
190
+ defineModule({
191
+ id: `${meta.id}/module/markdown`,
192
+ activatesOn: Events.Startup,
193
+ activate: Markdown
194
+ }),
195
+ defineModule({
196
+ id: `${meta.id}/module/react-surface`,
197
+ activatesOn: Events.Startup,
198
+ activate: ReactSurface
199
+ }),
200
+ defineModule({
201
+ id: `${meta.id}/module/intent-resolver`,
202
+ activatesOn: Events.SetupIntents,
203
+ activate: IntentResolver
204
+ }),
205
+ defineModule({
206
+ id: `${meta.id}/module/app-graph-builder`,
207
+ activatesOn: Events.SetupAppGraph,
208
+ activate: AppGraphBuilder
209
+ })
210
+ ]);
1002
211
  export {
1003
- ThreadAction,
212
+ THREAD_ITEM,
213
+ THREAD_PLUGIN,
1004
214
  ThreadPlugin,
1005
- src_default as default,
215
+ meta,
1006
216
  useAnalyticsCallback,
1007
217
  useOnEditAnalytics,
1008
218
  useStatus