@dxos/plugin-thread 0.8.2-main.f11618f → 0.8.2-staging.42af850

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 (400) hide show
  1. package/dist/lib/browser/ChannelContainer-LGYSQMC7.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-APQAZWHT.mjs +23 -0
  6. package/dist/lib/browser/call-manager-APQAZWHT.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-4H4A264L.mjs +1708 -0
  8. package/dist/lib/browser/chunk-4H4A264L.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-AYNXYEKP.mjs → chunk-5P5BH5GE.mjs} +57 -35
  10. package/dist/lib/browser/chunk-5P5BH5GE.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-5PGLGDIP.mjs +983 -0
  12. package/dist/lib/browser/chunk-5PGLGDIP.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-CF2MXRCH.mjs +21 -0
  14. package/dist/lib/browser/chunk-CF2MXRCH.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-G3TS64FP.mjs +351 -0
  16. package/dist/lib/browser/chunk-G3TS64FP.mjs.map +7 -0
  17. package/dist/lib/browser/{chunk-WBJLUUOK.mjs → chunk-IIUTBDVB.mjs} +4 -4
  18. package/dist/lib/browser/chunk-IIUTBDVB.mjs.map +7 -0
  19. package/dist/lib/browser/chunk-JKQUJOTX.mjs +31 -0
  20. package/dist/lib/browser/chunk-JKQUJOTX.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-KMVGJG23.mjs +545 -0
  22. package/dist/lib/browser/chunk-KMVGJG23.mjs.map +7 -0
  23. package/dist/lib/browser/{chunk-EP6MRLY7.mjs → chunk-R5MDLUPC.mjs} +5 -3
  24. package/dist/lib/browser/chunk-R5MDLUPC.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-3UW6ROYT.mjs → intent-resolver-YUYZCTLF.mjs} +100 -72
  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-EECCWHCW.mjs +27 -0
  35. package/dist/lib/browser/react-root-EECCWHCW.mjs.map +7 -0
  36. package/dist/lib/browser/react-surface-5QLZAFDL.mjs +108 -0
  37. package/dist/lib/browser/react-surface-5QLZAFDL.mjs.map +7 -0
  38. package/dist/lib/browser/{settings-2VZ7S4SK.mjs → settings-KVBQQSO5.mjs} +3 -3
  39. package/dist/lib/browser/{state-KBGI3QTR.mjs → state-RKL5MSDP.mjs} +4 -4
  40. package/dist/lib/browser/{state-KBGI3QTR.mjs.map → state-RKL5MSDP.mjs.map} +3 -3
  41. package/dist/lib/browser/types/index.mjs +16 -0
  42. package/dist/lib/browser/types/index.mjs.map +7 -0
  43. package/dist/lib/node/ChannelContainer-5EKNEH56.cjs +36 -0
  44. package/dist/lib/node/ChannelContainer-5EKNEH56.cjs.map +7 -0
  45. package/dist/lib/node/ChatContainer-EE3FPSYO.cjs +35 -0
  46. package/dist/lib/node/ChatContainer-EE3FPSYO.cjs.map +7 -0
  47. package/dist/lib/node/app-graph-builder-IRE3GYKE.cjs +179 -0
  48. package/dist/lib/node/app-graph-builder-IRE3GYKE.cjs.map +7 -0
  49. package/dist/lib/node/call-manager-HV2XJW5O.cjs +37 -0
  50. package/dist/lib/node/call-manager-HV2XJW5O.cjs.map +7 -0
  51. package/dist/lib/node/chunk-44I33JDT.cjs +1731 -0
  52. package/dist/lib/node/chunk-44I33JDT.cjs.map +7 -0
  53. package/dist/lib/node/chunk-4B3PPXA6.cjs +371 -0
  54. package/dist/lib/node/chunk-4B3PPXA6.cjs.map +7 -0
  55. package/dist/lib/node/{chunk-NQ5DTPOY.cjs → chunk-4YSNVPWU.cjs} +10 -8
  56. package/dist/lib/node/chunk-4YSNVPWU.cjs.map +7 -0
  57. package/dist/lib/node/chunk-6B3M6XRE.cjs +984 -0
  58. package/dist/lib/node/chunk-6B3M6XRE.cjs.map +7 -0
  59. package/dist/lib/node/{chunk-W25MBII2.cjs → chunk-FUXJAVFZ.cjs} +50 -29
  60. package/dist/lib/node/chunk-FUXJAVFZ.cjs.map +7 -0
  61. package/dist/lib/node/{chunk-ONLWOUYZ.cjs → chunk-HLMCEE5K.cjs} +7 -7
  62. package/dist/lib/node/{chunk-ONLWOUYZ.cjs.map → chunk-HLMCEE5K.cjs.map} +2 -2
  63. package/dist/lib/node/chunk-JLHENFGK.cjs +549 -0
  64. package/dist/lib/node/chunk-JLHENFGK.cjs.map +7 -0
  65. package/dist/lib/node/chunk-LR5NENBE.cjs +54 -0
  66. package/dist/lib/node/chunk-LR5NENBE.cjs.map +7 -0
  67. package/dist/lib/node/chunk-TKHJVC2C.cjs +147 -0
  68. package/dist/lib/node/chunk-TKHJVC2C.cjs.map +7 -0
  69. package/dist/lib/node/{chunk-IX63EKGL.cjs → chunk-U7NOIXN6.cjs} +16 -10
  70. package/dist/lib/node/chunk-U7NOIXN6.cjs.map +7 -0
  71. package/dist/lib/node/index.cjs +142 -80
  72. package/dist/lib/node/index.cjs.map +4 -4
  73. package/dist/lib/node/{intent-resolver-DC6HDNTX.cjs → intent-resolver-MZ3HADNY.cjs} +108 -82
  74. package/dist/lib/node/intent-resolver-MZ3HADNY.cjs.map +7 -0
  75. package/dist/lib/node/markdown-NJDPXIKD.cjs +178 -0
  76. package/dist/lib/node/markdown-NJDPXIKD.cjs.map +7 -0
  77. package/dist/lib/node/meta.json +1 -1
  78. package/dist/lib/node/react-root-IAYQ2DBO.cjs +51 -0
  79. package/dist/lib/node/react-root-IAYQ2DBO.cjs.map +7 -0
  80. package/dist/lib/node/react-surface-AVC5VVIS.cjs +122 -0
  81. package/dist/lib/node/react-surface-AVC5VVIS.cjs.map +7 -0
  82. package/dist/lib/node/{settings-7MGTJ46L.cjs → settings-H45P5YO2.cjs} +8 -8
  83. package/dist/lib/node/{state-FOHMAVSU.cjs → state-IY5XX3H2.cjs} +8 -8
  84. package/dist/lib/node/{state-FOHMAVSU.cjs.map → state-IY5XX3H2.cjs.map} +3 -3
  85. package/dist/lib/node/{types.cjs → types/index.cjs} +12 -6
  86. package/dist/lib/node/types/index.cjs.map +7 -0
  87. package/dist/lib/node-esm/ChannelContainer-KFS2RWWW.mjs +16 -0
  88. package/dist/lib/node-esm/ChannelContainer-KFS2RWWW.mjs.map +7 -0
  89. package/dist/lib/node-esm/ChatContainer-UJYPQMLV.mjs +15 -0
  90. package/dist/lib/node-esm/ChatContainer-UJYPQMLV.mjs.map +7 -0
  91. package/dist/lib/node-esm/app-graph-builder-I5VMPLE4.mjs +172 -0
  92. package/dist/lib/node-esm/app-graph-builder-I5VMPLE4.mjs.map +7 -0
  93. package/dist/lib/node-esm/call-manager-UUYXLF4T.mjs +24 -0
  94. package/dist/lib/node-esm/call-manager-UUYXLF4T.mjs.map +7 -0
  95. package/dist/lib/node-esm/{chunk-42F2DTMM.mjs → chunk-ESQC6SYE.mjs} +4 -4
  96. package/dist/lib/node-esm/chunk-ESQC6SYE.mjs.map +7 -0
  97. package/dist/lib/node-esm/chunk-J323VQ4P.mjs +127 -0
  98. package/dist/lib/node-esm/chunk-J323VQ4P.mjs.map +7 -0
  99. package/dist/lib/node-esm/{chunk-WLY2HMDB.mjs → chunk-K4KAUOKT.mjs} +5 -3
  100. package/dist/lib/node-esm/chunk-K4KAUOKT.mjs.map +7 -0
  101. package/dist/lib/node-esm/chunk-MNJ3V4XM.mjs +546 -0
  102. package/dist/lib/node-esm/chunk-MNJ3V4XM.mjs.map +7 -0
  103. package/dist/lib/node-esm/{chunk-T6E5EY7Z.mjs → chunk-O3V45YJP.mjs} +57 -35
  104. package/dist/lib/node-esm/chunk-O3V45YJP.mjs.map +7 -0
  105. package/dist/lib/node-esm/chunk-ODUB4GAB.mjs +23 -0
  106. package/dist/lib/node-esm/chunk-ODUB4GAB.mjs.map +7 -0
  107. package/dist/lib/node-esm/chunk-PGRP3O4O.mjs +33 -0
  108. package/dist/lib/node-esm/chunk-PGRP3O4O.mjs.map +7 -0
  109. package/dist/lib/node-esm/chunk-POKXRTII.mjs +352 -0
  110. package/dist/lib/node-esm/chunk-POKXRTII.mjs.map +7 -0
  111. package/dist/lib/node-esm/chunk-WXNPD542.mjs +1710 -0
  112. package/dist/lib/node-esm/chunk-WXNPD542.mjs.map +7 -0
  113. package/dist/lib/node-esm/chunk-X6AUQDTE.mjs +984 -0
  114. package/dist/lib/node-esm/chunk-X6AUQDTE.mjs.map +7 -0
  115. package/dist/lib/node-esm/index.mjs +107 -41
  116. package/dist/lib/node-esm/index.mjs.map +4 -4
  117. package/dist/lib/node-esm/{intent-resolver-OAMDKGAA.mjs → intent-resolver-CU22OPAH.mjs} +100 -72
  118. package/dist/lib/node-esm/intent-resolver-CU22OPAH.mjs.map +7 -0
  119. package/dist/lib/node-esm/markdown-HRGGO7IA.mjs +170 -0
  120. package/dist/lib/node-esm/markdown-HRGGO7IA.mjs.map +7 -0
  121. package/dist/lib/node-esm/meta.json +1 -1
  122. package/dist/lib/node-esm/react-root-NQMUEI6Z.mjs +28 -0
  123. package/dist/lib/node-esm/react-root-NQMUEI6Z.mjs.map +7 -0
  124. package/dist/lib/node-esm/react-surface-Z4X5VLMY.mjs +109 -0
  125. package/dist/lib/node-esm/react-surface-Z4X5VLMY.mjs.map +7 -0
  126. package/dist/lib/node-esm/{settings-AJAZ3O47.mjs → settings-IJGUOU3F.mjs} +3 -3
  127. package/dist/lib/node-esm/{state-IRLEO2SB.mjs → state-6AUTNROZ.mjs} +4 -4
  128. package/dist/lib/node-esm/{state-IRLEO2SB.mjs.map → state-6AUTNROZ.mjs.map} +3 -3
  129. package/dist/lib/node-esm/types/index.mjs +17 -0
  130. package/dist/lib/node-esm/types/index.mjs.map +7 -0
  131. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  132. package/dist/types/src/calls/call-manager.d.ts +77 -0
  133. package/dist/types/src/calls/call-manager.d.ts.map +1 -0
  134. package/dist/types/src/calls/call-swarm-synchronizer.d.ts +66 -0
  135. package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +1 -0
  136. package/dist/types/src/calls/index.d.ts +7 -0
  137. package/dist/types/src/calls/index.d.ts.map +1 -0
  138. package/dist/types/src/calls/media-manager.d.ts +60 -0
  139. package/dist/types/src/calls/media-manager.d.ts.map +1 -0
  140. package/dist/types/src/calls/speaking-monitor.d.ts +24 -0
  141. package/dist/types/src/calls/speaking-monitor.d.ts.map +1 -0
  142. package/dist/types/src/calls/types.d.ts +45 -0
  143. package/dist/types/src/calls/types.d.ts.map +1 -0
  144. package/dist/types/src/calls/util/audio.d.ts +6 -0
  145. package/dist/types/src/calls/util/audio.d.ts.map +1 -0
  146. package/dist/types/src/calls/util/calls-service.d.ts +72 -0
  147. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -0
  148. package/dist/types/src/calls/util/history-cache.d.ts +11 -0
  149. package/dist/types/src/calls/util/history-cache.d.ts.map +1 -0
  150. package/dist/types/src/calls/util/index.d.ts +5 -0
  151. package/dist/types/src/calls/util/index.d.ts.map +1 -0
  152. package/dist/types/src/calls/util/media.d.ts +6 -0
  153. package/dist/types/src/calls/util/media.d.ts.map +1 -0
  154. package/dist/types/src/calls/util/stub-media-streams.d.ts +18 -0
  155. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -0
  156. package/dist/types/src/calls/util/task-scheduling.d.ts +17 -0
  157. package/dist/types/src/calls/util/task-scheduling.d.ts.map +1 -0
  158. package/dist/types/src/capabilities/app-graph-builder.d.ts +2 -179
  159. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  160. package/dist/types/src/capabilities/call-manager.d.ts +5 -0
  161. package/dist/types/src/capabilities/call-manager.d.ts.map +1 -0
  162. package/dist/types/src/capabilities/capabilities.d.ts +13 -1
  163. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  164. package/dist/types/src/capabilities/index.d.ts +8 -179
  165. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  166. package/dist/types/src/capabilities/intent-resolver.d.ts +2 -2
  167. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  168. package/dist/types/src/capabilities/markdown.d.ts +2 -2
  169. package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
  170. package/dist/types/src/capabilities/react-root.d.ts +7 -0
  171. package/dist/types/src/capabilities/react-root.d.ts.map +1 -0
  172. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  173. package/dist/types/src/components/Call/Call.d.ts +17 -0
  174. package/dist/types/src/components/Call/Call.d.ts.map +1 -0
  175. package/dist/types/src/components/Call/Toolbar.d.ts +16 -0
  176. package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -0
  177. package/dist/types/src/components/Call/index.d.ts +3 -0
  178. package/dist/types/src/components/Call/index.d.ts.map +1 -0
  179. package/dist/types/src/components/CallDebugPanel.d.ts +8 -0
  180. package/dist/types/src/components/CallDebugPanel.d.ts.map +1 -0
  181. package/dist/types/src/components/CallSidebar.d.ts +4 -0
  182. package/dist/types/src/components/CallSidebar.d.ts.map +1 -0
  183. package/dist/types/src/components/ChannelContainer.d.ts +14 -0
  184. package/dist/types/src/components/ChannelContainer.d.ts.map +1 -0
  185. package/dist/types/src/components/ChannelContainer.stories.d.ts +10 -0
  186. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +1 -0
  187. package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
  188. package/dist/types/src/components/ChatContainer.d.ts +9 -7
  189. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  190. package/dist/types/src/components/CommentContainer.d.ts +11 -2
  191. package/dist/types/src/components/CommentContainer.d.ts.map +1 -1
  192. package/dist/types/src/components/Comments.stories.d.ts +1 -1
  193. package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
  194. package/dist/types/src/components/CommentsContainer.d.ts +5 -9
  195. package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
  196. package/dist/types/src/components/Lobby/Lobby.d.ts +15 -0
  197. package/dist/types/src/components/Lobby/Lobby.d.ts.map +1 -0
  198. package/dist/types/src/components/Lobby/index.d.ts +2 -0
  199. package/dist/types/src/components/Lobby/index.d.ts.map +1 -0
  200. package/dist/types/src/components/Media/AudioStream.d.ts +6 -0
  201. package/dist/types/src/components/Media/AudioStream.d.ts.map +1 -0
  202. package/dist/types/src/components/Media/VideoObject.d.ts +15 -0
  203. package/dist/types/src/components/Media/VideoObject.d.ts.map +1 -0
  204. package/dist/types/src/components/Media/VideoObject.stories.d.ts +8 -0
  205. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -0
  206. package/dist/types/src/components/Media/index.d.ts +3 -0
  207. package/dist/types/src/components/Media/index.d.ts.map +1 -0
  208. package/dist/types/src/components/MessageContainer.d.ts +5 -4
  209. package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
  210. package/dist/types/src/components/Participant/Participant.d.ts +6 -0
  211. package/dist/types/src/components/Participant/Participant.d.ts.map +1 -0
  212. package/dist/types/src/components/Participant/ParticipantGrid.d.ts +11 -0
  213. package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +1 -0
  214. package/dist/types/src/components/Participant/index.d.ts +3 -0
  215. package/dist/types/src/components/Participant/index.d.ts.map +1 -0
  216. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.d.ts +12 -0
  217. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.d.ts.map +1 -0
  218. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +10 -0
  219. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +1 -0
  220. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts +32 -0
  221. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts.map +1 -0
  222. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +23 -0
  223. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -0
  224. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts +21 -0
  225. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +1 -0
  226. package/dist/types/src/components/ResponsiveGrid/index.d.ts +4 -0
  227. package/dist/types/src/components/ResponsiveGrid/index.d.ts.map +1 -0
  228. package/dist/types/src/components/ThreadComplementary.d.ts.map +1 -1
  229. package/dist/types/src/components/ThreadSettings.d.ts.map +1 -1
  230. package/dist/types/src/components/index.d.ts +5 -1
  231. package/dist/types/src/components/index.d.ts.map +1 -1
  232. package/dist/types/src/components/testing.d.ts +54 -119
  233. package/dist/types/src/components/testing.d.ts.map +1 -1
  234. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  235. package/dist/types/src/hooks/analytics.d.ts +2 -2
  236. package/dist/types/src/hooks/analytics.d.ts.map +1 -1
  237. package/dist/types/src/hooks/index.d.ts +2 -1
  238. package/dist/types/src/hooks/index.d.ts.map +1 -1
  239. package/dist/types/src/hooks/useDebugMode.d.ts +2 -0
  240. package/dist/types/src/hooks/useDebugMode.d.ts.map +1 -0
  241. package/dist/types/src/hooks/useStatus.d.ts.map +1 -1
  242. package/dist/types/src/index.d.ts +1 -1
  243. package/dist/types/src/index.d.ts.map +1 -1
  244. package/dist/types/src/meta.d.ts.map +1 -1
  245. package/dist/types/src/peers.stories.d.ts +11 -0
  246. package/dist/types/src/peers.stories.d.ts.map +1 -0
  247. package/dist/types/src/testing/index.d.ts +2 -0
  248. package/dist/types/src/testing/index.d.ts.map +1 -0
  249. package/dist/types/src/testing/stories.d.ts +2 -0
  250. package/dist/types/src/testing/stories.d.ts.map +1 -0
  251. package/dist/types/src/translations.d.ts +35 -56
  252. package/dist/types/src/translations.d.ts.map +1 -1
  253. package/dist/types/src/types/index.d.ts +3 -0
  254. package/dist/types/src/types/index.d.ts.map +1 -0
  255. package/dist/types/src/types/schema.d.ts +317 -0
  256. package/dist/types/src/types/schema.d.ts.map +1 -0
  257. package/dist/types/src/types/types.d.ts +1015 -0
  258. package/dist/types/src/types/types.d.ts.map +1 -0
  259. package/dist/types/src/util.d.ts +2 -0
  260. package/dist/types/src/util.d.ts.map +1 -1
  261. package/dist/types/tsconfig.tsbuildinfo +1 -1
  262. package/package.json +60 -40
  263. package/src/ThreadPlugin.tsx +33 -14
  264. package/src/calls/call-manager.ts +242 -0
  265. package/src/calls/call-swarm-synchronizer.ts +350 -0
  266. package/src/calls/index.ts +10 -0
  267. package/src/calls/media-manager.ts +342 -0
  268. package/src/calls/speaking-monitor.ts +85 -0
  269. package/src/calls/types.ts +70 -0
  270. package/src/calls/util/audio.ts +58 -0
  271. package/src/calls/util/calls-service.ts +527 -0
  272. package/src/calls/util/history-cache.ts +27 -0
  273. package/src/calls/util/index.ts +8 -0
  274. package/src/calls/util/media.ts +52 -0
  275. package/src/calls/util/stub-media-streams.ts +73 -0
  276. package/src/calls/util/task-scheduling.ts +92 -0
  277. package/src/capabilities/app-graph-builder.ts +171 -25
  278. package/src/capabilities/call-manager.ts +19 -0
  279. package/src/capabilities/capabilities.ts +15 -1
  280. package/src/capabilities/index.ts +2 -0
  281. package/src/capabilities/intent-resolver.ts +76 -55
  282. package/src/capabilities/markdown.ts +54 -4
  283. package/src/capabilities/react-root.tsx +17 -0
  284. package/src/capabilities/react-surface.tsx +52 -27
  285. package/src/capabilities/state.ts +1 -1
  286. package/src/components/Call/Call.tsx +88 -0
  287. package/src/components/Call/Toolbar.tsx +182 -0
  288. package/src/components/Call/index.ts +6 -0
  289. package/src/components/CallDebugPanel.tsx +115 -0
  290. package/src/components/CallSidebar.tsx +17 -0
  291. package/src/components/ChannelContainer.stories.tsx +58 -0
  292. package/src/components/ChannelContainer.tsx +203 -0
  293. package/src/components/Chat.stories.tsx +9 -10
  294. package/src/components/ChatContainer.tsx +37 -25
  295. package/src/components/CommentContainer.tsx +56 -61
  296. package/src/components/Comments.stories.tsx +20 -16
  297. package/src/components/CommentsContainer.tsx +18 -28
  298. package/src/components/Lobby/Lobby.tsx +119 -0
  299. package/src/components/Lobby/index.ts +5 -0
  300. package/src/components/Media/AudioStream.tsx +67 -0
  301. package/src/components/Media/VideoObject.stories.tsx +52 -0
  302. package/src/components/Media/VideoObject.tsx +58 -0
  303. package/src/components/Media/index.ts +6 -0
  304. package/src/components/MessageContainer.tsx +31 -50
  305. package/src/components/Participant/Participant.tsx +57 -0
  306. package/src/components/Participant/ParticipantGrid.tsx +88 -0
  307. package/src/components/Participant/index.ts +6 -0
  308. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +54 -0
  309. package/src/components/ResponsiveGrid/ResponsiveContainer.tsx +31 -0
  310. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +156 -0
  311. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +341 -0
  312. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +131 -0
  313. package/src/components/ResponsiveGrid/index.ts +7 -0
  314. package/src/components/ThreadComplementary.tsx +37 -42
  315. package/src/components/index.ts +4 -0
  316. package/src/components/testing.ts +4 -3
  317. package/src/extensions/threads.ts +42 -24
  318. package/src/hooks/analytics.ts +6 -2
  319. package/src/hooks/index.ts +2 -1
  320. package/src/hooks/useDebugMode.ts +25 -0
  321. package/src/index.ts +1 -1
  322. package/src/meta.ts +4 -3
  323. package/src/peers.stories.tsx +189 -0
  324. package/src/testing/index.ts +5 -0
  325. package/src/testing/stories.ts +50 -0
  326. package/src/translations.ts +46 -5
  327. package/src/types/index.ts +6 -0
  328. package/src/types/schema.ts +29 -0
  329. package/src/types/types.ts +110 -0
  330. package/src/typings/peermetrics-webrtc-stats.d.ts +30 -0
  331. package/src/util.ts +12 -0
  332. package/dist/lib/browser/ChatContainer-WC6KQDDU.mjs +0 -138
  333. package/dist/lib/browser/ChatContainer-WC6KQDDU.mjs.map +0 -7
  334. package/dist/lib/browser/app-graph-builder-6W4UKJDI.mjs +0 -41
  335. package/dist/lib/browser/app-graph-builder-6W4UKJDI.mjs.map +0 -7
  336. package/dist/lib/browser/chunk-AYNXYEKP.mjs.map +0 -7
  337. package/dist/lib/browser/chunk-EP6MRLY7.mjs.map +0 -7
  338. package/dist/lib/browser/chunk-FY5OCUP6.mjs +0 -207
  339. package/dist/lib/browser/chunk-FY5OCUP6.mjs.map +0 -7
  340. package/dist/lib/browser/chunk-Q66FBBJD.mjs +0 -17
  341. package/dist/lib/browser/chunk-Q66FBBJD.mjs.map +0 -7
  342. package/dist/lib/browser/chunk-WBJLUUOK.mjs.map +0 -7
  343. package/dist/lib/browser/chunk-WOG72DWE.mjs +0 -93
  344. package/dist/lib/browser/chunk-WOG72DWE.mjs.map +0 -7
  345. package/dist/lib/browser/intent-resolver-3UW6ROYT.mjs.map +0 -7
  346. package/dist/lib/browser/markdown-7KXBXCUS.mjs +0 -111
  347. package/dist/lib/browser/markdown-7KXBXCUS.mjs.map +0 -7
  348. package/dist/lib/browser/react-surface-F2AIYIUH.mjs +0 -437
  349. package/dist/lib/browser/react-surface-F2AIYIUH.mjs.map +0 -7
  350. package/dist/lib/browser/types.mjs +0 -10
  351. package/dist/lib/node/ChatContainer-LVYQ67PJ.cjs +0 -163
  352. package/dist/lib/node/ChatContainer-LVYQ67PJ.cjs.map +0 -7
  353. package/dist/lib/node/app-graph-builder-HZNWT4QU.cjs +0 -57
  354. package/dist/lib/node/app-graph-builder-HZNWT4QU.cjs.map +0 -7
  355. package/dist/lib/node/chunk-46BSFPBV.cjs +0 -113
  356. package/dist/lib/node/chunk-46BSFPBV.cjs.map +0 -7
  357. package/dist/lib/node/chunk-IX63EKGL.cjs.map +0 -7
  358. package/dist/lib/node/chunk-NQ5DTPOY.cjs.map +0 -7
  359. package/dist/lib/node/chunk-RIYLEDQ7.cjs +0 -232
  360. package/dist/lib/node/chunk-RIYLEDQ7.cjs.map +0 -7
  361. package/dist/lib/node/chunk-W25MBII2.cjs.map +0 -7
  362. package/dist/lib/node/intent-resolver-DC6HDNTX.cjs.map +0 -7
  363. package/dist/lib/node/markdown-L2WMCQKM.cjs +0 -121
  364. package/dist/lib/node/markdown-L2WMCQKM.cjs.map +0 -7
  365. package/dist/lib/node/react-surface-GP5IH5LN.cjs +0 -439
  366. package/dist/lib/node/react-surface-GP5IH5LN.cjs.map +0 -7
  367. package/dist/lib/node/types.cjs.map +0 -7
  368. package/dist/lib/node-esm/ChatContainer-WMOPMK5H.mjs +0 -139
  369. package/dist/lib/node-esm/ChatContainer-WMOPMK5H.mjs.map +0 -7
  370. package/dist/lib/node-esm/app-graph-builder-M3KK5QJH.mjs +0 -42
  371. package/dist/lib/node-esm/app-graph-builder-M3KK5QJH.mjs.map +0 -7
  372. package/dist/lib/node-esm/chunk-42F2DTMM.mjs.map +0 -7
  373. package/dist/lib/node-esm/chunk-7DOPZH6Y.mjs +0 -208
  374. package/dist/lib/node-esm/chunk-7DOPZH6Y.mjs.map +0 -7
  375. package/dist/lib/node-esm/chunk-E446MGLP.mjs +0 -94
  376. package/dist/lib/node-esm/chunk-E446MGLP.mjs.map +0 -7
  377. package/dist/lib/node-esm/chunk-QUTIMZJ4.mjs +0 -19
  378. package/dist/lib/node-esm/chunk-QUTIMZJ4.mjs.map +0 -7
  379. package/dist/lib/node-esm/chunk-T6E5EY7Z.mjs.map +0 -7
  380. package/dist/lib/node-esm/chunk-WLY2HMDB.mjs.map +0 -7
  381. package/dist/lib/node-esm/intent-resolver-OAMDKGAA.mjs.map +0 -7
  382. package/dist/lib/node-esm/markdown-ZKU23UVD.mjs +0 -112
  383. package/dist/lib/node-esm/markdown-ZKU23UVD.mjs.map +0 -7
  384. package/dist/lib/node-esm/react-surface-45GRKLWG.mjs +0 -438
  385. package/dist/lib/node-esm/react-surface-45GRKLWG.mjs.map +0 -7
  386. package/dist/lib/node-esm/types.mjs +0 -11
  387. package/dist/types/src/components/types.d.ts +0 -28
  388. package/dist/types/src/components/types.d.ts.map +0 -1
  389. package/dist/types/src/events.d.ts +0 -4
  390. package/dist/types/src/events.d.ts.map +0 -1
  391. package/dist/types/src/types.d.ts +0 -231
  392. package/dist/types/src/types.d.ts.map +0 -1
  393. package/src/components/types.ts +0 -32
  394. package/src/events.ts +0 -11
  395. package/src/types.ts +0 -100
  396. /package/dist/lib/browser/{types.mjs.map → ChannelContainer-LGYSQMC7.mjs.map} +0 -0
  397. /package/dist/lib/{node-esm/types.mjs.map → browser/ChatContainer-JWRI73OG.mjs.map} +0 -0
  398. /package/dist/lib/browser/{settings-2VZ7S4SK.mjs.map → settings-KVBQQSO5.mjs.map} +0 -0
  399. /package/dist/lib/node/{settings-7MGTJ46L.cjs.map → settings-H45P5YO2.cjs.map} +0 -0
  400. /package/dist/lib/node-esm/{settings-AJAZ3O47.mjs.map → settings-IJGUOU3F.mjs.map} +0 -0
