@dxos/plugin-thread 0.8.4-main.406dc2a → 0.8.4-main.422d1c7879

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 (463) hide show
  1. package/dist/lib/browser/add-message-VPPFFLFL.mjs +97 -0
  2. package/dist/lib/browser/add-message-VPPFFLFL.mjs.map +7 -0
  3. package/dist/lib/browser/blueprints/index.mjs +37 -0
  4. package/dist/lib/browser/blueprints/index.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  6. package/dist/lib/browser/chunk-MESW3R4Q.mjs +61 -0
  7. package/dist/lib/browser/chunk-MESW3R4Q.mjs.map +7 -0
  8. package/dist/lib/browser/chunk-VPM44Z35.mjs +259 -0
  9. package/dist/lib/browser/chunk-VPM44Z35.mjs.map +7 -0
  10. package/dist/lib/browser/create-UGT7V733.mjs +55 -0
  11. package/dist/lib/browser/create-UGT7V733.mjs.map +7 -0
  12. package/dist/lib/browser/create-channel-EF67LCS6.mjs +21 -0
  13. package/dist/lib/browser/create-channel-EF67LCS6.mjs.map +7 -0
  14. package/dist/lib/browser/create-channel-thread-CCZTSWQ6.mjs +28 -0
  15. package/dist/lib/browser/create-channel-thread-CCZTSWQ6.mjs.map +7 -0
  16. package/dist/lib/browser/create-proposals-CMK7S7VS.mjs +57 -0
  17. package/dist/lib/browser/create-proposals-CMK7S7VS.mjs.map +7 -0
  18. package/dist/lib/browser/delete-FSFVU6ZA.mjs +59 -0
  19. package/dist/lib/browser/delete-FSFVU6ZA.mjs.map +7 -0
  20. package/dist/lib/browser/delete-message-XL5M5J33.mjs +64 -0
  21. package/dist/lib/browser/delete-message-XL5M5J33.mjs.map +7 -0
  22. package/dist/lib/browser/index.mjs +2251 -228
  23. package/dist/lib/browser/index.mjs.map +4 -4
  24. package/dist/lib/browser/meta.json +1 -1
  25. package/dist/lib/browser/on-create-space-VYS2JGVT.mjs +25 -0
  26. package/dist/lib/browser/on-create-space-VYS2JGVT.mjs.map +7 -0
  27. package/dist/lib/browser/operations/index.mjs +14 -0
  28. package/dist/lib/browser/operations/index.mjs.map +7 -0
  29. package/dist/lib/browser/restore-2ZGMKUSD.mjs +33 -0
  30. package/dist/lib/browser/restore-2ZGMKUSD.mjs.map +7 -0
  31. package/dist/lib/browser/restore-message-OYEGWPII.mjs +42 -0
  32. package/dist/lib/browser/restore-message-OYEGWPII.mjs.map +7 -0
  33. package/dist/lib/browser/select-VG2XLULE.mjs +26 -0
  34. package/dist/lib/browser/select-VG2XLULE.mjs.map +7 -0
  35. package/dist/lib/browser/toggle-resolved-MM6YC5BU.mjs +45 -0
  36. package/dist/lib/browser/toggle-resolved-MM6YC5BU.mjs.map +7 -0
  37. package/dist/lib/browser/types/index.mjs +8 -12
  38. package/dist/lib/node-esm/add-message-XWKHLNS6.mjs +98 -0
  39. package/dist/lib/node-esm/add-message-XWKHLNS6.mjs.map +7 -0
  40. package/dist/lib/node-esm/blueprints/index.mjs +38 -0
  41. package/dist/lib/node-esm/blueprints/index.mjs.map +7 -0
  42. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  43. package/dist/lib/node-esm/chunk-JTHXNWKJ.mjs +260 -0
  44. package/dist/lib/node-esm/chunk-JTHXNWKJ.mjs.map +7 -0
  45. package/dist/lib/node-esm/chunk-SDRAQNSQ.mjs +62 -0
  46. package/dist/lib/node-esm/chunk-SDRAQNSQ.mjs.map +7 -0
  47. package/dist/lib/node-esm/create-XAYNDVU2.mjs +56 -0
  48. package/dist/lib/node-esm/create-XAYNDVU2.mjs.map +7 -0
  49. package/dist/lib/node-esm/create-channel-UYWUNB3L.mjs +22 -0
  50. package/dist/lib/node-esm/create-channel-UYWUNB3L.mjs.map +7 -0
  51. package/dist/lib/node-esm/create-channel-thread-UQF2SBHS.mjs +29 -0
  52. package/dist/lib/node-esm/create-channel-thread-UQF2SBHS.mjs.map +7 -0
  53. package/dist/lib/node-esm/create-proposals-5FJNURKH.mjs +58 -0
  54. package/dist/lib/node-esm/create-proposals-5FJNURKH.mjs.map +7 -0
  55. package/dist/lib/node-esm/delete-WRODXR3E.mjs +60 -0
  56. package/dist/lib/node-esm/delete-WRODXR3E.mjs.map +7 -0
  57. package/dist/lib/node-esm/delete-message-TAHCYTW2.mjs +65 -0
  58. package/dist/lib/node-esm/delete-message-TAHCYTW2.mjs.map +7 -0
  59. package/dist/lib/node-esm/index.mjs +2251 -228
  60. package/dist/lib/node-esm/index.mjs.map +4 -4
  61. package/dist/lib/node-esm/meta.json +1 -1
  62. package/dist/lib/node-esm/on-create-space-XDY2YXPV.mjs +26 -0
  63. package/dist/lib/node-esm/on-create-space-XDY2YXPV.mjs.map +7 -0
  64. package/dist/lib/node-esm/operations/index.mjs +15 -0
  65. package/dist/lib/node-esm/operations/index.mjs.map +7 -0
  66. package/dist/lib/node-esm/restore-T3QA7TSL.mjs +34 -0
  67. package/dist/lib/node-esm/restore-T3QA7TSL.mjs.map +7 -0
  68. package/dist/lib/node-esm/restore-message-WFTEVBEV.mjs +43 -0
  69. package/dist/lib/node-esm/restore-message-WFTEVBEV.mjs.map +7 -0
  70. package/dist/lib/node-esm/select-Q4UDWJJF.mjs +27 -0
  71. package/dist/lib/node-esm/select-Q4UDWJJF.mjs.map +7 -0
  72. package/dist/lib/node-esm/toggle-resolved-33XTAK2H.mjs +46 -0
  73. package/dist/lib/node-esm/toggle-resolved-33XTAK2H.mjs.map +7 -0
  74. package/dist/lib/node-esm/types/index.mjs +8 -12
  75. package/dist/types/src/ThreadPlugin.d.ts +2 -1
  76. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  77. package/dist/types/src/blueprints/index.d.ts +2 -0
  78. package/dist/types/src/blueprints/index.d.ts.map +1 -0
  79. package/dist/types/src/blueprints/thread-blueprint.d.ts +4 -0
  80. package/dist/types/src/blueprints/thread-blueprint.d.ts.map +1 -0
  81. package/dist/types/src/calls/call-manager.d.ts +40 -30
  82. package/dist/types/src/calls/call-manager.d.ts.map +1 -1
  83. package/dist/types/src/calls/call-swarm-synchronizer.d.ts +2 -2
  84. package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +1 -1
  85. package/dist/types/src/calls/media-manager.d.ts +1 -1
  86. package/dist/types/src/calls/media-manager.d.ts.map +1 -1
  87. package/dist/types/src/calls/util/calls-service.d.ts +1 -1
  88. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
  89. package/dist/types/src/calls/util/task-scheduling.d.ts +2 -2
  90. package/dist/types/src/calls/util/task-scheduling.d.ts.map +1 -1
  91. package/dist/types/src/calls-service.stories.d.ts +2 -2
  92. package/dist/types/src/calls-service.stories.d.ts.map +1 -1
  93. package/dist/types/src/capabilities/app-graph-builder.d.ts +4 -2
  94. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  95. package/dist/types/src/capabilities/blueprint-definition.d.ts +6 -0
  96. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  97. package/dist/types/src/capabilities/call-manager.d.ts +3 -2
  98. package/dist/types/src/capabilities/call-manager.d.ts.map +1 -1
  99. package/dist/types/src/capabilities/index.d.ts +13 -14
  100. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  101. package/dist/types/src/capabilities/markdown.d.ts +3 -2
  102. package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
  103. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  104. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  105. package/dist/types/src/capabilities/react-root.d.ts +4 -2
  106. package/dist/types/src/capabilities/react-root.d.ts.map +1 -1
  107. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  108. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  109. package/dist/types/src/capabilities/settings.d.ts +5 -2
  110. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  111. package/dist/types/src/capabilities/state.d.ts +5 -5
  112. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  113. package/dist/types/src/capabilities/undo-mappings.d.ts +5 -0
  114. package/dist/types/src/capabilities/undo-mappings.d.ts.map +1 -0
  115. package/dist/types/src/components/Call/Call.d.ts.map +1 -1
  116. package/dist/types/src/components/Call/Toolbar.d.ts +2 -2
  117. package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
  118. package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts +13 -0
  119. package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts.map +1 -0
  120. package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts +160 -0
  121. package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts.map +1 -0
  122. package/dist/types/src/components/CommentsPanel/CommentsThread.d.ts +14 -0
  123. package/dist/types/src/components/CommentsPanel/CommentsThread.d.ts.map +1 -0
  124. package/dist/types/src/components/CommentsPanel/index.d.ts +3 -0
  125. package/dist/types/src/components/CommentsPanel/index.d.ts.map +1 -0
  126. package/dist/types/src/components/Lobby/Lobby.d.ts.map +1 -1
  127. package/dist/types/src/components/Media/VideoObject.d.ts +1 -1
  128. package/dist/types/src/components/Media/VideoObject.stories.d.ts +1 -1
  129. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
  130. package/dist/types/src/components/MessagePanel/MessagePanel.d.ts +15 -0
  131. package/dist/types/src/components/MessagePanel/MessagePanel.d.ts.map +1 -0
  132. package/dist/types/src/components/MessagePanel/index.d.ts +2 -0
  133. package/dist/types/src/components/MessagePanel/index.d.ts.map +1 -0
  134. package/dist/types/src/components/Participant/Participant.d.ts.map +1 -1
  135. package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +1 -1
  136. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts.map +1 -1
  137. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +142 -140
  138. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  139. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +1 -1
  140. package/dist/types/src/components/ResponsiveGrid/{ResponsiveContainer.d.ts → ResponsivePanel.d.ts} +4 -4
  141. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.d.ts.map +1 -0
  142. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.stories.d.ts +164 -0
  143. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.stories.d.ts.map +1 -0
  144. package/dist/types/src/components/ResponsiveGrid/index.d.ts +1 -1
  145. package/dist/types/src/components/ResponsiveGrid/index.d.ts.map +1 -1
  146. package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts +6 -0
  147. package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts.map +1 -0
  148. package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts +161 -0
  149. package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts.map +1 -0
  150. package/dist/types/src/components/ThreadSettings/index.d.ts +2 -0
  151. package/dist/types/src/components/ThreadSettings/index.d.ts.map +1 -0
  152. package/dist/types/src/components/index.d.ts +4 -9
  153. package/dist/types/src/components/index.d.ts.map +1 -1
  154. package/dist/types/src/{components → containers/CallDebugPanel}/CallDebugPanel.d.ts +1 -1
  155. package/dist/types/src/containers/CallDebugPanel/CallDebugPanel.d.ts.map +1 -0
  156. package/dist/types/src/containers/CallDebugPanel/index.d.ts +2 -0
  157. package/dist/types/src/containers/CallDebugPanel/index.d.ts.map +1 -0
  158. package/dist/types/src/{components → containers/CallSidebar}/CallSidebar.d.ts +0 -1
  159. package/dist/types/src/containers/CallSidebar/CallSidebar.d.ts.map +1 -0
  160. package/dist/types/src/containers/CallSidebar/index.d.ts +2 -0
  161. package/dist/types/src/containers/CallSidebar/index.d.ts.map +1 -0
  162. package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts +12 -0
  163. package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts.map +1 -0
  164. package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts +162 -0
  165. package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts.map +1 -0
  166. package/dist/types/src/containers/ChannelContainer/index.d.ts +2 -0
  167. package/dist/types/src/containers/ChannelContainer/index.d.ts.map +1 -0
  168. package/dist/types/src/containers/ChatContainer/ChatContainer.d.ts +16 -0
  169. package/dist/types/src/containers/ChatContainer/ChatContainer.d.ts.map +1 -0
  170. package/dist/types/src/containers/ChatContainer/ChatContainer.stories.d.ts +162 -0
  171. package/dist/types/src/containers/ChatContainer/ChatContainer.stories.d.ts.map +1 -0
  172. package/dist/types/src/containers/ChatContainer/index.d.ts +4 -0
  173. package/dist/types/src/containers/ChatContainer/index.d.ts.map +1 -0
  174. package/dist/types/src/containers/ThreadCompanion/ThreadCompanion.d.ts +8 -0
  175. package/dist/types/src/containers/ThreadCompanion/ThreadCompanion.d.ts.map +1 -0
  176. package/dist/types/src/containers/ThreadCompanion/index.d.ts +2 -0
  177. package/dist/types/src/containers/ThreadCompanion/index.d.ts.map +1 -0
  178. package/dist/types/src/containers/index.d.ts +7 -0
  179. package/dist/types/src/containers/index.d.ts.map +1 -0
  180. package/dist/types/src/{components/command-extension.d.ts → extensions/command.d.ts} +1 -1
  181. package/dist/types/src/extensions/command.d.ts.map +1 -0
  182. package/dist/types/src/extensions/index.d.ts +1 -0
  183. package/dist/types/src/extensions/index.d.ts.map +1 -1
  184. package/dist/types/src/extensions/threads.d.ts +8 -3
  185. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  186. package/dist/types/src/hooks/analytics.d.ts +2 -3
  187. package/dist/types/src/hooks/analytics.d.ts.map +1 -1
  188. package/dist/types/src/hooks/index.d.ts +2 -2
  189. package/dist/types/src/hooks/index.d.ts.map +1 -1
  190. package/dist/types/src/index.d.ts +1 -1
  191. package/dist/types/src/index.d.ts.map +1 -1
  192. package/dist/types/src/meta.d.ts +2 -2
  193. package/dist/types/src/meta.d.ts.map +1 -1
  194. package/dist/types/src/operations/add-message.d.ts +5 -0
  195. package/dist/types/src/operations/add-message.d.ts.map +1 -0
  196. package/dist/types/src/operations/create-channel-thread.d.ts +5 -0
  197. package/dist/types/src/operations/create-channel-thread.d.ts.map +1 -0
  198. package/dist/types/src/operations/create-channel.d.ts +5 -0
  199. package/dist/types/src/operations/create-channel.d.ts.map +1 -0
  200. package/dist/types/src/operations/create-proposals.d.ts +5 -0
  201. package/dist/types/src/operations/create-proposals.d.ts.map +1 -0
  202. package/dist/types/src/operations/create.d.ts +5 -0
  203. package/dist/types/src/operations/create.d.ts.map +1 -0
  204. package/dist/types/src/operations/definitions.d.ts +2804 -0
  205. package/dist/types/src/operations/definitions.d.ts.map +1 -0
  206. package/dist/types/src/operations/delete-message.d.ts +5 -0
  207. package/dist/types/src/operations/delete-message.d.ts.map +1 -0
  208. package/dist/types/src/operations/delete.d.ts +5 -0
  209. package/dist/types/src/operations/delete.d.ts.map +1 -0
  210. package/dist/types/src/operations/index.d.ts +4 -0
  211. package/dist/types/src/operations/index.d.ts.map +1 -0
  212. package/dist/types/src/operations/on-create-space.d.ts +5 -0
  213. package/dist/types/src/operations/on-create-space.d.ts.map +1 -0
  214. package/dist/types/src/operations/restore-message.d.ts +5 -0
  215. package/dist/types/src/operations/restore-message.d.ts.map +1 -0
  216. package/dist/types/src/operations/restore.d.ts +5 -0
  217. package/dist/types/src/operations/restore.d.ts.map +1 -0
  218. package/dist/types/src/operations/select.d.ts +5 -0
  219. package/dist/types/src/operations/select.d.ts.map +1 -0
  220. package/dist/types/src/operations/toggle-resolved.d.ts +5 -0
  221. package/dist/types/src/operations/toggle-resolved.d.ts.map +1 -0
  222. package/dist/types/src/{components/testing.d.ts → testing/data.d.ts} +4 -4
  223. package/dist/types/src/testing/data.d.ts.map +1 -0
  224. package/dist/types/src/testing/stories.d.ts +2 -1
  225. package/dist/types/src/testing/stories.d.ts.map +1 -1
  226. package/dist/types/src/translations.d.ts +142 -74
  227. package/dist/types/src/translations.d.ts.map +1 -1
  228. package/dist/types/src/types/Channel.d.ts +715 -0
  229. package/dist/types/src/types/Channel.d.ts.map +1 -0
  230. package/dist/types/src/types/Settings.d.ts +5 -0
  231. package/dist/types/src/types/Settings.d.ts.map +1 -0
  232. package/dist/types/src/types/capabilities.d.ts +24 -0
  233. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  234. package/dist/types/src/types/index.d.ts +2 -1
  235. package/dist/types/src/types/index.d.ts.map +1 -1
  236. package/dist/types/src/types/types.d.ts +4 -459
  237. package/dist/types/src/types/types.d.ts.map +1 -1
  238. package/dist/types/src/util.d.ts.map +1 -1
  239. package/dist/types/tsconfig.tsbuildinfo +1 -1
  240. package/package.json +102 -72
  241. package/src/ThreadPlugin.tsx +81 -111
  242. package/src/blueprints/index.ts +5 -0
  243. package/src/blueprints/thread-blueprint.ts +37 -0
  244. package/src/calls/call-manager.ts +76 -52
  245. package/src/calls/call-swarm-synchronizer.ts +2 -2
  246. package/src/calls/media-manager.ts +10 -7
  247. package/src/calls/util/calls-service.ts +1 -2
  248. package/src/calls/util/stub-media-streams.ts +2 -2
  249. package/src/calls/util/task-scheduling.ts +4 -4
  250. package/src/calls-service.stories.tsx +10 -9
  251. package/src/capabilities/app-graph-builder.ts +172 -163
  252. package/src/capabilities/blueprint-definition.ts +17 -0
  253. package/src/capabilities/call-manager.ts +19 -12
  254. package/src/capabilities/index.ts +15 -12
  255. package/src/capabilities/markdown.ts +50 -37
  256. package/src/capabilities/operation-handler.ts +16 -0
  257. package/src/capabilities/react-root.tsx +12 -9
  258. package/src/capabilities/react-surface.tsx +80 -78
  259. package/src/capabilities/settings.ts +28 -12
  260. package/src/capabilities/state.ts +14 -18
  261. package/src/capabilities/undo-mappings.ts +46 -0
  262. package/src/components/Call/Call.tsx +11 -7
  263. package/src/components/Call/Toolbar.tsx +58 -41
  264. package/src/components/CommentsPanel/CommentsPanel.stories.tsx +93 -0
  265. package/src/components/CommentsPanel/CommentsPanel.tsx +71 -0
  266. package/src/components/{CommentsThreadContainer.tsx → CommentsPanel/CommentsThread.tsx} +60 -57
  267. package/src/components/CommentsPanel/index.ts +6 -0
  268. package/src/components/Lobby/Lobby.tsx +15 -12
  269. package/src/components/Media/AudioStream.tsx +2 -2
  270. package/src/components/Media/VideoObject.stories.tsx +6 -7
  271. package/src/components/Media/VideoObject.tsx +1 -1
  272. package/src/components/{MessageContainer.tsx → MessagePanel/MessagePanel.tsx} +77 -40
  273. package/src/components/MessagePanel/index.ts +5 -0
  274. package/src/components/Participant/Participant.tsx +33 -19
  275. package/src/components/Participant/ParticipantGrid.tsx +0 -1
  276. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +9 -10
  277. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +5 -5
  278. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +12 -9
  279. package/src/components/ResponsiveGrid/{ResponsiveContainer.stories.tsx → ResponsivePanel.stories.tsx} +7 -8
  280. package/src/components/ResponsiveGrid/{ResponsiveContainer.tsx → ResponsivePanel.tsx} +5 -5
  281. package/src/components/ResponsiveGrid/index.ts +1 -1
  282. package/src/components/ThreadSettings/ThreadSettings.stories.tsx +31 -0
  283. package/src/components/ThreadSettings/ThreadSettings.tsx +20 -0
  284. package/src/components/ThreadSettings/index.ts +5 -0
  285. package/src/components/index.ts +5 -12
  286. package/src/{components → containers/CallDebugPanel}/CallDebugPanel.tsx +15 -16
  287. package/src/containers/CallDebugPanel/index.ts +5 -0
  288. package/src/containers/CallSidebar/CallSidebar.tsx +18 -0
  289. package/src/containers/CallSidebar/index.ts +5 -0
  290. package/src/containers/ChannelContainer/ChannelContainer.stories.tsx +61 -0
  291. package/src/{components → containers/ChannelContainer}/ChannelContainer.tsx +93 -71
  292. package/src/containers/ChannelContainer/index.ts +5 -0
  293. package/src/{components/Chat.stories.tsx → containers/ChatContainer/ChatContainer.stories.tsx} +27 -31
  294. package/src/containers/ChatContainer/ChatContainer.tsx +131 -0
  295. package/src/containers/ChatContainer/index.ts +8 -0
  296. package/src/containers/ThreadCompanion/ThreadCompanion.tsx +217 -0
  297. package/src/containers/ThreadCompanion/index.ts +5 -0
  298. package/src/containers/index.ts +11 -0
  299. package/src/{components/command-extension.ts → extensions/command.ts} +3 -3
  300. package/src/extensions/index.ts +1 -0
  301. package/src/extensions/threads.ts +87 -42
  302. package/src/hooks/analytics.ts +22 -21
  303. package/src/hooks/index.ts +3 -2
  304. package/src/index.ts +1 -1
  305. package/src/meta.ts +10 -5
  306. package/src/operations/add-message.ts +81 -0
  307. package/src/operations/create-channel-thread.ts +26 -0
  308. package/src/operations/create-channel.ts +20 -0
  309. package/src/operations/create-proposals.ts +49 -0
  310. package/src/operations/create.ts +48 -0
  311. package/src/operations/definitions.ts +177 -0
  312. package/src/operations/delete-message.ts +53 -0
  313. package/src/operations/delete.ts +63 -0
  314. package/src/operations/index.ts +22 -0
  315. package/src/operations/on-create-space.ts +27 -0
  316. package/src/operations/restore-message.ts +38 -0
  317. package/src/operations/restore.ts +38 -0
  318. package/src/operations/select.ts +24 -0
  319. package/src/operations/toggle-resolved.ts +41 -0
  320. package/src/testing/data.ts +49 -0
  321. package/src/testing/stories.ts +17 -20
  322. package/src/translations.ts +74 -75
  323. package/src/types/Channel.ts +37 -0
  324. package/src/types/Settings.ts +10 -0
  325. package/src/types/capabilities.ts +36 -0
  326. package/src/types/index.ts +2 -1
  327. package/src/types/types.ts +5 -108
  328. package/src/util.ts +1 -1
  329. package/dist/lib/browser/ChannelContainer-BGDGZHV4.mjs +0 -16
  330. package/dist/lib/browser/ChatContainer-75KJZ4XR.mjs +0 -15
  331. package/dist/lib/browser/app-graph-builder-ODKIAXR7.mjs +0 -171
  332. package/dist/lib/browser/app-graph-builder-ODKIAXR7.mjs.map +0 -7
  333. package/dist/lib/browser/call-manager-BCKLI4QD.mjs +0 -24
  334. package/dist/lib/browser/call-manager-BCKLI4QD.mjs.map +0 -7
  335. package/dist/lib/browser/chunk-2MUYQOQE.mjs +0 -23
  336. package/dist/lib/browser/chunk-2MUYQOQE.mjs.map +0 -7
  337. package/dist/lib/browser/chunk-B7YQ7QR2.mjs +0 -376
  338. package/dist/lib/browser/chunk-B7YQ7QR2.mjs.map +0 -7
  339. package/dist/lib/browser/chunk-CMCVHULC.mjs +0 -986
  340. package/dist/lib/browser/chunk-CMCVHULC.mjs.map +0 -7
  341. package/dist/lib/browser/chunk-CP7E2HRE.mjs +0 -31
  342. package/dist/lib/browser/chunk-CP7E2HRE.mjs.map +0 -7
  343. package/dist/lib/browser/chunk-HDEQRBOC.mjs +0 -181
  344. package/dist/lib/browser/chunk-HDEQRBOC.mjs.map +0 -7
  345. package/dist/lib/browser/chunk-L326LSNS.mjs +0 -18
  346. package/dist/lib/browser/chunk-L326LSNS.mjs.map +0 -7
  347. package/dist/lib/browser/chunk-T4KJ5JR4.mjs +0 -15
  348. package/dist/lib/browser/chunk-T4KJ5JR4.mjs.map +0 -7
  349. package/dist/lib/browser/chunk-VJMKS4CZ.mjs +0 -619
  350. package/dist/lib/browser/chunk-VJMKS4CZ.mjs.map +0 -7
  351. package/dist/lib/browser/chunk-VTYX3SIM.mjs +0 -147
  352. package/dist/lib/browser/chunk-VTYX3SIM.mjs.map +0 -7
  353. package/dist/lib/browser/chunk-XYUJXHYV.mjs +0 -106
  354. package/dist/lib/browser/chunk-XYUJXHYV.mjs.map +0 -7
  355. package/dist/lib/browser/chunk-ZCEU5K23.mjs +0 -1890
  356. package/dist/lib/browser/chunk-ZCEU5K23.mjs.map +0 -7
  357. package/dist/lib/browser/intent-resolver-VOQD3TQ2.mjs +0 -427
  358. package/dist/lib/browser/intent-resolver-VOQD3TQ2.mjs.map +0 -7
  359. package/dist/lib/browser/markdown-R6MGRIA6.mjs +0 -169
  360. package/dist/lib/browser/markdown-R6MGRIA6.mjs.map +0 -7
  361. package/dist/lib/browser/react-root-UMSBTN6H.mjs +0 -28
  362. package/dist/lib/browser/react-root-UMSBTN6H.mjs.map +0 -7
  363. package/dist/lib/browser/react-surface-SXMQEWKE.mjs +0 -109
  364. package/dist/lib/browser/react-surface-SXMQEWKE.mjs.map +0 -7
  365. package/dist/lib/browser/settings-TCNF54PN.mjs +0 -22
  366. package/dist/lib/browser/settings-TCNF54PN.mjs.map +0 -7
  367. package/dist/lib/browser/state-ZQ4IPOJT.mjs +0 -34
  368. package/dist/lib/browser/state-ZQ4IPOJT.mjs.map +0 -7
  369. package/dist/lib/browser/toolkit-JF4B4QIO.mjs +0 -84
  370. package/dist/lib/browser/toolkit-JF4B4QIO.mjs.map +0 -7
  371. package/dist/lib/node-esm/ChannelContainer-OXC6BTU7.mjs +0 -17
  372. package/dist/lib/node-esm/ChannelContainer-OXC6BTU7.mjs.map +0 -7
  373. package/dist/lib/node-esm/ChatContainer-SH6LTFQL.mjs +0 -16
  374. package/dist/lib/node-esm/ChatContainer-SH6LTFQL.mjs.map +0 -7
  375. package/dist/lib/node-esm/app-graph-builder-DMPT3MY6.mjs +0 -172
  376. package/dist/lib/node-esm/app-graph-builder-DMPT3MY6.mjs.map +0 -7
  377. package/dist/lib/node-esm/call-manager-Q7RY2YP4.mjs +0 -25
  378. package/dist/lib/node-esm/call-manager-Q7RY2YP4.mjs.map +0 -7
  379. package/dist/lib/node-esm/chunk-2KZ4ODHU.mjs +0 -987
  380. package/dist/lib/node-esm/chunk-2KZ4ODHU.mjs.map +0 -7
  381. package/dist/lib/node-esm/chunk-2MMJF7DW.mjs +0 -182
  382. package/dist/lib/node-esm/chunk-2MMJF7DW.mjs.map +0 -7
  383. package/dist/lib/node-esm/chunk-2V3WSLUZ.mjs +0 -108
  384. package/dist/lib/node-esm/chunk-2V3WSLUZ.mjs.map +0 -7
  385. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs +0 -33
  386. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs.map +0 -7
  387. package/dist/lib/node-esm/chunk-BAMZXJS4.mjs +0 -148
  388. package/dist/lib/node-esm/chunk-BAMZXJS4.mjs.map +0 -7
  389. package/dist/lib/node-esm/chunk-BTGKI5IK.mjs +0 -377
  390. package/dist/lib/node-esm/chunk-BTGKI5IK.mjs.map +0 -7
  391. package/dist/lib/node-esm/chunk-GZ4WL2IS.mjs +0 -25
  392. package/dist/lib/node-esm/chunk-GZ4WL2IS.mjs.map +0 -7
  393. package/dist/lib/node-esm/chunk-LCHTNRK7.mjs +0 -19
  394. package/dist/lib/node-esm/chunk-LCHTNRK7.mjs.map +0 -7
  395. package/dist/lib/node-esm/chunk-NHSIAEDW.mjs +0 -620
  396. package/dist/lib/node-esm/chunk-NHSIAEDW.mjs.map +0 -7
  397. package/dist/lib/node-esm/chunk-OBVAURUU.mjs +0 -17
  398. package/dist/lib/node-esm/chunk-OBVAURUU.mjs.map +0 -7
  399. package/dist/lib/node-esm/chunk-TIPIOH2J.mjs +0 -1891
  400. package/dist/lib/node-esm/chunk-TIPIOH2J.mjs.map +0 -7
  401. package/dist/lib/node-esm/intent-resolver-AKVH66PH.mjs +0 -428
  402. package/dist/lib/node-esm/intent-resolver-AKVH66PH.mjs.map +0 -7
  403. package/dist/lib/node-esm/markdown-MYGTDXT6.mjs +0 -170
  404. package/dist/lib/node-esm/markdown-MYGTDXT6.mjs.map +0 -7
  405. package/dist/lib/node-esm/react-root-W6AVTL5M.mjs +0 -29
  406. package/dist/lib/node-esm/react-root-W6AVTL5M.mjs.map +0 -7
  407. package/dist/lib/node-esm/react-surface-NLSZJGMO.mjs +0 -110
  408. package/dist/lib/node-esm/react-surface-NLSZJGMO.mjs.map +0 -7
  409. package/dist/lib/node-esm/settings-ZQHGVFBY.mjs +0 -23
  410. package/dist/lib/node-esm/settings-ZQHGVFBY.mjs.map +0 -7
  411. package/dist/lib/node-esm/state-FSLLJ5TZ.mjs +0 -35
  412. package/dist/lib/node-esm/state-FSLLJ5TZ.mjs.map +0 -7
  413. package/dist/lib/node-esm/toolkit-DHPKJITO.mjs +0 -85
  414. package/dist/lib/node-esm/toolkit-DHPKJITO.mjs.map +0 -7
  415. package/dist/types/src/capabilities/capabilities.d.ts +0 -27
  416. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  417. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  418. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  419. package/dist/types/src/capabilities/toolkit.d.ts +0 -6
  420. package/dist/types/src/capabilities/toolkit.d.ts.map +0 -1
  421. package/dist/types/src/components/CallDebugPanel.d.ts.map +0 -1
  422. package/dist/types/src/components/CallSidebar.d.ts.map +0 -1
  423. package/dist/types/src/components/ChannelContainer.d.ts +0 -14
  424. package/dist/types/src/components/ChannelContainer.d.ts.map +0 -1
  425. package/dist/types/src/components/ChannelContainer.stories.d.ts +0 -94
  426. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +0 -1
  427. package/dist/types/src/components/Chat.stories.d.ts +0 -93
  428. package/dist/types/src/components/Chat.stories.d.ts.map +0 -1
  429. package/dist/types/src/components/ChatContainer.d.ts +0 -17
  430. package/dist/types/src/components/ChatContainer.d.ts.map +0 -1
  431. package/dist/types/src/components/Comments.stories.d.ts +0 -158
  432. package/dist/types/src/components/Comments.stories.d.ts.map +0 -1
  433. package/dist/types/src/components/CommentsContainer.d.ts +0 -13
  434. package/dist/types/src/components/CommentsContainer.d.ts.map +0 -1
  435. package/dist/types/src/components/CommentsThreadContainer.d.ts +0 -14
  436. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +0 -1
  437. package/dist/types/src/components/MessageContainer.d.ts +0 -14
  438. package/dist/types/src/components/MessageContainer.d.ts.map +0 -1
  439. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.d.ts.map +0 -1
  440. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +0 -162
  441. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +0 -1
  442. package/dist/types/src/components/ThreadComplementary.d.ts +0 -5
  443. package/dist/types/src/components/ThreadComplementary.d.ts.map +0 -1
  444. package/dist/types/src/components/ThreadSettings.d.ts +0 -6
  445. package/dist/types/src/components/ThreadSettings.d.ts.map +0 -1
  446. package/dist/types/src/components/command-extension.d.ts.map +0 -1
  447. package/dist/types/src/components/testing.d.ts.map +0 -1
  448. package/dist/types/src/types/schema.d.ts +0 -179
  449. package/dist/types/src/types/schema.d.ts.map +0 -1
  450. package/src/capabilities/capabilities.ts +0 -33
  451. package/src/capabilities/intent-resolver.ts +0 -348
  452. package/src/capabilities/toolkit.ts +0 -82
  453. package/src/components/CallSidebar.tsx +0 -18
  454. package/src/components/ChannelContainer.stories.tsx +0 -59
  455. package/src/components/ChatContainer.tsx +0 -145
  456. package/src/components/Comments.stories.tsx +0 -91
  457. package/src/components/CommentsContainer.tsx +0 -72
  458. package/src/components/ThreadComplementary.tsx +0 -181
  459. package/src/components/ThreadSettings.tsx +0 -16
  460. package/src/components/testing.ts +0 -51
  461. package/src/types/schema.ts +0 -33
  462. /package/dist/lib/browser/{ChannelContainer-BGDGZHV4.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  463. /package/dist/lib/{browser/ChatContainer-75KJZ4XR.mjs.map → node-esm/chunk-HSLMI22Q.mjs.map} +0 -0
@@ -0,0 +1,71 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import React, { useEffect } from 'react';
6
+
7
+ import { Obj, Relation } from '@dxos/echo';
8
+ import { Icon, Message, Trans, useTranslation } from '@dxos/react-ui';
9
+ import { type AnchoredTo, type Thread } from '@dxos/types';
10
+
11
+ import { meta } from '#meta';
12
+
13
+ import { CommentsThread, type CommentsThreadProps } from './CommentsThread';
14
+
15
+ export type CommentsPanelProps = Omit<CommentsThreadProps, 'anchor' | 'current'> & {
16
+ anchors: AnchoredTo.AnchoredTo[];
17
+ currentId?: string;
18
+ showResolvedThreads?: boolean;
19
+ };
20
+
21
+ /**
22
+ * Root container for collection of comment threads.
23
+ */
24
+ export const CommentsPanel = ({ anchors, currentId, showResolvedThreads, ...props }: CommentsPanelProps) => {
25
+ const { t } = useTranslation(meta.id);
26
+
27
+ // TODO(wittjosiah): There seems to be a race between thread and anchor being deleted.
28
+ const filteredAnchors = showResolvedThreads
29
+ ? anchors.filter((anchor) => !!Relation.getSource(anchor))
30
+ : anchors.filter((anchor) => {
31
+ const thread = Relation.getSource(anchor);
32
+ // TODO(dmaretskyi): Do Obj.instanceOf check instead.
33
+ return thread && (thread as any).status !== 'resolved';
34
+ });
35
+
36
+ useEffect(() => {
37
+ if (currentId) {
38
+ document.getElementById(currentId)?.scrollIntoView({ behavior: 'smooth', block: 'end' });
39
+ }
40
+ }, [currentId]);
41
+
42
+ if (filteredAnchors.length === 0) {
43
+ return (
44
+ <div role='none' className='p-form-padding'>
45
+ <Message.Root>
46
+ <Message.Title>
47
+ <Trans
48
+ {...{
49
+ t,
50
+ i18nKey: 'no-comments.message',
51
+ components: {
52
+ commentIcon: <Icon icon='ph--chat-text--regular' size={4} classNames='w-block' />,
53
+ },
54
+ }}
55
+ />
56
+ </Message.Title>
57
+ </Message.Root>
58
+ </div>
59
+ );
60
+ }
61
+
62
+ return (
63
+ <div>
64
+ {filteredAnchors.map((anchor) => {
65
+ const thread = Relation.getSource(anchor) as Thread.Thread;
66
+ const threadId = Obj.getDXN(thread).toString();
67
+ return <CommentsThread key={threadId} anchor={anchor} current={currentId === threadId} {...props} />;
68
+ })}
69
+ </div>
70
+ );
71
+ };
@@ -4,35 +4,39 @@
4
4
 
5
5
  import React, { useCallback, useMemo, useRef, useState } from 'react';
6
6
 
7
- import { Ref, Relation } from '@dxos/echo';
8
- import { fullyQualifiedId, getSpace, useMembers } from '@dxos/react-client/echo';
7
+ import { Obj, Relation } from '@dxos/echo';
8
+ import { useObject } from '@dxos/echo-react';
9
+ import { getSpace, useMembers } from '@dxos/react-client/echo';
9
10
  import { useIdentity } from '@dxos/react-client/halo';
10
11
  import { IconButton, Tag, Tooltip, useThemeContext, useTranslation } from '@dxos/react-ui';
11
- import { createBasicExtensions, createThemeExtensions, listener } from '@dxos/react-ui-editor';
12
- import { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/react-ui-theme';
13
- import { MessageTextbox, type MessageTextboxProps, Thread, type ThreadRootProps } from '@dxos/react-ui-thread';
14
- import { type AnchoredTo } from '@dxos/schema';
15
- import { isNonNullable } from '@dxos/util';
16
-
17
- import { useStatus } from '../hooks';
18
- import { meta } from '../meta';
19
- import { type ThreadType } from '../types';
20
- import { getMessageMetadata } from '../util';
21
-
22
- import { command } from './command-extension';
23
- import { MessageContainer, buttonClassNames, buttonGroupClassNames } from './MessageContainer';
24
-
25
- export type CommentsThreadContainerProps = {
26
- anchor: AnchoredTo;
27
- onAttend?: (anchor: AnchoredTo) => void;
28
- onComment?: (anchor: AnchoredTo, message: string) => void;
29
- onResolve?: (anchor: AnchoredTo) => void;
30
- onMessageDelete?: (anchor: AnchoredTo, messageId: string) => void;
31
- onThreadDelete?: (anchor: AnchoredTo) => void;
32
- onAcceptProposal?: (anchor: AnchoredTo, messageId: string) => void;
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
+
25
+ import { command } from '../../extensions/command';
26
+ import { getMessageMetadata } from '../../util';
27
+ import { MessagePanel, buttonClassNames, buttonGroupClassNames } from '../MessagePanel';
28
+
29
+ export type CommentsThreadProps = {
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;
33
37
  } & Pick<ThreadRootProps, 'current'>;
34
38
 
35
- export const CommentsThreadContainer = ({
39
+ export const CommentsThread = ({
36
40
  anchor,
37
41
  current,
38
42
  onAttend,
@@ -41,30 +45,31 @@ export const CommentsThreadContainer = ({
41
45
  onMessageDelete,
42
46
  onThreadDelete,
43
47
  onAcceptProposal,
44
- }: CommentsThreadContainerProps) => {
48
+ }: CommentsThreadProps) => {
49
+ const { themeMode } = useThemeContext();
45
50
  const { t } = useTranslation(meta.id);
46
51
  const identity = useIdentity()!;
47
52
  const space = getSpace(anchor);
48
- const members = useMembers(space?.key);
53
+ const members = useMembers(space?.id);
49
54
  const detached = !anchor.anchor;
50
- const thread = Relation.getSource(anchor) as ThreadType;
51
- const activity = useStatus(space, fullyQualifiedId(thread));
55
+ const thread = Relation.getSource(anchor) as Thread.Thread;
56
+ const [messages] = useObject(thread, 'messages');
57
+ const activity = useStatus(space, Obj.getDXN(thread).toString());
52
58
  const threadScrollRef = useRef<HTMLDivElement | null>(null);
53
- const { themeMode } = useThemeContext();
54
59
 
55
- const textboxMetadata = getMessageMetadata(fullyQualifiedId(thread), identity);
60
+ const textboxMetadata = getMessageMetadata(Obj.getDXN(thread).toString(), identity);
61
+
56
62
  // TODO(wittjosiah): This is a hack to reset the editor after a message is sent.
57
- const [_count, _setCount] = useState(0);
58
- const rerenderEditor = () => _setCount((count) => count + 1);
63
+ const [state, setState] = useState({});
59
64
  const messageRef = useRef('');
60
65
  const extensions = useMemo(
61
66
  () => [
62
- createBasicExtensions({ placeholder: t('message placeholder') }),
67
+ createBasicExtensions({ placeholder: t('message.placeholder') }),
63
68
  createThemeExtensions({ themeMode }),
64
- listener({ onChange: (text) => (messageRef.current = text) }),
69
+ listener({ onChange: ({ text }) => (messageRef.current = text) }),
65
70
  command,
66
71
  ],
67
- [_count],
72
+ [state],
68
73
  );
69
74
 
70
75
  // TODO(thure): Factor out.
@@ -77,7 +82,7 @@ export const CommentsThreadContainer = ({
77
82
  const handleThreadDelete = useCallback(() => onThreadDelete?.(anchor), [onThreadDelete, anchor]);
78
83
  const handleAcceptProposal = useCallback((id: string) => onAcceptProposal?.(anchor, id), [onAcceptProposal, anchor]);
79
84
 
80
- const handleComment: MessageTextboxProps['onSend'] = useCallback(() => {
85
+ const handleComment = useCallback<NonNullable<MessageTextboxProps['onSend']>>(() => {
81
86
  if (!messageRef.current) {
82
87
  return false;
83
88
  }
@@ -85,15 +90,15 @@ export const CommentsThreadContainer = ({
85
90
  onComment?.(anchor, messageRef.current);
86
91
  messageRef.current = '';
87
92
  scrollToEnd('instant');
88
- rerenderEditor();
93
+ setState({});
89
94
 
90
95
  return true;
91
96
  }, [anchor, identity]);
92
97
 
93
98
  return (
94
- <Thread.Root
95
- id={fullyQualifiedId(thread)}
96
- classNames='pbs-2 border-be border-subduedSeparator last:border-none'
99
+ <ThreadComponent.Root
100
+ id={Obj.getDXN(thread).toString()}
101
+ classNames='pt-2 border-b border-subdued-separator last:border-none'
97
102
  current={current}
98
103
  onClickCapture={handleAttend}
99
104
  onFocusCapture={handleAttend}
@@ -101,27 +106,27 @@ export const CommentsThreadContainer = ({
101
106
  <div
102
107
  role='none'
103
108
  className={mx(
104
- 'col-span-2 grid grid-cols-[var(--rail-size)_1fr_min-content]',
109
+ 'col-span-2 grid grid-cols-[var(--dx-rail-size)_1fr_min-content]',
105
110
  hoverableControls,
106
111
  hoverableFocusedWithinControls,
107
112
  )}
108
113
  >
109
114
  {detached ? (
110
- <Tooltip.Trigger asChild content={t('detached thread label')} side='top'>
111
- <Thread.Header detached>{thread.name}</Thread.Header>
115
+ <Tooltip.Trigger asChild content={t('detached-thread.label')} side='top'>
116
+ <ThreadComponent.Header detached>{thread.name}</ThreadComponent.Header>
112
117
  </Tooltip.Trigger>
113
118
  ) : (
114
- <Thread.Header>{thread.name}</Thread.Header>
119
+ <ThreadComponent.Header>{thread.name}</ThreadComponent.Header>
115
120
  )}
116
121
  <div role='none' className={buttonGroupClassNames}>
117
- {thread.status === 'staged' && <Tag palette='neutral'>{t('draft button')}</Tag>}
122
+ {thread.status === 'staged' && <Tag palette='neutral'>{t('draft.button')}</Tag>}
118
123
  {onResolve && !(thread?.status === 'staged') && (
119
124
  <IconButton
120
125
  data-testid='thread.resolve'
121
126
  variant='ghost'
122
127
  icon={thread?.status === 'resolved' ? 'ph--check--fill' : 'ph--check--regular'}
123
128
  iconOnly
124
- label={t('resolve thread label')}
129
+ label={t('resolve-thread.label')}
125
130
  classNames={[buttonClassNames, thread?.status !== 'resolved' && hoverableControlItem]}
126
131
  onClick={handleResolve}
127
132
  />
@@ -132,7 +137,7 @@ export const CommentsThreadContainer = ({
132
137
  variant='ghost'
133
138
  icon='ph--x--regular'
134
139
  iconOnly
135
- label={t('delete thread label')}
140
+ label={t('delete-thread.label')}
136
141
  classNames={[buttonClassNames, hoverableControlItem]}
137
142
  onClick={handleThreadDelete}
138
143
  />
@@ -140,12 +145,11 @@ export const CommentsThreadContainer = ({
140
145
  </div>
141
146
  </div>
142
147
 
143
- {/** TODO(dmaretskyi): How's `thread.messages` undefined? */}
144
- {Ref.Array.targets(thread.messages?.filter(isNonNullable) ?? []).map((message) => (
145
- <MessageContainer
146
- key={message.id}
148
+ {messages?.map((ref) => (
149
+ <MessagePanel
150
+ key={ref.dxn.toString()}
147
151
  editable
148
- message={message}
152
+ message={ref}
149
153
  members={members}
150
154
  onDelete={handleMessageDelete}
151
155
  onAcceptProposal={handleAcceptProposal}
@@ -160,10 +164,9 @@ export const CommentsThreadContainer = ({
160
164
  */}
161
165
  <MessageTextbox extensions={extensions} onSend={handleComment} {...textboxMetadata} />
162
166
 
163
- <Thread.Status activity={activity}>{t('activity message')}</Thread.Status>
167
+ <ThreadComponent.Status activity={activity}>{t('activity.message')}</ThreadComponent.Status>
164
168
 
165
- {/* NOTE(thure): This can’t also be the `overflow-anchor` because `ScrollArea` injects an interceding node that contains this necessary ref’d element. */}
166
- <div role='none' className='bs-px -mbs-px' ref={threadScrollRef} />
167
- </Thread.Root>
169
+ <div role='none' className='h-px -mt-px' ref={threadScrollRef} />
170
+ </ThreadComponent.Root>
168
171
  );
169
172
  };
@@ -0,0 +1,6 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ export * from './CommentsPanel';
6
+ export * from './CommentsThread';
@@ -2,17 +2,19 @@
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 { useCapability } from '@dxos/app-framework/ui';
8
9
  import { type ThemedClassName, useTranslation } from '@dxos/react-ui';
9
- import { mx } from '@dxos/react-ui-theme';
10
+ import { mx } from '@dxos/ui-theme';
11
+
12
+ import { meta } from '#meta';
13
+ import { ThreadCapabilities } from '#types';
10
14
 
11
- import { ThreadCapabilities } from '../../capabilities';
12
- import { meta } from '../../meta';
13
15
  import { Toolbar, type ToolbarProps } from '../Call';
14
16
  import { VideoObject } from '../Media';
15
- import { ResponsiveContainer } from '../ResponsiveGrid';
17
+ import { ResponsivePanel } from '../ResponsiveGrid';
16
18
 
17
19
  // TODO(wittjosiah): Repurpose lobby for preview.
18
20
 
@@ -39,9 +41,10 @@ type LobbyPreviewProps = {};
39
41
  const LobbyPreview: FC<LobbyPreviewProps> = () => {
40
42
  const { t } = useTranslation(meta.id);
41
43
  const call = useCapability(ThreadCapabilities.CallManager);
44
+ const media = useAtomValue(call.mediaAtom);
42
45
  const [classNames, setClassNames] = useState('');
43
46
  useEffect(() => {
44
- if (!call.media.videoEnabled) {
47
+ if (!media.videoEnabled) {
45
48
  setClassNames('');
46
49
  return;
47
50
  }
@@ -52,14 +55,14 @@ const LobbyPreview: FC<LobbyPreviewProps> = () => {
52
55
  }, 500);
53
56
 
54
57
  return () => clearTimeout(timeout);
55
- }, [call.media.videoEnabled]);
58
+ }, [media.videoEnabled]);
56
59
 
57
60
  return (
58
61
  <div className='grid grow p-4'>
59
- <ResponsiveContainer>
60
- {(call.media.videoEnabled && (
62
+ <ResponsivePanel>
63
+ {(media.videoEnabled && (
61
64
  <VideoObject
62
- videoStream={call.media.videoStream}
65
+ videoStream={media.videoStream}
63
66
  flip
64
67
  muted
65
68
  classNames={mx(
@@ -67,8 +70,8 @@ const LobbyPreview: FC<LobbyPreviewProps> = () => {
67
70
  classNames,
68
71
  )}
69
72
  />
70
- )) || <div className='p-4 outline outline-separator rounded-md'>{t('camera off label')}</div>}
71
- </ResponsiveContainer>
73
+ )) || <div className='p-4 outline outline-separator rounded-md'>{t('camera-off.label')}</div>}
74
+ </ResponsivePanel>
72
75
  </div>
73
76
  );
74
77
  };
@@ -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);
@@ -8,11 +8,10 @@ import React, { useEffect, useState } from 'react';
8
8
  import { scheduleTask } from '@dxos/async';
9
9
  import { Context } from '@dxos/context';
10
10
  import { log } from '@dxos/log';
11
- import { withTheme } from '@dxos/react-ui/testing';
11
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
12
12
 
13
13
  import { getUserMediaTrack } from '../../calls';
14
- import { ResponsiveContainer } from '../ResponsiveGrid';
15
-
14
+ import { ResponsivePanel } from '../ResponsiveGrid';
16
15
  import { VideoObject, type VideoObjectProps } from './VideoObject';
17
16
 
18
17
  const DefaultStory = (props: VideoObjectProps) => {
@@ -37,17 +36,17 @@ const DefaultStory = (props: VideoObjectProps) => {
37
36
  }, []);
38
37
 
39
38
  return (
40
- <ResponsiveContainer>
39
+ <ResponsivePanel>
41
40
  <VideoObject videoStream={videoStream} flip {...props} />
42
- </ResponsiveContainer>
41
+ </ResponsivePanel>
43
42
  );
44
43
  };
45
44
 
46
45
  const meta = {
47
- title: 'plugins/plugin-thread/VideoObject',
46
+ title: 'plugins/plugin-thread/components/VideoObject',
48
47
  component: VideoObject,
49
48
  render: DefaultStory,
50
- decorators: [withTheme],
49
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' })],
51
50
  parameters: {
52
51
  layout: 'fullscreen',
53
52
  },
@@ -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<{
@@ -5,59 +5,88 @@
5
5
  import { EditorView } from '@codemirror/view';
6
6
  import React, { forwardRef, useCallback, useEffect, useRef, useState } from 'react';
7
7
 
8
- import { Surface } from '@dxos/app-framework';
9
- import { type Obj, Ref, type Type } from '@dxos/echo';
8
+ import { Surface } from '@dxos/app-framework/ui';
9
+ import { AppSurface } from '@dxos/app-toolkit/ui';
10
+ import { type Obj, Ref } from '@dxos/echo';
11
+ import { useObject } from '@dxos/echo-react';
10
12
  import { PublicKey } from '@dxos/react-client';
11
13
  import { type SpaceMember } from '@dxos/react-client/echo';
12
14
  import { type Identity, useIdentity } from '@dxos/react-client/halo';
13
15
  import { IconButton, useOnTransition, useThemeContext, useTranslation } from '@dxos/react-ui';
14
- import { createBasicExtensions, createThemeExtensions, useTextEditor } from '@dxos/react-ui-editor';
15
- import { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/react-ui-theme';
16
+ import { Card } from '@dxos/react-ui';
17
+ import { useTextEditor } from '@dxos/react-ui-editor';
16
18
  import { MessageHeading, MessageRoot } from '@dxos/react-ui-thread';
17
- import { type DataType } from '@dxos/schema';
19
+ import { type ContentBlock, type Message } from '@dxos/types';
20
+ import { createBasicExtensions, createThemeExtensions } from '@dxos/ui-editor';
21
+ import { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/ui-theme';
18
22
 
19
- import { useOnEditAnalytics } from '../hooks';
20
- import { meta } from '../meta';
21
- import { getMessageMetadata } from '../util';
23
+ import { useOnEditAnalytics } from '#hooks';
24
+ import { meta } from '#meta';
22
25
 
23
- import { command } from './command-extension';
26
+ import { command } from '../../extensions/command';
27
+ import { getMessageMetadata } from '../../util';
24
28
 
25
- export const buttonGroupClassNames = 'flex flex-row items-center gap-0.5 pie-2';
26
- export const buttonClassNames = '!p-1 transition-opacity';
29
+ export const buttonGroupClassNames = 'flex flex-row items-center gap-0.5 pe-2';
30
+ export const buttonClassNames = 'p-1! transition-opacity';
27
31
 
28
- export type MessageContainerProps = {
29
- message: DataType.Message;
32
+ export type MessagePanelProps = {
33
+ message: Obj.OfShape<Message.Message> | Ref.Ref<Obj.OfShape<Message.Message>>;
30
34
  members: SpaceMember[];
31
35
  editable?: boolean;
32
36
  onDelete?: (id: string) => void;
33
37
  onAcceptProposal?: (id: string) => void;
34
38
  };
35
39
 
36
- export const MessageContainer = ({
37
- message,
40
+ export const MessagePanel = ({
41
+ message: messageOrRef,
38
42
  members,
39
43
  editable = false,
40
44
  onDelete,
41
45
  onAcceptProposal,
42
- }: MessageContainerProps) => {
46
+ }: MessagePanelProps) => {
43
47
  const { t } = useTranslation(meta.id);
48
+ const [message, updateMessage] = useObject(messageOrRef);
49
+ const identity = useIdentity();
50
+ const [editing, setEditing] = useState(false);
51
+
52
+ const textBlockIndex = message?.blocks.findIndex((block) => block._tag === 'text') ?? -1;
53
+
54
+ const handleEdit = useCallback(() => setEditing((editing) => !editing), []);
55
+ const handleDelete = useCallback(() => message && onDelete?.(message.id), [message, onDelete]);
56
+ const handleAcceptProposal = useCallback(
57
+ () => message && onAcceptProposal?.(message.id),
58
+ [message, onAcceptProposal],
59
+ );
60
+ const handleTextBlockChange = useCallback(
61
+ (newText: string) => {
62
+ updateMessage((m) => {
63
+ const targetBlock = m.blocks[textBlockIndex];
64
+ if (targetBlock && targetBlock._tag === 'text') {
65
+ targetBlock.text = newText;
66
+ }
67
+ });
68
+ },
69
+ [updateMessage, textBlockIndex],
70
+ );
71
+
72
+ const textBlock =
73
+ message && textBlockIndex !== -1 ? (message.blocks[textBlockIndex] as ContentBlock.Text) : undefined;
74
+ useOnEditAnalytics(message, textBlock, !!editing);
75
+
76
+ if (!message) {
77
+ return null;
78
+ }
79
+
44
80
  const senderIdentity = members.find(
45
81
  (member) =>
46
82
  (message.sender.identityDid && member.identity.did === message.sender.identityDid) ||
47
83
  (message.sender.identityKey && PublicKey.equals(member.identity.identityKey, message.sender.identityKey)),
48
84
  )?.identity;
49
85
  const messageMetadata = getMessageMetadata(message.id, senderIdentity);
50
- const userIsAuthor = useIdentity()?.did === messageMetadata.authorId;
51
- const [editing, setEditing] = useState(false);
52
- const handleEdit = useCallback(() => setEditing((editing) => !editing), []);
53
- const handleDelete = useCallback(() => onDelete?.(message.id), [message, onDelete]);
54
- const handleAcceptProposal = useCallback(() => onAcceptProposal?.(message.id), [message, onAcceptProposal]);
55
- const textBlock = message.blocks.find((block) => block._tag === 'text');
86
+ const userIsAuthor = identity?.did === messageMetadata.authorId;
56
87
  const proposalBlock = message.blocks.find((block) => block._tag === 'proposal');
57
88
  const references = message.blocks.filter((block) => block._tag === 'reference').map((block) => block.reference);
58
89
 
59
- useOnEditAnalytics(message, textBlock, !!editing);
60
-
61
90
  return (
62
91
  <MessageRoot {...messageMetadata} classNames={[hoverableControls, hoverableFocusedWithinControls]}>
63
92
  <MessageHeading authorName={messageMetadata.authorName} timestamp={messageMetadata.timestamp}>
@@ -80,7 +109,7 @@ export const MessageContainer = ({
80
109
  variant='ghost'
81
110
  icon='ph--check--regular'
82
111
  iconOnly
83
- label={t('accept proposal label')}
112
+ label={t('accept-proposal.label')}
84
113
  classNames={[buttonClassNames, hoverableControlItem]}
85
114
  onClick={handleAcceptProposal}
86
115
  />
@@ -91,23 +120,25 @@ export const MessageContainer = ({
91
120
  variant='ghost'
92
121
  icon='ph--x--regular'
93
122
  iconOnly
94
- label={t('delete message label')}
123
+ label={t('delete-message.label')}
95
124
  classNames={[buttonClassNames, hoverableControlItem]}
96
125
  onClick={handleDelete}
97
126
  />
98
127
  )}
99
128
  </div>
100
129
  </MessageHeading>
101
- {textBlock && <TextboxBlock block={textBlock} isAuthor={userIsAuthor} editing={editing} />}
130
+ {textBlock && (
131
+ <TextboxBlock block={textBlock} isAuthor={userIsAuthor} editing={editing} onSave={handleTextBlockChange} />
132
+ )}
102
133
  {proposalBlock && <ProposalBlock block={proposalBlock} />}
103
134
  {Ref.Array.targets(references).map((reference, index) => (
104
- <MessagePart key={index} part={reference} />
135
+ <MessagePart key={index} part={reference as Obj.Unknown} />
105
136
  ))}
106
137
  </MessageRoot>
107
138
  );
108
139
  };
109
140
 
110
- const MessagePart = ({ part }: { part: Type.Expando }) => {
141
+ const MessagePart = ({ part }: { part: Obj.Unknown }) => {
111
142
  return <MessageBlockObjectTile subject={part} />;
112
143
  };
113
144
 
@@ -115,11 +146,13 @@ const TextboxBlock = ({
115
146
  block,
116
147
  isAuthor,
117
148
  editing,
149
+ onSave,
118
150
  }: {
119
- block: DataType.MessageBlock.Text;
151
+ block: ContentBlock.Text;
120
152
  editing?: boolean;
121
153
  isAuthor?: boolean;
122
154
  identity?: Identity;
155
+ onSave?: (newText: string) => void;
123
156
  }) => {
124
157
  const { themeMode } = useThemeContext();
125
158
  const inMemoryContentRef = useRef(block.text);
@@ -129,8 +162,8 @@ const TextboxBlock = ({
129
162
  }, []);
130
163
 
131
164
  const saveDocumentChange = useCallback(() => {
132
- block.text = inMemoryContentRef.current;
133
- }, [block]);
165
+ onSave?.(inMemoryContentRef.current);
166
+ }, [onSave]);
134
167
 
135
168
  useOnTransition(editing, true, false, saveDocumentChange);
136
169
 
@@ -155,18 +188,18 @@ const TextboxBlock = ({
155
188
  editing && view?.focus();
156
189
  }, [editing, view]);
157
190
 
158
- return <div role='none' ref={parentRef} className='mie-4' {...focusAttributes} />;
191
+ return <div role='none' ref={parentRef} className='me-4' {...focusAttributes} />;
159
192
  };
160
193
 
161
- const ProposalBlock = ({ block }: { block: DataType.MessageBlock.Proposal }) => {
194
+ const ProposalBlock = ({ block }: { block: ContentBlock.Proposal }) => {
162
195
  return (
163
- <div role='none' className='mie-4 italic'>
196
+ <div role='none' className='me-4 italic'>
164
197
  {block.text}
165
198
  </div>
166
199
  );
167
200
  };
168
201
 
169
- const MessageBlockObjectTile = forwardRef<HTMLDivElement, { subject: Obj.Any }>(({ subject }, forwardedRef) => {
202
+ const MessageBlockObjectTile = forwardRef<HTMLDivElement, { subject: Obj.Unknown }>(({ subject }, forwardedRef) => {
170
203
  // TODO(burdon): Use annotation to get title.
171
204
  let title = (subject as any).name ?? (subject as any).title ?? (subject as any).type ?? 'Object';
172
205
  if (typeof title !== 'string') {
@@ -174,12 +207,16 @@ const MessageBlockObjectTile = forwardRef<HTMLDivElement, { subject: Obj.Any }>(
174
207
  }
175
208
 
176
209
  return (
177
- <div
178
- role='group'
210
+ <Card.Root
179
211
  className={mx('grid col-span-3 py-1 pr-4', hoverableControls, hoverableFocusedWithinControls)}
180
212
  ref={forwardedRef}
181
213
  >
182
- <Surface role='card' limit={1} data={{ subject }} fallback={title} />
183
- </div>
214
+ <Surface.Surface
215
+ type={AppSurface.Card}
216
+ limit={1}
217
+ data={{ subject } satisfies AppSurface.ObjectCardData}
218
+ fallback={title}
219
+ />
220
+ </Card.Root>
184
221
  );
185
222
  });
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ export * from './MessagePanel';