@dxos/plugin-thread 0.8.3-staging.0fa589b → 0.8.4-main.f9ba587

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 (232) hide show
  1. package/dist/lib/browser/ChannelContainer-5YH4FTBL.mjs +16 -0
  2. package/dist/lib/browser/ChatContainer-2UYQ23KO.mjs +15 -0
  3. package/dist/lib/browser/{app-graph-builder-OY7R7EJP.mjs → app-graph-builder-Q5V3KXE3.mjs} +6 -6
  4. package/dist/lib/browser/{call-manager-APQAZWHT.mjs → call-manager-NIPDYUVD.mjs} +6 -5
  5. package/dist/lib/browser/chunk-5ZVJ4GAS.mjs +21 -0
  6. package/dist/lib/browser/chunk-6NSMBO3B.mjs +56 -0
  7. package/dist/lib/browser/chunk-6NSMBO3B.mjs.map +7 -0
  8. package/dist/lib/browser/{chunk-5P5BH5GE.mjs → chunk-ERWASUQK.mjs} +66 -5
  9. package/dist/lib/browser/chunk-ERWASUQK.mjs.map +7 -0
  10. package/dist/lib/browser/{chunk-IIUTBDVB.mjs → chunk-EV4JWI7L.mjs} +2 -2
  11. package/dist/lib/browser/{chunk-JKQUJOTX.mjs → chunk-GERVMFQW.mjs} +2 -2
  12. package/dist/lib/browser/{chunk-AEXWNS6Z.mjs → chunk-JVIKVYTI.mjs} +4 -4
  13. package/dist/lib/browser/{chunk-XZKBN3NS.mjs → chunk-LCJD3NOB.mjs} +32 -31
  14. package/dist/lib/browser/chunk-LCJD3NOB.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-R5MDLUPC.mjs → chunk-LGSDKXPF.mjs} +3 -3
  16. package/dist/lib/browser/chunk-NCSFNWBZ.mjs +479 -0
  17. package/dist/lib/browser/chunk-NCSFNWBZ.mjs.map +7 -0
  18. package/dist/lib/browser/chunk-YD57K2SL.mjs +367 -0
  19. package/dist/lib/browser/chunk-YD57K2SL.mjs.map +7 -0
  20. package/dist/lib/browser/{chunk-4H4A264L.mjs → chunk-ZE7KWN36.mjs} +85 -124
  21. package/dist/lib/browser/chunk-ZE7KWN36.mjs.map +7 -0
  22. package/dist/lib/browser/index.mjs +28 -22
  23. package/dist/lib/browser/index.mjs.map +3 -3
  24. package/dist/lib/browser/{intent-resolver-FK2MDVDT.mjs → intent-resolver-MWE6XLPY.mjs} +6 -6
  25. package/dist/lib/browser/{markdown-TE5SWWNJ.mjs → markdown-ZO34G7RM.mjs} +7 -7
  26. package/dist/lib/browser/meta.json +1 -1
  27. package/dist/lib/browser/react-root-YNDNPODD.mjs +28 -0
  28. package/dist/lib/browser/{react-surface-VXUJKSOG.mjs → react-surface-2AXRNTCA.mjs} +12 -11
  29. package/dist/lib/browser/{settings-RB2RSLXV.mjs → settings-XZGPZNAU.mjs} +4 -4
  30. package/dist/lib/browser/{state-RKL5MSDP.mjs → state-H6CYONWE.mjs} +4 -4
  31. package/dist/lib/browser/types/index.mjs +2 -2
  32. package/dist/lib/node-esm/ChannelContainer-O2LZKMRM.mjs +17 -0
  33. package/dist/lib/node-esm/{ChatContainer-F6CSADV7.mjs → ChatContainer-6N35MP5J.mjs} +6 -5
  34. package/dist/lib/node-esm/{app-graph-builder-BAHBHYWI.mjs → app-graph-builder-GAKBZNU3.mjs} +6 -6
  35. package/dist/lib/node-esm/{call-manager-UUYXLF4T.mjs → call-manager-D6O5ZJJ4.mjs} +6 -5
  36. package/dist/lib/{browser/call-manager-APQAZWHT.mjs.map → node-esm/call-manager-D6O5ZJJ4.mjs.map} +1 -1
  37. package/dist/lib/node-esm/{chunk-O3V45YJP.mjs → chunk-25ABSYP2.mjs} +65 -5
  38. package/dist/lib/node-esm/chunk-25ABSYP2.mjs.map +7 -0
  39. package/dist/lib/node-esm/{chunk-UJMPYKT3.mjs → chunk-3X3YKRM2.mjs} +4 -4
  40. package/dist/lib/node-esm/{chunk-PGRP3O4O.mjs → chunk-57XR3LEF.mjs} +2 -2
  41. package/dist/lib/node-esm/{chunk-2RNIPFDA.mjs → chunk-5UQ4KKDE.mjs} +32 -31
  42. package/dist/lib/node-esm/chunk-5UQ4KKDE.mjs.map +7 -0
  43. package/dist/lib/node-esm/{chunk-K4KAUOKT.mjs → chunk-75RJ5DJI.mjs} +3 -3
  44. package/dist/lib/node-esm/chunk-A6QLTZCY.mjs +480 -0
  45. package/dist/lib/node-esm/chunk-A6QLTZCY.mjs.map +7 -0
  46. package/dist/lib/node-esm/{chunk-ESQC6SYE.mjs → chunk-GRLRWTRU.mjs} +2 -2
  47. package/dist/lib/node-esm/{chunk-WXNPD542.mjs → chunk-IHDNQLLR.mjs} +84 -124
  48. package/dist/lib/node-esm/chunk-IHDNQLLR.mjs.map +7 -0
  49. package/dist/lib/node-esm/chunk-OU5BYIDO.mjs +58 -0
  50. package/dist/lib/node-esm/chunk-OU5BYIDO.mjs.map +7 -0
  51. package/dist/lib/node-esm/chunk-RGTWAVEE.mjs +368 -0
  52. package/dist/lib/node-esm/chunk-RGTWAVEE.mjs.map +7 -0
  53. package/dist/lib/node-esm/chunk-X62X3VOK.mjs +23 -0
  54. package/dist/lib/node-esm/index.mjs +28 -22
  55. package/dist/lib/node-esm/index.mjs.map +3 -3
  56. package/dist/lib/node-esm/{intent-resolver-BU73VYW3.mjs → intent-resolver-B6PNTMPY.mjs} +6 -6
  57. package/dist/lib/node-esm/{markdown-HJUWNBLS.mjs → markdown-ZJUFV2TA.mjs} +7 -7
  58. package/dist/lib/node-esm/meta.json +1 -1
  59. package/dist/lib/node-esm/{react-root-RUXOAQNW.mjs → react-root-ZUVVTKWG.mjs} +12 -11
  60. package/dist/lib/{browser/react-root-NK3A4VG7.mjs.map → node-esm/react-root-ZUVVTKWG.mjs.map} +1 -1
  61. package/dist/lib/node-esm/{react-surface-ELXFYKP6.mjs → react-surface-OMEZTOU6.mjs} +12 -11
  62. package/dist/lib/{browser/react-surface-VXUJKSOG.mjs.map → node-esm/react-surface-OMEZTOU6.mjs.map} +1 -1
  63. package/dist/lib/node-esm/{settings-EA7DFSM6.mjs → settings-XECBSD6Q.mjs} +4 -4
  64. package/dist/lib/node-esm/{state-6AUTNROZ.mjs → state-D7WNDT3N.mjs} +4 -4
  65. package/dist/lib/node-esm/types/index.mjs +2 -2
  66. package/dist/types/src/calls/call-manager.d.ts +1 -1
  67. package/dist/types/src/calls/call-manager.d.ts.map +1 -1
  68. package/dist/types/src/calls/media-manager.d.ts.map +1 -1
  69. package/dist/types/src/calls/util/calls-service.d.ts +4 -1
  70. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
  71. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -1
  72. package/dist/types/src/calls-service.stories.d.ts +22 -0
  73. package/dist/types/src/calls-service.stories.d.ts.map +1 -0
  74. package/dist/types/src/components/ChannelContainer.d.ts.map +1 -1
  75. package/dist/types/src/components/ChannelContainer.stories.d.ts +2 -2
  76. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +1 -1
  77. package/dist/types/src/components/Chat.stories.d.ts +3 -2
  78. package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
  79. package/dist/types/src/components/ChatContainer.d.ts +2 -2
  80. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  81. package/dist/types/src/components/Comments.stories.d.ts +1 -1
  82. package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
  83. package/dist/types/src/components/CommentsContainer.d.ts +4 -4
  84. package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
  85. package/dist/types/src/components/CommentsThreadContainer.d.ts +14 -0
  86. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +1 -0
  87. package/dist/types/src/components/Media/VideoObject.stories.d.ts +1 -1
  88. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
  89. package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
  90. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +1 -1
  91. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +1 -1
  92. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +1 -1
  93. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  94. package/dist/types/src/components/index.d.ts +1 -1
  95. package/dist/types/src/components/index.d.ts.map +1 -1
  96. package/dist/types/src/hooks/index.d.ts +2 -0
  97. package/dist/types/src/hooks/index.d.ts.map +1 -1
  98. package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts +2 -0
  99. package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts.map +1 -0
  100. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +3 -0
  101. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -0
  102. package/dist/types/src/testing/stories.d.ts.map +1 -1
  103. package/dist/types/src/translations.d.ts +72 -194
  104. package/dist/types/src/translations.d.ts.map +1 -1
  105. package/dist/types/tsconfig.tsbuildinfo +1 -1
  106. package/package.json +47 -48
  107. package/src/ThreadPlugin.tsx +1 -1
  108. package/src/calls/call-manager.ts +6 -2
  109. package/src/calls/media-manager.ts +11 -4
  110. package/src/calls/util/calls-service.ts +8 -5
  111. package/src/calls/util/stub-media-streams.ts +3 -6
  112. package/src/calls-service.stories.tsx +216 -0
  113. package/src/components/Call/Call.tsx +1 -1
  114. package/src/components/Call/Toolbar.tsx +2 -2
  115. package/src/components/CallDebugPanel.tsx +2 -2
  116. package/src/components/ChannelContainer.stories.tsx +5 -5
  117. package/src/components/ChannelContainer.tsx +6 -5
  118. package/src/components/Chat.stories.tsx +4 -4
  119. package/src/components/ChatContainer.tsx +10 -9
  120. package/src/components/Comments.stories.tsx +22 -15
  121. package/src/components/CommentsContainer.tsx +16 -11
  122. package/src/components/{CommentContainer.tsx → CommentsThreadContainer.tsx} +49 -80
  123. package/src/components/Media/VideoObject.stories.tsx +1 -1
  124. package/src/components/MessageContainer.tsx +27 -43
  125. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +2 -2
  126. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +2 -2
  127. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +2 -2
  128. package/src/components/ThreadComplementary.tsx +2 -2
  129. package/src/components/ThreadSettings.tsx +2 -2
  130. package/src/components/index.ts +1 -1
  131. package/src/hooks/index.ts +2 -0
  132. package/src/hooks/useInaudibleAudioStreamTrack.tsx +27 -0
  133. package/src/hooks/useVideoStreamTrack.tsx +33 -0
  134. package/src/testing/stories.ts +5 -1
  135. package/src/translations.ts +9 -8
  136. package/dist/lib/browser/ChannelContainer-PKFBVENP.mjs +0 -15
  137. package/dist/lib/browser/ChatContainer-RSOKYAMK.mjs +0 -14
  138. package/dist/lib/browser/chunk-4H4A264L.mjs.map +0 -7
  139. package/dist/lib/browser/chunk-5P5BH5GE.mjs.map +0 -7
  140. package/dist/lib/browser/chunk-6NBVNXTM.mjs +0 -21
  141. package/dist/lib/browser/chunk-PG5CTFKK.mjs +0 -550
  142. package/dist/lib/browser/chunk-PG5CTFKK.mjs.map +0 -7
  143. package/dist/lib/browser/chunk-TAFSCSUR.mjs +0 -351
  144. package/dist/lib/browser/chunk-TAFSCSUR.mjs.map +0 -7
  145. package/dist/lib/browser/chunk-XZKBN3NS.mjs.map +0 -7
  146. package/dist/lib/browser/react-root-NK3A4VG7.mjs +0 -27
  147. package/dist/lib/node/ChannelContainer-YS5YT2ML.cjs +0 -36
  148. package/dist/lib/node/ChannelContainer-YS5YT2ML.cjs.map +0 -7
  149. package/dist/lib/node/ChatContainer-GCOM3M56.cjs +0 -35
  150. package/dist/lib/node/ChatContainer-GCOM3M56.cjs.map +0 -7
  151. package/dist/lib/node/app-graph-builder-PBHJNDQY.cjs +0 -179
  152. package/dist/lib/node/app-graph-builder-PBHJNDQY.cjs.map +0 -7
  153. package/dist/lib/node/call-manager-HV2XJW5O.cjs +0 -37
  154. package/dist/lib/node/call-manager-HV2XJW5O.cjs.map +0 -7
  155. package/dist/lib/node/chunk-44I33JDT.cjs +0 -1731
  156. package/dist/lib/node/chunk-44I33JDT.cjs.map +0 -7
  157. package/dist/lib/node/chunk-4YSNVPWU.cjs +0 -37
  158. package/dist/lib/node/chunk-4YSNVPWU.cjs.map +0 -7
  159. package/dist/lib/node/chunk-E3WBZTTI.cjs +0 -371
  160. package/dist/lib/node/chunk-E3WBZTTI.cjs.map +0 -7
  161. package/dist/lib/node/chunk-ERG7G6FF.cjs +0 -59
  162. package/dist/lib/node/chunk-ERG7G6FF.cjs.map +0 -7
  163. package/dist/lib/node/chunk-FUXJAVFZ.cjs +0 -108
  164. package/dist/lib/node/chunk-FUXJAVFZ.cjs.map +0 -7
  165. package/dist/lib/node/chunk-HLMCEE5K.cjs +0 -41
  166. package/dist/lib/node/chunk-HLMCEE5K.cjs.map +0 -7
  167. package/dist/lib/node/chunk-IP533AMV.cjs +0 -554
  168. package/dist/lib/node/chunk-IP533AMV.cjs.map +0 -7
  169. package/dist/lib/node/chunk-LR5NENBE.cjs +0 -54
  170. package/dist/lib/node/chunk-LR5NENBE.cjs.map +0 -7
  171. package/dist/lib/node/chunk-UM36TPCT.cjs +0 -984
  172. package/dist/lib/node/chunk-UM36TPCT.cjs.map +0 -7
  173. package/dist/lib/node/chunk-ZGDN3XBR.cjs +0 -149
  174. package/dist/lib/node/chunk-ZGDN3XBR.cjs.map +0 -7
  175. package/dist/lib/node/index.cjs +0 -310
  176. package/dist/lib/node/index.cjs.map +0 -7
  177. package/dist/lib/node/intent-resolver-SYSJ5SJG.cjs +0 -363
  178. package/dist/lib/node/intent-resolver-SYSJ5SJG.cjs.map +0 -7
  179. package/dist/lib/node/markdown-GQIPJS2F.cjs +0 -178
  180. package/dist/lib/node/markdown-GQIPJS2F.cjs.map +0 -7
  181. package/dist/lib/node/meta.json +0 -1
  182. package/dist/lib/node/react-root-6HHDMULJ.cjs +0 -51
  183. package/dist/lib/node/react-root-6HHDMULJ.cjs.map +0 -7
  184. package/dist/lib/node/react-surface-NBH42NN2.cjs +0 -122
  185. package/dist/lib/node/react-surface-NBH42NN2.cjs.map +0 -7
  186. package/dist/lib/node/settings-4LQSFEDK.cjs +0 -36
  187. package/dist/lib/node/settings-4LQSFEDK.cjs.map +0 -7
  188. package/dist/lib/node/state-IY5XX3H2.cjs +0 -50
  189. package/dist/lib/node/state-IY5XX3H2.cjs.map +0 -7
  190. package/dist/lib/node/types/index.cjs +0 -38
  191. package/dist/lib/node/types/index.cjs.map +0 -7
  192. package/dist/lib/node-esm/ChannelContainer-O4QJII2P.mjs +0 -16
  193. package/dist/lib/node-esm/chunk-2RNIPFDA.mjs.map +0 -7
  194. package/dist/lib/node-esm/chunk-O3V45YJP.mjs.map +0 -7
  195. package/dist/lib/node-esm/chunk-O63QJPQX.mjs +0 -23
  196. package/dist/lib/node-esm/chunk-P6RLFCNT.mjs +0 -352
  197. package/dist/lib/node-esm/chunk-P6RLFCNT.mjs.map +0 -7
  198. package/dist/lib/node-esm/chunk-UZWVVFT3.mjs +0 -551
  199. package/dist/lib/node-esm/chunk-UZWVVFT3.mjs.map +0 -7
  200. package/dist/lib/node-esm/chunk-WXNPD542.mjs.map +0 -7
  201. package/dist/types/src/components/CommentContainer.d.ts +0 -13
  202. package/dist/types/src/components/CommentContainer.d.ts.map +0 -1
  203. package/dist/types/src/peers.stories.d.ts +0 -11
  204. package/dist/types/src/peers.stories.d.ts.map +0 -1
  205. package/src/peers.stories.tsx +0 -189
  206. /package/dist/lib/browser/{ChannelContainer-PKFBVENP.mjs.map → ChannelContainer-5YH4FTBL.mjs.map} +0 -0
  207. /package/dist/lib/browser/{ChatContainer-RSOKYAMK.mjs.map → ChatContainer-2UYQ23KO.mjs.map} +0 -0
  208. /package/dist/lib/browser/{app-graph-builder-OY7R7EJP.mjs.map → app-graph-builder-Q5V3KXE3.mjs.map} +0 -0
  209. /package/dist/lib/{node-esm/call-manager-UUYXLF4T.mjs.map → browser/call-manager-NIPDYUVD.mjs.map} +0 -0
  210. /package/dist/lib/browser/{chunk-6NBVNXTM.mjs.map → chunk-5ZVJ4GAS.mjs.map} +0 -0
  211. /package/dist/lib/browser/{chunk-IIUTBDVB.mjs.map → chunk-EV4JWI7L.mjs.map} +0 -0
  212. /package/dist/lib/browser/{chunk-JKQUJOTX.mjs.map → chunk-GERVMFQW.mjs.map} +0 -0
  213. /package/dist/lib/browser/{chunk-AEXWNS6Z.mjs.map → chunk-JVIKVYTI.mjs.map} +0 -0
  214. /package/dist/lib/browser/{chunk-R5MDLUPC.mjs.map → chunk-LGSDKXPF.mjs.map} +0 -0
  215. /package/dist/lib/browser/{intent-resolver-FK2MDVDT.mjs.map → intent-resolver-MWE6XLPY.mjs.map} +0 -0
  216. /package/dist/lib/browser/{markdown-TE5SWWNJ.mjs.map → markdown-ZO34G7RM.mjs.map} +0 -0
  217. /package/dist/lib/{node-esm/react-root-RUXOAQNW.mjs.map → browser/react-root-YNDNPODD.mjs.map} +0 -0
  218. /package/dist/lib/{node-esm/react-surface-ELXFYKP6.mjs.map → browser/react-surface-2AXRNTCA.mjs.map} +0 -0
  219. /package/dist/lib/browser/{settings-RB2RSLXV.mjs.map → settings-XZGPZNAU.mjs.map} +0 -0
  220. /package/dist/lib/browser/{state-RKL5MSDP.mjs.map → state-H6CYONWE.mjs.map} +0 -0
  221. /package/dist/lib/node-esm/{ChannelContainer-O4QJII2P.mjs.map → ChannelContainer-O2LZKMRM.mjs.map} +0 -0
  222. /package/dist/lib/node-esm/{ChatContainer-F6CSADV7.mjs.map → ChatContainer-6N35MP5J.mjs.map} +0 -0
  223. /package/dist/lib/node-esm/{app-graph-builder-BAHBHYWI.mjs.map → app-graph-builder-GAKBZNU3.mjs.map} +0 -0
  224. /package/dist/lib/node-esm/{chunk-UJMPYKT3.mjs.map → chunk-3X3YKRM2.mjs.map} +0 -0
  225. /package/dist/lib/node-esm/{chunk-PGRP3O4O.mjs.map → chunk-57XR3LEF.mjs.map} +0 -0
  226. /package/dist/lib/node-esm/{chunk-K4KAUOKT.mjs.map → chunk-75RJ5DJI.mjs.map} +0 -0
  227. /package/dist/lib/node-esm/{chunk-ESQC6SYE.mjs.map → chunk-GRLRWTRU.mjs.map} +0 -0
  228. /package/dist/lib/node-esm/{chunk-O63QJPQX.mjs.map → chunk-X62X3VOK.mjs.map} +0 -0
  229. /package/dist/lib/node-esm/{intent-resolver-BU73VYW3.mjs.map → intent-resolver-B6PNTMPY.mjs.map} +0 -0
  230. /package/dist/lib/node-esm/{markdown-HJUWNBLS.mjs.map → markdown-ZJUFV2TA.mjs.map} +0 -0
  231. /package/dist/lib/node-esm/{settings-EA7DFSM6.mjs.map → settings-XECBSD6Q.mjs.map} +0 -0
  232. /package/dist/lib/node-esm/{state-6AUTNROZ.mjs.map → state-D7WNDT3N.mjs.map} +0 -0