@@ -0,0 +1,984 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var chunk_6B3M6XRE_exports = {};
30
+ __export(chunk_6B3M6XRE_exports, {
31
+ Call: () => Call,
32
+ ChannelContainer: () => ChannelContainer,
33
+ ChannelContainer_default: () => ChannelContainer_default
34
+ });
35
+ module.exports = __toCommonJS(chunk_6B3M6XRE_exports);
36
+ var import_chunk_4YSNVPWU = require("./chunk-4YSNVPWU.cjs");
37
+ var import_chunk_4B3PPXA6 = require("./chunk-4B3PPXA6.cjs");
38
+ var import_chunk_FUXJAVFZ = require("./chunk-FUXJAVFZ.cjs");
39
+ var import_chunk_HLMCEE5K = require("./chunk-HLMCEE5K.cjs");
40
+ var import_tracking = require("@preact-signals/safe-react/tracking");
41
+ var import_rx_react = require("@effect-rx/rx-react");
42
+ var import_react = __toESM(require("react"));
43
+ var import_app_framework = require("@dxos/app-framework");
44
+ var import_context = require("@dxos/context");
45
+ var import_log = require("@dxos/log");
46
+ var import_react_client = require("@dxos/react-client");
47
+ var import_echo = require("@dxos/react-client/echo");
48
+ var import_halo = require("@dxos/react-client/halo");
49
+ var import_react_ui = require("@dxos/react-ui");
50
+ var import_react_ui_form = require("@dxos/react-ui-form");
51
+ var import_react_ui_menu = require("@dxos/react-ui-menu");
52
+ var import_react_ui_sfx = require("@dxos/react-ui-sfx");
53
+ var import_react_ui_stack = require("@dxos/react-ui-stack");
54
+ var import_tracking2 = require("@preact-signals/safe-react/tracking");
55
+ var import_react2 = __toESM(require("react"));
56
+ var import_app_framework2 = require("@dxos/app-framework");
57
+ var import_tracking3 = require("@preact-signals/safe-react/tracking");
58
+ var import_react3 = __toESM(require("react"));
59
+ var import_app_framework3 = require("@dxos/app-framework");
60
+ var import_plugin_graph = require("@dxos/plugin-graph");
61
+ var import_echo2 = require("@dxos/react-client/echo");
62
+ var import_react_ui2 = require("@dxos/react-ui");
63
+ var import_react_ui_theme = require("@dxos/react-ui-theme");
64
+ var import_tracking4 = require("@preact-signals/safe-react/tracking");
65
+ var import_react4 = __toESM(require("react"));
66
+ var import_tracking5 = require("@preact-signals/safe-react/tracking");
67
+ var import_react5 = __toESM(require("react"));
68
+ var import_react_ui_theme2 = require("@dxos/react-ui-theme");
69
+ var import_tracking6 = require("@preact-signals/safe-react/tracking");
70
+ var import_react6 = __toESM(require("react"));
71
+ var import_app_framework4 = require("@dxos/app-framework");
72
+ var import_tracking7 = require("@preact-signals/safe-react/tracking");
73
+ var import_react7 = __toESM(require("react"));
74
+ var import_react_ui_theme3 = require("@dxos/react-ui-theme");
75
+ var import_tracking8 = require("@preact-signals/safe-react/tracking");
76
+ var import_react8 = __toESM(require("react"));
77
+ var import_react_resize_detector = require("react-resize-detector");
78
+ var import_invariant = require("@dxos/invariant");
79
+ var import_react_ui_theme4 = require("@dxos/react-ui-theme");
80
+ var import_tracking9 = require("@preact-signals/safe-react/tracking");
81
+ var import_react9 = __toESM(require("react"));
82
+ var import_react_ui3 = require("@dxos/react-ui");
83
+ var import_react_ui_sfx2 = require("@dxos/react-ui-sfx");
84
+ var import_react_ui_theme5 = require("@dxos/react-ui-theme");
85
+ var import_tracking10 = require("@preact-signals/safe-react/tracking");
86
+ var import_react10 = __toESM(require("react"));
87
+ var Toolbar = ({ classNames, channel, participants, autoHideControls = true, onJoin, onLeave }) => {
88
+ var _effect = (0, import_tracking3.useSignals)();
89
+ try {
90
+ const { t } = (0, import_react_ui2.useTranslation)(import_chunk_HLMCEE5K.THREAD_PLUGIN);
91
+ const { graph } = (0, import_app_framework3.useAppGraph)();
92
+ const call = (0, import_app_framework3.useCapability)(import_chunk_4YSNVPWU.ThreadCapabilities.CallManager);
93
+ const node = (0, import_plugin_graph.useNode)(graph, channel && (0, import_echo2.fullyQualifiedId)(channel));
94
+ const actions = (0, import_plugin_graph.useActions)(graph, node?.id).filter((action) => action.properties.disposition === "toolbar");
95
+ const isScreensharing = call.media.screenshareTrack !== void 0;
96
+ const canSharescreen = typeof navigator.mediaDevices !== "undefined" && navigator.mediaDevices.getDisplayMedia !== void 0;
97
+ return /* @__PURE__ */ import_react3.default.createElement("div", {
98
+ className: (0, import_react_ui_theme.mx)("z-20 flex justify-center m-8", autoHideControls && import_react_ui_theme.hoverableHidden)
99
+ }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.Toolbar.Root, {
100
+ classNames: [
101
+ "p-2 bg-modalSurface rounded-lg shadow-lg",
102
+ classNames
103
+ ]
104
+ }, /* @__PURE__ */ import_react3.default.createElement(ToggleButton, {
105
+ active: call.media.audioEnabled,
106
+ state: {
107
+ on: {
108
+ icon: "ph--microphone--regular",
109
+ label: t("mic off"),
110
+ onClick: () => call.turnAudioOff(),
111
+ classNames: "bg-callActive"
112
+ },
113
+ off: {
114
+ icon: "ph--microphone-slash--duotone",
115
+ label: t("mic on"),
116
+ onClick: () => call.turnAudioOn(),
117
+ classNames: [
118
+ call.joined && "bg-callAlert"
119
+ ]
120
+ }
121
+ }
122
+ }), /* @__PURE__ */ import_react3.default.createElement(ToggleButton, {
123
+ active: call.media.videoEnabled,
124
+ state: {
125
+ on: {
126
+ icon: "ph--video-camera--regular",
127
+ label: t("camera off"),
128
+ onClick: () => call.turnVideoOff()
129
+ },
130
+ off: {
131
+ icon: "ph--video-camera-slash--duotone",
132
+ label: t("camera on"),
133
+ onClick: () => call.turnVideoOn()
134
+ }
135
+ }
136
+ }), participants !== void 0 && /* @__PURE__ */ import_react3.default.createElement("div", {
137
+ className: "flex justify-center items-center gap-2 is-[5rem] text-xs text-subdued"
138
+ }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.Icon, {
139
+ icon: "ph--users--regular",
140
+ size: 4
141
+ }), /* @__PURE__ */ import_react3.default.createElement("div", null, participants)) || /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.Toolbar.Separator, {
142
+ variant: "gap"
143
+ }), call.joined && /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, /* @__PURE__ */ import_react3.default.createElement(ToggleButton, {
144
+ disabled: !canSharescreen,
145
+ active: isScreensharing,
146
+ state: {
147
+ on: {
148
+ icon: "ph--monitor--regular",
149
+ label: t("screenshare off"),
150
+ onClick: () => call.turnScreenshareOff()
151
+ },
152
+ off: {
153
+ icon: "ph--monitor-arrow-up--duotone",
154
+ label: t("screenshare on"),
155
+ onClick: () => call.turnScreenshareOn()
156
+ }
157
+ }
158
+ }), actions.map((action) => /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.IconButton, {
159
+ key: action.id,
160
+ ...defaultButtonProps,
161
+ icon: action.properties.icon,
162
+ label: (0, import_react_ui2.toLocalizedString)(action.properties.label, t),
163
+ classNames: action.properties.classNames,
164
+ onClick: () => action.data({
165
+ node
166
+ })
167
+ })), /* @__PURE__ */ import_react3.default.createElement(ToggleButton, {
168
+ active: call.raisedHand,
169
+ state: {
170
+ on: {
171
+ icon: "ph--hand-waving--regular",
172
+ label: t("lower hand"),
173
+ onClick: () => call.setRaisedHand(false),
174
+ classNames: [
175
+ call.joined && "bg-callAlert"
176
+ ]
177
+ },
178
+ off: {
179
+ icon: "ph--hand-palm--duotone",
180
+ label: t("raise hand"),
181
+ onClick: () => call.setRaisedHand(true)
182
+ }
183
+ }
184
+ })), call.joined ? /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.IconButton, {
185
+ variant: "destructive",
186
+ icon: "ph--phone-x--regular",
187
+ label: t("leave call"),
188
+ onClick: onLeave
189
+ }) : /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.IconButton, {
190
+ variant: "primary",
191
+ icon: "ph--phone-incoming--regular",
192
+ label: t("join call"),
193
+ onClick: onJoin
194
+ })));
195
+ } finally {
196
+ _effect.f();
197
+ }
198
+ };
199
+ Toolbar.displayName = "MeetingToolbar";
200
+ var defaultButtonProps = {
201
+ size: 5,
202
+ iconOnly: true
203
+ };
204
+ var ToggleButton = ({ active, state }) => {
205
+ var _effect = (0, import_tracking3.useSignals)();
206
+ try {
207
+ return /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.IconButton, {
208
+ ...defaultButtonProps,
209
+ classNames: [
210
+ active ? state.on.classNames ?? "bg-callActive" : state.off.classNames
211
+ ],
212
+ icon: active ? state.on.icon : state.off.icon,
213
+ label: active ? state.on.label : state.off.label,
214
+ onClick: active ? state.on.onClick : state.off.onClick
215
+ });
216
+ } finally {
217
+ _effect.f();
218
+ }
219
+ };
220
+ var AudioStream = ({ tracks }) => {
221
+ var _effect = (0, import_tracking4.useSignals)();
222
+ try {
223
+ const mediaStreamRef = (0, import_react4.useRef)(new MediaStream());
224
+ const ref = (0, import_react4.useRef)(null);
225
+ (0, import_react4.useEffect)(() => {
226
+ const audio = ref.current;
227
+ if (!audio) {
228
+ return;
229
+ }
230
+ const mediaStream = mediaStreamRef.current;
231
+ audio.srcObject = mediaStream;
232
+ }, []);
233
+ const resetSrcObject = () => {
234
+ const audio = ref.current;
235
+ const mediaStream = mediaStreamRef.current;
236
+ if (!audio || !mediaStream) {
237
+ return;
238
+ }
239
+ audio.addEventListener("canplay", () => audio.play(), {
240
+ once: true
241
+ });
242
+ audio.srcObject = mediaStream;
243
+ };
244
+ return /* @__PURE__ */ import_react4.default.createElement(import_react4.default.Fragment, null, /* @__PURE__ */ import_react4.default.createElement("audio", {
245
+ ref,
246
+ autoPlay: true
247
+ }), tracks.map((track) => /* @__PURE__ */ import_react4.default.createElement(AudioTrack, {
248
+ key: track.id,
249
+ track,
250
+ mediaStream: mediaStreamRef.current,
251
+ resetSrcObject
252
+ })));
253
+ } finally {
254
+ _effect.f();
255
+ }
256
+ };
257
+ var AudioTrack = ({ track, mediaStream, resetSrcObject }) => {
258
+ (0, import_react4.useEffect)(() => {
259
+ const currentTrack = track;
260
+ mediaStream.addTrack(currentTrack);
261
+ resetSrcObject();
262
+ return () => {
263
+ mediaStream.removeTrack(currentTrack);
264
+ resetSrcObject();
265
+ };
266
+ }, [
267
+ track,
268
+ mediaStream
269
+ ]);
270
+ return null;
271
+ };
272
+ var VideoObject = /* @__PURE__ */ (0, import_react5.memo)(/* @__PURE__ */ (0, import_react5.forwardRef)(({ videoStream, classNames, flip, contain, ...rest }, ref) => {
273
+ var _effect = (0, import_tracking5.useSignals)();
274
+ try {
275
+ const internalRef = (0, import_react5.useRef)(null);
276
+ (0, import_react5.useEffect)(() => {
277
+ const video = internalRef.current;
278
+ if (video && videoStream) {
279
+ video.srcObject = videoStream;
280
+ video.setAttribute("autoplay", "true");
281
+ video.setAttribute("playsinline", "true");
282
+ }
283
+ }, [
284
+ videoStream,
285
+ internalRef.current
286
+ ]);
287
+ return /* @__PURE__ */ import_react5.default.createElement("video", {
288
+ className: (0, import_react_ui_theme2.mx)("w-full aspect-video", flip && "scale-x-[-1]", contain ? "object-contain" : "object-cover", classNames),
289
+ ref: (v) => {
290
+ internalRef.current = v;
291
+ if (ref === null) {
292
+ return;
293
+ }
294
+ if (typeof ref === "function") {
295
+ ref(v);
296
+ } else {
297
+ ref.current = v;
298
+ }
299
+ },
300
+ ...rest
301
+ });
302
+ } finally {
303
+ _effect.f();
304
+ }
305
+ }));
306
+ VideoObject.displayName = "VideoObject";
307
+ var ResponsiveContainer = ({ children }) => {
308
+ var _effect = (0, import_tracking7.useSignals)();
309
+ try {
310
+ return (
311
+ // Outer container that takes full size of parent.
312
+ /* @__PURE__ */ import_react7.default.createElement("div", {
313
+ role: "none",
314
+ className: "relative flex w-full h-full"
315
+ }, /* @__PURE__ */ import_react7.default.createElement("div", {
316
+ role: "none",
317
+ className: "absolute inset-0 flex justify-center items-center"
318
+ }, /* @__PURE__ */ import_react7.default.createElement("div", {
319
+ role: "none",
320
+ className: (0, import_react_ui_theme3.mx)("max-h-full max-w-full w-auto h-auto aspect-video")
321
+ }, children)))
322
+ );
323
+ } finally {
324
+ _effect.f();
325
+ }
326
+ };
327
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/plugin-thread/src/components/ResponsiveGrid/ResponsiveGrid.tsx";
328
+ var ASPECT_RATIO = 16 / 9;
329
+ var MIN_GALLERY_HEIGHT = 250;
330
+ var DEFAULT_GAP = 8;
331
+ var maxImageSize = "w-[2560px] h-[1440px]";
332
+ var defaultGetId = (item) => item.id;
333
+ var ResponsiveGrid = ({ classNames, Cell, gap = DEFAULT_GAP, getId: getId2 = defaultGetId, items, pinned, autoHideGallery = false, debug, onPinnedChange }) => {
334
+ var _effect = (0, import_tracking8.useSignals)();
335
+ try {
336
+ const { width: containerWidth = 0, height: containerHeight = 0, ref: containerRef } = (0, import_react_resize_detector.useResizeDetector)({
337
+ refreshRate: 100
338
+ });
339
+ const [dividerHeight, setDividerHeight] = (0, import_react8.useState)(0);
340
+ (0, import_react8.useEffect)(() => {
341
+ if (containerWidth && containerHeight) {
342
+ const { height: height2 } = fitAspectRatio(containerWidth, containerHeight, ASPECT_RATIO);
343
+ setDividerHeight(Math.min(height2, containerHeight - MIN_GALLERY_HEIGHT));
344
+ }
345
+ }, [
346
+ containerWidth,
347
+ containerHeight
348
+ ]);
349
+ const pinnedItem = (0, import_react8.useMemo)(() => items.find((item) => getId2(item) === pinned), [
350
+ items,
351
+ pinned
352
+ ]);
353
+ const mainItems = (0, import_react8.useMemo)(() => items.filter((item) => getId2(item) !== pinned), [
354
+ items,
355
+ pinned
356
+ ]);
357
+ const hideGallery = autoHideGallery && pinnedItem !== void 0;
358
+ const [{ time, columns, cellWidth }, setLayout] = (0, import_react8.useState)({
359
+ time: 0,
360
+ columns: 0,
361
+ cellWidth: 0
362
+ });
363
+ const { width = 0, height = 0, ref: gridContainerRef } = (0, import_react_resize_detector.useResizeDetector)({
364
+ refreshRate: 200
365
+ });
366
+ (0, import_react8.useEffect)(() => {
367
+ if (containerHeight && width && height) {
368
+ const layout = calculateLayout(width, height, mainItems.length, gap);
369
+ setLayout({
370
+ time: Date.now(),
371
+ ...layout
372
+ });
373
+ }
374
+ }, [
375
+ containerHeight,
376
+ width,
377
+ height,
378
+ mainItems.length,
379
+ gap,
380
+ pinned
381
+ ]);
382
+ const [bounds, setBounds] = (0, import_react8.useState)([]);
383
+ (0, import_react8.useLayoutEffect)(() => {
384
+ if (!hideGallery && !gridContainerRef.current || !containerHeight) {
385
+ return;
386
+ }
387
+ const t = setTimeout(() => {
388
+ setBounds(items.filter((item) => !hideGallery || item === pinnedItem).map((item) => {
389
+ (0, import_invariant.invariant)(containerRef.current, void 0, {
390
+ F: __dxlog_file,
391
+ L: 117,
392
+ S: void 0,
393
+ A: [
394
+ "containerRef.current",
395
+ ""
396
+ ]
397
+ });
398
+ const el = containerRef.current.querySelector(`[data-grid-item="${getId2(item)}"]`);
399
+ if (!el) {
400
+ return null;
401
+ }
402
+ const bounds2 = getRelativeBounds(containerRef.current, el);
403
+ return [
404
+ item,
405
+ bounds2
406
+ ];
407
+ }).filter((item) => item !== null));
408
+ });
409
+ return () => clearTimeout(t);
410
+ }, [
411
+ containerHeight,
412
+ items,
413
+ pinnedItem,
414
+ hideGallery,
415
+ time
416
+ ]);
417
+ const handleClick = (0, import_react8.useCallback)((item) => onPinnedChange?.(getId2(item) === pinned ? void 0 : getId2(item)), [
418
+ pinned,
419
+ onPinnedChange
420
+ ]);
421
+ return /* @__PURE__ */ import_react8.default.createElement("div", {
422
+ ref: containerRef,
423
+ className: (0, import_react_ui_theme4.mx)("relative w-full h-full", classNames)
424
+ }, /* @__PURE__ */ import_react8.default.createElement("div", {
425
+ className: "absolute inset-0 flex flex-col grow gap-2"
426
+ }, pinnedItem && /* @__PURE__ */ import_react8.default.createElement("div", {
427
+ className: (0, import_react_ui_theme4.mx)("flex grow-[2] shrink overflow-hidden justify-center items-center", hideGallery && "h-full"),
428
+ style: hideGallery ? {} : {
429
+ height: dividerHeight
430
+ }
431
+ }, /* @__PURE__ */ import_react8.default.createElement(SoloItem, {
432
+ id: getId2(pinnedItem),
433
+ debug
434
+ })), !hideGallery && /* @__PURE__ */ import_react8.default.createElement("div", {
435
+ ref: gridContainerRef,
436
+ className: "flex grow-[1] overflow-hidden justify-center items-center",
437
+ style: hideGallery ? {} : {
438
+ minHeight: MIN_GALLERY_HEIGHT
439
+ }
440
+ }, mainItems.length === 1 && /* @__PURE__ */ import_react8.default.createElement("div", {
441
+ style: {
442
+ width: cellWidth
443
+ },
444
+ className: "flex h-full"
445
+ }, /* @__PURE__ */ import_react8.default.createElement(SoloItem, {
446
+ id: getId2(mainItems[0]),
447
+ debug
448
+ })), mainItems.length > 1 && columns > 0 && /* @__PURE__ */ import_react8.default.createElement("div", {
449
+ role: "grid",
450
+ style: {
451
+ display: "grid",
452
+ gridTemplateColumns: `repeat(${columns}, ${cellWidth}px)`,
453
+ gap: `${gap}px`
454
+ }
455
+ }, mainItems.map((item) => /* @__PURE__ */ import_react8.default.createElement("div", {
456
+ key: getId2(item),
457
+ "data-grid-item": getId2(item),
458
+ className: (0, import_react_ui_theme4.mx)("aspect-video max-h-full max-w-full w-auto h-auto", debug && "border border-primary-500")
459
+ }))))), /* @__PURE__ */ import_react8.default.createElement("div", {
460
+ className: (0, import_react_ui_theme4.mx)(debug && "opacity-10")
461
+ }, bounds.map(([item, bounds2]) => /* @__PURE__ */ import_react8.default.createElement(Cell, {
462
+ key: getId2(item),
463
+ classNames: "absolute transition-all duration-500",
464
+ item,
465
+ style: bounds2,
466
+ pinned: getId2(item) === pinned,
467
+ onClick: items.length > 1 ? handleClick : void 0
468
+ }))));
469
+ } finally {
470
+ _effect.f();
471
+ }
472
+ };
473
+ var SoloItem = ({ debug, id }) => {
474
+ var _effect = (0, import_tracking8.useSignals)();
475
+ try {
476
+ return /* @__PURE__ */ import_react8.default.createElement(ResponsiveContainer, null, /* @__PURE__ */ import_react8.default.createElement("div", {
477
+ "data-grid-item": id,
478
+ className: (0, import_react_ui_theme4.mx)("aspect-video overflow-hidden", debug && "z-20 border-2 border-primary-500")
479
+ }, /* @__PURE__ */ import_react8.default.createElement("img", {
480
+ alt: "placeholder video",
481
+ className: (0, import_react_ui_theme4.mx)("opacity-0", maxImageSize)
482
+ })));
483
+ } finally {
484
+ _effect.f();
485
+ }
486
+ };
487
+ var getRelativeBounds = (container, el) => {
488
+ const containerRect = container.getBoundingClientRect();
489
+ const elementRect = el.getBoundingClientRect();
490
+ return {
491
+ top: elementRect.top - containerRect.top,
492
+ left: elementRect.left - containerRect.left,
493
+ width: elementRect.width,
494
+ height: elementRect.height
495
+ };
496
+ };
497
+ var calculateLayout = (containerWidth, containerHeight, count, gap, aspectRatio = ASPECT_RATIO) => {
498
+ if (count === 0) {
499
+ return {
500
+ columns: 1,
501
+ cellWidth: 1
502
+ };
503
+ }
504
+ let minWastedSpace = Infinity;
505
+ let bestColumns = 1;
506
+ let cellWidth = 0;
507
+ for (let rows = 1; rows <= count; rows++) {
508
+ const cols = Math.ceil(count / rows);
509
+ const { width: itemWidth, height: itemHeight } = fitItemsToGrid(containerWidth, containerHeight, cols, rows, aspectRatio, gap);
510
+ const usedWidth = itemWidth * cols + gap * cols - 1;
511
+ const usedHeight = itemHeight * rows + gap * rows - 1;
512
+ const wastedSpace = containerWidth * containerHeight - usedWidth * usedHeight;
513
+ if (wastedSpace < minWastedSpace) {
514
+ minWastedSpace = wastedSpace;
515
+ bestColumns = cols;
516
+ cellWidth = itemWidth;
517
+ }
518
+ }
519
+ return {
520
+ columns: bestColumns,
521
+ cellWidth
522
+ };
523
+ };
524
+ var fitItemsToGrid = (outerWidth, outerHeight, numCols, numRows, aspectRatio, gap) => {
525
+ const availableWidth = outerWidth - gap * (numCols - 1);
526
+ const availableHeight = outerHeight - gap * (numRows - 1);
527
+ const maxCellWidth = availableWidth / numCols;
528
+ const maxCellHeight = availableHeight / numRows;
529
+ return fitAspectRatio(maxCellWidth, maxCellHeight, aspectRatio);
530
+ };
531
+ var fitAspectRatio = (outerWidth, outerHeight, aspectRatio) => {
532
+ if (outerWidth <= 0 || outerHeight <= 0 || aspectRatio <= 0) {
533
+ return {
534
+ width: 0,
535
+ height: 0
536
+ };
537
+ }
538
+ let width = outerWidth;
539
+ let height = width / aspectRatio;
540
+ if (height > outerHeight) {
541
+ height = outerHeight;
542
+ width = height * aspectRatio;
543
+ }
544
+ return {
545
+ width,
546
+ height
547
+ };
548
+ };
549
+ var ResponsiveGridItem = ({ children, classNames, item, style, name, self, pinned, screenshare, video, mute, wave, speaking, onClick }) => {
550
+ var _effect = (0, import_tracking9.useSignals)();
551
+ try {
552
+ const { t } = (0, import_react_ui3.useTranslation)(import_chunk_HLMCEE5K.THREAD_PLUGIN);
553
+ const iconProps = {
554
+ wave: {
555
+ icon: "ph--hand-waving--duotone",
556
+ label: t("icon wave"),
557
+ classNames: "animate-pulse bg-orange-500"
558
+ },
559
+ mute: {
560
+ icon: "ph--microphone-slash--regular",
561
+ label: t("icon muted")
562
+ }
563
+ };
564
+ const props = wave && !pinned ? iconProps.wave : mute ? iconProps.mute : speaking ? iconProps.speaking : void 0;
565
+ const [speakingIndicator, setSpeakingIndicator] = (0, import_react9.useState)(speaking);
566
+ (0, import_react9.useEffect)(() => {
567
+ if (speaking) {
568
+ setSpeakingIndicator(true);
569
+ } else {
570
+ const timeout = setTimeout(() => {
571
+ setSpeakingIndicator(false);
572
+ }, 1e3);
573
+ return () => clearTimeout(timeout);
574
+ }
575
+ }, [
576
+ speaking
577
+ ]);
578
+ return /* @__PURE__ */ import_react9.default.createElement("div", {
579
+ className: (0, import_react_ui_theme5.mx)("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),
580
+ style
581
+ }, children, onClick && /* @__PURE__ */ import_react9.default.createElement("div", {
582
+ className: "z-10 absolute top-1 right-1 flex"
583
+ }, /* @__PURE__ */ import_react9.default.createElement(import_react_ui3.IconButton, {
584
+ classNames: (0, import_react_ui_theme5.mx)("p-1 min-bs-1 rounded", import_react_ui_theme5.hoverableHidden),
585
+ iconOnly: true,
586
+ icon: pinned ? "ph--x--regular" : "ph--arrows-out--regular",
587
+ size: pinned ? 5 : 4,
588
+ label: pinned ? t("icon unpin") : t("icon pin"),
589
+ onClick: () => onClick?.(item)
590
+ })), name && /* @__PURE__ */ import_react9.default.createElement("div", {
591
+ className: "z-10 absolute bottom-1 left-8 right-1 flex justify-end gap-1 items-center"
592
+ }, screenshare && /* @__PURE__ */ import_react9.default.createElement(import_react_ui3.Icon, {
593
+ icon: "ph--broadcast--regular",
594
+ size: pinned ? 5 : 4
595
+ }), /* @__PURE__ */ import_react9.default.createElement("div", {
596
+ className: (0, import_react_ui_theme5.mx)("bg-neutral-800 text-neutral-100 py-0.5 truncate rounded", pinned ? "px-2" : "px-1 text-xs")
597
+ }, name)), /* @__PURE__ */ import_react9.default.createElement("div", {
598
+ className: "z-10 absolute bottom-1 left-1 flex"
599
+ }, speaking && /* @__PURE__ */ import_react9.default.createElement(import_react_ui_sfx2.Waveform, {
600
+ active: true,
601
+ size: pinned ? 5 : 4
602
+ }) || props && /* @__PURE__ */ import_react9.default.createElement(import_react_ui3.IconButton, {
603
+ classNames: (0, import_react_ui_theme5.mx)("p-1 min-bs-1 rounded", props?.classNames),
604
+ icon: props?.icon,
605
+ label: props?.label,
606
+ size: pinned ? 5 : 4,
607
+ iconOnly: true
608
+ })));
609
+ } finally {
610
+ _effect.f();
611
+ }
612
+ };
613
+ var SCREENSHARE_SUFFIX = "_screenshare";
614
+ var Participant = /* @__PURE__ */ (0, import_react6.memo)(({ item: user, debug, ...props }) => {
615
+ var _effect = (0, import_tracking6.useSignals)();
616
+ try {
617
+ const call = (0, import_app_framework4.useCapability)(import_chunk_4YSNVPWU.ThreadCapabilities.CallManager);
618
+ const isSelf = call.self.id !== void 0 && user.id !== void 0 && user.id.startsWith(call.self.id);
619
+ const isScreenshare = user.id?.endsWith(SCREENSHARE_SUFFIX);
620
+ const pulledVideoStream = call.getVideoStream(isScreenshare || !isSelf ? user.tracks?.video : void 0);
621
+ const videoStream = (0, import_react6.useMemo)(() => {
622
+ if (isSelf && !isScreenshare) {
623
+ return call.media.videoStream;
624
+ } else if (isSelf && isScreenshare) {
625
+ return call.media.screenshareVideoStream;
626
+ } else if (!isSelf) {
627
+ return pulledVideoStream;
628
+ }
629
+ }, [
630
+ isSelf,
631
+ isScreenshare,
632
+ call.media.videoStream,
633
+ call.media.screenshareVideoStream,
634
+ pulledVideoStream
635
+ ]);
636
+ return /* @__PURE__ */ import_react6.default.createElement(ResponsiveGridItem, {
637
+ ...props,
638
+ item: user,
639
+ name: user.name,
640
+ self: isSelf,
641
+ screenshare: !!call.media.screenshareVideoStream,
642
+ video: call.media.videoEnabled,
643
+ mute: user ? !user.tracks?.audioEnabled : false,
644
+ wave: user.raisedHand,
645
+ speaking: user.speaking,
646
+ debug
647
+ }, /* @__PURE__ */ import_react6.default.createElement(VideoObject, {
648
+ videoStream,
649
+ flip: isSelf && !isScreenshare,
650
+ contain: !!isScreenshare,
651
+ classNames: "rounded-md"
652
+ }));
653
+ } finally {
654
+ _effect.f();
655
+ }
656
+ });
657
+ Participant.displayName = "Participant";
658
+ var getId = (user) => user.id;
659
+ var ParticipantGrid = ({ classNames, self, users, fullscreen, debug }) => {
660
+ var _effect = (0, import_tracking10.useSignals)();
661
+ try {
662
+ const [pinned, setPinned] = (0, import_react10.useState)();
663
+ const allUsers = (0, import_react10.useMemo)(() => {
664
+ const allUsers2 = [];
665
+ users.forEach((user) => {
666
+ if (!user.joined) {
667
+ return;
668
+ }
669
+ allUsers2.push({
670
+ ...user,
671
+ isSelf: user.id === self.id
672
+ });
673
+ if (user.tracks?.screenshareEnabled) {
674
+ const screenshare = {
675
+ ...user,
676
+ id: user.id + SCREENSHARE_SUFFIX,
677
+ tracks: {
678
+ ...user.tracks,
679
+ video: user.tracks.screenshare,
680
+ videoEnabled: user.tracks.screenshareEnabled
681
+ }
682
+ };
683
+ allUsers2.push(screenshare);
684
+ }
685
+ });
686
+ return allUsers2;
687
+ }, [
688
+ self,
689
+ users
690
+ ]);
691
+ (0, import_react10.useEffect)(() => {
692
+ if (pinned) {
693
+ if (!allUsers.find((user) => user.id === pinned)) {
694
+ setPinned(void 0);
695
+ }
696
+ }
697
+ }, [
698
+ pinned,
699
+ allUsers
700
+ ]);
701
+ const sortedUsers = allUsers.sort((a, b) => {
702
+ if (a.isSelf) {
703
+ return 1;
704
+ } else if (b.isSelf) {
705
+ return -1;
706
+ } else if (a.tracks?.screenshareEnabled) {
707
+ return -1;
708
+ } else if (b.tracks?.screenshareEnabled) {
709
+ return 1;
710
+ } else {
711
+ return 0;
712
+ }
713
+ });
714
+ return /* @__PURE__ */ import_react10.default.createElement(ResponsiveGrid, {
715
+ classNames,
716
+ Cell: Participant,
717
+ debug,
718
+ getId,
719
+ items: sortedUsers,
720
+ pinned,
721
+ autoHideGallery: fullscreen,
722
+ onPinnedChange: setPinned
723
+ });
724
+ } finally {
725
+ _effect.f();
726
+ }
727
+ };
728
+ var CallRoot = ({ children }) => {
729
+ var _effect = (0, import_tracking2.useSignals)();
730
+ try {
731
+ return /* @__PURE__ */ import_react2.default.createElement("div", {
732
+ className: "relative flex flex-col grow overflow-hidden"
733
+ }, children);
734
+ } finally {
735
+ _effect.f();
736
+ }
737
+ };
738
+ CallRoot.displayName = "CallRoot";
739
+ var CallAudio = () => {
740
+ var _effect = (0, import_tracking2.useSignals)();
741
+ try {
742
+ const call = (0, import_app_framework2.useCapability)(import_chunk_4YSNVPWU.ThreadCapabilities.CallManager);
743
+ return /* @__PURE__ */ import_react2.default.createElement(AudioStream, {
744
+ tracks: call.pulledAudioTracks
745
+ });
746
+ } finally {
747
+ _effect.f();
748
+ }
749
+ };
750
+ CallAudio.displayName = "CallAudio";
751
+ var CallGrid = ({ fullscreen }) => {
752
+ var _effect = (0, import_tracking2.useSignals)();
753
+ try {
754
+ const debug = (0, import_chunk_FUXJAVFZ.useDebugMode)();
755
+ const call = (0, import_app_framework2.useCapability)(import_chunk_4YSNVPWU.ThreadCapabilities.CallManager);
756
+ return /* @__PURE__ */ import_react2.default.createElement("div", {
757
+ className: "grid grow p-4 dark:bg-neutral-900"
758
+ }, /* @__PURE__ */ import_react2.default.createElement(ParticipantGrid, {
759
+ self: call.self,
760
+ users: call.users,
761
+ debug,
762
+ fullscreen
763
+ }));
764
+ } finally {
765
+ _effect.f();
766
+ }
767
+ };
768
+ CallGrid.displayName = "CallGrid";
769
+ var CallToolbar = (props) => {
770
+ var _effect = (0, import_tracking2.useSignals)();
771
+ try {
772
+ return /* @__PURE__ */ import_react2.default.createElement("div", {
773
+ className: "absolute bottom-0 left-0 right-0 flex justify-center"
774
+ }, /* @__PURE__ */ import_react2.default.createElement(Toolbar, {
775
+ isInRoom: true,
776
+ ...props
777
+ }));
778
+ } finally {
779
+ _effect.f();
780
+ }
781
+ };
782
+ CallToolbar.displayName = "CallToolbar";
783
+ var Call = {
784
+ Root: CallRoot,
785
+ Grid: CallGrid,
786
+ Audio: CallAudio,
787
+ Toolbar: CallToolbar
788
+ };
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 = (0, import_tracking.useSignals)();
792
+ try {
793
+ const space = (0, import_echo.getSpace)(channel);
794
+ const callManager = (0, import_app_framework.useCapability)(import_chunk_4YSNVPWU.ThreadCapabilities.CallManager);
795
+ const roomId = channel ? (0, import_echo.fullyQualifiedId)(channel) : _roomId;
796
+ const identity = (0, import_halo.useIdentity)();
797
+ const isNamed = !!identity?.profile?.displayName;
798
+ const joinSound = (0, import_react_ui_sfx.useSoundEffect)("JoinCall");
799
+ const leaveSound = (0, import_react_ui_sfx.useSoundEffect)("LeaveCall");
800
+ const extensions = (0, import_app_framework.useCapabilities)(import_chunk_4YSNVPWU.ThreadCapabilities.CallExtension);
801
+ (0, import_react.useEffect)(() => {
802
+ const ctx = new import_context.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 = (0, import_react.useCallback)(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
+ import_log.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 = (0, import_react.useCallback)(async () => {
857
+ try {
858
+ void leaveSound.play();
859
+ } catch (err) {
860
+ import_log.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__ */ import_react.default.createElement(import_react_ui_stack.StackItem.Content, {
878
+ toolbar: !isJoined,
879
+ classNames: isJoined && "h-full"
880
+ }, isJoined && !isNamed && /* @__PURE__ */ import_react.default.createElement(DisplayNameMissing, null), isJoined && isNamed && /* @__PURE__ */ import_react.default.createElement(Call.Root, null, /* @__PURE__ */ import_react.default.createElement(Call.Grid, {
881
+ fullscreen
882
+ }), /* @__PURE__ */ import_react.default.createElement(Call.Toolbar, {
883
+ channel,
884
+ onLeave: handleLeave
885
+ })), !isJoined && channel && channel.defaultThread.target && space && /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement(ChannelToolbar, {
886
+ attendableId: (0, import_echo.fullyQualifiedId)(channel),
887
+ role,
888
+ onJoinCall: handleJoin
889
+ }), /* @__PURE__ */ import_react.default.createElement(import_chunk_4B3PPXA6.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 = (0, import_tracking.useSignals)();
900
+ try {
901
+ const { t } = (0, import_react_ui.useTranslation)(import_chunk_HLMCEE5K.THREAD_PLUGIN);
902
+ const client = (0, import_react_client.useClient)();
903
+ const [displayName, setDisplayName] = (0, import_react.useState)("");
904
+ const handleChange = (0, import_react.useCallback)((event) => setDisplayName(event.target.value), []);
905
+ const handleSave = (0, import_react.useCallback)(() => client.halo.updateProfile({
906
+ displayName
907
+ }), [
908
+ client,
909
+ displayName
910
+ ]);
911
+ return /* @__PURE__ */ import_react.default.createElement(import_react_ui_form.ControlGroup, {
912
+ classNames: "p-4 place-content-center"
913
+ }, /* @__PURE__ */ import_react.default.createElement(import_react_ui_form.ControlItemInput, {
914
+ title: t("display name label"),
915
+ description: t("display name description")
916
+ }, /* @__PURE__ */ import_react.default.createElement(import_react_ui.Input.TextInput, {
917
+ value: displayName,
918
+ onChange: handleChange,
919
+ placeholder: t("display name input placeholder"),
920
+ classNames: "md:min-is-64"
921
+ })), /* @__PURE__ */ import_react.default.createElement(import_react_ui_form.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 = (0, import_react.useMemo)(() => import_rx_react.Rx.make(() => {
931
+ const nodes = [];
932
+ const edges = [];
933
+ const rootGroup = (0, import_react_ui_menu.createMenuItemGroup)("root", {
934
+ label: [
935
+ "channel toolbar title",
936
+ {
937
+ ns: import_chunk_HLMCEE5K.THREAD_PLUGIN
938
+ }
939
+ ]
940
+ });
941
+ nodes.push(rootGroup);
942
+ const sortAction = (0, import_react_ui_menu.createMenuAction)("video-call", () => onJoinCall?.(), {
943
+ label: [
944
+ "start video call label",
945
+ {
946
+ ns: import_chunk_HLMCEE5K.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 (0, import_react_ui_menu.useMenuActions)(creator);
963
+ };
964
+ var ChannelToolbar = ({ attendableId, role, onJoinCall }) => {
965
+ var _effect = (0, import_tracking.useSignals)();
966
+ try {
967
+ const menuProps = useChannelToolbarActions(onJoinCall);
968
+ return /* @__PURE__ */ import_react.default.createElement(import_react_ui.ElevationProvider, {
969
+ elevation: role === "section" ? "positioned" : "base"
970
+ }, /* @__PURE__ */ import_react.default.createElement(import_react_ui_menu.MenuProvider, {
971
+ ...menuProps,
972
+ attendableId
973
+ }, /* @__PURE__ */ import_react.default.createElement(import_react_ui_menu.ToolbarMenu, null)));
974
+ } finally {
975
+ _effect.f();
976
+ }
977
+ };
978
+ // Annotate the CommonJS export names for ESM import in node:
979
+ 0 && (module.exports = {
980
+ Call,
981
+ ChannelContainer,
982
+ ChannelContainer_default
983
+ });
984
+ //# sourceMappingURL=chunk-6B3M6XRE.cjs.map