agora-appbuilder-core 4.0.0-api.5 → 4.0.0-api.6

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 (406) hide show
  1. package/package.json +2 -2
  2. package/template/.bundle/config +2 -0
  3. package/template/Gemfile +4 -0
  4. package/template/Gulpfile.js +29 -29
  5. package/template/_eslintrc.js +3 -3
  6. package/template/_gitignore +12 -11
  7. package/template/_package-lock.json +26471 -22749
  8. package/template/_prettierrc.js +2 -2
  9. package/template/agora-rn-uikit/src/Contexts/PropsContext.tsx +30 -10
  10. package/template/agora-rn-uikit/src/Contexts/RtcContext.tsx +19 -0
  11. package/template/agora-rn-uikit/src/Controls/BtnTemplate.tsx +1 -0
  12. package/template/agora-rn-uikit/src/Controls/Icons.ts +45 -0
  13. package/template/agora-rn-uikit/src/Controls/Local/EndCall.tsx +6 -4
  14. package/template/agora-rn-uikit/src/Controls/Local/FullScreen.tsx +3 -1
  15. package/template/agora-rn-uikit/src/Controls/Local/LocalAudioMute.tsx +1 -0
  16. package/template/agora-rn-uikit/src/Controls/Local/LocalVideoMute.tsx +1 -0
  17. package/template/agora-rn-uikit/src/Controls/Local/SwitchCamera.tsx +1 -0
  18. package/template/agora-rn-uikit/src/Controls/Remote/RemoteAudioMute.tsx +1 -0
  19. package/template/agora-rn-uikit/src/Controls/Remote/RemoteSwap.tsx +3 -1
  20. package/template/agora-rn-uikit/src/Controls/Remote/RemoteVideoMute.tsx +1 -0
  21. package/template/agora-rn-uikit/src/Reducer/ActiveSpeaker.ts +30 -0
  22. package/template/agora-rn-uikit/src/Reducer/LocalMuteAudio.ts +3 -1
  23. package/template/agora-rn-uikit/src/Reducer/LocalMuteVideo.ts +3 -1
  24. package/template/agora-rn-uikit/src/Reducer/LocalPermissionState.ts +1 -1
  25. package/template/agora-rn-uikit/src/Reducer/RemoteAudioStateChanged.ts +3 -3
  26. package/template/agora-rn-uikit/src/Reducer/RemoteVideoStateChanged.ts +5 -4
  27. package/template/agora-rn-uikit/src/Reducer/UpdateDualStreamMode.ts +1 -1
  28. package/template/agora-rn-uikit/src/Reducer/UserJoined.ts +8 -5
  29. package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteAudio.ts +1 -1
  30. package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteVideo.ts +1 -1
  31. package/template/agora-rn-uikit/src/Reducer/UserOffline.ts +1 -1
  32. package/template/agora-rn-uikit/src/Reducer/UserPin.ts +18 -1
  33. package/template/agora-rn-uikit/src/Reducer/UserSecondaryPin.ts +23 -0
  34. package/template/agora-rn-uikit/src/Reducer/index.ts +2 -0
  35. package/template/agora-rn-uikit/src/Rtc/Create.tsx +47 -21
  36. package/template/agora-rn-uikit/src/Rtc/Join.tsx +37 -15
  37. package/template/agora-rn-uikit/src/RtcConfigure.tsx +122 -12
  38. package/template/agora-rn-uikit/src/Views/MaxVideoView.native.tsx +32 -4
  39. package/template/agora-rn-uikit/src/Views/MaxVideoView.tsx +21 -2
  40. package/template/agora-rn-uikit/src/Views/MinVideoView.tsx +2 -0
  41. package/template/android/app/build.gradle +59 -156
  42. package/template/android/app/src/debug/AndroidManifest.xml +6 -1
  43. package/template/android/app/src/debug/java/com/helloworld/ReactNativeFlipper.java +7 -4
  44. package/template/android/app/src/main/AndroidManifest.xml +6 -19
  45. package/template/android/app/src/main/assets/fonts/icomoon.ttf +0 -0
  46. package/template/android/app/src/main/java/com/helloworld/MainActivity.java +17 -0
  47. package/template/android/app/src/main/java/com/helloworld/MainApplication.java +19 -36
  48. package/template/android/app/src/release/java/com/helloworld/ReactNativeFlipper.java +20 -0
  49. package/template/android/build.gradle +19 -33
  50. package/template/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  51. package/template/android/gradle/wrapper/gradle-wrapper.properties +3 -2
  52. package/template/android/gradle.properties +18 -4
  53. package/template/android/gradlew +165 -104
  54. package/template/android/gradlew.bat +12 -23
  55. package/template/android/settings.gradle +1 -0
  56. package/template/bridge/rtc/webNg/RtcEngine.ts +131 -16
  57. package/template/bridge/rtc/webNg/index.ts +72 -1
  58. package/template/bridge/rtm/web/index.ts +5 -3
  59. package/template/configTransform.js +16 -1
  60. package/template/customization-api/action-library.ts +0 -8
  61. package/template/customization-api/app-state.ts +11 -2
  62. package/template/customization-api/customEvents.ts +6 -1
  63. package/template/customization-api/index.ts +4 -0
  64. package/template/customization-api/sub-components.ts +6 -3
  65. package/template/customization-api/temp.ts +50 -0
  66. package/template/customization-api/typeDefinition.ts +26 -14
  67. package/template/customization-api/types.ts +26 -0
  68. package/template/customization-api/utils.ts +2 -0
  69. package/template/customization-implementation/index.ts +0 -1
  70. package/template/defaultConfig.js +72 -0
  71. package/template/global.d.ts +13 -1
  72. package/template/index.js +0 -4
  73. package/template/index.web.js +0 -5
  74. package/template/index.wsdk.tsx +1 -19
  75. package/template/ios/.xcode.env +11 -0
  76. package/template/ios/HelloWorld/AppDelegate.h +2 -4
  77. package/template/ios/HelloWorld/AppDelegate.mm +42 -0
  78. package/template/ios/HelloWorld/Info.plist +1 -1
  79. package/template/ios/HelloWorld/main.m +2 -1
  80. package/template/ios/HelloWorld.xcodeproj/project.pbxproj +529 -17
  81. package/template/ios/HelloWorld.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  82. package/template/ios/HelloWorld.xcworkspace/contents.xcworkspacedata +10 -0
  83. package/template/ios/HelloWorld.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  84. package/template/ios/HelloWorldTests/HelloWorldTests.m +14 -13
  85. package/template/ios/HelloWorldTests/Info.plist +2 -2
  86. package/template/ios/Podfile +53 -20
  87. package/template/ios/Podfile.lock +873 -0
  88. package/template/ios/ScreenSharing/Info.plist +15 -0
  89. package/template/ios/ScreenSharing/SampleHandler.h +9 -0
  90. package/template/ios/ScreenSharing/SampleHandler.m +70 -0
  91. package/template/jest.config.js +4 -0
  92. package/template/metro.config.js +7 -32
  93. package/template/package.json +52 -39
  94. package/template/react-native-toast-message/index.d.ts +3 -1
  95. package/template/react-native-toast-message/index.js +1 -0
  96. package/template/react-native-toast-message/src/components/base/index.js +20 -32
  97. package/template/react-native-toast-message/src/components/base/styles.js +18 -21
  98. package/template/react-native-toast-message/src/components/checkbox.js +24 -19
  99. package/template/react-native-toast-message/src/index.js +3 -1
  100. package/template/react-native-toast-message/src/index.sdk.tsx +4 -1
  101. package/template/src/App.tsx +13 -85
  102. package/template/src/AppRoutes.tsx +77 -0
  103. package/template/src/AppWrapper.tsx +38 -33
  104. package/template/src/SDKAppWrapper.tsx +79 -43
  105. package/template/src/app-state/useNoiseSupression.native.tsx +67 -0
  106. package/template/src/app-state/useNoiseSupression.tsx +107 -0
  107. package/template/src/app-state/useVideoQuality.tsx +39 -0
  108. package/template/src/assets/font-styles.css +171 -3
  109. package/template/src/assets/fonts/icomoon.ttf +0 -0
  110. package/template/src/assets/selection.json +1 -1
  111. package/template/src/atoms/ActionMenu.tsx +50 -11
  112. package/template/src/atoms/Avatar.tsx +51 -0
  113. package/template/src/atoms/Card.tsx +21 -8
  114. package/template/src/atoms/Carousel.native.tsx +105 -0
  115. package/template/src/atoms/Carousel.tsx +103 -0
  116. package/template/src/atoms/Checkbox.tsx +98 -0
  117. package/template/src/atoms/CircularProgress.tsx +0 -1
  118. package/template/src/atoms/ClipboardIconButton.tsx +91 -0
  119. package/template/src/atoms/CustomIcon.tsx +45 -0
  120. package/template/src/atoms/DropDownMulti.tsx +349 -0
  121. package/template/src/atoms/Dropdown.tsx +3 -3
  122. package/template/src/atoms/IconButton.tsx +52 -9
  123. package/template/src/atoms/ImageIcon.tsx +6 -3
  124. package/template/src/atoms/InlineNotification.tsx +81 -0
  125. package/template/src/atoms/MeetingLink.tsx +160 -0
  126. package/template/src/atoms/ParticipantsCount.tsx +18 -7
  127. package/template/src/atoms/Popup.tsx +49 -27
  128. package/template/src/atoms/PrimaryButton.tsx +19 -5
  129. package/template/src/atoms/RecordingInfo.tsx +2 -2
  130. package/template/src/atoms/SecondaryButton.tsx +2 -0
  131. package/template/src/atoms/Spacer.tsx +1 -0
  132. package/template/src/atoms/TertiaryButton.tsx +35 -5
  133. package/template/src/atoms/TextInput.tsx +2 -1
  134. package/template/src/atoms/Toolbar.tsx +64 -30
  135. package/template/src/atoms/ToolbarItem.tsx +11 -5
  136. package/template/src/atoms/ToolbarPreset.tsx +13 -2
  137. package/template/src/atoms/Tooltip.tsx +26 -4
  138. package/template/src/auth/AuthProvider.tsx +500 -0
  139. package/template/src/auth/AuthRoute.tsx +94 -0
  140. package/template/src/auth/IDPAuth.electron.tsx +31 -0
  141. package/template/src/auth/IDPAuth.tsx +67 -0
  142. package/template/src/auth/IDPLogoutComponent.tsx +158 -0
  143. package/template/src/auth/UserCancelPopup.tsx +115 -0
  144. package/template/src/auth/config.ts +52 -0
  145. package/template/src/auth/openIDPURL.electron.tsx +39 -0
  146. package/template/src/auth/openIDPURL.native.tsx +51 -0
  147. package/template/src/auth/openIDPURL.tsx +20 -0
  148. package/template/src/auth/useIDPAuth.electron.tsx +65 -0
  149. package/template/src/auth/useIDPAuth.native.tsx +70 -0
  150. package/template/src/auth/useIDPAuth.tsx +63 -0
  151. package/template/src/auth/useTokenAuth.tsx +194 -0
  152. package/template/src/components/Chat.tsx +5 -8
  153. package/template/src/components/ChatContext.ts +4 -0
  154. package/template/src/components/ColorConfigure.tsx +0 -1
  155. package/template/src/components/CommonStyles.ts +9 -2
  156. package/template/src/components/Controls.tsx +659 -52
  157. package/template/src/components/DeviceConfigure.tsx +362 -156
  158. package/template/src/components/DeviceContext.tsx +2 -0
  159. package/template/src/components/EventsConfigure.tsx +713 -109
  160. package/template/src/components/GraphQLProvider.tsx +62 -36
  161. package/template/src/components/GridVideo.tsx +23 -13
  162. package/template/src/components/HostControlView.tsx +11 -14
  163. package/template/src/components/JoinPhrase.tsx +0 -1
  164. package/template/src/components/Leftbar.tsx +4 -3
  165. package/template/src/components/Navbar.tsx +110 -42
  166. package/template/src/components/NavbarMobile.tsx +47 -36
  167. package/template/src/components/Navigation.native.tsx +1 -15
  168. package/template/src/{subComponents/screenshare/ScreenshareButton.native.tsx → components/Navigation.sdk.tsx} +17 -3
  169. package/template/src/components/Navigation.tsx +1 -15
  170. package/template/src/components/ParticipantsView.tsx +56 -48
  171. package/template/src/components/PinnedVideo.tsx +188 -114
  172. package/template/src/components/Precall.native.tsx +169 -67
  173. package/template/src/components/Precall.tsx +237 -71
  174. package/template/src/components/RTMConfigure.tsx +167 -55
  175. package/template/src/components/Rightbar.tsx +4 -3
  176. package/template/src/components/Router.electron.ts +1 -0
  177. package/template/src/components/Router.native.ts +1 -0
  178. package/template/src/components/Router.sdk.ts +1 -0
  179. package/template/src/components/Router.ts +1 -0
  180. package/template/src/components/SdkApiContext.tsx +179 -27
  181. package/template/src/components/SdkMuteToggleListener.tsx +88 -0
  182. package/template/src/components/SessionContext.tsx +0 -1
  183. package/template/src/components/Settings.tsx +25 -3
  184. package/template/src/components/SettingsView.tsx +44 -9
  185. package/template/src/components/Share.tsx +149 -71
  186. package/template/src/components/StorageContext.tsx +19 -5
  187. package/template/src/components/ToastComponent.tsx +3 -0
  188. package/template/src/components/WhiteboardLayout.tsx +291 -0
  189. package/template/src/components/chat-messages/useChatMessages.tsx +420 -207
  190. package/template/src/components/common/Error.tsx +2 -0
  191. package/template/src/components/common/Logo.tsx +2 -2
  192. package/template/src/components/contexts/LiveStreamDataContext.tsx +5 -4
  193. package/template/src/components/contexts/ScreenShareContext.tsx +15 -1
  194. package/template/src/components/contexts/WaitingRoomContext.tsx +50 -0
  195. package/template/src/components/contexts/WhiteboardContext.tsx +54 -54
  196. package/template/src/components/disable-chat/useDisableChat.tsx +32 -0
  197. package/template/src/components/livestream/LiveStreamContext.tsx +262 -177
  198. package/template/src/components/livestream/Types.ts +34 -18
  199. package/template/src/components/livestream/views/LiveStreamAttendeeLandingTile.tsx +295 -0
  200. package/template/src/components/livestream/views/LiveStreamControls.tsx +2 -4
  201. package/template/src/components/meeting-info-invite/MeetingInfo.tsx +82 -0
  202. package/template/src/components/meeting-info-invite/MeetingInfoCardHeader.tsx +86 -0
  203. package/template/src/components/meeting-info-invite/MeetingInfoGridTile.tsx +218 -0
  204. package/template/src/components/meeting-info-invite/MeetingInfoLinks.tsx +122 -0
  205. package/template/src/components/participants/AllAudienceParticipants.tsx +4 -5
  206. package/template/src/components/participants/AllHostParticipants.tsx +5 -6
  207. package/template/src/components/participants/Participant.tsx +40 -9
  208. package/template/src/components/participants/ParticipantSectionTitle.tsx +5 -2
  209. package/template/src/components/participants/ScreenshareParticipants.tsx +15 -17
  210. package/template/src/components/participants/UserActionMenuOptions.tsx +157 -49
  211. package/template/src/components/participants/WaitingRoomParticipants.tsx +74 -0
  212. package/template/src/components/popups/InvitePopup.tsx +110 -45
  213. package/template/src/components/popups/StartScreenSharePopup.native.tsx +182 -0
  214. package/template/src/components/popups/StartScreenSharePopup.tsx +6 -0
  215. package/template/src/components/popups/StopRecordingPopup.tsx +11 -5
  216. package/template/src/components/popups/StopScreenSharePopup.native.tsx +135 -0
  217. package/template/src/components/popups/StopScreenSharePopup.tsx +6 -0
  218. package/template/src/components/popups/WhiteboardClearAllPopup.tsx +123 -0
  219. package/template/src/components/precall/LocalMute.tsx +69 -45
  220. package/template/src/components/precall/PermissionHelper.tsx +52 -24
  221. package/template/src/components/precall/PreCallSettings.tsx +1 -0
  222. package/template/src/components/precall/VideoFallback.tsx +173 -0
  223. package/template/src/components/precall/VideoPreview.native.tsx +16 -50
  224. package/template/src/components/precall/VideoPreview.tsx +27 -162
  225. package/template/src/components/precall/index.tsx +2 -0
  226. package/template/src/components/precall/joinCallBtn.native.tsx +10 -3
  227. package/template/src/components/precall/joinCallBtn.tsx +11 -2
  228. package/template/src/components/precall/joinWaitingRoomBtn.native.tsx +210 -0
  229. package/template/src/components/precall/joinWaitingRoomBtn.tsx +250 -0
  230. package/template/src/components/precall/meetingTitle.tsx +35 -9
  231. package/template/src/components/precall/selectDevice.tsx +5 -5
  232. package/template/src/components/precall/textInput.tsx +16 -18
  233. package/template/src/components/precall/usePreCall.tsx +14 -4
  234. package/template/src/components/room-info/useRoomInfo.tsx +34 -0
  235. package/template/src/components/useShareLink.tsx +24 -59
  236. package/template/src/components/useUserPreference.tsx +73 -10
  237. package/template/src/components/useVideoCall.tsx +76 -3
  238. package/template/src/components/virtual-background/VBButton.tsx +64 -0
  239. package/template/src/components/virtual-background/VBCard.native.tsx +282 -0
  240. package/template/src/components/virtual-background/VBCard.tsx +272 -0
  241. package/template/src/components/virtual-background/VBPanel.tsx +279 -0
  242. package/template/src/components/virtual-background/VButils.native.ts +37 -0
  243. package/template/src/components/virtual-background/VButils.ts +104 -0
  244. package/template/src/components/virtual-background/VideoPreview.native.tsx +43 -0
  245. package/template/src/components/virtual-background/VideoPreview.tsx +106 -0
  246. package/template/src/components/virtual-background/imagePaths.ts +87 -0
  247. package/template/src/components/virtual-background/images/beachImageBase64.ts +1 -0
  248. package/template/src/components/virtual-background/images/bedroomImageBase64.ts +1 -0
  249. package/template/src/components/virtual-background/images/bookImageBase64.ts +1 -0
  250. package/template/src/components/virtual-background/images/earthImageBase64.ts +1 -0
  251. package/template/src/components/virtual-background/images/index.ts +37 -0
  252. package/template/src/components/virtual-background/images/lampImageBase64.ts +1 -0
  253. package/template/src/components/virtual-background/images/mountainsImageBase64.ts +1 -0
  254. package/template/src/components/virtual-background/images/office1ImageBase64.ts +1 -0
  255. package/template/src/components/virtual-background/images/officeImageBase64.ts +1 -0
  256. package/template/src/components/virtual-background/images/plantsImageBase64.ts +1 -0
  257. package/template/src/components/virtual-background/images/skyImageBase64.ts +1 -0
  258. package/template/src/components/virtual-background/images/wallImageBase64.ts +1 -0
  259. package/template/src/components/virtual-background/useVB.native.tsx +188 -0
  260. package/template/src/components/virtual-background/useVB.tsx +267 -0
  261. package/template/src/components/whiteboard/StrokeWidthTool.tsx +137 -0
  262. package/template/src/components/whiteboard/WhiteboardButton.tsx +93 -0
  263. package/template/src/components/whiteboard/WhiteboardCanvas.tsx +99 -0
  264. package/template/src/components/whiteboard/WhiteboardConfigure.native.tsx +137 -0
  265. package/template/src/components/whiteboard/WhiteboardConfigure.tsx +441 -0
  266. package/template/src/components/whiteboard/WhiteboardCursor.tsx +152 -0
  267. package/template/src/components/whiteboard/WhiteboardToolBox.tsx +1246 -0
  268. package/template/src/components/whiteboard/WhiteboardView.native.tsx +109 -0
  269. package/template/src/components/whiteboard/WhiteboardView.tsx +81 -0
  270. package/template/src/components/whiteboard/WhiteboardWidget.tsx +674 -0
  271. package/template/src/components/whiteboard/WhiteboardWrapper.tsx +38 -0
  272. package/template/src/language/default-labels/commonLabels.ts +51 -14
  273. package/template/src/language/default-labels/createScreenLabels.ts +97 -17
  274. package/template/src/language/default-labels/joinScreenLabels.ts +45 -6
  275. package/template/src/language/default-labels/precallScreenLabels.ts +145 -23
  276. package/template/src/language/default-labels/shareLinkScreenLabels.ts +85 -37
  277. package/template/src/language/default-labels/videoCallScreenLabels.ts +1137 -158
  278. package/template/src/pages/Create.tsx +125 -80
  279. package/template/src/pages/Join.tsx +76 -34
  280. package/template/src/pages/Login.tsx +26 -0
  281. package/template/src/pages/VideoCall.tsx +229 -114
  282. package/template/src/pages/video-call/ActionSheet.native.tsx +54 -7
  283. package/template/src/pages/video-call/ActionSheet.tsx +55 -16
  284. package/template/src/pages/video-call/ActionSheetContent.tsx +366 -291
  285. package/template/src/pages/video-call/ActionSheetHandle.tsx +7 -1
  286. package/template/src/pages/video-call/DefaultLayouts.ts +11 -5
  287. package/template/src/pages/video-call/NameWithMicIcon.tsx +17 -9
  288. package/template/src/pages/video-call/PinchableView.tsx +119 -0
  289. package/template/src/pages/video-call/RenderComponent.tsx +12 -3
  290. package/template/src/pages/video-call/SidePanelHeader.tsx +208 -6
  291. package/template/src/pages/video-call/VideoCallMobileView.tsx +140 -106
  292. package/template/src/pages/video-call/VideoCallScreen.native.tsx +3 -2
  293. package/template/src/pages/video-call/VideoCallScreen.tsx +113 -66
  294. package/template/src/pages/video-call/VideoComponent.tsx +53 -5
  295. package/template/src/pages/video-call/VideoRenderer.tsx +309 -52
  296. package/template/src/pages/video-call/VisibilitySensor.tsx +104 -0
  297. package/template/src/pages/video-call/ZoomableWrapper.native.tsx +34 -0
  298. package/template/src/pages/video-call/ZoomableWrapper.tsx +5 -0
  299. package/template/src/pages/video-call/index.ts +2 -0
  300. package/template/src/rtm/RTMEngine.ts +9 -4
  301. package/template/src/rtm-events/constants.ts +20 -0
  302. package/template/src/rtm-events-api/Events.ts +2 -0
  303. package/template/src/rtm-events-api/LocalEvents.ts +8 -0
  304. package/template/src/selection.json +1 -0
  305. package/template/src/subComponents/ChatBubble.tsx +81 -64
  306. package/template/src/subComponents/ChatContainer.tsx +20 -13
  307. package/template/src/subComponents/ChatInput.ios.tsx +11 -2
  308. package/template/src/subComponents/ChatInput.tsx +12 -3
  309. package/template/src/subComponents/Checkbox.native.tsx +46 -46
  310. package/template/src/subComponents/Checkbox.tsx +7 -6
  311. package/template/src/subComponents/CopyJoinInfo.tsx +26 -11
  312. package/template/src/subComponents/EndcallPopup.tsx +83 -12
  313. package/template/src/subComponents/LanguageSelector.tsx +34 -30
  314. package/template/src/subComponents/LayoutIconButton.tsx +30 -8
  315. package/template/src/subComponents/LayoutIconDropdown.tsx +19 -3
  316. package/template/src/subComponents/Loading.tsx +60 -0
  317. package/template/src/subComponents/LocalAudioMute.tsx +106 -30
  318. package/template/src/subComponents/LocalEndCall.tsx +91 -15
  319. package/template/src/subComponents/LocalSwitchCamera.tsx +50 -11
  320. package/template/src/subComponents/LocalVideoMute.tsx +126 -32
  321. package/template/src/subComponents/LogoutButton.tsx +1 -1
  322. package/template/src/subComponents/NetworkQualityPill.tsx +14 -31
  323. package/template/src/subComponents/Recording.tsx +23 -6
  324. package/template/src/subComponents/RemoteAudioMute.tsx +3 -3
  325. package/template/src/subComponents/RemoteMutePopup.tsx +55 -14
  326. package/template/src/subComponents/RemoteVideoMute.tsx +3 -3
  327. package/template/src/subComponents/RemoveMeetingPopup.tsx +19 -6
  328. package/template/src/subComponents/RemoveScreensharePopup.tsx +20 -5
  329. package/template/src/subComponents/ScreenShareNotice.tsx +11 -6
  330. package/template/src/subComponents/SelectDevice.tsx +98 -32
  331. package/template/src/subComponents/SidePanelEnum.tsx +2 -0
  332. package/template/src/subComponents/SidePanelHeader.tsx +97 -63
  333. package/template/src/subComponents/ToastConfig.tsx +70 -61
  334. package/template/src/subComponents/caption/Caption.tsx +130 -0
  335. package/template/src/subComponents/caption/CaptionContainer.tsx +302 -0
  336. package/template/src/subComponents/caption/CaptionIcon.tsx +111 -0
  337. package/template/src/subComponents/caption/CaptionText.tsx +182 -0
  338. package/template/src/subComponents/caption/DownloadTranscriptBtn.tsx +65 -0
  339. package/template/src/subComponents/caption/LanguageSelectorPopup.tsx +192 -0
  340. package/template/src/subComponents/caption/Transcript.tsx +449 -0
  341. package/template/src/subComponents/caption/TranscriptIcon.tsx +123 -0
  342. package/template/src/subComponents/caption/TranscriptText.tsx +98 -0
  343. package/template/src/subComponents/caption/index.ts +3 -0
  344. package/template/src/subComponents/caption/proto/ptoto.js +91 -0
  345. package/template/src/subComponents/caption/proto/test.proto +23 -0
  346. package/template/src/subComponents/caption/useCaption.tsx +123 -0
  347. package/template/src/subComponents/caption/useCaptionWidth.ts +27 -0
  348. package/template/src/subComponents/caption/useSTTAPI.tsx +179 -0
  349. package/template/src/subComponents/caption/useStreamMessageUtils.native.ts +211 -0
  350. package/template/src/subComponents/caption/useStreamMessageUtils.ts +235 -0
  351. package/template/src/subComponents/caption/useTranscriptDownload.native.ts +68 -0
  352. package/template/src/subComponents/caption/useTranscriptDownload.ts +52 -0
  353. package/template/src/subComponents/caption/utils.ts +125 -0
  354. package/template/src/subComponents/chat/ChatParticipants.tsx +53 -17
  355. package/template/src/subComponents/livestream/CurrentLiveStreamRequestsView.tsx +11 -13
  356. package/template/src/subComponents/livestream/controls/LocalRaiseHand.tsx +33 -9
  357. package/template/src/subComponents/livestream/controls/RemoteLiveStreamApprovedRequestRecall.tsx +1 -0
  358. package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestApprove.tsx +10 -6
  359. package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestReject.tsx +28 -19
  360. package/template/src/subComponents/recording/useRecording.tsx +49 -20
  361. package/template/src/subComponents/recording/useRecordingLayoutQuery.tsx +0 -1
  362. package/template/src/subComponents/screenshare/ScreenshareButton.tsx +29 -10
  363. package/template/src/subComponents/screenshare/ScreenshareConfigure.native.tsx +270 -66
  364. package/template/src/subComponents/screenshare/ScreenshareConfigure.tsx +182 -95
  365. package/template/src/subComponents/screenshare/useScreenshare.tsx +2 -0
  366. package/template/src/subComponents/waiting-rooms/WaitingRoomControls.tsx +85 -0
  367. package/template/src/subComponents/waiting-rooms/useWaitingRoomAPI.ts +75 -0
  368. package/template/src/theme/index.ts +9 -0
  369. package/template/src/utils/SdkEvents.ts +14 -0
  370. package/template/src/utils/SdkMethodEvents.ts +23 -3
  371. package/template/src/utils/axiomLogger.ts +117 -0
  372. package/template/src/utils/book.jpg +0 -0
  373. package/template/src/utils/common.tsx +118 -6
  374. package/template/src/utils/endCallEveryOne.ts +7 -0
  375. package/template/src/utils/getCustomRoute.ts +7 -0
  376. package/template/src/utils/index.tsx +23 -0
  377. package/template/src/utils/useActionSheet.tsx +50 -0
  378. package/template/src/utils/useActiveSpeaker.ts +3 -7
  379. package/template/src/utils/useAppState.ts +17 -0
  380. package/template/src/utils/useAsyncEffect.ts +138 -0
  381. package/template/src/utils/useCreateRoom.ts +8 -12
  382. package/template/src/utils/useDisableButton.tsx +37 -0
  383. package/template/src/utils/useFindActiveSpeaker.native.ts +4 -0
  384. package/template/src/utils/useFindActiveSpeaker.ts +335 -0
  385. package/template/src/utils/useIsLocalUserSpeaking.native.ts +4 -0
  386. package/template/src/utils/useIsLocalUserSpeaking.ts +98 -0
  387. package/template/src/utils/useJoinRoom.ts +97 -36
  388. package/template/src/utils/useMuteToggleLocal.ts +114 -96
  389. package/template/src/utils/useString.ts +13 -3
  390. package/template/static.d.ts +42 -0
  391. package/template/tsconfig_rsdk_index.json +3 -3
  392. package/template/tsconfig_wsdk_index.json +1 -1
  393. package/template/web/index.html +20 -0
  394. package/template/webpack.commons.js +21 -10
  395. package/template/webpack.web.config.js +7 -3
  396. package/template/_buckconfig +0 -6
  397. package/template/_gitattributes +0 -1
  398. package/template/android/app/_BUCK +0 -55
  399. package/template/android/app/build_defs.bzl +0 -19
  400. package/template/ios/HelloWorld/AppDelegate.m +0 -74
  401. package/template/src/components/OAuth.electron.tsx +0 -41
  402. package/template/src/components/OAuth.native.tsx +0 -55
  403. package/template/src/components/OAuth.tsx +0 -30
  404. package/template/src/components/OAuthConfig.ts +0 -77
  405. package/template/src/components/Settings.native.tsx +0 -21
  406. package/template/src/components/StoreToken.tsx +0 -39
