@q9labsai/chalk-react-native 4.1.17 → 5.0.1

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 (544) hide show
  1. package/README.md +134 -29
  2. package/android/build.gradle +35 -0
  3. package/android/compatibility/ModuleApiCompatibility.java +215 -0
  4. package/android/src/main/AndroidManifest.xml +2 -1
  5. package/android/src/main/java/ai/q9labs/chalk/reactnative/ChalkSpaceForegroundService.java +105 -31
  6. package/android/src/main/kotlin/ai/q9labs/chalk/reactnative/ChalkAndroidConnectionServicePackage.kt +2 -0
  7. package/android/src/main/kotlin/ai/q9labs/chalk/reactnative/ChalkAudioRouteModule.kt +137 -0
  8. package/android/src/main/kotlin/ai/q9labs/chalk/reactnative/ChalkCallServiceModule.kt +32 -0
  9. package/android/src/main/kotlin/ai/q9labs/chalk/reactnative/CommunicationDeviceListener.kt +23 -0
  10. package/android/src/test/kotlin/ai/q9labs/chalk/compatibility/UnsafeSignatures.kt +29 -0
  11. package/dist/android/call-service.d.ts +4 -0
  12. package/dist/android/call-service.d.ts.map +1 -0
  13. package/dist/avatar/FaceAvatar.d.ts +19 -0
  14. package/dist/avatar/FaceAvatar.d.ts.map +1 -0
  15. package/dist/avatar/tile-avatar-size.d.ts +3 -0
  16. package/dist/avatar/tile-avatar-size.d.ts.map +1 -0
  17. package/dist/chunk-GYVZSOGQ.js +30 -0
  18. package/dist/chunk-IHE6EA3T.js +25 -0
  19. package/dist/chunk-OIBT2FNM.js +1479 -0
  20. package/dist/client.d.ts +1 -5
  21. package/dist/client.d.ts.map +1 -1
  22. package/dist/client.js +185 -2
  23. package/dist/components/EmbeddedWhiteboard.d.ts.map +1 -1
  24. package/dist/components/native-media-visibility.d.ts +3 -2
  25. package/dist/components/native-media-visibility.d.ts.map +1 -1
  26. package/dist/components/useAndroidCallService.d.ts +8 -0
  27. package/dist/components/useAndroidCallService.d.ts.map +1 -0
  28. package/dist/dev.d.ts +10 -0
  29. package/dist/dev.d.ts.map +1 -0
  30. package/dist/dev.js +10 -0
  31. package/dist/dock/Dock.d.ts +23 -0
  32. package/dist/dock/Dock.d.ts.map +1 -0
  33. package/dist/dock/LeaveMenu.d.ts +12 -0
  34. package/dist/dock/LeaveMenu.d.ts.map +1 -0
  35. package/dist/dock/MoreSheet.d.ts +17 -0
  36. package/dist/dock/MoreSheet.d.ts.map +1 -0
  37. package/dist/dock/ReactionBurst.d.ts +8 -0
  38. package/dist/dock/ReactionBurst.d.ts.map +1 -0
  39. package/dist/dock/RoutePicker.d.ts +16 -0
  40. package/dist/dock/RoutePicker.d.ts.map +1 -0
  41. package/dist/dock/audio-route.d.ts +25 -0
  42. package/dist/dock/audio-route.d.ts.map +1 -0
  43. package/dist/error-YOPTEH5N.wav +0 -0
  44. package/dist/frame/CallFrame.d.ts +17 -0
  45. package/dist/frame/CallFrame.d.ts.map +1 -0
  46. package/dist/frame/Chalk.d.ts +40 -0
  47. package/dist/frame/Chalk.d.ts.map +1 -0
  48. package/dist/frame/back-handler.d.ts +6 -0
  49. package/dist/frame/back-handler.d.ts.map +1 -0
  50. package/dist/frame/dev-scenario.d.ts +28 -0
  51. package/dist/frame/dev-scenario.d.ts.map +1 -0
  52. package/dist/frame/device-layout.d.ts +16 -0
  53. package/dist/frame/device-layout.d.ts.map +1 -0
  54. package/dist/frame/measurement.d.ts +28 -0
  55. package/dist/frame/measurement.d.ts.map +1 -0
  56. package/dist/frame/portal.d.ts +24 -0
  57. package/dist/frame/portal.d.ts.map +1 -0
  58. package/dist/frame/preferences.d.ts +21 -0
  59. package/dist/frame/preferences.d.ts.map +1 -0
  60. package/dist/frame/regions.d.ts +25 -0
  61. package/dist/frame/regions.d.ts.map +1 -0
  62. package/dist/hand-DFWVXPH2.wav +0 -0
  63. package/dist/haptics/haptics.d.ts +12 -0
  64. package/dist/haptics/haptics.d.ts.map +1 -0
  65. package/dist/header/CallDetailsSheet.d.ts +18 -0
  66. package/dist/header/CallDetailsSheet.d.ts.map +1 -0
  67. package/dist/header/Header.d.ts +17 -0
  68. package/dist/header/Header.d.ts.map +1 -0
  69. package/dist/header/QrCode.d.ts +6 -0
  70. package/dist/header/QrCode.d.ts.map +1 -0
  71. package/dist/icons/Icon.d.ts +12 -0
  72. package/dist/icons/Icon.d.ts.map +1 -0
  73. package/dist/icons/icon-element.d.ts +24 -0
  74. package/dist/icons/icon-element.d.ts.map +1 -0
  75. package/dist/icons/icon-paths.d.ts +530 -0
  76. package/dist/icons/icon-paths.d.ts.map +1 -0
  77. package/dist/index.d.ts +6 -9
  78. package/dist/index.d.ts.map +1 -1
  79. package/dist/index.js +2956 -38
  80. package/dist/join-Z6RL5AHE.wav +0 -0
  81. package/dist/knock-4VBQSHK4.wav +0 -0
  82. package/dist/leave-MQLZOWQD.wav +0 -0
  83. package/dist/limbo/Limbo.d.ts +25 -0
  84. package/dist/limbo/Limbo.d.ts.map +1 -0
  85. package/dist/limbo/Veil.d.ts +10 -0
  86. package/dist/limbo/Veil.d.ts.map +1 -0
  87. package/dist/media/native-capture-error.d.ts +7 -0
  88. package/dist/media/native-capture-error.d.ts.map +1 -0
  89. package/dist/message-6Y6WJGTB.wav +0 -0
  90. package/dist/motion/MovingFrame.d.ts +36 -0
  91. package/dist/motion/MovingFrame.d.ts.map +1 -0
  92. package/dist/motion/motion.d.ts +82 -0
  93. package/dist/motion/motion.d.ts.map +1 -0
  94. package/dist/motion/presence.d.ts +6 -0
  95. package/dist/motion/presence.d.ts.map +1 -0
  96. package/dist/motion/press.d.ts +15 -0
  97. package/dist/motion/press.d.ts.map +1 -0
  98. package/dist/mute-H5SJFXVI.wav +0 -0
  99. package/dist/primitives/BottomSheet.d.ts +36 -0
  100. package/dist/primitives/BottomSheet.d.ts.map +1 -0
  101. package/dist/primitives/ChalkText.d.ts +13 -0
  102. package/dist/primitives/ChalkText.d.ts.map +1 -0
  103. package/dist/primitives/CopyButton.d.ts +11 -0
  104. package/dist/primitives/CopyButton.d.ts.map +1 -0
  105. package/dist/primitives/IconButton.d.ts +26 -0
  106. package/dist/primitives/IconButton.d.ts.map +1 -0
  107. package/dist/primitives/Menu.d.ts +39 -0
  108. package/dist/primitives/Menu.d.ts.map +1 -0
  109. package/dist/primitives/NameTag.d.ts +19 -0
  110. package/dist/primitives/NameTag.d.ts.map +1 -0
  111. package/dist/primitives/PillButton.d.ts +19 -0
  112. package/dist/primitives/PillButton.d.ts.map +1 -0
  113. package/dist/primitives/SegmentedControl.d.ts +17 -0
  114. package/dist/primitives/SegmentedControl.d.ts.map +1 -0
  115. package/dist/primitives/SheetGroup.d.ts +24 -0
  116. package/dist/primitives/SheetGroup.d.ts.map +1 -0
  117. package/dist/primitives/Switch.d.ts +9 -0
  118. package/dist/primitives/Switch.d.ts.map +1 -0
  119. package/dist/primitives/TileShell.d.ts +18 -0
  120. package/dist/primitives/TileShell.d.ts.map +1 -0
  121. package/dist/primitives/announce.d.ts +3 -0
  122. package/dist/primitives/announce.d.ts.map +1 -0
  123. package/dist/primitives/menu-placement.d.ts +32 -0
  124. package/dist/primitives/menu-placement.d.ts.map +1 -0
  125. package/dist/primitives/toast/Toast.d.ts +8 -0
  126. package/dist/primitives/toast/Toast.d.ts.map +1 -0
  127. package/dist/primitives/toast/ToastStack.d.ts +18 -0
  128. package/dist/primitives/toast/ToastStack.d.ts.map +1 -0
  129. package/dist/primitives/toast/toast-store.d.ts +39 -0
  130. package/dist/primitives/toast/toast-store.d.ts.map +1 -0
  131. package/dist/recording-Q4GB77Y4.wav +0 -0
  132. package/dist/sheets/people-chat/ChatNotices.d.ts +14 -0
  133. package/dist/sheets/people-chat/ChatNotices.d.ts.map +1 -0
  134. package/dist/sheets/people-chat/ChatTab.d.ts +6 -0
  135. package/dist/sheets/people-chat/ChatTab.d.ts.map +1 -0
  136. package/dist/sheets/people-chat/Composer.d.ts +7 -0
  137. package/dist/sheets/people-chat/Composer.d.ts.map +1 -0
  138. package/dist/sheets/people-chat/PeopleChatSheet.d.ts +17 -0
  139. package/dist/sheets/people-chat/PeopleChatSheet.d.ts.map +1 -0
  140. package/dist/sheets/people-chat/PeopleTab.d.ts +3 -0
  141. package/dist/sheets/people-chat/PeopleTab.d.ts.map +1 -0
  142. package/dist/sheets/people-chat/PhotoViewer.d.ts +19 -0
  143. package/dist/sheets/people-chat/PhotoViewer.d.ts.map +1 -0
  144. package/dist/sheets/people-chat/TextField.d.ts +4 -0
  145. package/dist/sheets/people-chat/TextField.d.ts.map +1 -0
  146. package/dist/sheets/people-chat/attachments.d.ts +33 -0
  147. package/dist/sheets/people-chat/attachments.d.ts.map +1 -0
  148. package/dist/sheets/people-chat/chat-model.d.ts +64 -0
  149. package/dist/sheets/people-chat/chat-model.d.ts.map +1 -0
  150. package/dist/sheets/people-chat/people-model.d.ts +43 -0
  151. package/dist/sheets/people-chat/people-model.d.ts.map +1 -0
  152. package/dist/sounds/sounds.d.ts +33 -0
  153. package/dist/sounds/sounds.d.ts.map +1 -0
  154. package/dist/space-client/create-native-space-client.d.ts +0 -4
  155. package/dist/space-client/create-native-space-client.d.ts.map +1 -1
  156. package/dist/space-client/random-uuid.d.ts +7 -0
  157. package/dist/space-client/random-uuid.d.ts.map +1 -0
  158. package/dist/stage/ContentTile.d.ts +18 -0
  159. package/dist/stage/ContentTile.d.ts.map +1 -0
  160. package/dist/stage/ParticipantTile.d.ts +18 -0
  161. package/dist/stage/ParticipantTile.d.ts.map +1 -0
  162. package/dist/stage/Stage.d.ts +14 -0
  163. package/dist/stage/Stage.d.ts.map +1 -0
  164. package/dist/stage/TileSheet.d.ts +12 -0
  165. package/dist/stage/TileSheet.d.ts.map +1 -0
  166. package/dist/stage/camera.d.ts +7 -0
  167. package/dist/stage/camera.d.ts.map +1 -0
  168. package/dist/stage/layout.d.ts +57 -0
  169. package/dist/stage/layout.d.ts.map +1 -0
  170. package/dist/stage/space-selector.d.ts +10 -0
  171. package/dist/stage/space-selector.d.ts.map +1 -0
  172. package/dist/stage/stage-view.d.ts +23 -0
  173. package/dist/stage/stage-view.d.ts.map +1 -0
  174. package/dist/status/CallOverlays.d.ts +17 -0
  175. package/dist/status/CallOverlays.d.ts.map +1 -0
  176. package/dist/status/ChalkArrival.d.ts +24 -0
  177. package/dist/status/ChalkArrival.d.ts.map +1 -0
  178. package/dist/status/StatusPage.d.ts +14 -0
  179. package/dist/status/StatusPage.d.ts.map +1 -0
  180. package/dist/status/call-screen.d.ts +20 -0
  181. package/dist/status/call-screen.d.ts.map +1 -0
  182. package/dist/test-VD2KAM4D.wav +0 -0
  183. package/dist/theme/theme.d.ts +15 -0
  184. package/dist/theme/theme.d.ts.map +1 -0
  185. package/dist/theme/tokens.d.ts +248 -0
  186. package/dist/theme/tokens.d.ts.map +1 -0
  187. package/dist/toasts/CallEventToasts.d.ts +21 -0
  188. package/dist/toasts/CallEventToasts.d.ts.map +1 -0
  189. package/dist/toasts/notices.d.ts +34 -0
  190. package/dist/toasts/notices.d.ts.map +1 -0
  191. package/dist/ui/ChalkUI.d.ts +12 -0
  192. package/dist/ui/ChalkUI.d.ts.map +1 -0
  193. package/dist/ui.d.ts +25 -0
  194. package/dist/ui.d.ts.map +1 -0
  195. package/dist/ui.js +77 -0
  196. package/dist/unmute-2XR2LICU.wav +0 -0
  197. package/embedded/chalk-whiteboard/asset-manifest.json +2 -2
  198. package/embedded/chalk-whiteboard/renderer.js +510 -510
  199. package/ios/ChalkAudioRouteModule.swift +93 -0
  200. package/ios/ChalkAudioRouteModuleBridge.m +9 -0
  201. package/package.json +46 -76
  202. package/src/android/call-service.ts +19 -0
  203. package/src/avatar/FaceAvatar.tsx +145 -0
  204. package/src/avatar/tile-avatar-size.ts +4 -0
  205. package/src/client.ts +1 -5
  206. package/src/components/EmbeddedWhiteboard.tsx +14 -71
  207. package/src/components/native-media-visibility.ts +1 -2
  208. package/src/components/useAndroidCallService.ts +41 -0
  209. package/src/dev.ts +9 -0
  210. package/src/dock/Dock.tsx +95 -0
  211. package/src/dock/LeaveMenu.tsx +21 -0
  212. package/src/dock/MoreSheet.tsx +233 -0
  213. package/src/dock/ReactionBurst.tsx +55 -0
  214. package/src/dock/RoutePicker.tsx +42 -0
  215. package/src/dock/audio-route.ts +69 -0
  216. package/src/frame/CallFrame.tsx +209 -0
  217. package/src/frame/Chalk.tsx +83 -0
  218. package/src/frame/back-handler.ts +19 -0
  219. package/src/frame/dev-scenario.ts +48 -0
  220. package/src/frame/device-layout.tsx +31 -0
  221. package/src/frame/measurement.ts +44 -0
  222. package/src/frame/portal.tsx +107 -0
  223. package/src/frame/preferences.tsx +48 -0
  224. package/src/frame/regions.test.ts +38 -0
  225. package/src/frame/regions.ts +60 -0
  226. package/src/haptics/haptics.ts +19 -0
  227. package/src/header/CallDetailsSheet.tsx +139 -0
  228. package/src/header/Header.tsx +107 -0
  229. package/src/header/QrCode.tsx +34 -0
  230. package/src/icons/Icon.tsx +35 -0
  231. package/src/icons/icon-element.ts +11 -0
  232. package/src/icons/icon-paths.ts +199 -0
  233. package/src/index.ts +6 -9
  234. package/src/limbo/Limbo.tsx +159 -0
  235. package/src/limbo/Veil.tsx +36 -0
  236. package/src/media/native-capture-error.test.ts +19 -0
  237. package/src/media/native-capture-error.ts +13 -0
  238. package/src/motion/MovingFrame.tsx +101 -0
  239. package/src/motion/motion.ts +33 -0
  240. package/src/motion/presence.ts +20 -0
  241. package/src/motion/press.ts +35 -0
  242. package/src/primitives/BottomSheet.tsx +211 -0
  243. package/src/primitives/ChalkText.tsx +23 -0
  244. package/src/primitives/CopyButton.tsx +78 -0
  245. package/src/primitives/IconButton.tsx +90 -0
  246. package/src/primitives/Menu.tsx +212 -0
  247. package/src/primitives/NameTag.tsx +68 -0
  248. package/src/primitives/PillButton.tsx +56 -0
  249. package/src/primitives/SegmentedControl.tsx +55 -0
  250. package/src/primitives/SheetGroup.tsx +72 -0
  251. package/src/primitives/Switch.tsx +39 -0
  252. package/src/primitives/TileShell.tsx +53 -0
  253. package/src/primitives/announce.ts +7 -0
  254. package/src/primitives/menu-placement.test.ts +50 -0
  255. package/src/primitives/menu-placement.ts +43 -0
  256. package/src/primitives/toast/Toast.tsx +50 -0
  257. package/src/primitives/toast/ToastStack.tsx +89 -0
  258. package/src/primitives/toast/toast-store.ts +86 -0
  259. package/src/sheets/people-chat/ChatNotices.tsx +69 -0
  260. package/src/sheets/people-chat/ChatTab.tsx +186 -0
  261. package/src/sheets/people-chat/Composer.tsx +182 -0
  262. package/src/sheets/people-chat/PeopleChatSheet.tsx +100 -0
  263. package/src/sheets/people-chat/PeopleTab.tsx +326 -0
  264. package/src/sheets/people-chat/PhotoViewer.tsx +132 -0
  265. package/src/sheets/people-chat/TextField.tsx +14 -0
  266. package/src/sheets/people-chat/attachments.tsx +183 -0
  267. package/src/sheets/people-chat/chat-model.ts +157 -0
  268. package/src/sheets/people-chat/people-chat-model.test.ts +98 -0
  269. package/src/sheets/people-chat/people-model.ts +68 -0
  270. package/src/sounds/assets/error.wav +0 -0
  271. package/src/sounds/assets/hand.wav +0 -0
  272. package/src/sounds/assets/join.wav +0 -0
  273. package/src/sounds/assets/knock.wav +0 -0
  274. package/src/sounds/assets/leave.wav +0 -0
  275. package/src/sounds/assets/message.wav +0 -0
  276. package/src/sounds/assets/mute.wav +0 -0
  277. package/src/sounds/assets/recording.wav +0 -0
  278. package/src/sounds/assets/test.wav +0 -0
  279. package/src/sounds/assets/unmute.wav +0 -0
  280. package/src/sounds/assets.d.ts +5 -0
  281. package/src/sounds/sounds.ts +50 -0
  282. package/src/space-client/create-native-space-client.ts +20 -181
  283. package/src/space-client/random-uuid.ts +17 -0
  284. package/src/space-client/whiteboard-watchdog.test.ts +23 -0
  285. package/src/stage/ContentTile.tsx +100 -0
  286. package/src/stage/ParticipantTile.tsx +140 -0
  287. package/src/stage/Stage.tsx +152 -0
  288. package/src/stage/TileSheet.tsx +116 -0
  289. package/src/stage/camera.ts +20 -0
  290. package/src/stage/layout.test.ts +77 -0
  291. package/src/stage/layout.ts +226 -0
  292. package/src/stage/space-selector.ts +31 -0
  293. package/src/stage/stage-view.tsx +68 -0
  294. package/src/status/CallOverlays.tsx +47 -0
  295. package/src/status/ChalkArrival.tsx +53 -0
  296. package/src/status/StatusPage.tsx +123 -0
  297. package/src/status/call-screen.test.ts +42 -0
  298. package/src/status/call-screen.ts +29 -0
  299. package/src/theme/theme.tsx +28 -0
  300. package/src/theme/tokens.ts +247 -0
  301. package/src/toasts/CallEventToasts.tsx +192 -0
  302. package/src/toasts/notices.test.ts +92 -0
  303. package/src/toasts/notices.ts +62 -0
  304. package/src/ui/ChalkUI.tsx +49 -0
  305. package/src/ui.ts +24 -0
  306. package/dist/android.d.ts +0 -2
  307. package/dist/android.d.ts.map +0 -1
  308. package/dist/android.js +0 -62
  309. package/dist/chunk-2OS7SSXE.js +0 -552
  310. package/dist/chunk-5DQ4KBRH.js +0 -690
  311. package/dist/chunk-ITLUHTVS.js +0 -5271
  312. package/dist/chunk-JB4LNWVP.js +0 -247
  313. package/dist/components/Chalk.d.ts +0 -79
  314. package/dist/components/Chalk.d.ts.map +0 -1
  315. package/dist/components/ChatMessageList.d.ts +0 -11
  316. package/dist/components/ChatMessageList.d.ts.map +0 -1
  317. package/dist/components/Entrance.d.ts +0 -22
  318. package/dist/components/Entrance.d.ts.map +0 -1
  319. package/dist/components/EntranceView.android.d.ts +0 -4
  320. package/dist/components/EntranceView.android.d.ts.map +0 -1
  321. package/dist/components/EntranceView.d.ts +0 -18
  322. package/dist/components/EntranceView.d.ts.map +0 -1
  323. package/dist/components/EntranceView.ios-pad.d.ts +0 -3
  324. package/dist/components/EntranceView.ios-pad.d.ts.map +0 -1
  325. package/dist/components/EntranceView.ios-phone.d.ts +0 -3
  326. package/dist/components/EntranceView.ios-phone.d.ts.map +0 -1
  327. package/dist/components/EntranceView.macos.d.ts +0 -4
  328. package/dist/components/EntranceView.macos.d.ts.map +0 -1
  329. package/dist/components/FaceAvatar.d.ts +0 -16
  330. package/dist/components/FaceAvatar.d.ts.map +0 -1
  331. package/dist/components/GradientSurface.d.ts +0 -14
  332. package/dist/components/GradientSurface.d.ts.map +0 -1
  333. package/dist/components/MediaView.d.ts +0 -14
  334. package/dist/components/MediaView.d.ts.map +0 -1
  335. package/dist/components/ReactionPicker.d.ts +0 -10
  336. package/dist/components/ReactionPicker.d.ts.map +0 -1
  337. package/dist/components/SpaceView.android.d.ts +0 -2
  338. package/dist/components/SpaceView.android.d.ts.map +0 -1
  339. package/dist/components/SpaceView.d.ts +0 -33
  340. package/dist/components/SpaceView.d.ts.map +0 -1
  341. package/dist/components/SpaceView.ios-pad.d.ts +0 -2
  342. package/dist/components/SpaceView.ios-pad.d.ts.map +0 -1
  343. package/dist/components/SpaceView.ios-phone.d.ts +0 -2
  344. package/dist/components/SpaceView.ios-phone.d.ts.map +0 -1
  345. package/dist/components/SpaceView.macos.d.ts +0 -2
  346. package/dist/components/SpaceView.macos.d.ts.map +0 -1
  347. package/dist/components/SpaceView.shared.d.ts +0 -3
  348. package/dist/components/SpaceView.shared.d.ts.map +0 -1
  349. package/dist/components/episode-diagnostic-render-observer.d.ts +0 -2
  350. package/dist/components/episode-diagnostic-render-observer.d.ts.map +0 -1
  351. package/dist/components/logo/Logo.d.ts +0 -11
  352. package/dist/components/logo/Logo.d.ts.map +0 -1
  353. package/dist/components/native-animation-controller.d.ts +0 -7
  354. package/dist/components/native-animation-controller.d.ts.map +0 -1
  355. package/dist/components/native-chat.d.ts +0 -8
  356. package/dist/components/native-chat.d.ts.map +0 -1
  357. package/dist/components/native-entrance/entrance-controller-store.d.ts +0 -34
  358. package/dist/components/native-entrance/entrance-controller-store.d.ts.map +0 -1
  359. package/dist/components/native-entrance/useEntranceController.d.ts +0 -19
  360. package/dist/components/native-entrance/useEntranceController.d.ts.map +0 -1
  361. package/dist/components/native-joining-loading-animation.d.ts +0 -9
  362. package/dist/components/native-joining-loading-animation.d.ts.map +0 -1
  363. package/dist/components/native-space-view/AppearanceSettings.d.ts +0 -2
  364. package/dist/components/native-space-view/AppearanceSettings.d.ts.map +0 -1
  365. package/dist/components/native-space-view/FeedbackSheet.d.ts +0 -12
  366. package/dist/components/native-space-view/FeedbackSheet.d.ts.map +0 -1
  367. package/dist/components/native-space-view/ParticipantActionSheet.d.ts +0 -9
  368. package/dist/components/native-space-view/ParticipantActionSheet.d.ts.map +0 -1
  369. package/dist/components/native-space-view/SettingsSheet.d.ts +0 -7
  370. package/dist/components/native-space-view/SettingsSheet.d.ts.map +0 -1
  371. package/dist/components/native-space-view/SpaceActionMenu.d.ts +0 -10
  372. package/dist/components/native-space-view/SpaceActionMenu.d.ts.map +0 -1
  373. package/dist/components/native-space-view/SpaceBottomDock.android.d.ts +0 -4
  374. package/dist/components/native-space-view/SpaceBottomDock.android.d.ts.map +0 -1
  375. package/dist/components/native-space-view/SpaceChatAttachment.d.ts +0 -8
  376. package/dist/components/native-space-view/SpaceChatAttachment.d.ts.map +0 -1
  377. package/dist/components/native-space-view/SpaceChatSheet.d.ts +0 -5
  378. package/dist/components/native-space-view/SpaceChatSheet.d.ts.map +0 -1
  379. package/dist/components/native-space-view/SpaceGrid.android.d.ts +0 -8
  380. package/dist/components/native-space-view/SpaceGrid.android.d.ts.map +0 -1
  381. package/dist/components/native-space-view/SpaceMoreSheet.d.ts +0 -7
  382. package/dist/components/native-space-view/SpaceMoreSheet.d.ts.map +0 -1
  383. package/dist/components/native-space-view/SpacePanelSheet.d.ts +0 -5
  384. package/dist/components/native-space-view/SpacePanelSheet.d.ts.map +0 -1
  385. package/dist/components/native-space-view/SpacePeopleSheet.d.ts +0 -5
  386. package/dist/components/native-space-view/SpacePeopleSheet.d.ts.map +0 -1
  387. package/dist/components/native-space-view/SpaceStage.android.d.ts +0 -29
  388. package/dist/components/native-space-view/SpaceStage.android.d.ts.map +0 -1
  389. package/dist/components/native-space-view/SpaceSurfacePrimitives.d.ts +0 -30
  390. package/dist/components/native-space-view/SpaceSurfacePrimitives.d.ts.map +0 -1
  391. package/dist/components/native-space-view/SpaceTopBar.android.d.ts +0 -11
  392. package/dist/components/native-space-view/SpaceTopBar.android.d.ts.map +0 -1
  393. package/dist/components/native-space-view/SpaceWhiteboardSurface.d.ts +0 -15
  394. package/dist/components/native-space-view/SpaceWhiteboardSurface.d.ts.map +0 -1
  395. package/dist/components/native-space-view/diagnostics.d.ts +0 -48
  396. package/dist/components/native-space-view/diagnostics.d.ts.map +0 -1
  397. package/dist/components/native-space-view/format-space-duration.d.ts +0 -2
  398. package/dist/components/native-space-view/format-space-duration.d.ts.map +0 -1
  399. package/dist/components/native-space-view/native-space-grid-keys.d.ts +0 -3
  400. package/dist/components/native-space-view/native-space-grid-keys.d.ts.map +0 -1
  401. package/dist/components/native-space-view/native-space-page-store.d.ts +0 -8
  402. package/dist/components/native-space-view/native-space-page-store.d.ts.map +0 -1
  403. package/dist/components/native-space-view/space-chat-attachments.d.ts +0 -15
  404. package/dist/components/native-space-view/space-chat-attachments.d.ts.map +0 -1
  405. package/dist/components/native-space-view/space-panel-layout.d.ts +0 -10
  406. package/dist/components/native-space-view/space-panel-layout.d.ts.map +0 -1
  407. package/dist/components/native-space-view/space-progressive-surface-helpers.d.ts +0 -16
  408. package/dist/components/native-space-view/space-progressive-surface-helpers.d.ts.map +0 -1
  409. package/dist/components/native-space-view/space-progressive-surface-types.d.ts +0 -3
  410. package/dist/components/native-space-view/space-progressive-surface-types.d.ts.map +0 -1
  411. package/dist/components/native-space-view/types.d.ts +0 -24
  412. package/dist/components/native-space-view/types.d.ts.map +0 -1
  413. package/dist/components/native-space-view/useSpaceViewController.contract.d.ts +0 -41
  414. package/dist/components/native-space-view/useSpaceViewController.contract.d.ts.map +0 -1
  415. package/dist/components/native-space-view/useSpaceViewController.d.ts +0 -156
  416. package/dist/components/native-space-view/useSpaceViewController.d.ts.map +0 -1
  417. package/dist/components/native-space-view/useSpaceViewDerived.d.ts +0 -12
  418. package/dist/components/native-space-view/useSpaceViewDerived.d.ts.map +0 -1
  419. package/dist/components/native-space-view/useSpaceViewPanels.d.ts +0 -70
  420. package/dist/components/native-space-view/useSpaceViewPanels.d.ts.map +0 -1
  421. package/dist/feedback/native-capture.d.ts +0 -9
  422. package/dist/feedback/native-capture.d.ts.map +0 -1
  423. package/dist/feedback/native-evidence.d.ts +0 -3
  424. package/dist/feedback/native-evidence.d.ts.map +0 -1
  425. package/dist/hooks/entrance-preview-store.d.ts +0 -16
  426. package/dist/hooks/entrance-preview-store.d.ts.map +0 -1
  427. package/dist/hooks/useEntrancePreview.d.ts +0 -7
  428. package/dist/hooks/useEntrancePreview.d.ts.map +0 -1
  429. package/dist/hooks/useLayout.d.ts +0 -16
  430. package/dist/hooks/useLayout.d.ts.map +0 -1
  431. package/dist/hooks/usePanels.d.ts +0 -12
  432. package/dist/hooks/usePanels.d.ts.map +0 -1
  433. package/dist/ios-pad.d.ts +0 -2
  434. package/dist/ios-pad.d.ts.map +0 -1
  435. package/dist/ios-pad.js +0 -62
  436. package/dist/ios-phone.d.ts +0 -2
  437. package/dist/ios-phone.d.ts.map +0 -1
  438. package/dist/ios-phone.js +0 -62
  439. package/dist/ios.d.ts +0 -2
  440. package/dist/ios.d.ts.map +0 -1
  441. package/dist/ios.js +0 -62
  442. package/dist/macos.d.ts +0 -2
  443. package/dist/macos.d.ts.map +0 -1
  444. package/dist/macos.js +0 -62
  445. package/dist/space-client/cloudflare-rtk-native.d.ts +0 -3
  446. package/dist/space-client/cloudflare-rtk-native.d.ts.map +0 -1
  447. package/dist/telemetry.d.ts +0 -63
  448. package/dist/telemetry.d.ts.map +0 -1
  449. package/dist/ui/appearance.d.ts +0 -246
  450. package/dist/ui/appearance.d.ts.map +0 -1
  451. package/dist/ui/appearance.js +0 -14
  452. package/dist/ui/native-appearance-context.d.ts +0 -15
  453. package/dist/ui/native-appearance-context.d.ts.map +0 -1
  454. package/dist/ui/native-theme.d.ts +0 -17
  455. package/dist/ui/native-theme.d.ts.map +0 -1
  456. package/dist/ui/native-types.d.ts +0 -38
  457. package/dist/ui/native-types.d.ts.map +0 -1
  458. package/dist/ui/participant-avatar.d.ts +0 -21
  459. package/dist/ui/participant-avatar.d.ts.map +0 -1
  460. package/dist/ui/theme-tokens.d.ts +0 -25
  461. package/dist/ui/theme-tokens.d.ts.map +0 -1
  462. package/dist/ui/theme.d.ts +0 -404
  463. package/dist/ui/theme.d.ts.map +0 -1
  464. package/dist/ui/theme.js +0 -8
  465. package/dist/utils/native-space-layout.d.ts +0 -42
  466. package/dist/utils/native-space-layout.d.ts.map +0 -1
  467. package/src/android.ts +0 -1
  468. package/src/components/Chalk.tsx +0 -363
  469. package/src/components/ChatMessageList.tsx +0 -209
  470. package/src/components/Entrance.tsx +0 -42
  471. package/src/components/EntranceView.android.tsx +0 -274
  472. package/src/components/EntranceView.ios-pad.tsx +0 -326
  473. package/src/components/EntranceView.ios-phone.tsx +0 -271
  474. package/src/components/EntranceView.macos.tsx +0 -278
  475. package/src/components/EntranceView.tsx +0 -38
  476. package/src/components/FaceAvatar.tsx +0 -120
  477. package/src/components/GradientSurface.tsx +0 -23
  478. package/src/components/MediaView.tsx +0 -76
  479. package/src/components/ReactionPicker.tsx +0 -98
  480. package/src/components/SpaceView.android.tsx +0 -1
  481. package/src/components/SpaceView.ios-pad.tsx +0 -1
  482. package/src/components/SpaceView.ios-phone.tsx +0 -1
  483. package/src/components/SpaceView.macos.tsx +0 -1
  484. package/src/components/SpaceView.shared.tsx +0 -98
  485. package/src/components/SpaceView.tsx +0 -54
  486. package/src/components/episode-diagnostic-render-observer.ts +0 -12
  487. package/src/components/logo/Logo.tsx +0 -309
  488. package/src/components/native-animation-controller.ts +0 -36
  489. package/src/components/native-chat.ts +0 -23
  490. package/src/components/native-entrance/entrance-controller-store.ts +0 -112
  491. package/src/components/native-entrance/useEntranceController.ts +0 -60
  492. package/src/components/native-joining-loading-animation.ts +0 -26
  493. package/src/components/native-space-view/AppearanceSettings.tsx +0 -114
  494. package/src/components/native-space-view/FeedbackSheet.tsx +0 -296
  495. package/src/components/native-space-view/ParticipantActionSheet.tsx +0 -99
  496. package/src/components/native-space-view/SettingsSheet.tsx +0 -164
  497. package/src/components/native-space-view/SpaceActionMenu.tsx +0 -109
  498. package/src/components/native-space-view/SpaceBottomDock.android.tsx +0 -115
  499. package/src/components/native-space-view/SpaceChatAttachment.tsx +0 -105
  500. package/src/components/native-space-view/SpaceChatSheet.tsx +0 -184
  501. package/src/components/native-space-view/SpaceGrid.android.tsx +0 -323
  502. package/src/components/native-space-view/SpaceMoreSheet.tsx +0 -190
  503. package/src/components/native-space-view/SpacePanelSheet.tsx +0 -45
  504. package/src/components/native-space-view/SpacePeopleSheet.tsx +0 -116
  505. package/src/components/native-space-view/SpaceStage.android.tsx +0 -372
  506. package/src/components/native-space-view/SpaceSurfacePrimitives.tsx +0 -75
  507. package/src/components/native-space-view/SpaceTopBar.android.tsx +0 -113
  508. package/src/components/native-space-view/SpaceWhiteboardSurface.tsx +0 -69
  509. package/src/components/native-space-view/diagnostics.ts +0 -84
  510. package/src/components/native-space-view/format-space-duration.ts +0 -3
  511. package/src/components/native-space-view/native-space-grid-keys.ts +0 -6
  512. package/src/components/native-space-view/native-space-page-store.ts +0 -41
  513. package/src/components/native-space-view/space-chat-attachments.test.ts +0 -26
  514. package/src/components/native-space-view/space-chat-attachments.ts +0 -37
  515. package/src/components/native-space-view/space-panel-layout.ts +0 -10
  516. package/src/components/native-space-view/space-progressive-surface-helpers.ts +0 -33
  517. package/src/components/native-space-view/space-progressive-surface-types.ts +0 -3
  518. package/src/components/native-space-view/types.ts +0 -25
  519. package/src/components/native-space-view/useSpaceViewController.contract.ts +0 -34
  520. package/src/components/native-space-view/useSpaceViewController.ts +0 -416
  521. package/src/components/native-space-view/useSpaceViewDerived.ts +0 -29
  522. package/src/components/native-space-view/useSpaceViewPanels.ts +0 -170
  523. package/src/feedback/native-capture.ts +0 -62
  524. package/src/feedback/native-evidence.ts +0 -37
  525. package/src/hooks/entrance-preview-store.ts +0 -99
  526. package/src/hooks/useEntrancePreview.ts +0 -26
  527. package/src/hooks/useLayout.ts +0 -37
  528. package/src/hooks/usePanels.ts +0 -30
  529. package/src/ios-pad.ts +0 -1
  530. package/src/ios-phone.ts +0 -1
  531. package/src/ios.ts +0 -1
  532. package/src/macos.ts +0 -1
  533. package/src/space-client/cloudflare-rtk-native.ts +0 -104
  534. package/src/telemetry.ts +0 -234
  535. package/src/types/hugeicons-direct.d.ts +0 -4
  536. package/src/types/react-native-safe-area-context.d.ts +0 -8
  537. package/src/ui/appearance.ts +0 -808
  538. package/src/ui/native-appearance-context.tsx +0 -74
  539. package/src/ui/native-theme.tsx +0 -54
  540. package/src/ui/native-types.ts +0 -40
  541. package/src/ui/participant-avatar.ts +0 -47
  542. package/src/ui/theme-tokens.ts +0 -41
  543. package/src/ui/theme.ts +0 -214
  544. package/src/utils/native-space-layout.ts +0 -135
