@syra.fm/sdk 0.3.0 → 0.5.0

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 (314) hide show
  1. package/lib/commonjs/client.js +268 -0
  2. package/lib/commonjs/client.js.map +1 -0
  3. package/lib/commonjs/errors.js +22 -0
  4. package/lib/commonjs/errors.js.map +1 -0
  5. package/lib/commonjs/index.js +63 -0
  6. package/lib/commonjs/index.js.map +1 -0
  7. package/lib/commonjs/index.native.js +28 -0
  8. package/lib/commonjs/index.native.js.map +1 -0
  9. package/lib/commonjs/live/assets/icons/spaces-icon.js +42 -0
  10. package/lib/commonjs/live/assets/icons/spaces-icon.js.map +1 -0
  11. package/lib/commonjs/live/assets/icons/syra-icon.js +43 -0
  12. package/lib/commonjs/live/assets/icons/syra-icon.js.map +1 -0
  13. package/lib/commonjs/live/components/AnimatedPulse.js +38 -0
  14. package/lib/commonjs/live/components/AnimatedPulse.js.map +1 -0
  15. package/lib/commonjs/live/components/AnimatedSpeakerRing.js +90 -0
  16. package/lib/commonjs/live/components/AnimatedSpeakerRing.js.map +1 -0
  17. package/lib/commonjs/live/components/CreateRoomSheet.js +688 -0
  18. package/lib/commonjs/live/components/CreateRoomSheet.js.map +1 -0
  19. package/lib/commonjs/live/components/InsightsPanel.js +333 -0
  20. package/lib/commonjs/live/components/InsightsPanel.js.map +1 -0
  21. package/lib/commonjs/live/components/LiveRoomSheet.js +1195 -0
  22. package/lib/commonjs/live/components/LiveRoomSheet.js.map +1 -0
  23. package/lib/commonjs/live/components/MiniRoomBar.js +161 -0
  24. package/lib/commonjs/live/components/MiniRoomBar.js.map +1 -0
  25. package/lib/commonjs/live/components/PanelHeader.js +57 -0
  26. package/lib/commonjs/live/components/PanelHeader.js.map +1 -0
  27. package/lib/commonjs/live/components/PodcastStreamPicker.js +1190 -0
  28. package/lib/commonjs/live/components/PodcastStreamPicker.js.map +1 -0
  29. package/lib/commonjs/live/components/RecordingCard.js +192 -0
  30. package/lib/commonjs/live/components/RecordingCard.js.map +1 -0
  31. package/lib/commonjs/live/components/RecordingsPanel.js +304 -0
  32. package/lib/commonjs/live/components/RecordingsPanel.js.map +1 -0
  33. package/lib/commonjs/live/components/RoomCard.js +553 -0
  34. package/lib/commonjs/live/components/RoomCard.js.map +1 -0
  35. package/lib/commonjs/live/components/StreamConfigModal.js +656 -0
  36. package/lib/commonjs/live/components/StreamConfigModal.js.map +1 -0
  37. package/lib/commonjs/live/components/StreamConfigPanel.js +822 -0
  38. package/lib/commonjs/live/components/StreamConfigPanel.js.map +1 -0
  39. package/lib/commonjs/live/context/LiveConfigContext.js +46 -0
  40. package/lib/commonjs/live/context/LiveConfigContext.js.map +1 -0
  41. package/lib/commonjs/live/context/LiveRoomContext.js +195 -0
  42. package/lib/commonjs/live/context/LiveRoomContext.js.map +1 -0
  43. package/lib/commonjs/live/hooks/useActiveSpeakers.js +35 -0
  44. package/lib/commonjs/live/hooks/useActiveSpeakers.js.map +1 -0
  45. package/lib/commonjs/live/hooks/useRoomAudio.js +129 -0
  46. package/lib/commonjs/live/hooks/useRoomAudio.js.map +1 -0
  47. package/lib/commonjs/live/hooks/useRoomConnection.js +177 -0
  48. package/lib/commonjs/live/hooks/useRoomConnection.js.map +1 -0
  49. package/lib/commonjs/live/hooks/useRoomManager.js +37 -0
  50. package/lib/commonjs/live/hooks/useRoomManager.js.map +1 -0
  51. package/lib/commonjs/live/hooks/useRoomUsers.js +52 -0
  52. package/lib/commonjs/live/hooks/useRoomUsers.js.map +1 -0
  53. package/lib/commonjs/live/index.js +310 -0
  54. package/lib/commonjs/live/index.js.map +1 -0
  55. package/lib/commonjs/live/services/livekitService.js +20 -0
  56. package/lib/commonjs/live/services/livekitService.js.map +1 -0
  57. package/lib/commonjs/live/services/spaceSocketService.js +181 -0
  58. package/lib/commonjs/live/services/spaceSocketService.js.map +1 -0
  59. package/lib/commonjs/live/services/spacesService.js +642 -0
  60. package/lib/commonjs/live/services/spacesService.js.map +1 -0
  61. package/lib/commonjs/live/types.js +6 -0
  62. package/lib/commonjs/live/types.js.map +1 -0
  63. package/lib/commonjs/live/validation.js +238 -0
  64. package/lib/commonjs/live/validation.js.map +1 -0
  65. package/lib/commonjs/package.json +1 -0
  66. package/lib/commonjs/schema.js +102 -0
  67. package/lib/commonjs/schema.js.map +1 -0
  68. package/lib/module/client.js +264 -0
  69. package/lib/module/client.js.map +1 -0
  70. package/lib/module/errors.js +17 -0
  71. package/lib/module/errors.js.map +1 -0
  72. package/lib/module/index.js +6 -0
  73. package/lib/module/index.js.map +1 -0
  74. package/lib/module/index.native.js +5 -0
  75. package/lib/module/index.native.js.map +1 -0
  76. package/lib/module/live/assets/icons/spaces-icon.js +34 -0
  77. package/lib/module/live/assets/icons/spaces-icon.js.map +1 -0
  78. package/lib/module/live/assets/icons/syra-icon.js +36 -0
  79. package/lib/module/live/assets/icons/syra-icon.js.map +1 -0
  80. package/lib/module/live/components/AnimatedPulse.js +33 -0
  81. package/lib/module/live/components/AnimatedPulse.js.map +1 -0
  82. package/lib/module/live/components/AnimatedSpeakerRing.js +85 -0
  83. package/lib/module/live/components/AnimatedSpeakerRing.js.map +1 -0
  84. package/lib/module/live/components/CreateRoomSheet.js +682 -0
  85. package/lib/module/live/components/CreateRoomSheet.js.map +1 -0
  86. package/lib/module/live/components/InsightsPanel.js +327 -0
  87. package/lib/module/live/components/InsightsPanel.js.map +1 -0
  88. package/lib/module/live/components/LiveRoomSheet.js +1189 -0
  89. package/lib/module/live/components/LiveRoomSheet.js.map +1 -0
  90. package/lib/module/live/components/MiniRoomBar.js +154 -0
  91. package/lib/module/live/components/MiniRoomBar.js.map +1 -0
  92. package/lib/module/live/components/PanelHeader.js +52 -0
  93. package/lib/module/live/components/PanelHeader.js.map +1 -0
  94. package/lib/module/live/components/PodcastStreamPicker.js +1183 -0
  95. package/lib/module/live/components/PodcastStreamPicker.js.map +1 -0
  96. package/lib/module/live/components/RecordingCard.js +187 -0
  97. package/lib/module/live/components/RecordingCard.js.map +1 -0
  98. package/lib/module/live/components/RecordingsPanel.js +298 -0
  99. package/lib/module/live/components/RecordingsPanel.js.map +1 -0
  100. package/lib/module/live/components/RoomCard.js +548 -0
  101. package/lib/module/live/components/RoomCard.js.map +1 -0
  102. package/lib/module/live/components/StreamConfigModal.js +650 -0
  103. package/lib/module/live/components/StreamConfigModal.js.map +1 -0
  104. package/lib/module/live/components/StreamConfigPanel.js +816 -0
  105. package/lib/module/live/components/StreamConfigPanel.js.map +1 -0
  106. package/lib/module/live/context/LiveConfigContext.js +40 -0
  107. package/lib/module/live/context/LiveConfigContext.js.map +1 -0
  108. package/lib/module/live/context/LiveRoomContext.js +189 -0
  109. package/lib/module/live/context/LiveRoomContext.js.map +1 -0
  110. package/lib/module/live/hooks/useActiveSpeakers.js +31 -0
  111. package/lib/module/live/hooks/useActiveSpeakers.js.map +1 -0
  112. package/lib/module/live/hooks/useRoomAudio.js +125 -0
  113. package/lib/module/live/hooks/useRoomAudio.js.map +1 -0
  114. package/lib/module/live/hooks/useRoomConnection.js +173 -0
  115. package/lib/module/live/hooks/useRoomConnection.js.map +1 -0
  116. package/lib/module/live/hooks/useRoomManager.js +32 -0
  117. package/lib/module/live/hooks/useRoomManager.js.map +1 -0
  118. package/lib/module/live/hooks/useRoomUsers.js +46 -0
  119. package/lib/module/live/hooks/useRoomUsers.js.map +1 -0
  120. package/lib/module/live/index.js +38 -0
  121. package/lib/module/live/index.js.map +1 -0
  122. package/lib/module/live/services/livekitService.js +16 -0
  123. package/lib/module/live/services/livekitService.js.map +1 -0
  124. package/lib/module/live/services/spaceSocketService.js +176 -0
  125. package/lib/module/live/services/spaceSocketService.js.map +1 -0
  126. package/lib/module/live/services/spacesService.js +639 -0
  127. package/lib/module/live/services/spacesService.js.map +1 -0
  128. package/lib/module/live/types.js +4 -0
  129. package/lib/module/live/types.js.map +1 -0
  130. package/lib/module/live/validation.js +229 -0
  131. package/lib/module/live/validation.js.map +1 -0
  132. package/lib/module/package.json +1 -0
  133. package/lib/module/schema.js +99 -0
  134. package/lib/module/schema.js.map +1 -0
  135. package/{dist/types → lib/typescript/commonjs}/client.d.ts +36 -1
  136. package/lib/typescript/commonjs/client.d.ts.map +1 -0
  137. package/{dist/types → lib/typescript/commonjs}/errors.d.ts +1 -0
  138. package/lib/typescript/commonjs/errors.d.ts.map +1 -0
  139. package/lib/typescript/commonjs/index.d.ts +6 -0
  140. package/lib/typescript/commonjs/index.d.ts.map +1 -0
  141. package/lib/typescript/commonjs/index.native.d.ts +3 -0
  142. package/lib/typescript/commonjs/index.native.d.ts.map +1 -0
  143. package/lib/typescript/commonjs/live/assets/icons/spaces-icon.d.ts +13 -0
  144. package/lib/typescript/commonjs/live/assets/icons/spaces-icon.d.ts.map +1 -0
  145. package/lib/typescript/commonjs/live/assets/icons/syra-icon.d.ts +13 -0
  146. package/lib/typescript/commonjs/live/assets/icons/syra-icon.d.ts.map +1 -0
  147. package/lib/typescript/commonjs/live/components/AnimatedPulse.d.ts +8 -0
  148. package/lib/typescript/commonjs/live/components/AnimatedPulse.d.ts.map +1 -0
  149. package/lib/typescript/commonjs/live/components/AnimatedSpeakerRing.d.ts +10 -0
  150. package/lib/typescript/commonjs/live/components/AnimatedSpeakerRing.d.ts.map +1 -0
  151. package/lib/typescript/commonjs/live/components/CreateRoomSheet.d.ts +26 -0
  152. package/lib/typescript/commonjs/live/components/CreateRoomSheet.d.ts.map +1 -0
  153. package/lib/typescript/commonjs/live/components/InsightsPanel.d.ts +11 -0
  154. package/lib/typescript/commonjs/live/components/InsightsPanel.d.ts.map +1 -0
  155. package/lib/typescript/commonjs/live/components/LiveRoomSheet.d.ts +11 -0
  156. package/lib/typescript/commonjs/live/components/LiveRoomSheet.d.ts.map +1 -0
  157. package/lib/typescript/commonjs/live/components/MiniRoomBar.d.ts +15 -0
  158. package/lib/typescript/commonjs/live/components/MiniRoomBar.d.ts.map +1 -0
  159. package/lib/typescript/commonjs/live/components/PanelHeader.d.ts +10 -0
  160. package/lib/typescript/commonjs/live/components/PanelHeader.d.ts.map +1 -0
  161. package/lib/typescript/commonjs/live/components/PodcastStreamPicker.d.ts +54 -0
  162. package/lib/typescript/commonjs/live/components/PodcastStreamPicker.d.ts.map +1 -0
  163. package/lib/typescript/commonjs/live/components/RecordingCard.d.ts +11 -0
  164. package/lib/typescript/commonjs/live/components/RecordingCard.d.ts.map +1 -0
  165. package/lib/typescript/commonjs/live/components/RecordingsPanel.d.ts +12 -0
  166. package/lib/typescript/commonjs/live/components/RecordingsPanel.d.ts.map +1 -0
  167. package/lib/typescript/commonjs/live/components/RoomCard.d.ts +38 -0
  168. package/lib/typescript/commonjs/live/components/RoomCard.d.ts.map +1 -0
  169. package/lib/typescript/commonjs/live/components/StreamConfigModal.d.ts +11 -0
  170. package/lib/typescript/commonjs/live/components/StreamConfigModal.d.ts.map +1 -0
  171. package/lib/typescript/commonjs/live/components/StreamConfigPanel.d.ts +13 -0
  172. package/lib/typescript/commonjs/live/components/StreamConfigPanel.d.ts.map +1 -0
  173. package/lib/typescript/commonjs/live/context/LiveConfigContext.d.ts +78 -0
  174. package/lib/typescript/commonjs/live/context/LiveConfigContext.d.ts.map +1 -0
  175. package/lib/typescript/commonjs/live/context/LiveRoomContext.d.ts +12 -0
  176. package/lib/typescript/commonjs/live/context/LiveRoomContext.d.ts.map +1 -0
  177. package/lib/typescript/commonjs/live/hooks/useActiveSpeakers.d.ts +3 -0
  178. package/lib/typescript/commonjs/live/hooks/useActiveSpeakers.d.ts.map +1 -0
  179. package/lib/typescript/commonjs/live/hooks/useRoomAudio.d.ts +16 -0
  180. package/lib/typescript/commonjs/live/hooks/useRoomAudio.d.ts.map +1 -0
  181. package/lib/typescript/commonjs/live/hooks/useRoomConnection.d.ts +29 -0
  182. package/lib/typescript/commonjs/live/hooks/useRoomConnection.d.ts.map +1 -0
  183. package/lib/typescript/commonjs/live/hooks/useRoomManager.d.ts +11 -0
  184. package/lib/typescript/commonjs/live/hooks/useRoomManager.d.ts.map +1 -0
  185. package/lib/typescript/commonjs/live/hooks/useRoomUsers.d.ts +5 -0
  186. package/lib/typescript/commonjs/live/hooks/useRoomUsers.d.ts.map +1 -0
  187. package/lib/typescript/commonjs/live/index.d.ts +24 -0
  188. package/lib/typescript/commonjs/live/index.d.ts.map +1 -0
  189. package/lib/typescript/commonjs/live/services/livekitService.d.ts +7 -0
  190. package/lib/typescript/commonjs/live/services/livekitService.d.ts.map +1 -0
  191. package/lib/typescript/commonjs/live/services/spaceSocketService.d.ts +69 -0
  192. package/lib/typescript/commonjs/live/services/spaceSocketService.d.ts.map +1 -0
  193. package/lib/typescript/commonjs/live/services/spacesService.d.ts +181 -0
  194. package/lib/typescript/commonjs/live/services/spacesService.d.ts.map +1 -0
  195. package/lib/typescript/commonjs/live/types.d.ts +100 -0
  196. package/lib/typescript/commonjs/live/types.d.ts.map +1 -0
  197. package/lib/typescript/commonjs/live/validation.d.ts +658 -0
  198. package/lib/typescript/commonjs/live/validation.d.ts.map +1 -0
  199. package/lib/typescript/commonjs/package.json +1 -0
  200. package/{dist/types → lib/typescript/commonjs}/schema.d.ts +305 -0
  201. package/lib/typescript/commonjs/schema.d.ts.map +1 -0
  202. package/lib/typescript/module/client.d.ts +141 -0
  203. package/lib/typescript/module/client.d.ts.map +1 -0
  204. package/lib/typescript/module/errors.d.ts +9 -0
  205. package/lib/typescript/module/errors.d.ts.map +1 -0
  206. package/lib/typescript/module/index.d.ts +6 -0
  207. package/lib/typescript/module/index.d.ts.map +1 -0
  208. package/lib/typescript/module/index.native.d.ts +3 -0
  209. package/lib/typescript/module/index.native.d.ts.map +1 -0
  210. package/lib/typescript/module/live/assets/icons/spaces-icon.d.ts +13 -0
  211. package/lib/typescript/module/live/assets/icons/spaces-icon.d.ts.map +1 -0
  212. package/lib/typescript/module/live/assets/icons/syra-icon.d.ts +13 -0
  213. package/lib/typescript/module/live/assets/icons/syra-icon.d.ts.map +1 -0
  214. package/lib/typescript/module/live/components/AnimatedPulse.d.ts +8 -0
  215. package/lib/typescript/module/live/components/AnimatedPulse.d.ts.map +1 -0
  216. package/lib/typescript/module/live/components/AnimatedSpeakerRing.d.ts +10 -0
  217. package/lib/typescript/module/live/components/AnimatedSpeakerRing.d.ts.map +1 -0
  218. package/lib/typescript/module/live/components/CreateRoomSheet.d.ts +26 -0
  219. package/lib/typescript/module/live/components/CreateRoomSheet.d.ts.map +1 -0
  220. package/lib/typescript/module/live/components/InsightsPanel.d.ts +11 -0
  221. package/lib/typescript/module/live/components/InsightsPanel.d.ts.map +1 -0
  222. package/lib/typescript/module/live/components/LiveRoomSheet.d.ts +11 -0
  223. package/lib/typescript/module/live/components/LiveRoomSheet.d.ts.map +1 -0
  224. package/lib/typescript/module/live/components/MiniRoomBar.d.ts +15 -0
  225. package/lib/typescript/module/live/components/MiniRoomBar.d.ts.map +1 -0
  226. package/lib/typescript/module/live/components/PanelHeader.d.ts +10 -0
  227. package/lib/typescript/module/live/components/PanelHeader.d.ts.map +1 -0
  228. package/lib/typescript/module/live/components/PodcastStreamPicker.d.ts +54 -0
  229. package/lib/typescript/module/live/components/PodcastStreamPicker.d.ts.map +1 -0
  230. package/lib/typescript/module/live/components/RecordingCard.d.ts +11 -0
  231. package/lib/typescript/module/live/components/RecordingCard.d.ts.map +1 -0
  232. package/lib/typescript/module/live/components/RecordingsPanel.d.ts +12 -0
  233. package/lib/typescript/module/live/components/RecordingsPanel.d.ts.map +1 -0
  234. package/lib/typescript/module/live/components/RoomCard.d.ts +38 -0
  235. package/lib/typescript/module/live/components/RoomCard.d.ts.map +1 -0
  236. package/lib/typescript/module/live/components/StreamConfigModal.d.ts +11 -0
  237. package/lib/typescript/module/live/components/StreamConfigModal.d.ts.map +1 -0
  238. package/lib/typescript/module/live/components/StreamConfigPanel.d.ts +13 -0
  239. package/lib/typescript/module/live/components/StreamConfigPanel.d.ts.map +1 -0
  240. package/lib/typescript/module/live/context/LiveConfigContext.d.ts +78 -0
  241. package/lib/typescript/module/live/context/LiveConfigContext.d.ts.map +1 -0
  242. package/lib/typescript/module/live/context/LiveRoomContext.d.ts +12 -0
  243. package/lib/typescript/module/live/context/LiveRoomContext.d.ts.map +1 -0
  244. package/lib/typescript/module/live/hooks/useActiveSpeakers.d.ts +3 -0
  245. package/lib/typescript/module/live/hooks/useActiveSpeakers.d.ts.map +1 -0
  246. package/lib/typescript/module/live/hooks/useRoomAudio.d.ts +16 -0
  247. package/lib/typescript/module/live/hooks/useRoomAudio.d.ts.map +1 -0
  248. package/lib/typescript/module/live/hooks/useRoomConnection.d.ts +29 -0
  249. package/lib/typescript/module/live/hooks/useRoomConnection.d.ts.map +1 -0
  250. package/lib/typescript/module/live/hooks/useRoomManager.d.ts +11 -0
  251. package/lib/typescript/module/live/hooks/useRoomManager.d.ts.map +1 -0
  252. package/lib/typescript/module/live/hooks/useRoomUsers.d.ts +5 -0
  253. package/lib/typescript/module/live/hooks/useRoomUsers.d.ts.map +1 -0
  254. package/lib/typescript/module/live/index.d.ts +24 -0
  255. package/lib/typescript/module/live/index.d.ts.map +1 -0
  256. package/lib/typescript/module/live/services/livekitService.d.ts +7 -0
  257. package/lib/typescript/module/live/services/livekitService.d.ts.map +1 -0
  258. package/lib/typescript/module/live/services/spaceSocketService.d.ts +69 -0
  259. package/lib/typescript/module/live/services/spaceSocketService.d.ts.map +1 -0
  260. package/lib/typescript/module/live/services/spacesService.d.ts +181 -0
  261. package/lib/typescript/module/live/services/spacesService.d.ts.map +1 -0
  262. package/lib/typescript/module/live/types.d.ts +100 -0
  263. package/lib/typescript/module/live/types.d.ts.map +1 -0
  264. package/lib/typescript/module/live/validation.d.ts +658 -0
  265. package/lib/typescript/module/live/validation.d.ts.map +1 -0
  266. package/lib/typescript/module/package.json +1 -0
  267. package/lib/typescript/module/schema.d.ts +1072 -0
  268. package/lib/typescript/module/schema.d.ts.map +1 -0
  269. package/package.json +133 -21
  270. package/src/client.test.ts +185 -0
  271. package/src/client.ts +125 -0
  272. package/src/index.native.ts +2 -0
  273. package/src/index.ts +4 -0
  274. package/src/live/assets/icons/spaces-icon.tsx +15 -0
  275. package/src/live/assets/icons/syra-icon.tsx +13 -0
  276. package/src/live/assets/sounds/intro.mp3 +0 -0
  277. package/src/live/components/AnimatedPulse.tsx +52 -0
  278. package/src/live/components/AnimatedSpeakerRing.tsx +101 -0
  279. package/src/live/components/CreateRoomSheet.tsx +654 -0
  280. package/src/live/components/InsightsPanel.tsx +202 -0
  281. package/src/live/components/LiveRoomSheet.tsx +969 -0
  282. package/src/live/components/MiniRoomBar.tsx +166 -0
  283. package/src/live/components/PanelHeader.tsx +36 -0
  284. package/src/live/components/PodcastStreamPicker.tsx +1155 -0
  285. package/src/live/components/RecordingCard.tsx +154 -0
  286. package/src/live/components/RecordingsPanel.tsx +251 -0
  287. package/src/live/components/RoomCard.tsx +494 -0
  288. package/src/live/components/StreamConfigModal.tsx +600 -0
  289. package/src/live/components/StreamConfigPanel.tsx +729 -0
  290. package/src/live/context/LiveConfigContext.tsx +96 -0
  291. package/src/live/context/LiveRoomContext.tsx +235 -0
  292. package/src/live/hooks/useActiveSpeakers.ts +39 -0
  293. package/src/live/hooks/useRoomAudio.ts +103 -0
  294. package/src/live/hooks/useRoomConnection.ts +162 -0
  295. package/src/live/hooks/useRoomManager.ts +17 -0
  296. package/src/live/hooks/useRoomUsers.ts +52 -0
  297. package/src/live/index.ts +92 -0
  298. package/src/live/services/livekitService.ts +11 -0
  299. package/src/live/services/spaceSocketService.ts +136 -0
  300. package/src/live/services/spacesService.ts +692 -0
  301. package/src/live/types.ts +119 -0
  302. package/src/live/validation.ts +279 -0
  303. package/src/schema.ts +34 -0
  304. package/dist/cjs/client.js +0 -185
  305. package/dist/cjs/errors.js +0 -16
  306. package/dist/cjs/index.js +0 -14
  307. package/dist/cjs/package.json +0 -3
  308. package/dist/cjs/schema.js +0 -62
  309. package/dist/esm/client.js +0 -181
  310. package/dist/esm/errors.js +0 -12
  311. package/dist/esm/index.js +0 -3
  312. package/dist/esm/package.json +0 -3
  313. package/dist/esm/schema.js +0 -59
  314. package/dist/types/index.d.ts +0 -5
