@dxos/plugin-thread 0.8.1 → 0.8.2-main.10c050d

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 (407) hide show
  1. package/dist/lib/browser/ChannelContainer-XFNGSLHL.mjs +15 -0
  2. package/dist/lib/browser/ChatContainer-JWRI73OG.mjs +14 -0
  3. package/dist/lib/browser/app-graph-builder-K3CFBN7V.mjs +171 -0
  4. package/dist/lib/browser/app-graph-builder-K3CFBN7V.mjs.map +7 -0
  5. package/dist/lib/browser/call-manager-I4IKVCAK.mjs +23 -0
  6. package/dist/lib/browser/call-manager-I4IKVCAK.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-QDJ3Y6WF.mjs → chunk-5P5BH5GE.mjs} +57 -35
  8. package/dist/lib/browser/chunk-5P5BH5GE.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-5PGLGDIP.mjs +983 -0
  10. package/dist/lib/browser/chunk-5PGLGDIP.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-G3TS64FP.mjs +351 -0
  12. package/dist/lib/browser/chunk-G3TS64FP.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-WBJLUUOK.mjs → chunk-IIUTBDVB.mjs} +4 -4
  14. package/dist/lib/browser/chunk-IIUTBDVB.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-IYY42OE2.mjs +545 -0
  16. package/dist/lib/browser/chunk-IYY42OE2.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-JKQUJOTX.mjs +31 -0
  18. package/dist/lib/browser/chunk-JKQUJOTX.mjs.map +7 -0
  19. package/dist/lib/browser/chunk-N2V6MV6B.mjs +21 -0
  20. package/dist/lib/browser/chunk-N2V6MV6B.mjs.map +7 -0
  21. package/dist/lib/browser/{chunk-EP6MRLY7.mjs → chunk-R5MDLUPC.mjs} +5 -3
  22. package/dist/lib/browser/chunk-R5MDLUPC.mjs.map +7 -0
  23. package/dist/lib/browser/chunk-RJGJXXWK.mjs +1708 -0
  24. package/dist/lib/browser/chunk-RJGJXXWK.mjs.map +7 -0
  25. package/dist/lib/browser/chunk-WDOQXTI2.mjs +126 -0
  26. package/dist/lib/browser/chunk-WDOQXTI2.mjs.map +7 -0
  27. package/dist/lib/browser/index.mjs +107 -41
  28. package/dist/lib/browser/index.mjs.map +4 -4
  29. package/dist/lib/browser/{intent-resolver-QAY4FLLM.mjs → intent-resolver-YUYZCTLF.mjs} +102 -74
  30. package/dist/lib/browser/intent-resolver-YUYZCTLF.mjs.map +7 -0
  31. package/dist/lib/browser/markdown-4EC3OCF2.mjs +169 -0
  32. package/dist/lib/browser/markdown-4EC3OCF2.mjs.map +7 -0
  33. package/dist/lib/browser/meta.json +1 -1
  34. package/dist/lib/browser/react-root-YYDCVHGL.mjs +27 -0
  35. package/dist/lib/browser/react-root-YYDCVHGL.mjs.map +7 -0
  36. package/dist/lib/browser/react-surface-MEYBFPBC.mjs +108 -0
  37. package/dist/lib/browser/react-surface-MEYBFPBC.mjs.map +7 -0
  38. package/dist/lib/browser/{settings-4FEC7EAX.mjs → settings-KVBQQSO5.mjs} +5 -5
  39. package/dist/lib/browser/settings-KVBQQSO5.mjs.map +7 -0
  40. package/dist/lib/browser/{state-PNMSLKAH.mjs → state-RKL5MSDP.mjs} +7 -7
  41. package/dist/lib/browser/state-RKL5MSDP.mjs.map +7 -0
  42. package/dist/lib/browser/types/index.mjs +16 -0
  43. package/dist/lib/browser/types/index.mjs.map +7 -0
  44. package/dist/lib/node/ChannelContainer-F24RHJPX.cjs +36 -0
  45. package/dist/lib/node/ChannelContainer-F24RHJPX.cjs.map +7 -0
  46. package/dist/lib/node/ChatContainer-EE3FPSYO.cjs +35 -0
  47. package/dist/lib/node/ChatContainer-EE3FPSYO.cjs.map +7 -0
  48. package/dist/lib/node/app-graph-builder-IRE3GYKE.cjs +179 -0
  49. package/dist/lib/node/app-graph-builder-IRE3GYKE.cjs.map +7 -0
  50. package/dist/lib/node/call-manager-FZ4OMTB6.cjs +37 -0
  51. package/dist/lib/node/call-manager-FZ4OMTB6.cjs.map +7 -0
  52. package/dist/lib/node/chunk-4B3PPXA6.cjs +371 -0
  53. package/dist/lib/node/chunk-4B3PPXA6.cjs.map +7 -0
  54. package/dist/lib/node/{chunk-NQ5DTPOY.cjs → chunk-4YSNVPWU.cjs} +10 -8
  55. package/dist/lib/node/chunk-4YSNVPWU.cjs.map +7 -0
  56. package/dist/lib/node/chunk-6B3M6XRE.cjs +984 -0
  57. package/dist/lib/node/chunk-6B3M6XRE.cjs.map +7 -0
  58. package/dist/lib/node/chunk-AUIU6JGD.cjs +549 -0
  59. package/dist/lib/node/chunk-AUIU6JGD.cjs.map +7 -0
  60. package/dist/lib/node/chunk-ECIVLX56.cjs +1731 -0
  61. package/dist/lib/node/chunk-ECIVLX56.cjs.map +7 -0
  62. package/dist/lib/node/{chunk-S2A6BXEA.cjs → chunk-EYAUPLHT.cjs} +16 -10
  63. package/dist/lib/node/chunk-EYAUPLHT.cjs.map +7 -0
  64. package/dist/lib/node/{chunk-AKINTFBH.cjs → chunk-FUXJAVFZ.cjs} +50 -29
  65. package/dist/lib/node/chunk-FUXJAVFZ.cjs.map +7 -0
  66. package/dist/lib/node/{chunk-ONLWOUYZ.cjs → chunk-HLMCEE5K.cjs} +7 -7
  67. package/dist/lib/node/{chunk-ONLWOUYZ.cjs.map → chunk-HLMCEE5K.cjs.map} +2 -2
  68. package/dist/lib/node/chunk-LR5NENBE.cjs +54 -0
  69. package/dist/lib/node/chunk-LR5NENBE.cjs.map +7 -0
  70. package/dist/lib/node/chunk-TKHJVC2C.cjs +147 -0
  71. package/dist/lib/node/chunk-TKHJVC2C.cjs.map +7 -0
  72. package/dist/lib/node/index.cjs +142 -80
  73. package/dist/lib/node/index.cjs.map +4 -4
  74. package/dist/lib/node/{intent-resolver-S6FE5OR7.cjs → intent-resolver-MZ3HADNY.cjs} +108 -82
  75. package/dist/lib/node/intent-resolver-MZ3HADNY.cjs.map +7 -0
  76. package/dist/lib/node/markdown-NJDPXIKD.cjs +178 -0
  77. package/dist/lib/node/markdown-NJDPXIKD.cjs.map +7 -0
  78. package/dist/lib/node/meta.json +1 -1
  79. package/dist/lib/node/react-root-HQDBRGD3.cjs +51 -0
  80. package/dist/lib/node/react-root-HQDBRGD3.cjs.map +7 -0
  81. package/dist/lib/node/react-surface-KY5KFKVQ.cjs +122 -0
  82. package/dist/lib/node/react-surface-KY5KFKVQ.cjs.map +7 -0
  83. package/dist/lib/node/{settings-IXCPE55J.cjs → settings-H45P5YO2.cjs} +9 -9
  84. package/dist/lib/node/settings-H45P5YO2.cjs.map +7 -0
  85. package/dist/lib/node/{state-AT73KPGZ.cjs → state-IY5XX3H2.cjs} +10 -10
  86. package/dist/lib/node/state-IY5XX3H2.cjs.map +7 -0
  87. package/dist/lib/node/{types.cjs → types/index.cjs} +12 -6
  88. package/dist/lib/node/types/index.cjs.map +7 -0
  89. package/dist/lib/node-esm/ChannelContainer-AOXWXM53.mjs +16 -0
  90. package/dist/lib/node-esm/ChannelContainer-AOXWXM53.mjs.map +7 -0
  91. package/dist/lib/node-esm/ChatContainer-UJYPQMLV.mjs +15 -0
  92. package/dist/lib/node-esm/ChatContainer-UJYPQMLV.mjs.map +7 -0
  93. package/dist/lib/node-esm/app-graph-builder-I5VMPLE4.mjs +172 -0
  94. package/dist/lib/node-esm/app-graph-builder-I5VMPLE4.mjs.map +7 -0
  95. package/dist/lib/node-esm/call-manager-B3D3RK3R.mjs +24 -0
  96. package/dist/lib/node-esm/call-manager-B3D3RK3R.mjs.map +7 -0
  97. package/dist/lib/node-esm/chunk-CSO73XLB.mjs +546 -0
  98. package/dist/lib/node-esm/chunk-CSO73XLB.mjs.map +7 -0
  99. package/dist/lib/node-esm/{chunk-42F2DTMM.mjs → chunk-ESQC6SYE.mjs} +4 -4
  100. package/dist/lib/node-esm/chunk-ESQC6SYE.mjs.map +7 -0
  101. package/dist/lib/node-esm/chunk-J323VQ4P.mjs +127 -0
  102. package/dist/lib/node-esm/chunk-J323VQ4P.mjs.map +7 -0
  103. package/dist/lib/node-esm/chunk-JJLYSLLU.mjs +23 -0
  104. package/dist/lib/node-esm/chunk-JJLYSLLU.mjs.map +7 -0
  105. package/dist/lib/node-esm/{chunk-WLY2HMDB.mjs → chunk-K4KAUOKT.mjs} +5 -3
  106. package/dist/lib/node-esm/chunk-K4KAUOKT.mjs.map +7 -0
  107. package/dist/lib/node-esm/{chunk-J56FORYF.mjs → chunk-O3V45YJP.mjs} +57 -35
  108. package/dist/lib/node-esm/chunk-O3V45YJP.mjs.map +7 -0
  109. package/dist/lib/node-esm/chunk-PGRP3O4O.mjs +33 -0
  110. package/dist/lib/node-esm/chunk-PGRP3O4O.mjs.map +7 -0
  111. package/dist/lib/node-esm/chunk-POKXRTII.mjs +352 -0
  112. package/dist/lib/node-esm/chunk-POKXRTII.mjs.map +7 -0
  113. package/dist/lib/node-esm/chunk-WBNC7KMA.mjs +1710 -0
  114. package/dist/lib/node-esm/chunk-WBNC7KMA.mjs.map +7 -0
  115. package/dist/lib/node-esm/chunk-X6AUQDTE.mjs +984 -0
  116. package/dist/lib/node-esm/chunk-X6AUQDTE.mjs.map +7 -0
  117. package/dist/lib/node-esm/index.mjs +107 -41
  118. package/dist/lib/node-esm/index.mjs.map +4 -4
  119. package/dist/lib/node-esm/{intent-resolver-OURFRSSF.mjs → intent-resolver-CU22OPAH.mjs} +102 -74
  120. package/dist/lib/node-esm/intent-resolver-CU22OPAH.mjs.map +7 -0
  121. package/dist/lib/node-esm/markdown-HRGGO7IA.mjs +170 -0
  122. package/dist/lib/node-esm/markdown-HRGGO7IA.mjs.map +7 -0
  123. package/dist/lib/node-esm/meta.json +1 -1
  124. package/dist/lib/node-esm/react-root-MKN5SK3G.mjs +28 -0
  125. package/dist/lib/node-esm/react-root-MKN5SK3G.mjs.map +7 -0
  126. package/dist/lib/node-esm/react-surface-J2C7CVX7.mjs +109 -0
  127. package/dist/lib/node-esm/react-surface-J2C7CVX7.mjs.map +7 -0
  128. package/dist/lib/node-esm/{settings-ZUJQ4LWI.mjs → settings-IJGUOU3F.mjs} +5 -5
  129. package/dist/lib/node-esm/settings-IJGUOU3F.mjs.map +7 -0
  130. package/dist/lib/node-esm/{state-SSDX5O67.mjs → state-6AUTNROZ.mjs} +7 -7
  131. package/dist/lib/node-esm/state-6AUTNROZ.mjs.map +7 -0
  132. package/dist/lib/node-esm/types/index.mjs +17 -0
  133. package/dist/lib/node-esm/types/index.mjs.map +7 -0
  134. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  135. package/dist/types/src/calls/call-manager.d.ts +77 -0
  136. package/dist/types/src/calls/call-manager.d.ts.map +1 -0
  137. package/dist/types/src/calls/call-swarm-synchronizer.d.ts +66 -0
  138. package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +1 -0
  139. package/dist/types/src/calls/index.d.ts +7 -0
  140. package/dist/types/src/calls/index.d.ts.map +1 -0
  141. package/dist/types/src/calls/media-manager.d.ts +60 -0
  142. package/dist/types/src/calls/media-manager.d.ts.map +1 -0
  143. package/dist/types/src/calls/speaking-monitor.d.ts +24 -0
  144. package/dist/types/src/calls/speaking-monitor.d.ts.map +1 -0
  145. package/dist/types/src/calls/types.d.ts +45 -0
  146. package/dist/types/src/calls/types.d.ts.map +1 -0
  147. package/dist/types/src/calls/util/audio.d.ts +6 -0
  148. package/dist/types/src/calls/util/audio.d.ts.map +1 -0
  149. package/dist/types/src/calls/util/calls-service.d.ts +72 -0
  150. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -0
  151. package/dist/types/src/calls/util/history-cache.d.ts +11 -0
  152. package/dist/types/src/calls/util/history-cache.d.ts.map +1 -0
  153. package/dist/types/src/calls/util/index.d.ts +5 -0
  154. package/dist/types/src/calls/util/index.d.ts.map +1 -0
  155. package/dist/types/src/calls/util/media.d.ts +6 -0
  156. package/dist/types/src/calls/util/media.d.ts.map +1 -0
  157. package/dist/types/src/calls/util/stub-media-streams.d.ts +18 -0
  158. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -0
  159. package/dist/types/src/calls/util/task-scheduling.d.ts +17 -0
  160. package/dist/types/src/calls/util/task-scheduling.d.ts.map +1 -0
  161. package/dist/types/src/capabilities/app-graph-builder.d.ts +2 -179
  162. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  163. package/dist/types/src/capabilities/call-manager.d.ts +5 -0
  164. package/dist/types/src/capabilities/call-manager.d.ts.map +1 -0
  165. package/dist/types/src/capabilities/capabilities.d.ts +13 -1
  166. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  167. package/dist/types/src/capabilities/index.d.ts +8 -179
  168. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  169. package/dist/types/src/capabilities/intent-resolver.d.ts +2 -2
  170. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  171. package/dist/types/src/capabilities/markdown.d.ts +2 -2
  172. package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
  173. package/dist/types/src/capabilities/react-root.d.ts +7 -0
  174. package/dist/types/src/capabilities/react-root.d.ts.map +1 -0
  175. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  176. package/dist/types/src/components/Call/Call.d.ts +17 -0
  177. package/dist/types/src/components/Call/Call.d.ts.map +1 -0
  178. package/dist/types/src/components/Call/Toolbar.d.ts +16 -0
  179. package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -0
  180. package/dist/types/src/components/Call/index.d.ts +3 -0
  181. package/dist/types/src/components/Call/index.d.ts.map +1 -0
  182. package/dist/types/src/components/CallDebugPanel.d.ts +8 -0
  183. package/dist/types/src/components/CallDebugPanel.d.ts.map +1 -0
  184. package/dist/types/src/components/CallSidebar.d.ts +4 -0
  185. package/dist/types/src/components/CallSidebar.d.ts.map +1 -0
  186. package/dist/types/src/components/ChannelContainer.d.ts +14 -0
  187. package/dist/types/src/components/ChannelContainer.d.ts.map +1 -0
  188. package/dist/types/src/components/ChannelContainer.stories.d.ts +10 -0
  189. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +1 -0
  190. package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
  191. package/dist/types/src/components/ChatContainer.d.ts +9 -7
  192. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  193. package/dist/types/src/components/CommentContainer.d.ts +11 -2
  194. package/dist/types/src/components/CommentContainer.d.ts.map +1 -1
  195. package/dist/types/src/components/Comments.stories.d.ts +1 -1
  196. package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
  197. package/dist/types/src/components/CommentsContainer.d.ts +5 -9
  198. package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
  199. package/dist/types/src/components/Lobby/Lobby.d.ts +15 -0
  200. package/dist/types/src/components/Lobby/Lobby.d.ts.map +1 -0
  201. package/dist/types/src/components/Lobby/index.d.ts +2 -0
  202. package/dist/types/src/components/Lobby/index.d.ts.map +1 -0
  203. package/dist/types/src/components/Media/AudioStream.d.ts +6 -0
  204. package/dist/types/src/components/Media/AudioStream.d.ts.map +1 -0
  205. package/dist/types/src/components/Media/VideoObject.d.ts +15 -0
  206. package/dist/types/src/components/Media/VideoObject.d.ts.map +1 -0
  207. package/dist/types/src/components/Media/VideoObject.stories.d.ts +8 -0
  208. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -0
  209. package/dist/types/src/components/Media/index.d.ts +3 -0
  210. package/dist/types/src/components/Media/index.d.ts.map +1 -0
  211. package/dist/types/src/components/MessageContainer.d.ts +5 -4
  212. package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
  213. package/dist/types/src/components/Participant/Participant.d.ts +6 -0
  214. package/dist/types/src/components/Participant/Participant.d.ts.map +1 -0
  215. package/dist/types/src/components/Participant/ParticipantGrid.d.ts +11 -0
  216. package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +1 -0
  217. package/dist/types/src/components/Participant/index.d.ts +3 -0
  218. package/dist/types/src/components/Participant/index.d.ts.map +1 -0
  219. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.d.ts +12 -0
  220. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.d.ts.map +1 -0
  221. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +10 -0
  222. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +1 -0
  223. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts +32 -0
  224. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts.map +1 -0
  225. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +23 -0
  226. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -0
  227. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts +21 -0
  228. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +1 -0
  229. package/dist/types/src/components/ResponsiveGrid/index.d.ts +4 -0
  230. package/dist/types/src/components/ResponsiveGrid/index.d.ts.map +1 -0
  231. package/dist/types/src/components/ThreadComplementary.d.ts.map +1 -1
  232. package/dist/types/src/components/ThreadSettings.d.ts.map +1 -1
  233. package/dist/types/src/components/index.d.ts +5 -1
  234. package/dist/types/src/components/index.d.ts.map +1 -1
  235. package/dist/types/src/components/testing.d.ts +101 -54
  236. package/dist/types/src/components/testing.d.ts.map +1 -1
  237. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  238. package/dist/types/src/hooks/analytics.d.ts +3 -3
  239. package/dist/types/src/hooks/analytics.d.ts.map +1 -1
  240. package/dist/types/src/hooks/index.d.ts +2 -1
  241. package/dist/types/src/hooks/index.d.ts.map +1 -1
  242. package/dist/types/src/hooks/useDebugMode.d.ts +2 -0
  243. package/dist/types/src/hooks/useDebugMode.d.ts.map +1 -0
  244. package/dist/types/src/hooks/useStatus.d.ts.map +1 -1
  245. package/dist/types/src/index.d.ts +1 -1
  246. package/dist/types/src/index.d.ts.map +1 -1
  247. package/dist/types/src/meta.d.ts.map +1 -1
  248. package/dist/types/src/peers.stories.d.ts +11 -0
  249. package/dist/types/src/peers.stories.d.ts.map +1 -0
  250. package/dist/types/src/testing/index.d.ts +2 -0
  251. package/dist/types/src/testing/index.d.ts.map +1 -0
  252. package/dist/types/src/testing/stories.d.ts +2 -0
  253. package/dist/types/src/testing/stories.d.ts.map +1 -0
  254. package/dist/types/src/translations.d.ts +35 -56
  255. package/dist/types/src/translations.d.ts.map +1 -1
  256. package/dist/types/src/types/index.d.ts +3 -0
  257. package/dist/types/src/types/index.d.ts.map +1 -0
  258. package/dist/types/src/types/schema.d.ts +317 -0
  259. package/dist/types/src/types/schema.d.ts.map +1 -0
  260. package/dist/types/src/types/types.d.ts +1015 -0
  261. package/dist/types/src/types/types.d.ts.map +1 -0
  262. package/dist/types/src/util.d.ts +2 -0
  263. package/dist/types/src/util.d.ts.map +1 -1
  264. package/dist/types/tsconfig.tsbuildinfo +1 -1
  265. package/package.json +60 -40
  266. package/src/ThreadPlugin.tsx +33 -14
  267. package/src/calls/call-manager.ts +242 -0
  268. package/src/calls/call-swarm-synchronizer.ts +350 -0
  269. package/src/calls/index.ts +10 -0
  270. package/src/calls/media-manager.ts +342 -0
  271. package/src/calls/speaking-monitor.ts +85 -0
  272. package/src/calls/types.ts +70 -0
  273. package/src/calls/util/audio.ts +58 -0
  274. package/src/calls/util/calls-service.ts +527 -0
  275. package/src/calls/util/history-cache.ts +27 -0
  276. package/src/calls/util/index.ts +8 -0
  277. package/src/calls/util/media.ts +52 -0
  278. package/src/calls/util/stub-media-streams.ts +73 -0
  279. package/src/calls/util/task-scheduling.ts +92 -0
  280. package/src/capabilities/app-graph-builder.ts +171 -25
  281. package/src/capabilities/call-manager.ts +19 -0
  282. package/src/capabilities/capabilities.ts +15 -1
  283. package/src/capabilities/index.ts +2 -0
  284. package/src/capabilities/intent-resolver.ts +77 -56
  285. package/src/capabilities/markdown.ts +54 -4
  286. package/src/capabilities/react-root.tsx +17 -0
  287. package/src/capabilities/react-surface.tsx +52 -27
  288. package/src/capabilities/settings.ts +2 -2
  289. package/src/capabilities/state.ts +3 -3
  290. package/src/components/Call/Call.tsx +88 -0
  291. package/src/components/Call/Toolbar.tsx +182 -0
  292. package/src/components/Call/index.ts +6 -0
  293. package/src/components/CallDebugPanel.tsx +115 -0
  294. package/src/components/CallSidebar.tsx +17 -0
  295. package/src/components/ChannelContainer.stories.tsx +58 -0
  296. package/src/components/ChannelContainer.tsx +203 -0
  297. package/src/components/Chat.stories.tsx +11 -12
  298. package/src/components/ChatContainer.tsx +37 -25
  299. package/src/components/CommentContainer.tsx +56 -61
  300. package/src/components/Comments.stories.tsx +20 -16
  301. package/src/components/CommentsContainer.tsx +20 -36
  302. package/src/components/Lobby/Lobby.tsx +119 -0
  303. package/src/components/Lobby/index.ts +5 -0
  304. package/src/components/Media/AudioStream.tsx +67 -0
  305. package/src/components/Media/VideoObject.stories.tsx +52 -0
  306. package/src/components/Media/VideoObject.tsx +58 -0
  307. package/src/components/Media/index.ts +6 -0
  308. package/src/components/MessageContainer.tsx +31 -50
  309. package/src/components/Participant/Participant.tsx +57 -0
  310. package/src/components/Participant/ParticipantGrid.tsx +88 -0
  311. package/src/components/Participant/index.ts +6 -0
  312. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +54 -0
  313. package/src/components/ResponsiveGrid/ResponsiveContainer.tsx +31 -0
  314. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +156 -0
  315. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +341 -0
  316. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +131 -0
  317. package/src/components/ResponsiveGrid/index.ts +7 -0
  318. package/src/components/ThreadComplementary.tsx +37 -42
  319. package/src/components/index.ts +4 -0
  320. package/src/components/testing.ts +6 -5
  321. package/src/extensions/threads.ts +42 -24
  322. package/src/hooks/analytics.ts +4 -4
  323. package/src/hooks/index.ts +2 -1
  324. package/src/hooks/useDebugMode.ts +25 -0
  325. package/src/index.ts +1 -1
  326. package/src/meta.ts +4 -3
  327. package/src/peers.stories.tsx +189 -0
  328. package/src/testing/index.ts +5 -0
  329. package/src/testing/stories.ts +50 -0
  330. package/src/translations.ts +46 -5
  331. package/src/types/index.ts +6 -0
  332. package/src/types/schema.ts +29 -0
  333. package/src/types/types.ts +110 -0
  334. package/src/typings/peermetrics-webrtc-stats.d.ts +30 -0
  335. package/src/util.ts +12 -0
  336. package/dist/lib/browser/ChatContainer-IOOAQW6S.mjs +0 -138
  337. package/dist/lib/browser/ChatContainer-IOOAQW6S.mjs.map +0 -7
  338. package/dist/lib/browser/app-graph-builder-6W4UKJDI.mjs +0 -41
  339. package/dist/lib/browser/app-graph-builder-6W4UKJDI.mjs.map +0 -7
  340. package/dist/lib/browser/chunk-EP6MRLY7.mjs.map +0 -7
  341. package/dist/lib/browser/chunk-QDJ3Y6WF.mjs.map +0 -7
  342. package/dist/lib/browser/chunk-S5ZR4FYW.mjs +0 -17
  343. package/dist/lib/browser/chunk-S5ZR4FYW.mjs.map +0 -7
  344. package/dist/lib/browser/chunk-TFVPUPOO.mjs +0 -207
  345. package/dist/lib/browser/chunk-TFVPUPOO.mjs.map +0 -7
  346. package/dist/lib/browser/chunk-WBJLUUOK.mjs.map +0 -7
  347. package/dist/lib/browser/chunk-WOG72DWE.mjs +0 -93
  348. package/dist/lib/browser/chunk-WOG72DWE.mjs.map +0 -7
  349. package/dist/lib/browser/intent-resolver-QAY4FLLM.mjs.map +0 -7
  350. package/dist/lib/browser/markdown-7KXBXCUS.mjs +0 -111
  351. package/dist/lib/browser/markdown-7KXBXCUS.mjs.map +0 -7
  352. package/dist/lib/browser/react-surface-MT3OWULR.mjs +0 -437
  353. package/dist/lib/browser/react-surface-MT3OWULR.mjs.map +0 -7
  354. package/dist/lib/browser/settings-4FEC7EAX.mjs.map +0 -7
  355. package/dist/lib/browser/state-PNMSLKAH.mjs.map +0 -7
  356. package/dist/lib/browser/types.mjs +0 -10
  357. package/dist/lib/node/ChatContainer-4FNDRF3G.cjs +0 -163
  358. package/dist/lib/node/ChatContainer-4FNDRF3G.cjs.map +0 -7
  359. package/dist/lib/node/app-graph-builder-HZNWT4QU.cjs +0 -57
  360. package/dist/lib/node/app-graph-builder-HZNWT4QU.cjs.map +0 -7
  361. package/dist/lib/node/chunk-46BSFPBV.cjs +0 -113
  362. package/dist/lib/node/chunk-46BSFPBV.cjs.map +0 -7
  363. package/dist/lib/node/chunk-AKINTFBH.cjs.map +0 -7
  364. package/dist/lib/node/chunk-E7Z3BKRQ.cjs +0 -232
  365. package/dist/lib/node/chunk-E7Z3BKRQ.cjs.map +0 -7
  366. package/dist/lib/node/chunk-NQ5DTPOY.cjs.map +0 -7
  367. package/dist/lib/node/chunk-S2A6BXEA.cjs.map +0 -7
  368. package/dist/lib/node/intent-resolver-S6FE5OR7.cjs.map +0 -7
  369. package/dist/lib/node/markdown-L2WMCQKM.cjs +0 -121
  370. package/dist/lib/node/markdown-L2WMCQKM.cjs.map +0 -7
  371. package/dist/lib/node/react-surface-Z45BYECE.cjs +0 -439
  372. package/dist/lib/node/react-surface-Z45BYECE.cjs.map +0 -7
  373. package/dist/lib/node/settings-IXCPE55J.cjs.map +0 -7
  374. package/dist/lib/node/state-AT73KPGZ.cjs.map +0 -7
  375. package/dist/lib/node/types.cjs.map +0 -7
  376. package/dist/lib/node-esm/ChatContainer-NYLCL6QA.mjs +0 -139
  377. package/dist/lib/node-esm/ChatContainer-NYLCL6QA.mjs.map +0 -7
  378. package/dist/lib/node-esm/app-graph-builder-M3KK5QJH.mjs +0 -42
  379. package/dist/lib/node-esm/app-graph-builder-M3KK5QJH.mjs.map +0 -7
  380. package/dist/lib/node-esm/chunk-42F2DTMM.mjs.map +0 -7
  381. package/dist/lib/node-esm/chunk-ADTVMESP.mjs +0 -208
  382. package/dist/lib/node-esm/chunk-ADTVMESP.mjs.map +0 -7
  383. package/dist/lib/node-esm/chunk-E446MGLP.mjs +0 -94
  384. package/dist/lib/node-esm/chunk-E446MGLP.mjs.map +0 -7
  385. package/dist/lib/node-esm/chunk-J56FORYF.mjs.map +0 -7
  386. package/dist/lib/node-esm/chunk-WLY2HMDB.mjs.map +0 -7
  387. package/dist/lib/node-esm/chunk-WSE23GSG.mjs +0 -19
  388. package/dist/lib/node-esm/chunk-WSE23GSG.mjs.map +0 -7
  389. package/dist/lib/node-esm/intent-resolver-OURFRSSF.mjs.map +0 -7
  390. package/dist/lib/node-esm/markdown-ZKU23UVD.mjs +0 -112
  391. package/dist/lib/node-esm/markdown-ZKU23UVD.mjs.map +0 -7
  392. package/dist/lib/node-esm/react-surface-KIJ767JK.mjs +0 -438
  393. package/dist/lib/node-esm/react-surface-KIJ767JK.mjs.map +0 -7
  394. package/dist/lib/node-esm/settings-ZUJQ4LWI.mjs.map +0 -7
  395. package/dist/lib/node-esm/state-SSDX5O67.mjs.map +0 -7
  396. package/dist/lib/node-esm/types.mjs +0 -11
  397. package/dist/types/src/components/types.d.ts +0 -28
  398. package/dist/types/src/components/types.d.ts.map +0 -1
  399. package/dist/types/src/events.d.ts +0 -4
  400. package/dist/types/src/events.d.ts.map +0 -1
  401. package/dist/types/src/types.d.ts +0 -125
  402. package/dist/types/src/types.d.ts.map +0 -1
  403. package/src/components/types.ts +0 -32
  404. package/src/events.ts +0 -11
  405. package/src/types.ts +0 -100
  406. /package/dist/lib/browser/{types.mjs.map → ChannelContainer-XFNGSLHL.mjs.map} +0 -0
  407. /package/dist/lib/{node-esm/types.mjs.map → browser/ChatContainer-JWRI73OG.mjs.map} +0 -0
