@syra.fm/sdk 0.4.0 → 0.6.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 (317) hide show
  1. package/README.md +33 -4
  2. package/lib/commonjs/client.js +268 -0
  3. package/lib/commonjs/client.js.map +1 -0
  4. package/lib/commonjs/errors.js +22 -0
  5. package/lib/commonjs/errors.js.map +1 -0
  6. package/lib/commonjs/index.js +63 -0
  7. package/lib/commonjs/index.js.map +1 -0
  8. package/lib/commonjs/index.native.js +28 -0
  9. package/lib/commonjs/index.native.js.map +1 -0
  10. package/lib/commonjs/live/assets/icons/spaces-icon.js +42 -0
  11. package/lib/commonjs/live/assets/icons/spaces-icon.js.map +1 -0
  12. package/lib/commonjs/live/assets/icons/syra-icon.js +43 -0
  13. package/lib/commonjs/live/assets/icons/syra-icon.js.map +1 -0
  14. package/lib/commonjs/live/colors.js +54 -0
  15. package/lib/commonjs/live/colors.js.map +1 -0
  16. package/lib/commonjs/live/components/AnimatedPulse.js +38 -0
  17. package/lib/commonjs/live/components/AnimatedPulse.js.map +1 -0
  18. package/lib/commonjs/live/components/AnimatedSpeakerRing.js +90 -0
  19. package/lib/commonjs/live/components/AnimatedSpeakerRing.js.map +1 -0
  20. package/lib/commonjs/live/components/CreateRoomSheet.js +688 -0
  21. package/lib/commonjs/live/components/CreateRoomSheet.js.map +1 -0
  22. package/lib/commonjs/live/components/InsightsPanel.js +333 -0
  23. package/lib/commonjs/live/components/InsightsPanel.js.map +1 -0
  24. package/lib/commonjs/live/components/LiveRoomSheet.js +1196 -0
  25. package/lib/commonjs/live/components/LiveRoomSheet.js.map +1 -0
  26. package/lib/commonjs/live/components/MiniRoomBar.js +162 -0
  27. package/lib/commonjs/live/components/MiniRoomBar.js.map +1 -0
  28. package/lib/commonjs/live/components/PanelHeader.js +57 -0
  29. package/lib/commonjs/live/components/PanelHeader.js.map +1 -0
  30. package/lib/commonjs/live/components/PodcastStreamPicker.js +1190 -0
  31. package/lib/commonjs/live/components/PodcastStreamPicker.js.map +1 -0
  32. package/lib/commonjs/live/components/RecordingCard.js +192 -0
  33. package/lib/commonjs/live/components/RecordingCard.js.map +1 -0
  34. package/lib/commonjs/live/components/RecordingsPanel.js +305 -0
  35. package/lib/commonjs/live/components/RecordingsPanel.js.map +1 -0
  36. package/lib/commonjs/live/components/RoomCard.js +349 -0
  37. package/lib/commonjs/live/components/RoomCard.js.map +1 -0
  38. package/lib/commonjs/live/components/StreamConfigModal.js +656 -0
  39. package/lib/commonjs/live/components/StreamConfigModal.js.map +1 -0
  40. package/lib/commonjs/live/components/StreamConfigPanel.js +822 -0
  41. package/lib/commonjs/live/components/StreamConfigPanel.js.map +1 -0
  42. package/lib/commonjs/live/context/LiveConfigContext.js +46 -0
  43. package/lib/commonjs/live/context/LiveConfigContext.js.map +1 -0
  44. package/lib/commonjs/live/context/LiveRoomContext.js +195 -0
  45. package/lib/commonjs/live/context/LiveRoomContext.js.map +1 -0
  46. package/lib/commonjs/live/hooks/useActiveSpeakers.js +35 -0
  47. package/lib/commonjs/live/hooks/useActiveSpeakers.js.map +1 -0
  48. package/lib/commonjs/live/hooks/useRoomAudio.js +129 -0
  49. package/lib/commonjs/live/hooks/useRoomAudio.js.map +1 -0
  50. package/lib/commonjs/live/hooks/useRoomConnection.js +177 -0
  51. package/lib/commonjs/live/hooks/useRoomConnection.js.map +1 -0
  52. package/lib/commonjs/live/hooks/useRoomManager.js +37 -0
  53. package/lib/commonjs/live/hooks/useRoomManager.js.map +1 -0
  54. package/lib/commonjs/live/hooks/useRoomUsers.js +52 -0
  55. package/lib/commonjs/live/hooks/useRoomUsers.js.map +1 -0
  56. package/lib/commonjs/live/index.js +341 -0
  57. package/lib/commonjs/live/index.js.map +1 -0
  58. package/lib/commonjs/live/services/livekitService.js +20 -0
  59. package/lib/commonjs/live/services/livekitService.js.map +1 -0
  60. package/lib/commonjs/live/services/spaceSocketService.js +181 -0
  61. package/lib/commonjs/live/services/spaceSocketService.js.map +1 -0
  62. package/lib/commonjs/live/services/spacesService.js +642 -0
  63. package/lib/commonjs/live/services/spacesService.js.map +1 -0
  64. package/lib/commonjs/live/types.js +6 -0
  65. package/lib/commonjs/live/types.js.map +1 -0
  66. package/lib/commonjs/live/validation.js +238 -0
  67. package/lib/commonjs/live/validation.js.map +1 -0
  68. package/lib/commonjs/package.json +1 -0
  69. package/{dist/cjs → lib/commonjs}/schema.js +55 -47
  70. package/lib/commonjs/schema.js.map +1 -0
  71. package/lib/module/client.js +264 -0
  72. package/lib/module/client.js.map +1 -0
  73. package/lib/module/errors.js +17 -0
  74. package/lib/module/errors.js.map +1 -0
  75. package/lib/module/index.js +6 -0
  76. package/lib/module/index.js.map +1 -0
  77. package/lib/module/index.native.js +5 -0
  78. package/lib/module/index.native.js.map +1 -0
  79. package/lib/module/live/assets/icons/spaces-icon.js +34 -0
  80. package/lib/module/live/assets/icons/spaces-icon.js.map +1 -0
  81. package/lib/module/live/assets/icons/syra-icon.js +36 -0
  82. package/lib/module/live/assets/icons/syra-icon.js.map +1 -0
  83. package/lib/module/live/colors.js +49 -0
  84. package/lib/module/live/colors.js.map +1 -0
  85. package/lib/module/live/components/AnimatedPulse.js +33 -0
  86. package/lib/module/live/components/AnimatedPulse.js.map +1 -0
  87. package/lib/module/live/components/AnimatedSpeakerRing.js +85 -0
  88. package/lib/module/live/components/AnimatedSpeakerRing.js.map +1 -0
  89. package/lib/module/live/components/CreateRoomSheet.js +682 -0
  90. package/lib/module/live/components/CreateRoomSheet.js.map +1 -0
  91. package/lib/module/live/components/InsightsPanel.js +327 -0
  92. package/lib/module/live/components/InsightsPanel.js.map +1 -0
  93. package/lib/module/live/components/LiveRoomSheet.js +1190 -0
  94. package/lib/module/live/components/LiveRoomSheet.js.map +1 -0
  95. package/lib/module/live/components/MiniRoomBar.js +155 -0
  96. package/lib/module/live/components/MiniRoomBar.js.map +1 -0
  97. package/lib/module/live/components/PanelHeader.js +52 -0
  98. package/lib/module/live/components/PanelHeader.js.map +1 -0
  99. package/lib/module/live/components/PodcastStreamPicker.js +1183 -0
  100. package/lib/module/live/components/PodcastStreamPicker.js.map +1 -0
  101. package/lib/module/live/components/RecordingCard.js +187 -0
  102. package/lib/module/live/components/RecordingCard.js.map +1 -0
  103. package/lib/module/live/components/RecordingsPanel.js +299 -0
  104. package/lib/module/live/components/RecordingsPanel.js.map +1 -0
  105. package/lib/module/live/components/RoomCard.js +343 -0
  106. package/lib/module/live/components/RoomCard.js.map +1 -0
  107. package/lib/module/live/components/StreamConfigModal.js +650 -0
  108. package/lib/module/live/components/StreamConfigModal.js.map +1 -0
  109. package/lib/module/live/components/StreamConfigPanel.js +816 -0
  110. package/lib/module/live/components/StreamConfigPanel.js.map +1 -0
  111. package/lib/module/live/context/LiveConfigContext.js +40 -0
  112. package/lib/module/live/context/LiveConfigContext.js.map +1 -0
  113. package/lib/module/live/context/LiveRoomContext.js +189 -0
  114. package/lib/module/live/context/LiveRoomContext.js.map +1 -0
  115. package/lib/module/live/hooks/useActiveSpeakers.js +31 -0
  116. package/lib/module/live/hooks/useActiveSpeakers.js.map +1 -0
  117. package/lib/module/live/hooks/useRoomAudio.js +125 -0
  118. package/lib/module/live/hooks/useRoomAudio.js.map +1 -0
  119. package/lib/module/live/hooks/useRoomConnection.js +173 -0
  120. package/lib/module/live/hooks/useRoomConnection.js.map +1 -0
  121. package/lib/module/live/hooks/useRoomManager.js +32 -0
  122. package/lib/module/live/hooks/useRoomManager.js.map +1 -0
  123. package/lib/module/live/hooks/useRoomUsers.js +46 -0
  124. package/lib/module/live/hooks/useRoomUsers.js.map +1 -0
  125. package/lib/module/live/index.js +42 -0
  126. package/lib/module/live/index.js.map +1 -0
  127. package/lib/module/live/services/livekitService.js +16 -0
  128. package/lib/module/live/services/livekitService.js.map +1 -0
  129. package/lib/module/live/services/spaceSocketService.js +176 -0
  130. package/lib/module/live/services/spaceSocketService.js.map +1 -0
  131. package/lib/module/live/services/spacesService.js +639 -0
  132. package/lib/module/live/services/spacesService.js.map +1 -0
  133. package/lib/module/live/types.js +4 -0
  134. package/lib/module/live/types.js.map +1 -0
  135. package/lib/module/live/validation.js +229 -0
  136. package/lib/module/live/validation.js.map +1 -0
  137. package/lib/module/package.json +1 -0
  138. package/{dist/esm → lib/module}/schema.js +47 -39
  139. package/lib/module/schema.js.map +1 -0
  140. package/{dist/types → lib/typescript/commonjs}/client.d.ts +1 -0
  141. package/lib/typescript/commonjs/client.d.ts.map +1 -0
  142. package/{dist/types → lib/typescript/commonjs}/errors.d.ts +1 -0
  143. package/lib/typescript/commonjs/errors.d.ts.map +1 -0
  144. package/{dist/types → lib/typescript/commonjs}/index.d.ts +1 -0
  145. package/lib/typescript/commonjs/index.d.ts.map +1 -0
  146. package/lib/typescript/commonjs/index.native.d.ts +3 -0
  147. package/lib/typescript/commonjs/index.native.d.ts.map +1 -0
  148. package/lib/typescript/commonjs/live/assets/icons/spaces-icon.d.ts +13 -0
  149. package/lib/typescript/commonjs/live/assets/icons/spaces-icon.d.ts.map +1 -0
  150. package/lib/typescript/commonjs/live/assets/icons/syra-icon.d.ts +13 -0
  151. package/lib/typescript/commonjs/live/assets/icons/syra-icon.d.ts.map +1 -0
  152. package/lib/typescript/commonjs/live/colors.d.ts +35 -0
  153. package/lib/typescript/commonjs/live/colors.d.ts.map +1 -0
  154. package/lib/typescript/commonjs/live/components/AnimatedPulse.d.ts +8 -0
  155. package/lib/typescript/commonjs/live/components/AnimatedPulse.d.ts.map +1 -0
  156. package/lib/typescript/commonjs/live/components/AnimatedSpeakerRing.d.ts +10 -0
  157. package/lib/typescript/commonjs/live/components/AnimatedSpeakerRing.d.ts.map +1 -0
  158. package/lib/typescript/commonjs/live/components/CreateRoomSheet.d.ts +26 -0
  159. package/lib/typescript/commonjs/live/components/CreateRoomSheet.d.ts.map +1 -0
  160. package/lib/typescript/commonjs/live/components/InsightsPanel.d.ts +11 -0
  161. package/lib/typescript/commonjs/live/components/InsightsPanel.d.ts.map +1 -0
  162. package/lib/typescript/commonjs/live/components/LiveRoomSheet.d.ts +11 -0
  163. package/lib/typescript/commonjs/live/components/LiveRoomSheet.d.ts.map +1 -0
  164. package/lib/typescript/commonjs/live/components/MiniRoomBar.d.ts +15 -0
  165. package/lib/typescript/commonjs/live/components/MiniRoomBar.d.ts.map +1 -0
  166. package/lib/typescript/commonjs/live/components/PanelHeader.d.ts +10 -0
  167. package/lib/typescript/commonjs/live/components/PanelHeader.d.ts.map +1 -0
  168. package/lib/typescript/commonjs/live/components/PodcastStreamPicker.d.ts +54 -0
  169. package/lib/typescript/commonjs/live/components/PodcastStreamPicker.d.ts.map +1 -0
  170. package/lib/typescript/commonjs/live/components/RecordingCard.d.ts +11 -0
  171. package/lib/typescript/commonjs/live/components/RecordingCard.d.ts.map +1 -0
  172. package/lib/typescript/commonjs/live/components/RecordingsPanel.d.ts +12 -0
  173. package/lib/typescript/commonjs/live/components/RecordingsPanel.d.ts.map +1 -0
  174. package/lib/typescript/commonjs/live/components/RoomCard.d.ts +38 -0
  175. package/lib/typescript/commonjs/live/components/RoomCard.d.ts.map +1 -0
  176. package/lib/typescript/commonjs/live/components/StreamConfigModal.d.ts +11 -0
  177. package/lib/typescript/commonjs/live/components/StreamConfigModal.d.ts.map +1 -0
  178. package/lib/typescript/commonjs/live/components/StreamConfigPanel.d.ts +13 -0
  179. package/lib/typescript/commonjs/live/components/StreamConfigPanel.d.ts.map +1 -0
  180. package/lib/typescript/commonjs/live/context/LiveConfigContext.d.ts +78 -0
  181. package/lib/typescript/commonjs/live/context/LiveConfigContext.d.ts.map +1 -0
  182. package/lib/typescript/commonjs/live/context/LiveRoomContext.d.ts +12 -0
  183. package/lib/typescript/commonjs/live/context/LiveRoomContext.d.ts.map +1 -0
  184. package/lib/typescript/commonjs/live/hooks/useActiveSpeakers.d.ts +3 -0
  185. package/lib/typescript/commonjs/live/hooks/useActiveSpeakers.d.ts.map +1 -0
  186. package/lib/typescript/commonjs/live/hooks/useRoomAudio.d.ts +16 -0
  187. package/lib/typescript/commonjs/live/hooks/useRoomAudio.d.ts.map +1 -0
  188. package/lib/typescript/commonjs/live/hooks/useRoomConnection.d.ts +29 -0
  189. package/lib/typescript/commonjs/live/hooks/useRoomConnection.d.ts.map +1 -0
  190. package/lib/typescript/commonjs/live/hooks/useRoomManager.d.ts +11 -0
  191. package/lib/typescript/commonjs/live/hooks/useRoomManager.d.ts.map +1 -0
  192. package/lib/typescript/commonjs/live/hooks/useRoomUsers.d.ts +5 -0
  193. package/lib/typescript/commonjs/live/hooks/useRoomUsers.d.ts.map +1 -0
  194. package/lib/typescript/commonjs/live/index.d.ts +25 -0
  195. package/lib/typescript/commonjs/live/index.d.ts.map +1 -0
  196. package/lib/typescript/commonjs/live/services/livekitService.d.ts +7 -0
  197. package/lib/typescript/commonjs/live/services/livekitService.d.ts.map +1 -0
  198. package/lib/typescript/commonjs/live/services/spaceSocketService.d.ts +69 -0
  199. package/lib/typescript/commonjs/live/services/spaceSocketService.d.ts.map +1 -0
  200. package/lib/typescript/commonjs/live/services/spacesService.d.ts +181 -0
  201. package/lib/typescript/commonjs/live/services/spacesService.d.ts.map +1 -0
  202. package/lib/typescript/commonjs/live/types.d.ts +100 -0
  203. package/lib/typescript/commonjs/live/types.d.ts.map +1 -0
  204. package/lib/typescript/commonjs/live/validation.d.ts +658 -0
  205. package/lib/typescript/commonjs/live/validation.d.ts.map +1 -0
  206. package/lib/typescript/commonjs/package.json +1 -0
  207. package/{dist/types → lib/typescript/commonjs}/schema.d.ts +1 -0
  208. package/lib/typescript/commonjs/schema.d.ts.map +1 -0
  209. package/lib/typescript/module/client.d.ts +141 -0
  210. package/lib/typescript/module/client.d.ts.map +1 -0
  211. package/lib/typescript/module/errors.d.ts +9 -0
  212. package/lib/typescript/module/errors.d.ts.map +1 -0
  213. package/lib/typescript/module/index.d.ts +6 -0
  214. package/lib/typescript/module/index.d.ts.map +1 -0
  215. package/lib/typescript/module/index.native.d.ts +3 -0
  216. package/lib/typescript/module/index.native.d.ts.map +1 -0
  217. package/lib/typescript/module/live/assets/icons/spaces-icon.d.ts +13 -0
  218. package/lib/typescript/module/live/assets/icons/spaces-icon.d.ts.map +1 -0
  219. package/lib/typescript/module/live/assets/icons/syra-icon.d.ts +13 -0
  220. package/lib/typescript/module/live/assets/icons/syra-icon.d.ts.map +1 -0
  221. package/lib/typescript/module/live/colors.d.ts +35 -0
  222. package/lib/typescript/module/live/colors.d.ts.map +1 -0
  223. package/lib/typescript/module/live/components/AnimatedPulse.d.ts +8 -0
  224. package/lib/typescript/module/live/components/AnimatedPulse.d.ts.map +1 -0
  225. package/lib/typescript/module/live/components/AnimatedSpeakerRing.d.ts +10 -0
  226. package/lib/typescript/module/live/components/AnimatedSpeakerRing.d.ts.map +1 -0
  227. package/lib/typescript/module/live/components/CreateRoomSheet.d.ts +26 -0
  228. package/lib/typescript/module/live/components/CreateRoomSheet.d.ts.map +1 -0
  229. package/lib/typescript/module/live/components/InsightsPanel.d.ts +11 -0
  230. package/lib/typescript/module/live/components/InsightsPanel.d.ts.map +1 -0
  231. package/lib/typescript/module/live/components/LiveRoomSheet.d.ts +11 -0
  232. package/lib/typescript/module/live/components/LiveRoomSheet.d.ts.map +1 -0
  233. package/lib/typescript/module/live/components/MiniRoomBar.d.ts +15 -0
  234. package/lib/typescript/module/live/components/MiniRoomBar.d.ts.map +1 -0
  235. package/lib/typescript/module/live/components/PanelHeader.d.ts +10 -0
  236. package/lib/typescript/module/live/components/PanelHeader.d.ts.map +1 -0
  237. package/lib/typescript/module/live/components/PodcastStreamPicker.d.ts +54 -0
  238. package/lib/typescript/module/live/components/PodcastStreamPicker.d.ts.map +1 -0
  239. package/lib/typescript/module/live/components/RecordingCard.d.ts +11 -0
  240. package/lib/typescript/module/live/components/RecordingCard.d.ts.map +1 -0
  241. package/lib/typescript/module/live/components/RecordingsPanel.d.ts +12 -0
  242. package/lib/typescript/module/live/components/RecordingsPanel.d.ts.map +1 -0
  243. package/lib/typescript/module/live/components/RoomCard.d.ts +38 -0
  244. package/lib/typescript/module/live/components/RoomCard.d.ts.map +1 -0
  245. package/lib/typescript/module/live/components/StreamConfigModal.d.ts +11 -0
  246. package/lib/typescript/module/live/components/StreamConfigModal.d.ts.map +1 -0
  247. package/lib/typescript/module/live/components/StreamConfigPanel.d.ts +13 -0
  248. package/lib/typescript/module/live/components/StreamConfigPanel.d.ts.map +1 -0
  249. package/lib/typescript/module/live/context/LiveConfigContext.d.ts +78 -0
  250. package/lib/typescript/module/live/context/LiveConfigContext.d.ts.map +1 -0
  251. package/lib/typescript/module/live/context/LiveRoomContext.d.ts +12 -0
  252. package/lib/typescript/module/live/context/LiveRoomContext.d.ts.map +1 -0
  253. package/lib/typescript/module/live/hooks/useActiveSpeakers.d.ts +3 -0
  254. package/lib/typescript/module/live/hooks/useActiveSpeakers.d.ts.map +1 -0
  255. package/lib/typescript/module/live/hooks/useRoomAudio.d.ts +16 -0
  256. package/lib/typescript/module/live/hooks/useRoomAudio.d.ts.map +1 -0
  257. package/lib/typescript/module/live/hooks/useRoomConnection.d.ts +29 -0
  258. package/lib/typescript/module/live/hooks/useRoomConnection.d.ts.map +1 -0
  259. package/lib/typescript/module/live/hooks/useRoomManager.d.ts +11 -0
  260. package/lib/typescript/module/live/hooks/useRoomManager.d.ts.map +1 -0
  261. package/lib/typescript/module/live/hooks/useRoomUsers.d.ts +5 -0
  262. package/lib/typescript/module/live/hooks/useRoomUsers.d.ts.map +1 -0
  263. package/lib/typescript/module/live/index.d.ts +25 -0
  264. package/lib/typescript/module/live/index.d.ts.map +1 -0
  265. package/lib/typescript/module/live/services/livekitService.d.ts +7 -0
  266. package/lib/typescript/module/live/services/livekitService.d.ts.map +1 -0
  267. package/lib/typescript/module/live/services/spaceSocketService.d.ts +69 -0
  268. package/lib/typescript/module/live/services/spaceSocketService.d.ts.map +1 -0
  269. package/lib/typescript/module/live/services/spacesService.d.ts +181 -0
  270. package/lib/typescript/module/live/services/spacesService.d.ts.map +1 -0
  271. package/lib/typescript/module/live/types.d.ts +100 -0
  272. package/lib/typescript/module/live/types.d.ts.map +1 -0
  273. package/lib/typescript/module/live/validation.d.ts +658 -0
  274. package/lib/typescript/module/live/validation.d.ts.map +1 -0
  275. package/lib/typescript/module/package.json +1 -0
  276. package/lib/typescript/module/schema.d.ts +1072 -0
  277. package/lib/typescript/module/schema.d.ts.map +1 -0
  278. package/package.json +123 -21
  279. package/src/index.native.ts +2 -0
  280. package/src/live/assets/icons/spaces-icon.tsx +15 -0
  281. package/src/live/assets/icons/syra-icon.tsx +13 -0
  282. package/src/live/assets/sounds/intro.mp3 +0 -0
  283. package/src/live/colors.ts +57 -0
  284. package/src/live/components/AnimatedPulse.tsx +52 -0
  285. package/src/live/components/AnimatedSpeakerRing.tsx +101 -0
  286. package/src/live/components/CreateRoomSheet.tsx +654 -0
  287. package/src/live/components/InsightsPanel.tsx +202 -0
  288. package/src/live/components/LiveRoomSheet.tsx +970 -0
  289. package/src/live/components/MiniRoomBar.tsx +167 -0
  290. package/src/live/components/PanelHeader.tsx +36 -0
  291. package/src/live/components/PodcastStreamPicker.tsx +1155 -0
  292. package/src/live/components/RecordingCard.tsx +154 -0
  293. package/src/live/components/RecordingsPanel.tsx +252 -0
  294. package/src/live/components/RoomCard.tsx +343 -0
  295. package/src/live/components/StreamConfigModal.tsx +600 -0
  296. package/src/live/components/StreamConfigPanel.tsx +729 -0
  297. package/src/live/context/LiveConfigContext.tsx +96 -0
  298. package/src/live/context/LiveRoomContext.tsx +235 -0
  299. package/src/live/hooks/useActiveSpeakers.ts +39 -0
  300. package/src/live/hooks/useRoomAudio.ts +103 -0
  301. package/src/live/hooks/useRoomConnection.ts +162 -0
  302. package/src/live/hooks/useRoomManager.ts +17 -0
  303. package/src/live/hooks/useRoomUsers.ts +52 -0
  304. package/src/live/index.ts +104 -0
  305. package/src/live/services/livekitService.ts +11 -0
  306. package/src/live/services/spaceSocketService.ts +136 -0
  307. package/src/live/services/spacesService.ts +692 -0
  308. package/src/live/types.ts +119 -0
  309. package/src/live/validation.ts +279 -0
  310. package/dist/cjs/client.js +0 -244
  311. package/dist/cjs/errors.js +0 -16
  312. package/dist/cjs/index.js +0 -15
  313. package/dist/cjs/package.json +0 -3
  314. package/dist/esm/client.js +0 -240
  315. package/dist/esm/errors.js +0 -12
  316. package/dist/esm/index.js +0 -3
  317. package/dist/esm/package.json +0 -3
