@dxos/plugin-thread 0.7.5-main.499c70c → 0.7.5-main.5ae2ba8

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 (188) hide show
  1. package/dist/lib/browser/ThreadContainer-6OP5AG2W.mjs +19 -0
  2. package/dist/lib/browser/ThreadContainer-6OP5AG2W.mjs.map +7 -0
  3. package/dist/lib/browser/{chunk-ENERBDYI.mjs → chunk-636QDHE3.mjs} +3 -3
  4. package/dist/lib/browser/chunk-636QDHE3.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-BNEWNQBO.mjs +71 -0
  6. package/dist/lib/browser/chunk-BNEWNQBO.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-NAO3LZMZ.mjs +16 -0
  8. package/dist/lib/browser/chunk-NAO3LZMZ.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-OD2IZKRP.mjs → chunk-UPKU23DA.mjs} +29 -105
  10. package/dist/lib/browser/chunk-UPKU23DA.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-VOMIDDNO.mjs +15 -0
  12. package/dist/lib/browser/chunk-VOMIDDNO.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-6KTMQPL4.mjs → chunk-YK3ICB7G.mjs} +5 -3
  14. package/dist/lib/browser/chunk-YK3ICB7G.mjs.map +7 -0
  15. package/dist/lib/browser/index.mjs +150 -942
  16. package/dist/lib/browser/index.mjs.map +4 -4
  17. package/dist/lib/browser/intent-resolver-FAFQ54NP.mjs +287 -0
  18. package/dist/lib/browser/intent-resolver-FAFQ54NP.mjs.map +7 -0
  19. package/dist/lib/browser/markdown-RPYOUBVR.mjs +112 -0
  20. package/dist/lib/browser/markdown-RPYOUBVR.mjs.map +7 -0
  21. package/dist/lib/browser/meta.json +1 -1
  22. package/dist/lib/browser/react-surface-Y4MUSICN.mjs +433 -0
  23. package/dist/lib/browser/react-surface-Y4MUSICN.mjs.map +7 -0
  24. package/dist/lib/browser/settings-WQTE5AEZ.mjs +22 -0
  25. package/dist/lib/browser/settings-WQTE5AEZ.mjs.map +7 -0
  26. package/dist/lib/browser/state-GNFUURIC.mjs +33 -0
  27. package/dist/lib/browser/state-GNFUURIC.mjs.map +7 -0
  28. package/dist/lib/browser/types.mjs +6 -4
  29. package/dist/lib/node/{ThreadArticle-ZCNMFBAO.cjs → ThreadContainer-LTKKLPXX.cjs} +14 -13
  30. package/dist/lib/node/ThreadContainer-LTKKLPXX.cjs.map +7 -0
  31. package/dist/lib/node/chunk-AWSTZ2KN.cjs +93 -0
  32. package/dist/lib/node/chunk-AWSTZ2KN.cjs.map +7 -0
  33. package/dist/lib/node/{ThreadMain-5AYGCXXP.cjs → chunk-BHFHFTHO.cjs} +21 -23
  34. package/dist/lib/node/chunk-BHFHFTHO.cjs.map +7 -0
  35. package/dist/lib/node/{chunk-VW2P26MZ.cjs → chunk-CMEMMYDL.cjs} +11 -8
  36. package/dist/lib/node/chunk-CMEMMYDL.cjs.map +7 -0
  37. package/dist/lib/node/{chunk-IC2NICNC.cjs → chunk-F735VMTN.cjs} +7 -7
  38. package/dist/lib/node/chunk-F735VMTN.cjs.map +7 -0
  39. package/dist/lib/node/{meta.cjs → chunk-FPWNZ6TB.cjs} +13 -10
  40. package/dist/lib/node/chunk-FPWNZ6TB.cjs.map +7 -0
  41. package/dist/lib/node/{chunk-2CB5AVBL.cjs → chunk-RQR5Z23G.cjs} +74 -151
  42. package/dist/lib/node/chunk-RQR5Z23G.cjs.map +7 -0
  43. package/dist/lib/node/index.cjs +149 -935
  44. package/dist/lib/node/index.cjs.map +4 -4
  45. package/dist/lib/node/intent-resolver-DVBEXJ33.cjs +299 -0
  46. package/dist/lib/node/intent-resolver-DVBEXJ33.cjs.map +7 -0
  47. package/dist/lib/node/markdown-ELRGISXE.cjs +122 -0
  48. package/dist/lib/node/markdown-ELRGISXE.cjs.map +7 -0
  49. package/dist/lib/node/meta.json +1 -1
  50. package/dist/lib/node/react-surface-7HLTN5XS.cjs +435 -0
  51. package/dist/lib/node/react-surface-7HLTN5XS.cjs.map +7 -0
  52. package/dist/lib/node/settings-7VQYARM5.cjs +36 -0
  53. package/dist/lib/node/settings-7VQYARM5.cjs.map +7 -0
  54. package/dist/lib/node/state-TQWEZ6B3.cjs +49 -0
  55. package/dist/lib/node/state-TQWEZ6B3.cjs.map +7 -0
  56. package/dist/lib/node/types.cjs +6 -4
  57. package/dist/lib/node/types.cjs.map +2 -2
  58. package/dist/lib/node-esm/ThreadContainer-SV74JFRH.mjs +20 -0
  59. package/dist/lib/node-esm/ThreadContainer-SV74JFRH.mjs.map +7 -0
  60. package/dist/lib/node-esm/{chunk-RMYATBXM.mjs → chunk-33NDMQQQ.mjs} +5 -3
  61. package/dist/lib/node-esm/chunk-33NDMQQQ.mjs.map +7 -0
  62. package/dist/lib/node-esm/{chunk-AQ74G3GY.mjs → chunk-CISLDOH7.mjs} +29 -105
  63. package/dist/lib/node-esm/chunk-CISLDOH7.mjs.map +7 -0
  64. package/dist/lib/node-esm/{chunk-7QRGG25F.mjs → chunk-FXUATCLW.mjs} +3 -3
  65. package/dist/lib/node-esm/chunk-FXUATCLW.mjs.map +7 -0
  66. package/dist/lib/node-esm/chunk-HLWJTUWZ.mjs +73 -0
  67. package/dist/lib/node-esm/chunk-HLWJTUWZ.mjs.map +7 -0
  68. package/dist/lib/node-esm/chunk-PJPVEO7E.mjs +17 -0
  69. package/dist/lib/node-esm/chunk-PJPVEO7E.mjs.map +7 -0
  70. package/dist/lib/node-esm/chunk-ZJITX3TO.mjs +17 -0
  71. package/dist/lib/node-esm/chunk-ZJITX3TO.mjs.map +7 -0
  72. package/dist/lib/node-esm/index.mjs +150 -942
  73. package/dist/lib/node-esm/index.mjs.map +4 -4
  74. package/dist/lib/node-esm/intent-resolver-DHVLBNCC.mjs +288 -0
  75. package/dist/lib/node-esm/intent-resolver-DHVLBNCC.mjs.map +7 -0
  76. package/dist/lib/node-esm/markdown-23OB7EZG.mjs +113 -0
  77. package/dist/lib/node-esm/markdown-23OB7EZG.mjs.map +7 -0
  78. package/dist/lib/node-esm/meta.json +1 -1
  79. package/dist/lib/node-esm/react-surface-AZHTTR6J.mjs +434 -0
  80. package/dist/lib/node-esm/react-surface-AZHTTR6J.mjs.map +7 -0
  81. package/dist/lib/node-esm/settings-SGMM7UDT.mjs +23 -0
  82. package/dist/lib/node-esm/settings-SGMM7UDT.mjs.map +7 -0
  83. package/dist/lib/node-esm/state-7MLR27YG.mjs +34 -0
  84. package/dist/lib/node-esm/state-7MLR27YG.mjs.map +7 -0
  85. package/dist/lib/node-esm/types.mjs +6 -4
  86. package/dist/types/src/ThreadPlugin.d.ts +1 -3
  87. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  88. package/dist/types/src/capabilities/capabilities.d.ts +15 -0
  89. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -0
  90. package/dist/types/src/capabilities/index.d.ts +10 -0
  91. package/dist/types/src/capabilities/index.d.ts.map +1 -0
  92. package/dist/types/src/capabilities/intent-resolver.d.ts +4 -0
  93. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -0
  94. package/dist/types/src/capabilities/markdown.d.ts +4 -0
  95. package/dist/types/src/capabilities/markdown.d.ts.map +1 -0
  96. package/dist/types/src/capabilities/react-surface.d.ts +4 -0
  97. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  98. package/dist/types/src/capabilities/settings.d.ts +4 -0
  99. package/dist/types/src/capabilities/settings.d.ts.map +1 -0
  100. package/dist/types/src/capabilities/state.d.ts +7 -0
  101. package/dist/types/src/capabilities/state.d.ts.map +1 -0
  102. package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
  103. package/dist/types/src/components/ChatContainer.d.ts +2 -3
  104. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  105. package/dist/types/src/components/CommentContainer.d.ts +1 -2
  106. package/dist/types/src/components/CommentContainer.d.ts.map +1 -1
  107. package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
  108. package/dist/types/src/components/CommentsContainer.d.ts +2 -8
  109. package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
  110. package/dist/types/src/components/MessageContainer.d.ts +1 -2
  111. package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
  112. package/dist/types/src/components/ThreadComplementary.d.ts +2 -7
  113. package/dist/types/src/components/ThreadComplementary.d.ts.map +1 -1
  114. package/dist/types/src/components/ThreadContainer.d.ts +7 -0
  115. package/dist/types/src/components/ThreadContainer.d.ts.map +1 -0
  116. package/dist/types/src/components/ThreadSettings.d.ts +1 -2
  117. package/dist/types/src/components/ThreadSettings.d.ts.map +1 -1
  118. package/dist/types/src/components/command-extension.d.ts.map +1 -1
  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/testing.d.ts +12 -12
  122. package/dist/types/src/components/testing.d.ts.map +1 -1
  123. package/dist/types/src/components/types.d.ts +5 -5
  124. package/dist/types/src/components/types.d.ts.map +1 -1
  125. package/dist/types/src/index.d.ts +1 -3
  126. package/dist/types/src/index.d.ts.map +1 -1
  127. package/dist/types/src/meta.d.ts +1 -2
  128. package/dist/types/src/meta.d.ts.map +1 -1
  129. package/dist/types/src/translations.d.ts +9 -3
  130. package/dist/types/src/translations.d.ts.map +1 -1
  131. package/dist/types/src/types.d.ts +12 -18
  132. package/dist/types/src/types.d.ts.map +1 -1
  133. package/dist/types/tsconfig.tsbuildinfo +1 -1
  134. package/package.json +31 -38
  135. package/src/ThreadPlugin.tsx +106 -475
  136. package/src/capabilities/capabilities.ts +19 -0
  137. package/src/capabilities/index.ts +13 -0
  138. package/src/capabilities/intent-resolver.ts +239 -0
  139. package/src/capabilities/markdown.ts +18 -0
  140. package/src/capabilities/react-surface.tsx +61 -0
  141. package/src/capabilities/settings.ts +14 -0
  142. package/src/capabilities/state.ts +25 -0
  143. package/src/components/Chat.stories.tsx +22 -24
  144. package/src/components/ChatContainer.tsx +2 -2
  145. package/src/components/CommentContainer.tsx +18 -32
  146. package/src/components/Comments.stories.tsx +8 -2
  147. package/src/components/CommentsContainer.tsx +1 -17
  148. package/src/components/MessageContainer.tsx +6 -19
  149. package/src/components/ThreadComplementary.tsx +118 -51
  150. package/src/components/ThreadContainer.tsx +22 -0
  151. package/src/components/ThreadSettings.tsx +5 -11
  152. package/src/components/command-extension.ts +2 -5
  153. package/src/components/index.ts +1 -2
  154. package/src/components/types.ts +5 -5
  155. package/src/index.ts +1 -5
  156. package/src/meta.ts +1 -1
  157. package/src/translations.ts +3 -1
  158. package/src/types.ts +6 -29
  159. package/dist/lib/browser/ThreadArticle-EWLTNU6Z.mjs +0 -18
  160. package/dist/lib/browser/ThreadArticle-EWLTNU6Z.mjs.map +0 -7
  161. package/dist/lib/browser/ThreadMain-ABEDFWHC.mjs +0 -26
  162. package/dist/lib/browser/ThreadMain-ABEDFWHC.mjs.map +0 -7
  163. package/dist/lib/browser/chunk-6KTMQPL4.mjs.map +0 -7
  164. package/dist/lib/browser/chunk-ENERBDYI.mjs.map +0 -7
  165. package/dist/lib/browser/chunk-OD2IZKRP.mjs.map +0 -7
  166. package/dist/lib/browser/meta.mjs +0 -11
  167. package/dist/lib/browser/meta.mjs.map +0 -7
  168. package/dist/lib/node/ThreadArticle-ZCNMFBAO.cjs.map +0 -7
  169. package/dist/lib/node/ThreadMain-5AYGCXXP.cjs.map +0 -7
  170. package/dist/lib/node/chunk-2CB5AVBL.cjs.map +0 -7
  171. package/dist/lib/node/chunk-IC2NICNC.cjs.map +0 -7
  172. package/dist/lib/node/chunk-VW2P26MZ.cjs.map +0 -7
  173. package/dist/lib/node/meta.cjs.map +0 -7
  174. package/dist/lib/node-esm/ThreadArticle-F37HYTOU.mjs +0 -19
  175. package/dist/lib/node-esm/ThreadArticle-F37HYTOU.mjs.map +0 -7
  176. package/dist/lib/node-esm/ThreadMain-OL6ZHNZY.mjs +0 -27
  177. package/dist/lib/node-esm/ThreadMain-OL6ZHNZY.mjs.map +0 -7
  178. package/dist/lib/node-esm/chunk-7QRGG25F.mjs.map +0 -7
  179. package/dist/lib/node-esm/chunk-AQ74G3GY.mjs.map +0 -7
  180. package/dist/lib/node-esm/chunk-RMYATBXM.mjs.map +0 -7
  181. package/dist/lib/node-esm/meta.mjs +0 -12
  182. package/dist/lib/node-esm/meta.mjs.map +0 -7
  183. package/dist/types/src/components/ThreadArticle.d.ts +0 -5
  184. package/dist/types/src/components/ThreadArticle.d.ts.map +0 -1
  185. package/dist/types/src/components/ThreadMain.d.ts +0 -7
  186. package/dist/types/src/components/ThreadMain.d.ts.map +0 -1
  187. package/src/components/ThreadArticle.tsx +0 -18
  188. package/src/components/ThreadMain.tsx +0 -27
