@dxos/plugin-thread 0.8.4-main.28f8d3d → 0.8.4-main.406dc2a

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 (246) hide show
  1. package/dist/lib/browser/ChannelContainer-BGDGZHV4.mjs +16 -0
  2. package/dist/lib/browser/ChatContainer-75KJZ4XR.mjs +15 -0
  3. package/dist/lib/browser/{app-graph-builder-AF3M7UWN.mjs → app-graph-builder-ODKIAXR7.mjs} +17 -17
  4. package/dist/lib/browser/app-graph-builder-ODKIAXR7.mjs.map +7 -0
  5. package/dist/lib/browser/{call-manager-XRRCAVLI.mjs → call-manager-BCKLI4QD.mjs} +7 -7
  6. package/dist/lib/browser/{call-manager-XRRCAVLI.mjs.map → call-manager-BCKLI4QD.mjs.map} +1 -1
  7. package/dist/lib/browser/chunk-2MUYQOQE.mjs +23 -0
  8. package/dist/lib/browser/{chunk-2CWJBXBH.mjs.map → chunk-2MUYQOQE.mjs.map} +3 -3
  9. package/dist/lib/browser/chunk-B7YQ7QR2.mjs +376 -0
  10. package/dist/lib/browser/chunk-B7YQ7QR2.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-ZJ7QBXK6.mjs → chunk-CMCVHULC.mjs} +17 -15
  12. package/dist/lib/browser/chunk-CMCVHULC.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-GERVMFQW.mjs → chunk-CP7E2HRE.mjs} +2 -2
  14. package/dist/lib/browser/chunk-CP7E2HRE.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-X5PIP5YR.mjs → chunk-HDEQRBOC.mjs} +37 -5
  16. package/dist/lib/{node-esm/chunk-SED3O2XO.mjs.map → browser/chunk-HDEQRBOC.mjs.map} +4 -4
  17. package/dist/lib/browser/chunk-L326LSNS.mjs +18 -0
  18. package/dist/lib/browser/chunk-L326LSNS.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-EV4JWI7L.mjs → chunk-T4KJ5JR4.mjs} +5 -7
  20. package/dist/lib/browser/chunk-T4KJ5JR4.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-VJMKS4CZ.mjs +619 -0
  22. package/dist/lib/browser/chunk-VJMKS4CZ.mjs.map +7 -0
  23. package/dist/lib/browser/{chunk-DW7JD64V.mjs → chunk-VTYX3SIM.mjs} +26 -16
  24. package/dist/lib/browser/chunk-VTYX3SIM.mjs.map +7 -0
  25. package/dist/lib/browser/{chunk-JGKMMI65.mjs → chunk-XYUJXHYV.mjs} +54 -4
  26. package/dist/lib/browser/chunk-XYUJXHYV.mjs.map +7 -0
  27. package/dist/lib/browser/{chunk-TUFWPOVS.mjs → chunk-ZCEU5K23.mjs} +460 -268
  28. package/dist/lib/browser/chunk-ZCEU5K23.mjs.map +7 -0
  29. package/dist/lib/browser/index.mjs +22 -13
  30. package/dist/lib/browser/index.mjs.map +3 -3
  31. package/dist/lib/browser/{intent-resolver-DCY4P4OX.mjs → intent-resolver-VOQD3TQ2.mjs} +73 -15
  32. package/dist/lib/browser/intent-resolver-VOQD3TQ2.mjs.map +7 -0
  33. package/dist/lib/browser/{markdown-WZSXCEZJ.mjs → markdown-R6MGRIA6.mjs} +6 -6
  34. package/dist/lib/browser/{markdown-WZSXCEZJ.mjs.map → markdown-R6MGRIA6.mjs.map} +1 -1
  35. package/dist/lib/browser/meta.json +1 -1
  36. package/dist/lib/browser/react-root-UMSBTN6H.mjs +28 -0
  37. package/dist/lib/browser/react-root-UMSBTN6H.mjs.map +7 -0
  38. package/dist/lib/browser/{react-surface-PYAMIADB.mjs → react-surface-SXMQEWKE.mjs} +22 -22
  39. package/dist/lib/browser/react-surface-SXMQEWKE.mjs.map +7 -0
  40. package/dist/lib/browser/{settings-AC6YSASL.mjs → settings-TCNF54PN.mjs} +5 -5
  41. package/dist/lib/browser/{settings-AC6YSASL.mjs.map → settings-TCNF54PN.mjs.map} +1 -1
  42. package/dist/lib/browser/{state-2T4KDWBX.mjs → state-ZQ4IPOJT.mjs} +5 -5
  43. package/dist/lib/browser/{state-2T4KDWBX.mjs.map → state-ZQ4IPOJT.mjs.map} +1 -1
  44. package/dist/lib/browser/toolkit-JF4B4QIO.mjs +84 -0
  45. package/dist/lib/browser/toolkit-JF4B4QIO.mjs.map +7 -0
  46. package/dist/lib/browser/types/index.mjs +2 -2
  47. package/dist/lib/node-esm/ChannelContainer-OXC6BTU7.mjs +17 -0
  48. package/dist/lib/node-esm/{ChatContainer-2CT4PJ7I.mjs → ChatContainer-SH6LTFQL.mjs} +6 -6
  49. package/dist/lib/node-esm/{app-graph-builder-OLSJVCWY.mjs → app-graph-builder-DMPT3MY6.mjs} +17 -17
  50. package/dist/lib/node-esm/app-graph-builder-DMPT3MY6.mjs.map +7 -0
  51. package/dist/lib/node-esm/{call-manager-EI7FXRAU.mjs → call-manager-Q7RY2YP4.mjs} +7 -7
  52. package/dist/lib/node-esm/{call-manager-EI7FXRAU.mjs.map → call-manager-Q7RY2YP4.mjs.map} +1 -1
  53. package/dist/lib/node-esm/{chunk-YIDU3DXK.mjs → chunk-2KZ4ODHU.mjs} +17 -15
  54. package/dist/lib/node-esm/chunk-2KZ4ODHU.mjs.map +7 -0
  55. package/dist/lib/node-esm/{chunk-SED3O2XO.mjs → chunk-2MMJF7DW.mjs} +37 -5
  56. package/dist/lib/node-esm/chunk-2MMJF7DW.mjs.map +7 -0
  57. package/dist/lib/node-esm/{chunk-QBHKLWGR.mjs → chunk-2V3WSLUZ.mjs} +54 -4
  58. package/dist/lib/node-esm/chunk-2V3WSLUZ.mjs.map +7 -0
  59. package/dist/lib/node-esm/{chunk-57XR3LEF.mjs → chunk-ABUFOZVX.mjs} +2 -2
  60. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs.map +7 -0
  61. package/dist/lib/node-esm/{chunk-XVKWHTH4.mjs → chunk-BAMZXJS4.mjs} +26 -16
  62. package/dist/lib/node-esm/chunk-BAMZXJS4.mjs.map +7 -0
  63. package/dist/lib/node-esm/chunk-BTGKI5IK.mjs +377 -0
  64. package/dist/lib/node-esm/chunk-BTGKI5IK.mjs.map +7 -0
  65. package/dist/lib/node-esm/chunk-GZ4WL2IS.mjs +25 -0
  66. package/dist/lib/node-esm/{chunk-6CRHHOST.mjs.map → chunk-GZ4WL2IS.mjs.map} +3 -3
  67. package/dist/lib/node-esm/chunk-LCHTNRK7.mjs +19 -0
  68. package/dist/lib/node-esm/chunk-LCHTNRK7.mjs.map +7 -0
  69. package/dist/lib/node-esm/chunk-NHSIAEDW.mjs +620 -0
  70. package/dist/lib/node-esm/chunk-NHSIAEDW.mjs.map +7 -0
  71. package/dist/lib/node-esm/{chunk-GRLRWTRU.mjs → chunk-OBVAURUU.mjs} +5 -7
  72. package/dist/lib/node-esm/chunk-OBVAURUU.mjs.map +7 -0
  73. package/dist/lib/node-esm/{chunk-4TME3BR4.mjs → chunk-TIPIOH2J.mjs} +460 -268
  74. package/dist/lib/node-esm/chunk-TIPIOH2J.mjs.map +7 -0
  75. package/dist/lib/node-esm/index.mjs +22 -13
  76. package/dist/lib/node-esm/index.mjs.map +3 -3
  77. package/dist/lib/node-esm/{intent-resolver-QGTPU6QB.mjs → intent-resolver-AKVH66PH.mjs} +73 -15
  78. package/dist/lib/node-esm/intent-resolver-AKVH66PH.mjs.map +7 -0
  79. package/dist/lib/node-esm/{markdown-3MZXUGUA.mjs → markdown-MYGTDXT6.mjs} +6 -6
  80. package/dist/lib/node-esm/{markdown-3MZXUGUA.mjs.map → markdown-MYGTDXT6.mjs.map} +1 -1
  81. package/dist/lib/node-esm/meta.json +1 -1
  82. package/dist/lib/node-esm/react-root-W6AVTL5M.mjs +29 -0
  83. package/dist/lib/node-esm/react-root-W6AVTL5M.mjs.map +7 -0
  84. package/dist/lib/node-esm/{react-surface-UJFCSFNO.mjs → react-surface-NLSZJGMO.mjs} +22 -22
  85. package/dist/lib/node-esm/react-surface-NLSZJGMO.mjs.map +7 -0
  86. package/dist/lib/node-esm/{settings-N52O7MLS.mjs → settings-ZQHGVFBY.mjs} +5 -5
  87. package/dist/lib/node-esm/{settings-N52O7MLS.mjs.map → settings-ZQHGVFBY.mjs.map} +1 -1
  88. package/dist/lib/node-esm/{state-62TQKQVB.mjs → state-FSLLJ5TZ.mjs} +5 -5
  89. package/dist/lib/node-esm/{state-62TQKQVB.mjs.map → state-FSLLJ5TZ.mjs.map} +1 -1
  90. package/dist/lib/node-esm/toolkit-DHPKJITO.mjs +85 -0
  91. package/dist/lib/node-esm/toolkit-DHPKJITO.mjs.map +7 -0
  92. package/dist/lib/node-esm/types/index.mjs +2 -2
  93. package/dist/types/src/ThreadPlugin.d.ts +1 -1
  94. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  95. package/dist/types/src/calls/media-manager.d.ts +1 -1
  96. package/dist/types/src/calls/media-manager.d.ts.map +1 -1
  97. package/dist/types/src/calls/types.d.ts.map +1 -1
  98. package/dist/types/src/calls/util/calls-service.d.ts +3 -1
  99. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
  100. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -1
  101. package/dist/types/src/calls-service.stories.d.ts +10 -9
  102. package/dist/types/src/calls-service.stories.d.ts.map +1 -1
  103. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
  104. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  105. package/dist/types/src/capabilities/call-manager.d.ts +1 -1
  106. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  107. package/dist/types/src/capabilities/index.d.ts +11 -10
  108. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  109. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
  110. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  111. package/dist/types/src/capabilities/markdown.d.ts +1 -1
  112. package/dist/types/src/capabilities/react-root.d.ts +2 -2
  113. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  114. package/dist/types/src/capabilities/settings.d.ts +1 -1
  115. package/dist/types/src/capabilities/state.d.ts +2 -2
  116. package/dist/types/src/capabilities/toolkit.d.ts +6 -0
  117. package/dist/types/src/capabilities/toolkit.d.ts.map +1 -0
  118. package/dist/types/src/components/CallDebugPanel.d.ts +7 -0
  119. package/dist/types/src/components/CallDebugPanel.d.ts.map +1 -1
  120. package/dist/types/src/components/ChannelContainer.stories.d.ts +89 -5
  121. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +1 -1
  122. package/dist/types/src/components/Chat.stories.d.ts +91 -5
  123. package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
  124. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  125. package/dist/types/src/components/Comments.stories.d.ts +156 -4
  126. package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
  127. package/dist/types/src/components/CommentsThreadContainer.d.ts +2 -2
  128. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +1 -1
  129. package/dist/types/src/components/Media/VideoObject.d.ts +2 -2
  130. package/dist/types/src/components/Media/VideoObject.d.ts.map +1 -1
  131. package/dist/types/src/components/Media/VideoObject.stories.d.ts +18 -4
  132. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
  133. package/dist/types/src/components/MessageContainer.d.ts +4 -1
  134. package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
  135. package/dist/types/src/components/Participant/Participant.d.ts.map +1 -1
  136. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +155 -3
  137. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +1 -1
  138. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +157 -4
  139. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  140. package/dist/types/src/components/ThreadComplementary.d.ts.map +1 -1
  141. package/dist/types/src/components/ThreadSettings.d.ts +1 -1
  142. package/dist/types/src/components/ThreadSettings.d.ts.map +1 -1
  143. package/dist/types/src/components/command-extension.d.ts.map +1 -1
  144. package/dist/types/src/components/testing.d.ts +1 -0
  145. package/dist/types/src/components/testing.d.ts.map +1 -1
  146. package/dist/types/src/hooks/index.d.ts +1 -0
  147. package/dist/types/src/hooks/index.d.ts.map +1 -1
  148. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts +2 -0
  149. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts.map +1 -0
  150. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +1 -1
  151. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -1
  152. package/dist/types/src/meta.d.ts +1 -2
  153. package/dist/types/src/meta.d.ts.map +1 -1
  154. package/dist/types/src/translations.d.ts +3 -1
  155. package/dist/types/src/translations.d.ts.map +1 -1
  156. package/dist/types/src/types/schema.d.ts +126 -111
  157. package/dist/types/src/types/schema.d.ts.map +1 -1
  158. package/dist/types/src/types/types.d.ts +259 -174
  159. package/dist/types/src/types/types.d.ts.map +1 -1
  160. package/dist/types/tsconfig.tsbuildinfo +1 -1
  161. package/package.json +60 -58
  162. package/src/ThreadPlugin.tsx +128 -122
  163. package/src/calls/call-manager.ts +1 -1
  164. package/src/calls/media-manager.ts +58 -32
  165. package/src/calls/types.ts +7 -3
  166. package/src/calls/util/calls-service.ts +61 -11
  167. package/src/calls/util/stub-media-streams.ts +60 -3
  168. package/src/calls-service.stories.tsx +76 -63
  169. package/src/capabilities/app-graph-builder.ts +13 -10
  170. package/src/capabilities/capabilities.ts +5 -5
  171. package/src/capabilities/index.ts +1 -0
  172. package/src/capabilities/intent-resolver.ts +39 -6
  173. package/src/capabilities/react-root.tsx +2 -2
  174. package/src/capabilities/react-surface.tsx +9 -9
  175. package/src/capabilities/toolkit.ts +82 -0
  176. package/src/components/Call/Toolbar.tsx +4 -4
  177. package/src/components/CallDebugPanel.tsx +108 -49
  178. package/src/components/ChannelContainer.stories.tsx +9 -9
  179. package/src/components/ChannelContainer.tsx +1 -1
  180. package/src/components/Chat.stories.tsx +31 -29
  181. package/src/components/ChatContainer.tsx +4 -1
  182. package/src/components/Comments.stories.tsx +33 -35
  183. package/src/components/CommentsThreadContainer.tsx +8 -7
  184. package/src/components/Media/VideoObject.stories.tsx +35 -28
  185. package/src/components/MessageContainer.tsx +40 -7
  186. package/src/components/Participant/Participant.tsx +13 -7
  187. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +5 -6
  188. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +41 -40
  189. package/src/components/ThreadComplementary.tsx +36 -6
  190. package/src/components/ThreadSettings.tsx +6 -7
  191. package/src/components/command-extension.ts +4 -1
  192. package/src/components/testing.ts +22 -0
  193. package/src/hooks/index.ts +1 -0
  194. package/src/hooks/useBlackCanvasStreamTrack.tsx +27 -0
  195. package/src/hooks/useVideoStreamTrack.tsx +6 -3
  196. package/src/meta.ts +3 -4
  197. package/src/testing/stories.ts +1 -1
  198. package/src/translations.ts +3 -1
  199. package/src/types/schema.ts +1 -1
  200. package/src/types/types.ts +21 -13
  201. package/src/typings/peermetrics-webrtc-stats.d.ts +17 -1
  202. package/src/util.ts +1 -1
  203. package/dist/lib/browser/ChannelContainer-O2SFQJU7.mjs +0 -16
  204. package/dist/lib/browser/ChatContainer-PVT3DUZJ.mjs +0 -15
  205. package/dist/lib/browser/app-graph-builder-AF3M7UWN.mjs.map +0 -7
  206. package/dist/lib/browser/chunk-2CWJBXBH.mjs +0 -21
  207. package/dist/lib/browser/chunk-4APCDRSH.mjs +0 -18
  208. package/dist/lib/browser/chunk-4APCDRSH.mjs.map +0 -7
  209. package/dist/lib/browser/chunk-DW7JD64V.mjs.map +0 -7
  210. package/dist/lib/browser/chunk-EV4JWI7L.mjs.map +0 -7
  211. package/dist/lib/browser/chunk-FY4ZRD5X.mjs +0 -367
  212. package/dist/lib/browser/chunk-FY4ZRD5X.mjs.map +0 -7
  213. package/dist/lib/browser/chunk-GERVMFQW.mjs.map +0 -7
  214. package/dist/lib/browser/chunk-J3JO5NWO.mjs +0 -477
  215. package/dist/lib/browser/chunk-J3JO5NWO.mjs.map +0 -7
  216. package/dist/lib/browser/chunk-JGKMMI65.mjs.map +0 -7
  217. package/dist/lib/browser/chunk-TUFWPOVS.mjs.map +0 -7
  218. package/dist/lib/browser/chunk-X5PIP5YR.mjs.map +0 -7
  219. package/dist/lib/browser/chunk-ZJ7QBXK6.mjs.map +0 -7
  220. package/dist/lib/browser/intent-resolver-DCY4P4OX.mjs.map +0 -7
  221. package/dist/lib/browser/react-root-QXPALOUQ.mjs +0 -28
  222. package/dist/lib/browser/react-root-QXPALOUQ.mjs.map +0 -7
  223. package/dist/lib/browser/react-surface-PYAMIADB.mjs.map +0 -7
  224. package/dist/lib/node-esm/ChannelContainer-B2ZGAE4P.mjs +0 -17
  225. package/dist/lib/node-esm/app-graph-builder-OLSJVCWY.mjs.map +0 -7
  226. package/dist/lib/node-esm/chunk-4TME3BR4.mjs.map +0 -7
  227. package/dist/lib/node-esm/chunk-57XR3LEF.mjs.map +0 -7
  228. package/dist/lib/node-esm/chunk-6CRHHOST.mjs +0 -23
  229. package/dist/lib/node-esm/chunk-BF4UKS55.mjs +0 -368
  230. package/dist/lib/node-esm/chunk-BF4UKS55.mjs.map +0 -7
  231. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs.map +0 -7
  232. package/dist/lib/node-esm/chunk-PYTVBN5J.mjs +0 -19
  233. package/dist/lib/node-esm/chunk-PYTVBN5J.mjs.map +0 -7
  234. package/dist/lib/node-esm/chunk-QBHKLWGR.mjs.map +0 -7
  235. package/dist/lib/node-esm/chunk-VNG6M2IY.mjs +0 -478
  236. package/dist/lib/node-esm/chunk-VNG6M2IY.mjs.map +0 -7
  237. package/dist/lib/node-esm/chunk-XVKWHTH4.mjs.map +0 -7
  238. package/dist/lib/node-esm/chunk-YIDU3DXK.mjs.map +0 -7
  239. package/dist/lib/node-esm/intent-resolver-QGTPU6QB.mjs.map +0 -7
  240. package/dist/lib/node-esm/react-root-7ZFJYVUZ.mjs +0 -29
  241. package/dist/lib/node-esm/react-root-7ZFJYVUZ.mjs.map +0 -7
  242. package/dist/lib/node-esm/react-surface-UJFCSFNO.mjs.map +0 -7
  243. /package/dist/lib/browser/{ChannelContainer-O2SFQJU7.mjs.map → ChannelContainer-BGDGZHV4.mjs.map} +0 -0
  244. /package/dist/lib/browser/{ChatContainer-PVT3DUZJ.mjs.map → ChatContainer-75KJZ4XR.mjs.map} +0 -0
  245. /package/dist/lib/node-esm/{ChannelContainer-B2ZGAE4P.mjs.map → ChannelContainer-OXC6BTU7.mjs.map} +0 -0
  246. /package/dist/lib/node-esm/{ChatContainer-2CT4PJ7I.mjs.map → ChatContainer-SH6LTFQL.mjs.map} +0 -0
