@dxos/plugin-thread 0.8.3 → 0.8.4-main.1068cf700f

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 (462) hide show
  1. package/dist/lib/browser/app-graph-builder-XFGLMIGK.mjs +189 -0
  2. package/dist/lib/browser/app-graph-builder-XFGLMIGK.mjs.map +7 -0
  3. package/dist/lib/browser/blueprint-definition-ACPH22F7.mjs +18 -0
  4. package/dist/lib/browser/blueprint-definition-ACPH22F7.mjs.map +7 -0
  5. package/dist/lib/browser/blueprints/index.mjs +8 -0
  6. package/dist/lib/browser/call-manager-GDGIKJKN.mjs +26 -0
  7. package/dist/lib/browser/call-manager-GDGIKJKN.mjs.map +7 -0
  8. package/dist/lib/browser/chunk-2FIHSX35.mjs +293 -0
  9. package/dist/lib/browser/chunk-2FIHSX35.mjs.map +7 -0
  10. package/dist/lib/browser/chunk-4EUEMHNI.mjs +1817 -0
  11. package/dist/lib/browser/chunk-4EUEMHNI.mjs.map +7 -0
  12. package/dist/lib/browser/{chunk-JKQUJOTX.mjs → chunk-CP7E2HRE.mjs} +3 -3
  13. package/dist/lib/browser/chunk-CP7E2HRE.mjs.map +7 -0
  14. package/dist/lib/browser/{chunk-4H4A264L.mjs → chunk-ERK254BS.mjs} +407 -305
  15. package/dist/lib/browser/chunk-ERK254BS.mjs.map +7 -0
  16. package/dist/lib/browser/chunk-ISCHODBV.mjs +106 -0
  17. package/dist/lib/browser/chunk-ISCHODBV.mjs.map +7 -0
  18. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  19. package/dist/lib/browser/chunk-JBB73URQ.mjs +184 -0
  20. package/dist/lib/browser/chunk-JBB73URQ.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-RH7XTXSR.mjs +106 -0
  22. package/dist/lib/browser/chunk-RH7XTXSR.mjs.map +7 -0
  23. package/dist/lib/browser/index.mjs +164 -151
  24. package/dist/lib/browser/index.mjs.map +4 -4
  25. package/dist/lib/browser/markdown-YJCSOWXX.mjs +210 -0
  26. package/dist/lib/browser/markdown-YJCSOWXX.mjs.map +7 -0
  27. package/dist/lib/browser/meta.json +1 -1
  28. package/dist/lib/browser/operation-resolver-PROCP5L4.mjs +441 -0
  29. package/dist/lib/browser/operation-resolver-PROCP5L4.mjs.map +7 -0
  30. package/dist/lib/browser/react-root-FHK2SVPU.mjs +25 -0
  31. package/dist/lib/browser/react-root-FHK2SVPU.mjs.map +7 -0
  32. package/dist/lib/browser/react-surface-7MQA6VSH.mjs +111 -0
  33. package/dist/lib/browser/react-surface-7MQA6VSH.mjs.map +7 -0
  34. package/dist/lib/browser/repair-6OZ75AUU.mjs +38 -0
  35. package/dist/lib/browser/repair-6OZ75AUU.mjs.map +7 -0
  36. package/dist/lib/browser/settings-TWKOTGSU.mjs +33 -0
  37. package/dist/lib/browser/settings-TWKOTGSU.mjs.map +7 -0
  38. package/dist/lib/browser/state-SJR2GL5G.mjs +24 -0
  39. package/dist/lib/browser/state-SJR2GL5G.mjs.map +7 -0
  40. package/dist/lib/browser/types/index.mjs +10 -12
  41. package/dist/lib/node-esm/app-graph-builder-IN6VLJBO.mjs +190 -0
  42. package/dist/lib/node-esm/app-graph-builder-IN6VLJBO.mjs.map +7 -0
  43. package/dist/lib/node-esm/blueprint-definition-SXVKFUNV.mjs +19 -0
  44. package/dist/lib/node-esm/blueprint-definition-SXVKFUNV.mjs.map +7 -0
  45. package/dist/lib/node-esm/blueprints/index.mjs +9 -0
  46. package/dist/lib/node-esm/call-manager-36UAAQCJ.mjs +27 -0
  47. package/dist/lib/node-esm/call-manager-36UAAQCJ.mjs.map +7 -0
  48. package/dist/lib/node-esm/{chunk-PGRP3O4O.mjs → chunk-ABUFOZVX.mjs} +3 -3
  49. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs.map +7 -0
  50. package/dist/lib/node-esm/chunk-G7PZNN3Z.mjs +185 -0
  51. package/dist/lib/node-esm/chunk-G7PZNN3Z.mjs.map +7 -0
  52. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  53. package/dist/lib/node-esm/chunk-OKVE6CLS.mjs +107 -0
  54. package/dist/lib/node-esm/chunk-OKVE6CLS.mjs.map +7 -0
  55. package/dist/lib/node-esm/{chunk-WXNPD542.mjs → chunk-QP3KQOPQ.mjs} +406 -305
  56. package/dist/lib/node-esm/chunk-QP3KQOPQ.mjs.map +7 -0
  57. package/dist/lib/node-esm/chunk-RBRWHRHE.mjs +1818 -0
  58. package/dist/lib/node-esm/chunk-RBRWHRHE.mjs.map +7 -0
  59. package/dist/lib/node-esm/chunk-VBI32FGI.mjs +108 -0
  60. package/dist/lib/node-esm/chunk-VBI32FGI.mjs.map +7 -0
  61. package/dist/lib/node-esm/chunk-WMWUXWAS.mjs +294 -0
  62. package/dist/lib/node-esm/chunk-WMWUXWAS.mjs.map +7 -0
  63. package/dist/lib/node-esm/index.mjs +164 -151
  64. package/dist/lib/node-esm/index.mjs.map +4 -4
  65. package/dist/lib/node-esm/markdown-6LRP3PAP.mjs +211 -0
  66. package/dist/lib/node-esm/markdown-6LRP3PAP.mjs.map +7 -0
  67. package/dist/lib/node-esm/meta.json +1 -1
  68. package/dist/lib/node-esm/operation-resolver-LPEPV5BF.mjs +442 -0
  69. package/dist/lib/node-esm/operation-resolver-LPEPV5BF.mjs.map +7 -0
  70. package/dist/lib/node-esm/react-root-P5P4VGQJ.mjs +26 -0
  71. package/dist/lib/node-esm/react-root-P5P4VGQJ.mjs.map +7 -0
  72. package/dist/lib/node-esm/react-surface-M7VI5XG2.mjs +112 -0
  73. package/dist/lib/node-esm/react-surface-M7VI5XG2.mjs.map +7 -0
  74. package/dist/lib/node-esm/repair-6777EPOM.mjs +39 -0
  75. package/dist/lib/node-esm/repair-6777EPOM.mjs.map +7 -0
  76. package/dist/lib/node-esm/settings-5O254B3Z.mjs +34 -0
  77. package/dist/lib/node-esm/settings-5O254B3Z.mjs.map +7 -0
  78. package/dist/lib/node-esm/state-5R3TZJQE.mjs +25 -0
  79. package/dist/lib/node-esm/state-5R3TZJQE.mjs.map +7 -0
  80. package/dist/lib/node-esm/types/index.mjs +10 -12
  81. package/dist/types/src/ThreadPlugin.d.ts +2 -1
  82. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  83. package/dist/types/src/blueprints/index.d.ts +2 -0
  84. package/dist/types/src/blueprints/index.d.ts.map +1 -0
  85. package/dist/types/src/blueprints/thread-blueprint.d.ts +21 -0
  86. package/dist/types/src/blueprints/thread-blueprint.d.ts.map +1 -0
  87. package/dist/types/src/calls/call-manager.d.ts +40 -30
  88. package/dist/types/src/calls/call-manager.d.ts.map +1 -1
  89. package/dist/types/src/calls/call-swarm-synchronizer.d.ts +2 -2
  90. package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +1 -1
  91. package/dist/types/src/calls/media-manager.d.ts +2 -2
  92. package/dist/types/src/calls/media-manager.d.ts.map +1 -1
  93. package/dist/types/src/calls/types.d.ts +1 -1
  94. package/dist/types/src/calls/types.d.ts.map +1 -1
  95. package/dist/types/src/calls/util/calls-service.d.ts +9 -4
  96. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
  97. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -1
  98. package/dist/types/src/calls/util/task-scheduling.d.ts +2 -2
  99. package/dist/types/src/calls/util/task-scheduling.d.ts.map +1 -1
  100. package/dist/types/src/calls-service.stories.d.ts +23 -0
  101. package/dist/types/src/calls-service.stories.d.ts.map +1 -0
  102. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +6 -0
  103. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -0
  104. package/dist/types/src/capabilities/app-graph-builder/index.d.ts +3 -0
  105. package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +1 -0
  106. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts +10 -0
  107. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts.map +1 -0
  108. package/dist/types/src/capabilities/blueprint-definition/index.d.ts +3 -0
  109. package/dist/types/src/capabilities/blueprint-definition/index.d.ts.map +1 -0
  110. package/dist/types/src/capabilities/call-manager/call-manager.d.ts +6 -0
  111. package/dist/types/src/capabilities/call-manager/call-manager.d.ts.map +1 -0
  112. package/dist/types/src/capabilities/call-manager/index.d.ts +3 -0
  113. package/dist/types/src/capabilities/call-manager/index.d.ts.map +1 -0
  114. package/dist/types/src/capabilities/index.d.ts +10 -15
  115. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  116. package/dist/types/src/capabilities/markdown/index.d.ts +3 -0
  117. package/dist/types/src/capabilities/markdown/index.d.ts.map +1 -0
  118. package/dist/types/src/capabilities/markdown/markdown.d.ts +5 -0
  119. package/dist/types/src/capabilities/markdown/markdown.d.ts.map +1 -0
  120. package/dist/types/src/capabilities/operation-resolver/index.d.ts +3 -0
  121. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -0
  122. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +5 -0
  123. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -0
  124. package/dist/types/src/capabilities/react-root/index.d.ts +6 -0
  125. package/dist/types/src/capabilities/react-root/index.d.ts.map +1 -0
  126. package/dist/types/src/capabilities/react-root/react-root.d.ts +9 -0
  127. package/dist/types/src/capabilities/react-root/react-root.d.ts.map +1 -0
  128. package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
  129. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
  130. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
  131. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
  132. package/dist/types/src/capabilities/repair/index.d.ts +3 -0
  133. package/dist/types/src/capabilities/repair/index.d.ts.map +1 -0
  134. package/dist/types/src/capabilities/repair/repair.d.ts +6 -0
  135. package/dist/types/src/capabilities/repair/repair.d.ts.map +1 -0
  136. package/dist/types/src/capabilities/settings/index.d.ts +3 -0
  137. package/dist/types/src/capabilities/settings/index.d.ts.map +1 -0
  138. package/dist/types/src/capabilities/settings/settings.d.ts +6 -0
  139. package/dist/types/src/capabilities/settings/settings.d.ts.map +1 -0
  140. package/dist/types/src/capabilities/state/index.d.ts +3 -0
  141. package/dist/types/src/capabilities/state/index.d.ts.map +1 -0
  142. package/dist/types/src/capabilities/state/state.d.ts +7 -0
  143. package/dist/types/src/capabilities/state/state.d.ts.map +1 -0
  144. package/dist/types/src/components/Call/Call.d.ts.map +1 -1
  145. package/dist/types/src/components/Call/Toolbar.d.ts +2 -2
  146. package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
  147. package/dist/types/src/components/CallDebugPanel.d.ts +7 -0
  148. package/dist/types/src/components/CallDebugPanel.d.ts.map +1 -1
  149. package/dist/types/src/components/CallSidebar.d.ts.map +1 -1
  150. package/dist/types/src/components/ChannelContainer.d.ts +5 -6
  151. package/dist/types/src/components/ChannelContainer.d.ts.map +1 -1
  152. package/dist/types/src/components/ChannelContainer.stories.d.ts +159 -5
  153. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +1 -1
  154. package/dist/types/src/components/Chat.stories.d.ts +162 -4
  155. package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
  156. package/dist/types/src/components/ChatContainer.d.ts +8 -7
  157. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  158. package/dist/types/src/components/Comments.stories.d.ts +160 -4
  159. package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
  160. package/dist/types/src/components/CommentsContainer.d.ts +6 -6
  161. package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
  162. package/dist/types/src/components/CommentsThreadContainer.d.ts +14 -0
  163. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +1 -0
  164. package/dist/types/src/components/Lobby/Lobby.d.ts.map +1 -1
  165. package/dist/types/src/components/Media/VideoObject.d.ts +3 -3
  166. package/dist/types/src/components/Media/VideoObject.d.ts.map +1 -1
  167. package/dist/types/src/components/Media/VideoObject.stories.d.ts +18 -4
  168. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
  169. package/dist/types/src/components/MessageContainer.d.ts +7 -3
  170. package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
  171. package/dist/types/src/components/Participant/Participant.d.ts.map +1 -1
  172. package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +1 -1
  173. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +159 -3
  174. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +1 -1
  175. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +161 -4
  176. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  177. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +1 -1
  178. package/dist/types/src/components/ThreadCompanion.d.ts +5 -0
  179. package/dist/types/src/components/ThreadCompanion.d.ts.map +1 -0
  180. package/dist/types/src/components/ThreadSettings.d.ts +4 -2
  181. package/dist/types/src/components/ThreadSettings.d.ts.map +1 -1
  182. package/dist/types/src/components/command-extension.d.ts.map +1 -1
  183. package/dist/types/src/components/index.d.ts +4 -4
  184. package/dist/types/src/components/index.d.ts.map +1 -1
  185. package/dist/types/src/components/testing.d.ts +3 -2
  186. package/dist/types/src/components/testing.d.ts.map +1 -1
  187. package/dist/types/src/extensions/threads.d.ts +8 -3
  188. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  189. package/dist/types/src/functions/create-proposals.d.ts +13 -0
  190. package/dist/types/src/functions/create-proposals.d.ts.map +1 -0
  191. package/dist/types/src/functions/index.d.ts +2 -0
  192. package/dist/types/src/functions/index.d.ts.map +1 -0
  193. package/dist/types/src/hooks/analytics.d.ts +2 -3
  194. package/dist/types/src/hooks/analytics.d.ts.map +1 -1
  195. package/dist/types/src/hooks/index.d.ts +3 -0
  196. package/dist/types/src/hooks/index.d.ts.map +1 -1
  197. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts +2 -0
  198. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts.map +1 -0
  199. package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts +2 -0
  200. package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts.map +1 -0
  201. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +3 -0
  202. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -0
  203. package/dist/types/src/index.d.ts +1 -1
  204. package/dist/types/src/index.d.ts.map +1 -1
  205. package/dist/types/src/meta.d.ts +3 -4
  206. package/dist/types/src/meta.d.ts.map +1 -1
  207. package/dist/types/src/testing/stories.d.ts +2 -1
  208. package/dist/types/src/testing/stories.d.ts.map +1 -1
  209. package/dist/types/src/translations.d.ts +146 -194
  210. package/dist/types/src/translations.d.ts.map +1 -1
  211. package/dist/types/src/types/Channel.d.ts +695 -0
  212. package/dist/types/src/types/Channel.d.ts.map +1 -0
  213. package/dist/types/src/types/capabilities.d.ts +23 -0
  214. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  215. package/dist/types/src/types/index.d.ts +2 -1
  216. package/dist/types/src/types/index.d.ts.map +1 -1
  217. package/dist/types/src/types/types.d.ts +3224 -320
  218. package/dist/types/src/types/types.d.ts.map +1 -1
  219. package/dist/types/src/util.d.ts +17 -2
  220. package/dist/types/src/util.d.ts.map +1 -1
  221. package/dist/types/tsconfig.tsbuildinfo +1 -1
  222. package/package.json +93 -67
  223. package/src/ThreadPlugin.tsx +107 -143
  224. package/src/blueprints/index.ts +5 -0
  225. package/src/blueprints/thread-blueprint.ts +32 -0
  226. package/src/calls/call-manager.ts +78 -50
  227. package/src/calls/call-swarm-synchronizer.ts +3 -3
  228. package/src/calls/media-manager.ts +77 -41
  229. package/src/calls/types.ts +8 -4
  230. package/src/calls/util/calls-service.ts +73 -19
  231. package/src/calls/util/stub-media-streams.ts +63 -9
  232. package/src/calls/util/task-scheduling.ts +4 -4
  233. package/src/calls-service.stories.tsx +229 -0
  234. package/src/capabilities/app-graph-builder/app-graph-builder.ts +202 -0
  235. package/src/capabilities/app-graph-builder/index.ts +7 -0
  236. package/src/capabilities/blueprint-definition/blueprint-definition.ts +24 -0
  237. package/src/capabilities/blueprint-definition/index.ts +7 -0
  238. package/src/capabilities/call-manager/call-manager.ts +26 -0
  239. package/src/capabilities/call-manager/index.ts +7 -0
  240. package/src/capabilities/index.ts +10 -12
  241. package/src/capabilities/markdown/index.ts +7 -0
  242. package/src/capabilities/markdown/markdown.ts +83 -0
  243. package/src/capabilities/operation-resolver/index.ts +7 -0
  244. package/src/capabilities/operation-resolver/operation-resolver.ts +400 -0
  245. package/src/capabilities/react-root/index.ts +7 -0
  246. package/src/capabilities/react-root/react-root.tsx +20 -0
  247. package/src/capabilities/react-surface/index.ts +7 -0
  248. package/src/capabilities/react-surface/react-surface.tsx +98 -0
  249. package/src/capabilities/repair/index.ts +7 -0
  250. package/src/capabilities/repair/repair.ts +51 -0
  251. package/src/capabilities/settings/index.ts +7 -0
  252. package/src/capabilities/settings/settings.ts +34 -0
  253. package/src/capabilities/state/index.ts +7 -0
  254. package/src/capabilities/state/state.ts +22 -0
  255. package/src/components/Call/Call.tsx +11 -6
  256. package/src/components/Call/Toolbar.tsx +42 -33
  257. package/src/components/CallDebugPanel.tsx +114 -57
  258. package/src/components/CallSidebar.tsx +6 -3
  259. package/src/components/ChannelContainer.stories.tsx +23 -21
  260. package/src/components/ChannelContainer.tsx +47 -38
  261. package/src/components/Chat.stories.tsx +37 -39
  262. package/src/components/ChatContainer.tsx +56 -44
  263. package/src/components/Comments.stories.tsx +63 -55
  264. package/src/components/CommentsContainer.tsx +20 -16
  265. package/src/components/CommentsThreadContainer.tsx +173 -0
  266. package/src/components/Lobby/Lobby.tsx +10 -8
  267. package/src/components/Media/AudioStream.tsx +2 -2
  268. package/src/components/Media/VideoObject.stories.tsx +36 -28
  269. package/src/components/Media/VideoObject.tsx +2 -2
  270. package/src/components/MessageContainer.tsx +117 -68
  271. package/src/components/Participant/Participant.tsx +34 -15
  272. package/src/components/Participant/ParticipantGrid.tsx +2 -1
  273. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +9 -9
  274. package/src/components/ResponsiveGrid/ResponsiveContainer.tsx +3 -3
  275. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +45 -43
  276. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +7 -7
  277. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +10 -7
  278. package/src/components/ThreadCompanion.tsx +194 -0
  279. package/src/components/ThreadSettings.tsx +11 -6
  280. package/src/components/command-extension.ts +7 -4
  281. package/src/components/index.ts +5 -8
  282. package/src/components/testing.ts +28 -8
  283. package/src/extensions/threads.ts +88 -44
  284. package/src/functions/create-proposals.ts +57 -0
  285. package/src/functions/index.ts +5 -0
  286. package/src/hooks/analytics.ts +21 -21
  287. package/src/hooks/index.ts +4 -0
  288. package/src/hooks/useBlackCanvasStreamTrack.tsx +27 -0
  289. package/src/hooks/useDebugMode.ts +1 -1
  290. package/src/hooks/useInaudibleAudioStreamTrack.tsx +27 -0
  291. package/src/hooks/useVideoStreamTrack.tsx +36 -0
  292. package/src/index.ts +1 -1
  293. package/src/meta.ts +11 -7
  294. package/src/testing/stories.ts +23 -17
  295. package/src/translations.ts +18 -10
  296. package/src/types/Channel.ts +30 -0
  297. package/src/types/capabilities.ts +34 -0
  298. package/src/types/index.ts +2 -1
  299. package/src/types/types.ts +171 -75
  300. package/src/typings/peermetrics-webrtc-stats.d.ts +17 -1
  301. package/src/typings.d.ts +8 -0
  302. package/src/util.ts +1 -1
  303. package/dist/lib/browser/ChannelContainer-PKFBVENP.mjs +0 -15
  304. package/dist/lib/browser/ChatContainer-RSOKYAMK.mjs +0 -14
  305. package/dist/lib/browser/app-graph-builder-OY7R7EJP.mjs +0 -171
  306. package/dist/lib/browser/app-graph-builder-OY7R7EJP.mjs.map +0 -7
  307. package/dist/lib/browser/call-manager-APQAZWHT.mjs +0 -23
  308. package/dist/lib/browser/call-manager-APQAZWHT.mjs.map +0 -7
  309. package/dist/lib/browser/chunk-4H4A264L.mjs.map +0 -7
  310. package/dist/lib/browser/chunk-5P5BH5GE.mjs +0 -88
  311. package/dist/lib/browser/chunk-5P5BH5GE.mjs.map +0 -7
  312. package/dist/lib/browser/chunk-6NBVNXTM.mjs +0 -21
  313. package/dist/lib/browser/chunk-6NBVNXTM.mjs.map +0 -7
  314. package/dist/lib/browser/chunk-AEXWNS6Z.mjs +0 -128
  315. package/dist/lib/browser/chunk-AEXWNS6Z.mjs.map +0 -7
  316. package/dist/lib/browser/chunk-IIUTBDVB.mjs +0 -17
  317. package/dist/lib/browser/chunk-IIUTBDVB.mjs.map +0 -7
  318. package/dist/lib/browser/chunk-JKQUJOTX.mjs.map +0 -7
  319. package/dist/lib/browser/chunk-PG5CTFKK.mjs +0 -550
  320. package/dist/lib/browser/chunk-PG5CTFKK.mjs.map +0 -7
  321. package/dist/lib/browser/chunk-R5MDLUPC.mjs +0 -18
  322. package/dist/lib/browser/chunk-R5MDLUPC.mjs.map +0 -7
  323. package/dist/lib/browser/chunk-TAFSCSUR.mjs +0 -351
  324. package/dist/lib/browser/chunk-TAFSCSUR.mjs.map +0 -7
  325. package/dist/lib/browser/chunk-XZKBN3NS.mjs +0 -983
  326. package/dist/lib/browser/chunk-XZKBN3NS.mjs.map +0 -7
  327. package/dist/lib/browser/intent-resolver-FK2MDVDT.mjs +0 -353
  328. package/dist/lib/browser/intent-resolver-FK2MDVDT.mjs.map +0 -7
  329. package/dist/lib/browser/markdown-TE5SWWNJ.mjs +0 -169
  330. package/dist/lib/browser/markdown-TE5SWWNJ.mjs.map +0 -7
  331. package/dist/lib/browser/react-root-NK3A4VG7.mjs +0 -27
  332. package/dist/lib/browser/react-root-NK3A4VG7.mjs.map +0 -7
  333. package/dist/lib/browser/react-surface-VXUJKSOG.mjs +0 -108
  334. package/dist/lib/browser/react-surface-VXUJKSOG.mjs.map +0 -7
  335. package/dist/lib/browser/settings-RB2RSLXV.mjs +0 -22
  336. package/dist/lib/browser/settings-RB2RSLXV.mjs.map +0 -7
  337. package/dist/lib/browser/state-RKL5MSDP.mjs +0 -34
  338. package/dist/lib/browser/state-RKL5MSDP.mjs.map +0 -7
  339. package/dist/lib/node/ChannelContainer-YS5YT2ML.cjs +0 -36
  340. package/dist/lib/node/ChannelContainer-YS5YT2ML.cjs.map +0 -7
  341. package/dist/lib/node/ChatContainer-GCOM3M56.cjs +0 -35
  342. package/dist/lib/node/ChatContainer-GCOM3M56.cjs.map +0 -7
  343. package/dist/lib/node/app-graph-builder-PBHJNDQY.cjs +0 -179
  344. package/dist/lib/node/app-graph-builder-PBHJNDQY.cjs.map +0 -7
  345. package/dist/lib/node/call-manager-HV2XJW5O.cjs +0 -37
  346. package/dist/lib/node/call-manager-HV2XJW5O.cjs.map +0 -7
  347. package/dist/lib/node/chunk-44I33JDT.cjs +0 -1731
  348. package/dist/lib/node/chunk-44I33JDT.cjs.map +0 -7
  349. package/dist/lib/node/chunk-4YSNVPWU.cjs +0 -37
  350. package/dist/lib/node/chunk-4YSNVPWU.cjs.map +0 -7
  351. package/dist/lib/node/chunk-E3WBZTTI.cjs +0 -371
  352. package/dist/lib/node/chunk-E3WBZTTI.cjs.map +0 -7
  353. package/dist/lib/node/chunk-ERG7G6FF.cjs +0 -59
  354. package/dist/lib/node/chunk-ERG7G6FF.cjs.map +0 -7
  355. package/dist/lib/node/chunk-FUXJAVFZ.cjs +0 -108
  356. package/dist/lib/node/chunk-FUXJAVFZ.cjs.map +0 -7
  357. package/dist/lib/node/chunk-HLMCEE5K.cjs +0 -41
  358. package/dist/lib/node/chunk-HLMCEE5K.cjs.map +0 -7
  359. package/dist/lib/node/chunk-IP533AMV.cjs +0 -554
  360. package/dist/lib/node/chunk-IP533AMV.cjs.map +0 -7
  361. package/dist/lib/node/chunk-LR5NENBE.cjs +0 -54
  362. package/dist/lib/node/chunk-LR5NENBE.cjs.map +0 -7
  363. package/dist/lib/node/chunk-UM36TPCT.cjs +0 -984
  364. package/dist/lib/node/chunk-UM36TPCT.cjs.map +0 -7
  365. package/dist/lib/node/chunk-ZGDN3XBR.cjs +0 -149
  366. package/dist/lib/node/chunk-ZGDN3XBR.cjs.map +0 -7
  367. package/dist/lib/node/index.cjs +0 -310
  368. package/dist/lib/node/index.cjs.map +0 -7
  369. package/dist/lib/node/intent-resolver-SYSJ5SJG.cjs +0 -363
  370. package/dist/lib/node/intent-resolver-SYSJ5SJG.cjs.map +0 -7
  371. package/dist/lib/node/markdown-GQIPJS2F.cjs +0 -178
  372. package/dist/lib/node/markdown-GQIPJS2F.cjs.map +0 -7
  373. package/dist/lib/node/meta.json +0 -1
  374. package/dist/lib/node/react-root-6HHDMULJ.cjs +0 -51
  375. package/dist/lib/node/react-root-6HHDMULJ.cjs.map +0 -7
  376. package/dist/lib/node/react-surface-NBH42NN2.cjs +0 -122
  377. package/dist/lib/node/react-surface-NBH42NN2.cjs.map +0 -7
  378. package/dist/lib/node/settings-4LQSFEDK.cjs +0 -36
  379. package/dist/lib/node/settings-4LQSFEDK.cjs.map +0 -7
  380. package/dist/lib/node/state-IY5XX3H2.cjs +0 -50
  381. package/dist/lib/node/state-IY5XX3H2.cjs.map +0 -7
  382. package/dist/lib/node/types/index.cjs +0 -38
  383. package/dist/lib/node/types/index.cjs.map +0 -7
  384. package/dist/lib/node-esm/ChannelContainer-O4QJII2P.mjs +0 -16
  385. package/dist/lib/node-esm/ChatContainer-F6CSADV7.mjs +0 -15
  386. package/dist/lib/node-esm/app-graph-builder-BAHBHYWI.mjs +0 -172
  387. package/dist/lib/node-esm/app-graph-builder-BAHBHYWI.mjs.map +0 -7
  388. package/dist/lib/node-esm/call-manager-UUYXLF4T.mjs +0 -24
  389. package/dist/lib/node-esm/call-manager-UUYXLF4T.mjs.map +0 -7
  390. package/dist/lib/node-esm/chunk-2RNIPFDA.mjs +0 -984
  391. package/dist/lib/node-esm/chunk-2RNIPFDA.mjs.map +0 -7
  392. package/dist/lib/node-esm/chunk-ESQC6SYE.mjs +0 -19
  393. package/dist/lib/node-esm/chunk-ESQC6SYE.mjs.map +0 -7
  394. package/dist/lib/node-esm/chunk-K4KAUOKT.mjs +0 -19
  395. package/dist/lib/node-esm/chunk-K4KAUOKT.mjs.map +0 -7
  396. package/dist/lib/node-esm/chunk-O3V45YJP.mjs +0 -90
  397. package/dist/lib/node-esm/chunk-O3V45YJP.mjs.map +0 -7
  398. package/dist/lib/node-esm/chunk-O63QJPQX.mjs +0 -23
  399. package/dist/lib/node-esm/chunk-O63QJPQX.mjs.map +0 -7
  400. package/dist/lib/node-esm/chunk-P6RLFCNT.mjs +0 -352
  401. package/dist/lib/node-esm/chunk-P6RLFCNT.mjs.map +0 -7
  402. package/dist/lib/node-esm/chunk-PGRP3O4O.mjs.map +0 -7
  403. package/dist/lib/node-esm/chunk-UJMPYKT3.mjs +0 -129
  404. package/dist/lib/node-esm/chunk-UJMPYKT3.mjs.map +0 -7
  405. package/dist/lib/node-esm/chunk-UZWVVFT3.mjs +0 -551
  406. package/dist/lib/node-esm/chunk-UZWVVFT3.mjs.map +0 -7
  407. package/dist/lib/node-esm/chunk-WXNPD542.mjs.map +0 -7
  408. package/dist/lib/node-esm/intent-resolver-BU73VYW3.mjs +0 -354
  409. package/dist/lib/node-esm/intent-resolver-BU73VYW3.mjs.map +0 -7
  410. package/dist/lib/node-esm/markdown-HJUWNBLS.mjs +0 -170
  411. package/dist/lib/node-esm/markdown-HJUWNBLS.mjs.map +0 -7
  412. package/dist/lib/node-esm/react-root-RUXOAQNW.mjs +0 -28
  413. package/dist/lib/node-esm/react-root-RUXOAQNW.mjs.map +0 -7
  414. package/dist/lib/node-esm/react-surface-ELXFYKP6.mjs +0 -109
  415. package/dist/lib/node-esm/react-surface-ELXFYKP6.mjs.map +0 -7
  416. package/dist/lib/node-esm/settings-EA7DFSM6.mjs +0 -23
  417. package/dist/lib/node-esm/settings-EA7DFSM6.mjs.map +0 -7
  418. package/dist/lib/node-esm/state-6AUTNROZ.mjs +0 -35
  419. package/dist/lib/node-esm/state-6AUTNROZ.mjs.map +0 -7
  420. package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -4
  421. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
  422. package/dist/types/src/capabilities/call-manager.d.ts +0 -5
  423. package/dist/types/src/capabilities/call-manager.d.ts.map +0 -1
  424. package/dist/types/src/capabilities/capabilities.d.ts +0 -27
  425. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  426. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  427. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  428. package/dist/types/src/capabilities/markdown.d.ts +0 -4
  429. package/dist/types/src/capabilities/markdown.d.ts.map +0 -1
  430. package/dist/types/src/capabilities/react-root.d.ts +0 -7
  431. package/dist/types/src/capabilities/react-root.d.ts.map +0 -1
  432. package/dist/types/src/capabilities/react-surface.d.ts +0 -4
  433. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  434. package/dist/types/src/capabilities/settings.d.ts +0 -4
  435. package/dist/types/src/capabilities/settings.d.ts.map +0 -1
  436. package/dist/types/src/capabilities/state.d.ts +0 -7
  437. package/dist/types/src/capabilities/state.d.ts.map +0 -1
  438. package/dist/types/src/components/CommentContainer.d.ts +0 -13
  439. package/dist/types/src/components/CommentContainer.d.ts.map +0 -1
  440. package/dist/types/src/components/ThreadComplementary.d.ts +0 -5
  441. package/dist/types/src/components/ThreadComplementary.d.ts.map +0 -1
  442. package/dist/types/src/peers.stories.d.ts +0 -11
  443. package/dist/types/src/peers.stories.d.ts.map +0 -1
  444. package/dist/types/src/types/schema.d.ts +0 -133
  445. package/dist/types/src/types/schema.d.ts.map +0 -1
  446. package/src/capabilities/app-graph-builder.ts +0 -180
  447. package/src/capabilities/call-manager.ts +0 -19
  448. package/src/capabilities/capabilities.ts +0 -33
  449. package/src/capabilities/intent-resolver.ts +0 -296
  450. package/src/capabilities/markdown.ts +0 -68
  451. package/src/capabilities/react-root.tsx +0 -17
  452. package/src/capabilities/react-surface.tsx +0 -88
  453. package/src/capabilities/settings.ts +0 -19
  454. package/src/capabilities/state.ts +0 -25
  455. package/src/components/CommentContainer.tsx +0 -198
  456. package/src/components/ThreadComplementary.tsx +0 -151
  457. package/src/peers.stories.tsx +0 -189
  458. package/src/types/schema.ts +0 -33
  459. /package/dist/lib/browser/{ChannelContainer-PKFBVENP.mjs.map → blueprints/index.mjs.map} +0 -0
  460. /package/dist/lib/browser/{ChatContainer-RSOKYAMK.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  461. /package/dist/lib/node-esm/{ChannelContainer-O4QJII2P.mjs.map → blueprints/index.mjs.map} +0 -0
  462. /package/dist/lib/node-esm/{ChatContainer-F6CSADV7.mjs.map → chunk-HSLMI22Q.mjs.map} +0 -0
@@ -4,26 +4,26 @@
4
4
 
5
5
  import React, { useEffect } from 'react';
6
6
 
7
- import { Relation } from '@dxos/echo';
8
- import { fullyQualifiedId } from '@dxos/react-client/echo';
7
+ import { Obj, Relation } from '@dxos/echo';
9
8
  import { Callout, Icon, Trans, useTranslation } from '@dxos/react-ui';
10
- import { type AnchoredTo } from '@dxos/schema';
9
+ import { type AnchoredTo, type Thread } from '@dxos/types';
11
10
 
12
- import { CommentContainer, type CommentContainerProps } from './CommentContainer';
13
- import { THREAD_PLUGIN } from '../meta';
14
- import { type ThreadType } from '../types';
11
+ import { meta } from '../meta';
15
12
 
16
- export type ThreadsContainerProps = Omit<CommentContainerProps, 'anchor' | 'current'> & {
17
- anchors: AnchoredTo[];
13
+ import { CommentsThreadContainer, type CommentsThreadContainerProps } from './CommentsThreadContainer';
14
+
15
+ export type CommentsContainerProps = Omit<CommentsThreadContainerProps, 'anchor' | 'current'> & {
16
+ anchors: AnchoredTo.AnchoredTo[];
18
17
  currentId?: string;
19
18
  showResolvedThreads?: boolean;
20
19
  };
21
20
 
22
21
  /**
23
- * Comment threads.
22
+ * Root container for collection of comment threads.
24
23
  */
25
- export const CommentsContainer = ({ anchors, currentId, showResolvedThreads, ...props }: ThreadsContainerProps) => {
26
- const { t } = useTranslation(THREAD_PLUGIN);
24
+ export const CommentsContainer = ({ anchors, currentId, showResolvedThreads, ...props }: CommentsContainerProps) => {
25
+ const { t } = useTranslation(meta.id);
26
+
27
27
  // TODO(wittjosiah): There seems to be a race between thread and anchor being deleted.
28
28
  const filteredAnchors = showResolvedThreads
29
29
  ? anchors.filter((anchor) => !!Relation.getSource(anchor))
@@ -58,9 +58,13 @@ export const CommentsContainer = ({ anchors, currentId, showResolvedThreads, ...
58
58
  );
59
59
  }
60
60
 
61
- return filteredAnchors.map((anchor) => {
62
- const thread = Relation.getSource(anchor) as ThreadType;
63
- const threadId = fullyQualifiedId(thread);
64
- return <CommentContainer key={threadId} anchor={anchor} current={currentId === threadId} {...props} />;
65
- });
61
+ return (
62
+ <div>
63
+ {filteredAnchors.map((anchor) => {
64
+ const thread = Relation.getSource(anchor) as Thread.Thread;
65
+ const threadId = Obj.getDXN(thread).toString();
66
+ return <CommentsThreadContainer key={threadId} anchor={anchor} current={currentId === threadId} {...props} />;
67
+ })}
68
+ </div>
69
+ );
66
70
  };
@@ -0,0 +1,173 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import React, { useCallback, useMemo, useRef, useState } from 'react';
6
+
7
+ import { Obj, Relation } from '@dxos/echo';
8
+ import { useObject } from '@dxos/echo-react';
9
+ import { getSpace, useMembers } from '@dxos/react-client/echo';
10
+ import { useIdentity } from '@dxos/react-client/halo';
11
+ import { IconButton, Tag, Tooltip, useThemeContext, useTranslation } from '@dxos/react-ui';
12
+ import {
13
+ MessageTextbox,
14
+ type MessageTextboxProps,
15
+ Thread as ThreadComponent,
16
+ type ThreadRootProps,
17
+ } from '@dxos/react-ui-thread';
18
+ import { type AnchoredTo, type Thread } from '@dxos/types';
19
+ import { createBasicExtensions, createThemeExtensions, listener } from '@dxos/ui-editor';
20
+ import { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/ui-theme';
21
+
22
+ import { useStatus } from '../hooks';
23
+ import { meta } from '../meta';
24
+ import { getMessageMetadata } from '../util';
25
+
26
+ import { command } from './command-extension';
27
+ import { MessageContainer, buttonClassNames, buttonGroupClassNames } from './MessageContainer';
28
+
29
+ export type CommentsThreadContainerProps = {
30
+ anchor: AnchoredTo.AnchoredTo;
31
+ onAttend?: (anchor: AnchoredTo.AnchoredTo) => void;
32
+ onComment?: (anchor: AnchoredTo.AnchoredTo, message: string) => void;
33
+ onResolve?: (anchor: AnchoredTo.AnchoredTo) => void;
34
+ onMessageDelete?: (anchor: AnchoredTo.AnchoredTo, messageId: string) => void;
35
+ onThreadDelete?: (anchor: AnchoredTo.AnchoredTo) => void;
36
+ onAcceptProposal?: (anchor: AnchoredTo.AnchoredTo, messageId: string) => void;
37
+ } & Pick<ThreadRootProps, 'current'>;
38
+
39
+ export const CommentsThreadContainer = ({
40
+ anchor,
41
+ current,
42
+ onAttend,
43
+ onComment,
44
+ onResolve,
45
+ onMessageDelete,
46
+ onThreadDelete,
47
+ onAcceptProposal,
48
+ }: CommentsThreadContainerProps) => {
49
+ const { themeMode } = useThemeContext();
50
+ const { t } = useTranslation(meta.id);
51
+ const identity = useIdentity()!;
52
+ const space = getSpace(anchor);
53
+ const members = useMembers(space?.id);
54
+ const detached = !anchor.anchor;
55
+ const thread = Relation.getSource(anchor) as Thread.Thread;
56
+ const [messages] = useObject(thread, 'messages');
57
+ const activity = useStatus(space, Obj.getDXN(thread).toString());
58
+ const threadScrollRef = useRef<HTMLDivElement | null>(null);
59
+
60
+ const textboxMetadata = getMessageMetadata(Obj.getDXN(thread).toString(), identity);
61
+
62
+ // TODO(wittjosiah): This is a hack to reset the editor after a message is sent.
63
+ const [state, setState] = useState({});
64
+ const messageRef = useRef('');
65
+ const extensions = useMemo(
66
+ () => [
67
+ createBasicExtensions({ placeholder: t('message placeholder') }),
68
+ createThemeExtensions({ themeMode }),
69
+ listener({ onChange: ({ text }) => (messageRef.current = text) }),
70
+ command,
71
+ ],
72
+ [state],
73
+ );
74
+
75
+ // TODO(thure): Factor out.
76
+ const scrollToEnd = (behavior: ScrollBehavior) =>
77
+ setTimeout(() => threadScrollRef.current?.scrollIntoView({ behavior, block: 'end' }), 10);
78
+
79
+ const handleAttend = useCallback(() => onAttend?.(anchor), [onAttend, anchor]);
80
+ const handleResolve = useCallback(() => onResolve?.(anchor), [onResolve, anchor]);
81
+ const handleMessageDelete = useCallback((id: string) => onMessageDelete?.(anchor, id), [onMessageDelete, anchor]);
82
+ const handleThreadDelete = useCallback(() => onThreadDelete?.(anchor), [onThreadDelete, anchor]);
83
+ const handleAcceptProposal = useCallback((id: string) => onAcceptProposal?.(anchor, id), [onAcceptProposal, anchor]);
84
+
85
+ const handleComment: MessageTextboxProps['onSend'] = useCallback(() => {
86
+ if (!messageRef.current) {
87
+ return false;
88
+ }
89
+
90
+ onComment?.(anchor, messageRef.current);
91
+ messageRef.current = '';
92
+ scrollToEnd('instant');
93
+ setState({});
94
+
95
+ return true;
96
+ }, [anchor, identity]);
97
+
98
+ return (
99
+ <ThreadComponent.Root
100
+ id={Obj.getDXN(thread).toString()}
101
+ classNames='pbs-2 border-be border-subduedSeparator last:border-none'
102
+ current={current}
103
+ onClickCapture={handleAttend}
104
+ onFocusCapture={handleAttend}
105
+ >
106
+ <div
107
+ role='none'
108
+ className={mx(
109
+ 'col-span-2 grid grid-cols-[var(--rail-size)_1fr_min-content]',
110
+ hoverableControls,
111
+ hoverableFocusedWithinControls,
112
+ )}
113
+ >
114
+ {detached ? (
115
+ <Tooltip.Trigger asChild content={t('detached thread label')} side='top'>
116
+ <ThreadComponent.Header detached>{thread.name}</ThreadComponent.Header>
117
+ </Tooltip.Trigger>
118
+ ) : (
119
+ <ThreadComponent.Header>{thread.name}</ThreadComponent.Header>
120
+ )}
121
+ <div role='none' className={buttonGroupClassNames}>
122
+ {thread.status === 'staged' && <Tag palette='neutral'>{t('draft button')}</Tag>}
123
+ {onResolve && !(thread?.status === 'staged') && (
124
+ <IconButton
125
+ data-testid='thread.resolve'
126
+ variant='ghost'
127
+ icon={thread?.status === 'resolved' ? 'ph--check--fill' : 'ph--check--regular'}
128
+ iconOnly
129
+ label={t('resolve thread label')}
130
+ classNames={[buttonClassNames, thread?.status !== 'resolved' && hoverableControlItem]}
131
+ onClick={handleResolve}
132
+ />
133
+ )}
134
+ {onThreadDelete && (
135
+ <IconButton
136
+ data-testid='thread.delete'
137
+ variant='ghost'
138
+ icon='ph--x--regular'
139
+ iconOnly
140
+ label={t('delete thread label')}
141
+ classNames={[buttonClassNames, hoverableControlItem]}
142
+ onClick={handleThreadDelete}
143
+ />
144
+ )}
145
+ </div>
146
+ </div>
147
+
148
+ {messages?.map((ref) => (
149
+ <MessageContainer
150
+ key={ref.dxn.toString()}
151
+ editable
152
+ message={ref}
153
+ members={members}
154
+ onDelete={handleMessageDelete}
155
+ onAcceptProposal={handleAcceptProposal}
156
+ />
157
+ ))}
158
+
159
+ {/*
160
+ TODO(wittjosiah): Can't autofocus this generally.
161
+ There can be multiple threads with inputs and they can't all be focused.
162
+ Also, it steals focus from documents when first rendered.
163
+ Need to find a way to autofocus in one scenario only: when a new thread is created.
164
+ */}
165
+ <MessageTextbox extensions={extensions} onSend={handleComment} {...textboxMetadata} />
166
+
167
+ <ThreadComponent.Status activity={activity}>{t('activity message')}</ThreadComponent.Status>
168
+
169
+ {/* NOTE(thure): This can’t also be the `overflow-anchor` because `ScrollArea` injects an interceding node that contains this necessary ref’d element. */}
170
+ <div role='none' className='bs-px -mbs-px' ref={threadScrollRef} />
171
+ </ThreadComponent.Root>
172
+ );
173
+ };
@@ -2,14 +2,15 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
+ import { useAtomValue } from '@effect-atom/atom-react';
5
6
  import React, { type FC, type PropsWithChildren, useEffect, useState } from 'react';
6
7
 
7
- import { useCapability } from '@dxos/app-framework';
8
- import { useTranslation, type ThemedClassName } from '@dxos/react-ui';
9
- import { mx } from '@dxos/react-ui-theme';
8
+ import { useCapability } from '@dxos/app-framework/ui';
9
+ import { type ThemedClassName, useTranslation } from '@dxos/react-ui';
10
+ import { mx } from '@dxos/ui-theme';
10
11
 
11
- import { ThreadCapabilities } from '../../capabilities';
12
12
  import { meta } from '../../meta';
13
+ import { ThreadCapabilities } from '../../types';
13
14
  import { Toolbar, type ToolbarProps } from '../Call';
14
15
  import { VideoObject } from '../Media';
15
16
  import { ResponsiveContainer } from '../ResponsiveGrid';
@@ -39,9 +40,10 @@ type LobbyPreviewProps = {};
39
40
  const LobbyPreview: FC<LobbyPreviewProps> = () => {
40
41
  const { t } = useTranslation(meta.id);
41
42
  const call = useCapability(ThreadCapabilities.CallManager);
43
+ const media = useAtomValue(call.mediaAtom);
42
44
  const [classNames, setClassNames] = useState('');
43
45
  useEffect(() => {
44
- if (!call.media.videoEnabled) {
46
+ if (!media.videoEnabled) {
45
47
  setClassNames('');
46
48
  return;
47
49
  }
@@ -52,14 +54,14 @@ const LobbyPreview: FC<LobbyPreviewProps> = () => {
52
54
  }, 500);
53
55
 
54
56
  return () => clearTimeout(timeout);
55
- }, [call.media.videoEnabled]);
57
+ }, [media.videoEnabled]);
56
58
 
57
59
  return (
58
60
  <div className='grid grow p-4'>
59
61
  <ResponsiveContainer>
60
- {(call.media.videoEnabled && (
62
+ {(media.videoEnabled && (
61
63
  <VideoObject
62
- videoStream={call.media.videoStream}
64
+ videoStream={media.videoStream}
63
65
  flip
64
66
  muted
65
67
  classNames={mx(
@@ -46,13 +46,13 @@ export const AudioStream: FC<AudioStreamProps> = ({ tracks }) => {
46
46
  );
47
47
  };
48
48
 
49
- type AudioTrackProps = {
49
+ type AudioTrackParams = {
50
50
  track: MediaStreamTrack;
51
51
  mediaStream: MediaStream;
52
52
  resetSrcObject: () => void;
53
53
  };
54
54
 
55
- const AudioTrack = ({ track, mediaStream, resetSrcObject }: AudioTrackProps) => {
55
+ const AudioTrack = ({ track, mediaStream, resetSrcObject }: AudioTrackParams) => {
56
56
  useEffect(() => {
57
57
  const currentTrack = track;
58
58
  mediaStream.addTrack(currentTrack);
@@ -2,47 +2,55 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
- import { type StoryObj, type Meta } from '@storybook/react';
5
+ import { type StoryObj } from '@storybook/react-vite';
8
6
  import React, { useEffect, useState } from 'react';
9
7
 
10
8
  import { scheduleTask } from '@dxos/async';
11
9
  import { Context } from '@dxos/context';
12
10
  import { log } from '@dxos/log';
13
- import { withTheme, withLayout } from '@dxos/storybook-utils';
11
+ import { withTheme } from '@dxos/react-ui/testing';
14
12
 
15
- import { VideoObject } from './VideoObject';
16
13
  import { getUserMediaTrack } from '../../calls';
17
14
  import { ResponsiveContainer } from '../ResponsiveGrid';
18
15
 
19
- const meta: Meta<typeof VideoObject> = {
20
- title: 'plugins/plugin-thread/VideoObject',
21
- component: VideoObject,
22
- render: (args) => {
23
- log.info('render');
24
- const [videoStream, setVideoStream] = useState<MediaStream>();
25
- useEffect(() => {
26
- const ctx = new Context();
27
- scheduleTask(ctx, async () => {
16
+ import { VideoObject, type VideoObjectProps } from './VideoObject';
17
+
18
+ const DefaultStory = (props: VideoObjectProps) => {
19
+ log.info('render');
20
+ const [videoStream, setVideoStream] = useState<MediaStream>();
21
+ useEffect(() => {
22
+ const ctx = new Context();
23
+ scheduleTask(ctx, async () => {
24
+ try {
28
25
  const stream = new MediaStream();
29
26
  stream.addTrack(await getUserMediaTrack('videoinput'));
30
27
  setVideoStream(stream);
31
- });
32
-
33
- return () => {
34
- void ctx.dispose();
35
- videoStream?.getTracks().forEach((track) => track.stop());
36
- };
37
- }, []);
38
-
39
- return (
40
- <ResponsiveContainer>
41
- <VideoObject videoStream={videoStream} {...args} flip />
42
- </ResponsiveContainer>
43
- );
28
+ } catch (err) {
29
+ log.catch(err);
30
+ }
31
+ });
32
+
33
+ return () => {
34
+ void ctx.dispose();
35
+ videoStream?.getTracks().forEach((track) => track.stop());
36
+ };
37
+ }, []);
38
+
39
+ return (
40
+ <ResponsiveContainer>
41
+ <VideoObject videoStream={videoStream} flip {...props} />
42
+ </ResponsiveContainer>
43
+ );
44
+ };
45
+
46
+ const meta = {
47
+ title: 'plugins/plugin-thread/VideoObject',
48
+ component: VideoObject,
49
+ render: DefaultStory,
50
+ decorators: [withTheme()],
51
+ parameters: {
52
+ layout: 'fullscreen',
44
53
  },
45
- decorators: [withTheme, withLayout({ fullscreen: true, classNames: 'justify-center' })],
46
54
  };
47
55
 
48
56
  export default meta;
@@ -5,7 +5,7 @@
5
5
  import React, { type JSX, forwardRef, memo, useEffect, useRef } from 'react';
6
6
 
7
7
  import { type ThemedClassName } from '@dxos/react-ui';
8
- import { mx } from '@dxos/react-ui-theme';
8
+ import { mx } from '@dxos/ui-theme';
9
9
 
10
10
  export type VideoObjectProps = Omit<JSX.IntrinsicElements['video'], 'className' | 'ref'> &
11
11
  ThemedClassName<{
@@ -32,7 +32,7 @@ export const VideoObject = memo(
32
32
  return (
33
33
  <video
34
34
  className={mx(
35
- 'w-full aspect-video',
35
+ 'is-full aspect-video',
36
36
  flip && 'scale-x-[-1]',
37
37
  contain ? 'object-contain' : 'object-cover',
38
38
  classNames,
@@ -3,101 +3,141 @@
3
3
  //
4
4
 
5
5
  import { EditorView } from '@codemirror/view';
6
- import { Check, PencilSimple, X } from '@phosphor-icons/react';
7
6
  import React, { forwardRef, useCallback, useEffect, useRef, useState } from 'react';
8
7
 
9
- import { Surface } from '@dxos/app-framework';
10
- import { type Obj, type Type } from '@dxos/echo';
11
- import { RefArray } from '@dxos/live-object';
8
+ import { Surface } from '@dxos/app-framework/ui';
9
+ import { type Obj, Ref } from '@dxos/echo';
10
+ import { useObject } from '@dxos/echo-react';
12
11
  import { PublicKey } from '@dxos/react-client';
13
12
  import { type SpaceMember } from '@dxos/react-client/echo';
14
- import { useIdentity, type Identity } from '@dxos/react-client/halo';
15
- import { Button, ButtonGroup, Tooltip, useOnTransition, useThemeContext, useTranslation } from '@dxos/react-ui';
16
- import { createBasicExtensions, createThemeExtensions, useTextEditor } from '@dxos/react-ui-editor';
17
- import {
18
- getSize,
19
- hoverableControlItem,
20
- hoverableControls,
21
- hoverableFocusedWithinControls,
22
- mx,
23
- } from '@dxos/react-ui-theme';
13
+ import { type Identity, useIdentity } from '@dxos/react-client/halo';
14
+ import { IconButton, useOnTransition, useThemeContext, useTranslation } from '@dxos/react-ui';
15
+ import { useTextEditor } from '@dxos/react-ui-editor';
16
+ import { Card } from '@dxos/react-ui-mosaic';
24
17
  import { MessageHeading, MessageRoot } from '@dxos/react-ui-thread';
25
- import { type DataType } from '@dxos/schema';
18
+ import { type ContentBlock, type Message } from '@dxos/types';
19
+ import { createBasicExtensions, createThemeExtensions } from '@dxos/ui-editor';
20
+ import { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/ui-theme';
26
21
 
27
- import { command } from './command-extension';
28
22
  import { useOnEditAnalytics } from '../hooks';
29
- import { THREAD_PLUGIN } from '../meta';
23
+ import { meta } from '../meta';
30
24
  import { getMessageMetadata } from '../util';
31
25
 
32
- // TODO(thure): #8149
33
- const messageControlClassNames = ['!p-1 !min-bs-0 transition-opacity', hoverableControlItem];
26
+ import { command } from './command-extension';
27
+
28
+ export const buttonGroupClassNames = 'flex flex-row items-center gap-0.5 pie-2';
29
+ export const buttonClassNames = '!p-1 transition-opacity';
34
30
 
35
31
  export type MessageContainerProps = {
36
- message: DataType.Message;
32
+ message: Obj.Obj<Message.Message> | Ref.Ref<Obj.Obj<Message.Message>>;
37
33
  members: SpaceMember[];
38
34
  editable?: boolean;
39
35
  onDelete?: (id: string) => void;
36
+ onAcceptProposal?: (id: string) => void;
40
37
  };
41
38
 
42
- export const MessageContainer = ({ message, members, editable = false, onDelete }: MessageContainerProps) => {
39
+ export const MessageContainer = ({
40
+ message: messageOrRef,
41
+ members,
42
+ editable = false,
43
+ onDelete,
44
+ onAcceptProposal,
45
+ }: MessageContainerProps) => {
46
+ const { t } = useTranslation(meta.id);
47
+ const [message, updateMessage] = useObject(messageOrRef);
48
+ const identity = useIdentity();
49
+ const [editing, setEditing] = useState(false);
50
+
51
+ const textBlockIndex = message?.blocks.findIndex((block) => block._tag === 'text') ?? -1;
52
+
53
+ const handleEdit = useCallback(() => setEditing((editing) => !editing), []);
54
+ const handleDelete = useCallback(() => message && onDelete?.(message.id), [message, onDelete]);
55
+ const handleAcceptProposal = useCallback(
56
+ () => message && onAcceptProposal?.(message.id),
57
+ [message, onAcceptProposal],
58
+ );
59
+ const handleTextBlockChange = useCallback(
60
+ (newText: string) => {
61
+ updateMessage((m) => {
62
+ const targetBlock = m.blocks[textBlockIndex];
63
+ if (targetBlock && targetBlock._tag === 'text') {
64
+ targetBlock.text = newText;
65
+ }
66
+ });
67
+ },
68
+ [updateMessage, textBlockIndex],
69
+ );
70
+
71
+ const textBlock =
72
+ message && textBlockIndex !== -1 ? (message.blocks[textBlockIndex] as ContentBlock.Text) : undefined;
73
+ useOnEditAnalytics(message, textBlock, !!editing);
74
+
75
+ if (!message) {
76
+ return null;
77
+ }
78
+
43
79
  const senderIdentity = members.find(
44
80
  (member) =>
45
81
  (message.sender.identityDid && member.identity.did === message.sender.identityDid) ||
46
82
  (message.sender.identityKey && PublicKey.equals(member.identity.identityKey, message.sender.identityKey)),
47
83
  )?.identity;
48
84
  const messageMetadata = getMessageMetadata(message.id, senderIdentity);
49
- const userIsAuthor = useIdentity()?.did === messageMetadata.authorId;
50
- const [editing, setEditing] = useState(false);
51
- const handleDelete = useCallback(() => onDelete?.(message.id), [message, onDelete]);
52
- const { t } = useTranslation(THREAD_PLUGIN);
53
- const editLabel = t(editing ? 'save message label' : 'edit message label');
54
- const deleteLabel = t('delete message label');
55
- const textBlock = message.blocks.find((block) => block.type === 'text');
56
- const references = message.blocks.filter((block) => block.type === 'reference').map((block) => block.reference);
57
-
58
- useOnEditAnalytics(message, textBlock, !!editing);
85
+ const userIsAuthor = identity?.did === messageMetadata.authorId;
86
+ const proposalBlock = message.blocks.find((block) => block._tag === 'proposal');
87
+ const references = message.blocks.filter((block) => block._tag === 'reference').map((block) => block.reference);
59
88
 
60
89
  return (
61
90
  <MessageRoot {...messageMetadata} classNames={[hoverableControls, hoverableFocusedWithinControls]}>
62
91
  <MessageHeading authorName={messageMetadata.authorName} timestamp={messageMetadata.timestamp}>
63
- <ButtonGroup classNames='mie-1'>
92
+ <div role='none' className={buttonGroupClassNames}>
64
93
  {userIsAuthor && editable && (
65
- <Tooltip.Trigger asChild content={editLabel}>
66
- <Button
67
- variant='ghost'
68
- data-testid={editing ? 'thread.message.save' : 'thread.message.edit'}
69
- classNames={messageControlClassNames}
70
- onClick={() => setEditing((editing) => !editing)}
71
- >
72
- <span className='sr-only'>{editLabel}</span>
73
- {editing ? <Check className={getSize(4)} /> : <PencilSimple className={getSize(4)} />}
74
- </Button>
75
- </Tooltip.Trigger>
94
+ <IconButton
95
+ data-testid={editing ? 'thread.message.save' : 'thread.message.edit'}
96
+ variant='ghost'
97
+ icon={editing ? 'ph--check--regular' : 'ph--pencil-simple--regular'}
98
+ iconOnly
99
+ label={t(editing ? 'save message label' : 'edit message label')}
100
+ classNames={[buttonClassNames, hoverableControlItem]}
101
+ onClick={handleEdit}
102
+ />
103
+ )}
104
+ {/* TODO(wittjosiah): Proposal controls should probably be hoisted to thread level. */}
105
+ {proposalBlock && onAcceptProposal && (
106
+ <IconButton
107
+ data-testid='thread.message.accept'
108
+ variant='ghost'
109
+ icon='ph--check--regular'
110
+ iconOnly
111
+ label={t('accept proposal label')}
112
+ classNames={[buttonClassNames, hoverableControlItem]}
113
+ onClick={handleAcceptProposal}
114
+ />
76
115
  )}
77
116
  {onDelete && (
78
- <Tooltip.Trigger asChild content={deleteLabel}>
79
- <Button
80
- variant='ghost'
81
- data-testid='thread.message.delete'
82
- classNames={messageControlClassNames}
83
- onClick={() => handleDelete()}
84
- >
85
- <span className='sr-only'>{deleteLabel}</span>
86
- <X className={getSize(4)} />
87
- </Button>
88
- </Tooltip.Trigger>
117
+ <IconButton
118
+ data-testid='thread.message.delete'
119
+ variant='ghost'
120
+ icon='ph--x--regular'
121
+ iconOnly
122
+ label={t('delete message label')}
123
+ classNames={[buttonClassNames, hoverableControlItem]}
124
+ onClick={handleDelete}
125
+ />
89
126
  )}
90
- </ButtonGroup>
127
+ </div>
91
128
  </MessageHeading>
92
- {textBlock && <TextboxBlock block={textBlock} isAuthor={userIsAuthor} editing={editing} />}
93
- {RefArray.targets(references).map((reference, index) => (
94
- <MessagePart key={index} part={reference} />
129
+ {textBlock && (
130
+ <TextboxBlock block={textBlock} isAuthor={userIsAuthor} editing={editing} onSave={handleTextBlockChange} />
131
+ )}
132
+ {proposalBlock && <ProposalBlock block={proposalBlock} />}
133
+ {Ref.Array.targets(references).map((reference, index) => (
134
+ <MessagePart key={index} part={reference as Obj.Unknown} />
95
135
  ))}
96
136
  </MessageRoot>
97
137
  );
98
138
  };
99
139
 
100
- const MessagePart = ({ part }: { part: Type.Expando }) => {
140
+ const MessagePart = ({ part }: { part: Obj.Unknown }) => {
101
141
  return <MessageBlockObjectTile subject={part} />;
102
142
  };
103
143
 
@@ -105,11 +145,13 @@ const TextboxBlock = ({
105
145
  block,
106
146
  isAuthor,
107
147
  editing,
148
+ onSave,
108
149
  }: {
109
- block: DataType.MessageBlock.Text;
150
+ block: ContentBlock.Text;
110
151
  editing?: boolean;
111
152
  isAuthor?: boolean;
112
153
  identity?: Identity;
154
+ onSave?: (newText: string) => void;
113
155
  }) => {
114
156
  const { themeMode } = useThemeContext();
115
157
  const inMemoryContentRef = useRef(block.text);
@@ -119,8 +161,8 @@ const TextboxBlock = ({
119
161
  }, []);
120
162
 
121
163
  const saveDocumentChange = useCallback(() => {
122
- block.text = inMemoryContentRef.current;
123
- }, [block]);
164
+ onSave?.(inMemoryContentRef.current);
165
+ }, [onSave]);
124
166
 
125
167
  useOnTransition(editing, true, false, saveDocumentChange);
126
168
 
@@ -148,7 +190,15 @@ const TextboxBlock = ({
148
190
  return <div role='none' ref={parentRef} className='mie-4' {...focusAttributes} />;
149
191
  };
150
192
 
151
- const MessageBlockObjectTile = forwardRef<HTMLDivElement, { subject: Obj.Any }>(({ subject }, forwardedRef) => {
193
+ const ProposalBlock = ({ block }: { block: ContentBlock.Proposal }) => {
194
+ return (
195
+ <div role='none' className='mie-4 italic'>
196
+ {block.text}
197
+ </div>
198
+ );
199
+ };
200
+
201
+ const MessageBlockObjectTile = forwardRef<HTMLDivElement, { subject: Obj.Unknown }>(({ subject }, forwardedRef) => {
152
202
  // TODO(burdon): Use annotation to get title.
153
203
  let title = (subject as any).name ?? (subject as any).title ?? (subject as any).type ?? 'Object';
154
204
  if (typeof title !== 'string') {
@@ -156,12 +206,11 @@ const MessageBlockObjectTile = forwardRef<HTMLDivElement, { subject: Obj.Any }>(
156
206
  }
157
207
 
158
208
  return (
159
- <div
160
- role='group'
161
- className={mx('grid col-span-3 py-1 pr-4', hoverableControls, hoverableFocusedWithinControls)}
209
+ <Card.Root
210
+ className={mx('grid col-span-3 plb-1 pr-4', hoverableControls, hoverableFocusedWithinControls)}
162
211
  ref={forwardedRef}
163
212
  >
164
- <Surface role='card' limit={1} data={{ subject }} fallback={title} />
165
- </div>
213
+ <Surface.Surface role='card-content' limit={1} data={{ subject }} fallback={title} />
214
+ </Card.Root>
166
215
  );
167
216
  });