@@ -0,0 +1,433 @@
1
+ import "./chunk-VOMIDDNO.mjs";
2
+ import {
3
+ MessageContainer,
4
+ command,
5
+ getMessageMetadata
6
+ } from "./chunk-UPKU23DA.mjs";
7
+ import {
8
+ useStatus
9
+ } from "./chunk-BNEWNQBO.mjs";
10
+ import {
11
+ ThreadAction
12
+ } from "./chunk-YK3ICB7G.mjs";
13
+ import {
14
+ ThreadCapabilities
15
+ } from "./chunk-NAO3LZMZ.mjs";
16
+ import {
17
+ THREAD_PLUGIN
18
+ } from "./chunk-636QDHE3.mjs";
19
+
20
+ // packages/plugins/plugin-thread/src/capabilities/react-surface.tsx
21
+ import React5 from "react";
22
+ import { Capabilities, contributes, createSurface, useLayout } from "@dxos/app-framework";
23
+ import { SettingsStore } from "@dxos/local-storage";
24
+ import { ChannelType } from "@dxos/plugin-space/types";
25
+ import { getSpace as getSpace2 } from "@dxos/react-client/echo";
26
+
27
+ // packages/plugins/plugin-thread/src/components/index.ts
28
+ import { lazy } from "react";
29
+
30
+ // packages/plugins/plugin-thread/src/components/CommentContainer.tsx
31
+ import { CheckCircle, X } from "@phosphor-icons/react";
32
+ import React, { useCallback, useMemo, useRef, useState } from "react";
33
+ import { RefArray } from "@dxos/live-object";
34
+ import { fullyQualifiedId, getSpace, useMembers } from "@dxos/react-client/echo";
35
+ import { useIdentity } from "@dxos/react-client/halo";
36
+ import { Button, Tag, Tooltip, useThemeContext, useTranslation } from "@dxos/react-ui";
37
+ import { createBasicExtensions, createThemeExtensions, listener } from "@dxos/react-ui-editor";
38
+ import { getSize, hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from "@dxos/react-ui-theme";
39
+ import { MessageTextbox, Thread, ThreadFooter, ThreadHeading } from "@dxos/react-ui-thread";
40
+ import { isNonNullable } from "@dxos/util";
41
+ var sizeClass = getSize(4);
42
+ var commentControlClassNames = "!p-1 !min-bs-0 transition-opacity";
43
+ var ToggleResolvedButton = ({ isResolved, onResolve }) => {
44
+ const { t } = useTranslation(THREAD_PLUGIN);
45
+ const label = t(isResolved ? "mark as unresolved label" : "mark as resolved label");
46
+ return /* @__PURE__ */ React.createElement(Tooltip.Root, null, /* @__PURE__ */ React.createElement(Tooltip.Trigger, {
47
+ asChild: true
48
+ }, /* @__PURE__ */ React.createElement(Button, {
49
+ variant: "ghost",
50
+ "data-testid": "thread.toggle-resolved",
51
+ onClick: onResolve,
52
+ classNames: [
53
+ commentControlClassNames,
54
+ !isResolved && hoverableControlItem
55
+ ]
56
+ }, /* @__PURE__ */ React.createElement("span", {
57
+ className: "sr-only"
58
+ }, label), isResolved ? /* @__PURE__ */ React.createElement(CheckCircle, {
59
+ className: sizeClass,
60
+ weight: "fill"
61
+ }) : /* @__PURE__ */ React.createElement(CheckCircle, {
62
+ className: sizeClass
63
+ }))), /* @__PURE__ */ React.createElement(Tooltip.Portal, null, /* @__PURE__ */ React.createElement(Tooltip.Content, null, label, /* @__PURE__ */ React.createElement(Tooltip.Arrow, null))));
64
+ };
65
+ var DeleteThreadButton = ({ onDelete }) => {
66
+ const { t } = useTranslation(THREAD_PLUGIN);
67
+ const label = t("delete thread label");
68
+ return /* @__PURE__ */ React.createElement(Tooltip.Root, null, /* @__PURE__ */ React.createElement(Tooltip.Trigger, {
69
+ asChild: true
70
+ }, /* @__PURE__ */ React.createElement(Button, {
71
+ variant: "ghost",
72
+ "data-testid": "thread.delete",
73
+ onClick: onDelete,
74
+ classNames: [
75
+ commentControlClassNames,
76
+ hoverableControlItem
77
+ ]
78
+ }, /* @__PURE__ */ React.createElement("span", {
79
+ className: "sr-only"
80
+ }, label), /* @__PURE__ */ React.createElement(X, {
81
+ className: sizeClass
82
+ }))), /* @__PURE__ */ React.createElement(Tooltip.Portal, null, /* @__PURE__ */ React.createElement(Tooltip.Content, {
83
+ classNames: "z-30"
84
+ }, label, /* @__PURE__ */ React.createElement(Tooltip.Arrow, null))));
85
+ };
86
+ var CommentContainer = ({ thread, detached, current, onAttend, onComment, onResolve, onMessageDelete, onThreadDelete }) => {
87
+ const identity = useIdentity();
88
+ const space = getSpace(thread);
89
+ const members = useMembers(space?.key);
90
+ const activity = useStatus(space, fullyQualifiedId(thread));
91
+ const { t } = useTranslation(THREAD_PLUGIN);
92
+ const threadScrollRef = useRef(null);
93
+ const { themeMode } = useThemeContext();
94
+ const textboxMetadata = getMessageMetadata(fullyQualifiedId(thread), identity);
95
+ const [_count, _setCount] = useState(0);
96
+ const rerenderEditor = () => _setCount((count) => count + 1);
97
+ const messageRef = useRef("");
98
+ const extensions = useMemo(() => [
99
+ createBasicExtensions({
100
+ placeholder: t("message placeholder")
101
+ }),
102
+ createThemeExtensions({
103
+ themeMode
104
+ }),
105
+ listener({
106
+ onChange: (text) => messageRef.current = text
107
+ }),
108
+ command
109
+ ], [
110
+ _count
111
+ ]);
112
+ const scrollToEnd = (behavior) => setTimeout(() => threadScrollRef.current?.scrollIntoView({
113
+ behavior,
114
+ block: "end"
115
+ }), 10);
116
+ const handleAttend = useCallback(() => onAttend?.(thread), [
117
+ onAttend,
118
+ thread
119
+ ]);
120
+ const handleResolve = useCallback(() => onResolve?.(thread), [
121
+ onResolve,
122
+ thread
123
+ ]);
124
+ const handleMessageDelete = useCallback((id) => onMessageDelete?.(thread, id), [
125
+ onMessageDelete,
126
+ thread
127
+ ]);
128
+ const handleThreadDelete = useCallback(() => onThreadDelete?.(thread), [
129
+ onThreadDelete,
130
+ thread
131
+ ]);
132
+ const handleComment = useCallback(() => {
133
+ if (!messageRef.current) {
134
+ return false;
135
+ }
136
+ onComment?.(thread, messageRef.current);
137
+ messageRef.current = "";
138
+ scrollToEnd("instant");
139
+ rerenderEditor();
140
+ return true;
141
+ }, [
142
+ thread,
143
+ identity
144
+ ]);
145
+ return /* @__PURE__ */ React.createElement(Thread, {
146
+ onClickCapture: handleAttend,
147
+ onFocusCapture: handleAttend,
148
+ current,
149
+ id: fullyQualifiedId(thread)
150
+ }, /* @__PURE__ */ React.createElement("div", {
151
+ role: "none",
152
+ className: mx("col-span-2 grid grid-cols-[var(--rail-size)_1fr_min-content]", hoverableControls, hoverableFocusedWithinControls)
153
+ }, detached ? /* @__PURE__ */ React.createElement(Tooltip.Root, null, /* @__PURE__ */ React.createElement(Tooltip.Trigger, {
154
+ asChild: true
155
+ }, /* @__PURE__ */ React.createElement(ThreadHeading, {
156
+ detached: true
157
+ }, thread.name)), /* @__PURE__ */ React.createElement(Tooltip.Portal, null, /* @__PURE__ */ React.createElement(Tooltip.Content, {
158
+ classNames: "z-30",
159
+ side: "top"
160
+ }, t("detached thread label"), /* @__PURE__ */ React.createElement(Tooltip.Arrow, null)))) : /* @__PURE__ */ React.createElement(ThreadHeading, null, thread.name), /* @__PURE__ */ React.createElement("div", {
161
+ className: "flex flex-row items-center pli-1"
162
+ }, thread.status === "staged" && /* @__PURE__ */ React.createElement(Tag, {
163
+ palette: "neutral"
164
+ }, t("draft button")), onResolve && !(thread?.status === "staged") && /* @__PURE__ */ React.createElement(ToggleResolvedButton, {
165
+ isResolved: thread?.status === "resolved",
166
+ onResolve: handleResolve
167
+ }), onThreadDelete && /* @__PURE__ */ React.createElement(DeleteThreadButton, {
168
+ onDelete: handleThreadDelete
169
+ }))), RefArray.allResolvedTargets(thread.messages?.filter(isNonNullable) ?? []).map((message) => /* @__PURE__ */ React.createElement(MessageContainer, {
170
+ key: message.id,
171
+ message,
172
+ members,
173
+ onDelete: handleMessageDelete
174
+ })), /* @__PURE__ */ React.createElement(MessageTextbox, {
175
+ extensions,
176
+ onSend: handleComment,
177
+ ...textboxMetadata
178
+ }), /* @__PURE__ */ React.createElement(ThreadFooter, {
179
+ activity
180
+ }, t("activity message")), /* @__PURE__ */ React.createElement("div", {
181
+ role: "none",
182
+ className: "bs-px -mbs-px",
183
+ ref: threadScrollRef
184
+ }));
185
+ };
186
+
187
+ // packages/plugins/plugin-thread/src/components/CommentsContainer.tsx
188
+ import { ChatText } from "@phosphor-icons/react";
189
+ import React2, { useEffect } from "react";
190
+ import { fullyQualifiedId as fullyQualifiedId2 } from "@dxos/react-client/echo";
191
+ import { useTranslation as useTranslation2, Trans } from "@dxos/react-ui";
192
+ import { descriptionText, mx as mx2 } from "@dxos/react-ui-theme";
193
+ var CommentsContainer = ({ threads, detached = [], currentId, showResolvedThreads, ...props }) => {
194
+ const { t } = useTranslation2(THREAD_PLUGIN);
195
+ const filteredThreads = showResolvedThreads ? threads : threads.filter((thread) => !(thread?.status === "resolved"));
196
+ useEffect(() => {
197
+ if (currentId) {
198
+ document.getElementById(currentId)?.scrollIntoView({
199
+ behavior: "smooth",
200
+ block: "end"
201
+ });
202
+ }
203
+ }, [
204
+ currentId
205
+ ]);
206
+ return /* @__PURE__ */ React2.createElement(React2.Fragment, null, filteredThreads.length > 0 ? filteredThreads.map((thread) => {
207
+ const threadId = fullyQualifiedId2(thread);
208
+ return /* @__PURE__ */ React2.createElement(CommentContainer, {
209
+ key: threadId,
210
+ thread,
211
+ current: currentId === threadId,
212
+ detached: detached.includes(threadId),
213
+ ...props
214
+ });
215
+ }) : /* @__PURE__ */ React2.createElement("div", {
216
+ role: "alert",
217
+ className: mx2(descriptionText, "place-self-center border border-dashed border-unAccent rounded-lg text-center p-4 m-4")
218
+ }, /* @__PURE__ */ React2.createElement("h2", {
219
+ className: "mbe-2 font-medium text-baseText"
220
+ }, t("no comments title")), /* @__PURE__ */ React2.createElement("p", null, /* @__PURE__ */ React2.createElement(Trans, {
221
+ t,
222
+ i18nKey: "no comments message",
223
+ components: {
224
+ commentIcon: /* @__PURE__ */ React2.createElement(ChatText, {
225
+ className: "inline-block"
226
+ })
227
+ }
228
+ }))));
229
+ };
230
+
231
+ // packages/plugins/plugin-thread/src/components/ThreadComplementary.tsx
232
+ import React3, { useCallback as useCallback2, useEffect as useEffect2, useMemo as useMemo2 } from "react";
233
+ import { createIntent, LayoutAction, useCapability, useCapabilities, useIntentDispatcher } from "@dxos/app-framework";
234
+ import { ThreadCapabilities as ThreadCapabilities2 } from "@dxos/plugin-space";
235
+ import { MessageType } from "@dxos/plugin-space/types";
236
+ import { create, fullyQualifiedId as fullyQualifiedId3, makeRef, RefArray as RefArray2 } from "@dxos/react-client/echo";
237
+ import { useIdentity as useIdentity2 } from "@dxos/react-client/halo";
238
+ import { useTranslation as useTranslation3 } from "@dxos/react-ui";
239
+ import { useAttended } from "@dxos/react-ui-attention";
240
+ import { Tabs } from "@dxos/react-ui-tabs";
241
+ import { isNonNullable as isNonNullable2 } from "@dxos/util";
242
+ var ThreadComplementary = ({ subject }) => {
243
+ const { dispatchPromise: dispatch } = useIntentDispatcher();
244
+ const identity = useIdentity2();
245
+ const { t } = useTranslation3(THREAD_PLUGIN);
246
+ const { state, getViewState } = useCapability(ThreadCapabilities.MutableState);
247
+ const viewState = getViewState(fullyQualifiedId3(subject));
248
+ const { showResolvedThreads } = viewState;
249
+ const onChangeViewState = useCallback2((nextValue) => {
250
+ viewState.showResolvedThreads = nextValue === "all";
251
+ }, [
252
+ viewState
253
+ ]);
254
+ const drafts = state.drafts[fullyQualifiedId3(subject)];
255
+ const threadsIntegrators = useCapabilities(ThreadCapabilities2.Thread);
256
+ const createSort = useMemo2(() => threadsIntegrators.find((p) => p.predicate(subject))?.createSort, [
257
+ threadsIntegrators,
258
+ subject
259
+ ]);
260
+ const sort = useMemo2(() => createSort?.(subject), [
261
+ createSort,
262
+ subject
263
+ ]);
264
+ const threadObjects = RefArray2.allResolvedTargets(subject.threads ?? []);
265
+ const threads = useMemo2(() => {
266
+ return threadObjects.concat(drafts ?? []).filter(isNonNullable2);
267
+ }, [
268
+ JSON.stringify(threadObjects),
269
+ JSON.stringify(drafts)
270
+ ]);
271
+ const detachedIds = useMemo2(() => {
272
+ return threads.filter(({ anchor }) => !anchor).map((thread) => fullyQualifiedId3(thread));
273
+ }, [
274
+ threads
275
+ ]);
276
+ useEffect2(() => {
277
+ if (!sort) {
278
+ return;
279
+ }
280
+ threads.sort((a, b) => sort(a?.anchor, b?.anchor));
281
+ }, [
282
+ sort,
283
+ threads
284
+ ]);
285
+ const attended = useAttended();
286
+ const qualifiedSubjectId = fullyQualifiedId3(subject);
287
+ const handleAttend = useCallback2((thread) => {
288
+ const threadId = fullyQualifiedId3(thread);
289
+ if (state.current !== threadId) {
290
+ state.current = threadId;
291
+ void dispatch(createIntent(LayoutAction.ScrollIntoView, {
292
+ part: "current",
293
+ subject: fullyQualifiedId3(subject),
294
+ options: {
295
+ cursor: thread.anchor,
296
+ ref: threadId
297
+ }
298
+ }));
299
+ }
300
+ }, [
301
+ state.current,
302
+ dispatch,
303
+ subject
304
+ ]);
305
+ const handleComment = useCallback2(async (thread, message) => {
306
+ thread.messages.push(makeRef(create(MessageType, {
307
+ sender: {
308
+ identityKey: identity?.identityKey.toHex()
309
+ },
310
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
311
+ text: message
312
+ })));
313
+ await dispatch(createIntent(ThreadAction.OnMessageAdd, {
314
+ thread,
315
+ subject
316
+ }));
317
+ state.current = fullyQualifiedId3(thread);
318
+ }, [
319
+ dispatch,
320
+ identity,
321
+ subject
322
+ ]);
323
+ const handleResolve = useCallback2((thread) => dispatch(createIntent(ThreadAction.ToggleResolved, {
324
+ thread
325
+ })), [
326
+ dispatch
327
+ ]);
328
+ const handleThreadDelete = useCallback2((thread) => dispatch(createIntent(ThreadAction.Delete, {
329
+ thread,
330
+ subject
331
+ })), [
332
+ dispatch,
333
+ subject
334
+ ]);
335
+ const handleMessageDelete = useCallback2((thread, messageId) => dispatch(createIntent(ThreadAction.DeleteMessage, {
336
+ thread,
337
+ subject,
338
+ messageId
339
+ })), [
340
+ dispatch,
341
+ subject
342
+ ]);
343
+ const comments = /* @__PURE__ */ React3.createElement(CommentsContainer, {
344
+ threads,
345
+ detached: detachedIds,
346
+ currentId: attended.includes(qualifiedSubjectId) ? state.current : void 0,
347
+ showResolvedThreads,
348
+ onAttend: handleAttend,
349
+ onComment: handleComment,
350
+ onResolve: handleResolve,
351
+ onMessageDelete: handleMessageDelete,
352
+ onThreadDelete: handleThreadDelete
353
+ });
354
+ return /* @__PURE__ */ React3.createElement(Tabs.Root, {
355
+ value: showResolvedThreads ? "all" : "unresolved",
356
+ onValueChange: onChangeViewState,
357
+ orientation: "horizontal"
358
+ }, /* @__PURE__ */ React3.createElement(Tabs.Tablist, {
359
+ classNames: "p-1 gap-1 bs-[--rail-action] border-be border-separator"
360
+ }, /* @__PURE__ */ React3.createElement(Tabs.Tab, {
361
+ value: "unresolved",
362
+ classNames: "text-sm"
363
+ }, t("show unresolved label")), /* @__PURE__ */ React3.createElement(Tabs.Tab, {
364
+ value: "all",
365
+ classNames: "text-sm"
366
+ }, t("show all label"))), /* @__PURE__ */ React3.createElement(Tabs.Tabpanel, {
367
+ value: "all"
368
+ }, showResolvedThreads && comments), /* @__PURE__ */ React3.createElement(Tabs.Tabpanel, {
369
+ value: "unresolved"
370
+ }, !showResolvedThreads && comments));
371
+ };
372
+
373
+ // packages/plugins/plugin-thread/src/components/ThreadSettings.tsx
374
+ import React4 from "react";
375
+ import { DeprecatedFormContainer } from "@dxos/react-ui-form";
376
+ var ThreadSettings = ({ settings }) => {
377
+ return /* @__PURE__ */ React4.createElement(DeprecatedFormContainer, null);
378
+ };
379
+
380
+ // packages/plugins/plugin-thread/src/components/index.ts
381
+ var ThreadContainer = lazy(() => import("./ThreadContainer-6OP5AG2W.mjs"));
382
+
383
+ // packages/plugins/plugin-thread/src/capabilities/react-surface.tsx
384
+ var react_surface_default = () => contributes(Capabilities.ReactSurface, [
385
+ createSurface({
386
+ id: `${THREAD_PLUGIN}/channel`,
387
+ role: "article",
388
+ filter: (data) => data.subject instanceof ChannelType && !!data.subject.threads[0],
389
+ component: ({ data, role }) => {
390
+ const layout = useLayout();
391
+ const channel = data.subject;
392
+ void channel.threads[0].load();
393
+ const thread = channel.threads[0].target;
394
+ if (!thread) {
395
+ return null;
396
+ }
397
+ const currentPosition = layout.active.findIndex((id) => id === channel.id);
398
+ if (currentPosition > 0) {
399
+ const objectToTheLeft = layout.active[currentPosition - 1];
400
+ const context = getSpace2(channel)?.db.getObjectById(objectToTheLeft);
401
+ return /* @__PURE__ */ React5.createElement(ThreadContainer, {
402
+ role,
403
+ thread,
404
+ context
405
+ });
406
+ }
407
+ return /* @__PURE__ */ React5.createElement(ThreadContainer, {
408
+ role,
409
+ thread
410
+ });
411
+ }
412
+ }),
413
+ createSurface({
414
+ id: `${THREAD_PLUGIN}/thread`,
415
+ role: "complementary--comments",
416
+ filter: (data) => !!data.subject && typeof data.subject === "object" && "threads" in data.subject && Array.isArray(data.subject.threads) && !(data.subject instanceof ChannelType),
417
+ component: ({ data }) => /* @__PURE__ */ React5.createElement(ThreadComplementary, {
418
+ subject: data.subject
419
+ })
420
+ }),
421
+ createSurface({
422
+ id: `${THREAD_PLUGIN}/settings`,
423
+ role: "article",
424
+ filter: (data) => data.subject instanceof SettingsStore && data.subject.prefix === THREAD_PLUGIN,
425
+ component: ({ data: { subject } }) => /* @__PURE__ */ React5.createElement(ThreadSettings, {
426
+ settings: subject.value
427
+ })
428
+ })
429
+ ]);
430
+ export {
431
+ react_surface_default as default
432
+ };
433
+ //# sourceMappingURL=react-surface-Y4MUSICN.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 { ThreadContainer, 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, role }) => {\n const layout = useLayout();\n const channel = data.subject;\n void channel.threads[0].load();\n const thread = channel.threads[0].target;\n if (!thread) {\n return null;\n }\n\n const currentPosition = layout.active.findIndex((id) => id === channel.id);\n if (currentPosition > 0) {\n const objectToTheLeft = layout.active[currentPosition - 1];\n const context = getSpace(channel)?.db.getObjectById(objectToTheLeft);\n return <ThreadContainer role={role} thread={thread} context={context} />;\n }\n\n return <ThreadContainer role={role} thread={thread} />;\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 ThreadContainer = lazy(() => import('./ThreadContainer'));\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.allResolvedTargets(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.allResolvedTargets(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", "allResolvedTargets", "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", "allResolvedTargets", "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", "ThreadContainer", "lazy", "contributes", "Capabilities", "ReactSurface", "createSurface", "id", "THREAD_PLUGIN", "role", "filter", "data", "subject", "ChannelType", "threads", "component", "layout", "useLayout", "channel", "load", "thread", "target", "currentPosition", "active", "findIndex", "objectToTheLeft", "context", "getSpace", "db", "getObjectById", "React", "ThreadContainer", "Array", "isArray", "ThreadComplementary", "SettingsStore", "prefix", "ThreadSettings", "settings", "value"]
7
+ }
@@ -0,0 +1,22 @@
1
+ import {
2
+ ThreadSettingsSchema
3
+ } from "./chunk-YK3ICB7G.mjs";
4
+ import {
5
+ THREAD_PLUGIN
6
+ } from "./chunk-636QDHE3.mjs";
7
+
8
+ // packages/plugins/plugin-thread/src/capabilities/settings.ts
9
+ import { Capabilities, contributes } from "@dxos/app-framework";
10
+ import { create } from "@dxos/live-object";
11
+ var settings_default = () => {
12
+ const settings = create({});
13
+ return contributes(Capabilities.Settings, {
14
+ schema: ThreadSettingsSchema,
15
+ prefix: THREAD_PLUGIN,
16
+ value: settings
17
+ });
18
+ };
19
+ export {
20
+ settings_default as default
21
+ };
22
+ //# sourceMappingURL=settings-WQTE5AEZ.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/settings.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capabilities, contributes } from '@dxos/app-framework';\nimport { create } from '@dxos/live-object';\n\nimport { THREAD_PLUGIN } from '../meta';\nimport { type ThreadSettingsProps, ThreadSettingsSchema } from '../types';\n\nexport default () => {\n const settings = create<ThreadSettingsProps>({});\n return contributes(Capabilities.Settings, { schema: ThreadSettingsSchema, prefix: THREAD_PLUGIN, value: settings });\n};\n"],
5
+ "mappings": ";;;;;;;;AAIA,SAASA,cAAcC,mBAAmB;AAC1C,SAASC,cAAc;AAKvB,IAAA,mBAAe,MAAA;AACb,QAAMC,WAAWC,OAA4B,CAAC,CAAA;AAC9C,SAAOC,YAAYC,aAAaC,UAAU;IAAEC,QAAQC;IAAsBC,QAAQC;IAAeC,OAAOT;EAAS,CAAA;AACnH;",
6
+ "names": ["Capabilities", "contributes", "create", "settings", "create", "contributes", "Capabilities", "Settings", "schema", "ThreadSettingsSchema", "prefix", "THREAD_PLUGIN", "value"]
7
+ }
@@ -0,0 +1,33 @@
1
+ import {
2
+ ThreadCapabilities
3
+ } from "./chunk-NAO3LZMZ.mjs";
4
+ import "./chunk-636QDHE3.mjs";
5
+
6
+ // packages/plugins/plugin-thread/src/capabilities/state.ts
7
+ import { contributes } from "@dxos/app-framework";
8
+ import { create } from "@dxos/live-object";
9
+ var initialViewState = {
10
+ showResolvedThreads: false
11
+ };
12
+ var state_default = () => {
13
+ const state = create({
14
+ drafts: {}
15
+ });
16
+ const viewStore = create({});
17
+ const getViewState = (subjectId) => {
18
+ if (!viewStore[subjectId]) {
19
+ viewStore[subjectId] = {
20
+ ...initialViewState
21
+ };
22
+ }
23
+ return viewStore[subjectId];
24
+ };
25
+ return contributes(ThreadCapabilities.State, {
26
+ state,
27
+ getViewState
28
+ });
29
+ };
30
+ export {
31
+ state_default as default
32
+ };
33
+ //# sourceMappingURL=state-GNFUURIC.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>({ 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,QAAQ,CAAC;EAAE,CAAA;AAC/C,QAAMC,YAAYF,OAAkB,CAAC,CAAA;AAErC,QAAMG,eAAe,CAACC,cAAAA;AACpB,QAAI,CAACF,UAAUE,SAAAA,GAAY;AACzBF,gBAAUE,SAAAA,IAAa;QAAE,GAAGP;MAAiB;IAC/C;AACA,WAAOK,UAAUE,SAAAA;EACnB;AAEA,SAAOC,YAAYC,mBAAmBC,OAAO;IAAER;IAAOI;EAAa,CAAA;AACrE;",
6
+ "names": ["contributes", "create", "initialViewState", "showResolvedThreads", "state", "create", "drafts", "viewStore", "getViewState", "subjectId", "contributes", "ThreadCapabilities", "State"]
7
+ }
@@ -1,8 +1,10 @@
1
1
  import {
2
- ThreadAction
3
- } from "./chunk-6KTMQPL4.mjs";
4
- import "./chunk-ENERBDYI.mjs";
2
+ ThreadAction,
3
+ ThreadSettingsSchema
4
+ } from "./chunk-YK3ICB7G.mjs";
5
+ import "./chunk-636QDHE3.mjs";
5
6
  export {
6
- ThreadAction
7
+ ThreadAction,
8
+ ThreadSettingsSchema
7
9
  };
