@dxos/plugin-thread 0.8.4-main.abd8ff62ef → 0.8.4-main.bc2380dfbc

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 (431) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +1 -1
  3. package/dist/lib/neutral/ChannelArticle-ACZD7YFT.mjs +28 -0
  4. package/dist/lib/neutral/ChannelArticle-ACZD7YFT.mjs.map +7 -0
  5. package/dist/lib/neutral/ChannelChat-6YTD5HWL.mjs +10 -0
  6. package/dist/lib/neutral/ThreadCompanion-NQWPS2H6.mjs +208 -0
  7. package/dist/lib/neutral/ThreadCompanion-NQWPS2H6.mjs.map +7 -0
  8. package/dist/lib/neutral/ThreadContainer-XYEPEOSD.mjs +61 -0
  9. package/dist/lib/neutral/ThreadContainer-XYEPEOSD.mjs.map +7 -0
  10. package/dist/lib/neutral/ThreadPlugin.mjs +80 -0
  11. package/dist/lib/neutral/ThreadPlugin.mjs.map +7 -0
  12. package/dist/lib/neutral/ThreadPlugin.node.mjs +40 -0
  13. package/dist/lib/neutral/ThreadPlugin.node.mjs.map +7 -0
  14. package/dist/lib/neutral/ThreadPlugin.workerd.mjs +24 -0
  15. package/dist/lib/neutral/ThreadPlugin.workerd.mjs.map +7 -0
  16. package/dist/lib/neutral/ThreadSettings-5MKTDK3A.mjs +15 -0
  17. package/dist/lib/neutral/ThreadSettings-5MKTDK3A.mjs.map +7 -0
  18. package/dist/lib/{browser/add-message-LRVGIHDH.mjs → neutral/add-message-FBIROBEZ.mjs} +8 -10
  19. package/dist/lib/neutral/add-message-FBIROBEZ.mjs.map +7 -0
  20. package/dist/lib/neutral/app-graph-builder-7Q6MA6RT.mjs +120 -0
  21. package/dist/lib/neutral/app-graph-builder-7Q6MA6RT.mjs.map +7 -0
  22. package/dist/lib/{browser/append-channel-message-CO3M6FSA.mjs → neutral/append-channel-message-FTFAD3PK.mjs} +5 -5
  23. package/dist/lib/neutral/append-channel-message-FTFAD3PK.mjs.map +7 -0
  24. package/dist/lib/neutral/blueprint-definition-S3EBOH4R.mjs +15 -0
  25. package/dist/lib/neutral/blueprint-definition-S3EBOH4R.mjs.map +7 -0
  26. package/dist/lib/neutral/blueprints/index.mjs +8 -0
  27. package/dist/lib/neutral/capabilities/index.mjs +25 -0
  28. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  29. package/dist/lib/{browser/blueprints/index.mjs → neutral/chunk-5T5LPLBN.mjs} +4 -5
  30. package/dist/lib/neutral/chunk-5T5LPLBN.mjs.map +7 -0
  31. package/dist/lib/neutral/chunk-7GHUS3IX.mjs +20 -0
  32. package/dist/lib/neutral/chunk-7GHUS3IX.mjs.map +7 -0
  33. package/dist/lib/neutral/chunk-D5LGFCUY.mjs +55 -0
  34. package/dist/lib/neutral/chunk-D5LGFCUY.mjs.map +7 -0
  35. package/dist/lib/neutral/chunk-JLY4NVTA.mjs +38 -0
  36. package/dist/lib/neutral/chunk-JLY4NVTA.mjs.map +7 -0
  37. package/dist/lib/neutral/chunk-KRXHIW4P.mjs +164 -0
  38. package/dist/lib/neutral/chunk-KRXHIW4P.mjs.map +7 -0
  39. package/dist/lib/{browser/chunk-TPNZ43NB.mjs → neutral/chunk-PE7IH7EL.mjs} +86 -73
  40. package/dist/lib/neutral/chunk-PE7IH7EL.mjs.map +7 -0
  41. package/dist/lib/neutral/chunk-QFDT33VT.mjs +69 -0
  42. package/dist/lib/neutral/chunk-QFDT33VT.mjs.map +7 -0
  43. package/dist/lib/neutral/chunk-QMLVLKE3.mjs +8 -0
  44. package/dist/lib/neutral/chunk-QMLVLKE3.mjs.map +7 -0
  45. package/dist/lib/neutral/components/index.mjs +539 -0
  46. package/dist/lib/neutral/components/index.mjs.map +7 -0
  47. package/dist/lib/neutral/containers/index.mjs +15 -0
  48. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  49. package/dist/lib/{browser/create-BTGLHLBA.mjs → neutral/create-OAQJ6LXN.mjs} +7 -10
  50. package/dist/lib/neutral/create-OAQJ6LXN.mjs.map +7 -0
  51. package/dist/lib/{browser/create-channel-ZXKSLHGN.mjs → neutral/create-channel-3E4FJ662.mjs} +4 -4
  52. package/dist/lib/neutral/create-channel-3E4FJ662.mjs.map +7 -0
  53. package/dist/lib/neutral/create-object-HIEWSBZB.mjs +27 -0
  54. package/dist/lib/neutral/create-object-HIEWSBZB.mjs.map +7 -0
  55. package/dist/lib/{browser/create-proposals-AV5CREPV.mjs → neutral/create-proposals-GRYZXRMV.mjs} +4 -4
  56. package/dist/lib/neutral/create-proposals-GRYZXRMV.mjs.map +7 -0
  57. package/dist/lib/{browser/delete-GLYEP7NE.mjs → neutral/delete-HCCG5RVR.mjs} +7 -9
  58. package/dist/lib/neutral/delete-HCCG5RVR.mjs.map +7 -0
  59. package/dist/lib/{browser/delete-message-RQ72ZY5D.mjs → neutral/delete-message-DHFRACB4.mjs} +6 -7
  60. package/dist/lib/neutral/delete-message-DHFRACB4.mjs.map +7 -0
  61. package/dist/lib/neutral/hooks/index.mjs +10 -0
  62. package/dist/lib/neutral/index.mjs +28 -0
  63. package/dist/lib/neutral/index.mjs.map +7 -0
  64. package/dist/lib/neutral/markdown-BUORNCPG.mjs +83 -0
  65. package/dist/lib/neutral/markdown-BUORNCPG.mjs.map +7 -0
  66. package/dist/lib/neutral/meta.json +1 -0
  67. package/dist/lib/neutral/meta.mjs +10 -0
  68. package/dist/lib/neutral/meta.mjs.map +7 -0
  69. package/dist/lib/{browser/on-create-space-SPE3QVFZ.mjs → neutral/on-create-space-OEBRKOAM.mjs} +5 -6
  70. package/dist/lib/neutral/on-create-space-OEBRKOAM.mjs.map +7 -0
  71. package/dist/lib/neutral/operation-handler-RU6K2S4L.mjs +13 -0
  72. package/dist/lib/neutral/operation-handler-RU6K2S4L.mjs.map +7 -0
  73. package/dist/lib/neutral/operations/index.mjs +8 -0
  74. package/dist/lib/neutral/operations/index.mjs.map +7 -0
  75. package/dist/lib/neutral/plugin.mjs +16 -0
  76. package/dist/lib/neutral/plugin.mjs.map +7 -0
  77. package/dist/lib/neutral/react-surface-XY23GVZH.mjs +76 -0
  78. package/dist/lib/neutral/react-surface-XY23GVZH.mjs.map +7 -0
  79. package/dist/lib/{browser/restore-VX7FLZOZ.mjs → neutral/restore-P4ZLXLF7.mjs} +5 -5
  80. package/dist/lib/neutral/restore-P4ZLXLF7.mjs.map +7 -0
  81. package/dist/lib/{browser/restore-message-D65NSWUA.mjs → neutral/restore-message-AUBOP2DF.mjs} +5 -5
  82. package/dist/lib/neutral/restore-message-AUBOP2DF.mjs.map +7 -0
  83. package/dist/lib/{browser/select-AT4L7EBU.mjs → neutral/select-LIVAMBCE.mjs} +6 -8
  84. package/dist/lib/neutral/select-LIVAMBCE.mjs.map +7 -0
  85. package/dist/lib/neutral/settings-HK4EB6TF.mjs +30 -0
  86. package/dist/lib/neutral/settings-HK4EB6TF.mjs.map +7 -0
  87. package/dist/lib/neutral/state-UU7VEAKV.mjs +22 -0
  88. package/dist/lib/neutral/state-UU7VEAKV.mjs.map +7 -0
  89. package/dist/lib/neutral/testing/index.mjs +58 -0
  90. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  91. package/dist/lib/{browser/toggle-resolved-JD3D4WBZ.mjs → neutral/toggle-resolved-RQBDQZSV.mjs} +5 -5
  92. package/dist/lib/neutral/toggle-resolved-RQBDQZSV.mjs.map +7 -0
  93. package/dist/lib/{browser → neutral}/translations.mjs +2 -2
  94. package/dist/lib/neutral/translations.mjs.map +7 -0
  95. package/dist/lib/neutral/types/index.mjs +12 -0
  96. package/dist/lib/neutral/types/index.mjs.map +7 -0
  97. package/dist/lib/neutral/undo-mappings-HOKL2L3M.mjs +54 -0
  98. package/dist/lib/neutral/undo-mappings-HOKL2L3M.mjs.map +7 -0
  99. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  100. package/dist/types/src/ThreadPlugin.node.d.ts.map +1 -1
  101. package/dist/types/src/ThreadPlugin.workerd.d.ts +4 -0
  102. package/dist/types/src/ThreadPlugin.workerd.d.ts.map +1 -0
  103. package/dist/types/src/capabilities/create-object.d.ts +11 -0
  104. package/dist/types/src/capabilities/create-object.d.ts.map +1 -0
  105. package/dist/types/src/capabilities/index.d.ts +7 -6
  106. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  107. package/dist/types/src/capabilities/markdown.d.ts +1 -1
  108. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  109. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  110. package/dist/types/src/components/Chat/Chat.d.ts +8 -1
  111. package/dist/types/src/components/Chat/Chat.d.ts.map +1 -1
  112. package/dist/types/src/components/CommentsPanel/CommentsThread.d.ts.map +1 -1
  113. package/dist/types/src/components/MessagePanel/MessagePanel.d.ts.map +1 -1
  114. package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts.map +1 -1
  115. package/dist/types/src/components/index.d.ts +0 -1
  116. package/dist/types/src/components/index.d.ts.map +1 -1
  117. package/dist/types/src/containers/ChannelArticle/ChannelArticle.d.ts +13 -0
  118. package/dist/types/src/containers/ChannelArticle/ChannelArticle.d.ts.map +1 -0
  119. package/dist/types/src/containers/{ChannelContainer/ChannelContainer.stories.d.ts → ChannelArticle/ChannelArticle.stories.d.ts} +4 -4
  120. package/dist/types/src/containers/ChannelArticle/ChannelArticle.stories.d.ts.map +1 -0
  121. package/dist/types/src/containers/ChannelArticle/index.d.ts +2 -0
  122. package/dist/types/src/containers/{CallDebugPanel → ChannelArticle}/index.d.ts.map +1 -1
  123. package/dist/types/src/containers/ChannelChat/ChannelChat.d.ts +4 -0
  124. package/dist/types/src/containers/ChannelChat/ChannelChat.d.ts.map +1 -1
  125. package/dist/types/src/containers/ThreadCompanion/ThreadCompanion.d.ts.map +1 -1
  126. package/dist/types/src/containers/index.d.ts +1 -3
  127. package/dist/types/src/containers/index.d.ts.map +1 -1
  128. package/dist/types/src/extensions/threads.d.ts +1 -1
  129. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  130. package/dist/types/src/hooks/index.d.ts +0 -4
  131. package/dist/types/src/hooks/index.d.ts.map +1 -1
  132. package/dist/types/src/index.d.ts +3 -5
  133. package/dist/types/src/index.d.ts.map +1 -1
  134. package/dist/types/src/meta.d.ts.map +1 -1
  135. package/dist/types/src/operations/add-message.d.ts +2 -2
  136. package/dist/types/src/operations/add-message.d.ts.map +1 -1
  137. package/dist/types/src/operations/append-channel-message.d.ts +2 -2
  138. package/dist/types/src/operations/append-channel-message.d.ts.map +1 -1
  139. package/dist/types/src/operations/create-channel.d.ts +2 -2
  140. package/dist/types/src/operations/create-channel.d.ts.map +1 -1
  141. package/dist/types/src/operations/create-proposals.d.ts +2 -2
  142. package/dist/types/src/operations/create-proposals.d.ts.map +1 -1
  143. package/dist/types/src/operations/create.d.ts +2 -2
  144. package/dist/types/src/operations/create.d.ts.map +1 -1
  145. package/dist/types/src/operations/delete-message.d.ts +2 -2
  146. package/dist/types/src/operations/delete-message.d.ts.map +1 -1
  147. package/dist/types/src/operations/delete.d.ts +2 -2
  148. package/dist/types/src/operations/delete.d.ts.map +1 -1
  149. package/dist/types/src/operations/index.d.ts +0 -1
  150. package/dist/types/src/operations/index.d.ts.map +1 -1
  151. package/dist/types/src/operations/on-create-space.d.ts +2 -2
  152. package/dist/types/src/operations/on-create-space.d.ts.map +1 -1
  153. package/dist/types/src/operations/restore-message.d.ts +2 -2
  154. package/dist/types/src/operations/restore-message.d.ts.map +1 -1
  155. package/dist/types/src/operations/restore.d.ts +2 -2
  156. package/dist/types/src/operations/restore.d.ts.map +1 -1
  157. package/dist/types/src/operations/select.d.ts +2 -2
  158. package/dist/types/src/operations/select.d.ts.map +1 -1
  159. package/dist/types/src/operations/toggle-resolved.d.ts +2 -2
  160. package/dist/types/src/operations/toggle-resolved.d.ts.map +1 -1
  161. package/dist/types/src/plugin.d.ts +4 -0
  162. package/dist/types/src/plugin.d.ts.map +1 -0
  163. package/dist/types/src/translations.d.ts.map +1 -1
  164. package/dist/types/src/types/ThreadCapabilities.d.ts +13 -0
  165. package/dist/types/src/types/ThreadCapabilities.d.ts.map +1 -0
  166. package/dist/types/src/{operations/definitions.d.ts → types/ThreadOperation.d.ts} +1 -1
  167. package/dist/types/src/types/ThreadOperation.d.ts.map +1 -0
  168. package/dist/types/src/types/index.d.ts +3 -1
  169. package/dist/types/src/types/index.d.ts.map +1 -1
  170. package/dist/types/src/types/types.d.ts +1 -1
  171. package/dist/types/src/types/types.d.ts.map +1 -1
  172. package/dist/types/src/util.d.ts +4 -1
  173. package/dist/types/src/util.d.ts.map +1 -1
  174. package/dist/types/tsconfig.tsbuildinfo +1 -1
  175. package/package.json +123 -99
  176. package/src/ThreadPlugin.node.ts +5 -50
  177. package/src/ThreadPlugin.test.ts +3 -3
  178. package/src/ThreadPlugin.tsx +6 -59
  179. package/src/ThreadPlugin.workerd.ts +20 -0
  180. package/src/blueprints/thread-blueprint.ts +1 -1
  181. package/src/capabilities/app-graph-builder.ts +18 -69
  182. package/src/capabilities/create-object.ts +29 -0
  183. package/src/capabilities/index.ts +1 -2
  184. package/src/capabilities/markdown.ts +1 -1
  185. package/src/capabilities/react-surface.tsx +4 -26
  186. package/src/capabilities/settings.ts +1 -3
  187. package/src/capabilities/undo-mappings.ts +1 -1
  188. package/src/components/Chat/Chat.tsx +52 -12
  189. package/src/components/CommentsPanel/CommentsPanel.stories.tsx +1 -1
  190. package/src/components/CommentsPanel/CommentsPanel.tsx +4 -4
  191. package/src/components/CommentsPanel/CommentsThread.tsx +2 -3
  192. package/src/components/MessagePanel/MessagePanel.tsx +7 -8
  193. package/src/components/ThreadSettings/ThreadSettings.tsx +0 -1
  194. package/src/components/index.ts +0 -1
  195. package/src/containers/{ChannelContainer/ChannelContainer.stories.tsx → ChannelArticle/ChannelArticle.stories.tsx} +10 -10
  196. package/src/containers/ChannelArticle/ChannelArticle.tsx +42 -0
  197. package/src/containers/ChannelArticle/index.ts +5 -0
  198. package/src/containers/ChannelChat/ChannelChat.tsx +12 -2
  199. package/src/containers/ThreadCompanion/ThreadCompanion.tsx +10 -12
  200. package/src/containers/index.ts +1 -3
  201. package/src/extensions/command.ts +1 -1
  202. package/src/extensions/threads.ts +2 -2
  203. package/src/hooks/analytics.ts +1 -1
  204. package/src/hooks/index.ts +0 -5
  205. package/src/index.ts +3 -10
  206. package/src/meta.ts +1 -2
  207. package/src/operations/add-message.ts +4 -4
  208. package/src/operations/append-channel-message.ts +20 -19
  209. package/src/operations/create-channel.ts +2 -2
  210. package/src/operations/create-proposals.ts +2 -2
  211. package/src/operations/create.ts +3 -3
  212. package/src/operations/delete-message.ts +4 -4
  213. package/src/operations/delete.ts +3 -3
  214. package/src/operations/index.ts +0 -2
  215. package/src/operations/on-create-space.ts +3 -3
  216. package/src/operations/restore-message.ts +3 -3
  217. package/src/operations/restore.ts +3 -3
  218. package/src/operations/select.ts +2 -2
  219. package/src/operations/toggle-resolved.ts +3 -3
  220. package/src/plugin.ts +11 -0
  221. package/src/translations.ts +2 -2
  222. package/src/types/ThreadCapabilities.ts +26 -0
  223. package/src/{operations/definitions.ts → types/ThreadOperation.ts} +5 -4
  224. package/src/types/index.ts +4 -1
  225. package/src/types/types.ts +0 -2
  226. package/src/util.ts +36 -4
  227. package/dist/lib/browser/add-message-LRVGIHDH.mjs.map +0 -7
  228. package/dist/lib/browser/append-channel-message-CO3M6FSA.mjs.map +0 -7
  229. package/dist/lib/browser/blueprints/index.mjs.map +0 -7
  230. package/dist/lib/browser/chunk-E4GG3NX2.mjs +0 -29
  231. package/dist/lib/browser/chunk-E4GG3NX2.mjs.map +0 -7
  232. package/dist/lib/browser/chunk-TPNZ43NB.mjs.map +0 -7
  233. package/dist/lib/browser/create-BTGLHLBA.mjs.map +0 -7
  234. package/dist/lib/browser/create-channel-ZXKSLHGN.mjs.map +0 -7
  235. package/dist/lib/browser/create-proposals-AV5CREPV.mjs.map +0 -7
  236. package/dist/lib/browser/delete-GLYEP7NE.mjs.map +0 -7
  237. package/dist/lib/browser/delete-message-RQ72ZY5D.mjs.map +0 -7
  238. package/dist/lib/browser/index.mjs +0 -1821
  239. package/dist/lib/browser/index.mjs.map +0 -7
  240. package/dist/lib/browser/meta.json +0 -1
  241. package/dist/lib/browser/on-create-space-SPE3QVFZ.mjs.map +0 -7
  242. package/dist/lib/browser/operations/index.mjs +0 -13
  243. package/dist/lib/browser/operations/index.mjs.map +0 -7
  244. package/dist/lib/browser/restore-VX7FLZOZ.mjs.map +0 -7
  245. package/dist/lib/browser/restore-message-D65NSWUA.mjs.map +0 -7
  246. package/dist/lib/browser/select-AT4L7EBU.mjs.map +0 -7
  247. package/dist/lib/browser/toggle-resolved-JD3D4WBZ.mjs.map +0 -7
  248. package/dist/lib/browser/translations.mjs.map +0 -7
  249. package/dist/lib/browser/types/index.mjs +0 -10
  250. package/dist/lib/node-esm/add-message-4EAQ2ZPI.mjs +0 -90
  251. package/dist/lib/node-esm/add-message-4EAQ2ZPI.mjs.map +0 -7
  252. package/dist/lib/node-esm/append-channel-message-F7KGBSWP.mjs +0 -41
  253. package/dist/lib/node-esm/append-channel-message-F7KGBSWP.mjs.map +0 -7
  254. package/dist/lib/node-esm/blueprints/index.mjs +0 -38
  255. package/dist/lib/node-esm/blueprints/index.mjs.map +0 -7
  256. package/dist/lib/node-esm/chunk-BVEZBGIY.mjs +0 -30
  257. package/dist/lib/node-esm/chunk-BVEZBGIY.mjs.map +0 -7
  258. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +0 -11
  259. package/dist/lib/node-esm/chunk-XKUMDYGR.mjs +0 -259
  260. package/dist/lib/node-esm/chunk-XKUMDYGR.mjs.map +0 -7
  261. package/dist/lib/node-esm/create-DEZFPN2Y.mjs +0 -56
  262. package/dist/lib/node-esm/create-DEZFPN2Y.mjs.map +0 -7
  263. package/dist/lib/node-esm/create-channel-6VHTC2OR.mjs +0 -20
  264. package/dist/lib/node-esm/create-channel-6VHTC2OR.mjs.map +0 -7
  265. package/dist/lib/node-esm/create-proposals-P5O2ICOL.mjs +0 -57
  266. package/dist/lib/node-esm/create-proposals-P5O2ICOL.mjs.map +0 -7
  267. package/dist/lib/node-esm/delete-QG45QLPY.mjs +0 -60
  268. package/dist/lib/node-esm/delete-QG45QLPY.mjs.map +0 -7
  269. package/dist/lib/node-esm/delete-message-PGNLB6TL.mjs +0 -56
  270. package/dist/lib/node-esm/delete-message-PGNLB6TL.mjs.map +0 -7
  271. package/dist/lib/node-esm/index.mjs +0 -1822
  272. package/dist/lib/node-esm/index.mjs.map +0 -7
  273. package/dist/lib/node-esm/meta.json +0 -1
  274. package/dist/lib/node-esm/on-create-space-TFBSHWQ4.mjs +0 -25
  275. package/dist/lib/node-esm/on-create-space-TFBSHWQ4.mjs.map +0 -7
  276. package/dist/lib/node-esm/operations/index.mjs +0 -14
  277. package/dist/lib/node-esm/operations/index.mjs.map +0 -7
  278. package/dist/lib/node-esm/restore-E27OAIFJ.mjs +0 -33
  279. package/dist/lib/node-esm/restore-E27OAIFJ.mjs.map +0 -7
  280. package/dist/lib/node-esm/restore-message-J3CH6NGI.mjs +0 -34
  281. package/dist/lib/node-esm/restore-message-J3CH6NGI.mjs.map +0 -7
  282. package/dist/lib/node-esm/select-UU6Q2XAB.mjs +0 -27
  283. package/dist/lib/node-esm/select-UU6Q2XAB.mjs.map +0 -7
  284. package/dist/lib/node-esm/toggle-resolved-VS6NKXL3.mjs +0 -37
  285. package/dist/lib/node-esm/toggle-resolved-VS6NKXL3.mjs.map +0 -7
  286. package/dist/lib/node-esm/translations.mjs +0 -91
  287. package/dist/lib/node-esm/translations.mjs.map +0 -7
  288. package/dist/lib/node-esm/types/index.mjs +0 -11
  289. package/dist/types/src/calls/call-manager.d.ts +0 -87
  290. package/dist/types/src/calls/call-manager.d.ts.map +0 -1
  291. package/dist/types/src/calls/call-swarm-synchronizer.d.ts +0 -66
  292. package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +0 -1
  293. package/dist/types/src/calls/index.d.ts +0 -7
  294. package/dist/types/src/calls/index.d.ts.map +0 -1
  295. package/dist/types/src/calls/media-manager.d.ts +0 -60
  296. package/dist/types/src/calls/media-manager.d.ts.map +0 -1
  297. package/dist/types/src/calls/speaking-monitor.d.ts +0 -21
  298. package/dist/types/src/calls/speaking-monitor.d.ts.map +0 -1
  299. package/dist/types/src/calls/types.d.ts +0 -45
  300. package/dist/types/src/calls/types.d.ts.map +0 -1
  301. package/dist/types/src/calls/util/audio.d.ts +0 -6
  302. package/dist/types/src/calls/util/audio.d.ts.map +0 -1
  303. package/dist/types/src/calls/util/calls-service.d.ts +0 -77
  304. package/dist/types/src/calls/util/calls-service.d.ts.map +0 -1
  305. package/dist/types/src/calls/util/history-cache.d.ts +0 -11
  306. package/dist/types/src/calls/util/history-cache.d.ts.map +0 -1
  307. package/dist/types/src/calls/util/index.d.ts +0 -5
  308. package/dist/types/src/calls/util/index.d.ts.map +0 -1
  309. package/dist/types/src/calls/util/media.d.ts +0 -6
  310. package/dist/types/src/calls/util/media.d.ts.map +0 -1
  311. package/dist/types/src/calls/util/stub-media-streams.d.ts +0 -18
  312. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +0 -1
  313. package/dist/types/src/calls/util/task-scheduling.d.ts +0 -17
  314. package/dist/types/src/calls/util/task-scheduling.d.ts.map +0 -1
  315. package/dist/types/src/calls-service.stories.d.ts +0 -23
  316. package/dist/types/src/calls-service.stories.d.ts.map +0 -1
  317. package/dist/types/src/capabilities/call-manager.d.ts +0 -6
  318. package/dist/types/src/capabilities/call-manager.d.ts.map +0 -1
  319. package/dist/types/src/capabilities/react-root.d.ts +0 -9
  320. package/dist/types/src/capabilities/react-root.d.ts.map +0 -1
  321. package/dist/types/src/components/Call/Call.d.ts +0 -45
  322. package/dist/types/src/components/Call/Call.d.ts.map +0 -1
  323. package/dist/types/src/components/Call/Toolbar.d.ts +0 -16
  324. package/dist/types/src/components/Call/Toolbar.d.ts.map +0 -1
  325. package/dist/types/src/components/Call/index.d.ts +0 -3
  326. package/dist/types/src/components/Call/index.d.ts.map +0 -1
  327. package/dist/types/src/components/Lobby/Lobby.d.ts +0 -36
  328. package/dist/types/src/components/Lobby/Lobby.d.ts.map +0 -1
  329. package/dist/types/src/components/Lobby/index.d.ts +0 -2
  330. package/dist/types/src/components/Lobby/index.d.ts.map +0 -1
  331. package/dist/types/src/components/Media/AudioStream.d.ts +0 -6
  332. package/dist/types/src/components/Media/AudioStream.d.ts.map +0 -1
  333. package/dist/types/src/components/Media/VideoObject.d.ts +0 -15
  334. package/dist/types/src/components/Media/VideoObject.d.ts.map +0 -1
  335. package/dist/types/src/components/Media/VideoObject.stories.d.ts +0 -22
  336. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +0 -1
  337. package/dist/types/src/components/Media/index.d.ts +0 -3
  338. package/dist/types/src/components/Media/index.d.ts.map +0 -1
  339. package/dist/types/src/components/Participant/Participant.d.ts +0 -6
  340. package/dist/types/src/components/Participant/Participant.d.ts.map +0 -1
  341. package/dist/types/src/components/Participant/ParticipantGrid.d.ts +0 -11
  342. package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +0 -1
  343. package/dist/types/src/components/Participant/index.d.ts +0 -3
  344. package/dist/types/src/components/Participant/index.d.ts.map +0 -1
  345. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts +0 -32
  346. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts.map +0 -1
  347. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +0 -178
  348. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +0 -1
  349. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts +0 -21
  350. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +0 -1
  351. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.d.ts +0 -12
  352. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.d.ts.map +0 -1
  353. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.stories.d.ts +0 -164
  354. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.stories.d.ts.map +0 -1
  355. package/dist/types/src/components/ResponsiveGrid/index.d.ts +0 -4
  356. package/dist/types/src/components/ResponsiveGrid/index.d.ts.map +0 -1
  357. package/dist/types/src/containers/CallDebugPanel/CallDebugPanel.d.ts +0 -15
  358. package/dist/types/src/containers/CallDebugPanel/CallDebugPanel.d.ts.map +0 -1
  359. package/dist/types/src/containers/CallDebugPanel/index.d.ts +0 -2
  360. package/dist/types/src/containers/CallSidebar/CallSidebar.d.ts +0 -3
  361. package/dist/types/src/containers/CallSidebar/CallSidebar.d.ts.map +0 -1
  362. package/dist/types/src/containers/CallSidebar/index.d.ts +0 -2
  363. package/dist/types/src/containers/CallSidebar/index.d.ts.map +0 -1
  364. package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts +0 -12
  365. package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts.map +0 -1
  366. package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts.map +0 -1
  367. package/dist/types/src/containers/ChannelContainer/index.d.ts +0 -2
  368. package/dist/types/src/containers/ChannelContainer/index.d.ts.map +0 -1
  369. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts +0 -2
  370. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts.map +0 -1
  371. package/dist/types/src/hooks/useDebugMode.d.ts +0 -2
  372. package/dist/types/src/hooks/useDebugMode.d.ts.map +0 -1
  373. package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts +0 -2
  374. package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts.map +0 -1
  375. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +0 -3
  376. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +0 -1
  377. package/dist/types/src/operations/definitions.d.ts.map +0 -1
  378. package/dist/types/src/types/capabilities.d.ts +0 -25
  379. package/dist/types/src/types/capabilities.d.ts.map +0 -1
  380. package/src/calls/call-manager.ts +0 -270
  381. package/src/calls/call-swarm-synchronizer.ts +0 -350
  382. package/src/calls/index.ts +0 -10
  383. package/src/calls/media-manager.ts +0 -378
  384. package/src/calls/speaking-monitor.ts +0 -85
  385. package/src/calls/types.ts +0 -74
  386. package/src/calls/util/audio.ts +0 -58
  387. package/src/calls/util/calls-service.ts +0 -582
  388. package/src/calls/util/history-cache.ts +0 -27
  389. package/src/calls/util/index.ts +0 -8
  390. package/src/calls/util/media.ts +0 -52
  391. package/src/calls/util/stub-media-streams.ts +0 -129
  392. package/src/calls/util/task-scheduling.ts +0 -92
  393. package/src/calls-service.stories.tsx +0 -230
  394. package/src/capabilities/call-manager.ts +0 -27
  395. package/src/capabilities/react-root.tsx +0 -20
  396. package/src/components/Call/Call.tsx +0 -93
  397. package/src/components/Call/Toolbar.tsx +0 -199
  398. package/src/components/Call/index.ts +0 -6
  399. package/src/components/Lobby/Lobby.tsx +0 -123
  400. package/src/components/Lobby/index.ts +0 -5
  401. package/src/components/Media/AudioStream.tsx +0 -67
  402. package/src/components/Media/VideoObject.stories.tsx +0 -59
  403. package/src/components/Media/VideoObject.tsx +0 -58
  404. package/src/components/Media/index.ts +0 -6
  405. package/src/components/Participant/Participant.tsx +0 -77
  406. package/src/components/Participant/ParticipantGrid.tsx +0 -88
  407. package/src/components/Participant/index.ts +0 -6
  408. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +0 -158
  409. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +0 -341
  410. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +0 -134
  411. package/src/components/ResponsiveGrid/ResponsivePanel.stories.tsx +0 -54
  412. package/src/components/ResponsiveGrid/ResponsivePanel.tsx +0 -31
  413. package/src/components/ResponsiveGrid/index.ts +0 -7
  414. package/src/containers/CallDebugPanel/CallDebugPanel.tsx +0 -173
  415. package/src/containers/CallDebugPanel/index.ts +0 -5
  416. package/src/containers/CallSidebar/CallSidebar.tsx +0 -18
  417. package/src/containers/CallSidebar/index.ts +0 -5
  418. package/src/containers/ChannelContainer/ChannelContainer.tsx +0 -223
  419. package/src/containers/ChannelContainer/index.ts +0 -5
  420. package/src/hooks/useBlackCanvasStreamTrack.tsx +0 -27
  421. package/src/hooks/useDebugMode.ts +0 -25
  422. package/src/hooks/useInaudibleAudioStreamTrack.tsx +0 -27
  423. package/src/hooks/useVideoStreamTrack.tsx +0 -36
  424. package/src/types/capabilities.ts +0 -37
  425. package/src/typings/peermetrics-webrtc-stats.d.ts +0 -46
  426. package/src/typings.d.ts +0 -8
  427. /package/dist/lib/{browser/chunk-J5LGTIGS.mjs.map → neutral/ChannelChat-6YTD5HWL.mjs.map} +0 -0
  428. /package/dist/lib/{browser/types → neutral/blueprints}/index.mjs.map +0 -0
  429. /package/dist/lib/{browser → neutral}/chunk-J5LGTIGS.mjs +0 -0
  430. /package/dist/lib/{node-esm/chunk-HSLMI22Q.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
  431. /package/dist/lib/{node-esm/types → neutral/hooks}/index.mjs.map +0 -0
@@ -0,0 +1,539 @@
1
+ import {
2
+ command
3
+ } from "../chunk-KRXHIW4P.mjs";
4
+ import {
5
+ getMessageMetadata
6
+ } from "../chunk-JLY4NVTA.mjs";
7
+ import "../chunk-J5LGTIGS.mjs";
8
+
9
+ // src/components/index.ts
10
+ import { lazy } from "react";
11
+
12
+ // src/components/Chat/Chat.tsx
13
+ import React2, { useLayoutEffect, useMemo, useRef as useRef2, useState as useState2 } from "react";
14
+ import { ScrollArea, useThemeContext as useThemeContext2, useTranslation as useTranslation2 } from "@dxos/react-ui";
15
+ import { MessageTextbox, Thread as ThreadComponent, threadLayout } from "@dxos/react-ui-thread";
16
+ import { createBasicExtensions as createBasicExtensions2, createThemeExtensions as createThemeExtensions2, listener } from "@dxos/ui-editor";
17
+ import { composable, composableProps, mx as mx2 } from "@dxos/ui-theme";
18
+ import { isNonNullable } from "@dxos/util";
19
+ import { meta as meta2 } from "#meta";
20
+
21
+ // src/components/MessagePanel/MessagePanel.tsx
22
+ import { EditorView } from "@codemirror/view";
23
+ import React, { forwardRef, useCallback, useEffect, useRef, useState } from "react";
24
+ import { Surface } from "@dxos/app-framework/ui";
25
+ import { AppSurface } from "@dxos/app-toolkit/ui";
26
+ import { Ref } from "@dxos/echo";
27
+ import { useObject } from "@dxos/echo-react";
28
+ import { PublicKey } from "@dxos/react-client";
29
+ import { useIdentity } from "@dxos/react-client/halo";
30
+ import { IconButton, useOnTransition, useThemeContext, useTranslation } from "@dxos/react-ui";
31
+ import { Card } from "@dxos/react-ui";
32
+ import { useTextEditor } from "@dxos/react-ui-editor";
33
+ import { MessageHeading, MessageRoot } from "@dxos/react-ui-thread";
34
+ import { createBasicExtensions, createThemeExtensions } from "@dxos/ui-editor";
35
+ import { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from "@dxos/ui-theme";
36
+ import { useOnEditAnalytics } from "#hooks";
37
+ import { meta } from "#meta";
38
+ var buttonGroupClassNames = "flex flex-row items-center gap-0.5 pe-2";
39
+ var buttonClassNames = "p-1! transition-opacity";
40
+ var MessagePanel = ({ message: messageOrRef, members, editable = false, onDelete, onAcceptProposal }) => {
41
+ const { t } = useTranslation(meta.id);
42
+ const [message, updateMessage] = useObject(messageOrRef);
43
+ const identity = useIdentity();
44
+ const [editing, setEditing] = useState(false);
45
+ const textBlockIndex = message?.blocks.findIndex((block) => block._tag === "text") ?? -1;
46
+ const handleEdit = useCallback(() => setEditing((editing2) => !editing2), []);
47
+ const handleDelete = useCallback(() => message && onDelete?.(message.id), [
48
+ message,
49
+ onDelete
50
+ ]);
51
+ const handleAcceptProposal = useCallback(() => message && onAcceptProposal?.(message.id), [
52
+ message,
53
+ onAcceptProposal
54
+ ]);
55
+ const handleTextBlockChange = useCallback((newText) => {
56
+ updateMessage((m) => {
57
+ const targetBlock = m.blocks[textBlockIndex];
58
+ if (targetBlock && targetBlock._tag === "text") {
59
+ targetBlock.text = newText;
60
+ }
61
+ });
62
+ }, [
63
+ updateMessage,
64
+ textBlockIndex
65
+ ]);
66
+ const textBlock = message && textBlockIndex !== -1 ? message.blocks[textBlockIndex] : void 0;
67
+ useOnEditAnalytics(message, textBlock, !!editing);
68
+ if (!message) {
69
+ return null;
70
+ }
71
+ const senderIdentity = members.find((member) => message.sender.identityDid && member.identity.did === message.sender.identityDid || message.sender.identityKey && PublicKey.equals(member.identity.identityKey, message.sender.identityKey))?.identity;
72
+ const messageMetadata = getMessageMetadata(message.id, senderIdentity, message.sender);
73
+ const userIsAuthor = identity?.did === messageMetadata.authorId;
74
+ const proposalBlock = message.blocks.find((block) => block._tag === "proposal");
75
+ const references = message.blocks.filter((block) => block._tag === "reference").map((block) => block.reference);
76
+ return /* @__PURE__ */ React.createElement(MessageRoot, {
77
+ ...messageMetadata,
78
+ classNames: [
79
+ hoverableControls,
80
+ hoverableFocusedWithinControls
81
+ ]
82
+ }, /* @__PURE__ */ React.createElement(MessageHeading, {
83
+ authorName: messageMetadata.authorName,
84
+ timestamp: messageMetadata.timestamp
85
+ }, /* @__PURE__ */ React.createElement("div", {
86
+ className: buttonGroupClassNames
87
+ }, userIsAuthor && editable && /* @__PURE__ */ React.createElement(IconButton, {
88
+ "data-testid": editing ? "thread.message.save" : "thread.message.edit",
89
+ variant: "ghost",
90
+ icon: editing ? "ph--check--regular" : "ph--pencil-simple--regular",
91
+ iconOnly: true,
92
+ label: t(editing ? "save-message.label" : "edit-message.label"),
93
+ classNames: [
94
+ buttonClassNames,
95
+ hoverableControlItem
96
+ ],
97
+ onClick: handleEdit
98
+ }), proposalBlock && onAcceptProposal && /* @__PURE__ */ React.createElement(IconButton, {
99
+ "data-testid": "thread.message.accept",
100
+ variant: "ghost",
101
+ icon: "ph--check--regular",
102
+ iconOnly: true,
103
+ label: t("accept-proposal.label"),
104
+ classNames: [
105
+ buttonClassNames,
106
+ hoverableControlItem
107
+ ],
108
+ onClick: handleAcceptProposal
109
+ }), onDelete && /* @__PURE__ */ React.createElement(IconButton, {
110
+ "data-testid": "thread.message.delete",
111
+ variant: "ghost",
112
+ icon: "ph--x--regular",
113
+ iconOnly: true,
114
+ label: t("delete-message.label"),
115
+ classNames: [
116
+ buttonClassNames,
117
+ hoverableControlItem
118
+ ],
119
+ onClick: handleDelete
120
+ }))), textBlock && /* @__PURE__ */ React.createElement(TextboxBlock, {
121
+ block: textBlock,
122
+ isAuthor: userIsAuthor,
123
+ editing,
124
+ onSave: handleTextBlockChange
125
+ }), proposalBlock && /* @__PURE__ */ React.createElement(ProposalBlock, {
126
+ block: proposalBlock
127
+ }), Ref.Array.targets(references).map((reference, index) => /* @__PURE__ */ React.createElement(MessagePart, {
128
+ key: index,
129
+ part: reference
130
+ })));
131
+ };
132
+ var MessagePart = ({ part }) => {
133
+ return /* @__PURE__ */ React.createElement(MessageBlockObjectTile, {
134
+ subject: part
135
+ });
136
+ };
137
+ var TextboxBlock = ({ block, isAuthor, editing, onSave }) => {
138
+ const { themeMode } = useThemeContext();
139
+ const inMemoryContentRef = useRef(block.text);
140
+ const handleDocumentChange = useCallback((newState) => {
141
+ inMemoryContentRef.current = newState;
142
+ }, []);
143
+ const saveDocumentChange = useCallback(() => {
144
+ onSave?.(inMemoryContentRef.current);
145
+ }, [
146
+ onSave
147
+ ]);
148
+ useOnTransition(editing, true, false, saveDocumentChange);
149
+ const { parentRef, focusAttributes, view } = useTextEditor(() => ({
150
+ initialValue: block.text,
151
+ extensions: [
152
+ createBasicExtensions({
153
+ readOnly: !isAuthor || !editing
154
+ }),
155
+ createThemeExtensions({
156
+ themeMode
157
+ }),
158
+ command,
159
+ EditorView.updateListener.of((update) => {
160
+ if (update.docChanged) {
161
+ handleDocumentChange(update.state.doc.toString());
162
+ }
163
+ })
164
+ ]
165
+ }), [
166
+ block.text,
167
+ editing,
168
+ isAuthor,
169
+ themeMode,
170
+ handleDocumentChange
171
+ ]);
172
+ useEffect(() => {
173
+ editing && view?.focus();
174
+ }, [
175
+ editing,
176
+ view
177
+ ]);
178
+ return /* @__PURE__ */ React.createElement("div", {
179
+ ref: parentRef,
180
+ className: "me-4",
181
+ ...focusAttributes
182
+ });
183
+ };
184
+ var ProposalBlock = ({ block }) => {
185
+ return /* @__PURE__ */ React.createElement("div", {
186
+ className: "me-4 italic"
187
+ }, block.text);
188
+ };
189
+ var MessageBlockObjectTile = /* @__PURE__ */ forwardRef(({ subject }, forwardedRef) => {
190
+ let title = subject.name ?? subject.title ?? subject.type ?? "Object";
191
+ if (typeof title !== "string") {
192
+ title = title?.content ?? "";
193
+ }
194
+ return /* @__PURE__ */ React.createElement(Card.Root, {
195
+ className: mx("grid col-span-3 py-1 pr-4", hoverableControls, hoverableFocusedWithinControls),
196
+ ref: forwardedRef
197
+ }, /* @__PURE__ */ React.createElement(Surface.Surface, {
198
+ type: AppSurface.Card,
199
+ limit: 1,
200
+ data: {
201
+ subject
202
+ },
203
+ fallback: title
204
+ }));
205
+ });
206
+
207
+ // src/components/Chat/Chat.tsx
208
+ var Chat = composable(({ id, identity, members, messages, activity, onSend, autoFocusTextbox, current, orientation = "top", readOnly, ...props }, forwardedRef) => {
209
+ const { t } = useTranslation2(meta2.id);
210
+ const { themeMode } = useThemeContext2();
211
+ const scrollRef = useRef2(null);
212
+ const sentinelRef = useRef2(null);
213
+ const [autoFocus, setAutoFocus] = useState2(autoFocusTextbox);
214
+ const [_count, _setCount] = useState2(0);
215
+ const textboxMetadata = getMessageMetadata(id, identity);
216
+ const messageRef = useRef2("");
217
+ const extensions = useMemo(() => [
218
+ createBasicExtensions2({
219
+ placeholder: t("message.placeholder")
220
+ }),
221
+ createThemeExtensions2({
222
+ themeMode
223
+ }),
224
+ listener({
225
+ onChange: ({ text }) => messageRef.current = text
226
+ }),
227
+ command
228
+ ], [
229
+ themeMode,
230
+ _count
231
+ ]);
232
+ const scrollToEnd = (behavior) => setTimeout(() => sentinelRef.current?.scrollIntoView({
233
+ behavior,
234
+ block: "end"
235
+ }), 10);
236
+ useLayoutEffect(() => {
237
+ scrollToEnd("instant");
238
+ }, []);
239
+ const handleSend = () => {
240
+ const text = messageRef.current;
241
+ if (!text?.length) {
242
+ return false;
243
+ }
244
+ const accepted = onSend(text);
245
+ if (!accepted) {
246
+ return false;
247
+ }
248
+ messageRef.current = "";
249
+ setAutoFocus(true);
250
+ scrollToEnd("smooth");
251
+ _setCount((count) => count + 1);
252
+ return true;
253
+ };
254
+ const filteredMessages = messages.filter(isNonNullable);
255
+ const renderState = {
256
+ messages: filteredMessages,
257
+ members,
258
+ activity,
259
+ extensions,
260
+ autoFocus,
261
+ handleSend,
262
+ textboxMetadata,
263
+ scrollRef,
264
+ sentinelRef,
265
+ readOnly
266
+ };
267
+ return orientation === "bottom" ? /* @__PURE__ */ React2.createElement(ChannelLayout, {
268
+ ...composableProps(props, {
269
+ classNames: "flex flex-col bs-full min-h-0"
270
+ }),
271
+ id,
272
+ ref: forwardedRef,
273
+ state: renderState
274
+ }) : /* @__PURE__ */ React2.createElement(ThreadLayout, {
275
+ ...composableProps(props, {
276
+ classNames: "dx-container grid-rows-[1fr_min-content_min-content]"
277
+ }),
278
+ id,
279
+ current,
280
+ ref: forwardedRef,
281
+ state: renderState
282
+ });
283
+ });
284
+ var ThreadLayout = /* @__PURE__ */ React2.forwardRef(({ id, current, state, ...props }, ref) => {
285
+ const { t } = useTranslation2(meta2.id);
286
+ const { messages, members, activity, extensions, autoFocus, handleSend, textboxMetadata, sentinelRef, readOnly } = state;
287
+ return /* @__PURE__ */ React2.createElement(ThreadComponent.Root, {
288
+ ...props,
289
+ id,
290
+ current,
291
+ ref
292
+ }, /* @__PURE__ */ React2.createElement(ScrollArea.Root, {
293
+ classNames: "col-span-2",
294
+ orientation: "vertical"
295
+ }, /* @__PURE__ */ React2.createElement(ScrollArea.Viewport, {
296
+ ref: sentinelRef
297
+ }, /* @__PURE__ */ React2.createElement("div", {
298
+ className: mx2(threadLayout, "place-self-end")
299
+ }, messages.map((message) => /* @__PURE__ */ React2.createElement(MessagePanel, {
300
+ key: message.id,
301
+ message,
302
+ members
303
+ }))))), !readOnly && /* @__PURE__ */ React2.createElement(React2.Fragment, null, /* @__PURE__ */ React2.createElement(MessageTextbox, {
304
+ extensions,
305
+ autoFocus,
306
+ onSend: handleSend,
307
+ ...textboxMetadata
308
+ }), /* @__PURE__ */ React2.createElement(ThreadComponent.Status, {
309
+ activity
310
+ }, t("activity.message"))));
311
+ });
312
+ var ChannelLayout = /* @__PURE__ */ React2.forwardRef(({ id, state, ...props }, ref) => {
313
+ const { t } = useTranslation2(meta2.id);
314
+ const { messages, members, activity, extensions, autoFocus, handleSend, textboxMetadata, scrollRef, sentinelRef, readOnly } = state;
315
+ return /* @__PURE__ */ React2.createElement("div", {
316
+ ...props,
317
+ id,
318
+ ref
319
+ }, /* @__PURE__ */ React2.createElement("div", {
320
+ ref: scrollRef,
321
+ className: "flex-1 min-h-0 overflow-y-auto"
322
+ }, messages.map((message) => /* @__PURE__ */ React2.createElement("div", {
323
+ key: message.id,
324
+ className: "grid grid-cols-[var(--dx-rail-size)_1fr] w-full"
325
+ }, /* @__PURE__ */ React2.createElement(MessagePanel, {
326
+ message,
327
+ members
328
+ }))), /* @__PURE__ */ React2.createElement("div", {
329
+ ref: sentinelRef
330
+ })), !readOnly && /* @__PURE__ */ React2.createElement(React2.Fragment, null, /* @__PURE__ */ React2.createElement("div", {
331
+ className: "shrink-0 grid grid-cols-[var(--dx-rail-size)_1fr]"
332
+ }, /* @__PURE__ */ React2.createElement(MessageTextbox, {
333
+ extensions,
334
+ autoFocus,
335
+ onSend: handleSend,
336
+ ...textboxMetadata
337
+ })), /* @__PURE__ */ React2.createElement("div", {
338
+ className: "shrink-0 px-2 pb-1 text-xs text-description"
339
+ }, activity ? t("activity.message") : null)));
340
+ });
341
+
342
+ // src/components/CommentsPanel/CommentsPanel.tsx
343
+ import React4, { useEffect as useEffect2 } from "react";
344
+ import { Obj as Obj2, Relation as Relation2 } from "@dxos/echo";
345
+ import { Icon, Message, Trans, useTranslation as useTranslation4 } from "@dxos/react-ui";
346
+ import { meta as meta4 } from "#meta";
347
+
348
+ // src/components/CommentsPanel/CommentsThread.tsx
349
+ import React3, { useCallback as useCallback2, useMemo as useMemo2, useRef as useRef3, useState as useState3 } from "react";
350
+ import { Obj, Relation } from "@dxos/echo";
351
+ import { useObject as useObject2 } from "@dxos/echo-react";
352
+ import { getSpace, useMembers } from "@dxos/react-client/echo";
353
+ import { useIdentity as useIdentity2 } from "@dxos/react-client/halo";
354
+ import { IconButton as IconButton2, Tag, Tooltip, useThemeContext as useThemeContext3, useTranslation as useTranslation3 } from "@dxos/react-ui";
355
+ import { MessageTextbox as MessageTextbox2, Thread as ThreadComponent2 } from "@dxos/react-ui-thread";
356
+ import { createBasicExtensions as createBasicExtensions3, createThemeExtensions as createThemeExtensions3, listener as listener2 } from "@dxos/ui-editor";
357
+ import { hoverableControlItem as hoverableControlItem2, hoverableControls as hoverableControls2, hoverableFocusedWithinControls as hoverableFocusedWithinControls2, mx as mx3 } from "@dxos/ui-theme";
358
+ import { useStatus } from "#hooks";
359
+ import { meta as meta3 } from "#meta";
360
+ var CommentsThread = ({ anchor, current, onAttend, onComment, onResolve, onMessageDelete, onThreadDelete, onAcceptProposal }) => {
361
+ const { themeMode } = useThemeContext3();
362
+ const { t } = useTranslation3(meta3.id);
363
+ const identity = useIdentity2();
364
+ const space = getSpace(anchor);
365
+ const members = useMembers(space?.id);
366
+ const detached = !anchor.anchor;
367
+ const thread = Relation.getSource(anchor);
368
+ const [messages] = useObject2(thread, "messages");
369
+ const activity = useStatus(space, Obj.getDXN(thread).toString());
370
+ const threadScrollRef = useRef3(null);
371
+ const textboxMetadata = getMessageMetadata(Obj.getDXN(thread).toString(), identity);
372
+ const [state, setState] = useState3({});
373
+ const messageRef = useRef3("");
374
+ const extensions = useMemo2(() => [
375
+ createBasicExtensions3({
376
+ placeholder: t("message.placeholder")
377
+ }),
378
+ createThemeExtensions3({
379
+ themeMode
380
+ }),
381
+ listener2({
382
+ onChange: ({ text }) => messageRef.current = text
383
+ }),
384
+ command
385
+ ], [
386
+ state
387
+ ]);
388
+ const scrollToEnd = (behavior) => setTimeout(() => threadScrollRef.current?.scrollIntoView({
389
+ behavior,
390
+ block: "end"
391
+ }), 10);
392
+ const handleAttend = useCallback2(() => onAttend?.(anchor), [
393
+ onAttend,
394
+ anchor
395
+ ]);
396
+ const handleResolve = useCallback2(() => onResolve?.(anchor), [
397
+ onResolve,
398
+ anchor
399
+ ]);
400
+ const handleMessageDelete = useCallback2((id) => onMessageDelete?.(anchor, id), [
401
+ onMessageDelete,
402
+ anchor
403
+ ]);
404
+ const handleThreadDelete = useCallback2(() => onThreadDelete?.(anchor), [
405
+ onThreadDelete,
406
+ anchor
407
+ ]);
408
+ const handleAcceptProposal = useCallback2((id) => onAcceptProposal?.(anchor, id), [
409
+ onAcceptProposal,
410
+ anchor
411
+ ]);
412
+ const handleComment = useCallback2(() => {
413
+ if (!messageRef.current) {
414
+ return false;
415
+ }
416
+ onComment?.(anchor, messageRef.current);
417
+ messageRef.current = "";
418
+ scrollToEnd("instant");
419
+ setState({});
420
+ return true;
421
+ }, [
422
+ anchor,
423
+ identity
424
+ ]);
425
+ return /* @__PURE__ */ React3.createElement(ThreadComponent2.Root, {
426
+ id: Obj.getDXN(thread).toString(),
427
+ classNames: "pt-2 border-b border-subdued-separator last:border-none",
428
+ current,
429
+ onClickCapture: handleAttend,
430
+ onFocusCapture: handleAttend
431
+ }, /* @__PURE__ */ React3.createElement("div", {
432
+ className: mx3("col-span-2 grid grid-cols-[var(--dx-rail-size)_1fr_min-content]", hoverableControls2, hoverableFocusedWithinControls2)
433
+ }, detached ? /* @__PURE__ */ React3.createElement(Tooltip.Trigger, {
434
+ asChild: true,
435
+ content: t("detached-thread.label"),
436
+ side: "top"
437
+ }, /* @__PURE__ */ React3.createElement(ThreadComponent2.Header, {
438
+ detached: true
439
+ }, thread.name)) : /* @__PURE__ */ React3.createElement(ThreadComponent2.Header, null, thread.name), /* @__PURE__ */ React3.createElement("div", {
440
+ className: buttonGroupClassNames
441
+ }, thread.status === "staged" && /* @__PURE__ */ React3.createElement(Tag, {
442
+ palette: "neutral"
443
+ }, t("draft.button")), onResolve && !(thread?.status === "staged") && /* @__PURE__ */ React3.createElement(IconButton2, {
444
+ "data-testid": "thread.resolve",
445
+ variant: "ghost",
446
+ icon: thread?.status === "resolved" ? "ph--check--fill" : "ph--check--regular",
447
+ iconOnly: true,
448
+ label: t("resolve-thread.label"),
449
+ classNames: [
450
+ buttonClassNames,
451
+ thread?.status !== "resolved" && hoverableControlItem2
452
+ ],
453
+ onClick: handleResolve
454
+ }), onThreadDelete && /* @__PURE__ */ React3.createElement(IconButton2, {
455
+ "data-testid": "thread.delete",
456
+ variant: "ghost",
457
+ icon: "ph--x--regular",
458
+ iconOnly: true,
459
+ label: t("delete-thread.label"),
460
+ classNames: [
461
+ buttonClassNames,
462
+ hoverableControlItem2
463
+ ],
464
+ onClick: handleThreadDelete
465
+ }))), messages?.map((ref) => /* @__PURE__ */ React3.createElement(MessagePanel, {
466
+ key: ref.dxn.toString(),
467
+ editable: true,
468
+ message: ref,
469
+ members,
470
+ onDelete: handleMessageDelete,
471
+ onAcceptProposal: handleAcceptProposal
472
+ })), /* @__PURE__ */ React3.createElement(MessageTextbox2, {
473
+ extensions,
474
+ onSend: handleComment,
475
+ ...textboxMetadata
476
+ }), /* @__PURE__ */ React3.createElement(ThreadComponent2.Status, {
477
+ activity
478
+ }, t("activity.message")), /* @__PURE__ */ React3.createElement("div", {
479
+ className: "h-px -mt-px",
480
+ ref: threadScrollRef
481
+ }));
482
+ };
483
+
484
+ // src/components/CommentsPanel/CommentsPanel.tsx
485
+ var CommentsPanel = ({ anchors, currentId, showResolvedThreads, ...props }) => {
486
+ const { t } = useTranslation4(meta4.id);
487
+ const filteredAnchors = showResolvedThreads ? anchors.filter((anchor) => !!Relation2.getSource(anchor)) : anchors.filter((anchor) => {
488
+ const thread = Relation2.getSource(anchor);
489
+ return thread && thread.status !== "resolved";
490
+ });
491
+ useEffect2(() => {
492
+ if (currentId) {
493
+ document.getElementById(currentId)?.scrollIntoView({
494
+ behavior: "smooth",
495
+ block: "end"
496
+ });
497
+ }
498
+ }, [
499
+ currentId
500
+ ]);
501
+ if (filteredAnchors.length === 0) {
502
+ return /* @__PURE__ */ React4.createElement("div", {
503
+ className: "p-form-padding"
504
+ }, /* @__PURE__ */ React4.createElement(Message.Root, null, /* @__PURE__ */ React4.createElement(Message.Content, null, /* @__PURE__ */ React4.createElement(Trans, {
505
+ t,
506
+ i18nKey: "no-comments.message",
507
+ components: {
508
+ commentIcon: /* @__PURE__ */ React4.createElement(Icon, {
509
+ icon: "ph--chat-text--regular",
510
+ size: 4,
511
+ classNames: "dx-icon-inline"
512
+ })
513
+ }
514
+ }))));
515
+ }
516
+ return /* @__PURE__ */ React4.createElement("div", null, filteredAnchors.map((anchor) => {
517
+ const thread = Relation2.getSource(anchor);
518
+ const threadId = Obj2.getDXN(thread).toString();
519
+ return /* @__PURE__ */ React4.createElement(CommentsThread, {
520
+ key: threadId,
521
+ anchor,
522
+ current: currentId === threadId,
523
+ ...props
524
+ });
525
+ }));
526
+ };
527
+
528
+ // src/components/index.ts
529
+ var ThreadSettings = lazy(() => import("../ThreadSettings-5MKTDK3A.mjs"));
530
+ export {
531
+ Chat,
532
+ CommentsPanel,
533
+ CommentsThread,
534
+ MessagePanel,
535
+ ThreadSettings,
536
+ buttonClassNames,
537
+ buttonGroupClassNames
538
+ };
539
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/components/index.ts", "../../../../src/components/Chat/Chat.tsx", "../../../../src/components/MessagePanel/MessagePanel.tsx", "../../../../src/components/CommentsPanel/CommentsPanel.tsx", "../../../../src/components/CommentsPanel/CommentsThread.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type ComponentType, lazy } from 'react';\n\nexport * from './Chat';\nexport * from './CommentsPanel';\nexport * from './MessagePanel';\n\nexport const ThreadSettings: ComponentType<any> = lazy(() => import('./ThreadSettings'));\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { type RefObject, useLayoutEffect, useMemo, useRef, useState } from 'react';\n\nimport { type SpaceMember } from '@dxos/react-client/echo';\nimport { type Identity } from '@dxos/react-client/halo';\nimport { ScrollArea, type ThemedClassName, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport {\n type MessageMetadata,\n MessageTextbox,\n Thread as ThreadComponent,\n type ThreadRootProps,\n threadLayout,\n} from '@dxos/react-ui-thread';\nimport { type Message } from '@dxos/types';\nimport { createBasicExtensions, createThemeExtensions, listener, type Extension } from '@dxos/ui-editor';\nimport { composable, composableProps, mx } from '@dxos/ui-theme';\nimport { isNonNullable } from '@dxos/util';\n\nimport { meta } from '#meta';\n\nimport { command } from '../../extensions';\nimport { getMessageMetadata } from '../../util';\nimport { MessagePanel } from '../MessagePanel';\n\nexport type ChatProps = ThemedClassName<\n {\n /** Stable id used for the underlying thread root and message metadata. */\n id: string;\n /** Identity used to attribute outgoing messages in the textbox metadata. */\n identity?: Identity;\n /** Space members for rendering sender names/avatars on incoming messages. */\n members: SpaceMember[];\n /** Messages to render in order. */\n messages: readonly Message.Message[];\n /** Activity indicator (e.g. processing) shown beneath the textbox. */\n activity?: boolean;\n /**\n * Called with the user's textbox content when they press send.\n * Returning `true` signals the message was accepted; the textbox is then cleared.\n */\n onSend: (text: string) => boolean;\n autoFocusTextbox?: boolean;\n /**\n * Where the composer sits relative to the messages.\n * - `'top'` (default) — composer follows the messages at intrinsic height,\n * suitable for inline comment threads.\n * - `'bottom'` — composer pinned to the bottom of the panel, messages\n * scrolling above it. Suitable for full-panel multi-party chat.\n */\n orientation?: ChatOrientation;\n /**\n * When true, hide the composer textbox and activity indicator. Used for\n * channels whose source-of-truth lives elsewhere (e.g. externally-synced\n * Slack/Discord channels keyed by a foreign id) — sending isn't meaningful\n * because there is no local-write path back to the source.\n */\n readOnly?: boolean;\n } & Pick<ThreadRootProps, 'current'>\n>;\n\nexport type ChatOrientation = 'top' | 'bottom';\n\n/**\n * Pure chat UI: scrollable message list + composer textbox + activity indicator.\n * Owns its own UI state (textbox content, scroll position, editor extensions) but\n * does not load data or invoke operations — the caller passes messages and an\n * `onSend` callback. Used by both `ThreadContainer` (AutoMerge `Thread`) and\n * `ChannelArticle`'s feed-backed channel chat.\n */\nexport const Chat = composable<HTMLDivElement, ChatProps>(\n (\n {\n id,\n identity,\n members,\n messages,\n activity,\n onSend,\n autoFocusTextbox,\n current,\n orientation = 'top',\n readOnly,\n ...props\n },\n forwardedRef,\n ) => {\n const { t } = useTranslation(meta.id);\n const { themeMode } = useThemeContext();\n\n const scrollRef = useRef<HTMLDivElement | null>(null);\n const sentinelRef = useRef<HTMLDivElement | null>(null);\n const [autoFocus, setAutoFocus] = useState(autoFocusTextbox);\n\n // Force the editor to remount after a successful send so its content resets.\n const [_count, _setCount] = useState(0);\n\n const textboxMetadata = getMessageMetadata(id, identity);\n const messageRef = useRef('');\n const extensions = useMemo(\n () => [\n createBasicExtensions({ placeholder: t('message.placeholder') }),\n createThemeExtensions({ themeMode }),\n listener({ onChange: ({ text }) => (messageRef.current = text) }),\n command,\n ],\n [themeMode, _count],\n );\n\n const scrollToEnd = (behavior: ScrollBehavior) =>\n setTimeout(() => sentinelRef.current?.scrollIntoView({ behavior, block: 'end' }), 10);\n\n useLayoutEffect(() => {\n scrollToEnd('instant');\n }, []);\n // NOTE: Auto-scroll on new messages is intentionally not implemented here. Smooth-scroll\n // animations were causing ResizeObserver feedback loops with CodeMirror/ScrollArea. The\n // proper fix is \"scroll only if user is already at the bottom\" — deferred to a follow-up.\n\n const handleSend = () => {\n const text = messageRef.current;\n if (!text?.length) {\n return false;\n }\n\n const accepted = onSend(text);\n if (!accepted) {\n return false;\n }\n\n messageRef.current = '';\n setAutoFocus(true);\n scrollToEnd('smooth');\n _setCount((count) => count + 1);\n return true;\n };\n\n const filteredMessages = messages.filter(isNonNullable);\n const renderState: ChatRenderState = {\n messages: filteredMessages,\n members,\n activity,\n extensions,\n autoFocus,\n handleSend,\n textboxMetadata,\n scrollRef,\n sentinelRef,\n readOnly,\n };\n\n return orientation === 'bottom' ? (\n <ChannelLayout\n {...composableProps(props, { classNames: 'flex flex-col bs-full min-h-0' })}\n id={id}\n ref={forwardedRef}\n state={renderState}\n />\n ) : (\n <ThreadLayout\n {...composableProps(props, { classNames: 'dx-container grid-rows-[1fr_min-content_min-content]' })}\n id={id}\n current={current}\n ref={forwardedRef}\n state={renderState}\n />\n );\n },\n);\n\n//\n// Internal layout helpers — share state via the ChatRenderState bag.\n//\n\ntype ChatRenderState = {\n messages: Message.Message[];\n members: SpaceMember[];\n activity?: boolean;\n extensions: Extension[];\n autoFocus?: boolean;\n handleSend: () => boolean;\n textboxMetadata: MessageMetadata;\n scrollRef: RefObject<HTMLDivElement | null>;\n sentinelRef: RefObject<HTMLDivElement | null>;\n readOnly?: boolean;\n};\n\ntype LayoutProps = React.HTMLAttributes<HTMLDivElement> & {\n id: string;\n state: ChatRenderState;\n};\n\n/** Thread layout — composer follows messages at intrinsic height. */\nconst ThreadLayout = React.forwardRef<HTMLDivElement, LayoutProps & Pick<ThreadRootProps, 'current'>>(\n ({ id, current, state, ...props }, ref) => {\n const { t } = useTranslation(meta.id);\n const { messages, members, activity, extensions, autoFocus, handleSend, textboxMetadata, sentinelRef, readOnly } =\n state;\n return (\n <ThreadComponent.Root {...props} id={id} current={current} ref={ref}>\n <ScrollArea.Root classNames='col-span-2' orientation='vertical'>\n <ScrollArea.Viewport ref={sentinelRef}>\n <div className={mx(threadLayout, 'place-self-end')}>\n {messages.map((message) => (\n <MessagePanel key={message.id} message={message} members={members} />\n ))}\n </div>\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n {!readOnly && (\n <>\n <MessageTextbox extensions={extensions} autoFocus={autoFocus} onSend={handleSend} {...textboxMetadata} />\n <ThreadComponent.Status activity={activity}>{t('activity.message')}</ThreadComponent.Status>\n </>\n )}\n </ThreadComponent.Root>\n );\n },\n);\n\n/** Channel layout — composer pinned to the bottom, messages scroll above it. */\nconst ChannelLayout = React.forwardRef<HTMLDivElement, LayoutProps>(({ id, state, ...props }, ref) => {\n const { t } = useTranslation(meta.id);\n const {\n messages,\n members,\n activity,\n extensions,\n autoFocus,\n handleSend,\n textboxMetadata,\n scrollRef,\n sentinelRef,\n readOnly,\n } = state;\n return (\n <div {...props} id={id} ref={ref}>\n <div ref={scrollRef} className='flex-1 min-h-0 overflow-y-auto'>\n {messages.map((message) => (\n <div key={message.id} className='grid grid-cols-[var(--dx-rail-size)_1fr] w-full'>\n <MessagePanel message={message} members={members} />\n </div>\n ))}\n <div ref={sentinelRef} />\n </div>\n {!readOnly && (\n <>\n <div className='shrink-0 grid grid-cols-[var(--dx-rail-size)_1fr]'>\n <MessageTextbox extensions={extensions} autoFocus={autoFocus} onSend={handleSend} {...textboxMetadata} />\n </div>\n <div className='shrink-0 px-2 pb-1 text-xs text-description'>{activity ? t('activity.message') : null}</div>\n </>\n )}\n </div>\n );\n});\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { EditorView } from '@codemirror/view';\nimport React, { forwardRef, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { Surface } from '@dxos/app-framework/ui';\nimport { AppSurface } from '@dxos/app-toolkit/ui';\nimport { type Obj, Ref } from '@dxos/echo';\nimport { useObject } from '@dxos/echo-react';\nimport { PublicKey } from '@dxos/react-client';\nimport { type SpaceMember } from '@dxos/react-client/echo';\nimport { type Identity, useIdentity } from '@dxos/react-client/halo';\nimport { IconButton, useOnTransition, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { Card } from '@dxos/react-ui';\nimport { useTextEditor } from '@dxos/react-ui-editor';\nimport { MessageHeading, MessageRoot } from '@dxos/react-ui-thread';\nimport { type ContentBlock, type Message } from '@dxos/types';\nimport { createBasicExtensions, createThemeExtensions } from '@dxos/ui-editor';\nimport { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/ui-theme';\n\nimport { useOnEditAnalytics } from '#hooks';\nimport { meta } from '#meta';\n\nimport { command } from '../../extensions/command';\nimport { getMessageMetadata } from '../../util';\n\nexport const buttonGroupClassNames = 'flex flex-row items-center gap-0.5 pe-2';\nexport const buttonClassNames = 'p-1! transition-opacity';\n\nexport type MessagePanelProps = {\n message: Obj.OfShape<Message.Message> | Ref.Ref<Obj.OfShape<Message.Message>>;\n members: SpaceMember[];\n editable?: boolean;\n onDelete?: (id: string) => void;\n onAcceptProposal?: (id: string) => void;\n};\n\nexport const MessagePanel = ({\n message: messageOrRef,\n members,\n editable = false,\n onDelete,\n onAcceptProposal,\n}: MessagePanelProps) => {\n const { t } = useTranslation(meta.id);\n const [message, updateMessage] = useObject(messageOrRef);\n const identity = useIdentity();\n const [editing, setEditing] = useState(false);\n\n const textBlockIndex = message?.blocks.findIndex((block) => block._tag === 'text') ?? -1;\n\n const handleEdit = useCallback(() => setEditing((editing) => !editing), []);\n const handleDelete = useCallback(() => message && onDelete?.(message.id), [message, onDelete]);\n const handleAcceptProposal = useCallback(\n () => message && onAcceptProposal?.(message.id),\n [message, onAcceptProposal],\n );\n const handleTextBlockChange = useCallback(\n (newText: string) => {\n updateMessage((m) => {\n const targetBlock = m.blocks[textBlockIndex];\n if (targetBlock && targetBlock._tag === 'text') {\n targetBlock.text = newText;\n }\n });\n },\n [updateMessage, textBlockIndex],\n );\n\n const textBlock =\n message && textBlockIndex !== -1 ? (message.blocks[textBlockIndex] as ContentBlock.Text) : undefined;\n useOnEditAnalytics(message, textBlock, !!editing);\n\n if (!message) {\n return null;\n }\n\n const senderIdentity = members.find(\n (member) =>\n (message.sender.identityDid && member.identity.did === message.sender.identityDid) ||\n (message.sender.identityKey && PublicKey.equals(member.identity.identityKey, message.sender.identityKey)),\n )?.identity;\n // Pass `message.sender` as the fallback so externally-synced messages\n // (Slack, etc.) display the source-side sender name instead of \"Anonymous\"\n // when no DXOS identity matches.\n const messageMetadata = getMessageMetadata(message.id, senderIdentity, message.sender);\n const userIsAuthor = identity?.did === messageMetadata.authorId;\n const proposalBlock = message.blocks.find((block) => block._tag === 'proposal');\n const references = message.blocks.filter((block) => block._tag === 'reference').map((block) => block.reference);\n\n return (\n <MessageRoot {...messageMetadata} classNames={[hoverableControls, hoverableFocusedWithinControls]}>\n <MessageHeading authorName={messageMetadata.authorName} timestamp={messageMetadata.timestamp}>\n <div className={buttonGroupClassNames}>\n {userIsAuthor && editable && (\n <IconButton\n data-testid={editing ? 'thread.message.save' : 'thread.message.edit'}\n variant='ghost'\n icon={editing ? 'ph--check--regular' : 'ph--pencil-simple--regular'}\n iconOnly\n label={t(editing ? 'save-message.label' : 'edit-message.label')}\n classNames={[buttonClassNames, hoverableControlItem]}\n onClick={handleEdit}\n />\n )}\n {/* TODO(wittjosiah): Proposal controls should probably be hoisted to thread level. */}\n {proposalBlock && onAcceptProposal && (\n <IconButton\n data-testid='thread.message.accept'\n variant='ghost'\n icon='ph--check--regular'\n iconOnly\n label={t('accept-proposal.label')}\n classNames={[buttonClassNames, hoverableControlItem]}\n onClick={handleAcceptProposal}\n />\n )}\n {onDelete && (\n <IconButton\n data-testid='thread.message.delete'\n variant='ghost'\n icon='ph--x--regular'\n iconOnly\n label={t('delete-message.label')}\n classNames={[buttonClassNames, hoverableControlItem]}\n onClick={handleDelete}\n />\n )}\n </div>\n </MessageHeading>\n {textBlock && (\n <TextboxBlock block={textBlock} isAuthor={userIsAuthor} editing={editing} onSave={handleTextBlockChange} />\n )}\n {proposalBlock && <ProposalBlock block={proposalBlock} />}\n {Ref.Array.targets(references).map((reference, index) => (\n <MessagePart key={index} part={reference as Obj.Unknown} />\n ))}\n </MessageRoot>\n );\n};\n\nconst MessagePart = ({ part }: { part: Obj.Unknown }) => {\n return <MessageBlockObjectTile subject={part} />;\n};\n\nconst TextboxBlock = ({\n block,\n isAuthor,\n editing,\n onSave,\n}: {\n block: ContentBlock.Text;\n editing?: boolean;\n isAuthor?: boolean;\n identity?: Identity;\n onSave?: (newText: string) => void;\n}) => {\n const { themeMode } = useThemeContext();\n const inMemoryContentRef = useRef(block.text);\n\n const handleDocumentChange = useCallback((newState: string) => {\n inMemoryContentRef.current = newState;\n }, []);\n\n const saveDocumentChange = useCallback(() => {\n onSave?.(inMemoryContentRef.current);\n }, [onSave]);\n\n useOnTransition(editing, true, false, saveDocumentChange);\n\n const { parentRef, focusAttributes, view } = useTextEditor(\n () => ({\n initialValue: block.text,\n extensions: [\n createBasicExtensions({ readOnly: !isAuthor || !editing }),\n createThemeExtensions({ themeMode }),\n command,\n EditorView.updateListener.of((update) => {\n if (update.docChanged) {\n handleDocumentChange(update.state.doc.toString());\n }\n }),\n ],\n }),\n [block.text, editing, isAuthor, themeMode, handleDocumentChange],\n );\n\n useEffect(() => {\n editing && view?.focus();\n }, [editing, view]);\n\n return <div ref={parentRef} className='me-4' {...focusAttributes} />;\n};\n\nconst ProposalBlock = ({ block }: { block: ContentBlock.Proposal }) => {\n return <div className='me-4 italic'>{block.text}</div>;\n};\n\nconst MessageBlockObjectTile = forwardRef<HTMLDivElement, { subject: Obj.Unknown }>(({ subject }, forwardedRef) => {\n // TODO(burdon): Use annotation to get title.\n let title = (subject as any).name ?? (subject as any).title ?? (subject as any).type ?? 'Object';\n if (typeof title !== 'string') {\n title = title?.content ?? '';\n }\n\n return (\n <Card.Root\n className={mx('grid col-span-3 py-1 pr-4', hoverableControls, hoverableFocusedWithinControls)}\n ref={forwardedRef}\n >\n <Surface.Surface\n type={AppSurface.Card}\n limit={1}\n data={{ subject } satisfies AppSurface.ObjectCardData}\n fallback={title}\n />\n </Card.Root>\n );\n});\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useEffect } from 'react';\n\nimport { Obj, Relation } from '@dxos/echo';\nimport { Icon, Message, Trans, useTranslation } from '@dxos/react-ui';\nimport { type AnchoredTo, type Thread } from '@dxos/types';\n\nimport { meta } from '#meta';\n\nimport { CommentsThread, type CommentsThreadProps } from './CommentsThread';\n\nexport type CommentsPanelProps = Omit<CommentsThreadProps, 'anchor' | 'current'> & {\n anchors: AnchoredTo.AnchoredTo[];\n currentId?: string;\n showResolvedThreads?: boolean;\n};\n\n/**\n * Root container for collection of comment threads.\n */\nexport const CommentsPanel = ({ anchors, currentId, showResolvedThreads, ...props }: CommentsPanelProps) => {\n const { t } = useTranslation(meta.id);\n\n // TODO(wittjosiah): There seems to be a race between thread and anchor being deleted.\n const filteredAnchors = showResolvedThreads\n ? anchors.filter((anchor) => !!Relation.getSource(anchor))\n : anchors.filter((anchor) => {\n const thread = Relation.getSource(anchor);\n // TODO(dmaretskyi): Do Obj.instanceOf check instead.\n return thread && (thread as any).status !== 'resolved';\n });\n\n useEffect(() => {\n if (currentId) {\n document.getElementById(currentId)?.scrollIntoView({ behavior: 'smooth', block: 'end' });\n }\n }, [currentId]);\n\n if (filteredAnchors.length === 0) {\n return (\n <div className='p-form-padding'>\n <Message.Root>\n <Message.Content>\n <Trans\n {...{\n t,\n i18nKey: 'no-comments.message',\n components: {\n commentIcon: <Icon icon='ph--chat-text--regular' size={4} classNames='dx-icon-inline' />,\n },\n }}\n />\n </Message.Content>\n </Message.Root>\n </div>\n );\n }\n\n return (\n <div>\n {filteredAnchors.map((anchor) => {\n const thread = Relation.getSource(anchor) as Thread.Thread;\n const threadId = Obj.getDXN(thread).toString();\n return <CommentsThread key={threadId} anchor={anchor} current={currentId === threadId} {...props} />;\n })}\n </div>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\n\nimport { Obj, Relation } from '@dxos/echo';\nimport { useObject } from '@dxos/echo-react';\nimport { getSpace, useMembers } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { IconButton, Tag, Tooltip, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport {\n MessageTextbox,\n type MessageTextboxProps,\n Thread as ThreadComponent,\n type ThreadRootProps,\n} from '@dxos/react-ui-thread';\nimport { type AnchoredTo, type Thread } from '@dxos/types';\nimport { createBasicExtensions, createThemeExtensions, listener } from '@dxos/ui-editor';\nimport { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/ui-theme';\n\nimport { useStatus } from '#hooks';\nimport { meta } from '#meta';\n\nimport { command } from '../../extensions/command';\nimport { getMessageMetadata } from '../../util';\nimport { MessagePanel, buttonClassNames, buttonGroupClassNames } from '../MessagePanel';\n\nexport type CommentsThreadProps = {\n anchor: AnchoredTo.AnchoredTo;\n onAttend?: (anchor: AnchoredTo.AnchoredTo) => void;\n onComment?: (anchor: AnchoredTo.AnchoredTo, message: string) => void;\n onResolve?: (anchor: AnchoredTo.AnchoredTo) => void;\n onMessageDelete?: (anchor: AnchoredTo.AnchoredTo, messageId: string) => void;\n onThreadDelete?: (anchor: AnchoredTo.AnchoredTo) => void;\n onAcceptProposal?: (anchor: AnchoredTo.AnchoredTo, messageId: string) => void;\n} & Pick<ThreadRootProps, 'current'>;\n\nexport const CommentsThread = ({\n anchor,\n current,\n onAttend,\n onComment,\n onResolve,\n onMessageDelete,\n onThreadDelete,\n onAcceptProposal,\n}: CommentsThreadProps) => {\n const { themeMode } = useThemeContext();\n const { t } = useTranslation(meta.id);\n const identity = useIdentity()!;\n const space = getSpace(anchor);\n const members = useMembers(space?.id);\n const detached = !anchor.anchor;\n const thread = Relation.getSource(anchor) as Thread.Thread;\n const [messages] = useObject(thread, 'messages');\n const activity = useStatus(space, Obj.getDXN(thread).toString());\n const threadScrollRef = useRef<HTMLDivElement | null>(null);\n\n const textboxMetadata = getMessageMetadata(Obj.getDXN(thread).toString(), identity);\n\n // TODO(wittjosiah): This is a hack to reset the editor after a message is sent.\n const [state, setState] = useState({});\n const messageRef = useRef('');\n const extensions = useMemo(\n () => [\n createBasicExtensions({ placeholder: t('message.placeholder') }),\n createThemeExtensions({ themeMode }),\n listener({ onChange: ({ text }) => (messageRef.current = text) }),\n command,\n ],\n [state],\n );\n\n // TODO(thure): Factor out.\n const scrollToEnd = (behavior: ScrollBehavior) =>\n setTimeout(() => threadScrollRef.current?.scrollIntoView({ behavior, block: 'end' }), 10);\n\n const handleAttend = useCallback(() => onAttend?.(anchor), [onAttend, anchor]);\n const handleResolve = useCallback(() => onResolve?.(anchor), [onResolve, anchor]);\n const handleMessageDelete = useCallback((id: string) => onMessageDelete?.(anchor, id), [onMessageDelete, anchor]);\n const handleThreadDelete = useCallback(() => onThreadDelete?.(anchor), [onThreadDelete, anchor]);\n const handleAcceptProposal = useCallback((id: string) => onAcceptProposal?.(anchor, id), [onAcceptProposal, anchor]);\n\n const handleComment = useCallback<NonNullable<MessageTextboxProps['onSend']>>(() => {\n if (!messageRef.current) {\n return false;\n }\n\n onComment?.(anchor, messageRef.current);\n messageRef.current = '';\n scrollToEnd('instant');\n setState({});\n\n return true;\n }, [anchor, identity]);\n\n return (\n <ThreadComponent.Root\n id={Obj.getDXN(thread).toString()}\n classNames='pt-2 border-b border-subdued-separator last:border-none'\n current={current}\n onClickCapture={handleAttend}\n onFocusCapture={handleAttend}\n >\n <div\n className={mx(\n 'col-span-2 grid grid-cols-[var(--dx-rail-size)_1fr_min-content]',\n hoverableControls,\n hoverableFocusedWithinControls,\n )}\n >\n {detached ? (\n <Tooltip.Trigger asChild content={t('detached-thread.label')} side='top'>\n <ThreadComponent.Header detached>{thread.name}</ThreadComponent.Header>\n </Tooltip.Trigger>\n ) : (\n <ThreadComponent.Header>{thread.name}</ThreadComponent.Header>\n )}\n <div className={buttonGroupClassNames}>\n {thread.status === 'staged' && <Tag palette='neutral'>{t('draft.button')}</Tag>}\n {onResolve && !(thread?.status === 'staged') && (\n <IconButton\n data-testid='thread.resolve'\n variant='ghost'\n icon={thread?.status === 'resolved' ? 'ph--check--fill' : 'ph--check--regular'}\n iconOnly\n label={t('resolve-thread.label')}\n classNames={[buttonClassNames, thread?.status !== 'resolved' && hoverableControlItem]}\n onClick={handleResolve}\n />\n )}\n {onThreadDelete && (\n <IconButton\n data-testid='thread.delete'\n variant='ghost'\n icon='ph--x--regular'\n iconOnly\n label={t('delete-thread.label')}\n classNames={[buttonClassNames, hoverableControlItem]}\n onClick={handleThreadDelete}\n />\n )}\n </div>\n </div>\n\n {messages?.map((ref) => (\n <MessagePanel\n key={ref.dxn.toString()}\n editable\n message={ref}\n members={members}\n onDelete={handleMessageDelete}\n onAcceptProposal={handleAcceptProposal}\n />\n ))}\n\n {/*\n TODO(wittjosiah): Can't autofocus this generally.\n There can be multiple threads with inputs and they can't all be focused.\n Also, it steals focus from documents when first rendered.\n Need to find a way to autofocus in one scenario only: when a new thread is created.\n */}\n <MessageTextbox extensions={extensions} onSend={handleComment} {...textboxMetadata} />\n\n <ThreadComponent.Status activity={activity}>{t('activity.message')}</ThreadComponent.Status>\n\n <div className='h-px -mt-px' ref={threadScrollRef} />\n </ThreadComponent.Root>\n );\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["lazy", "React", "useLayoutEffect", "useMemo", "useRef", "useState", "ScrollArea", "useThemeContext", "useTranslation", "MessageTextbox", "Thread", "ThreadComponent", "threadLayout", "createBasicExtensions", "createThemeExtensions", "listener", "composable", "composableProps", "mx", "isNonNullable", "meta", "EditorView", "React", "forwardRef", "useCallback", "useEffect", "useRef", "useState", "Surface", "AppSurface", "Ref", "useObject", "PublicKey", "useIdentity", "IconButton", "useOnTransition", "useThemeContext", "useTranslation", "Card", "useTextEditor", "MessageHeading", "MessageRoot", "createBasicExtensions", "createThemeExtensions", "hoverableControlItem", "hoverableControls", "hoverableFocusedWithinControls", "mx", "useOnEditAnalytics", "meta", "buttonGroupClassNames", "buttonClassNames", "MessagePanel", "message", "messageOrRef", "members", "editable", "onDelete", "onAcceptProposal", "t", "useTranslation", "meta", "id", "updateMessage", "useObject", "identity", "useIdentity", "editing", "setEditing", "useState", "textBlockIndex", "blocks", "findIndex", "block", "_tag", "handleEdit", "useCallback", "handleDelete", "handleAcceptProposal", "handleTextBlockChange", "newText", "m", "targetBlock", "text", "textBlock", "undefined", "useOnEditAnalytics", "senderIdentity", "find", "member", "sender", "identityDid", "did", "identityKey", "PublicKey", "equals", "messageMetadata", "getMessageMetadata", "userIsAuthor", "authorId", "proposalBlock", "references", "filter", "map", "reference", "MessageRoot", "classNames", "hoverableControls", "hoverableFocusedWithinControls", "MessageHeading", "authorName", "timestamp", "div", "className", "IconButton", "data-testid", "variant", "icon", "iconOnly", "label", "hoverableControlItem", "onClick", "TextboxBlock", "isAuthor", "onSave", "ProposalBlock", "Ref", "Array", "targets", "index", "MessagePart", "key", "part", "MessageBlockObjectTile", "subject", "themeMode", "useThemeContext", "inMemoryContentRef", "useRef", "handleDocumentChange", "newState", "current", "saveDocumentChange", "useOnTransition", "parentRef", "focusAttributes", "view", "useTextEditor", "initialValue", "extensions", "createBasicExtensions", "readOnly", "createThemeExtensions", "command", "EditorView", "updateListener", "of", "update", "docChanged", "state", "doc", "toString", "useEffect", "focus", "ref", "forwardRef", "forwardedRef", "title", "name", "type", "content", "Card", "Root", "mx", "Surface", "AppSurface", "limit", "data", "fallback", "Chat", "composable", "id", "identity", "members", "messages", "activity", "onSend", "autoFocusTextbox", "current", "orientation", "readOnly", "props", "forwardedRef", "t", "useTranslation", "meta", "themeMode", "useThemeContext", "scrollRef", "useRef", "sentinelRef", "autoFocus", "setAutoFocus", "useState", "_count", "_setCount", "textboxMetadata", "getMessageMetadata", "messageRef", "extensions", "useMemo", "createBasicExtensions", "placeholder", "createThemeExtensions", "listener", "onChange", "text", "command", "scrollToEnd", "behavior", "setTimeout", "scrollIntoView", "block", "useLayoutEffect", "handleSend", "length", "accepted", "count", "filteredMessages", "filter", "isNonNullable", "renderState", "React", "ChannelLayout", "composableProps", "classNames", "ref", "state", "ThreadLayout", "forwardRef", "ThreadComponent", "Root", "ScrollArea", "Viewport", "div", "className", "mx", "threadLayout", "map", "message", "MessagePanel", "key", "MessageTextbox", "Status", "React", "useEffect", "Obj", "Relation", "Icon", "Message", "Trans", "useTranslation", "meta", "React", "useCallback", "useMemo", "useRef", "useState", "Obj", "Relation", "useObject", "getSpace", "useMembers", "useIdentity", "IconButton", "Tag", "Tooltip", "useThemeContext", "useTranslation", "MessageTextbox", "Thread", "ThreadComponent", "createBasicExtensions", "createThemeExtensions", "listener", "hoverableControlItem", "hoverableControls", "hoverableFocusedWithinControls", "mx", "useStatus", "meta", "CommentsThread", "anchor", "current", "onAttend", "onComment", "onResolve", "onMessageDelete", "onThreadDelete", "onAcceptProposal", "themeMode", "useThemeContext", "t", "useTranslation", "meta", "id", "identity", "useIdentity", "space", "getSpace", "members", "useMembers", "detached", "thread", "Relation", "getSource", "messages", "useObject", "activity", "useStatus", "Obj", "getDXN", "toString", "threadScrollRef", "useRef", "textboxMetadata", "getMessageMetadata", "state", "setState", "useState", "messageRef", "extensions", "useMemo", "createBasicExtensions", "placeholder", "createThemeExtensions", "listener", "onChange", "text", "command", "scrollToEnd", "behavior", "setTimeout", "scrollIntoView", "block", "handleAttend", "useCallback", "handleResolve", "handleMessageDelete", "handleThreadDelete", "handleAcceptProposal", "handleComment", "React", "ThreadComponent", "Root", "classNames", "onClickCapture", "onFocusCapture", "div", "className", "mx", "hoverableControls", "hoverableFocusedWithinControls", "Tooltip", "Trigger", "asChild", "content", "side", "Header", "name", "buttonGroupClassNames", "status", "Tag", "palette", "IconButton", "data-testid", "variant", "icon", "iconOnly", "label", "buttonClassNames", "hoverableControlItem", "onClick", "map", "ref", "MessagePanel", "key", "dxn", "editable", "message", "onDelete", "MessageTextbox", "onSend", "Status", "CommentsPanel", "anchors", "currentId", "showResolvedThreads", "props", "t", "useTranslation", "meta", "id", "filteredAnchors", "filter", "anchor", "Relation", "getSource", "thread", "status", "useEffect", "document", "getElementById", "scrollIntoView", "behavior", "block", "length", "React", "div", "className", "Message", "Root", "Content", "Trans", "i18nKey", "components", "commentIcon", "Icon", "icon", "size", "classNames", "map", "threadId", "Obj", "getDXN", "toString", "CommentsThread", "key", "current", "ThreadSettings", "lazy"]
7
+ }