@@ -0,0 +1,343 @@
1
+ import React, { useMemo } from 'react';
2
+ import { View, Text, TouchableOpacity, StyleProp, ViewStyle } from 'react-native';
3
+ import MaterialCommunityIcons from '@expo/vector-icons/MaterialCommunityIcons';
4
+ import { useAuth } from '@oxyhq/services';
5
+
6
+ import { useLiveConfig } from '../context/LiveConfigContext';
7
+ import { AnimatedPulse } from './AnimatedPulse';
8
+ import { useRoomUsers, getAvatarUrl } from '../hooks/useRoomUsers';
9
+ import { LIVE_COLOR, LIVE_FOREGROUND_COLOR, getRoomTypeMeta, type RoomTypeMeta } from '../colors';
10
+
11
+ // --- Utility helpers ---
12
+
13
+ function formatCompact(num: number): string {
14
+ if (num >= 1_000_000) return `${(num / 1_000_000).toFixed(1).replace(/\.0$/, '')}M`;
15
+ if (num >= 1_000) return `${(num / 1_000).toFixed(1).replace(/\.0$/, '')}k`;
16
+ return String(num);
17
+ }
18
+
19
+ function formatDuration(startedAt: string, endedAt: string): string {
20
+ const ms = new Date(endedAt).getTime() - new Date(startedAt).getTime();
21
+ const totalMin = Math.round(ms / 60_000);
22
+ if (totalMin < 60) return `${totalMin} min`;
23
+ const h = Math.floor(totalMin / 60);
24
+ const m = totalMin % 60;
25
+ return m > 0 ? `${h}h ${m}m` : `${h}h`;
26
+ }
27
+
28
+ const MONTH_SHORT = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
29
+
30
+ function formatDate(dateStr: string): string {
31
+ const d = new Date(dateStr);
32
+ return `${d.getDate()} ${MONTH_SHORT[d.getMonth()]} ${d.getFullYear()}`;
33
+ }
34
+
35
+ function getTimeLabel(room: RoomCardProps['room']): string {
36
+ if (room.status === 'ended' && room.startedAt && room.endedAt) {
37
+ return `${formatDuration(room.startedAt, room.endedAt)} · ${formatDate(room.endedAt)}`;
38
+ }
39
+ if (room.status === 'live' && room.startedAt) {
40
+ return `Live · Started ${formatDate(room.startedAt)}`;
41
+ }
42
+ if (room.status === 'scheduled' && room.scheduledStart) {
43
+ return formatDate(room.scheduledStart);
44
+ }
45
+ if (room.createdAt) {
46
+ return formatDate(room.createdAt);
47
+ }
48
+ return '';
49
+ }
50
+
51
+ // --- Constants ---
52
+
53
+ const MAX_SPEAKER_AVATARS = 4;
54
+ const SPEAKER_AVATAR_SIZE = 44;
55
+
56
+ // --- Types ---
57
+
58
+ interface RoomCardProps {
59
+ room: {
60
+ _id: string;
61
+ title: string;
62
+ status: 'scheduled' | 'live' | 'ended';
63
+ type?: 'talk' | 'stage' | 'broadcast';
64
+ topic?: string | null;
65
+ participants?: string[];
66
+ speakers?: string[];
67
+ host: string;
68
+ houseId?: string | null;
69
+ scheduledStart?: string | null;
70
+ startedAt?: string | null;
71
+ endedAt?: string | null;
72
+ createdAt?: string;
73
+ stats?: { peakListeners?: number; totalJoined?: number };
74
+ };
75
+ onPress?: () => void;
76
+ variant?: 'default' | 'compact';
77
+ house?: { name: string; avatarUrl?: string } | null;
78
+ hostName?: string;
79
+ hostAvatarUri?: string;
80
+ onMenuPress?: () => void;
81
+ onSave?: () => void;
82
+ isSaved?: boolean;
83
+ style?: StyleProp<ViewStyle>;
84
+ }
85
+
86
+ // --- Component ---
87
+
88
+ export const RoomCard: React.FC<RoomCardProps> = ({
89
+ room,
90
+ onPress,
91
+ variant = 'default',
92
+ house,
93
+ hostName: hostNameProp,
94
+ hostAvatarUri: hostAvatarUriProp,
95
+ onMenuPress,
96
+ onSave,
97
+ isSaved,
98
+ style,
99
+ }) => {
100
+ const { useTheme, useUserById, AvatarComponent, getCachedFileDownloadUrlSync } = useLiveConfig();
101
+ const theme = useTheme();
102
+ const { oxyServices } = useAuth();
103
+ const hostProfile = useUserById(room.host);
104
+
105
+ const isLive = room.status === 'live';
106
+ const isScheduled = room.status === 'scheduled';
107
+ const isCompact = variant === 'compact';
108
+
109
+ // Resolve host display: an explicit prop wins, then the @handle, then the
110
+ // canonical API-owned `name.displayName` from the Oxy user DTO (never a
111
+ // recompute from name parts), then a not-yet-resolved userId fallback.
112
+ const hostProfileName = hostProfile?.name;
113
+ const hostName = hostNameProp
114
+ ?? (hostProfile?.username
115
+ ? `@${hostProfile.username}`
116
+ : (typeof hostProfileName === 'object' ? hostProfileName?.displayName : null)
117
+ || room.host?.slice(0, 10)
118
+ || 'Unknown');
119
+ const hostAvatarUri = hostAvatarUriProp ?? getAvatarUrl(hostProfile, oxyServices, getCachedFileDownloadUrlSync);
120
+
121
+ // Resolve speaker avatars (default variant only)
122
+ const speakerIds = useMemo(() => {
123
+ if (isCompact) return [];
124
+ const ids = room.speakers?.length ? room.speakers : [room.host];
125
+ return ids.slice(0, MAX_SPEAKER_AVATARS);
126
+ }, [room.speakers, room.host, isCompact]);
127
+
128
+ useRoomUsers(speakerIds);
129
+
130
+ const typeMeta = getRoomTypeMeta(room.type);
131
+ const listenerCount = room.participants?.length || room.stats?.totalJoined || 0;
132
+ const timeLabel = getTimeLabel(room);
133
+
134
+ // --- Compact variant (post attachments, composer preview) ---
135
+ // It lives inside HORIZONTAL carousels, where a percentage width has no parent
136
+ // to resolve against — hence the intrinsic width, capped at the parent so a
137
+ // constrained host box (the composer preview) can still shrink it. Hosts
138
+ // override any of this through `style`, which wins over the className.
139
+ if (isCompact) {
140
+ return (
141
+ <TouchableOpacity
142
+ className="w-[200px] max-w-full min-h-[140px] justify-between rounded-2xl border border-border bg-surface p-3"
143
+ style={style}
144
+ onPress={onPress}
145
+ activeOpacity={onPress ? 0.7 : 1}
146
+ disabled={!onPress}
147
+ >
148
+ <View className="flex-1">
149
+ {house && (
150
+ <Text
151
+ className="mb-1 text-[9px] font-bold tracking-[0.5px] text-muted-foreground"
152
+ numberOfLines={1}
153
+ >
154
+ {house.name.toUpperCase()}
155
+ </Text>
156
+ )}
157
+ <Text className="text-sm font-semibold leading-[18px] text-foreground" numberOfLines={2}>
158
+ {room.title}
159
+ </Text>
160
+ {(isLive || isScheduled || typeMeta) && (
161
+ <View className="mt-1 flex-row flex-wrap gap-1">
162
+ {isLive && <LiveBadge />}
163
+ {isScheduled && <ScheduledBadge iconSize={10} iconColor={theme.colors.textSecondary} />}
164
+ {typeMeta && <TypeBadge meta={typeMeta} />}
165
+ </View>
166
+ )}
167
+ </View>
168
+ <View className="mt-2 flex-row items-center gap-1">
169
+ <MaterialCommunityIcons name="account-group" size={14} color={theme.colors.textSecondary} />
170
+ <Text className="text-[11px] text-muted-foreground">{listenerCount} listening</Text>
171
+ <Text className="text-[10px] text-muted-foreground">•</Text>
172
+ {hostAvatarUri && (
173
+ <AvatarComponent size={14} source={hostAvatarUri} shape="squircle" style={{ marginRight: 2 }} />
174
+ )}
175
+ <Text className="flex-1 text-[11px] text-muted-foreground" numberOfLines={1}>
176
+ {hostName}
177
+ </Text>
178
+ </View>
179
+ </TouchableOpacity>
180
+ );
181
+ }
182
+
183
+ // --- Default variant: a full-width, flush feed row (hairline divider, no card chrome) ---
184
+ return (
185
+ <TouchableOpacity
186
+ className="w-full gap-2 border-b border-border px-3 py-3"
187
+ style={style}
188
+ onPress={onPress}
189
+ activeOpacity={onPress ? 0.7 : 1}
190
+ disabled={!onPress}
191
+ >
192
+ {/* Section 1: House header + menu */}
193
+ {(house || onMenuPress) && (
194
+ <View className="flex-row items-center gap-1.5">
195
+ {house && (
196
+ <>
197
+ <MaterialCommunityIcons name="home" size={14} color={theme.colors.primary} />
198
+ <Text
199
+ className="text-[11px] font-bold tracking-[0.5px] text-muted-foreground"
200
+ numberOfLines={1}
201
+ >
202
+ {house.name.toUpperCase()}
203
+ </Text>
204
+ </>
205
+ )}
206
+ <View className="flex-1" />
207
+ {onMenuPress && (
208
+ <TouchableOpacity onPress={onMenuPress} hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }}>
209
+ <MaterialCommunityIcons name="dots-horizontal" size={20} color={theme.colors.textSecondary} />
210
+ </TouchableOpacity>
211
+ )}
212
+ </View>
213
+ )}
214
+
215
+ {/* Section 2: Title + status badges */}
216
+ <View>
217
+ <Text className="text-[17px] font-bold leading-[22px] text-foreground" numberOfLines={2}>
218
+ {room.title}
219
+ </Text>
220
+ {(isLive || isScheduled || typeMeta) && (
221
+ <View className="mt-1.5 flex-row flex-wrap items-center gap-1.5">
222
+ {isLive && <LiveBadge />}
223
+ {isScheduled && <ScheduledBadge iconColor={theme.colors.textSecondary} />}
224
+ {typeMeta && <TypeBadge meta={typeMeta} />}
225
+ </View>
226
+ )}
227
+ </View>
228
+
229
+ {/* Section 3: Speaker avatars + listener count */}
230
+ <SpeakerRow speakerIds={speakerIds} listenerCount={listenerCount} />
231
+
232
+ {/* Section 4: Metadata + save */}
233
+ {(timeLabel || onSave) && (
234
+ <View className="flex-row items-center justify-between">
235
+ {timeLabel ? (
236
+ <Text className="text-[13px] text-muted-foreground">{timeLabel}</Text>
237
+ ) : (
238
+ <View />
239
+ )}
240
+ {onSave && (
241
+ <TouchableOpacity
242
+ className="flex-row items-center gap-1"
243
+ onPress={onSave}
244
+ hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }}
245
+ >
246
+ <MaterialCommunityIcons
247
+ name={isSaved ? 'bookmark' : 'bookmark-outline'}
248
+ size={18}
249
+ color={isSaved ? theme.colors.primary : theme.colors.textSecondary}
250
+ />
251
+ <Text
252
+ className={
253
+ isSaved
254
+ ? 'text-[13px] font-medium text-primary'
255
+ : 'text-[13px] font-medium text-muted-foreground'
256
+ }
257
+ >
258
+ Save
259
+ </Text>
260
+ </TouchableOpacity>
261
+ )}
262
+ </View>
263
+ )}
264
+ </TouchableOpacity>
265
+ );
266
+ };
267
+
268
+ // --- Badges ---
269
+
270
+ // The LIVE badge is the one surface that must NOT theme with the host: it is the
271
+ // brand's "on air" signal, so its red comes from the shared live palette and its
272
+ // content sits on white regardless of light/dark mode.
273
+ function LiveBadge() {
274
+ return (
275
+ <View
276
+ className="flex-row items-center gap-1 rounded-[4px] px-2 py-1"
277
+ style={{ backgroundColor: LIVE_COLOR }}
278
+ >
279
+ <AnimatedPulse size={6} color={LIVE_FOREGROUND_COLOR} />
280
+ <Text className="text-[10px] font-bold text-white">LIVE</Text>
281
+ </View>
282
+ );
283
+ }
284
+
285
+ function ScheduledBadge({ iconSize = 12, iconColor }: { iconSize?: number; iconColor: string }) {
286
+ return (
287
+ <View className="flex-row items-center gap-1 rounded-[4px] bg-muted px-2 py-1">
288
+ <MaterialCommunityIcons name="calendar" size={iconSize} color={iconColor} />
289
+ <Text className="text-[10px] font-bold text-muted-foreground">SCHEDULED</Text>
290
+ </View>
291
+ );
292
+ }
293
+
294
+ function TypeBadge({ meta }: { meta: RoomTypeMeta }) {
295
+ return (
296
+ <View
297
+ className="flex-row items-center gap-0.5 rounded-[4px] px-1.5 py-0.5"
298
+ style={{ backgroundColor: meta.tintColor }}
299
+ >
300
+ <MaterialCommunityIcons name={meta.icon} size={10} color={meta.color} />
301
+ <Text className="text-[9px] font-bold" style={{ color: meta.color }}>
302
+ {meta.label}
303
+ </Text>
304
+ </View>
305
+ );
306
+ }
307
+
308
+ // --- Speaker row sub-component ---
309
+
310
+ function SpeakerRow({ speakerIds, listenerCount }: { speakerIds: string[]; listenerCount: number }) {
311
+ return (
312
+ <View className="flex-row items-center gap-2">
313
+ {speakerIds.map((id) => (
314
+ <SpeakerAvatar key={id} userId={id} />
315
+ ))}
316
+ {listenerCount > 0 && (
317
+ <View
318
+ className="items-center justify-center rounded-[14px] border-2 border-border bg-muted"
319
+ style={{ width: SPEAKER_AVATAR_SIZE + 4, height: SPEAKER_AVATAR_SIZE + 4 }}
320
+ >
321
+ <Text className="text-sm font-bold text-muted-foreground">
322
+ +{formatCompact(listenerCount)}
323
+ </Text>
324
+ </View>
325
+ )}
326
+ </View>
327
+ );
328
+ }
329
+
330
+ function SpeakerAvatar({ userId }: { userId: string }) {
331
+ const { useUserById, AvatarComponent, getCachedFileDownloadUrlSync } = useLiveConfig();
332
+ const { oxyServices } = useAuth();
333
+ const profile = useUserById(userId);
334
+ const avatarUri = getAvatarUrl(profile, oxyServices, getCachedFileDownloadUrlSync);
335
+
336
+ return (
337
+ <View className="rounded-[14px] border-2 border-border p-0.5">
338
+ <AvatarComponent size={SPEAKER_AVATAR_SIZE} source={avatarUri} shape="squircle" />
339
+ </View>
340
+ );
341
+ }
342
+
343
+ export default RoomCard;