8
10
  //# sourceMappingURL=types.mjs.map
@@ -26,19 +26,20 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  mod
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var ThreadArticle_ZCNMFBAO_exports = {};
30
- __export(ThreadArticle_ZCNMFBAO_exports, {
31
- default: () => ThreadArticle_default
29
+ var ThreadContainer_LTKKLPXX_exports = {};
30
+ __export(ThreadContainer_LTKKLPXX_exports, {
31
+ default: () => ThreadContainer_default
32
32
  });
33
- module.exports = __toCommonJS(ThreadArticle_ZCNMFBAO_exports);
34
- var import_chunk_2CB5AVBL = require("./chunk-2CB5AVBL.cjs");
35
- var import_chunk_IC2NICNC = require("./chunk-IC2NICNC.cjs");
33
+ module.exports = __toCommonJS(ThreadContainer_LTKKLPXX_exports);
34
+ var import_chunk_RQR5Z23G = require("./chunk-RQR5Z23G.cjs");
35
+ var import_chunk_AWSTZ2KN = require("./chunk-AWSTZ2KN.cjs");
36
+ var import_chunk_F735VMTN = require("./chunk-F735VMTN.cjs");
36
37
  var import_react = __toESM(require("react"));
37
- var ThreadArticle = (props) => {
38
- return /* @__PURE__ */ import_react.default.createElement("div", {
39
- role: "none",
40
- className: "row-span-2"
41
- }, /* @__PURE__ */ import_react.default.createElement(import_chunk_2CB5AVBL.ChatContainer, props));
38
+ var import_react_ui_stack = require("@dxos/react-ui-stack");
39
+ var ThreadContainer = ({ role, ...props }) => {
40
+ return /* @__PURE__ */ import_react.default.createElement(import_react_ui_stack.StackItem.Content, {
41
+ toolbar: false
42
+ }, /* @__PURE__ */ import_react.default.createElement(import_chunk_RQR5Z23G.ChatContainer, props));
42
43
  };
43
- var ThreadArticle_default = ThreadArticle;
44
- //# sourceMappingURL=ThreadArticle-ZCNMFBAO.cjs.map
44
+ var ThreadContainer_default = ThreadContainer;
45
+ //# sourceMappingURL=ThreadContainer-LTKKLPXX.cjs.map