@@ -0,0 +1,984 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ ThreadCapabilities
4
+ } from "./chunk-K4KAUOKT.mjs";
5
+ import {
6
+ ChatContainer_default
7
+ } from "./chunk-POKXRTII.mjs";
8
+ import {
9
+ useDebugMode
10
+ } from "./chunk-O3V45YJP.mjs";
11
+ import {
12
+ THREAD_PLUGIN
13
+ } from "./chunk-ESQC6SYE.mjs";
14
+
15
+ // packages/plugins/plugin-thread/src/components/ChannelContainer.tsx
16
+ import { useSignals as _useSignals10 } from "@preact-signals/safe-react/tracking";
17
+ import { Rx } from "@effect-rx/rx-react";
18
+ import React10, { useCallback as useCallback2, useEffect as useEffect6, useMemo as useMemo4, useState as useState4 } from "react";
19
+ import { useCapabilities, useCapability as useCapability4 } from "@dxos/app-framework";
20
+ import { Context } from "@dxos/context";
21
+ import { log } from "@dxos/log";
22
+ import { useClient } from "@dxos/react-client";
23
+ import { fullyQualifiedId as fullyQualifiedId2, getSpace } from "@dxos/react-client/echo";
24
+ import { useIdentity } from "@dxos/react-client/halo";
25
+ import { useTranslation as useTranslation3, Input, ElevationProvider } from "@dxos/react-ui";
26
+ import { ControlGroup, ControlItemInput, ControlGroupButton } from "@dxos/react-ui-form";
27
+ import { ToolbarMenu, MenuProvider, createMenuAction, useMenuActions, createMenuItemGroup } from "@dxos/react-ui-menu";
28
+ import { useSoundEffect } from "@dxos/react-ui-sfx";
29
+ import { StackItem } from "@dxos/react-ui-stack";
30
+
31
+ // packages/plugins/plugin-thread/src/components/Call/Call.tsx
32
+ import { useSignals as _useSignals9 } from "@preact-signals/safe-react/tracking";
33
+ import React9 from "react";
34
+ import { useCapability as useCapability3 } from "@dxos/app-framework";
35
+
36
+ // packages/plugins/plugin-thread/src/components/Call/Toolbar.tsx
37
+ import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
38
+ import React from "react";
39
+ import { useAppGraph, useCapability } from "@dxos/app-framework";
40
+ import { useNode, useActions } from "@dxos/plugin-graph";
41
+ import { fullyQualifiedId } from "@dxos/react-client/echo";
42
+ import { Icon, IconButton, Toolbar as NativeToolbar, toLocalizedString, useTranslation } from "@dxos/react-ui";
43
+ import { hoverableHidden, mx } from "@dxos/react-ui-theme";
44
+ var Toolbar = ({ classNames, channel, participants, autoHideControls = true, onJoin, onLeave }) => {
45
+ var _effect = _useSignals();
46
+ try {
47
+ const { t } = useTranslation(THREAD_PLUGIN);
48
+ const { graph } = useAppGraph();
49
+ const call = useCapability(ThreadCapabilities.CallManager);
50
+ const node = useNode(graph, channel && fullyQualifiedId(channel));
51
+ const actions = useActions(graph, node?.id).filter((action) => action.properties.disposition === "toolbar");
52
+ const isScreensharing = call.media.screenshareTrack !== void 0;
53
+ const canSharescreen = typeof navigator.mediaDevices !== "undefined" && navigator.mediaDevices.getDisplayMedia !== void 0;
54
+ return /* @__PURE__ */ React.createElement("div", {
55
+ className: mx("z-20 flex justify-center m-8", autoHideControls && hoverableHidden)
56
+ }, /* @__PURE__ */ React.createElement(NativeToolbar.Root, {
57
+ classNames: [
58
+ "p-2 bg-modalSurface rounded-lg shadow-lg",
59
+ classNames
60
+ ]
61
+ }, /* @__PURE__ */ React.createElement(ToggleButton, {
62
+ active: call.media.audioEnabled,
63
+ state: {
64
+ on: {
65
+ icon: "ph--microphone--regular",
66
+ label: t("mic off"),
67
+ onClick: () => call.turnAudioOff(),
68
+ classNames: "bg-callActive"
69
+ },
70
+ off: {
71
+ icon: "ph--microphone-slash--duotone",
72
+ label: t("mic on"),
73
+ onClick: () => call.turnAudioOn(),
74
+ classNames: [
75
+ call.joined && "bg-callAlert"
76
+ ]
77
+ }
78
+ }
79
+ }), /* @__PURE__ */ React.createElement(ToggleButton, {
80
+ active: call.media.videoEnabled,
81
+ state: {
82
+ on: {
83
+ icon: "ph--video-camera--regular",
84
+ label: t("camera off"),
85
+ onClick: () => call.turnVideoOff()
86
+ },
87
+ off: {
88
+ icon: "ph--video-camera-slash--duotone",
89
+ label: t("camera on"),
90
+ onClick: () => call.turnVideoOn()
91
+ }
92
+ }
93
+ }), participants !== void 0 && /* @__PURE__ */ React.createElement("div", {
94
+ className: "flex justify-center items-center gap-2 is-[5rem] text-xs text-subdued"
95
+ }, /* @__PURE__ */ React.createElement(Icon, {
96
+ icon: "ph--users--regular",
97
+ size: 4
98
+ }), /* @__PURE__ */ React.createElement("div", null, participants)) || /* @__PURE__ */ React.createElement(NativeToolbar.Separator, {
99
+ variant: "gap"
100
+ }), call.joined && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(ToggleButton, {
101
+ disabled: !canSharescreen,
102
+ active: isScreensharing,
103
+ state: {
104
+ on: {
105
+ icon: "ph--monitor--regular",
106
+ label: t("screenshare off"),
107
+ onClick: () => call.turnScreenshareOff()
108
+ },
109
+ off: {
110
+ icon: "ph--monitor-arrow-up--duotone",
111
+ label: t("screenshare on"),
112
+ onClick: () => call.turnScreenshareOn()
113
+ }
114
+ }
115
+ }), actions.map((action) => /* @__PURE__ */ React.createElement(IconButton, {
116
+ key: action.id,
117
+ ...defaultButtonProps,
118
+ icon: action.properties.icon,
119
+ label: toLocalizedString(action.properties.label, t),
120
+ classNames: action.properties.classNames,
121
+ onClick: () => action.data({
122
+ node
123
+ })
124
+ })), /* @__PURE__ */ React.createElement(ToggleButton, {
125
+ active: call.raisedHand,
126
+ state: {
127
+ on: {
128
+ icon: "ph--hand-waving--regular",
129
+ label: t("lower hand"),
130
+ onClick: () => call.setRaisedHand(false),
131
+ classNames: [
132
+ call.joined && "bg-callAlert"
133
+ ]
134
+ },
135
+ off: {
136
+ icon: "ph--hand-palm--duotone",
137
+ label: t("raise hand"),
138
+ onClick: () => call.setRaisedHand(true)
139
+ }
140
+ }
141
+ })), call.joined ? /* @__PURE__ */ React.createElement(IconButton, {
142
+ variant: "destructive",
143
+ icon: "ph--phone-x--regular",
144
+ label: t("leave call"),
145
+ onClick: onLeave
146
+ }) : /* @__PURE__ */ React.createElement(IconButton, {
147
+ variant: "primary",
148
+ icon: "ph--phone-incoming--regular",
149
+ label: t("join call"),
150
+ onClick: onJoin
151
+ })));
152
+ } finally {
153
+ _effect.f();
154
+ }
155
+ };
156
+ Toolbar.displayName = "MeetingToolbar";
157
+ var defaultButtonProps = {
158
+ size: 5,
159
+ iconOnly: true
160
+ };
161
+ var ToggleButton = ({ active, state }) => {
162
+ var _effect = _useSignals();
163
+ try {
164
+ return /* @__PURE__ */ React.createElement(IconButton, {
165
+ ...defaultButtonProps,
166
+ classNames: [
167
+ active ? state.on.classNames ?? "bg-callActive" : state.off.classNames
168
+ ],
169
+ icon: active ? state.on.icon : state.off.icon,
170
+ label: active ? state.on.label : state.off.label,
171
+ onClick: active ? state.on.onClick : state.off.onClick
172
+ });
173
+ } finally {
174
+ _effect.f();
175
+ }
176
+ };
177
+
178
+ // packages/plugins/plugin-thread/src/components/Media/AudioStream.tsx
179
+ import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
180
+ import React2, { useEffect, useRef } from "react";
181
+ var AudioStream = ({ tracks }) => {
182
+ var _effect = _useSignals2();
183
+ try {
184
+ const mediaStreamRef = useRef(new MediaStream());
185
+ const ref = useRef(null);
186
+ useEffect(() => {
187
+ const audio = ref.current;
188
+ if (!audio) {
189
+ return;
190
+ }
191
+ const mediaStream = mediaStreamRef.current;
192
+ audio.srcObject = mediaStream;
193
+ }, []);
194
+ const resetSrcObject = () => {
195
+ const audio = ref.current;
196
+ const mediaStream = mediaStreamRef.current;
197
+ if (!audio || !mediaStream) {
198
+ return;
199
+ }
200
+ audio.addEventListener("canplay", () => audio.play(), {
201
+ once: true
202
+ });
203
+ audio.srcObject = mediaStream;
204
+ };
205
+ return /* @__PURE__ */ React2.createElement(React2.Fragment, null, /* @__PURE__ */ React2.createElement("audio", {
206
+ ref,
207
+ autoPlay: true
208
+ }), tracks.map((track) => /* @__PURE__ */ React2.createElement(AudioTrack, {
209
+ key: track.id,
210
+ track,
211
+ mediaStream: mediaStreamRef.current,
212
+ resetSrcObject
213
+ })));
214
+ } finally {
215
+ _effect.f();
216
+ }
217
+ };
218
+ var AudioTrack = ({ track, mediaStream, resetSrcObject }) => {
219
+ useEffect(() => {
220
+ const currentTrack = track;
221
+ mediaStream.addTrack(currentTrack);
222
+ resetSrcObject();
223
+ return () => {
224
+ mediaStream.removeTrack(currentTrack);
225
+ resetSrcObject();
226
+ };
227
+ }, [
228
+ track,
229
+ mediaStream
230
+ ]);
231
+ return null;
232
+ };
233
+
234
+ // packages/plugins/plugin-thread/src/components/Media/VideoObject.tsx
235
+ import { useSignals as _useSignals3 } from "@preact-signals/safe-react/tracking";
236
+ import React3, { forwardRef, memo, useEffect as useEffect2, useRef as useRef2 } from "react";
237
+ import { mx as mx2 } from "@dxos/react-ui-theme";
238
+ var VideoObject = /* @__PURE__ */ memo(/* @__PURE__ */ forwardRef(({ videoStream, classNames, flip, contain, ...rest }, ref) => {
239
+ var _effect = _useSignals3();
240
+ try {
241
+ const internalRef = useRef2(null);
242
+ useEffect2(() => {
243
+ const video = internalRef.current;
244
+ if (video && videoStream) {
245
+ video.srcObject = videoStream;
246
+ video.setAttribute("autoplay", "true");
247
+ video.setAttribute("playsinline", "true");
248
+ }
249
+ }, [
250
+ videoStream,
251
+ internalRef.current
252
+ ]);
253
+ return /* @__PURE__ */ React3.createElement("video", {
254
+ className: mx2("w-full aspect-video", flip && "scale-x-[-1]", contain ? "object-contain" : "object-cover", classNames),
255
+ ref: (v) => {
256
+ internalRef.current = v;
257
+ if (ref === null) {
258
+ return;
259
+ }
260
+ if (typeof ref === "function") {
261
+ ref(v);
262
+ } else {
263
+ ref.current = v;
264
+ }
265
+ },
266
+ ...rest
267
+ });
268
+ } finally {
269
+ _effect.f();
270
+ }
271
+ }));
272
+ VideoObject.displayName = "VideoObject";
273
+
274
+ // packages/plugins/plugin-thread/src/components/Participant/Participant.tsx
275
+ import { useSignals as _useSignals7 } from "@preact-signals/safe-react/tracking";
276
+ import React7, { memo as memo2, useMemo as useMemo2 } from "react";
277
+ import { useCapability as useCapability2 } from "@dxos/app-framework";
278
+
279
+ // packages/plugins/plugin-thread/src/components/ResponsiveGrid/ResponsiveContainer.tsx
280
+ import { useSignals as _useSignals4 } from "@preact-signals/safe-react/tracking";
281
+ import React4 from "react";
282
+ import { mx as mx3 } from "@dxos/react-ui-theme";
283
+ var ResponsiveContainer = ({ children }) => {
284
+ var _effect = _useSignals4();
285
+ try {
286
+ return (
287
+ // Outer container that takes full size of parent.
288
+ /* @__PURE__ */ React4.createElement("div", {
289
+ role: "none",
290
+ className: "relative flex w-full h-full"
291
+ }, /* @__PURE__ */ React4.createElement("div", {
292
+ role: "none",
293
+ className: "absolute inset-0 flex justify-center items-center"
294
+ }, /* @__PURE__ */ React4.createElement("div", {
295
+ role: "none",
296
+ className: mx3("max-h-full max-w-full w-auto h-auto aspect-video")
297
+ }, children)))
298
+ );
299
+ } finally {
300
+ _effect.f();
301
+ }
302
+ };
303
+
304
+ // packages/plugins/plugin-thread/src/components/ResponsiveGrid/ResponsiveGrid.tsx
305
+ import { useSignals as _useSignals5 } from "@preact-signals/safe-react/tracking";
306
+ import React5, { useLayoutEffect, useState, useEffect as useEffect3, useMemo, useCallback } from "react";
307
+ import { useResizeDetector } from "react-resize-detector";
308
+ import { invariant } from "@dxos/invariant";
309
+ import { mx as mx4 } from "@dxos/react-ui-theme";
310
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/plugin-thread/src/components/ResponsiveGrid/ResponsiveGrid.tsx";
311
+ var ASPECT_RATIO = 16 / 9;
312
+ var MIN_GALLERY_HEIGHT = 250;
313
+ var DEFAULT_GAP = 8;
314
+ var maxImageSize = "w-[2560px] h-[1440px]";
315
+ var defaultGetId = (item) => item.id;
316
+ var ResponsiveGrid = ({ classNames, Cell, gap = DEFAULT_GAP, getId: getId2 = defaultGetId, items, pinned, autoHideGallery = false, debug, onPinnedChange }) => {
317
+ var _effect = _useSignals5();
318
+ try {
319
+ const { width: containerWidth = 0, height: containerHeight = 0, ref: containerRef } = useResizeDetector({
320
+ refreshRate: 100
321
+ });
322
+ const [dividerHeight, setDividerHeight] = useState(0);
323
+ useEffect3(() => {
324
+ if (containerWidth && containerHeight) {
325
+ const { height: height2 } = fitAspectRatio(containerWidth, containerHeight, ASPECT_RATIO);
326
+ setDividerHeight(Math.min(height2, containerHeight - MIN_GALLERY_HEIGHT));
327
+ }
328
+ }, [
329
+ containerWidth,
330
+ containerHeight
331
+ ]);
332
+ const pinnedItem = useMemo(() => items.find((item) => getId2(item) === pinned), [
333
+ items,
334
+ pinned
335
+ ]);
336
+ const mainItems = useMemo(() => items.filter((item) => getId2(item) !== pinned), [
337
+ items,
338
+ pinned
339
+ ]);
340
+ const hideGallery = autoHideGallery && pinnedItem !== void 0;
341
+ const [{ time, columns, cellWidth }, setLayout] = useState({
342
+ time: 0,
343
+ columns: 0,
344
+ cellWidth: 0
345
+ });
346
+ const { width = 0, height = 0, ref: gridContainerRef } = useResizeDetector({
347
+ refreshRate: 200
348
+ });
349
+ useEffect3(() => {
350
+ if (containerHeight && width && height) {
351
+ const layout = calculateLayout(width, height, mainItems.length, gap);
352
+ setLayout({
353
+ time: Date.now(),
354
+ ...layout
355
+ });
356
+ }
357
+ }, [
358
+ containerHeight,
359
+ width,
360
+ height,
361
+ mainItems.length,
362
+ gap,
363
+ pinned
364
+ ]);
365
+ const [bounds, setBounds] = useState([]);
366
+ useLayoutEffect(() => {
367
+ if (!hideGallery && !gridContainerRef.current || !containerHeight) {
368
+ return;
369
+ }
370
+ const t = setTimeout(() => {
371
+ setBounds(items.filter((item) => !hideGallery || item === pinnedItem).map((item) => {
372
+ invariant(containerRef.current, void 0, {
373
+ F: __dxlog_file,
374
+ L: 117,
375
+ S: void 0,
376
+ A: [
377
+ "containerRef.current",
378
+ ""
379
+ ]
380
+ });
381
+ const el = containerRef.current.querySelector(`[data-grid-item="${getId2(item)}"]`);
382
+ if (!el) {
383
+ return null;
384
+ }
385
+ const bounds2 = getRelativeBounds(containerRef.current, el);
386
+ return [
387
+ item,
388
+ bounds2
389
+ ];
390
+ }).filter((item) => item !== null));
391
+ });
392
+ return () => clearTimeout(t);
393
+ }, [
394
+ containerHeight,
395
+ items,
396
+ pinnedItem,
397
+ hideGallery,
398
+ time
399
+ ]);
400
+ const handleClick = useCallback((item) => onPinnedChange?.(getId2(item) === pinned ? void 0 : getId2(item)), [
401
+ pinned,
402
+ onPinnedChange
403
+ ]);
404
+ return /* @__PURE__ */ React5.createElement("div", {
405
+ ref: containerRef,
406
+ className: mx4("relative w-full h-full", classNames)
407
+ }, /* @__PURE__ */ React5.createElement("div", {
408
+ className: "absolute inset-0 flex flex-col grow gap-2"
409
+ }, pinnedItem && /* @__PURE__ */ React5.createElement("div", {
410
+ className: mx4("flex grow-[2] shrink overflow-hidden justify-center items-center", hideGallery && "h-full"),
411
+ style: hideGallery ? {} : {
412
+ height: dividerHeight
413
+ }
414
+ }, /* @__PURE__ */ React5.createElement(SoloItem, {
415
+ id: getId2(pinnedItem),
416
+ debug
417
+ })), !hideGallery && /* @__PURE__ */ React5.createElement("div", {
418
+ ref: gridContainerRef,
419
+ className: "flex grow-[1] overflow-hidden justify-center items-center",
420
+ style: hideGallery ? {} : {
421
+ minHeight: MIN_GALLERY_HEIGHT
422
+ }
423
+ }, mainItems.length === 1 && /* @__PURE__ */ React5.createElement("div", {
424
+ style: {
425
+ width: cellWidth
426
+ },
427
+ className: "flex h-full"
428
+ }, /* @__PURE__ */ React5.createElement(SoloItem, {
429
+ id: getId2(mainItems[0]),
430
+ debug
431
+ })), mainItems.length > 1 && columns > 0 && /* @__PURE__ */ React5.createElement("div", {
432
+ role: "grid",
433
+ style: {
434
+ display: "grid",
435
+ gridTemplateColumns: `repeat(${columns}, ${cellWidth}px)`,
436
+ gap: `${gap}px`
437
+ }
438
+ }, mainItems.map((item) => /* @__PURE__ */ React5.createElement("div", {
439
+ key: getId2(item),
440
+ "data-grid-item": getId2(item),
441
+ className: mx4("aspect-video max-h-full max-w-full w-auto h-auto", debug && "border border-primary-500")
442
+ }))))), /* @__PURE__ */ React5.createElement("div", {
443
+ className: mx4(debug && "opacity-10")
444
+ }, bounds.map(([item, bounds2]) => /* @__PURE__ */ React5.createElement(Cell, {
445
+ key: getId2(item),
446
+ classNames: "absolute transition-all duration-500",
447
+ item,
448
+ style: bounds2,
449
+ pinned: getId2(item) === pinned,
450
+ onClick: items.length > 1 ? handleClick : void 0
451
+ }))));
452
+ } finally {
453
+ _effect.f();
454
+ }
455
+ };
456
+ var SoloItem = ({ debug, id }) => {
457
+ var _effect = _useSignals5();
458
+ try {
459
+ return /* @__PURE__ */ React5.createElement(ResponsiveContainer, null, /* @__PURE__ */ React5.createElement("div", {
460
+ "data-grid-item": id,
461
+ className: mx4("aspect-video overflow-hidden", debug && "z-20 border-2 border-primary-500")
462
+ }, /* @__PURE__ */ React5.createElement("img", {
463
+ alt: "placeholder video",
464
+ className: mx4("opacity-0", maxImageSize)
465
+ })));
466
+ } finally {
467
+ _effect.f();
468
+ }
469
+ };
470
+ var getRelativeBounds = (container, el) => {
471
+ const containerRect = container.getBoundingClientRect();
472
+ const elementRect = el.getBoundingClientRect();
473
+ return {
474
+ top: elementRect.top - containerRect.top,
475
+ left: elementRect.left - containerRect.left,
476
+ width: elementRect.width,
477
+ height: elementRect.height
478
+ };
479
+ };
480
+ var calculateLayout = (containerWidth, containerHeight, count, gap, aspectRatio = ASPECT_RATIO) => {
481
+ if (count === 0) {
482
+ return {
483
+ columns: 1,
484
+ cellWidth: 1
485
+ };
486
+ }
487
+ let minWastedSpace = Infinity;
488
+ let bestColumns = 1;
489
+ let cellWidth = 0;
490
+ for (let rows = 1; rows <= count; rows++) {
491
+ const cols = Math.ceil(count / rows);
492
+ const { width: itemWidth, height: itemHeight } = fitItemsToGrid(containerWidth, containerHeight, cols, rows, aspectRatio, gap);
493
+ const usedWidth = itemWidth * cols + gap * cols - 1;
494
+ const usedHeight = itemHeight * rows + gap * rows - 1;
495
+ const wastedSpace = containerWidth * containerHeight - usedWidth * usedHeight;
496
+ if (wastedSpace < minWastedSpace) {
497
+ minWastedSpace = wastedSpace;
498
+ bestColumns = cols;
499
+ cellWidth = itemWidth;
500
+ }
501
+ }
502
+ return {
503
+ columns: bestColumns,
504
+ cellWidth
505
+ };
506
+ };
507
+ var fitItemsToGrid = (outerWidth, outerHeight, numCols, numRows, aspectRatio, gap) => {
508
+ const availableWidth = outerWidth - gap * (numCols - 1);
509
+ const availableHeight = outerHeight - gap * (numRows - 1);
510
+ const maxCellWidth = availableWidth / numCols;
511
+ const maxCellHeight = availableHeight / numRows;
512
+ return fitAspectRatio(maxCellWidth, maxCellHeight, aspectRatio);
513
+ };
514
+ var fitAspectRatio = (outerWidth, outerHeight, aspectRatio) => {
515
+ if (outerWidth <= 0 || outerHeight <= 0 || aspectRatio <= 0) {
516
+ return {
517
+ width: 0,
518
+ height: 0
519
+ };
520
+ }
521
+ let width = outerWidth;
522
+ let height = width / aspectRatio;
523
+ if (height > outerHeight) {
524
+ height = outerHeight;
525
+ width = height * aspectRatio;
526
+ }
527
+ return {
528
+ width,
529
+ height
530
+ };
531
+ };
532
+
533
+ // packages/plugins/plugin-thread/src/components/ResponsiveGrid/ResponsiveGridItem.tsx
534
+ import { useSignals as _useSignals6 } from "@preact-signals/safe-react/tracking";
535
+ import React6, { useEffect as useEffect4, useState as useState2 } from "react";
536
+ import { Icon as Icon2, IconButton as IconButton2, useTranslation as useTranslation2 } from "@dxos/react-ui";
537
+ import { Waveform } from "@dxos/react-ui-sfx";
538
+ import { hoverableHidden as hoverableHidden2, mx as mx5 } from "@dxos/react-ui-theme";
539
+ var ResponsiveGridItem = ({ children, classNames, item, style, name, self, pinned, screenshare, video, mute, wave, speaking, onClick }) => {
540
+ var _effect = _useSignals6();
541
+ try {
542
+ const { t } = useTranslation2(THREAD_PLUGIN);
543
+ const iconProps = {
544
+ wave: {
545
+ icon: "ph--hand-waving--duotone",
546
+ label: t("icon wave"),
547
+ classNames: "animate-pulse bg-orange-500"
548
+ },
549
+ mute: {
550
+ icon: "ph--microphone-slash--regular",
551
+ label: t("icon muted")
552
+ }
553
+ };
554
+ const props = wave && !pinned ? iconProps.wave : mute ? iconProps.mute : speaking ? iconProps.speaking : void 0;
555
+ const [speakingIndicator, setSpeakingIndicator] = useState2(speaking);
556
+ useEffect4(() => {
557
+ if (speaking) {
558
+ setSpeakingIndicator(true);
559
+ } else {
560
+ const timeout = setTimeout(() => {
561
+ setSpeakingIndicator(false);
562
+ }, 1e3);
563
+ return () => clearTimeout(timeout);
564
+ }
565
+ }, [
566
+ speaking
567
+ ]);
568
+ return /* @__PURE__ */ React6.createElement("div", {
569
+ className: mx5("relative w-full h-full group", "rounded-md outline outline-2 outline-neutral-900 transition-[outline-color] duration-500", speakingIndicator ? "outline-green-500" : !video && "outline-separator", classNames),
570
+ style
571
+ }, children, onClick && /* @__PURE__ */ React6.createElement("div", {
572
+ className: "z-10 absolute top-1 right-1 flex"
573
+ }, /* @__PURE__ */ React6.createElement(IconButton2, {
574
+ classNames: mx5("p-1 min-bs-1 rounded", hoverableHidden2),
575
+ iconOnly: true,
576
+ icon: pinned ? "ph--x--regular" : "ph--arrows-out--regular",
577
+ size: pinned ? 5 : 4,
578
+ label: pinned ? t("icon unpin") : t("icon pin"),
579
+ onClick: () => onClick?.(item)
580
+ })), name && /* @__PURE__ */ React6.createElement("div", {
581
+ className: "z-10 absolute bottom-1 left-8 right-1 flex justify-end gap-1 items-center"
582
+ }, screenshare && /* @__PURE__ */ React6.createElement(Icon2, {
583
+ icon: "ph--broadcast--regular",
584
+ size: pinned ? 5 : 4
585
+ }), /* @__PURE__ */ React6.createElement("div", {
586
+ className: mx5("bg-neutral-800 text-neutral-100 py-0.5 truncate rounded", pinned ? "px-2" : "px-1 text-xs")
587
+ }, name)), /* @__PURE__ */ React6.createElement("div", {
588
+ className: "z-10 absolute bottom-1 left-1 flex"
589
+ }, speaking && /* @__PURE__ */ React6.createElement(Waveform, {
590
+ active: true,
591
+ size: pinned ? 5 : 4
592
+ }) || props && /* @__PURE__ */ React6.createElement(IconButton2, {
593
+ classNames: mx5("p-1 min-bs-1 rounded", props?.classNames),
594
+ icon: props?.icon,
595
+ label: props?.label,
596
+ size: pinned ? 5 : 4,
597
+ iconOnly: true
598
+ })));
599
+ } finally {
600
+ _effect.f();
601
+ }
602
+ };
603
+
604
+ // packages/plugins/plugin-thread/src/components/Participant/Participant.tsx
605
+ var SCREENSHARE_SUFFIX = "_screenshare";
606
+ var Participant = /* @__PURE__ */ memo2(({ item: user, debug, ...props }) => {
607
+ var _effect = _useSignals7();
608
+ try {
609
+ const call = useCapability2(ThreadCapabilities.CallManager);
610
+ const isSelf = call.self.id !== void 0 && user.id !== void 0 && user.id.startsWith(call.self.id);
611
+ const isScreenshare = user.id?.endsWith(SCREENSHARE_SUFFIX);
612
+ const pulledVideoStream = call.getVideoStream(isScreenshare || !isSelf ? user.tracks?.video : void 0);
613
+ const videoStream = useMemo2(() => {
614
+ if (isSelf && !isScreenshare) {
615
+ return call.media.videoStream;
616
+ } else if (isSelf && isScreenshare) {
617
+ return call.media.screenshareVideoStream;
618
+ } else if (!isSelf) {
619
+ return pulledVideoStream;
620
+ }
621
+ }, [
622
+ isSelf,
623
+ isScreenshare,
624
+ call.media.videoStream,
625
+ call.media.screenshareVideoStream,
626
+ pulledVideoStream
627
+ ]);
628
+ return /* @__PURE__ */ React7.createElement(ResponsiveGridItem, {
629
+ ...props,
630
+ item: user,
631
+ name: user.name,
632
+ self: isSelf,
633
+ screenshare: !!call.media.screenshareVideoStream,
634
+ video: call.media.videoEnabled,
635
+ mute: user ? !user.tracks?.audioEnabled : false,
636
+ wave: user.raisedHand,
637
+ speaking: user.speaking,
638
+ debug
639
+ }, /* @__PURE__ */ React7.createElement(VideoObject, {
640
+ videoStream,
641
+ flip: isSelf && !isScreenshare,
642
+ contain: !!isScreenshare,
643
+ classNames: "rounded-md"
644
+ }));
645
+ } finally {
646
+ _effect.f();
647
+ }
648
+ });
649
+ Participant.displayName = "Participant";
650
+
651
+ // packages/plugins/plugin-thread/src/components/Participant/ParticipantGrid.tsx
652
+ import { useSignals as _useSignals8 } from "@preact-signals/safe-react/tracking";
653
+ import React8, { useEffect as useEffect5, useMemo as useMemo3, useState as useState3 } from "react";
654
+ var getId = (user) => user.id;
655
+ var ParticipantGrid = ({ classNames, self, users, fullscreen, debug }) => {
656
+ var _effect = _useSignals8();
657
+ try {
658
+ const [pinned, setPinned] = useState3();
659
+ const allUsers = useMemo3(() => {
660
+ const allUsers2 = [];
661
+ users.forEach((user) => {
662
+ if (!user.joined) {
663
+ return;
664
+ }
665
+ allUsers2.push({
666
+ ...user,
667
+ isSelf: user.id === self.id
668
+ });
669
+ if (user.tracks?.screenshareEnabled) {
670
+ const screenshare = {
671
+ ...user,
672
+ id: user.id + SCREENSHARE_SUFFIX,
673
+ tracks: {
674
+ ...user.tracks,
675
+ video: user.tracks.screenshare,
676
+ videoEnabled: user.tracks.screenshareEnabled
677
+ }
678
+ };
679
+ allUsers2.push(screenshare);
680
+ }
681
+ });
682
+ return allUsers2;
683
+ }, [
684
+ self,
685
+ users
686
+ ]);
687
+ useEffect5(() => {
688
+ if (pinned) {
689
+ if (!allUsers.find((user) => user.id === pinned)) {
690
+ setPinned(void 0);
691
+ }
692
+ }
693
+ }, [
694
+ pinned,
695
+ allUsers
696
+ ]);
697
+ const sortedUsers = allUsers.sort((a, b) => {
698
+ if (a.isSelf) {
699
+ return 1;
700
+ } else if (b.isSelf) {
701
+ return -1;
702
+ } else if (a.tracks?.screenshareEnabled) {
703
+ return -1;
704
+ } else if (b.tracks?.screenshareEnabled) {
705
+ return 1;
706
+ } else {
707
+ return 0;
708
+ }
709
+ });
710
+ return /* @__PURE__ */ React8.createElement(ResponsiveGrid, {
711
+ classNames,
712
+ Cell: Participant,
713
+ debug,
714
+ getId,
715
+ items: sortedUsers,
716
+ pinned,
717
+ autoHideGallery: fullscreen,
718
+ onPinnedChange: setPinned
719
+ });
720
+ } finally {
721
+ _effect.f();
722
+ }
723
+ };
724
+
725
+ // packages/plugins/plugin-thread/src/components/Call/Call.tsx
726
+ var CallRoot = ({ children }) => {
727
+ var _effect = _useSignals9();
728
+ try {
729
+ return /* @__PURE__ */ React9.createElement("div", {
730
+ className: "relative flex flex-col grow overflow-hidden"
731
+ }, children);
732
+ } finally {
733
+ _effect.f();
734
+ }
735
+ };
736
+ CallRoot.displayName = "CallRoot";
737
+ var CallAudio = () => {
738
+ var _effect = _useSignals9();
739
+ try {
740
+ const call = useCapability3(ThreadCapabilities.CallManager);
741
+ return /* @__PURE__ */ React9.createElement(AudioStream, {
742
+ tracks: call.pulledAudioTracks
743
+ });
744
+ } finally {
745
+ _effect.f();
746
+ }
747
+ };
748
+ CallAudio.displayName = "CallAudio";
749
+ var CallGrid = ({ fullscreen }) => {
750
+ var _effect = _useSignals9();
751
+ try {
752
+ const debug = useDebugMode();
753
+ const call = useCapability3(ThreadCapabilities.CallManager);
754
+ return /* @__PURE__ */ React9.createElement("div", {
755
+ className: "grid grow p-4 dark:bg-neutral-900"
756
+ }, /* @__PURE__ */ React9.createElement(ParticipantGrid, {
757
+ self: call.self,
758
+ users: call.users,
759
+ debug,
760
+ fullscreen
761
+ }));
762
+ } finally {
763
+ _effect.f();
764
+ }
765
+ };
766
+ CallGrid.displayName = "CallGrid";
767
+ var CallToolbar = (props) => {
768
+ var _effect = _useSignals9();
769
+ try {
770
+ return /* @__PURE__ */ React9.createElement("div", {
771
+ className: "absolute bottom-0 left-0 right-0 flex justify-center"
772
+ }, /* @__PURE__ */ React9.createElement(Toolbar, {
773
+ isInRoom: true,
774
+ ...props
775
+ }));
776
+ } finally {
777
+ _effect.f();
778
+ }
779
+ };
780
+ CallToolbar.displayName = "CallToolbar";
781
+ var Call = {
782
+ Root: CallRoot,
783
+ Grid: CallGrid,
784
+ Audio: CallAudio,
785
+ Toolbar: CallToolbar
786
+ };
787
+
788
+ // packages/plugins/plugin-thread/src/components/ChannelContainer.tsx
789
+ var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-thread/src/components/ChannelContainer.tsx";
790
+ var ChannelContainer = ({ channel, roomId: _roomId, role, fullscreen }) => {
791
+ var _effect = _useSignals10();
792
+ try {
793
+ const space = getSpace(channel);
794
+ const callManager = useCapability4(ThreadCapabilities.CallManager);
795
+ const roomId = channel ? fullyQualifiedId2(channel) : _roomId;
796
+ const identity = useIdentity();
797
+ const isNamed = !!identity?.profile?.displayName;
798
+ const joinSound = useSoundEffect("JoinCall");
799
+ const leaveSound = useSoundEffect("LeaveCall");
800
+ const extensions = useCapabilities(ThreadCapabilities.CallExtension);
801
+ useEffect6(() => {
802
+ const ctx = new Context(void 0, {
803
+ F: __dxlog_file2,
804
+ L: 47
805
+ });
806
+ callManager.left.on(ctx, (roomId2) => {
807
+ extensions.forEach((extension) => {
808
+ void extension.onLeave?.(roomId2);
809
+ });
810
+ });
811
+ callManager.callStateUpdated.on(ctx, (state) => {
812
+ extensions.forEach((extension) => {
813
+ void extension.onCallStateUpdated?.(state);
814
+ });
815
+ });
816
+ callManager.mediaStateUpdated.on(ctx, (state) => {
817
+ extensions.forEach((extension) => {
818
+ void extension.onMediaStateUpdated?.(state);
819
+ });
820
+ });
821
+ return () => {
822
+ void ctx.dispose();
823
+ };
824
+ }, [
825
+ callManager,
826
+ extensions
827
+ ]);
828
+ const handleJoin = useCallback2(async () => {
829
+ if (!roomId || !channel) {
830
+ return;
831
+ }
832
+ if (callManager.joined) {
833
+ await callManager.leave();
834
+ }
835
+ try {
836
+ void joinSound.play();
837
+ callManager.setRoomId(roomId);
838
+ await callManager.join();
839
+ await Promise.all(extensions.map((extension) => extension.onJoin?.({
840
+ channel,
841
+ roomId
842
+ })));
843
+ } catch (err) {
844
+ log.catch(err, void 0, {
845
+ F: __dxlog_file2,
846
+ L: 91,
847
+ S: void 0,
848
+ C: (f, a) => f(...a)
849
+ });
850
+ }
851
+ }, [
852
+ extensions,
853
+ channel,
854
+ roomId
855
+ ]);
856
+ const handleLeave = useCallback2(async () => {
857
+ try {
858
+ void leaveSound.play();
859
+ } catch (err) {
860
+ log.catch(err, void 0, {
861
+ F: __dxlog_file2,
862
+ L: 103,
863
+ S: void 0,
864
+ C: (f, a) => f(...a)
865
+ });
866
+ } finally {
867
+ void callManager.turnAudioOff();
868
+ void callManager.turnVideoOff();
869
+ void callManager.turnScreenshareOff();
870
+ void callManager.leave();
871
+ }
872
+ }, [
873
+ extensions,
874
+ roomId
875
+ ]);
876
+ const isJoined = callManager.joined && callManager.roomId === roomId;
877
+ return /* @__PURE__ */ React10.createElement(StackItem.Content, {
878
+ toolbar: !isJoined,
879
+ classNames: isJoined && "h-full"
880
+ }, isJoined && !isNamed && /* @__PURE__ */ React10.createElement(DisplayNameMissing, null), isJoined && isNamed && /* @__PURE__ */ React10.createElement(Call.Root, null, /* @__PURE__ */ React10.createElement(Call.Grid, {
881
+ fullscreen
882
+ }), /* @__PURE__ */ React10.createElement(Call.Toolbar, {
883
+ channel,
884
+ onLeave: handleLeave
885
+ })), !isJoined && channel && channel.defaultThread.target && space && /* @__PURE__ */ React10.createElement(React10.Fragment, null, /* @__PURE__ */ React10.createElement(ChannelToolbar, {
886
+ attendableId: fullyQualifiedId2(channel),
887
+ role,
888
+ onJoinCall: handleJoin
889
+ }), /* @__PURE__ */ React10.createElement(ChatContainer_default, {
890
+ space,
891
+ thread: channel.defaultThread.target
892
+ })));
893
+ } finally {
894
+ _effect.f();
895
+ }
896
+ };
897
+ var ChannelContainer_default = ChannelContainer;
898
+ var DisplayNameMissing = () => {
899
+ var _effect = _useSignals10();
900
+ try {
901
+ const { t } = useTranslation3(THREAD_PLUGIN);
902
+ const client = useClient();
903
+ const [displayName, setDisplayName] = useState4("");
904
+ const handleChange = useCallback2((event) => setDisplayName(event.target.value), []);
905
+ const handleSave = useCallback2(() => client.halo.updateProfile({
906
+ displayName
907
+ }), [
908
+ client,
909
+ displayName
910
+ ]);
911
+ return /* @__PURE__ */ React10.createElement(ControlGroup, {
912
+ classNames: "p-4 place-content-center"
913
+ }, /* @__PURE__ */ React10.createElement(ControlItemInput, {
914
+ title: t("display name label"),
915
+ description: t("display name description")
916
+ }, /* @__PURE__ */ React10.createElement(Input.TextInput, {
917
+ value: displayName,
918
+ onChange: handleChange,
919
+ placeholder: t("display name input placeholder"),
920
+ classNames: "md:min-is-64"
921
+ })), /* @__PURE__ */ React10.createElement(ControlGroupButton, {
922
+ disabled: !displayName,
923
+ onClick: handleSave
924
+ }, t("set display name label")));
925
+ } finally {
926
+ _effect.f();
927
+ }
928
+ };
929
+ var useChannelToolbarActions = (onJoinCall) => {
930
+ const creator = useMemo4(() => Rx.make(() => {
931
+ const nodes = [];
932
+ const edges = [];
933
+ const rootGroup = createMenuItemGroup("root", {
934
+ label: [
935
+ "channel toolbar title",
936
+ {
937
+ ns: THREAD_PLUGIN
938
+ }
939
+ ]
940
+ });
941
+ nodes.push(rootGroup);
942
+ const sortAction = createMenuAction("video-call", () => onJoinCall?.(), {
943
+ label: [
944
+ "start video call label",
945
+ {
946
+ ns: THREAD_PLUGIN
947
+ }
948
+ ],
949
+ icon: "ph--video-camera--regular",
950
+ type: "video-call"
951
+ });
952
+ nodes.push(sortAction);
953
+ edges.push({
954
+ source: "root",
955
+ target: sortAction.id
956
+ });
957
+ return {
958
+ nodes,
959
+ edges
960
+ };
961
+ }), []);
962
+ return useMenuActions(creator);
963
+ };
964
+ var ChannelToolbar = ({ attendableId, role, onJoinCall }) => {
965
+ var _effect = _useSignals10();
966
+ try {
967
+ const menuProps = useChannelToolbarActions(onJoinCall);
968
+ return /* @__PURE__ */ React10.createElement(ElevationProvider, {
969
+ elevation: role === "section" ? "positioned" : "base"
970
+ }, /* @__PURE__ */ React10.createElement(MenuProvider, {
971
+ ...menuProps,
972
+ attendableId
973
+ }, /* @__PURE__ */ React10.createElement(ToolbarMenu, null)));
974
+ } finally {
975
+ _effect.f();
976
+ }
977
+ };
978
+
979
+ export {
980
+ Call,
981
+ ChannelContainer,
982
+ ChannelContainer_default
983
+ };
984
+ //# sourceMappingURL=chunk-X6AUQDTE.mjs.map