@@ -10,77 +10,256 @@
10
10
  *********************************************
11
11
  */
12
12
  import React, {useContext, useEffect, useRef} from 'react';
13
- import {StyleSheet} from 'react-native';
14
- import PrimaryButton from '../atoms/PrimaryButton';
13
+ import {StyleSheet, View, TouchableOpacity, Text} from 'react-native';
15
14
  import {
16
15
  RtcContext,
17
- UidType,
18
- useLocalUid,
19
16
  DispatchContext,
17
+ useLocalUid,
18
+ PropsContext,
19
+ PermissionState,
20
20
  } from '../../agora-rn-uikit';
21
- import events from '../rtm-events-api';
21
+ import events, {PersistanceLevel} from '../rtm-events-api';
22
22
  import {controlMessageEnum} from '../components/ChatContext';
23
23
  import Toast from '../../react-native-toast-message';
24
24
  import TertiaryButton from '../atoms/TertiaryButton';
25
- import {useContent} from 'customization-api';
26
- import {useParams} from '../components/Router';
27
- import StorageContext from './StorageContext';
28
- import {isWebInternal} from '../utils/common';
25
+ import {useContent, useLocalUserInfo} from 'customization-api';
26
+ import {isAndroid, isIOS, isWebInternal} from '../utils/common';
27
+ import {useScreenshare} from '../subComponents/screenshare/useScreenshare';
28
+ import {
29
+ RoomInfoContextInterface,
30
+ useRoomInfo,
31
+ } from '../components/room-info/useRoomInfo';
32
+ import {useSetRoomInfo} from '../components/room-info/useSetRoomInfo';
33
+ import {EventNames} from '../rtm-events';
34
+ import {useWaitingRoomContext} from './contexts/WaitingRoomContext';
35
+ import useWaitingRoomAPI from '../../src/subComponents/waiting-rooms/useWaitingRoomAPI';
29
36
  import LocalEventEmitter, {
30
37
  LocalEventsEnum,
31
- } from '../rtm-events-api/LocalEvents';
38
+ } from '../../src/rtm-events-api/LocalEvents';
39
+ import {ENABLE_AUTH} from '../auth/config';
40
+ import {useAuth} from '../auth/AuthProvider';
41
+ import ThemeConfig from '../theme';
42
+ import {
43
+ I18nMuteType,
44
+ hostMutedUserToastHeading,
45
+ hostRemovedUserToastHeading,
46
+ hostRequestedUserToastHeading,
47
+ hostRequestedUserToastPrimaryBtnText,
48
+ hostRequestedUserToastSecondaryBtnText,
49
+ waitingRoomApprovalRequiredPrimaryBtnText,
50
+ waitingRoomApprovalRequiredSecondaryBtnText,
51
+ waitingRoomApprovalRequiredToastHeading,
52
+ waitingRoomApprovalRequiredToastSubHeading,
53
+ } from '../language/default-labels/videoCallScreenLabels';
54
+ import {useString} from '../utils/useString';
32
55
 
