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