@@ -1,363 +0,0 @@
1
- import type { ChatUploadFile, ClientEventMap, FeedbackEvidenceInput, GetAccess, SpaceClient } from "@q9labsai/chalk-client";
2
- import { useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from "react";
3
- import { Pressable, StyleSheet, Text, View } from "react-native";
4
-
5
- import { ChalkProvider, useSpaceClient } from "../context/space-client-context";
6
- import { useConnection } from "../hooks/space-hooks";
7
- import { createNativeSpaceClient } from "../space-client/create-native-space-client";
8
- import { NativeAppearanceProvider, NativeTextureOverlay, useNativeAppearance } from "../ui/native-appearance-context";
9
- import { type ThemePalette, type ThemeTexture } from "../ui/appearance";
10
- import { NativeThemeProvider, useNativeTheme } from "../ui/native-theme";
11
- import { DEFAULT_CHALK_THEME_TOKENS } from "../ui/theme-tokens";
12
- import { SpaceView } from "./SpaceView";
13
- import { Entrance, type EntranceDefaults } from "./Entrance";
14
-
15
- export type ChalkFeatures = {
16
- readonly chat?: boolean;
17
- readonly participants?: boolean;
18
- readonly admission?: boolean;
19
- readonly screenShare?: boolean;
20
- readonly whiteboard?: boolean;
21
- readonly reactions?: boolean;
22
- readonly handRaise?: boolean;
23
- readonly info?: boolean;
24
- readonly settings?: boolean;
25
- };
26
-
27
- export const CHALK_THEME_TOKENS = DEFAULT_CHALK_THEME_TOKENS;
28
-
29
- export type ChalkThemeTokens = {
30
- readonly [Token in keyof typeof CHALK_THEME_TOKENS]: string;
31
- };
32
-
33
- export type ChalkTheme = {
34
- readonly colorScheme?: "dark" | "light";
35
- readonly palette?: ThemePalette;
36
- readonly texture?: ThemeTexture;
37
- readonly accent?: string;
38
- readonly tokens?: Partial<ChalkThemeTokens>;
39
- };
40
-
41
- export type SpaceLayout = "grid" | "focus" | "presentation";
42
-
43
- type ChalkCallbacks = {
44
- readonly onJoined?: () => void;
45
- readonly onLeft?: () => void;
46
- readonly onEpisodeEnded?: (event: ClientEventMap["episodeEnded"]) => void;
47
- readonly onParticipantJoined?: (event: ClientEventMap["participantJoined"]) => void;
48
- readonly onParticipantLeft?: (event: ClientEventMap["participantLeft"]) => void;
49
- readonly onScreenShareStarted?: (event: ClientEventMap["screenShareStarted"]) => void;
50
- readonly onScreenShareStopped?: (event: ClientEventMap["screenShareStopped"]) => void;
51
- readonly onError?: (event: ClientEventMap["error"]) => void;
52
- };
53
-
54
- type ChalkCommonProps = ChalkCallbacks & {
55
- readonly displayName?: string;
56
- readonly entrance?: boolean;
57
- readonly defaults?: EntranceDefaults;
58
- readonly features?: ChalkFeatures;
59
- readonly theme?: ChalkTheme;
60
- /** Selects files; the SDK owns bounds, upload, and send sequencing. */
61
- readonly pickChatFiles?: () => Promise<readonly ChatUploadFile[]>;
62
- readonly logoUrl?: string;
63
- readonly spaceName?: string;
64
- readonly inviteLink?: string;
65
- readonly layout?: SpaceLayout;
66
- readonly onLayoutChange?: (layout: SpaceLayout) => void;
67
- readonly onOpenDiagnostics?: () => void;
68
- readonly feedbackEvidence?: Partial<FeedbackEvidenceInput>;
69
- };
70
-
71
- export type ChalkProps = ChalkCommonProps &
72
- (
73
- | {
74
- readonly client: SpaceClient;
75
- readonly space?: never;
76
- readonly getAccess?: never;
77
- }
78
- | {
79
- readonly client?: never;
80
- readonly space: string;
81
- readonly getAccess: GetAccess;
82
- }
83
- );
84
-
85
- export function Chalk(props: ChalkProps): React.JSX.Element {
86
- const suppliedClient = props.client;
87
- const space = props.space;
88
- const getAccess = props.getAccess;
89
- const getAccessRef = useRef(getAccess);
90
- getAccessRef.current = getAccess;
91
- const defaults = useRef(props.defaults).current;
92
- const getLatestAccess = useCallback((...args: Parameters<GetAccess>): ReturnType<GetAccess> => {
93
- const currentGetAccess = getAccessRef.current;
94
- if (!currentGetAccess) throw new Error("Chalk requires getAccess when it creates the SpaceClient.");
95
- return currentGetAccess(...args);
96
- }, []);
97
- const ownedClient = useMemo(
98
- () =>
99
- suppliedClient
100
- ? null
101
- : createNativeSpaceClient({
102
- space: space!,
103
- getAccess: getLatestAccess,
104
- microphone: defaults?.microphone,
105
- camera: defaults?.camera,
106
- }),
107
- [getLatestAccess, space, suppliedClient],
108
- );
109
- const client = suppliedClient ?? ownedClient!;
110
-
111
- useEffect(() => {
112
- if (!ownedClient) return;
113
- return () => {
114
- void ownedClient
115
- .leave()
116
- .catch(() => undefined)
117
- .finally(() => ownedClient.dispose());
118
- };
119
- }, [ownedClient]);
120
-
121
- return (
122
- <NativeAppearanceProvider initialAppearance={{ palette: props.theme?.palette, texture: props.theme?.texture }}>
123
- <AppearanceThemeBridge theme={props.theme}>
124
- <ChalkProvider client={client}>
125
- <SpaceExperience {...props} />
126
- </ChalkProvider>
127
- </AppearanceThemeBridge>
128
- </NativeAppearanceProvider>
129
- );
130
- }
131
-
132
- function AppearanceThemeBridge({ children, theme }: { readonly children: ReactNode; readonly theme?: ChalkTheme }): React.JSX.Element {
133
- const { appearance } = useNativeAppearance();
134
- return (
135
- <NativeThemeProvider appearance={appearance} theme={theme}>
136
- {children}
137
- </NativeThemeProvider>
138
- );
139
- }
140
-
141
- function SpaceExperience(props: ChalkProps): React.JSX.Element {
142
- const client = useSpaceClient();
143
- const connection = useConnection();
144
- const previousStatus = useRef(connection.status);
145
- const hasObservedStatus = useRef(false);
146
- const hasBeenLive = useRef(connection.status === "live" || connection.status === "reconnecting");
147
- const autoJoinAttempted = useRef(false);
148
- const previousClient = useRef(client);
149
- const [joinError, setJoinError] = useState<string | null>(null);
150
-
151
- if (previousClient.current !== client) {
152
- previousClient.current = client;
153
- previousStatus.current = connection.status;
154
- hasObservedStatus.current = false;
155
- hasBeenLive.current = connection.status === "live" || connection.status === "reconnecting";
156
- autoJoinAttempted.current = false;
157
- }
158
-
159
- const entrance = props.entrance ?? true;
160
- const spaceName = props.spaceName ?? props.space ?? "Space";
161
- const join = useCallback(
162
- async (options: Parameters<SpaceClient["join"]>[0]) => {
163
- try {
164
- setJoinError(null);
165
- await client.join(options);
166
- } catch (cause) {
167
- setJoinError(cause instanceof Error ? cause.message : "Could not enter this Space.");
168
- }
169
- },
170
- [client],
171
- );
172
- const retryAutomaticJoin = useCallback(() => {
173
- autoJoinAttempted.current = true;
174
- void join(defaultJoinOptions(props));
175
- }, [join, props]);
176
-
177
- useEffect(() => {
178
- setJoinError(null);
179
- }, [client]);
180
-
181
- useEffect(() => {
182
- const subscriptions = [
183
- props.onEpisodeEnded && client.on("episodeEnded", props.onEpisodeEnded),
184
- props.onParticipantJoined && client.on("participantJoined", props.onParticipantJoined),
185
- props.onParticipantLeft && client.on("participantLeft", props.onParticipantLeft),
186
- props.onScreenShareStarted && client.on("screenShareStarted", props.onScreenShareStarted),
187
- props.onScreenShareStopped && client.on("screenShareStopped", props.onScreenShareStopped),
188
- props.onError && client.on("error", props.onError),
189
- ].filter((unsubscribe): unsubscribe is () => void => Boolean(unsubscribe));
190
- return () => subscriptions.forEach((unsubscribe) => unsubscribe());
191
- }, [client, props.onEpisodeEnded, props.onError, props.onParticipantJoined, props.onParticipantLeft, props.onScreenShareStarted, props.onScreenShareStopped]);
192
-
193
- useEffect(() => {
194
- if (!entrance && connection.status === "idle" && !autoJoinAttempted.current) {
195
- autoJoinAttempted.current = true;
196
- void join(defaultJoinOptions(props));
197
- }
198
- }, [connection.status, entrance, join, props.defaults?.camera, props.defaults?.microphone, props.displayName]);
199
-
200
- useEffect(() => {
201
- const previous = previousStatus.current;
202
- if (hasObservedStatus.current) {
203
- if (connection.status === "live" && previous !== "live" && previous !== "reconnecting") props.onJoined?.();
204
- if (connection.status === "left" && previous !== "left") props.onLeft?.();
205
- }
206
- previousStatus.current = connection.status;
207
- hasObservedStatus.current = true;
208
- if (connection.status === "live" || connection.status === "reconnecting") hasBeenLive.current = true;
209
- }, [connection.status, props.onJoined, props.onLeft]);
210
-
211
- if (connection.status === "idle" && entrance) {
212
- return (
213
- <AppearanceLayer>
214
- <Entrance defaultDisplayName={props.displayName} defaults={props.defaults} error={joinError ?? undefined} logoUrl={props.logoUrl} onJoin={join} spaceName={spaceName} />
215
- </AppearanceLayer>
216
- );
217
- }
218
-
219
- if (connection.status === "idle") {
220
- return (
221
- <AppearanceLayer>
222
- <SpaceStatus message={joinError ?? `Entering ${spaceName}…`} onRetry={joinError ? retryAutomaticJoin : undefined} />
223
- </AppearanceLayer>
224
- );
225
- }
226
-
227
- if (connection.status === "joining") {
228
- if (!entrance)
229
- return (
230
- <AppearanceLayer>
231
- <SpaceStatus message={`Entering ${spaceName}…`} />
232
- </AppearanceLayer>
233
- );
234
- return (
235
- <AppearanceLayer>
236
- <Entrance defaultDisplayName={props.displayName} defaults={props.defaults} joining logoUrl={props.logoUrl} onJoin={join} spaceName={spaceName} />
237
- </AppearanceLayer>
238
- );
239
- }
240
-
241
- if (connection.status === "failed") {
242
- if (!hasBeenLive.current && entrance) {
243
- return (
244
- <AppearanceLayer>
245
- <Entrance defaultDisplayName={props.displayName} defaults={props.defaults} error={connection.lastError?.message ?? "Unable to enter this Space."} logoUrl={props.logoUrl} onJoin={join} spaceName={spaceName} />
246
- </AppearanceLayer>
247
- );
248
- }
249
- return (
250
- <AppearanceLayer>
251
- <SpaceStatus message={connection.lastError?.message ?? "This Space is unavailable."} onRetry={() => void join(defaultJoinOptions(props))} />
252
- </AppearanceLayer>
253
- );
254
- }
255
-
256
- if (connection.status === "leaving")
257
- return (
258
- <AppearanceLayer>
259
- <SpaceStatus message={`Leaving ${spaceName}…`} />
260
- </AppearanceLayer>
261
- );
262
- if (connection.status === "left")
263
- return (
264
- <AppearanceLayer>
265
- <SpaceStatus message="You have left this Space." onRetry={() => void join(defaultJoinOptions(props))} />
266
- </AppearanceLayer>
267
- );
268
-
269
- return (
270
- <NativeSpaceView
271
- features={props.features}
272
- inviteLink={props.inviteLink}
273
- layout={props.layout}
274
- logoUrl={props.logoUrl}
275
- onLayoutChange={props.onLayoutChange}
276
- onOpenDiagnostics={props.onOpenDiagnostics}
277
- feedbackEvidence={props.feedbackEvidence}
278
- pickChatFiles={props.pickChatFiles}
279
- reconnecting={connection.status === "reconnecting"}
280
- spaceName={spaceName}
281
- />
282
- );
283
- }
284
-
285
- function defaultJoinOptions(props: ChalkProps): Parameters<SpaceClient["join"]>[0] {
286
- const displayName = props.displayName?.trim();
287
- return {
288
- ...(displayName ? { displayName } : {}),
289
- microphone: props.defaults?.microphone ?? true,
290
- camera: props.defaults?.camera ?? true,
291
- };
292
- }
293
-
294
- type NativeSpaceViewProps = {
295
- readonly features?: ChalkFeatures;
296
- readonly inviteLink?: string;
297
- readonly layout?: SpaceLayout;
298
- readonly logoUrl?: string;
299
- readonly onLayoutChange?: (layout: SpaceLayout) => void;
300
- readonly onOpenDiagnostics?: () => void;
301
- readonly feedbackEvidence?: Partial<FeedbackEvidenceInput>;
302
- readonly pickChatFiles?: () => Promise<readonly ChatUploadFile[]>;
303
- readonly reconnecting: boolean;
304
- readonly spaceName: string;
305
- };
306
-
307
- function NativeSpaceView({ features, inviteLink, layout, logoUrl, onLayoutChange, onOpenDiagnostics, feedbackEvidence, pickChatFiles, reconnecting, spaceName }: NativeSpaceViewProps): React.JSX.Element {
308
- const client = useSpaceClient();
309
- const theme = useNativeTheme();
310
-
311
- return (
312
- <View style={[styles.space, { backgroundColor: theme.colors.background }]}>
313
- <SpaceView
314
- features={features}
315
- inviteLink={inviteLink}
316
- layout={layout}
317
- logoUrl={logoUrl}
318
- onEndEpisode={() => client.endEpisode()}
319
- onLayoutChange={onLayoutChange}
320
- onLeave={() => client.leave()}
321
- onOpenDiagnostics={onOpenDiagnostics}
322
- feedbackEvidence={feedbackEvidence}
323
- pickChatFiles={pickChatFiles}
324
- reconnecting={reconnecting}
325
- spaceName={spaceName}
326
- />
327
- <NativeTextureOverlay />
328
- </View>
329
- );
330
- }
331
-
332
- function AppearanceLayer({ children }: { readonly children: ReactNode }): React.JSX.Element {
333
- const theme = useNativeTheme();
334
- return (
335
- <View style={[styles.appearanceLayer, { backgroundColor: theme.colors.background }]}>
336
- {children}
337
- <NativeTextureOverlay />
338
- </View>
339
- );
340
- }
341
-
342
- function SpaceStatus({ message, onRetry }: { readonly message: string; readonly onRetry?: () => void }): React.JSX.Element {
343
- const theme = useNativeTheme();
344
- return (
345
- <View accessibilityLiveRegion="polite" style={[styles.status, { backgroundColor: theme.colors.background }]}>
346
- <Text style={[styles.statusText, { color: theme.colors.foreground }]}>{message}</Text>
347
- {onRetry ? (
348
- <Pressable accessibilityRole="button" onPress={onRetry} style={[styles.retry, { backgroundColor: theme.colors.primary }]}>
349
- <Text style={[styles.retryText, { color: theme.colors.primaryForeground }]}>Try again</Text>
350
- </Pressable>
351
- ) : null}
352
- </View>
353
- );
354
- }
355
-
356
- const styles = StyleSheet.create({
357
- space: { flex: 1 },
358
- appearanceLayer: { flex: 1 },
359
- status: { flex: 1, alignItems: "center", justifyContent: "center", gap: 16, padding: 24 },
360
- statusText: { fontSize: 16, textAlign: "center" },
361
- retry: { borderRadius: 12, paddingHorizontal: 18, paddingVertical: 12 },
362
- retryText: { fontWeight: "800" },
363
- });
@@ -1,209 +0,0 @@
1
- import type { NativeChatMessage as ChatMessage } from "../ui/native-types";
2
- import { useCallback, useRef } from "react";
3
- import { type LayoutChangeEvent, type NativeScrollEvent, type NativeSyntheticEvent, ScrollView, StyleSheet, Text, type StyleProp, View, type ViewStyle } from "react-native";
4
- import { Theme } from "../ui/theme";
5
- import { formatChatAttachmentSize, isLatestChatMessageVisible, type NativeChatViewport } from "./native-chat";
6
-
7
- export interface ChatMessageListProps {
8
- readonly messages: readonly ChatMessage[];
9
- readonly localParticipantId: string | null;
10
- readonly onLatestMessageVisible: (sequence: string) => void;
11
- readonly style?: StyleProp<ViewStyle>;
12
- readonly contentContainerStyle?: StyleProp<ViewStyle>;
13
- }
14
-
15
- export function ChatMessageList({ messages, localParticipantId, onLatestMessageVisible, style, contentContainerStyle }: ChatMessageListProps): React.JSX.Element {
16
- const latestSequence = messages.at(-1)?.sequence ?? null;
17
- const viewport = useRef<NativeChatViewport>({ contentHeight: 0, viewportHeight: 0, scrollOffset: 0 });
18
- const renderedSequence = useRef<string | null>(null);
19
- const measuredSequence = useRef<string | null>(null);
20
- const reportedSequence = useRef<string | null>(null);
21
-
22
- if (renderedSequence.current !== latestSequence) {
23
- renderedSequence.current = latestSequence;
24
- measuredSequence.current = null;
25
- }
26
-
27
- const reportLatestIfVisible = useCallback(() => {
28
- if (!latestSequence || measuredSequence.current !== latestSequence || reportedSequence.current === latestSequence) return;
29
- if (!isLatestChatMessageVisible(viewport.current)) return;
30
- reportedSequence.current = latestSequence;
31
- onLatestMessageVisible(latestSequence);
32
- }, [latestSequence, onLatestMessageVisible]);
33
-
34
- const handleLayout = useCallback(
35
- (event: LayoutChangeEvent) => {
36
- viewport.current = { ...viewport.current, viewportHeight: event.nativeEvent.layout.height };
37
- reportLatestIfVisible();
38
- },
39
- [reportLatestIfVisible],
40
- );
41
-
42
- const handleContentSizeChange = useCallback(
43
- (_width: number, height: number) => {
44
- viewport.current = { ...viewport.current, contentHeight: height };
45
- measuredSequence.current = latestSequence;
46
- reportLatestIfVisible();
47
- },
48
- [latestSequence, reportLatestIfVisible],
49
- );
50
-
51
- const handleScroll = useCallback(
52
- (event: NativeSyntheticEvent<NativeScrollEvent>) => {
53
- const { contentOffset, contentSize, layoutMeasurement } = event.nativeEvent;
54
- viewport.current = {
55
- contentHeight: contentSize.height,
56
- viewportHeight: layoutMeasurement.height,
57
- scrollOffset: contentOffset.y,
58
- };
59
- measuredSequence.current = latestSequence;
60
- reportLatestIfVisible();
61
- },
62
- [latestSequence, reportLatestIfVisible],
63
- );
64
-
65
- return (
66
- <ScrollView accessibilityLabel="Chat messages" contentContainerStyle={[styles.content, contentContainerStyle]} onContentSizeChange={handleContentSizeChange} onLayout={handleLayout} onScroll={handleScroll} scrollEventThrottle={16} showsVerticalScrollIndicator={false} style={style}>
67
- {messages.length === 0 ? (
68
- <View style={styles.emptyState}>
69
- <Text style={styles.emptyTitle}>No messages yet.</Text>
70
- <Text style={styles.emptyText}>Send a message to start the conversation.</Text>
71
- </View>
72
- ) : null}
73
- {messages.map((message) => {
74
- const isLocal = message.senderId === localParticipantId;
75
- const readByNames = message.readBy.map((receipt) => receipt.displayName);
76
- const status = readByNames.length > 0 ? `Read by ${readByNames.join(", ")}` : "Sent";
77
-
78
- return (
79
- <View key={message.id} style={[styles.messageGroup, isLocal && styles.localMessageGroup]}>
80
- {!isLocal ? <Text style={styles.sender}>{message.senderName}</Text> : null}
81
- <View style={[styles.bubble, isLocal ? styles.localBubble : styles.remoteBubble]}>
82
- {message.content ? <Text style={styles.messageText}>{message.content}</Text> : null}
83
- {message.attachments.map((attachment) => {
84
- const isImage = attachment.mimeType.startsWith("image/");
85
- return (
86
- <View accessibilityLabel={`${isImage ? "Image" : "File"} attachment ${attachment.fileName}, ${formatChatAttachmentSize(attachment.byteLength)}`} key={attachment.attachmentId} style={styles.attachment}>
87
- <Text style={styles.attachmentKind}>{isImage ? "IMAGE" : "FILE"}</Text>
88
- <View style={styles.attachmentMetadata}>
89
- <Text numberOfLines={1} style={styles.attachmentName}>
90
- {attachment.fileName}
91
- </Text>
92
- <Text style={styles.attachmentDetails}>
93
- {formatChatAttachmentSize(attachment.byteLength)} · {attachment.mimeType}
94
- </Text>
95
- </View>
96
- </View>
97
- );
98
- })}
99
- </View>
100
- {isLocal ? (
101
- <Text accessibilityLabel={status} numberOfLines={1} style={[styles.status, readByNames.length > 0 && styles.readStatus]}>
102
- {status}
103
- </Text>
104
- ) : null}
105
- </View>
106
- );
107
- })}
108
- </ScrollView>
109
- );
110
- }
111
-
112
- const styles = StyleSheet.create({
113
- content: {
114
- gap: 12,
115
- },
116
- emptyState: {
117
- flex: 1,
118
- minHeight: 160,
119
- alignItems: "center",
120
- justifyContent: "center",
121
- paddingHorizontal: 24,
122
- },
123
- emptyTitle: {
124
- color: Theme.colors.onDark,
125
- fontSize: 15,
126
- fontWeight: "700",
127
- },
128
- emptyText: {
129
- color: Theme.colors.mutedForeground,
130
- fontSize: 12,
131
- marginTop: 6,
132
- textAlign: "center",
133
- },
134
- messageGroup: {
135
- alignSelf: "flex-start",
136
- gap: 5,
137
- maxWidth: "85%",
138
- },
139
- localMessageGroup: {
140
- alignSelf: "flex-end",
141
- alignItems: "flex-end",
142
- },
143
- sender: {
144
- color: Theme.colors.mutedForeground,
145
- fontSize: 11,
146
- fontWeight: "700",
147
- paddingHorizontal: 4,
148
- },
149
- bubble: {
150
- borderRadius: 18,
151
- maxWidth: "100%",
152
- paddingHorizontal: 14,
153
- paddingVertical: 10,
154
- },
155
- localBubble: {
156
- backgroundColor: Theme.colors.primary,
157
- borderBottomRightRadius: 6,
158
- },
159
- remoteBubble: {
160
- backgroundColor: Theme.colors.whiteOverlay06,
161
- borderBottomLeftRadius: 6,
162
- },
163
- messageText: {
164
- color: Theme.colors.onDark,
165
- fontSize: 14,
166
- lineHeight: 20,
167
- },
168
- attachment: {
169
- alignItems: "center",
170
- backgroundColor: Theme.colors.darkOverlay16,
171
- borderColor: Theme.colors.whiteOverlay16,
172
- borderRadius: 10,
173
- borderWidth: 1,
174
- flexDirection: "row",
175
- gap: 10,
176
- marginTop: 8,
177
- minWidth: 190,
178
- padding: 10,
179
- },
180
- attachmentKind: {
181
- color: Theme.colors.whiteOverlay72,
182
- fontSize: 9,
183
- fontWeight: "800",
184
- letterSpacing: 0.6,
185
- },
186
- attachmentMetadata: {
187
- flex: 1,
188
- minWidth: 0,
189
- },
190
- attachmentName: {
191
- color: Theme.colors.onDark,
192
- fontSize: 13,
193
- fontWeight: "700",
194
- },
195
- attachmentDetails: {
196
- color: Theme.colors.whiteOverlay68,
197
- fontSize: 10,
198
- marginTop: 2,
199
- },
200
- status: {
201
- color: Theme.colors.mutedForeground,
202
- fontSize: 10,
203
- maxWidth: 240,
204
- paddingHorizontal: 4,
205
- },
206
- readStatus: {
207
- color: Theme.colors.primary,
208
- },
209
- });
@@ -1,42 +0,0 @@
1
- import { EntranceView } from "./EntranceView";
2
- import { Image } from "react-native";
3
- import { Logo } from "./logo/Logo";
4
-
5
- export type EntranceDefaults = {
6
- readonly microphone?: boolean;
7
- readonly camera?: boolean;
8
- };
9
-
10
- export type EntranceSettings = {
11
- readonly displayName: string;
12
- readonly microphone: boolean;
13
- readonly camera: boolean;
14
- };
15
-
16
- export type EntranceProps = {
17
- readonly spaceName: string;
18
- readonly logoUrl?: string;
19
- readonly defaultDisplayName?: string;
20
- readonly defaults?: EntranceDefaults;
21
- readonly error?: string;
22
- readonly joining?: boolean;
23
- readonly onCancel?: () => void;
24
- readonly onJoin: (settings: EntranceSettings) => void | Promise<void>;
25
- };
26
-
27
- /** The native implementation owns the device preview lifecycle and disposal. */
28
- export function Entrance({ spaceName, logoUrl, defaultDisplayName, defaults, error, joining = false, onCancel, onJoin }: EntranceProps): React.JSX.Element {
29
- return (
30
- <EntranceView
31
- error={error}
32
- initialAudioEnabled={defaults?.microphone ?? true}
33
- initialVideoEnabled={defaults?.camera ?? true}
34
- joinDisabled={joining}
35
- logo={logoUrl ? <Image accessibilityLabel="Chalk" source={{ uri: logoUrl }} style={{ height: 32, width: 120 }} /> : <Logo height={32} variant="wordmark" />}
36
- onCancel={onCancel}
37
- onJoin={({ displayName, microphoneEnabled, cameraEnabled }) => void onJoin({ displayName, microphone: microphoneEnabled, camera: cameraEnabled })}
38
- spaceName={spaceName}
39
- displayName={defaultDisplayName}
40
- />
41
- );
42
- }