@@ -0,0 +1,1195 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.LiveRoomSheet = LiveRoomSheet;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _reactNative = require("react-native");
9
+ var _MaterialCommunityIcons = _interopRequireDefault(require("@expo/vector-icons/MaterialCommunityIcons"));
10
+ var _services = require("@oxyhq/services");
11
+ var _LiveConfigContext = require("../context/LiveConfigContext.js");
12
+ var _MiniRoomBar = require("./MiniRoomBar.js");
13
+ var _StreamConfigPanel = require("./StreamConfigPanel.js");
14
+ var _InsightsPanel = require("./InsightsPanel.js");
15
+ var _PanelHeader = require("./PanelHeader.js");
16
+ var _AnimatedSpeakerRing = require("./AnimatedSpeakerRing.js");
17
+ var _AnimatedPulse = require("./AnimatedPulse.js");
18
+ var _useRoomConnection = require("../hooks/useRoomConnection.js");
19
+ var _useRoomAudio = require("../hooks/useRoomAudio.js");
20
+ var _useActiveSpeakers = require("../hooks/useActiveSpeakers.js");
21
+ var _useRoomUsers = require("../hooks/useRoomUsers.js");
22
+ var _jsxRuntime = require("react/jsx-runtime");
23
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
24
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
25
+ /**
26
+ * English source copy for the podcast host-control strings added to the stream
27
+ * card. Hosts with an i18n layer inject `t`; hosts without one fall back here.
28
+ * Keys mirror the `agora.podcastStream.*` entries in the app locale files.
29
+ */
30
+ const LIVE_ROOM_STRINGS = {
31
+ 'agora.podcastStream.skipNext': 'Skip to next episode',
32
+ 'agora.podcastStream.skipped': 'Skipped to the next episode',
33
+ 'agora.podcastStream.queueEnded': 'Podcast queue finished',
34
+ 'agora.podcastStream.skipFailed': "Couldn't skip to the next episode"
35
+ };
36
+
37
+ /** Format a second count as `m:ss` (or `h:mm:ss` when hours are relevant). */
38
+ function formatClock(totalSeconds, withHours) {
39
+ const s = Math.max(0, Math.floor(totalSeconds));
40
+ const hours = Math.floor(s / 3600);
41
+ const minutes = Math.floor(s % 3600 / 60);
42
+ const secs = s % 60;
43
+ const pad = n => String(n).padStart(2, '0');
44
+ return withHours ? `${hours}:${pad(minutes)}:${pad(secs)}` : `${minutes}:${pad(secs)}`;
45
+ }
46
+ const RoleBadge = ({
47
+ role,
48
+ theme
49
+ }) => {
50
+ if (role === 'host') {
51
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
52
+ style: [styles.roleBadge, {
53
+ backgroundColor: theme.colors.primary
54
+ }],
55
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
56
+ style: styles.roleBadgeText,
57
+ children: "Host"
58
+ })
59
+ });
60
+ }
61
+ if (role === 'speaker') {
62
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
63
+ style: [styles.roleBadge, {
64
+ backgroundColor: theme.colors.backgroundSecondary
65
+ }],
66
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
67
+ style: [styles.roleBadgeText, {
68
+ color: theme.colors.text
69
+ }],
70
+ children: "Speaker"
71
+ })
72
+ });
73
+ }
74
+ return null;
75
+ };
76
+ const SpeakerTile = ({
77
+ participant,
78
+ isCurrentUser,
79
+ isSpeaking,
80
+ theme,
81
+ userProfile,
82
+ oxyServices,
83
+ AvatarComponent,
84
+ getCachedFileDownloadUrlSync
85
+ }) => {
86
+ const displayName = (0, _useRoomUsers.getDisplayName)(userProfile, participant.userId, isCurrentUser);
87
+ const avatarUri = (0, _useRoomUsers.getAvatarUrl)(userProfile, oxyServices, getCachedFileDownloadUrlSync);
88
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
89
+ style: styles.speakerTile,
90
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_AnimatedSpeakerRing.AnimatedSpeakerRing, {
91
+ isSpeaking: isSpeaking,
92
+ isMuted: participant.isMuted,
93
+ primaryColor: theme.colors.primary,
94
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(AvatarComponent, {
95
+ size: 64,
96
+ source: avatarUri,
97
+ shape: "squircle"
98
+ }), participant.isMuted && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
99
+ style: [styles.muteIndicator, {
100
+ backgroundColor: '#FF4458'
101
+ }],
102
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_MaterialCommunityIcons.default, {
103
+ name: "microphone-off",
104
+ size: 12,
105
+ color: "#FFFFFF"
106
+ })
107
+ })]
108
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
109
+ style: [styles.speakerName, {
110
+ color: theme.colors.text
111
+ }],
112
+ numberOfLines: 1,
113
+ children: displayName
114
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(RoleBadge, {
115
+ role: participant.role,
116
+ theme: theme
117
+ })]
118
+ });
119
+ };
120
+ const ListenerAvatar = ({
121
+ participant,
122
+ userProfile,
123
+ oxyServices,
124
+ AvatarComponent,
125
+ getCachedFileDownloadUrlSync
126
+ }) => {
127
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
128
+ style: styles.listenerItem,
129
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(AvatarComponent, {
130
+ size: 40,
131
+ source: (0, _useRoomUsers.getAvatarUrl)(userProfile, oxyServices, getCachedFileDownloadUrlSync),
132
+ shape: "squircle"
133
+ })
134
+ });
135
+ };
136
+ const ConnectedSpeakerTile = ({
137
+ participant,
138
+ isCurrentUser,
139
+ isSpeaking,
140
+ theme,
141
+ oxyServices,
142
+ AvatarComponent,
143
+ getCachedFileDownloadUrlSync,
144
+ useUserById
145
+ }) => {
146
+ const userProfile = useUserById(participant.userId);
147
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(SpeakerTile, {
148
+ participant: participant,
149
+ isCurrentUser: isCurrentUser,
150
+ isSpeaking: isSpeaking,
151
+ theme: theme,
152
+ userProfile: userProfile,
153
+ oxyServices: oxyServices,
154
+ AvatarComponent: AvatarComponent,
155
+ getCachedFileDownloadUrlSync: getCachedFileDownloadUrlSync
156
+ });
157
+ };
158
+ const ConnectedListenerAvatar = ({
159
+ participant,
160
+ oxyServices,
161
+ AvatarComponent,
162
+ getCachedFileDownloadUrlSync,
163
+ useUserById
164
+ }) => {
165
+ const userProfile = useUserById(participant.userId);
166
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(ListenerAvatar, {
167
+ participant: participant,
168
+ userProfile: userProfile,
169
+ oxyServices: oxyServices,
170
+ AvatarComponent: AvatarComponent,
171
+ getCachedFileDownloadUrlSync: getCachedFileDownloadUrlSync
172
+ });
173
+ };
174
+ const ConnectedRequestRow = ({
175
+ request,
176
+ theme,
177
+ oxyServices,
178
+ onApprove,
179
+ onDeny,
180
+ AvatarComponent,
181
+ getCachedFileDownloadUrlSync,
182
+ useUserById
183
+ }) => {
184
+ const userProfile = useUserById(request.userId);
185
+ const displayName = (0, _useRoomUsers.getDisplayName)(userProfile, request.userId, false);
186
+ const avatarUri = (0, _useRoomUsers.getAvatarUrl)(userProfile, oxyServices, getCachedFileDownloadUrlSync);
187
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
188
+ style: [styles.requestRow, {
189
+ backgroundColor: `${theme.colors.card}80`,
190
+ borderColor: theme.colors.border
191
+ }],
192
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(AvatarComponent, {
193
+ size: 36,
194
+ source: avatarUri,
195
+ shape: "squircle"
196
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
197
+ style: [styles.requestName, {
198
+ color: theme.colors.text
199
+ }],
200
+ numberOfLines: 1,
201
+ children: displayName
202
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
203
+ onPress: () => onApprove(request.userId),
204
+ style: [styles.approveBtn, {
205
+ backgroundColor: theme.colors.primary
206
+ }],
207
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_MaterialCommunityIcons.default, {
208
+ name: "check",
209
+ size: 18,
210
+ color: "#FFFFFF"
211
+ })
212
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
213
+ onPress: () => onDeny(request.userId),
214
+ style: [styles.denyBtn, {
215
+ backgroundColor: theme.colors.backgroundSecondary
216
+ }],
217
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_MaterialCommunityIcons.default, {
218
+ name: "close",
219
+ size: 18,
220
+ color: theme.colors.text
221
+ })
222
+ })]
223
+ });
224
+ };
225
+ function LiveRoomSheet({
226
+ roomId,
227
+ isExpanded,
228
+ onCollapse,
229
+ onExpand,
230
+ onLeave
231
+ }) {
232
+ const {
233
+ useTheme,
234
+ useUserById,
235
+ AvatarComponent,
236
+ roomsService,
237
+ toast,
238
+ getCachedFileDownloadUrl,
239
+ getCachedFileDownloadUrlSync,
240
+ onRoomChanged,
241
+ t
242
+ } = (0, _LiveConfigContext.useLiveConfig)();
243
+ const theme = useTheme();
244
+ const {
245
+ user,
246
+ oxyServices
247
+ } = (0, _services.useAuth)();
248
+ const [room, setRoom] = (0, _react.useState)(null);
249
+ const tr = (0, _react.useCallback)(key => t ? t(key) : LIVE_ROOM_STRINGS[key] ?? key, [t]);
250
+ (0, _react.useEffect)(() => {
251
+ if (roomId) {
252
+ roomsService.getRoom(roomId).then(setRoom);
253
+ }
254
+ }, [roomId]);
255
+ const {
256
+ isConnected,
257
+ participants,
258
+ myRole,
259
+ isMuted,
260
+ speakerRequests,
261
+ activeStream,
262
+ isRecording,
263
+ join,
264
+ leave,
265
+ toggleMute,
266
+ requestToSpeak,
267
+ approveSpeaker,
268
+ denySpeaker,
269
+ isRoomEnded
270
+ } = (0, _useRoomConnection.useRoomConnection)({
271
+ roomId,
272
+ enabled: !!roomId
273
+ });
274
+ const isRoomLive = room?.status === 'live';
275
+ const {
276
+ isLiveKitConnected,
277
+ micPermissionDenied,
278
+ livekitRoom
279
+ } = (0, _useRoomAudio.useRoomAudio)({
280
+ roomId,
281
+ isSpeaker: myRole === 'speaker' || myRole === 'host',
282
+ isMuted,
283
+ isConnected: isConnected && isRoomLive
284
+ });
285
+ const activeSpeakerIds = (0, _useActiveSpeakers.useActiveSpeakers)(livekitRoom);
286
+ (0, _react.useEffect)(() => {
287
+ if (isConnected && roomId) {
288
+ join();
289
+ }
290
+ }, [isConnected, roomId, join]);
291
+ (0, _react.useEffect)(() => {
292
+ if (isRoomEnded) {
293
+ toast('Room ended');
294
+ leave();
295
+ onLeave();
296
+ }
297
+ }, [isRoomEnded]);
298
+ const handleLeave = () => {
299
+ leave();
300
+ onLeave();
301
+ };
302
+ const handleStopRoom = async () => {
303
+ if (!roomId) return;
304
+ const success = await roomsService.stopRoom(roomId);
305
+ if (success) {
306
+ onRoomChanged?.(roomId);
307
+ leave();
308
+ onLeave();
309
+ } else {
310
+ toast.error('Failed to stop session');
311
+ }
312
+ };
313
+ const handleDeleteRoom = async () => {
314
+ if (!roomId) return;
315
+ const success = await roomsService.deleteRoom(roomId);
316
+ if (success) {
317
+ onRoomChanged?.(roomId);
318
+ leave();
319
+ onLeave();
320
+ toast.success('Room deleted');
321
+ } else {
322
+ toast.error('Failed to delete room');
323
+ }
324
+ };
325
+ const [startingRoom, setStartingRoom] = (0, _react.useState)(false);
326
+ const handleStartRoom = async () => {
327
+ if (!roomId || startingRoom) return;
328
+ setStartingRoom(true);
329
+ try {
330
+ const success = await roomsService.startRoom(roomId);
331
+ if (success) {
332
+ const updated = await roomsService.getRoom(roomId);
333
+ if (updated) setRoom(updated);
334
+ onRoomChanged?.(roomId);
335
+ toast.success('Room is now live!');
336
+ } else {
337
+ toast.error('Failed to start room');
338
+ }
339
+ } catch {
340
+ toast.error('Failed to start room');
341
+ } finally {
342
+ setStartingRoom(false);
343
+ }
344
+ };
345
+ const handleStartRecording = async () => {
346
+ if (!roomId) return;
347
+ const success = await roomsService.startRecording(roomId);
348
+ if (success) {
349
+ toast.success('Recording started');
350
+ } else {
351
+ toast.error('Failed to start recording');
352
+ }
353
+ };
354
+ const handleStopRecording = async () => {
355
+ if (!roomId) return;
356
+ const success = await roomsService.stopRecording(roomId);
357
+ if (success) {
358
+ toast.success('Recording saved');
359
+ } else {
360
+ toast.error('Failed to stop recording');
361
+ }
362
+ };
363
+ const [activePanel, setActivePanel] = (0, _react.useState)(null);
364
+ const [streamLoading, setStreamLoading] = (0, _react.useState)(false);
365
+ const effectiveStream = activeStream ?? (room?.streamTitle || room?.activeStreamUrl ? {
366
+ title: room.streamTitle ?? undefined,
367
+ image: room.streamImage ?? undefined,
368
+ description: room.streamDescription ?? undefined,
369
+ startedAt: room.streamStartedAt ?? undefined,
370
+ durationSec: room.streamDurationSec ?? undefined
371
+ } : null);
372
+ const [streamImageUrl, setStreamImageUrl] = (0, _react.useState)(null);
373
+ (0, _react.useEffect)(() => {
374
+ if (effectiveStream?.image) {
375
+ getCachedFileDownloadUrl(oxyServices, effectiveStream.image).then(setStreamImageUrl);
376
+ } else {
377
+ setStreamImageUrl(null);
378
+ }
379
+ }, [effectiveStream?.image, oxyServices]);
380
+
381
+ // Stream progress — only for length-known streams (e.g. podcast episodes).
382
+ const streamStartedAt = effectiveStream?.startedAt;
383
+ const streamDurationSec = effectiveStream?.durationSec ?? 0;
384
+ const hasProgress = !!streamStartedAt && streamDurationSec > 0;
385
+
386
+ // A lightweight 1s tick that advances the elapsed readout while a length-known
387
+ // stream plays. Runs only when there's progress to show; cleared on unmount
388
+ // and whenever the stream clears.
389
+ const [nowMs, setNowMs] = (0, _react.useState)(() => Date.now());
390
+ (0, _react.useEffect)(() => {
391
+ if (!hasProgress) return;
392
+ setNowMs(Date.now());
393
+ const id = setInterval(() => setNowMs(Date.now()), 1000);
394
+ return () => clearInterval(id);
395
+ }, [hasProgress]);
396
+ const elapsedSec = (0, _react.useMemo)(() => {
397
+ if (!hasProgress || !streamStartedAt) return 0;
398
+ const startMs = new Date(streamStartedAt).getTime();
399
+ if (Number.isNaN(startMs)) return 0;
400
+ return Math.min(Math.max(Math.floor((nowMs - startMs) / 1000), 0), streamDurationSec);
401
+ }, [hasProgress, streamStartedAt, nowMs, streamDurationSec]);
402
+ const progressPct = hasProgress ? Math.min(Math.max(elapsedSec / streamDurationSec, 0), 1) * 100 : 0;
403
+ const progressFillStyle = {
404
+ backgroundColor: theme.colors.primary,
405
+ width: `${progressPct}%`
406
+ };
407
+ const withHours = streamDurationSec >= 3600;
408
+ const handleStopStream = async () => {
409
+ if (!roomId || streamLoading) return;
410
+ setStreamLoading(true);
411
+ try {
412
+ const success = await roomsService.stopStream(roomId);
413
+ if (success) {
414
+ toast.success('Stream stopped');
415
+ } else {
416
+ toast.error('Failed to stop stream');
417
+ }
418
+ } catch {
419
+ toast.error('Failed to stop stream');
420
+ } finally {
421
+ setStreamLoading(false);
422
+ }
423
+ };
424
+ const [skipLoading, setSkipLoading] = (0, _react.useState)(false);
425
+ const handleSkipNext = async () => {
426
+ if (!roomId || skipLoading) return;
427
+ setSkipLoading(true);
428
+ try {
429
+ const result = await roomsService.skipPodcastNext(roomId);
430
+ if (!result) {
431
+ toast.error(tr('agora.podcastStream.skipFailed'));
432
+ } else {
433
+ toast.success(tr(result.ended ? 'agora.podcastStream.queueEnded' : 'agora.podcastStream.skipped'));
434
+ const updated = await roomsService.getRoom(roomId);
435
+ if (updated) setRoom(updated);
436
+ }
437
+ } catch {
438
+ toast.error(tr('agora.podcastStream.skipFailed'));
439
+ } finally {
440
+ setSkipLoading(false);
441
+ }
442
+ };
443
+ const participantIds = (0, _react.useMemo)(() => participants.map(p => p.userId), [participants]);
444
+ (0, _useRoomUsers.useRoomUsers)(participantIds);
445
+ const speakers = participants.filter(p => p.role === 'host' || p.role === 'speaker');
446
+ const listeners = participants.filter(p => p.role === 'listener');
447
+ const userId = user?.id;
448
+ const isHost = myRole === 'host' || !!userId && room?.host === userId;
449
+ const canSpeak = myRole === 'host' || myRole === 'speaker';
450
+ if (!isExpanded) {
451
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_MiniRoomBar.MiniRoomBar, {
452
+ title: room?.title || 'Room',
453
+ participantCount: participants.length,
454
+ isMuted: isMuted,
455
+ canSpeak: canSpeak,
456
+ activeSpeakerCount: activeSpeakerIds.size,
457
+ onExpand: onExpand,
458
+ onToggleMute: toggleMute,
459
+ onLeave: handleLeave
460
+ });
461
+ }
462
+ if (activePanel === 'stream') {
463
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_StreamConfigPanel.StreamConfigPanel, {
464
+ roomId: roomId,
465
+ roomStatus: room?.status,
466
+ initialStreamUrl: room?.activeStreamUrl ?? undefined,
467
+ initialRtmpUrl: room?.rtmpUrl ?? undefined,
468
+ initialStreamKey: room?.rtmpStreamKey ?? undefined,
469
+ onClose: () => setActivePanel(null),
470
+ onStreamStarted: () => {
471
+ roomsService.getRoom(roomId).then(setRoom);
472
+ onRoomChanged?.(roomId);
473
+ setActivePanel(null);
474
+ }
475
+ });
476
+ }
477
+ if (activePanel === 'insights') {
478
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_InsightsPanel.InsightsPanel, {
479
+ room: room,
480
+ participants: participants,
481
+ theme: theme,
482
+ onClose: () => setActivePanel(null)
483
+ });
484
+ }
485
+ if (activePanel === 'settings') {
486
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
487
+ style: styles.container,
488
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_PanelHeader.PanelHeader, {
489
+ title: "Room Settings",
490
+ theme: theme,
491
+ onBack: () => setActivePanel(null)
492
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
493
+ style: styles.settingsContent,
494
+ children: [isRoomLive && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
495
+ style: styles.settingsItem,
496
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_MaterialCommunityIcons.default, {
497
+ name: isRecording ? 'record-circle' : 'record-circle-outline',
498
+ size: 22,
499
+ color: isRecording ? '#FF0000' : theme.colors.text
500
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
501
+ style: styles.settingsItemText,
502
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
503
+ style: [styles.settingsItemTitle, {
504
+ color: theme.colors.text
505
+ }],
506
+ children: "Recording"
507
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
508
+ style: [styles.settingsItemDesc, {
509
+ color: theme.colors.textSecondary
510
+ }],
511
+ children: isRecording ? 'Currently recording (max 1h)' : 'Record room audio for replay'
512
+ })]
513
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
514
+ onPress: isRecording ? handleStopRecording : handleStartRecording,
515
+ style: [styles.recordingToggle, {
516
+ backgroundColor: isRecording ? '#FF4458' : theme.colors.primary
517
+ }],
518
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
519
+ style: {
520
+ color: '#FFFFFF',
521
+ fontWeight: '600',
522
+ fontSize: 13
523
+ },
524
+ children: isRecording ? 'Stop' : 'Start'
525
+ })
526
+ })]
527
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
528
+ style: styles.settingsItem,
529
+ onPress: handleDeleteRoom,
530
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_MaterialCommunityIcons.default, {
531
+ name: "delete-outline",
532
+ size: 22,
533
+ color: "#FF4458"
534
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
535
+ style: styles.settingsItemText,
536
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
537
+ style: [styles.settingsItemTitle, {
538
+ color: '#FF4458'
539
+ }],
540
+ children: "Delete Room"
541
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
542
+ style: [styles.settingsItemDesc, {
543
+ color: theme.colors.textSecondary
544
+ }],
545
+ children: "Permanently remove this room"
546
+ })]
547
+ })]
548
+ })]
549
+ })]
550
+ });
551
+ }
552
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
553
+ style: styles.container,
554
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
555
+ style: [styles.header, {
556
+ borderBottomColor: `${theme.colors.border}80`
557
+ }],
558
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
559
+ onPress: onCollapse,
560
+ style: styles.headerButton,
561
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_MaterialCommunityIcons.default, {
562
+ name: "chevron-down",
563
+ size: 24,
564
+ color: theme.colors.text
565
+ })
566
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
567
+ style: styles.headerCenter,
568
+ children: [isRoomLive ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
569
+ style: [styles.liveBadge, {
570
+ backgroundColor: '#FF4458'
571
+ }],
572
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_AnimatedPulse.AnimatedPulse, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
573
+ style: styles.liveText,
574
+ children: "LIVE"
575
+ })]
576
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
577
+ style: [styles.liveBadge, {
578
+ backgroundColor: theme.colors.textSecondary
579
+ }],
580
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
581
+ style: styles.liveText,
582
+ children: "SCHEDULED"
583
+ })
584
+ }), isRecording && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
585
+ style: [styles.liveBadge, {
586
+ backgroundColor: '#FF0000'
587
+ }],
588
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_AnimatedPulse.AnimatedPulse, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
589
+ style: styles.liveText,
590
+ children: "REC"
591
+ })]
592
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
593
+ style: [styles.listenerCount, {
594
+ color: theme.colors.textSecondary
595
+ }],
596
+ children: [participants.length, " in room"]
597
+ })]
598
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
599
+ style: styles.headerRight,
600
+ children: [isHost && isRoomLive && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
601
+ onPress: handleStopRoom,
602
+ style: styles.endButton,
603
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
604
+ style: styles.endButtonText,
605
+ children: "End"
606
+ })
607
+ }), isHost && !isRoomLive && room?.status === 'scheduled' && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
608
+ onPress: handleStartRoom,
609
+ disabled: startingRoom,
610
+ style: [styles.endButton, {
611
+ backgroundColor: theme.colors.primary
612
+ }],
613
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
614
+ style: [styles.endButtonText, {
615
+ color: '#FFFFFF'
616
+ }],
617
+ children: startingRoom ? 'Starting...' : 'Go Live'
618
+ })
619
+ })]
620
+ })]
621
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
622
+ style: styles.roomInfo,
623
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
624
+ style: [styles.roomTitle, {
625
+ color: theme.colors.text
626
+ }],
627
+ numberOfLines: 2,
628
+ children: room?.title || 'Room'
629
+ }), room?.topic && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
630
+ style: [styles.roomTopic, {
631
+ color: theme.colors.textSecondary
632
+ }],
633
+ children: room.topic
634
+ })]
635
+ }), micPermissionDenied && canSpeak && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
636
+ style: [styles.micBanner, {
637
+ backgroundColor: '#FFF3CD',
638
+ borderColor: '#FFE69C'
639
+ }],
640
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_MaterialCommunityIcons.default, {
641
+ name: "microphone-off",
642
+ size: 18,
643
+ color: "#856404"
644
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
645
+ style: styles.micBannerText,
646
+ children: "Microphone access denied. Allow mic permission in your browser settings to speak."
647
+ })]
648
+ }), effectiveStream && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
649
+ style: [styles.streamCard, {
650
+ backgroundColor: `${theme.colors.card}80`,
651
+ borderColor: theme.colors.border
652
+ }],
653
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
654
+ style: styles.streamCardRow,
655
+ children: [streamImageUrl ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Image, {
656
+ source: {
657
+ uri: streamImageUrl
658
+ },
659
+ style: styles.streamCardImage
660
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
661
+ style: [styles.streamCardIconBox, {
662
+ backgroundColor: '#E8F5E9'
663
+ }],
664
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_MaterialCommunityIcons.default, {
665
+ name: "radio",
666
+ size: 20,
667
+ color: "#2E7D32"
668
+ })
669
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
670
+ style: styles.streamCardContent,
671
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
672
+ style: [styles.streamCardTitle, {
673
+ color: theme.colors.text
674
+ }],
675
+ numberOfLines: 1,
676
+ children: effectiveStream.title || 'Live Stream'
677
+ }), effectiveStream.description ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
678
+ style: [styles.streamCardDesc, {
679
+ color: theme.colors.textSecondary
680
+ }],
681
+ numberOfLines: 2,
682
+ children: effectiveStream.description
683
+ }) : null]
684
+ }), isHost && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
685
+ style: styles.streamCardActions,
686
+ children: [(room?.podcastQueue?.length ?? 0) > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
687
+ onPress: handleSkipNext,
688
+ disabled: skipLoading,
689
+ style: styles.streamCardAction,
690
+ accessibilityRole: "button",
691
+ accessibilityLabel: tr('agora.podcastStream.skipNext'),
692
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_MaterialCommunityIcons.default, {
693
+ name: "skip-next-circle",
694
+ size: 22,
695
+ color: theme.colors.primary
696
+ })
697
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
698
+ onPress: handleStopStream,
699
+ disabled: streamLoading,
700
+ style: styles.streamCardAction,
701
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_MaterialCommunityIcons.default, {
702
+ name: "close-circle",
703
+ size: 22,
704
+ color: "#C62828"
705
+ })
706
+ })]
707
+ })]
708
+ }), hasProgress && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
709
+ style: styles.streamProgress,
710
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
711
+ style: [styles.progressTrack, {
712
+ backgroundColor: theme.colors.border
713
+ }],
714
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
715
+ style: [styles.progressFill, progressFillStyle]
716
+ })
717
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
718
+ style: [styles.progressTime, {
719
+ color: theme.colors.textSecondary
720
+ }],
721
+ children: [formatClock(elapsedSec, withHours), " / ", formatClock(streamDurationSec, withHours)]
722
+ })]
723
+ })]
724
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.ScrollView, {
725
+ style: {
726
+ flex: 1
727
+ },
728
+ contentContainerStyle: styles.scrollContent,
729
+ showsVerticalScrollIndicator: false,
730
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
731
+ style: styles.speakerGrid,
732
+ children: speakers.map(p => /*#__PURE__*/(0, _jsxRuntime.jsx)(ConnectedSpeakerTile, {
733
+ participant: p,
734
+ isCurrentUser: p.userId === userId,
735
+ isSpeaking: activeSpeakerIds.has(p.userId),
736
+ theme: theme,
737
+ oxyServices: oxyServices,
738
+ AvatarComponent: AvatarComponent,
739
+ getCachedFileDownloadUrlSync: getCachedFileDownloadUrlSync,
740
+ useUserById: useUserById
741
+ }, p.userId))
742
+ }), listeners.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
743
+ style: styles.listenerSection,
744
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
745
+ style: [styles.listenerHeader, {
746
+ color: theme.colors.textSecondary
747
+ }],
748
+ children: ["Listeners (", listeners.length, ")"]
749
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
750
+ style: styles.listenerGrid,
751
+ children: listeners.map(p => /*#__PURE__*/(0, _jsxRuntime.jsx)(ConnectedListenerAvatar, {
752
+ participant: p,
753
+ oxyServices: oxyServices,
754
+ AvatarComponent: AvatarComponent,
755
+ getCachedFileDownloadUrlSync: getCachedFileDownloadUrlSync,
756
+ useUserById: useUserById
757
+ }, p.userId))
758
+ })]
759
+ }), isHost && speakerRequests.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
760
+ style: styles.requestsSection,
761
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
762
+ style: [styles.requestsHeader, {
763
+ color: theme.colors.textSecondary
764
+ }],
765
+ children: "Requests to speak"
766
+ }), speakerRequests.map(r => /*#__PURE__*/(0, _jsxRuntime.jsx)(ConnectedRequestRow, {
767
+ request: r,
768
+ theme: theme,
769
+ oxyServices: oxyServices,
770
+ onApprove: approveSpeaker,
771
+ onDeny: denySpeaker,
772
+ AvatarComponent: AvatarComponent,
773
+ getCachedFileDownloadUrlSync: getCachedFileDownloadUrlSync,
774
+ useUserById: useUserById
775
+ }, r.userId))]
776
+ })]
777
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
778
+ style: [styles.controlBar, {
779
+ borderTopColor: theme.colors.border
780
+ }],
781
+ children: [canSpeak ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
782
+ style: styles.controlItem,
783
+ onPress: toggleMute,
784
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
785
+ style: [styles.controlCircle, {
786
+ backgroundColor: isMuted ? theme.colors.backgroundSecondary : theme.colors.primary
787
+ }],
788
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_MaterialCommunityIcons.default, {
789
+ name: isMuted ? 'microphone-off' : 'microphone',
790
+ size: 24,
791
+ color: isMuted ? theme.colors.text : '#FFFFFF'
792
+ })
793
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
794
+ style: [styles.controlLabel, {
795
+ color: theme.colors.textSecondary
796
+ }],
797
+ children: isMuted ? 'Unmute' : 'Mute'
798
+ })]
799
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
800
+ style: styles.controlItem,
801
+ onPress: requestToSpeak,
802
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
803
+ style: [styles.controlCircle, {
804
+ backgroundColor: theme.colors.backgroundSecondary
805
+ }],
806
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_MaterialCommunityIcons.default, {
807
+ name: "hand-back-left",
808
+ size: 24,
809
+ color: theme.colors.text
810
+ })
811
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
812
+ style: [styles.controlLabel, {
813
+ color: theme.colors.textSecondary
814
+ }],
815
+ children: "Request"
816
+ })]
817
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
818
+ style: styles.controlItem,
819
+ onPress: () => setActivePanel('insights'),
820
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
821
+ style: [styles.controlCircle, {
822
+ backgroundColor: theme.colors.backgroundSecondary
823
+ }],
824
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_MaterialCommunityIcons.default, {
825
+ name: "chart-box-outline",
826
+ size: 24,
827
+ color: theme.colors.text
828
+ })
829
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
830
+ style: [styles.controlLabel, {
831
+ color: theme.colors.textSecondary
832
+ }],
833
+ children: "Insights"
834
+ })]
835
+ }), isHost && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
836
+ style: styles.controlItem,
837
+ onPress: () => setActivePanel('stream'),
838
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
839
+ style: [styles.controlCircle, {
840
+ backgroundColor: theme.colors.backgroundSecondary
841
+ }],
842
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_MaterialCommunityIcons.default, {
843
+ name: "radio",
844
+ size: 24,
845
+ color: theme.colors.text
846
+ })
847
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
848
+ style: [styles.controlLabel, {
849
+ color: theme.colors.textSecondary
850
+ }],
851
+ children: "Stream"
852
+ })]
853
+ }), isHost && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
854
+ style: styles.controlItem,
855
+ onPress: () => setActivePanel('settings'),
856
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
857
+ style: [styles.controlCircle, {
858
+ backgroundColor: theme.colors.backgroundSecondary
859
+ }],
860
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_MaterialCommunityIcons.default, {
861
+ name: "cog-outline",
862
+ size: 24,
863
+ color: theme.colors.text
864
+ })
865
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
866
+ style: [styles.controlLabel, {
867
+ color: theme.colors.textSecondary
868
+ }],
869
+ children: "Settings"
870
+ })]
871
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
872
+ style: styles.controlItem,
873
+ onPress: handleLeave,
874
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
875
+ style: [styles.leaveCircle, {
876
+ backgroundColor: '#FF4458'
877
+ }],
878
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_MaterialCommunityIcons.default, {
879
+ name: "exit-run",
880
+ size: 24,
881
+ color: "#FFFFFF"
882
+ })
883
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
884
+ style: [styles.controlLabel, {
885
+ color: theme.colors.textSecondary
886
+ }],
887
+ children: "Leave"
888
+ })]
889
+ })]
890
+ })]
891
+ });
892
+ }
893
+ const styles = _reactNative.StyleSheet.create({
894
+ container: {
895
+ flex: 1
896
+ },
897
+ header: {
898
+ flexDirection: 'row',
899
+ alignItems: 'center',
900
+ paddingHorizontal: 16,
901
+ paddingVertical: 12,
902
+ borderBottomWidth: 1
903
+ },
904
+ headerButton: {
905
+ padding: 4
906
+ },
907
+ headerCenter: {
908
+ flex: 1,
909
+ flexDirection: 'row',
910
+ alignItems: 'center',
911
+ justifyContent: 'center',
912
+ gap: 8
913
+ },
914
+ headerRight: {
915
+ minWidth: 40,
916
+ alignItems: 'flex-end'
917
+ },
918
+ liveBadge: {
919
+ flexDirection: 'row',
920
+ alignItems: 'center',
921
+ paddingHorizontal: 10,
922
+ paddingVertical: 4,
923
+ borderRadius: 12,
924
+ gap: 5
925
+ },
926
+ liveText: {
927
+ fontSize: 12,
928
+ fontWeight: '700',
929
+ color: '#FFFFFF'
930
+ },
931
+ listenerCount: {
932
+ fontSize: 14,
933
+ fontWeight: '500'
934
+ },
935
+ endButton: {
936
+ paddingHorizontal: 16,
937
+ paddingVertical: 6,
938
+ borderRadius: 16,
939
+ backgroundColor: '#FF44581A'
940
+ },
941
+ endButtonText: {
942
+ fontSize: 15,
943
+ fontWeight: '600',
944
+ color: '#FF4458'
945
+ },
946
+ roomInfo: {
947
+ paddingHorizontal: 16,
948
+ paddingTop: 16,
949
+ paddingBottom: 8
950
+ },
951
+ roomTitle: {
952
+ fontSize: 32,
953
+ fontWeight: 'bold',
954
+ lineHeight: 38
955
+ },
956
+ roomTopic: {
957
+ fontSize: 14,
958
+ marginTop: 4
959
+ },
960
+ micBanner: {
961
+ flexDirection: 'row',
962
+ alignItems: 'center',
963
+ gap: 8,
964
+ marginHorizontal: 16,
965
+ marginBottom: 4,
966
+ paddingHorizontal: 12,
967
+ paddingVertical: 10,
968
+ borderRadius: 8,
969
+ borderWidth: 1
970
+ },
971
+ micBannerText: {
972
+ flex: 1,
973
+ fontSize: 13,
974
+ fontWeight: '500',
975
+ color: '#856404'
976
+ },
977
+ scrollContent: {
978
+ paddingBottom: 120
979
+ },
980
+ speakerGrid: {
981
+ flexDirection: 'row',
982
+ flexWrap: 'wrap',
983
+ paddingHorizontal: 12,
984
+ paddingTop: 16
985
+ },
986
+ speakerTile: {
987
+ width: '25%',
988
+ alignItems: 'center',
989
+ marginBottom: 20
990
+ },
991
+ muteIndicator: {
992
+ position: 'absolute',
993
+ bottom: 0,
994
+ right: 0,
995
+ width: 22,
996
+ height: 22,
997
+ borderRadius: 11,
998
+ alignItems: 'center',
999
+ justifyContent: 'center',
1000
+ borderWidth: 2,
1001
+ borderColor: '#FFFFFF'
1002
+ },
1003
+ speakerName: {
1004
+ fontSize: 12,
1005
+ fontWeight: '500',
1006
+ marginTop: 6,
1007
+ textAlign: 'center',
1008
+ maxWidth: 80
1009
+ },
1010
+ roleBadge: {
1011
+ paddingHorizontal: 6,
1012
+ paddingVertical: 2,
1013
+ borderRadius: 4,
1014
+ marginTop: 2
1015
+ },
1016
+ roleBadgeText: {
1017
+ fontSize: 10,
1018
+ fontWeight: '600',
1019
+ color: '#FFFFFF'
1020
+ },
1021
+ listenerSection: {
1022
+ paddingHorizontal: 16,
1023
+ marginTop: 8
1024
+ },
1025
+ listenerHeader: {
1026
+ fontSize: 14,
1027
+ fontWeight: '600',
1028
+ marginBottom: 12
1029
+ },
1030
+ listenerGrid: {
1031
+ flexDirection: 'row',
1032
+ flexWrap: 'wrap',
1033
+ gap: 12
1034
+ },
1035
+ listenerItem: {
1036
+ marginBottom: 4
1037
+ },
1038
+ requestsSection: {
1039
+ paddingHorizontal: 16,
1040
+ marginTop: 24
1041
+ },
1042
+ requestsHeader: {
1043
+ fontSize: 14,
1044
+ fontWeight: '600',
1045
+ marginBottom: 12
1046
+ },
1047
+ requestRow: {
1048
+ flexDirection: 'row',
1049
+ alignItems: 'center',
1050
+ padding: 12,
1051
+ borderRadius: 12,
1052
+ borderWidth: 1,
1053
+ marginBottom: 8,
1054
+ gap: 10
1055
+ },
1056
+ requestName: {
1057
+ flex: 1,
1058
+ fontSize: 14,
1059
+ fontWeight: '500'
1060
+ },
1061
+ approveBtn: {
1062
+ width: 32,
1063
+ height: 32,
1064
+ borderRadius: 16,
1065
+ alignItems: 'center',
1066
+ justifyContent: 'center'
1067
+ },
1068
+ denyBtn: {
1069
+ width: 32,
1070
+ height: 32,
1071
+ borderRadius: 16,
1072
+ alignItems: 'center',
1073
+ justifyContent: 'center'
1074
+ },
1075
+ controlBar: {
1076
+ flexDirection: 'row',
1077
+ justifyContent: 'center',
1078
+ alignItems: 'flex-start',
1079
+ paddingTop: 12,
1080
+ paddingBottom: 12,
1081
+ paddingHorizontal: 16,
1082
+ borderTopWidth: 1,
1083
+ gap: 20
1084
+ },
1085
+ controlItem: {
1086
+ alignItems: 'center',
1087
+ gap: 4
1088
+ },
1089
+ controlCircle: {
1090
+ width: 52,
1091
+ height: 52,
1092
+ borderRadius: 26,
1093
+ alignItems: 'center',
1094
+ justifyContent: 'center'
1095
+ },
1096
+ leaveCircle: {
1097
+ width: 52,
1098
+ height: 52,
1099
+ borderRadius: 26,
1100
+ alignItems: 'center',
1101
+ justifyContent: 'center'
1102
+ },
1103
+ controlLabel: {
1104
+ fontSize: 11,
1105
+ fontWeight: '500'
1106
+ },
1107
+ streamCard: {
1108
+ marginHorizontal: 16,
1109
+ marginBottom: 4,
1110
+ padding: 10,
1111
+ borderRadius: 12,
1112
+ borderWidth: 1,
1113
+ gap: 8
1114
+ },
1115
+ streamCardRow: {
1116
+ flexDirection: 'row',
1117
+ alignItems: 'center',
1118
+ gap: 10
1119
+ },
1120
+ streamCardImage: {
1121
+ width: 44,
1122
+ height: 44,
1123
+ borderRadius: 8
1124
+ },
1125
+ streamCardIconBox: {
1126
+ width: 44,
1127
+ height: 44,
1128
+ borderRadius: 8,
1129
+ alignItems: 'center',
1130
+ justifyContent: 'center'
1131
+ },
1132
+ streamCardContent: {
1133
+ flex: 1,
1134
+ gap: 2
1135
+ },
1136
+ streamCardTitle: {
1137
+ fontSize: 14,
1138
+ fontWeight: '600'
1139
+ },
1140
+ streamCardDesc: {
1141
+ fontSize: 12
1142
+ },
1143
+ streamCardActions: {
1144
+ flexDirection: 'row',
1145
+ alignItems: 'center',
1146
+ gap: 2
1147
+ },
1148
+ streamCardAction: {
1149
+ padding: 4
1150
+ },
1151
+ streamProgress: {
1152
+ gap: 4
1153
+ },
1154
+ progressTrack: {
1155
+ height: 4,
1156
+ borderRadius: 2,
1157
+ overflow: 'hidden'
1158
+ },
1159
+ progressFill: {
1160
+ height: 4,
1161
+ borderRadius: 2
1162
+ },
1163
+ progressTime: {
1164
+ fontSize: 11,
1165
+ fontWeight: '500',
1166
+ textAlign: 'right'
1167
+ },
1168
+ settingsContent: {
1169
+ paddingHorizontal: 16,
1170
+ paddingTop: 16
1171
+ },
1172
+ settingsItem: {
1173
+ flexDirection: 'row',
1174
+ alignItems: 'center',
1175
+ gap: 14,
1176
+ paddingVertical: 14
1177
+ },
1178
+ settingsItemText: {
1179
+ flex: 1
1180
+ },
1181
+ settingsItemTitle: {
1182
+ fontSize: 16,
1183
+ fontWeight: '600'
1184
+ },
1185
+ settingsItemDesc: {
1186
+ fontSize: 13,
1187
+ marginTop: 2
1188
+ },
1189
+ recordingToggle: {
1190
+ paddingHorizontal: 14,
1191
+ paddingVertical: 6,
1192
+ borderRadius: 14
1193
+ }
1194
+ });
1195
+ //# sourceMappingURL=LiveRoomSheet.js.map