@@ -1,550 +0,0 @@
1
- import {
2
- ThreadAction,
3
- ThreadType
4
- } from "./chunk-AEXWNS6Z.mjs";
5
- import {
6
- ChannelContainer
7
- } from "./chunk-XZKBN3NS.mjs";
8
- import {
9
- ThreadCapabilities
10
- } from "./chunk-R5MDLUPC.mjs";
11
- import {
12
- MessageContainer,
13
- command
14
- } from "./chunk-TAFSCSUR.mjs";
15
- import {
16
- useStatus
17
- } from "./chunk-5P5BH5GE.mjs";
18
- import {
19
- getMessageMetadata
20
- } from "./chunk-JKQUJOTX.mjs";
21
- import {
22
- THREAD_PLUGIN
23
- } from "./chunk-IIUTBDVB.mjs";
24
-
25
- // packages/plugins/plugin-thread/src/components/CallDebugPanel.tsx
26
- import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
27
- import { WebRTCStats } from "@peermetrics/webrtc-stats";
28
- import React, { useEffect, useMemo, useState } from "react";
29
- import { Panel } from "@dxos/devtools";
30
- import { log } from "@dxos/log";
31
- import { Input, useTranslation } from "@dxos/react-ui";
32
- import { Json } from "@dxos/react-ui-syntax-highlighter";
33
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/plugin-thread/src/components/CallDebugPanel.tsx";
34
- var CallDebugPanel = ({ state }) => {
35
- var _effect = _useSignals();
36
- try {
37
- const users = state?.call?.users;
38
- const self = state?.call?.self;
39
- const { t } = useTranslation(THREAD_PLUGIN);
40
- const [open, setOpen] = useState(false);
41
- const handleToggle = () => setOpen(!open);
42
- const [showDetailedWebRTCStats, setShowDetailedWebRTCStats] = useState(false);
43
- const handleShowDetailedWebRTCStats = () => setShowDetailedWebRTCStats(!showDetailedWebRTCStats);
44
- const webrtcStats = useMemo(() => new WebRTCStats({
45
- getStatsInterval: 1e3
46
- }), []);
47
- const [stats, setStats] = useState({});
48
- useEffect(() => {
49
- const pc = state?.media.peer?.session?.peerConnection;
50
- const handleStats = (stats2) => setStats(stats2.data);
51
- let added = false;
52
- if (pc && showDetailedWebRTCStats) {
53
- webrtcStats.addConnection({
54
- pc,
55
- peerId: 1,
56
- connectionId: "1"
57
- });
58
- webrtcStats.on("stats", handleStats);
59
- added = true;
60
- }
61
- return () => {
62
- try {
63
- if (pc && added) {
64
- webrtcStats.removeConnection({
65
- pc
66
- });
67
- webrtcStats.removeListener("stats", handleStats);
68
- }
69
- } catch (error) {
70
- log.error("error removing webrtc stats", {
71
- error,
72
- pc,
73
- peerId: 1,
74
- connectionId: "1"
75
- }, {
76
- F: __dxlog_file,
77
- L: 55,
78
- S: void 0,
79
- C: (f, a) => f(...a)
80
- });
81
- }
82
- };
83
- }, [
84
- state?.media.peer?.session?.peerConnection,
85
- showDetailedWebRTCStats
86
- ]);
87
- return /* @__PURE__ */ React.createElement(Panel, {
88
- id: "meeting-status",
89
- icon: "ph--video-conference--regular",
90
- open,
91
- onToggle: handleToggle,
92
- title: t("meeting status title"),
93
- maxHeight: false,
94
- info: /* @__PURE__ */ React.createElement("div", {
95
- className: "flex items-center gap-2"
96
- }, /* @__PURE__ */ React.createElement("span", {
97
- title: "Joined"
98
- }, self?.joined ? "Active" : "Inactive"), users?.length !== void 0 && /* @__PURE__ */ React.createElement("span", {
99
- title: "Users"
100
- }, users?.length ?? 0, " User(s)"))
101
- }, /* @__PURE__ */ React.createElement("div", {
102
- className: "flex flex-col gap-2 overflow-y-auto"
103
- }, /* @__PURE__ */ React.createElement("div", {
104
- className: "flex items-row gap-2"
105
- }, /* @__PURE__ */ React.createElement(Input.Root, null, /* @__PURE__ */ React.createElement(Input.Label, {
106
- classNames: "text-sm"
107
- }, t("show webrtc stats title")), /* @__PURE__ */ React.createElement(Input.Checkbox, {
108
- checked: showDetailedWebRTCStats,
109
- onCheckedChange: handleShowDetailedWebRTCStats
110
- }))), /* @__PURE__ */ React.createElement(Json, {
111
- classNames: "text-sm",
112
- data: {
113
- users,
114
- activities: state?.call?.activities,
115
- ...showDetailedWebRTCStats ? {
116
- webrtc: {
117
- connectionState: state?.media.peer?.session?.peerConnection.connectionState,
118
- iceConnectionState: state?.media.peer?.session?.peerConnection.iceConnectionState,
119
- stats
120
- }
121
- } : {},
122
- tracks: state?.media.peer?.session?.peerConnection.getTransceivers().map((transceiver) => {
123
- const track = transceiver.direction === "recvonly" ? transceiver.receiver.track : transceiver.sender.track;
124
- return {
125
- id: track?.id,
126
- kind: track?.kind,
127
- direction: transceiver.direction,
128
- enabled: track?.enabled,
129
- muted: track?.muted,
130
- readyState: track?.readyState,
131
- settings: track?.getSettings()
132
- };
133
- }),
134
- callsServiceHistory: state?.media.peer?.history.get()
135
- }
136
- })));
137
- } finally {
138
- _effect.f();
139
- }
140
- };
141
-
142
- // packages/plugins/plugin-thread/src/components/CallSidebar.tsx
143
- import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
144
- import React2 from "react";
145
- import { useCapability } from "@dxos/app-framework";
146
- var CallSidebar = () => {
147
- var _effect = _useSignals2();
148
- try {
149
- const call = useCapability(ThreadCapabilities.CallManager);
150
- return /* @__PURE__ */ React2.createElement(ChannelContainer, {
151
- roomId: call.roomId
152
- });
153
- } finally {
154
- _effect.f();
155
- }
156
- };
157
-
158
- // packages/plugins/plugin-thread/src/components/ThreadComplementary.tsx
159
- import { useSignals as _useSignals6 } from "@preact-signals/safe-react/tracking";
160
- import React6, { useCallback as useCallback2, useMemo as useMemo3 } from "react";
161
- import { Capabilities, LayoutAction, createIntent, useCapability as useCapability2, useCapabilities, useIntentDispatcher } from "@dxos/app-framework";
162
- import { Filter, Obj, Query, Relation as Relation3 } from "@dxos/echo";
163
- import { fullyQualifiedId as fullyQualifiedId3, getSpace as getSpace2, useQuery } from "@dxos/react-client/echo";
164
- import { useIdentity as useIdentity2 } from "@dxos/react-client/halo";
165
- import { useThemeContext as useThemeContext2, useTranslation as useTranslation4 } from "@dxos/react-ui";
166
- import { useAttended } from "@dxos/react-ui-attention";
167
- import { StackItem } from "@dxos/react-ui-stack";
168
- import { Tabs } from "@dxos/react-ui-tabs";
169
- import { AnchoredTo } from "@dxos/schema";
170
-
171
- // packages/plugins/plugin-thread/src/components/index.ts
172
- import { lazy } from "react";
173
-
174
- // packages/plugins/plugin-thread/src/components/CommentContainer.tsx
175
- import { useSignals as _useSignals3 } from "@preact-signals/safe-react/tracking";
176
- import { CheckCircle, X } from "@phosphor-icons/react";
177
- import React3, { useCallback, useMemo as useMemo2, useRef, useState as useState2 } from "react";
178
- import { Relation } from "@dxos/echo";
179
- import { RefArray } from "@dxos/live-object";
180
- import { fullyQualifiedId, getSpace, useMembers } from "@dxos/react-client/echo";
181
- import { useIdentity } from "@dxos/react-client/halo";
182
- import { Button, Tag, Tooltip, useThemeContext, useTranslation as useTranslation2 } from "@dxos/react-ui";
183
- import { createBasicExtensions, createThemeExtensions, listener } from "@dxos/react-ui-editor";
184
- import { getSize, hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from "@dxos/react-ui-theme";
185
- import { MessageTextbox, Thread, ThreadFooter, ThreadHeading } from "@dxos/react-ui-thread";
186
- import { isNonNullable } from "@dxos/util";
187
- var sizeClass = getSize(4);
188
- var commentControlClassNames = "!p-1 !min-bs-0 transition-opacity";
189
- var ToggleResolvedButton = ({ isResolved, onResolve }) => {
190
- var _effect = _useSignals3();
191
- try {
192
- const { t } = useTranslation2(THREAD_PLUGIN);
193
- const label = t(isResolved ? "mark as unresolved label" : "mark as resolved label");
194
- return /* @__PURE__ */ React3.createElement(Tooltip.Trigger, {
195
- asChild: true,
196
- content: label
197
- }, /* @__PURE__ */ React3.createElement(Button, {
198
- variant: "ghost",
199
- "data-testid": "thread.toggle-resolved",
200
- onClick: onResolve,
201
- classNames: [
202
- commentControlClassNames,
203
- !isResolved && hoverableControlItem
204
- ]
205
- }, /* @__PURE__ */ React3.createElement("span", {
206
- className: "sr-only"
207
- }, label), isResolved ? /* @__PURE__ */ React3.createElement(CheckCircle, {
208
- className: sizeClass,
209
- weight: "fill"
210
- }) : /* @__PURE__ */ React3.createElement(CheckCircle, {
211
- className: sizeClass
212
- })));
213
- } finally {
214
- _effect.f();
215
- }
216
- };
217
- var DeleteThreadButton = ({ onDelete }) => {
218
- var _effect = _useSignals3();
219
- try {
220
- const { t } = useTranslation2(THREAD_PLUGIN);
221
- const label = t("delete thread label");
222
- return /* @__PURE__ */ React3.createElement(Tooltip.Trigger, {
223
- asChild: true,
224
- content: label
225
- }, /* @__PURE__ */ React3.createElement(Button, {
226
- variant: "ghost",
227
- "data-testid": "thread.delete",
228
- onClick: onDelete,
229
- classNames: [
230
- commentControlClassNames,
231
- hoverableControlItem
232
- ]
233
- }, /* @__PURE__ */ React3.createElement("span", {
234
- className: "sr-only"
235
- }, label), /* @__PURE__ */ React3.createElement(X, {
236
- className: sizeClass
237
- })));
238
- } finally {
239
- _effect.f();
240
- }
241
- };
242
- var CommentContainer = ({ anchor, current, onAttend, onComment, onResolve, onMessageDelete, onThreadDelete }) => {
243
- var _effect = _useSignals3();
244
- try {
245
- const identity = useIdentity();
246
- const space = getSpace(anchor);
247
- const members = useMembers(space?.key);
248
- const detached = !anchor.anchor;
249
- const thread = Relation.getSource(anchor);
250
- const activity = useStatus(space, fullyQualifiedId(thread));
251
- const { t } = useTranslation2(THREAD_PLUGIN);
252
- const threadScrollRef = useRef(null);
253
- const { themeMode } = useThemeContext();
254
- const textboxMetadata = getMessageMetadata(fullyQualifiedId(thread), identity);
255
- const [_count, _setCount] = useState2(0);
256
- const rerenderEditor = () => _setCount((count) => count + 1);
257
- const messageRef = useRef("");
258
- const extensions = useMemo2(() => [
259
- createBasicExtensions({
260
- placeholder: t("message placeholder")
261
- }),
262
- createThemeExtensions({
263
- themeMode
264
- }),
265
- listener({
266
- onChange: (text) => messageRef.current = text
267
- }),
268
- command
269
- ], [
270
- _count
271
- ]);
272
- const scrollToEnd = (behavior) => setTimeout(() => threadScrollRef.current?.scrollIntoView({
273
- behavior,
274
- block: "end"
275
- }), 10);
276
- const handleAttend = useCallback(() => onAttend?.(anchor), [
277
- onAttend,
278
- anchor
279
- ]);
280
- const handleResolve = useCallback(() => onResolve?.(anchor), [
281
- onResolve,
282
- anchor
283
- ]);
284
- const handleMessageDelete = useCallback((id) => onMessageDelete?.(anchor, id), [
285
- onMessageDelete,
286
- anchor
287
- ]);
288
- const handleThreadDelete = useCallback(() => onThreadDelete?.(anchor), [
289
- onThreadDelete,
290
- anchor
291
- ]);
292
- const handleComment = useCallback(() => {
293
- if (!messageRef.current) {
294
- return false;
295
- }
296
- onComment?.(anchor, messageRef.current);
297
- messageRef.current = "";
298
- scrollToEnd("instant");
299
- rerenderEditor();
300
- return true;
301
- }, [
302
- anchor,
303
- identity
304
- ]);
305
- return /* @__PURE__ */ React3.createElement(Thread, {
306
- onClickCapture: handleAttend,
307
- onFocusCapture: handleAttend,
308
- current,
309
- id: fullyQualifiedId(thread)
310
- }, /* @__PURE__ */ React3.createElement("div", {
311
- role: "none",
312
- className: mx("col-span-2 grid grid-cols-[var(--rail-size)_1fr_min-content]", hoverableControls, hoverableFocusedWithinControls)
313
- }, detached ? /* @__PURE__ */ React3.createElement(Tooltip.Trigger, {
314
- asChild: true,
315
- content: t("detached thread label"),
316
- side: "top"
317
- }, /* @__PURE__ */ React3.createElement(ThreadHeading, {
318
- detached: true
319
- }, thread.name)) : /* @__PURE__ */ React3.createElement(ThreadHeading, null, thread.name), /* @__PURE__ */ React3.createElement("div", {
320
- className: "flex flex-row items-center pli-1"
321
- }, thread.status === "staged" && /* @__PURE__ */ React3.createElement(Tag, {
322
- palette: "neutral"
323
- }, t("draft button")), onResolve && !(thread?.status === "staged") && /* @__PURE__ */ React3.createElement(ToggleResolvedButton, {
324
- isResolved: thread?.status === "resolved",
325
- onResolve: handleResolve
326
- }), onThreadDelete && /* @__PURE__ */ React3.createElement(DeleteThreadButton, {
327
- onDelete: handleThreadDelete
328
- }))), RefArray.targets(thread.messages?.filter(isNonNullable) ?? []).map((message) => /* @__PURE__ */ React3.createElement(MessageContainer, {
329
- key: message.id,
330
- editable: true,
331
- message,
332
- members,
333
- onDelete: handleMessageDelete
334
- })), /* @__PURE__ */ React3.createElement(MessageTextbox, {
335
- extensions,
336
- onSend: handleComment,
337
- ...textboxMetadata
338
- }), /* @__PURE__ */ React3.createElement(ThreadFooter, {
339
- activity
340
- }, t("activity message")), /* @__PURE__ */ React3.createElement("div", {
341
- role: "none",
342
- className: "bs-px -mbs-px",
343
- ref: threadScrollRef
344
- }));
345
- } finally {
346
- _effect.f();
347
- }
348
- };
349
-
350
- // packages/plugins/plugin-thread/src/components/CommentsContainer.tsx
351
- import { useSignals as _useSignals4 } from "@preact-signals/safe-react/tracking";
352
- import React4, { useEffect as useEffect2 } from "react";
353
- import { Relation as Relation2 } from "@dxos/echo";
354
- import { fullyQualifiedId as fullyQualifiedId2 } from "@dxos/react-client/echo";
355
- import { Callout, Icon, Trans, useTranslation as useTranslation3 } from "@dxos/react-ui";
356
- var CommentsContainer = ({ anchors, currentId, showResolvedThreads, ...props }) => {
357
- var _effect = _useSignals4();
358
- try {
359
- const { t } = useTranslation3(THREAD_PLUGIN);
360
- const filteredAnchors = showResolvedThreads ? anchors.filter((anchor) => !!Relation2.getSource(anchor)) : anchors.filter((anchor) => {
361
- const thread = Relation2.getSource(anchor);
362
- return thread && thread.status !== "resolved";
363
- });
364
- useEffect2(() => {
365
- if (currentId) {
366
- document.getElementById(currentId)?.scrollIntoView({
367
- behavior: "smooth",
368
- block: "end"
369
- });
370
- }
371
- }, [
372
- currentId
373
- ]);
374
- if (filteredAnchors.length === 0) {
375
- return /* @__PURE__ */ React4.createElement("div", {
376
- role: "none",
377
- className: "plb-cardSpacingBlock pli-cardSpacingInline"
378
- }, /* @__PURE__ */ React4.createElement(Callout.Root, null, /* @__PURE__ */ React4.createElement(Callout.Title, null, /* @__PURE__ */ React4.createElement(Trans, {
379
- t,
380
- i18nKey: "no comments message",
381
- components: {
382
- commentIcon: /* @__PURE__ */ React4.createElement(Icon, {
383
- icon: "ph--chat-text--regular",
384
- size: 4,
385
- classNames: "inline-block"
386
- })
387
- }
388
- }))));
389
- }
390
- return filteredAnchors.map((anchor) => {
391
- const thread = Relation2.getSource(anchor);
392
- const threadId = fullyQualifiedId2(thread);
393
- return /* @__PURE__ */ React4.createElement(CommentContainer, {
394
- key: threadId,
395
- anchor,
396
- current: currentId === threadId,
397
- ...props
398
- });
399
- });
400
- } finally {
401
- _effect.f();
402
- }
403
- };
404
-
405
- // packages/plugins/plugin-thread/src/components/ThreadSettings.tsx
406
- import { useSignals as _useSignals5 } from "@preact-signals/safe-react/tracking";
407
- import React5 from "react";
408
- import { DeprecatedFormContainer } from "@dxos/react-ui-form";
409
- var ThreadSettings = ({ settings }) => {
410
- var _effect = _useSignals5();
411
- try {
412
- return /* @__PURE__ */ React5.createElement(DeprecatedFormContainer, null);
413
- } finally {
414
- _effect.f();
415
- }
416
- };
417
-
418
- // packages/plugins/plugin-thread/src/components/index.ts
419
- var ChannelContainer2 = lazy(() => import("./ChannelContainer-PKFBVENP.mjs"));
420
- var ChatContainer = lazy(() => import("./ChatContainer-RSOKYAMK.mjs"));
421
-
422
- // packages/plugins/plugin-thread/src/components/ThreadComplementary.tsx
423
- var ThreadComplementary = ({ subject }) => {
424
- var _effect = _useSignals6();
425
- try {
426
- const { dispatchPromise: dispatch } = useIntentDispatcher();
427
- const identity = useIdentity2();
428
- const { t } = useTranslation4(THREAD_PLUGIN);
429
- const { tx } = useThemeContext2();
430
- const subjectId = fullyQualifiedId3(subject);
431
- const { state, getViewState } = useCapability2(ThreadCapabilities.MutableState);
432
- const drafts = state.drafts[subjectId];
433
- const viewState = useMemo3(() => getViewState(subjectId), [
434
- getViewState,
435
- subjectId
436
- ]);
437
- const { showResolvedThreads } = viewState;
438
- const onChangeViewState = useCallback2((nextValue) => {
439
- viewState.showResolvedThreads = nextValue === "all";
440
- }, [
441
- viewState
442
- ]);
443
- const anchorSorts = useCapabilities(Capabilities.AnchorSort);
444
- const sort = useMemo3(() => anchorSorts.find(({ key }) => key === Obj.getTypename(subject))?.sort, [
445
- anchorSorts,
446
- subject
447
- ]);
448
- const space = getSpace2(subject);
449
- const objectsAnchoredTo = useQuery(space, Query.select(Filter.ids(subject.id)).targetOf(AnchoredTo));
450
- const anchors = objectsAnchoredTo.toSorted((a, b) => sort?.(a, b) ?? 0).filter((anchor) => Obj.instanceOf(ThreadType, Relation3.getSource(anchor))).concat(drafts ?? []);
451
- const attended = useAttended();
452
- const handleAttend = useCallback2((anchor) => {
453
- const thread = Relation3.getSource(anchor);
454
- const threadId = fullyQualifiedId3(thread);
455
- if (state.current !== threadId) {
456
- state.current = threadId;
457
- void dispatch(createIntent(LayoutAction.ScrollIntoView, {
458
- part: "current",
459
- subject: fullyQualifiedId3(subject),
460
- options: {
461
- cursor: anchor.anchor,
462
- ref: threadId
463
- }
464
- }));
465
- }
466
- }, [
467
- state.current,
468
- dispatch,
469
- subject
470
- ]);
471
- const handleComment = useCallback2(async (anchor, text) => {
472
- await dispatch(createIntent(ThreadAction.AddMessage, {
473
- anchor,
474
- subject,
475
- sender: {
476
- identityDid: identity?.did
477
- },
478
- text
479
- }));
480
- const thread = Relation3.getSource(anchor);
481
- state.current = fullyQualifiedId3(thread);
482
- }, [
483
- dispatch,
484
- identity,
485
- subject
486
- ]);
487
- const handleResolve = useCallback2((anchor) => dispatch(createIntent(ThreadAction.ToggleResolved, {
488
- thread: Relation3.getSource(anchor)
489
- })), [
490
- dispatch
491
- ]);
492
- const handleThreadDelete = useCallback2((anchor) => dispatch(createIntent(ThreadAction.Delete, {
493
- anchor,
494
- subject
495
- })), [
496
- dispatch,
497
- subject
498
- ]);
499
- const handleMessageDelete = useCallback2((anchor, messageId) => dispatch(createIntent(ThreadAction.DeleteMessage, {
500
- anchor,
501
- subject,
502
- messageId
503
- })), [
504
- dispatch,
505
- subject
506
- ]);
507
- const comments = /* @__PURE__ */ React6.createElement(CommentsContainer, {
508
- anchors,
509
- currentId: attended.includes(subjectId) ? state.current : void 0,
510
- showResolvedThreads,
511
- onAttend: handleAttend,
512
- onComment: handleComment,
513
- onResolve: handleResolve,
514
- onMessageDelete: handleMessageDelete,
515
- onThreadDelete: handleThreadDelete
516
- });
517
- return /* @__PURE__ */ React6.createElement(StackItem.Content, {
518
- toolbar: true
519
- }, /* @__PURE__ */ React6.createElement(Tabs.Root, {
520
- value: showResolvedThreads ? "all" : "unresolved",
521
- orientation: "horizontal",
522
- classNames: 'contents [&_[role="tabpanel"]]:min-bs-0 [&_[role="tabpanel"]]:overflow-y-auto [&_[role="tabpanel"]]:scrollbar-thin',
523
- onValueChange: onChangeViewState
524
- }, /* @__PURE__ */ React6.createElement(Tabs.Tablist, {
525
- classNames: tx("toolbar.root", "toolbar", {})
526
- }, /* @__PURE__ */ React6.createElement(Tabs.Tab, {
527
- value: "unresolved",
528
- classNames: "text-sm"
529
- }, t("show unresolved label")), /* @__PURE__ */ React6.createElement(Tabs.Tab, {
530
- value: "all",
531
- classNames: "text-sm"
532
- }, t("show all label"))), /* @__PURE__ */ React6.createElement(Tabs.Tabpanel, {
533
- value: "all"
534
- }, showResolvedThreads && comments), /* @__PURE__ */ React6.createElement(Tabs.Tabpanel, {
535
- value: "unresolved"
536
- }, !showResolvedThreads && comments)));
537
- } finally {
538
- _effect.f();
539
- }
540
- };
541
-
542
- export {
543
- CallDebugPanel,
544
- CallSidebar,
545
- ThreadComplementary,
546
- ThreadSettings,
547
- ChannelContainer2 as ChannelContainer,
548
- ChatContainer
549
- };
550
- //# sourceMappingURL=chunk-PG5CTFKK.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/CallDebugPanel.tsx", "../../../src/components/CallSidebar.tsx", "../../../src/components/ThreadComplementary.tsx", "../../../src/components/index.ts", "../../../src/components/CommentContainer.tsx", "../../../src/components/CommentsContainer.tsx", "../../../src/components/ThreadSettings.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { WebRTCStats } from '@peermetrics/webrtc-stats';\nimport React, { useEffect, useMemo, useState } from 'react';\n\nimport { Panel } from '@dxos/devtools';\nimport { log } from '@dxos/log';\nimport { Input, useTranslation, type ThemedClassName } from '@dxos/react-ui';\nimport { Json } from '@dxos/react-ui-syntax-highlighter';\n\nimport { type GlobalState } from '../calls';\nimport { THREAD_PLUGIN } from '../meta';\n\nexport type CallDebugPanelProps = ThemedClassName<{\n state?: GlobalState;\n}>;\n\nexport const CallDebugPanel = ({ state }: CallDebugPanelProps) => {\n const users = state?.call?.users;\n const self = state?.call?.self;\n const { t } = useTranslation(THREAD_PLUGIN);\n\n const [open, setOpen] = useState(false);\n const handleToggle = () => setOpen(!open);\n const [showDetailedWebRTCStats, setShowDetailedWebRTCStats] = useState(false);\n const handleShowDetailedWebRTCStats = () => setShowDetailedWebRTCStats(!showDetailedWebRTCStats);\n\n const webrtcStats = useMemo(\n () =>\n new WebRTCStats({\n getStatsInterval: 1000,\n }),\n [],\n );\n\n const [stats, setStats] = useState<Record<string, any>>({});\n useEffect(() => {\n const pc = state?.media.peer?.session?.peerConnection;\n const handleStats = (stats: Record<string, any>) => setStats(stats.data);\n let added = false;\n if (pc && showDetailedWebRTCStats) {\n webrtcStats.addConnection({ pc, peerId: 1, connectionId: '1' });\n webrtcStats.on('stats', handleStats);\n added = true;\n }\n return () => {\n try {\n if (pc && added) {\n webrtcStats.removeConnection({ pc });\n webrtcStats.removeListener('stats', handleStats);\n }\n } catch (error) {\n log.error('error removing webrtc stats', { error, pc, peerId: 1, connectionId: '1' });\n }\n };\n }, [state?.media.peer?.session?.peerConnection, showDetailedWebRTCStats]);\n\n return (\n <Panel\n id='meeting-status'\n icon='ph--video-conference--regular'\n open={open}\n onToggle={handleToggle}\n title={t('meeting status title')}\n maxHeight={false}\n info={\n <div className='flex items-center gap-2'>\n <span title='Joined'>{self?.joined ? 'Active' : 'Inactive'}</span>\n {users?.length !== undefined && <span title='Users'>{users?.length ?? 0} User(s)</span>}\n </div>\n }\n >\n <div className='flex flex-col gap-2 overflow-y-auto'>\n <div className='flex items-row gap-2'>\n <Input.Root>\n <Input.Label classNames={'text-sm'}>{t('show webrtc stats title')}</Input.Label>\n <Input.Checkbox checked={showDetailedWebRTCStats} onCheckedChange={handleShowDetailedWebRTCStats} />\n </Input.Root>\n </div>\n <Json\n classNames='text-sm'\n data={{\n users,\n activities: state?.call?.activities,\n ...(showDetailedWebRTCStats\n ? {\n webrtc: {\n connectionState: state?.media.peer?.session?.peerConnection.connectionState,\n iceConnectionState: state?.media.peer?.session?.peerConnection.iceConnectionState,\n stats,\n },\n }\n : {}),\n tracks: state?.media.peer?.session?.peerConnection.getTransceivers().map((transceiver) => {\n const track =\n transceiver.direction === 'recvonly' ? transceiver.receiver.track : transceiver.sender.track;\n return {\n id: track?.id,\n kind: track?.kind,\n direction: transceiver.direction,\n enabled: track?.enabled,\n muted: track?.muted,\n readyState: track?.readyState,\n settings: track?.getSettings(),\n };\n }),\n callsServiceHistory: state?.media.peer?.history.get(),\n }}\n />\n </div>\n </Panel>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { useCapability } from '@dxos/app-framework';\n\nimport { ChannelContainer } from './ChannelContainer';\nimport { ThreadCapabilities } from '../capabilities';\n\nexport const CallSidebar = () => {\n const call = useCapability(ThreadCapabilities.CallManager);\n return <ChannelContainer roomId={call.roomId} />;\n};\n\nexport default CallSidebar;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useCallback, useMemo } from 'react';\n\nimport {\n Capabilities,\n LayoutAction,\n createIntent,\n useCapability,\n useCapabilities,\n useIntentDispatcher,\n} from '@dxos/app-framework';\nimport { Filter, Obj, Query, Relation } from '@dxos/echo';\nimport { fullyQualifiedId, getSpace, useQuery } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { useAttended } from '@dxos/react-ui-attention';\nimport { StackItem } from '@dxos/react-ui-stack';\nimport { Tabs } from '@dxos/react-ui-tabs';\nimport { AnchoredTo } from '@dxos/schema';\n\nimport { ThreadCapabilities } from '../capabilities';\nimport { CommentsContainer } from '../components';\nimport { THREAD_PLUGIN } from '../meta';\nimport { ThreadAction, ThreadType } from '../types';\n\nexport const ThreadComplementary = ({ subject }: { subject: any }) => {\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n const identity = useIdentity();\n const { t } = useTranslation(THREAD_PLUGIN);\n const { tx } = useThemeContext();\n const subjectId = fullyQualifiedId(subject);\n\n const { state, getViewState } = useCapability(ThreadCapabilities.MutableState);\n const drafts = state.drafts[subjectId];\n const viewState = useMemo(() => getViewState(subjectId), [getViewState, subjectId]);\n const { showResolvedThreads } = viewState;\n const onChangeViewState = useCallback(\n (nextValue: string) => {\n viewState.showResolvedThreads = nextValue === 'all';\n },\n [viewState],\n );\n\n const anchorSorts = useCapabilities(Capabilities.AnchorSort);\n const sort = useMemo(\n () => anchorSorts.find(({ key }) => key === Obj.getTypename(subject))?.sort,\n [anchorSorts, subject],\n );\n\n const space = getSpace(subject);\n const objectsAnchoredTo = useQuery(space, Query.select(Filter.ids(subject.id)).targetOf(AnchoredTo));\n const anchors = objectsAnchoredTo\n .toSorted((a, b) => sort?.(a, b) ?? 0)\n .filter((anchor) => Obj.instanceOf(ThreadType, Relation.getSource(anchor)))\n .concat(drafts ?? []);\n\n const attended = useAttended();\n\n const handleAttend = useCallback(\n (anchor: AnchoredTo) => {\n const thread = Relation.getSource(anchor) as ThreadType;\n const threadId = fullyQualifiedId(thread);\n\n if (state.current !== threadId) {\n state.current = threadId;\n\n // TODO(wittjosiah): Should this be a thread-specific intent?\n // The layout doesn't know about threads and this working depends on other plugins conditionally handling it.\n // This may be overloading this intent or highjacking its intended purpose.\n void dispatch(\n createIntent(LayoutAction.ScrollIntoView, {\n part: 'current',\n subject: fullyQualifiedId(subject),\n options: {\n cursor: anchor.anchor,\n ref: threadId,\n },\n }),\n );\n }\n },\n [state.current, dispatch, subject],\n );\n\n const handleComment = useCallback(\n async (anchor: AnchoredTo, text: string) => {\n await dispatch(\n createIntent(ThreadAction.AddMessage, { anchor, subject, sender: { identityDid: identity?.did }, text }),\n );\n\n const thread = Relation.getSource(anchor) as ThreadType;\n state.current = fullyQualifiedId(thread);\n },\n [dispatch, identity, subject],\n );\n\n const handleResolve = useCallback(\n (anchor: AnchoredTo) =>\n dispatch(createIntent(ThreadAction.ToggleResolved, { thread: Relation.getSource(anchor) as ThreadType })),\n [dispatch],\n );\n\n const handleThreadDelete = useCallback(\n (anchor: AnchoredTo) => dispatch(createIntent(ThreadAction.Delete, { anchor, subject })),\n [dispatch, subject],\n );\n\n const handleMessageDelete = useCallback(\n (anchor: AnchoredTo, messageId: string) =>\n dispatch(createIntent(ThreadAction.DeleteMessage, { anchor, subject, messageId })),\n [dispatch, subject],\n );\n\n const comments = (\n <CommentsContainer\n anchors={anchors}\n currentId={attended.includes(subjectId) ? state.current : undefined}\n showResolvedThreads={showResolvedThreads}\n onAttend={handleAttend}\n onComment={handleComment}\n onResolve={handleResolve}\n onMessageDelete={handleMessageDelete}\n onThreadDelete={handleThreadDelete}\n />\n );\n\n return (\n <StackItem.Content toolbar>\n <Tabs.Root\n value={showResolvedThreads ? 'all' : 'unresolved'}\n orientation='horizontal'\n classNames='contents [&_[role=\"tabpanel\"]]:min-bs-0 [&_[role=\"tabpanel\"]]:overflow-y-auto [&_[role=\"tabpanel\"]]:scrollbar-thin'\n onValueChange={onChangeViewState}\n >\n <Tabs.Tablist classNames={tx('toolbar.root', 'toolbar', {})}>\n <Tabs.Tab value='unresolved' classNames='text-sm'>\n {t('show unresolved label')}\n </Tabs.Tab>\n <Tabs.Tab value='all' classNames='text-sm'>\n {t('show all label')}\n </Tabs.Tab>\n </Tabs.Tablist>\n <Tabs.Tabpanel value='all'>{showResolvedThreads && comments}</Tabs.Tabpanel>\n <Tabs.Tabpanel value='unresolved'>{!showResolvedThreads && comments}</Tabs.Tabpanel>\n </Tabs.Root>\n </StackItem.Content>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { lazy } from 'react';\n\nexport const ChannelContainer = lazy(() => import('./ChannelContainer'));\nexport const ChatContainer = lazy(() => import('./ChatContainer'));\n\n// TODO(wittjosiah): Suspense boundary for sidebar?\nexport * from './Call';\nexport * from './CallDebugPanel';\nexport * from './CallSidebar';\nexport * from './CommentContainer';\nexport * from './CommentsContainer';\nexport * from './MessageContainer';\nexport * from './ThreadComplementary';\nexport * from './ThreadSettings';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { CheckCircle, X } from '@phosphor-icons/react';\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\n\nimport { Relation } from '@dxos/echo';\nimport { RefArray } from '@dxos/live-object';\nimport { fullyQualifiedId, getSpace, useMembers } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { Button, Tag, Tooltip, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { createBasicExtensions, createThemeExtensions, listener } from '@dxos/react-ui-editor';\nimport {\n getSize,\n hoverableControlItem,\n hoverableControls,\n hoverableFocusedWithinControls,\n mx,\n} from '@dxos/react-ui-theme';\nimport {\n MessageTextbox,\n type MessageTextboxProps,\n Thread,\n ThreadFooter,\n ThreadHeading,\n type ThreadProps,\n} from '@dxos/react-ui-thread';\nimport { type AnchoredTo } from '@dxos/schema';\nimport { isNonNullable } from '@dxos/util';\n\nimport { MessageContainer } from './MessageContainer';\nimport { command } from './command-extension';\nimport { useStatus } from '../hooks';\nimport { THREAD_PLUGIN } from '../meta';\nimport { type ThreadType } from '../types';\nimport { getMessageMetadata } from '../util';\n\nconst sizeClass = getSize(4);\n\n// TODO(thure): #8149\nconst commentControlClassNames = '!p-1 !min-bs-0 transition-opacity';\n\nconst ToggleResolvedButton = ({\n isResolved,\n onResolve,\n}: {\n isResolved: boolean | undefined;\n onResolve: () => void;\n}) => {\n const { t } = useTranslation(THREAD_PLUGIN);\n const label = t(isResolved ? 'mark as unresolved label' : 'mark as resolved label');\n return (\n <Tooltip.Trigger asChild content={label}>\n <Button\n variant='ghost'\n data-testid='thread.toggle-resolved'\n onClick={onResolve}\n classNames={[commentControlClassNames, !isResolved && hoverableControlItem]}\n >\n <span className='sr-only'>{label}</span>\n {isResolved ? <CheckCircle className={sizeClass} weight='fill' /> : <CheckCircle className={sizeClass} />}\n </Button>\n </Tooltip.Trigger>\n );\n};\n\nconst DeleteThreadButton = ({ onDelete }: { onDelete: () => void }) => {\n const { t } = useTranslation(THREAD_PLUGIN);\n const label = t('delete thread label');\n return (\n <Tooltip.Trigger asChild content={label}>\n <Button\n variant='ghost'\n data-testid='thread.delete'\n onClick={onDelete}\n classNames={[commentControlClassNames, hoverableControlItem]}\n >\n <span className='sr-only'>{label}</span>\n <X className={sizeClass} />\n </Button>\n </Tooltip.Trigger>\n );\n};\n\nexport type CommentContainerProps = {\n anchor: AnchoredTo;\n onAttend?: (anchor: AnchoredTo) => void;\n onComment?: (anchor: AnchoredTo, message: string) => void;\n onResolve?: (anchor: AnchoredTo) => void;\n onMessageDelete?: (anchor: AnchoredTo, messageId: string) => void;\n onThreadDelete?: (anchor: AnchoredTo) => void;\n} & Pick<ThreadProps, 'current'>;\n\nexport const CommentContainer = ({\n anchor,\n current,\n onAttend,\n onComment,\n onResolve,\n onMessageDelete,\n onThreadDelete,\n}: CommentContainerProps) => {\n const identity = useIdentity()!;\n const space = getSpace(anchor);\n const members = useMembers(space?.key);\n const detached = !anchor.anchor;\n const thread = Relation.getSource(anchor) as ThreadType;\n const activity = useStatus(space, fullyQualifiedId(thread));\n const { t } = useTranslation(THREAD_PLUGIN);\n const threadScrollRef = useRef<HTMLDivElement | null>(null);\n const { themeMode } = useThemeContext();\n\n const textboxMetadata = getMessageMetadata(fullyQualifiedId(thread), identity);\n // TODO(wittjosiah): This is a hack to reset the editor after a message is sent.\n const [_count, _setCount] = useState(0);\n const rerenderEditor = () => _setCount((count) => count + 1);\n const messageRef = useRef('');\n const extensions = useMemo(\n () => [\n createBasicExtensions({ placeholder: t('message placeholder') }),\n createThemeExtensions({ themeMode }),\n listener({ onChange: (text) => (messageRef.current = text) }),\n command,\n ],\n [_count],\n );\n\n // TODO(thure): Factor out.\n const scrollToEnd = (behavior: ScrollBehavior) =>\n setTimeout(() => threadScrollRef.current?.scrollIntoView({ behavior, block: 'end' }), 10);\n\n const handleAttend = useCallback(() => onAttend?.(anchor), [onAttend, anchor]);\n const handleResolve = useCallback(() => onResolve?.(anchor), [onResolve, anchor]);\n const handleMessageDelete = useCallback((id: string) => onMessageDelete?.(anchor, id), [onMessageDelete, anchor]);\n const handleThreadDelete = useCallback(() => onThreadDelete?.(anchor), [onThreadDelete, anchor]);\n\n const handleComment: MessageTextboxProps['onSend'] = useCallback(() => {\n if (!messageRef.current) {\n return false;\n }\n\n onComment?.(anchor, messageRef.current);\n messageRef.current = '';\n scrollToEnd('instant');\n rerenderEditor();\n\n return true;\n }, [anchor, identity]);\n\n return (\n <Thread onClickCapture={handleAttend} onFocusCapture={handleAttend} current={current} id={fullyQualifiedId(thread)}>\n <div\n role='none'\n className={mx(\n 'col-span-2 grid grid-cols-[var(--rail-size)_1fr_min-content]',\n hoverableControls,\n hoverableFocusedWithinControls,\n )}\n >\n {detached ? (\n <Tooltip.Trigger asChild content={t('detached thread label')} side='top'>\n <ThreadHeading detached>{thread.name}</ThreadHeading>\n </Tooltip.Trigger>\n ) : (\n <ThreadHeading>{thread.name}</ThreadHeading>\n )}\n <div className='flex flex-row items-center pli-1'>\n {thread.status === 'staged' && <Tag palette='neutral'>{t('draft button')}</Tag>}\n {onResolve && !(thread?.status === 'staged') && (\n <ToggleResolvedButton isResolved={thread?.status === 'resolved'} onResolve={handleResolve} />\n )}\n {onThreadDelete && <DeleteThreadButton onDelete={handleThreadDelete} />}\n </div>\n </div>\n {/** TODO(dmaretskyi): How's `thread.messages` undefined? */}\n {RefArray.targets(thread.messages?.filter(isNonNullable) ?? []).map((message) => (\n <MessageContainer\n key={message.id}\n editable\n message={message}\n members={members}\n onDelete={handleMessageDelete}\n />\n ))}\n {/*\n TODO(wittjosiah): Can't autofocus this generally.\n There can be multiple threads with inputs and they can't all be focused.\n Also, it steals focus from documents when first rendered.\n Need to find a way to autofocus in one scenario only: when a new thread is created.\n */}\n <MessageTextbox extensions={extensions} onSend={handleComment} {...textboxMetadata} />\n <ThreadFooter activity={activity}>{t('activity message')}</ThreadFooter>\n {/* NOTE(thure): This can’t also be the `overflow-anchor` because `ScrollArea` injects an interceding node that contains this necessary ref’d element. */}\n <div role='none' className='bs-px -mbs-px' ref={threadScrollRef} />\n </Thread>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useEffect } from 'react';\n\nimport { Relation } from '@dxos/echo';\nimport { fullyQualifiedId } from '@dxos/react-client/echo';\nimport { Callout, Icon, Trans, useTranslation } from '@dxos/react-ui';\nimport { type AnchoredTo } from '@dxos/schema';\n\nimport { CommentContainer, type CommentContainerProps } from './CommentContainer';\nimport { THREAD_PLUGIN } from '../meta';\nimport { type ThreadType } from '../types';\n\nexport type ThreadsContainerProps = Omit<CommentContainerProps, 'anchor' | 'current'> & {\n anchors: AnchoredTo[];\n currentId?: string;\n showResolvedThreads?: boolean;\n};\n\n/**\n * Comment threads.\n */\nexport const CommentsContainer = ({ anchors, currentId, showResolvedThreads, ...props }: ThreadsContainerProps) => {\n const { t } = useTranslation(THREAD_PLUGIN);\n // TODO(wittjosiah): There seems to be a race between thread and anchor being deleted.\n const filteredAnchors = showResolvedThreads\n ? anchors.filter((anchor) => !!Relation.getSource(anchor))\n : anchors.filter((anchor) => {\n const thread = Relation.getSource(anchor);\n return thread && thread.status !== 'resolved';\n });\n\n useEffect(() => {\n if (currentId) {\n document.getElementById(currentId)?.scrollIntoView({ behavior: 'smooth', block: 'end' });\n }\n }, [currentId]);\n\n if (filteredAnchors.length === 0) {\n return (\n <div role='none' className='plb-cardSpacingBlock pli-cardSpacingInline'>\n <Callout.Root>\n <Callout.Title>\n <Trans\n {...{\n t,\n i18nKey: 'no comments message',\n components: {\n commentIcon: <Icon icon='ph--chat-text--regular' size={4} classNames='inline-block' />,\n },\n }}\n />\n </Callout.Title>\n </Callout.Root>\n </div>\n );\n }\n\n return filteredAnchors.map((anchor) => {\n const thread = Relation.getSource(anchor) as ThreadType;\n const threadId = fullyQualifiedId(thread);\n return <CommentContainer key={threadId} anchor={anchor} current={currentId === threadId} {...props} />;\n });\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\n// import { useTranslation } from '@dxos/react-ui';\nimport { DeprecatedFormContainer } from '@dxos/react-ui-form';\n\n// import { THREAD_PLUGIN } from '../meta';\nimport type { ThreadSettingsProps } from '../types';\n\nexport const ThreadSettings = ({ settings }: { settings: ThreadSettingsProps }) => {\n // const { t } = useTranslation(THREAD_PLUGIN);\n\n return <DeprecatedFormContainer></DeprecatedFormContainer>;\n};\n"],
5
- "mappings": "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",
6
- "names": ["WebRTCStats", "React", "useEffect", "useMemo", "useState", "Panel", "log", "Input", "useTranslation", "Json", "CallDebugPanel", "state", "users", "call", "self", "t", "useTranslation", "THREAD_PLUGIN", "open", "setOpen", "useState", "handleToggle", "showDetailedWebRTCStats", "setShowDetailedWebRTCStats", "handleShowDetailedWebRTCStats", "webrtcStats", "useMemo", "WebRTCStats", "getStatsInterval", "stats", "setStats", "useEffect", "pc", "media", "peer", "session", "peerConnection", "handleStats", "data", "added", "addConnection", "peerId", "connectionId", "on", "removeConnection", "removeListener", "error", "log", "Panel", "id", "icon", "onToggle", "title", "maxHeight", "info", "div", "className", "span", "joined", "length", "undefined", "Input", "Root", "Label", "classNames", "Checkbox", "checked", "onCheckedChange", "Json", "activities", "webrtc", "connectionState", "iceConnectionState", "tracks", "getTransceivers", "map", "transceiver", "track", "direction", "receiver", "sender", "kind", "enabled", "muted", "readyState", "settings", "getSettings", "callsServiceHistory", "history", "get", "React", "useCapability", "CallSidebar", "call", "useCapability", "ThreadCapabilities", "CallManager", "React", "ChannelContainer", "roomId", "React", "useCallback", "useMemo", "Capabilities", "LayoutAction", "createIntent", "useCapability", "useCapabilities", "useIntentDispatcher", "Filter", "Obj", "Query", "Relation", "fullyQualifiedId", "getSpace", "useQuery", "useIdentity", "useThemeContext", "useTranslation", "useAttended", "StackItem", "Tabs", "AnchoredTo", "lazy", "CheckCircle", "X", "React", "useCallback", "useMemo", "useRef", "useState", "Relation", "RefArray", "fullyQualifiedId", "getSpace", "useMembers", "useIdentity", "Button", "Tag", "Tooltip", "useThemeContext", "useTranslation", "createBasicExtensions", "createThemeExtensions", "listener", "getSize", "hoverableControlItem", "hoverableControls", "hoverableFocusedWithinControls", "mx", "MessageTextbox", "Thread", "ThreadFooter", "ThreadHeading", "isNonNullable", "sizeClass", "getSize", "commentControlClassNames", "ToggleResolvedButton", "isResolved", "onResolve", "t", "useTranslation", "THREAD_PLUGIN", "label", "React", "Tooltip", "Trigger", "asChild", "content", "Button", "variant", "data-testid", "onClick", "classNames", "hoverableControlItem", "span", "className", "CheckCircle", "weight", "DeleteThreadButton", "onDelete", "X", "CommentContainer", "anchor", "current", "onAttend", "onComment", "onMessageDelete", "onThreadDelete", "identity", "useIdentity", "space", "getSpace", "members", "useMembers", "key", "detached", "thread", "Relation", "getSource", "activity", "useStatus", "fullyQualifiedId", "threadScrollRef", "useRef", "themeMode", "useThemeContext", "textboxMetadata", "getMessageMetadata", "_count", "_setCount", "useState", "rerenderEditor", "count", "messageRef", "extensions", "useMemo", "createBasicExtensions", "placeholder", "createThemeExtensions", "listener", "onChange", "text", "command", "scrollToEnd", "behavior", "setTimeout", "scrollIntoView", "block", "handleAttend", "useCallback", "handleResolve", "handleMessageDelete", "id", "handleThreadDelete", "handleComment", "Thread", "onClickCapture", "onFocusCapture", "div", "role", "mx", "hoverableControls", "hoverableFocusedWithinControls", "side", "ThreadHeading", "name", "status", "Tag", "palette", "RefArray", "targets", "messages", "filter", "isNonNullable", "map", "message", "MessageContainer", "editable", "MessageTextbox", "onSend", "ThreadFooter", "ref", "React", "useEffect", "Relation", "fullyQualifiedId", "Callout", "Icon", "Trans", "useTranslation", "CommentsContainer", "anchors", "currentId", "showResolvedThreads", "props", "t", "useTranslation", "THREAD_PLUGIN", "filteredAnchors", "filter", "anchor", "Relation", "getSource", "thread", "status", "useEffect", "document", "getElementById", "scrollIntoView", "behavior", "block", "length", "React", "div", "role", "className", "Callout", "Root", "Title", "Trans", "i18nKey", "components", "commentIcon", "Icon", "icon", "size", "classNames", "map", "threadId", "fullyQualifiedId", "CommentContainer", "key", "current", "React", "DeprecatedFormContainer", "ThreadSettings", "settings", "React", "DeprecatedFormContainer", "ChannelContainer", "lazy", "ChatContainer", "ThreadComplementary", "subject", "dispatchPromise", "dispatch", "useIntentDispatcher", "identity", "useIdentity", "t", "useTranslation", "THREAD_PLUGIN", "tx", "useThemeContext", "subjectId", "fullyQualifiedId", "state", "getViewState", "useCapability", "ThreadCapabilities", "MutableState", "drafts", "viewState", "useMemo", "showResolvedThreads", "onChangeViewState", "useCallback", "nextValue", "anchorSorts", "useCapabilities", "Capabilities", "AnchorSort", "sort", "find", "key", "Obj", "getTypename", "space", "getSpace", "objectsAnchoredTo", "useQuery", "Query", "select", "Filter", "ids", "id", "targetOf", "AnchoredTo", "anchors", "toSorted", "a", "b", "filter", "anchor", "instanceOf", "ThreadType", "Relation", "getSource", "concat", "attended", "useAttended", "handleAttend", "thread", "threadId", "current", "createIntent", "LayoutAction", "ScrollIntoView", "part", "options", "cursor", "ref", "handleComment", "text", "ThreadAction", "AddMessage", "sender", "identityDid", "did", "handleResolve", "ToggleResolved", "handleThreadDelete", "Delete", "handleMessageDelete", "messageId", "DeleteMessage", "comments", "React", "CommentsContainer", "currentId", "includes", "undefined", "onAttend", "onComment", "onResolve", "onMessageDelete", "onThreadDelete", "StackItem", "Content", "toolbar", "Tabs", "Root", "value", "orientation", "classNames", "onValueChange", "Tablist", "Tab", "Tabpanel"]
7
- }