33
56
  interface Props {
34
57
  children: React.ReactNode;
35
58
  }
36
59
 
37
- const EventsConfigure: React.FC<Props> = (props) => {
38
- const {setStore} = useContext(StorageContext);
39
- const {RtcEngineUnsafe} = useContext(RtcContext);
60
+ const EventsConfigure: React.FC<Props> = props => {
61
+ // mute user audio
62
+ const hostMutedUserAudioToastHeadingTT = useString<I18nMuteType>(
63
+ hostMutedUserToastHeading,
64
+ )(I18nMuteType.audio);
65
+
66
+ const audioMuteToastRef = useRef(hostMutedUserAudioToastHeadingTT);
67
+ useEffect(() => {
68
+ audioMuteToastRef.current = hostMutedUserAudioToastHeadingTT;
69
+ }, [hostMutedUserAudioToastHeadingTT]);
70
+
71
+ // mute user video
72
+ const hostMutedUserVideoToastHeadingTT = useString<I18nMuteType>(
73
+ hostMutedUserToastHeading,
74
+ )(I18nMuteType.video);
75
+
76
+ const videoMuteToastRef = useRef(hostMutedUserVideoToastHeadingTT);
77
+ useEffect(() => {
78
+ videoMuteToastRef.current = hostMutedUserVideoToastHeadingTT;
79
+ }, [hostMutedUserVideoToastHeadingTT]);
80
+
81
+ //request user video
82
+ const hostRequestedUserVideoToastHeadingTT = useString<I18nMuteType>(
83
+ hostRequestedUserToastHeading,
84
+ )(I18nMuteType.video);
85
+
86
+ const videoRequestToastRef = useRef(hostRequestedUserVideoToastHeadingTT);
87
+ useEffect(() => {
88
+ videoRequestToastRef.current = hostRequestedUserVideoToastHeadingTT;
89
+ }, [hostRequestedUserVideoToastHeadingTT]);
90
+
91
+ //request user audio
92
+ const hostRequestedUserAudioToastHeadingTT = useString<I18nMuteType>(
93
+ hostRequestedUserToastHeading,
94
+ )(I18nMuteType.audio);
95
+
96
+ const audioRequestToastRef = useRef(hostRequestedUserAudioToastHeadingTT);
97
+ useEffect(() => {
98
+ audioRequestToastRef.current = hostRequestedUserAudioToastHeadingTT;
99
+ }, [hostRequestedUserAudioToastHeadingTT]);
100
+
101
+ //request user video primary btn
102
+ const hostRequestedUserVideoToastPrimaryBtnTextTT = useString<I18nMuteType>(
103
+ hostRequestedUserToastPrimaryBtnText,
104
+ )(I18nMuteType.video);
105
+
106
+ const requestUserVideoPrimaryBtnRef = useRef(
107
+ hostRequestedUserVideoToastPrimaryBtnTextTT,
108
+ );
109
+
110
+ useEffect(() => {
111
+ requestUserVideoPrimaryBtnRef.current =
112
+ hostRequestedUserVideoToastPrimaryBtnTextTT;
113
+ }, [hostRequestedUserVideoToastPrimaryBtnTextTT]);
114
+
115
+ //request user audio primary btn
116
+ const hostRequestedUserAudioToastPrimaryBtnTextTT = useString<I18nMuteType>(
117
+ hostRequestedUserToastPrimaryBtnText,
118
+ )(I18nMuteType.audio);
119
+
120
+ const requestUserAudioPrimaryBtnRef = useRef(
121
+ hostRequestedUserAudioToastPrimaryBtnTextTT,
122
+ );
123
+
124
+ useEffect(() => {
125
+ requestUserAudioPrimaryBtnRef.current =
126
+ hostRequestedUserAudioToastPrimaryBtnTextTT;
127
+ }, [hostRequestedUserAudioToastPrimaryBtnTextTT]);
128
+
129
+ //request user video secondary btn
130
+ const hostRequestedUserVideoToastSecondaryBtnTextTT = useString<I18nMuteType>(
131
+ hostRequestedUserToastSecondaryBtnText,
132
+ )(I18nMuteType.video);
133
+
134
+ const requestUserVideoSecondaryBtnRef = useRef(
135
+ hostRequestedUserVideoToastSecondaryBtnTextTT,
136
+ );
137
+ useEffect(() => {
138
+ requestUserVideoSecondaryBtnRef.current =
139
+ hostRequestedUserVideoToastSecondaryBtnTextTT;
140
+ }, [hostRequestedUserVideoToastSecondaryBtnTextTT]);
141
+
142
+ //request user audio secondary btn
143
+ const hostRequestedUserAudioToastSecondaryBtnTextTT = useString<I18nMuteType>(
144
+ hostRequestedUserToastSecondaryBtnText,
145
+ )(I18nMuteType.audio);
146
+
147
+ const requestUserAudioSecondaryBtnRef = useRef(
148
+ hostRequestedUserAudioToastSecondaryBtnTextTT,
149
+ );
150
+ useEffect(() => {
151
+ requestUserAudioSecondaryBtnRef.current =
152
+ hostRequestedUserAudioToastSecondaryBtnTextTT;
153
+ }, [hostRequestedUserAudioToastSecondaryBtnTextTT]);
154
+
155
+ //host removed
156
+ const hostRemovedUserToastHeadingTT = useString(
157
+ hostRemovedUserToastHeading,
158
+ )();
159
+
160
+ const removedUserToastRef = useRef(hostRemovedUserToastHeadingTT);
161
+
162
+ useEffect(() => {
163
+ removedUserToastRef.current = hostRemovedUserToastHeadingTT;
164
+ }, [hostRemovedUserToastHeadingTT]);
165
+
166
+ //waiting room heading
167
+ const waitingRoomApprovalRequiredToastHeadingTT = useString(
168
+ waitingRoomApprovalRequiredToastHeading,
169
+ )();
170
+
171
+ const waitingRoomAppovalHeadingRef = useRef(
172
+ waitingRoomApprovalRequiredToastHeadingTT,
173
+ );
174
+
175
+ useEffect(() => {
176
+ waitingRoomAppovalHeadingRef.current =
177
+ waitingRoomApprovalRequiredToastHeadingTT;
178
+ }, [waitingRoomApprovalRequiredToastHeadingTT]);
179
+
180
+ //waiting room subheading
181
+ const waitingRoomApprovalRequiredToastSubHeadingTT = useString(
182
+ waitingRoomApprovalRequiredToastSubHeading,
183
+ );
184
+
185
+ const waitingRoomApprovalSubHeadingRef = useRef(
186
+ waitingRoomApprovalRequiredToastSubHeadingTT,
187
+ );
188
+
189
+ useEffect(() => {
190
+ waitingRoomApprovalSubHeadingRef.current =
191
+ waitingRoomApprovalRequiredToastSubHeadingTT;
192
+ }, [waitingRoomApprovalRequiredToastSubHeadingTT]);
193
+
194
+ //waiting room primary btn
195
+ const waitingRoomApprovalRequiredPrimaryBtnTextTT = useString(
196
+ waitingRoomApprovalRequiredPrimaryBtnText,
197
+ )();
198
+
199
+ const waitingRoomApprovalPrimaryBtnRef = useRef(
200
+ waitingRoomApprovalRequiredPrimaryBtnTextTT,
201
+ );
202
+
203
+ useEffect(() => {
204
+ waitingRoomApprovalPrimaryBtnRef.current =
205
+ waitingRoomApprovalRequiredPrimaryBtnTextTT;
206
+ }, [waitingRoomApprovalRequiredPrimaryBtnTextTT]);
207
+
208
+ //waiting room secondary btn
209
+ const waitingRoomApprovalRequiredSecondaryBtnTextTT = useString(
210
+ waitingRoomApprovalRequiredSecondaryBtnText,
211
+ )();
212
+
213
+ const waitingRoomApprovalSecondaryBtnRef = useRef(
214
+ waitingRoomApprovalRequiredSecondaryBtnTextTT,
215
+ );
216
+
217
+ useEffect(() => {
218
+ waitingRoomApprovalSecondaryBtnRef.current =
219
+ waitingRoomApprovalRequiredSecondaryBtnTextTT;
220
+ }, [waitingRoomApprovalRequiredSecondaryBtnTextTT]);
221
+
222
+ //@ts-ignore
223
+ const {isScreenshareActive, ScreenshareStoppedCallback, stopUserScreenShare} =
224
+ useScreenshare();
225
+ const isLiveStream = $config.EVENT_MODE;
40
226
  const {dispatch} = useContext(DispatchContext);
41
- const {defaultContent} = useContent();
227
+ const {RtcEngineUnsafe} = useContext(RtcContext);
228
+ const {defaultContent, activeUids} = useContent();
42
229
  const defaultContentRef = useRef({defaultContent});
43
- const {phrase} = useParams<{phrase: string}>();
44
- const localUid = useLocalUid();
45
- const activeSpeakerUid = useRef(undefined);
230
+ const isScreenshareActiveRef = useRef({isScreenshareActive});
231
+ useEffect(() => {
232
+ isScreenshareActiveRef.current.isScreenshareActive = isScreenshareActive;
233
+ }, [isScreenshareActive]);
46
234
  useEffect(() => {
47
235
  defaultContentRef.current.defaultContent = defaultContent;
48
236
  }, [defaultContent]);
237
+ const {
238
+ data: {isHost},
239
+ } = useRoomInfo();
240
+ const {setRoomInfo} = useSetRoomInfo();
241
+ const isHostRef = React.useRef(isHost);
242
+ const {permissionStatus} = useLocalUserInfo();
243
+ const permissionStatusRef = React.useRef(permissionStatus);
244
+ const {waitingRoomUids, waitingRoomRef} = useWaitingRoomContext();
245
+ const waitingRoomUidsRef = React.useRef(waitingRoomUids);
246
+ const {approval} = useWaitingRoomAPI();
247
+ const localUid = useLocalUid();
248
+ const activeUidsRef = React.useRef(activeUids);
249
+ const {authLogin} = useAuth();
250
+ React.useEffect(() => {
251
+ activeUidsRef.current = activeUids;
252
+ }, [activeUids]);
49
253
 
50
- const emitActiveSpeaker = (uid: UidType) => {
51
- if (uid !== activeSpeakerUid.current) {
52
- activeSpeakerUid.current = uid;
53
- LocalEventEmitter.emit(LocalEventsEnum.ACTIVE_SPEAKER, uid);
54
- }
55
- };
56
-
57
- useEffect(() => {
58
- RtcEngineUnsafe.addListener('AudioVolumeIndication', (...args) => {
59
- // console.log('-- AudioVolumeCallback', args);
60
- const [speakers, totalVolume] = args;
61
- if (speakers[0]?.uid === 0) {
62
- //callback for local user
63
- const isLocalUserSpeaking = speakers[0].vad; //1-speaking , 0-not speaking
64
- const localUserVolumeLevel = speakers[0].volume;
65
- // vad value is not consistent while speaking so using volume level
66
- if (localUserVolumeLevel > 0) {
67
- emitActiveSpeaker(localUid);
68
- } else {
69
- //undefined
70
- emitActiveSpeaker(undefined);
71
- }
72
- } else {
73
- // remote users callback, this will be handeled in ActiveSpeaker callback(367)
74
- // const highestvolumeObj = speakers.reduce(function (prev, current) {
75
- // return prev.volume > current.volume ? prev : current;
76
- // }, null);
77
- }
78
- });
254
+ useEffect(() => {
255
+ isHostRef.current = isHost;
256
+ }, [isHost]);
79
257
 
80
- RtcEngineUnsafe.addListener('ActiveSpeaker', (...args) => {
81
- // used as a callback from the web bridge as well remote users
82
- emitActiveSpeaker(args[0]);
83
- });
258
+ useEffect(() => {
259
+ permissionStatusRef.current = permissionStatus;
260
+ }, [permissionStatus]);
261
+
262
+ useEffect(() => {
84
263
  //user joined event listener
85
264
  // events.on(controlMessageEnum.newUserJoined, ({payload}) => {
86
265
  // const data = JSON.parse(payload);
@@ -96,33 +275,47 @@ const EventsConfigure: React.FC<Props> = (props) => {
96
275
  // });
97
276
  events.on(controlMessageEnum.muteVideo, async ({payload, sender}) => {
98
277
  Toast.show({
278
+ leadingIconName: 'video-off',
99
279
  type: 'info',
100
280
  // text1: `${
101
281
  // defaultContentRef.current.defaultContent[sender].name || 'The host'
102
282
  // } muted you.`,
103
- text1: 'The host has muted your video.',
283
+ text1: videoMuteToastRef.current,
104
284
  visibilityTime: 3000,
105
285
  primaryBtn: null,
106
286
  secondaryBtn: null,
287
+ leadingIcon: null,
107
288
  });
108
- isWebInternal()
109
- ? await RtcEngineUnsafe.muteLocalVideoStream(true)
110
- : await RtcEngineUnsafe.enableLocalVideo(false);
111
- dispatch({
112
- type: 'LocalMuteVideo',
113
- value: [0],
114
- });
289
+ if (
290
+ (isAndroid() || isIOS()) &&
291
+ isScreenshareActiveRef.current.isScreenshareActive
292
+ ) {
293
+ //@ts-ignore
294
+ stopUserScreenShare(false, true);
295
+ } else {
296
+ isWebInternal()
297
+ ? await RtcEngineUnsafe.muteLocalVideoStream(true)
298
+ : //@ts-ignore
299
+ await RtcEngineUnsafe.enableLocalVideo(false);
300
+ await updateVideoStream(true);
301
+ dispatch({
302
+ type: 'LocalMuteVideo',
303
+ value: [0],
304
+ });
305
+ }
115
306
  });
116
307
  events.on(controlMessageEnum.muteAudio, ({sender}) => {
117
308
  Toast.show({
309
+ leadingIconName: 'mic-off',
118
310
  type: 'info',
119
311
  // text1: `${
120
312
  // defaultContentRef.current.defaultContent[sender].name || 'The host'
121
313
  // } muted you.`,
122
- text1: 'The host has muted your audio.',
314
+ text1: audioMuteToastRef.current,
123
315
  visibilityTime: 3000,
124
316
  primaryBtn: null,
125
317
  secondaryBtn: null,
318
+ leadingIcon: null,
126
319
  });
127
320
  RtcEngineUnsafe.muteLocalAudioStream(true);
128
321
  dispatch({
@@ -130,10 +323,25 @@ const EventsConfigure: React.FC<Props> = (props) => {
130
323
  value: [0],
131
324
  });
132
325
  });
133
- events.on(controlMessageEnum.kickUser, () => {
326
+ events.on(controlMessageEnum.kickUser, async () => {
327
+ //before kickoff the user we have check whether screenshare on/off
328
+ //if its on then stop screenshare and emit event for screensharing is stopped
329
+ try {
330
+ if (isScreenshareActiveRef?.current?.isScreenshareActive) {
331
+ ScreenshareStoppedCallback && ScreenshareStoppedCallback();
332
+ }
333
+ } catch (error) {
334
+ console.log('error on stop the screeshare', error);
335
+ }
336
+
337
+ if (!ENABLE_AUTH) {
338
+ // await authLogout();
339
+ await authLogin();
340
+ }
134
341
  Toast.show({
342
+ leadingIconName: 'info',
135
343
  type: 'info',
136
- text1: 'The host has removed you from the room.',
344
+ text1: removedUserToastRef.current,
137
345
  visibilityTime: 5000,
138
346
  primaryBtn: null,
139
347
  secondaryBtn: null,
@@ -141,59 +349,438 @@ const EventsConfigure: React.FC<Props> = (props) => {
141
349
  setTimeout(() => {
142
350
  dispatch({
143
351
  type: 'EndCall',
144
- value: [],
352
+ value: [isHostRef.current, true],
145
353
  });
146
354
  }, 5000);
147
355
  });
356
+
357
+ events.on(controlMessageEnum.endCallForEveryone, async () => {
358
+ setTimeout(() => {
359
+ dispatch({
360
+ type: 'EndCall',
361
+ value: [isHostRef.current, true],
362
+ });
363
+ }, 1000);
364
+ });
365
+
148
366
  events.on(controlMessageEnum.requestAudio, () => {
149
367
  Toast.show({
368
+ leadingIconName: 'mic-on',
150
369
  type: 'info',
151
- text1: 'The host has requested you to speak',
370
+ text1: audioRequestToastRef.current,
152
371
  visibilityTime: 3000,
153
- primaryBtn: (
154
- <PrimaryButton
155
- containerStyle={style.primaryBtn}
156
- textStyle={{fontWeight: '600', fontSize: 16, paddingLeft: 0}}
157
- text="UNMUTE"
158
- onPress={() => {
159
- RtcEngineUnsafe.muteLocalAudioStream(false);
160
- dispatch({
161
- type: 'LocalMuteAudio',
162
- value: [1],
163
- });
164
- Toast.hide();
165
- }}
166
- />
167
- ),
168
- secondaryBtn: SecondaryBtn,
372
+ leadingIcon: null,
373
+ primaryBtn:
374
+ permissionStatusRef.current ===
375
+ PermissionState.GRANTED_FOR_CAM_AND_MIC ||
376
+ permissionStatusRef.current ===
377
+ PermissionState.GRANTED_FOR_MIC_ONLY ? (
378
+ <PrimaryButton
379
+ containerStyle={style.primaryBtn}
380
+ textStyle={style.textStyle}
381
+ text={requestUserAudioPrimaryBtnRef.current}
382
+ onPress={() => {
383
+ RtcEngineUnsafe.muteLocalAudioStream(false);
384
+ dispatch({
385
+ type: 'LocalMuteAudio',
386
+ value: [1],
387
+ });
388
+ Toast.hide();
389
+ }}
390
+ />
391
+ ) : null,
392
+ secondaryBtn:
393
+ permissionStatusRef.current ===
394
+ PermissionState.GRANTED_FOR_CAM_AND_MIC ||
395
+ permissionStatusRef.current ===
396
+ PermissionState.GRANTED_FOR_MIC_ONLY ? (
397
+ <SecondaryBtn text={requestUserAudioSecondaryBtnRef.current} />
398
+ ) : null,
169
399
  });
170
400
  });
171
401
  events.on(controlMessageEnum.requestVideo, () => {
172
402
  Toast.show({
403
+ leadingIconName: 'video-on',
173
404
  type: 'info',
174
- text1: 'The host has asked you to start your video.',
405
+ text1: videoRequestToastRef.current,
175
406
  visibilityTime: 3000,
176
- primaryBtn: (
177
- <PrimaryButton
178
- containerStyle={style.primaryBtn}
179
- textStyle={style.primaryBtnText}
180
- text="UNMUTE"
181
- onPress={async () => {
182
- isWebInternal()
183
- ? await RtcEngineUnsafe.muteLocalVideoStream(false)
184
- : await RtcEngineUnsafe.enableLocalVideo(true);
185
- dispatch({
186
- type: 'LocalMuteVideo',
187
- value: [1],
188
- });
189
- Toast.hide();
190
- }}
191
- />
192
- ),
193
- secondaryBtn: SecondaryBtn,
407
+ leadingIcon: null,
408
+ primaryBtn:
409
+ permissionStatusRef.current ===
410
+ PermissionState.GRANTED_FOR_CAM_AND_MIC ||
411
+ permissionStatusRef.current ===
412
+ PermissionState.GRANTED_FOR_CAM_ONLY ? (
413
+ <PrimaryButton
414
+ containerStyle={style.primaryBtn}
415
+ textStyle={style.textStyle}
416
+ text={requestUserVideoPrimaryBtnRef.current}
417
+ onPress={async () => {
418
+ isWebInternal()
419
+ ? await RtcEngineUnsafe.muteLocalVideoStream(false)
420
+ : //@ts-ignore
421
+ await RtcEngineUnsafe.enableLocalVideo(true);
422
+ await updateVideoStream(false);
423
+ dispatch({
424
+ type: 'LocalMuteVideo',
425
+ value: [1],
426
+ });
427
+ Toast.hide();
428
+ }}
429
+ />
430
+ ) : null,
431
+ secondaryBtn:
432
+ permissionStatusRef.current ===
433
+ PermissionState.GRANTED_FOR_CAM_AND_MIC ||
434
+ permissionStatusRef.current ===
435
+ PermissionState.GRANTED_FOR_CAM_ONLY ? (
436
+ <SecondaryBtn text={requestUserVideoSecondaryBtnRef.current} />
437
+ ) : null,
438
+ });
439
+ });
440
+
441
+ events.on(EventNames.WHITEBOARD_ACTIVE, ({payload}) => {
442
+ const data = JSON.parse(payload);
443
+ if (data && data?.status) {
444
+ if ($config.ENABLE_WAITING_ROOM && !isHostRef.current) {
445
+ setRoomInfo(prev => {
446
+ return {
447
+ ...prev,
448
+ isWhiteBoardOn: true,
449
+ };
450
+ });
451
+ } else {
452
+ LocalEventEmitter.emit(LocalEventsEnum.WHITEBOARD_ACTIVE_LOCAL, {
453
+ status: data?.status,
454
+ });
455
+ }
456
+ } else {
457
+ if ($config.ENABLE_WAITING_ROOM && !isHostRef.current) {
458
+ setRoomInfo(prev => {
459
+ return {
460
+ ...prev,
461
+ isWhiteBoardOn: false,
462
+ };
463
+ });
464
+ } else {
465
+ LocalEventEmitter.emit(LocalEventsEnum.WHITEBOARD_ACTIVE_LOCAL, {
466
+ status: data?.status,
467
+ });
468
+ }
469
+ }
470
+ });
471
+
472
+ events.on(EventNames.BOARD_COLOR_CHANGED, ({payload}) => {
473
+ const data = JSON.parse(payload);
474
+ if (data?.boardColor) {
475
+ if ($config.ENABLE_WAITING_ROOM && !isHostRef.current) {
476
+ setRoomInfo(prev => {
477
+ return {
478
+ ...prev,
479
+ boardColor: data?.boardColor,
480
+ };
481
+ });
482
+ } else {
483
+ LocalEventEmitter.emit(LocalEventsEnum.BOARD_COLOR_CHANGED_LOCAL, {
484
+ boardColor: data?.boardColor,
485
+ });
486
+ }
487
+ }
488
+ });
489
+
490
+ events.on(EventNames.WHITEBOARD_LAST_IMAGE_UPLOAD_POSITION, ({payload}) => {
491
+ const data = JSON.parse(payload);
492
+ if ($config.ENABLE_WAITING_ROOM && !isHostRef.current) {
493
+ setRoomInfo(prev => {
494
+ return {
495
+ ...prev,
496
+ whiteboardLastImageUploadPosition: {height: data?.height || 0},
497
+ };
498
+ });
499
+ } else {
500
+ LocalEventEmitter.emit(
501
+ LocalEventsEnum.WHITEBOARD_LAST_IMAGE_UPLOAD_POSITION_LOCAL,
502
+ {
503
+ height: data?.height || 0,
504
+ },
505
+ );
506
+ }
507
+ });
508
+
509
+ events.on(EventNames.STT_ACTIVE, data => {
510
+ const payload = JSON.parse(data?.payload);
511
+ setRoomInfo(prev => {
512
+ return {
513
+ ...prev,
514
+ isSTTActive: payload.active,
515
+ };
516
+ });
517
+ });
518
+
519
+ events.on(EventNames.STT_LANGUAGE, data => {
520
+ const {
521
+ username,
522
+ prevLang,
523
+ newLang,
524
+ uid,
525
+ }: RoomInfoContextInterface['sttLanguage'] = JSON.parse(data?.payload);
526
+ // set this on roominfo then use it in Controls
527
+ const sttLangObj = {
528
+ username,
529
+ prevLang,
530
+ newLang,
531
+ uid,
532
+ langChanged: true,
533
+ };
534
+ setRoomInfo(prev => {
535
+ return {
536
+ ...prev,
537
+ sttLanguage: sttLangObj,
538
+ };
539
+ });
540
+ });
541
+
542
+ events.on(EventNames.WAITING_ROOM_STATUS_UPDATE, data => {
543
+ if (!isHostRef.current) return;
544
+ const {attendee_uid, approved} = JSON.parse(data?.payload);
545
+ // update waiting room status in other host's panel
546
+ dispatch({
547
+ type: 'UpdateRenderList',
548
+ value: [attendee_uid, {isInWaitingRoom: false}],
549
+ });
550
+
551
+ waitingRoomRef.current[attendee_uid] = approved ? 'APPROVED' : 'REJECTED';
552
+ // hide toast in other host's screen
553
+ if (Toast.getToastId() === attendee_uid) {
554
+ Toast.hide();
555
+ }
556
+ });
557
+
558
+ events.on(EventNames.WAITING_ROOM_REQUEST, data => {
559
+ if (!isHostRef.current) return;
560
+
561
+ console.log(
562
+ 'waitingRoomRef on WAITING_ROOM_REQUEST',
563
+ waitingRoomRef.current,
564
+ );
565
+
566
+ const {attendee_uid, attendee_screenshare_uid} = JSON.parse(
567
+ data?.payload,
568
+ );
569
+ if (attendee_uid == '') return;
570
+
571
+ //condition1 -if user request already approved(in the call)
572
+ if (activeUidsRef.current.indexOf(attendee_uid) !== -1) {
573
+ console.log('debugging in active uids');
574
+ return;
575
+ }
576
+ //condition2 -if user request already pending(in the waiting room)
577
+ if (waitingRoomUidsRef.current.indexOf(attendee_uid) !== -1) {
578
+ console.log('debugging in waitingRoomUidsRef');
579
+ return;
580
+ }
581
+ if (
582
+ waitingRoomRef.current[attendee_uid] &&
583
+ (waitingRoomRef.current[attendee_uid] === 'PENDING' ||
584
+ waitingRoomRef.current[attendee_uid] === 'APPROVED')
585
+ ) {
586
+ return;
587
+ }
588
+
589
+ const userName =
590
+ //@ts-ignore
591
+ defaultContentRef.current.defaultContent[attendee_uid]?.name ||
592
+ 'Attendee';
593
+ // put the attendee in waitingroom in renderlist
594
+ dispatch({
595
+ type: 'UpdateRenderList',
596
+ value: [attendee_uid, {isInWaitingRoom: true}],
597
+ });
598
+
599
+ waitingRoomRef.current[attendee_uid] = 'PENDING';
600
+ // check if any other host has approved then dont show permission to join the room
601
+
602
+ let btns: any = {};
603
+ btns.toastId = attendee_uid;
604
+ btns.primaryBtn = (
605
+ <PrimaryButton
606
+ containerStyle={style.primaryBtn}
607
+ textStyle={style.textStyle}
608
+ text={waitingRoomApprovalPrimaryBtnRef.current}
609
+ onPress={() => {
610
+ // user approving waiting room request
611
+ const res = approval({
612
+ host_uid: localUid,
613
+ attendee_uid: attendee_uid,
614
+ attendee_screenshare_uid: attendee_screenshare_uid,
615
+ approved: true,
616
+ });
617
+ dispatch({
618
+ type: 'UpdateRenderList',
619
+ value: [attendee_uid, {isInWaitingRoom: false}],
620
+ });
621
+
622
+ waitingRoomRef.current[attendee_uid] = 'APPROVED';
623
+
624
+ console.log('waitingRoomRef on APPROVAL', waitingRoomRef.current);
625
+ // inform other that hosts as well
626
+ events.send(
627
+ EventNames.WAITING_ROOM_STATUS_UPDATE,
628
+ JSON.stringify({attendee_uid, approved: true}),
629
+ PersistanceLevel.None,
630
+ );
631
+ // server will send the RTM message with approved status and RTC token to the approved attendee.
632
+ Toast.hide();
633
+ }}
634
+ />
635
+ );
636
+ btns.secondaryBtn = (
637
+ <TertiaryButton
638
+ containerStyle={style.secondaryBtn}
639
+ textStyle={style.textStyle}
640
+ text={waitingRoomApprovalSecondaryBtnRef.current}
641
+ onPress={() => {
642
+ // user rejecting waiting room request
643
+ const res = approval({
644
+ host_uid: localUid,
645
+ attendee_uid: attendee_uid,
646
+ attendee_screenshare_uid: attendee_screenshare_uid,
647
+ approved: false,
648
+ });
649
+ dispatch({
650
+ type: 'UpdateRenderList',
651
+ value: [attendee_uid, {isInWaitingRoom: false}],
652
+ });
653
+
654
+ waitingRoomRef.current[attendee_uid] = 'REJECTED';
655
+
656
+ console.log('waitingRoomRef on REJECTION', waitingRoomRef.current);
657
+ // inform other that hosts as well
658
+ events.send(
659
+ 'WAITING_ROOM_STATUS_UPDATE',
660
+ JSON.stringify({attendee_uid, approved: false}),
661
+ PersistanceLevel.None,
662
+ );
663
+ console.log('waiting-room:reject', res);
664
+ // server will send the RTM message with rejected status and RTC token to the approved attendee.
665
+ Toast.hide();
666
+ }}
667
+ />
668
+ );
669
+
670
+ Toast.show({
671
+ leadingIconName: 'info',
672
+ leadingIcon: null,
673
+ type: 'info',
674
+ text1: waitingRoomAppovalHeadingRef.current,
675
+ text2: waitingRoomApprovalSubHeadingRef.current(userName),
676
+ visibilityTime: 30000,
677
+ ...btns,
194
678
  });
195
679
  });
196
680
 
681
+ // events.on(EventNames.WAITING_ROOM_STATUS_UPDATE, data => {
682
+ // if (!isHost) return;
683
+ // const {attendee_uid} = JSON.parse(data?.payload);
684
+ // // update waiting room status in other host's panel
685
+ // dispatch({
686
+ // type: 'UpdateRenderList',
687
+ // value: [attendee_uid, {isInWaitingRoom: false}],
688
+ // });
689
+ // // hide toast in other host's screen
690
+ // if (Toast.getToastId() === attendee_uid) {
691
+ // Toast.hide();
692
+ // }
693
+ // });
694
+
695
+ // events.on(EventNames.WAITING_ROOM_REQUEST, data => {
696
+ // if (!isHost) return;
697
+
698
+ // const {attendee_uid, attendee_screenshare_uid} = JSON.parse(
699
+ // data?.payload,
700
+ // );
701
+ // const userName =
702
+ // defaultContentRef.current.defaultContent[attendee_uid]?.name || 'OO';
703
+ // // put the attendee in waitingroom in renderlist
704
+ // dispatch({
705
+ // type: 'UpdateRenderList',
706
+ // value: [attendee_uid, {isInWaitingRoom: true}],
707
+ // });
708
+ // // check if any other host has approved then dont show permission to join the room
709
+ // let btns: any = {};
710
+ // btns.toastId = attendee_uid;
711
+ // btns.primaryBtn = (
712
+ // <PrimaryButton
713
+ // containerStyle={style.primaryBtn}
714
+ // textStyle={style.primaryBtnText}
715
+ // text="Admit"
716
+ // onPress={() => {
717
+ // // user approving waiting room request
718
+ // const res = approval({
719
+ // host_uid: localUid,
720
+ // attendee_uid: attendee_uid,
721
+ // attendee_screenshare_uid: attendee_screenshare_uid,
722
+ // approved: true,
723
+ // });
724
+ // dispatch({
725
+ // type: 'UpdateRenderList',
726
+ // value: [attendee_uid, {isInWaitingRoom: false}],
727
+ // });
728
+ // // inform other that hosts as well
729
+ // events.send(
730
+ // EventNames.WAITING_ROOM_STATUS_UPDATE,
731
+ // JSON.stringify({attendee_uid, approved: true}),
732
+ // PersistanceLevel.None,
733
+ // );
734
+ // // server will send the RTM message with approved status and RTC token to the approved attendee.
735
+ // Toast.hide();
736
+ // }}
737
+ // />
738
+ // );
739
+ // btns.secondaryBtn = (
740
+ // <TertiaryButton
741
+ // containerStyle={style.secondaryBtn}
742
+ // textStyle={style.primaryBtnText}
743
+ // text="Deny"
744
+ // onPress={() => {
745
+ // // user rejecting waiting room request
746
+ // const res = approval({
747
+ // host_uid: localUid,
748
+ // attendee_uid: attendee_uid,
749
+ // attendee_screenshare_uid: attendee_screenshare_uid,
750
+ // approved: false,
751
+ // });
752
+ // dispatch({
753
+ // type: 'UpdateRenderList',
754
+ // value: [attendee_uid, {isInWaitingRoom: false}],
755
+ // });
756
+ // // inform other that hosts as well
757
+ // events.send(
758
+ // 'WAITING_ROOM_STATUS_UPDATE',
759
+ // JSON.stringify({attendee_uid, approved: false}),
760
+ // PersistanceLevel.None,
761
+ // );
762
+ // // server will send the RTM message with rejected status and RTC token to the approved attendee.
763
+ // Toast.hide();
764
+ // }}
765
+ // />
766
+ // );
767
+
768
+ // callActive &&
769
+ // Toast.show({
770
+ // type: 'info',
771
+ // text1: 'Approval Required',
772
+ // text2: `${userName} is waiting for approval to join the call`,
773
+ // visibilityTime: 30000,
774
+ // ...btns,
775
+ // });
776
+ // });
777
+
778
+ const updateVideoStream = async (enabled: boolean) => {
779
+ if ((isAndroid() || isIOS()) && isLiveStream) {
780
+ await RtcEngineUnsafe.muteLocalVideoStream(enabled);
781
+ }
782
+ };
783
+
197
784
  return () => {
198
785
  //events.off(controlMessageEnum.newUserJoined);
199
786
  events.off(controlMessageEnum.requestAudio);
@@ -201,6 +788,13 @@ const EventsConfigure: React.FC<Props> = (props) => {
201
788
  events.off(controlMessageEnum.muteVideo);
202
789
  events.off(controlMessageEnum.muteAudio);
203
790
  events.off(controlMessageEnum.kickUser);
791
+ events.off(EventNames.WAITING_ROOM_REQUEST);
792
+ events.off(EventNames.WAITING_ROOM_STATUS_UPDATE);
793
+ events.off(EventNames.WHITEBOARD_ACTIVE);
794
+ events.off(EventNames.WHITEBOARD_LAST_IMAGE_UPLOAD_POSITION);
795
+ events.off(EventNames.BOARD_COLOR_CHANGED);
796
+ events.off(EventNames.STT_ACTIVE);
797
+ events.off(EventNames.STT_LANGUAGE);
204
798
  };
205
799
  }, []);
206
800
 
@@ -210,27 +804,37 @@ const EventsConfigure: React.FC<Props> = (props) => {
210
804
  export default EventsConfigure;
211
805
 
212
806
  const style = StyleSheet.create({
213
- secondaryBtn: {marginLeft: 16, height: 40, paddingVertical: 5},
807
+ secondaryBtn: {marginLeft: 12, paddingVertical: 6, paddingHorizontal: 10},
214
808
  primaryBtn: {
215
- maxWidth: 109,
216
- minWidth: 109,
217
- height: 40,
218
809
  borderRadius: 4,
219
- paddingVertical: 5,
220
- paddingHorizontal: 12,
810
+ backgroundColor: $config.PRIMARY_ACTION_BRAND_COLOR,
811
+ paddingHorizontal: 10,
812
+ paddingVertical: 7,
221
813
  },
222
- primaryBtnText: {
814
+ textStyle: {
815
+ fontFamily: ThemeConfig.FontFamily.sansPro,
223
816
  fontWeight: '600',
224
- fontSize: 16,
225
- paddingLeft: 0,
817
+ fontSize: 14,
818
+ lineHeight: 14,
819
+ color: $config.FONT_COLOR,
226
820
  },
227
821
  });
228
- const SecondaryBtn = (
822
+ const SecondaryBtn = props => (
229
823
  <TertiaryButton
230
824
  containerStyle={style.secondaryBtn}
231
- text="LATER"
825
+ textStyle={style.textStyle}
826
+ text={props?.text || 'LATER'}
232
827
  onPress={() => {
233
828
  Toast.hide();
234
829
  }}
235
830
  />
236
831
  );
832
+
833
+ const PrimaryButton = props => {
834
+ const {text, containerStyle, textStyle, onPress} = props;
835
+ return (
836
+ <TouchableOpacity style={containerStyle} onPress={onPress}>
837
+ <Text style={textStyle}>{text}</Text>
838
+ </TouchableOpacity>
839
+ );
840
+ };