@@ -1,477 +0,0 @@
1
- import {
2
- useOnEditAnalytics,
3
- useStatus
4
- } from "./chunk-X5PIP5YR.mjs";
5
- import {
6
- getMessageMetadata
7
- } from "./chunk-GERVMFQW.mjs";
8
- import {
9
- meta
10
- } from "./chunk-EV4JWI7L.mjs";
11
-
12
- // src/components/ChatContainer.tsx
13
- import { useSignals as _useSignals3 } from "@preact-signals/safe-react/tracking";
14
- import React3, { useLayoutEffect, useMemo as useMemo2, useRef as useRef3, useState as useState3 } from "react";
15
- import { Obj, Ref as Ref3 } from "@dxos/echo";
16
- import { fullyQualifiedId as fullyQualifiedId2, useMembers as useMembers2 } from "@dxos/react-client/echo";
17
- import { useIdentity as useIdentity3 } from "@dxos/react-client/halo";
18
- import { Icon, ScrollArea, useThemeContext as useThemeContext3, useTranslation as useTranslation3 } from "@dxos/react-ui";
19
- import { createBasicExtensions as createBasicExtensions3, createThemeExtensions as createThemeExtensions3, listener as listener2 } from "@dxos/react-ui-editor";
20
- import { StackItem } from "@dxos/react-ui-stack";
21
- import { mx as mx4 } from "@dxos/react-ui-theme";
22
- import { MessageTextbox as MessageTextbox2, Thread as Thread2, threadLayout } from "@dxos/react-ui-thread";
23
- import { DataType } from "@dxos/schema";
24
- import { isNonNullable as isNonNullable2 } from "@dxos/util";
25
-
26
- // src/components/command-extension.ts
27
- import { HighlightStyle, StreamLanguage, syntaxHighlighting } from "@codemirror/language";
28
- import { tags } from "@dxos/react-ui-editor";
29
- import { mx } from "@dxos/react-ui-theme";
30
- var parser = StreamLanguage.define({
31
- startState: () => ({
32
- count: 0
33
- }),
34
- token: (stream, state) => {
35
- state.count++;
36
- if (stream.eatSpace()) {
37
- return null;
38
- }
39
- if (state.count === 1 && stream.match(/^(\/\w+)/)) {
40
- return "tagName";
41
- }
42
- stream.next();
43
- return null;
44
- }
45
- });
46
- var styles = HighlightStyle.define([
47
- {
48
- tag: tags.tagName,
49
- class: mx("dx-tag dx-tag--indigo text-baseText font-medium")
50
- }
51
- ]);
52
- var command = [
53
- parser,
54
- syntaxHighlighting(styles)
55
- ];
56
-
57
- // src/components/MessageContainer.tsx
58
- import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
59
- import { EditorView } from "@codemirror/view";
60
- import React2, { forwardRef, useCallback as useCallback2, useEffect, useRef as useRef2, useState as useState2 } from "react";
61
- import { Surface } from "@dxos/app-framework";
62
- import { Ref as Ref2 } from "@dxos/echo";
63
- import { PublicKey } from "@dxos/react-client";
64
- import { useIdentity as useIdentity2 } from "@dxos/react-client/halo";
65
- import { IconButton as IconButton2, useOnTransition, useThemeContext as useThemeContext2, useTranslation as useTranslation2 } from "@dxos/react-ui";
66
- import { createBasicExtensions as createBasicExtensions2, createThemeExtensions as createThemeExtensions2, useTextEditor } from "@dxos/react-ui-editor";
67
- import { hoverableControlItem as hoverableControlItem2, hoverableControls as hoverableControls2, hoverableFocusedWithinControls as hoverableFocusedWithinControls2, mx as mx3 } from "@dxos/react-ui-theme";
68
- import { MessageHeading, MessageRoot } from "@dxos/react-ui-thread";
69
-
70
- // src/components/CommentsThreadContainer.tsx
71
- import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
72
- import React, { useCallback, useMemo, useRef, useState } from "react";
73
- import { Ref, Relation } from "@dxos/echo";
74
- import { fullyQualifiedId, getSpace, useMembers } from "@dxos/react-client/echo";
75
- import { useIdentity } from "@dxos/react-client/halo";
76
- import { IconButton, Tag, Tooltip, useThemeContext, useTranslation } from "@dxos/react-ui";
77
- import { createBasicExtensions, createThemeExtensions, listener } from "@dxos/react-ui-editor";
78
- import { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx as mx2 } from "@dxos/react-ui-theme";
79
- import { MessageTextbox, Thread } from "@dxos/react-ui-thread";
80
- import { isNonNullable } from "@dxos/util";
81
- var commentControlClassNames = "!p-1 transition-opacity";
82
- var CommentsThreadContainer = ({ anchor, current, onAttend, onComment, onResolve, onMessageDelete, onThreadDelete }) => {
83
- var _effect = _useSignals();
84
- try {
85
- const { t } = useTranslation(meta.id);
86
- const identity = useIdentity();
87
- const space = getSpace(anchor);
88
- const members = useMembers(space?.key);
89
- const detached = !anchor.anchor;
90
- const thread = Relation.getSource(anchor);
91
- const activity = useStatus(space, fullyQualifiedId(thread));
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?.(anchor), [
117
- onAttend,
118
- anchor
119
- ]);
120
- const handleResolve = useCallback(() => onResolve?.(anchor), [
121
- onResolve,
122
- anchor
123
- ]);
124
- const handleMessageDelete = useCallback((id) => onMessageDelete?.(anchor, id), [
125
- onMessageDelete,
126
- anchor
127
- ]);
128
- const handleThreadDelete = useCallback(() => onThreadDelete?.(anchor), [
129
- onThreadDelete,
130
- anchor
131
- ]);
132
- const handleComment = useCallback(() => {
133
- if (!messageRef.current) {
134
- return false;
135
- }
136
- onComment?.(anchor, messageRef.current);
137
- messageRef.current = "";
138
- scrollToEnd("instant");
139
- rerenderEditor();
140
- return true;
141
- }, [
142
- anchor,
143
- identity
144
- ]);
145
- return /* @__PURE__ */ React.createElement(Thread.Root, {
146
- id: fullyQualifiedId(thread),
147
- classNames: "pbs-2 border-be border-subduedSeparator last:border-none",
148
- current,
149
- onClickCapture: handleAttend,
150
- onFocusCapture: handleAttend
151
- }, /* @__PURE__ */ React.createElement("div", {
152
- role: "none",
153
- className: mx2("col-span-2 grid grid-cols-[var(--rail-size)_1fr_min-content]", hoverableControls, hoverableFocusedWithinControls)
154
- }, detached ? /* @__PURE__ */ React.createElement(Tooltip.Trigger, {
155
- asChild: true,
156
- content: t("detached thread label"),
157
- side: "top"
158
- }, /* @__PURE__ */ React.createElement(Thread.Header, {
159
- detached: true
160
- }, thread.name)) : /* @__PURE__ */ React.createElement(Thread.Header, null, thread.name), /* @__PURE__ */ React.createElement("div", {
161
- className: "flex flex-row items-center gap-0.5"
162
- }, thread.status === "staged" && /* @__PURE__ */ React.createElement(Tag, {
163
- palette: "neutral"
164
- }, t("draft button")), onResolve && !(thread?.status === "staged") && /* @__PURE__ */ React.createElement(IconButton, {
165
- "data-testid": "thread.resolve",
166
- variant: "ghost",
167
- icon: thread?.status === "resolved" ? "ph--check--fill" : "ph--check--regular",
168
- iconOnly: true,
169
- label: t("resolve thread label"),
170
- classNames: [
171
- commentControlClassNames,
172
- thread?.status !== "resolved" && hoverableControlItem
173
- ],
174
- onClick: handleResolve
175
- }), onThreadDelete && /* @__PURE__ */ React.createElement(IconButton, {
176
- "data-testid": "thread.delete",
177
- variant: "ghost",
178
- icon: "ph--x--regular",
179
- iconOnly: true,
180
- label: t("delete thread label"),
181
- classNames: [
182
- commentControlClassNames,
183
- hoverableControlItem
184
- ],
185
- onClick: handleThreadDelete
186
- }))), Ref.Array.targets(thread.messages?.filter(isNonNullable) ?? []).map((message) => /* @__PURE__ */ React.createElement(MessageContainer, {
187
- key: message.id,
188
- editable: true,
189
- message,
190
- members,
191
- onDelete: handleMessageDelete
192
- })), /* @__PURE__ */ React.createElement(MessageTextbox, {
193
- extensions,
194
- onSend: handleComment,
195
- ...textboxMetadata
196
- }), /* @__PURE__ */ React.createElement(Thread.Status, {
197
- activity
198
- }, t("activity message")), /* @__PURE__ */ React.createElement("div", {
199
- role: "none",
200
- className: "bs-px -mbs-px",
201
- ref: threadScrollRef
202
- }));
203
- } finally {
204
- _effect.f();
205
- }
206
- };
207
-
208
- // src/components/MessageContainer.tsx
209
- var MessageContainer = ({ message, members, editable = false, onDelete }) => {
210
- var _effect = _useSignals2();
211
- try {
212
- const { t } = useTranslation2(meta.id);
213
- const senderIdentity = members.find((member) => message.sender.identityDid && member.identity.did === message.sender.identityDid || message.sender.identityKey && PublicKey.equals(member.identity.identityKey, message.sender.identityKey))?.identity;
214
- const messageMetadata = getMessageMetadata(message.id, senderIdentity);
215
- const userIsAuthor = useIdentity2()?.did === messageMetadata.authorId;
216
- const [editing, setEditing] = useState2(false);
217
- const handleDelete = useCallback2(() => onDelete?.(message.id), [
218
- message,
219
- onDelete
220
- ]);
221
- const textBlock = message.blocks.find((block) => block._tag === "text");
222
- const references = message.blocks.filter((block) => block._tag === "reference").map((block) => block.reference);
223
- useOnEditAnalytics(message, textBlock, !!editing);
224
- return /* @__PURE__ */ React2.createElement(MessageRoot, {
225
- ...messageMetadata,
226
- classNames: [
227
- hoverableControls2,
228
- hoverableFocusedWithinControls2
229
- ]
230
- }, /* @__PURE__ */ React2.createElement(MessageHeading, {
231
- authorName: messageMetadata.authorName,
232
- timestamp: messageMetadata.timestamp
233
- }, /* @__PURE__ */ React2.createElement("div", {
234
- className: "flex flex-row items-center gap-0.5"
235
- }, userIsAuthor && editable && /* @__PURE__ */ React2.createElement(IconButton2, {
236
- "data-testid": editing ? "thread.message.save" : "thread.message.edit",
237
- variant: "ghost",
238
- icon: editing ? "ph--check--regular" : "ph--pencil-simple--regular",
239
- iconOnly: true,
240
- label: t(editing ? "save message label" : "edit message label"),
241
- classNames: [
242
- commentControlClassNames,
243
- hoverableControlItem2
244
- ],
245
- onClick: () => setEditing((editing2) => !editing2)
246
- }), onDelete && /* @__PURE__ */ React2.createElement(IconButton2, {
247
- "data-testid": "thread.message.delete",
248
- variant: "ghost",
249
- icon: "ph--x--regular",
250
- iconOnly: true,
251
- label: t("delete message label"),
252
- classNames: [
253
- commentControlClassNames,
254
- hoverableControlItem2
255
- ],
256
- onClick: () => handleDelete()
257
- }))), textBlock && /* @__PURE__ */ React2.createElement(TextboxBlock, {
258
- block: textBlock,
259
- isAuthor: userIsAuthor,
260
- editing
261
- }), Ref2.Array.targets(references).map((reference, index) => /* @__PURE__ */ React2.createElement(MessagePart, {
262
- key: index,
263
- part: reference
264
- })));
265
- } finally {
266
- _effect.f();
267
- }
268
- };
269
- var MessagePart = ({ part }) => {
270
- var _effect = _useSignals2();
271
- try {
272
- return /* @__PURE__ */ React2.createElement(MessageBlockObjectTile, {
273
- subject: part
274
- });
275
- } finally {
276
- _effect.f();
277
- }
278
- };
279
- var TextboxBlock = ({ block, isAuthor, editing }) => {
280
- var _effect = _useSignals2();
281
- try {
282
- const { themeMode } = useThemeContext2();
283
- const inMemoryContentRef = useRef2(block.text);
284
- const handleDocumentChange = useCallback2((newState) => {
285
- inMemoryContentRef.current = newState;
286
- }, []);
287
- const saveDocumentChange = useCallback2(() => {
288
- block.text = inMemoryContentRef.current;
289
- }, [
290
- block
291
- ]);
292
- useOnTransition(editing, true, false, saveDocumentChange);
293
- const { parentRef, focusAttributes, view } = useTextEditor(() => ({
294
- initialValue: block.text,
295
- extensions: [
296
- createBasicExtensions2({
297
- readOnly: !isAuthor || !editing
298
- }),
299
- createThemeExtensions2({
300
- themeMode
301
- }),
302
- command,
303
- EditorView.updateListener.of((update) => {
304
- if (update.docChanged) {
305
- handleDocumentChange(update.state.doc.toString());
306
- }
307
- })
308
- ]
309
- }), [
310
- block.text,
311
- editing,
312
- isAuthor,
313
- themeMode,
314
- handleDocumentChange
315
- ]);
316
- useEffect(() => {
317
- editing && view?.focus();
318
- }, [
319
- editing,
320
- view
321
- ]);
322
- return /* @__PURE__ */ React2.createElement("div", {
323
- role: "none",
324
- ref: parentRef,
325
- className: "mie-4",
326
- ...focusAttributes
327
- });
328
- } finally {
329
- _effect.f();
330
- }
331
- };
332
- var MessageBlockObjectTile = /* @__PURE__ */ forwardRef(({ subject }, forwardedRef) => {
333
- var _effect = _useSignals2();
334
- try {
335
- let title = subject.name ?? subject.title ?? subject.type ?? "Object";
336
- if (typeof title !== "string") {
337
- title = title?.content ?? "";
338
- }
339
- return /* @__PURE__ */ React2.createElement("div", {
340
- role: "group",
341
- className: mx3("grid col-span-3 py-1 pr-4", hoverableControls2, hoverableFocusedWithinControls2),
342
- ref: forwardedRef
343
- }, /* @__PURE__ */ React2.createElement(Surface, {
344
- role: "card",
345
- limit: 1,
346
- data: {
347
- subject
348
- },
349
- fallback: title
350
- }));
351
- } finally {
352
- _effect.f();
353
- }
354
- });
355
-
356
- // src/components/ChatContainer.tsx
357
- var ChatHeading = ({ attendableId }) => {
358
- var _effect = _useSignals3();
359
- try {
360
- const { t } = useTranslation3(meta.id);
361
- return /* @__PURE__ */ React3.createElement("div", {
362
- role: "none",
363
- className: "flex items-center"
364
- }, /* @__PURE__ */ React3.createElement(StackItem.SigilButton, {
365
- attendableId
366
- }, /* @__PURE__ */ React3.createElement(Icon, {
367
- icon: "ph--chat--regular",
368
- size: 5
369
- })), /* @__PURE__ */ React3.createElement(StackItem.HeadingLabel, {
370
- attendableId
371
- }, t("chat heading")));
372
- } finally {
373
- _effect.f();
374
- }
375
- };
376
- var ChatContainer = ({ space, thread, context, current, autoFocusTextbox }) => {
377
- var _effect = _useSignals3();
378
- try {
379
- const { t } = useTranslation3(meta.id);
380
- const id = fullyQualifiedId2(thread);
381
- const identity = useIdentity3();
382
- const members = useMembers2(space?.key);
383
- const activity = useStatus(space, id);
384
- const [_count, _setCount] = useState3(0);
385
- const rerenderEditor = () => _setCount((count) => count + 1);
386
- const [autoFocus, setAutoFocus] = useState3(autoFocusTextbox);
387
- const threadScrollRef = useRef3(null);
388
- const { themeMode } = useThemeContext3();
389
- const textboxMetadata = getMessageMetadata(id, identity);
390
- const messageRef = useRef3("");
391
- const extensions = useMemo2(() => [
392
- createBasicExtensions3({
393
- placeholder: t("message placeholder")
394
- }),
395
- createThemeExtensions3({
396
- themeMode
397
- }),
398
- listener2({
399
- onChange: (text) => messageRef.current = text
400
- }),
401
- command
402
- ], [
403
- themeMode,
404
- _count
405
- ]);
406
- const scrollToEnd = (behavior) => setTimeout(() => threadScrollRef.current?.scrollIntoView({
407
- behavior,
408
- block: "end"
409
- }), 10);
410
- useLayoutEffect(() => {
411
- scrollToEnd("instant");
412
- }, []);
413
- const handleCreate = () => {
414
- if (!messageRef.current?.length) {
415
- return false;
416
- }
417
- thread.messages.push(Ref3.make(Obj.make(DataType.Message, {
418
- created: (/* @__PURE__ */ new Date()).toISOString(),
419
- sender: {
420
- identityDid: identity.did
421
- },
422
- blocks: [
423
- {
424
- _tag: "text",
425
- text: messageRef.current
426
- }
427
- ],
428
- properties: context ? {
429
- context: Ref3.make(context)
430
- } : void 0
431
- })));
432
- messageRef.current = "";
433
- setAutoFocus(true);
434
- scrollToEnd("smooth");
435
- rerenderEditor();
436
- return true;
437
- };
438
- return /* @__PURE__ */ React3.createElement(Thread2.Root, {
439
- current,
440
- id,
441
- classNames: "bs-full grid-rows-[1fr_min-content_min-content] overflow-hidden transition-[padding-block-end] [[data-sidebar-inline-start-state=open]_&]:lg:pbe-0"
442
- }, /* @__PURE__ */ React3.createElement(ScrollArea.Root, {
443
- classNames: "col-span-2"
444
- }, /* @__PURE__ */ React3.createElement(ScrollArea.Viewport, {
445
- classNames: "overflow-anchored after:overflow-anchor after:block after:bs-px after:-mbs-px [&>div]:min-bs-full [&>div]:!grid [&>div]:grid-rows-[1fr_0]"
446
- }, /* @__PURE__ */ React3.createElement("div", {
447
- role: "none",
448
- className: mx4(threadLayout, "place-self-end")
449
- }, thread.messages.map((message) => message.target).filter(isNonNullable2).map((message) => /* @__PURE__ */ React3.createElement(MessageContainer, {
450
- key: message.id,
451
- message,
452
- members
453
- }))), /* @__PURE__ */ React3.createElement("div", {
454
- role: "none",
455
- className: "bs-px -mbs-px",
456
- ref: threadScrollRef
457
- }), /* @__PURE__ */ React3.createElement(ScrollArea.Scrollbar, null, /* @__PURE__ */ React3.createElement(ScrollArea.Thumb, null)))), /* @__PURE__ */ React3.createElement(MessageTextbox2, {
458
- extensions,
459
- autoFocus,
460
- onSend: handleCreate,
461
- ...textboxMetadata
462
- }), /* @__PURE__ */ React3.createElement(Thread2.Status, {
463
- activity
464
- }, t("activity message")));
465
- } finally {
466
- _effect.f();
467
- }
468
- };
469
- var ChatContainer_default = ChatContainer;
470
-
471
- export {
472
- CommentsThreadContainer,
473
- ChatHeading,
474
- ChatContainer,
475
- ChatContainer_default
476
- };
477
- //# sourceMappingURL=chunk-J3JO5NWO.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/ChatContainer.tsx", "../../../src/components/command-extension.ts", "../../../src/components/MessageContainer.tsx", "../../../src/components/CommentsThreadContainer.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useLayoutEffect, useMemo, useRef, useState } from 'react';\n\nimport { Obj, Ref } from '@dxos/echo';\nimport { type Space, fullyQualifiedId, useMembers } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { Icon, ScrollArea, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { createBasicExtensions, createThemeExtensions, listener } from '@dxos/react-ui-editor';\nimport { StackItem } from '@dxos/react-ui-stack';\nimport { mx } from '@dxos/react-ui-theme';\nimport {\n MessageTextbox,\n type MessageTextboxProps,\n Thread,\n type ThreadRootProps,\n threadLayout,\n} from '@dxos/react-ui-thread';\nimport { DataType } from '@dxos/schema';\nimport { isNonNullable } from '@dxos/util';\n\nimport { useStatus } from '../hooks';\nimport { meta } from '../meta';\nimport { type ThreadType } from '../types';\nimport { getMessageMetadata } from '../util';\n\nimport { command } from './command-extension';\nimport { MessageContainer } from './MessageContainer';\n\nexport const ChatHeading = ({ attendableId }: { attendableId?: string }) => {\n const { t } = useTranslation(meta.id);\n return (\n <div role='none' className='flex items-center'>\n <StackItem.SigilButton attendableId={attendableId}>\n <Icon icon='ph--chat--regular' size={5} />\n </StackItem.SigilButton>\n <StackItem.HeadingLabel attendableId={attendableId}>{t('chat heading')}</StackItem.HeadingLabel>\n </div>\n );\n};\n\nexport type ChatContainerProps = {\n space: Space;\n thread: ThreadType;\n context?: Obj.Any;\n autoFocusTextbox?: boolean;\n} & Pick<ThreadRootProps, 'current'>;\n\nexport const ChatContainer = ({ space, thread, context, current, autoFocusTextbox }: ChatContainerProps) => {\n const { t } = useTranslation(meta.id);\n const id = fullyQualifiedId(thread);\n const identity = useIdentity()!;\n const members = useMembers(space?.key);\n const activity = useStatus(space, id);\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 [autoFocus, setAutoFocus] = useState(autoFocusTextbox);\n const threadScrollRef = useRef<HTMLDivElement | null>(null);\n const { themeMode } = useThemeContext();\n\n const textboxMetadata = getMessageMetadata(id, identity);\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 [themeMode, _count],\n );\n\n // TODO(thure): Factor out.\n // TODO(thure): `flex-col-reverse` does not work to start the container scrolled to the end while also using\n // `ScrollArea`. This is the least-bad way I found to scroll to the end on mount. Note that 0ms was insufficient\n // for the desired effect; this is likely hardware-dependent and should be reevaluated.\n const scrollToEnd = (behavior: ScrollBehavior) =>\n setTimeout(() => threadScrollRef.current?.scrollIntoView({ behavior, block: 'end' }), 10);\n\n useLayoutEffect(() => {\n scrollToEnd('instant');\n }, []);\n\n // TODO(burdon): Change to model.\n const handleCreate: MessageTextboxProps['onSend'] = () => {\n if (!messageRef.current?.length) {\n return false;\n }\n\n thread.messages.push(\n Ref.make(\n Obj.make(DataType.Message, {\n created: new Date().toISOString(),\n sender: { identityDid: identity.did },\n blocks: [{ _tag: 'text', text: messageRef.current }],\n properties: context ? { context: Ref.make(context) } : undefined,\n }),\n ),\n );\n\n messageRef.current = '';\n setAutoFocus(true);\n scrollToEnd('smooth');\n rerenderEditor();\n return true;\n };\n\n return (\n <Thread.Root\n current={current}\n id={id}\n classNames='bs-full grid-rows-[1fr_min-content_min-content] overflow-hidden transition-[padding-block-end] [[data-sidebar-inline-start-state=open]_&]:lg:pbe-0'\n >\n <ScrollArea.Root classNames='col-span-2'>\n <ScrollArea.Viewport classNames='overflow-anchored after:overflow-anchor after:block after:bs-px after:-mbs-px [&>div]:min-bs-full [&>div]:!grid [&>div]:grid-rows-[1fr_0]'>\n <div role='none' className={mx(threadLayout, 'place-self-end')}>\n {thread.messages\n .map((message) => message.target)\n .filter(isNonNullable)\n .map((message) => (\n <MessageContainer key={message.id} message={message} members={members} />\n ))}\n </div>\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 <ScrollArea.Scrollbar>\n <ScrollArea.Thumb />\n </ScrollArea.Scrollbar>\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n\n <MessageTextbox extensions={extensions} autoFocus={autoFocus} onSend={handleCreate} {...textboxMetadata} />\n\n <Thread.Status activity={activity}>{t('activity message')}</Thread.Status>\n </Thread.Root>\n );\n};\n\nexport default ChatContainer;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { HighlightStyle, StreamLanguage, syntaxHighlighting } from '@codemirror/language';\nimport { type Extension } from '@codemirror/state';\n\nimport { tags } from '@dxos/react-ui-editor';\nimport { mx } from '@dxos/react-ui-theme';\n\n/**\n * https://github.com/codemirror/stream-parser/blob/main/test/test-stream-parser.ts\n */\nconst parser = StreamLanguage.define<{ count: number }>({\n startState: () => ({ count: 0 }),\n token: (stream, state) => {\n state.count++;\n if (stream.eatSpace()) {\n return null;\n }\n if (state.count === 1 && stream.match(/^(\\/\\w+)/)) {\n return 'tagName';\n }\n stream.next();\n return null;\n },\n});\n\nconst styles = HighlightStyle.define([\n { tag: tags.tagName, class: mx('dx-tag dx-tag--indigo text-baseText font-medium') },\n]);\n\nexport const command: Extension = [parser, syntaxHighlighting(styles)];\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { EditorView } from '@codemirror/view';\nimport React, { forwardRef, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { Surface } from '@dxos/app-framework';\nimport { type Obj, Ref, type Type } from '@dxos/echo';\nimport { PublicKey } from '@dxos/react-client';\nimport { type SpaceMember } from '@dxos/react-client/echo';\nimport { type Identity, useIdentity } from '@dxos/react-client/halo';\nimport { IconButton, useOnTransition, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { createBasicExtensions, createThemeExtensions, useTextEditor } from '@dxos/react-ui-editor';\nimport { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/react-ui-theme';\nimport { MessageHeading, MessageRoot } from '@dxos/react-ui-thread';\nimport { type DataType } from '@dxos/schema';\n\nimport { useOnEditAnalytics } from '../hooks';\nimport { meta } from '../meta';\nimport { getMessageMetadata } from '../util';\n\nimport { command } from './command-extension';\nimport { commentControlClassNames } from './CommentsThreadContainer';\n\nexport type MessageContainerProps = {\n message: DataType.Message;\n members: SpaceMember[];\n editable?: boolean;\n onDelete?: (id: string) => void;\n};\n\nexport const MessageContainer = ({ message, members, editable = false, onDelete }: MessageContainerProps) => {\n const { t } = useTranslation(meta.id);\n const senderIdentity = members.find(\n (member) =>\n (message.sender.identityDid && member.identity.did === message.sender.identityDid) ||\n (message.sender.identityKey && PublicKey.equals(member.identity.identityKey, message.sender.identityKey)),\n )?.identity;\n const messageMetadata = getMessageMetadata(message.id, senderIdentity);\n const userIsAuthor = useIdentity()?.did === messageMetadata.authorId;\n const [editing, setEditing] = useState(false);\n const handleDelete = useCallback(() => onDelete?.(message.id), [message, onDelete]);\n const textBlock = message.blocks.find((block) => block._tag === 'text');\n const references = message.blocks.filter((block) => block._tag === 'reference').map((block) => block.reference);\n\n useOnEditAnalytics(message, textBlock, !!editing);\n\n return (\n <MessageRoot {...messageMetadata} classNames={[hoverableControls, hoverableFocusedWithinControls]}>\n <MessageHeading authorName={messageMetadata.authorName} timestamp={messageMetadata.timestamp}>\n <div className='flex flex-row items-center gap-0.5'>\n {userIsAuthor && editable && (\n <IconButton\n data-testid={editing ? 'thread.message.save' : 'thread.message.edit'}\n variant='ghost'\n icon={editing ? 'ph--check--regular' : 'ph--pencil-simple--regular'}\n iconOnly\n label={t(editing ? 'save message label' : 'edit message label')}\n classNames={[commentControlClassNames, hoverableControlItem]}\n onClick={() => setEditing((editing) => !editing)}\n />\n )}\n {onDelete && (\n <IconButton\n data-testid='thread.message.delete'\n variant='ghost'\n icon='ph--x--regular'\n iconOnly\n label={t('delete message label')}\n classNames={[commentControlClassNames, hoverableControlItem]}\n onClick={() => handleDelete()}\n />\n )}\n </div>\n </MessageHeading>\n {textBlock && <TextboxBlock block={textBlock} isAuthor={userIsAuthor} editing={editing} />}\n {Ref.Array.targets(references).map((reference, index) => (\n <MessagePart key={index} part={reference} />\n ))}\n </MessageRoot>\n );\n};\n\nconst MessagePart = ({ part }: { part: Type.Expando }) => {\n return <MessageBlockObjectTile subject={part} />;\n};\n\nconst TextboxBlock = ({\n block,\n isAuthor,\n editing,\n}: {\n block: DataType.MessageBlock.Text;\n editing?: boolean;\n isAuthor?: boolean;\n identity?: Identity;\n}) => {\n const { themeMode } = useThemeContext();\n const inMemoryContentRef = useRef(block.text);\n\n const handleDocumentChange = useCallback((newState: string) => {\n inMemoryContentRef.current = newState;\n }, []);\n\n const saveDocumentChange = useCallback(() => {\n block.text = inMemoryContentRef.current;\n }, [block]);\n\n useOnTransition(editing, true, false, saveDocumentChange);\n\n const { parentRef, focusAttributes, view } = useTextEditor(\n () => ({\n initialValue: block.text,\n extensions: [\n createBasicExtensions({ readOnly: !isAuthor || !editing }),\n createThemeExtensions({ themeMode }),\n command,\n EditorView.updateListener.of((update) => {\n if (update.docChanged) {\n handleDocumentChange(update.state.doc.toString());\n }\n }),\n ],\n }),\n [block.text, editing, isAuthor, themeMode, handleDocumentChange],\n );\n\n useEffect(() => {\n editing && view?.focus();\n }, [editing, view]);\n\n return <div role='none' ref={parentRef} className='mie-4' {...focusAttributes} />;\n};\n\nconst MessageBlockObjectTile = forwardRef<HTMLDivElement, { subject: Obj.Any }>(({ subject }, forwardedRef) => {\n // TODO(burdon): Use annotation to get title.\n let title = (subject as any).name ?? (subject as any).title ?? (subject as any).type ?? 'Object';\n if (typeof title !== 'string') {\n title = title?.content ?? '';\n }\n\n return (\n <div\n role='group'\n className={mx('grid col-span-3 py-1 pr-4', hoverableControls, hoverableFocusedWithinControls)}\n ref={forwardedRef}\n >\n <Surface role='card' limit={1} data={{ subject }} fallback={title} />\n </div>\n );\n});\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\n\nimport { Ref, Relation } from '@dxos/echo';\nimport { fullyQualifiedId, getSpace, useMembers } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { IconButton, Tag, Tooltip, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { createBasicExtensions, createThemeExtensions, listener } from '@dxos/react-ui-editor';\nimport { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/react-ui-theme';\nimport { MessageTextbox, type MessageTextboxProps, Thread, type ThreadRootProps } from '@dxos/react-ui-thread';\nimport { type AnchoredTo } from '@dxos/schema';\nimport { isNonNullable } from '@dxos/util';\n\nimport { useStatus } from '../hooks';\nimport { meta } from '../meta';\nimport { type ThreadType } from '../types';\nimport { getMessageMetadata } from '../util';\n\nimport { command } from './command-extension';\nimport { MessageContainer } from './MessageContainer';\n\n// TODO(burdon): Remove need for p-1.\nexport const commentControlClassNames = '!p-1 transition-opacity';\n\nexport type CommentsThreadContainerProps = {\n anchor: AnchoredTo;\n onAttend?: (anchor: AnchoredTo) => void;\n onComment?: (anchor: AnchoredTo, message: string) => void;\n onResolve?: (anchor: AnchoredTo) => void;\n onMessageDelete?: (anchor: AnchoredTo, messageId: string) => void;\n onThreadDelete?: (anchor: AnchoredTo) => void;\n} & Pick<ThreadRootProps, 'current'>;\n\nexport const CommentsThreadContainer = ({\n anchor,\n current,\n onAttend,\n onComment,\n onResolve,\n onMessageDelete,\n onThreadDelete,\n}: CommentsThreadContainerProps) => {\n const { t } = useTranslation(meta.id);\n const identity = useIdentity()!;\n const space = getSpace(anchor);\n const members = useMembers(space?.key);\n const detached = !anchor.anchor;\n const thread = Relation.getSource(anchor) as ThreadType;\n const activity = useStatus(space, fullyQualifiedId(thread));\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?.(anchor), [onAttend, anchor]);\n const handleResolve = useCallback(() => onResolve?.(anchor), [onResolve, anchor]);\n const handleMessageDelete = useCallback((id: string) => onMessageDelete?.(anchor, id), [onMessageDelete, anchor]);\n const handleThreadDelete = useCallback(() => onThreadDelete?.(anchor), [onThreadDelete, anchor]);\n\n const handleComment: MessageTextboxProps['onSend'] = useCallback(() => {\n if (!messageRef.current) {\n return false;\n }\n\n onComment?.(anchor, messageRef.current);\n messageRef.current = '';\n scrollToEnd('instant');\n rerenderEditor();\n\n return true;\n }, [anchor, identity]);\n\n return (\n <Thread.Root\n id={fullyQualifiedId(thread)}\n classNames='pbs-2 border-be border-subduedSeparator last:border-none'\n current={current}\n onClickCapture={handleAttend}\n onFocusCapture={handleAttend}\n >\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.Trigger asChild content={t('detached thread label')} side='top'>\n <Thread.Header detached>{thread.name}</Thread.Header>\n </Tooltip.Trigger>\n ) : (\n <Thread.Header>{thread.name}</Thread.Header>\n )}\n <div className='flex flex-row items-center gap-0.5'>\n {thread.status === 'staged' && <Tag palette='neutral'>{t('draft button')}</Tag>}\n {onResolve && !(thread?.status === 'staged') && (\n <IconButton\n data-testid='thread.resolve'\n variant='ghost'\n icon={thread?.status === 'resolved' ? 'ph--check--fill' : 'ph--check--regular'}\n iconOnly\n label={t('resolve thread label')}\n classNames={[commentControlClassNames, thread?.status !== 'resolved' && hoverableControlItem]}\n onClick={handleResolve}\n />\n )}\n {onThreadDelete && (\n <IconButton\n data-testid='thread.delete'\n variant='ghost'\n icon='ph--x--regular'\n iconOnly\n label={t('delete thread label')}\n classNames={[commentControlClassNames, hoverableControlItem]}\n onClick={handleThreadDelete}\n />\n )}\n </div>\n </div>\n\n {/** TODO(dmaretskyi): How's `thread.messages` undefined? */}\n {Ref.Array.targets(thread.messages?.filter(isNonNullable) ?? []).map((message) => (\n <MessageContainer\n key={message.id}\n editable\n message={message}\n members={members}\n onDelete={handleMessageDelete}\n />\n ))}\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\n <Thread.Status activity={activity}>{t('activity message')}</Thread.Status>\n\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.Root>\n );\n};\n"],
5
- "mappings": "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",
6
- "names": ["React", "useLayoutEffect", "useMemo", "useRef", "useState", "Obj", "Ref", "fullyQualifiedId", "useMembers", "useIdentity", "Icon", "ScrollArea", "useThemeContext", "useTranslation", "createBasicExtensions", "createThemeExtensions", "listener", "StackItem", "mx", "MessageTextbox", "Thread", "threadLayout", "DataType", "isNonNullable", "HighlightStyle", "StreamLanguage", "syntaxHighlighting", "tags", "mx", "parser", "StreamLanguage", "define", "startState", "count", "token", "stream", "state", "eatSpace", "match", "next", "styles", "HighlightStyle", "tag", "tags", "tagName", "class", "mx", "command", "syntaxHighlighting", "EditorView", "React", "forwardRef", "useCallback", "useEffect", "useRef", "useState", "Surface", "Ref", "PublicKey", "useIdentity", "IconButton", "useOnTransition", "useThemeContext", "useTranslation", "createBasicExtensions", "createThemeExtensions", "useTextEditor", "hoverableControlItem", "hoverableControls", "hoverableFocusedWithinControls", "mx", "MessageHeading", "MessageRoot", "React", "useCallback", "useMemo", "useRef", "useState", "Ref", "Relation", "fullyQualifiedId", "getSpace", "useMembers", "useIdentity", "IconButton", "Tag", "Tooltip", "useThemeContext", "useTranslation", "createBasicExtensions", "createThemeExtensions", "listener", "hoverableControlItem", "hoverableControls", "hoverableFocusedWithinControls", "mx", "MessageTextbox", "Thread", "isNonNullable", "commentControlClassNames", "CommentsThreadContainer", "anchor", "current", "onAttend", "onComment", "onResolve", "onMessageDelete", "onThreadDelete", "t", "useTranslation", "meta", "id", "identity", "useIdentity", "space", "getSpace", "members", "useMembers", "key", "detached", "thread", "Relation", "getSource", "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", "handleThreadDelete", "handleComment", "Thread", "Root", "classNames", "onClickCapture", "onFocusCapture", "div", "role", "className", "mx", "hoverableControls", "hoverableFocusedWithinControls", "Tooltip", "Trigger", "asChild", "content", "side", "Header", "name", "status", "Tag", "palette", "IconButton", "data-testid", "variant", "icon", "iconOnly", "label", "hoverableControlItem", "onClick", "Ref", "Array", "targets", "messages", "filter", "isNonNullable", "map", "message", "MessageContainer", "editable", "onDelete", "MessageTextbox", "onSend", "Status", "ref", "MessageContainer", "message", "members", "editable", "onDelete", "t", "useTranslation", "meta", "id", "senderIdentity", "find", "member", "sender", "identityDid", "identity", "did", "identityKey", "PublicKey", "equals", "messageMetadata", "getMessageMetadata", "userIsAuthor", "useIdentity", "authorId", "editing", "setEditing", "useState", "handleDelete", "useCallback", "textBlock", "blocks", "block", "_tag", "references", "filter", "map", "reference", "useOnEditAnalytics", "React", "MessageRoot", "classNames", "hoverableControls", "hoverableFocusedWithinControls", "MessageHeading", "authorName", "timestamp", "div", "className", "IconButton", "data-testid", "variant", "icon", "iconOnly", "label", "commentControlClassNames", "hoverableControlItem", "onClick", "TextboxBlock", "isAuthor", "Ref", "Array", "targets", "index", "MessagePart", "key", "part", "MessageBlockObjectTile", "subject", "themeMode", "useThemeContext", "inMemoryContentRef", "useRef", "text", "handleDocumentChange", "newState", "current", "saveDocumentChange", "useOnTransition", "parentRef", "focusAttributes", "view", "useTextEditor", "initialValue", "extensions", "createBasicExtensions", "readOnly", "createThemeExtensions", "command", "EditorView", "updateListener", "of", "update", "docChanged", "state", "doc", "toString", "useEffect", "focus", "role", "ref", "forwardRef", "forwardedRef", "title", "name", "type", "content", "mx", "Surface", "limit", "data", "fallback", "ChatHeading", "attendableId", "t", "useTranslation", "meta", "id", "React", "div", "role", "className", "StackItem", "SigilButton", "Icon", "icon", "size", "HeadingLabel", "ChatContainer", "space", "thread", "context", "current", "autoFocusTextbox", "fullyQualifiedId", "identity", "useIdentity", "members", "useMembers", "key", "activity", "useStatus", "_count", "_setCount", "useState", "rerenderEditor", "count", "autoFocus", "setAutoFocus", "threadScrollRef", "useRef", "themeMode", "useThemeContext", "textboxMetadata", "getMessageMetadata", "messageRef", "extensions", "useMemo", "createBasicExtensions", "placeholder", "createThemeExtensions", "listener", "onChange", "text", "command", "scrollToEnd", "behavior", "setTimeout", "scrollIntoView", "block", "useLayoutEffect", "handleCreate", "length", "messages", "push", "Ref", "make", "Obj", "DataType", "Message", "created", "Date", "toISOString", "sender", "identityDid", "did", "blocks", "_tag", "properties", "undefined", "Thread", "Root", "classNames", "ScrollArea", "Viewport", "mx", "threadLayout", "map", "message", "target", "filter", "isNonNullable", "MessageContainer", "ref", "Scrollbar", "Thumb", "MessageTextbox", "onSend", "Status"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/calls/util/stub-media-streams.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n//\n\nimport { scheduleTaskInterval, waitForCondition } from '@dxos/async';\nimport { type Context, cancelWithContext } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\n\n/**\n * Creates a black canvas stream track.\n * We need this to to have black rectangle video that is live (have frames) when video feed is disabled.\n */\nexport const createBlackCanvasStreamTrack = async ({\n ctx,\n width,\n height,\n}: {\n ctx: Context;\n width: number;\n height: number;\n}): Promise<MediaStreamTrack> => {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n\n const canvasCtx = canvas.getContext('2d');\n invariant(canvasCtx);\n const drawFrame = () => {\n canvasCtx.fillStyle = 'black';\n canvasCtx.fillRect(0, 0, canvas.width, canvas.height);\n };\n scheduleTaskInterval(ctx, async () => drawFrame(), 1_000);\n\n const track = canvas.captureStream().getVideoTracks()[0];\n drawFrame();\n\n await cancelWithContext(ctx, waitForCondition({ condition: () => track.readyState === 'live', timeout: 1_000 }));\n\n return track;\n};\n\n/**\n * Creates an inaudible audio stream track.\n * We need this to have audio track available when audio is disabled.\n */\nexport const createInaudibleAudioStreamTrack = async ({ ctx }: { ctx: Context }): Promise<MediaStreamTrack> => {\n const audioContext = new window.AudioContext();\n const oscillator = audioContext.createOscillator();\n oscillator.type = 'triangle';\n // roughly sounds like a box fan\n oscillator.frequency.setValueAtTime(20, audioContext.currentTime);\n\n const gainNode = audioContext.createGain();\n // even w/ gain at 0 some packets are sent\n gainNode.gain.setValueAtTime(0.02, audioContext.currentTime);\n oscillator.connect(gainNode);\n\n const destination = audioContext.createMediaStreamDestination();\n gainNode.connect(destination);\n oscillator.start();\n\n ctx.onDispose(async () => {\n oscillator.disconnect();\n oscillator.stop();\n await audioContext.close();\n });\n\n return destination.stream.getAudioTracks()[0];\n};\n"],
5
- "mappings": ";AAKA,SAASA,sBAAsBC,wBAAwB;AACvD,SAAuBC,yBAAyB;AAChD,SAASC,iBAAiB;;AAMnB,IAAMC,+BAA+B,OAAO,EACjDC,KACAC,OACAC,OAAM,MAKP;AACC,QAAMC,SAASC,SAASC,cAAc,QAAA;AACtCF,SAAOF,QAAQA;AACfE,SAAOD,SAASA;AAEhB,QAAMI,YAAYH,OAAOI,WAAW,IAAA;AACpCT,YAAUQ,WAAAA,QAAAA;;;;;;;;;AACV,QAAME,YAAY,MAAA;AAChBF,cAAUG,YAAY;AACtBH,cAAUI,SAAS,GAAG,GAAGP,OAAOF,OAAOE,OAAOD,MAAM;EACtD;AACAP,uBAAqBK,KAAK,YAAYQ,UAAAA,GAAa,GAAA;AAEnD,QAAMG,QAAQR,OAAOS,cAAa,EAAGC,eAAc,EAAG,CAAA;AACtDL,YAAAA;AAEA,QAAMX,kBAAkBG,KAAKJ,iBAAiB;IAAEkB,WAAW,MAAMH,MAAMI,eAAe;IAAQC,SAAS;EAAM,CAAA,CAAA;AAE7G,SAAOL;AACT;AAMO,IAAMM,kCAAkC,OAAO,EAAEjB,IAAG,MAAoB;AAC7E,QAAMkB,eAAe,IAAIC,OAAOC,aAAY;AAC5C,QAAMC,aAAaH,aAAaI,iBAAgB;AAChDD,aAAWE,OAAO;AAElBF,aAAWG,UAAUC,eAAe,IAAIP,aAAaQ,WAAW;AAEhE,QAAMC,WAAWT,aAAaU,WAAU;AAExCD,WAASE,KAAKJ,eAAe,MAAMP,aAAaQ,WAAW;AAC3DL,aAAWS,QAAQH,QAAAA;AAEnB,QAAMI,cAAcb,aAAac,6BAA4B;AAC7DL,WAASG,QAAQC,WAAAA;AACjBV,aAAWY,MAAK;AAEhBjC,MAAIkC,UAAU,YAAA;AACZb,eAAWc,WAAU;AACrBd,eAAWe,KAAI;AACf,UAAMlB,aAAamB,MAAK;EAC1B,CAAA;AAEA,SAAON,YAAYO,OAAOC,eAAc,EAAG,CAAA;AAC7C;",
6
- "names": ["scheduleTaskInterval", "waitForCondition", "cancelWithContext", "invariant", "createBlackCanvasStreamTrack", "ctx", "width", "height", "canvas", "document", "createElement", "canvasCtx", "getContext", "drawFrame", "fillStyle", "fillRect", "track", "captureStream", "getVideoTracks", "condition", "readyState", "timeout", "createInaudibleAudioStreamTrack", "audioContext", "window", "AudioContext", "oscillator", "createOscillator", "type", "frequency", "setValueAtTime", "currentTime", "gainNode", "createGain", "gain", "connect", "destination", "createMediaStreamDestination", "start", "onDispose", "disconnect", "stop", "close", "stream", "getAudioTracks"]
7
- }