agora-appbuilder-core 4.0.0 → 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 (475) 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 +29 -29
  5. package/template/_eslintrc.js +3 -3
  6. package/template/_gitignore +12 -11
  7. package/template/_package-lock.json +28491 -23647
  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 +79 -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 +45 -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 +138 -100
  45. package/template/agora-rn-uikit/src/Rtc/Join.tsx +55 -28
  46. package/template/agora-rn-uikit/src/RtcConfigure.tsx +177 -77
  47. package/template/agora-rn-uikit/src/Utils/isBotUser.ts +15 -0
  48. package/template/agora-rn-uikit/src/Utils/quality.tsx +8 -0
  49. package/template/agora-rn-uikit/src/Views/MaxVideoView.native.tsx +56 -12
  50. package/template/agora-rn-uikit/src/Views/MaxVideoView.tsx +47 -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 +19 -33
  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 +200 -70
  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 +34 -46
  84. package/template/customization-api/types.ts +26 -0
  85. package/template/customization-api/utils.ts +4 -0
  86. package/template/customization-implementation/createHook.ts +24 -6
  87. package/template/customization-implementation/index.ts +1 -2
  88. package/template/customization-implementation/useCustomization.tsx +5 -7
  89. package/template/defaultConfig.js +72 -0
  90. package/template/global.d.ts +14 -1
  91. package/template/index.js +1 -4
  92. package/template/index.web.js +0 -5
  93. package/template/index.wsdk.tsx +1 -12
  94. package/template/ios/.xcode.env +11 -0
  95. package/template/ios/HelloWorld/AppDelegate.h +2 -4
  96. package/template/ios/HelloWorld/AppDelegate.mm +64 -0
  97. package/template/ios/HelloWorld/HelloWorldDebug.entitlements +10 -0
  98. package/template/ios/HelloWorld/Info.plist +8 -2
  99. package/template/ios/HelloWorld/main.m +2 -1
  100. package/template/ios/HelloWorld.xcodeproj/project.pbxproj +533 -17
  101. package/template/ios/HelloWorld.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  102. package/template/ios/HelloWorld.xcworkspace/contents.xcworkspacedata +10 -0
  103. package/template/ios/HelloWorld.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  104. package/template/ios/HelloWorldTests/HelloWorldTests.m +14 -13
  105. package/template/ios/HelloWorldTests/Info.plist +2 -2
  106. package/template/ios/Podfile +54 -20
  107. package/template/ios/Podfile.lock +809 -0
  108. package/template/ios/ScreenSharing/Info.plist +15 -0
  109. package/template/ios/ScreenSharing/SampleHandler.h +9 -0
  110. package/template/ios/ScreenSharing/SampleHandler.m +70 -0
  111. package/template/jest.config.js +4 -0
  112. package/template/metro.config.js +7 -32
  113. package/template/package.json +53 -39
  114. package/template/react-native-toast-message/index.d.ts +3 -1
  115. package/template/react-native-toast-message/index.js +1 -0
  116. package/template/react-native-toast-message/src/components/base/index.js +20 -32
  117. package/template/react-native-toast-message/src/components/base/styles.js +18 -21
  118. package/template/react-native-toast-message/src/components/checkbox.js +24 -19
  119. package/template/react-native-toast-message/src/index.js +3 -1
  120. package/template/react-native-toast-message/src/index.sdk.tsx +4 -1
  121. package/template/src/App.tsx +53 -69
  122. package/template/src/AppRoutes.tsx +90 -0
  123. package/template/src/AppWrapper.tsx +42 -25
  124. package/template/src/SDKAppWrapper.tsx +89 -57
  125. package/template/src/app-state/useLocalUserInfo.ts +3 -3
  126. package/template/src/app-state/useNoiseSupression.native.tsx +67 -0
  127. package/template/src/app-state/useNoiseSupression.tsx +107 -0
  128. package/template/src/app-state/useVideoQuality.tsx +39 -0
  129. package/template/src/assets/font-styles.css +175 -3
  130. package/template/src/assets/fonts/icomoon.ttf +0 -0
  131. package/template/src/assets/selection.json +1 -1
  132. package/template/src/atoms/ActionMenu.tsx +50 -11
  133. package/template/src/atoms/Avatar.tsx +51 -0
  134. package/template/src/atoms/Card.tsx +21 -8
  135. package/template/src/atoms/Carousel.native.tsx +105 -0
  136. package/template/src/atoms/Carousel.tsx +103 -0
  137. package/template/src/atoms/Checkbox.tsx +98 -0
  138. package/template/src/atoms/CircularProgress.tsx +0 -1
  139. package/template/src/atoms/ClipboardIconButton.tsx +91 -0
  140. package/template/src/atoms/CustomIcon.tsx +46 -0
  141. package/template/src/atoms/DropDownMulti.tsx +349 -0
  142. package/template/src/atoms/Dropdown.tsx +3 -3
  143. package/template/src/atoms/IconButton.tsx +52 -9
  144. package/template/src/atoms/ImageIcon.tsx +18 -5
  145. package/template/src/atoms/InlineNotification.tsx +81 -0
  146. package/template/src/atoms/InviteInfo.tsx +4 -4
  147. package/template/src/atoms/MeetingLink.tsx +160 -0
  148. package/template/src/atoms/ParticipantsCount.tsx +20 -8
  149. package/template/src/atoms/Popup.tsx +49 -27
  150. package/template/src/atoms/PrimaryButton.tsx +19 -5
  151. package/template/src/atoms/RecordingInfo.tsx +8 -5
  152. package/template/src/atoms/SecondaryButton.tsx +2 -0
  153. package/template/src/atoms/Spacer.tsx +1 -0
  154. package/template/src/atoms/TertiaryButton.tsx +35 -5
  155. package/template/src/atoms/TextInput.tsx +2 -1
  156. package/template/src/atoms/Toolbar.tsx +102 -0
  157. package/template/src/atoms/ToolbarItem.tsx +85 -0
  158. package/template/src/atoms/ToolbarMenu.tsx +40 -0
  159. package/template/src/atoms/ToolbarMenuItem.tsx +104 -0
  160. package/template/src/atoms/ToolbarPreset.tsx +71 -0
  161. package/template/src/atoms/Tooltip.tsx +30 -13
  162. package/template/src/atoms/pagination/Pagination.tsx +127 -0
  163. package/template/src/atoms/pagination/usePagination.tsx +88 -0
  164. package/template/src/auth/AuthProvider.tsx +500 -0
  165. package/template/src/auth/AuthRoute.tsx +94 -0
  166. package/template/src/auth/IDPAuth.electron.tsx +31 -0
  167. package/template/src/auth/IDPAuth.tsx +67 -0
  168. package/template/src/auth/IDPLogoutComponent.tsx +158 -0
  169. package/template/src/auth/UserCancelPopup.tsx +115 -0
  170. package/template/src/auth/config.ts +52 -0
  171. package/template/src/auth/openIDPURL.electron.tsx +39 -0
  172. package/template/src/auth/openIDPURL.native.tsx +51 -0
  173. package/template/src/auth/openIDPURL.tsx +20 -0
  174. package/template/src/auth/useIDPAuth.electron.tsx +65 -0
  175. package/template/src/auth/useIDPAuth.native.tsx +70 -0
  176. package/template/src/auth/useIDPAuth.tsx +63 -0
  177. package/template/src/auth/useTokenAuth.tsx +194 -0
  178. package/template/src/components/Chat.tsx +92 -72
  179. package/template/src/components/ChatContext.ts +2 -0
  180. package/template/src/components/ColorConfigure.tsx +0 -1
  181. package/template/src/components/CommonStyles.ts +9 -2
  182. package/template/src/components/Controls.tsx +914 -182
  183. package/template/src/components/Controls1.native.tsx +9 -5
  184. package/template/src/components/DeviceConfigure.native.tsx +2 -2
  185. package/template/src/components/DeviceConfigure.tsx +400 -149
  186. package/template/src/components/DeviceContext.tsx +2 -0
  187. package/template/src/components/EventsConfigure.tsx +722 -82
  188. package/template/src/components/GraphQLProvider.tsx +82 -39
  189. package/template/src/components/GridVideo.tsx +30 -16
  190. package/template/src/components/HostControlView.tsx +11 -14
  191. package/template/src/components/JoinPhrase.tsx +0 -1
  192. package/template/src/components/Leftbar.tsx +110 -0
  193. package/template/src/components/Navbar.tsx +305 -147
  194. package/template/src/components/NavbarMobile.tsx +119 -0
  195. package/template/src/components/Navigation.native.tsx +1 -15
  196. package/template/src/components/{Settings.native.tsx → Navigation.sdk.tsx} +17 -6
  197. package/template/src/components/NetworkQualityContext.tsx +12 -6
  198. package/template/src/components/ParticipantsView.tsx +63 -56
  199. package/template/src/components/PinnedVideo.tsx +191 -119
  200. package/template/src/components/Precall.native.tsx +177 -72
  201. package/template/src/components/Precall.tsx +247 -78
  202. package/template/src/components/RTMConfigure.tsx +205 -67
  203. package/template/src/components/Rightbar.tsx +112 -0
  204. package/template/src/components/Router.electron.ts +1 -0
  205. package/template/src/components/Router.native.ts +1 -0
  206. package/template/src/components/Router.sdk.ts +1 -0
  207. package/template/src/components/Router.ts +1 -0
  208. package/template/src/components/SdkApiContext.tsx +313 -0
  209. package/template/src/components/SdkMuteToggleListener.tsx +88 -0
  210. package/template/src/components/SessionContext.tsx +0 -1
  211. package/template/src/components/Settings.tsx +33 -4
  212. package/template/src/components/SettingsView.tsx +44 -9
  213. package/template/src/components/Share.tsx +152 -74
  214. package/template/src/components/StorageContext.tsx +23 -6
  215. package/template/src/components/ToastComponent.tsx +10 -1
  216. package/template/src/components/WhiteboardLayout.tsx +291 -0
  217. package/template/src/components/chat-messages/useChatMessages.tsx +454 -239
  218. package/template/src/components/chat-ui/{useChatUIControl.tsx → useChatUIControls.tsx} +29 -29
  219. package/template/src/components/common/Error.tsx +2 -0
  220. package/template/src/components/common/Logo.tsx +2 -2
  221. package/template/src/components/contexts/LiveStreamDataContext.tsx +13 -12
  222. package/template/src/components/contexts/ScreenShareContext.tsx +15 -1
  223. package/template/src/components/contexts/VideoMeetingDataContext.tsx +6 -6
  224. package/template/src/components/contexts/WaitingRoomContext.tsx +50 -0
  225. package/template/src/components/contexts/WhiteboardContext.tsx +54 -54
  226. package/template/src/components/disable-chat/useDisableChat.tsx +32 -0
  227. package/template/src/components/livestream/LiveStreamContext.tsx +314 -220
  228. package/template/src/components/livestream/Types.ts +36 -20
  229. package/template/src/components/livestream/views/LiveStreamAttendeeLandingTile.tsx +295 -0
  230. package/template/src/components/livestream/views/LiveStreamControls.tsx +5 -10
  231. package/template/src/components/meeting-info-invite/MeetingInfo.tsx +82 -0
  232. package/template/src/components/meeting-info-invite/MeetingInfoCardHeader.tsx +86 -0
  233. package/template/src/components/meeting-info-invite/MeetingInfoGridTile.tsx +218 -0
  234. package/template/src/components/meeting-info-invite/MeetingInfoLinks.tsx +122 -0
  235. package/template/src/components/participants/AllAudienceParticipants.tsx +19 -20
  236. package/template/src/components/participants/AllHostParticipants.tsx +20 -19
  237. package/template/src/components/participants/Participant.tsx +45 -16
  238. package/template/src/components/participants/ParticipantSectionTitle.tsx +5 -2
  239. package/template/src/components/participants/ScreenshareParticipants.tsx +17 -19
  240. package/template/src/components/participants/UserActionMenuOptions.tsx +173 -62
  241. package/template/src/components/participants/WaitingRoomParticipants.tsx +74 -0
  242. package/template/src/components/popups/InvitePopup.tsx +110 -45
  243. package/template/src/components/popups/StartScreenSharePopup.native.tsx +182 -0
  244. package/template/src/components/popups/StartScreenSharePopup.tsx +6 -0
  245. package/template/src/components/popups/StopRecordingPopup.tsx +11 -5
  246. package/template/src/components/popups/StopScreenSharePopup.native.tsx +135 -0
  247. package/template/src/components/popups/StopScreenSharePopup.tsx +6 -0
  248. package/template/src/components/popups/WhiteboardClearAllPopup.tsx +123 -0
  249. package/template/src/components/precall/LocalMute.tsx +69 -45
  250. package/template/src/components/precall/PermissionHelper.tsx +56 -28
  251. package/template/src/components/precall/PreCallSettings.tsx +1 -0
  252. package/template/src/components/precall/VideoFallback.tsx +173 -0
  253. package/template/src/components/precall/VideoPreview.native.tsx +19 -53
  254. package/template/src/components/precall/VideoPreview.tsx +29 -164
  255. package/template/src/components/precall/index.tsx +2 -0
  256. package/template/src/components/precall/joinCallBtn.native.tsx +12 -5
  257. package/template/src/components/precall/joinCallBtn.tsx +13 -4
  258. package/template/src/components/precall/joinWaitingRoomBtn.native.tsx +210 -0
  259. package/template/src/components/precall/joinWaitingRoomBtn.tsx +250 -0
  260. package/template/src/components/precall/meetingTitle.tsx +37 -11
  261. package/template/src/components/precall/selectDevice.tsx +5 -5
  262. package/template/src/components/precall/textInput.tsx +17 -19
  263. package/template/src/components/precall/usePreCall.tsx +33 -1
  264. package/template/src/components/recording-bot/RecordingBotRoute.tsx +42 -0
  265. package/template/src/components/recordings/RecordingsDateTable.tsx +62 -0
  266. package/template/src/components/recordings/RecordingsModal.tsx +135 -0
  267. package/template/src/components/recordings/ViewRecordingsModal.tsx +51 -0
  268. package/template/src/components/recordings/recording-table.tsx +154 -0
  269. package/template/src/components/recordings/style.ts +183 -0
  270. package/template/src/components/recordings/utils.ts +80 -0
  271. package/template/src/components/room-info/useRoomInfo.tsx +128 -0
  272. package/template/src/components/{meeting-info/useSetMeetingInfo.tsx → room-info/useSetRoomInfo.tsx} +12 -12
  273. package/template/src/components/useShareLink.tsx +28 -63
  274. package/template/src/components/useUserPreference.tsx +82 -16
  275. package/template/src/components/useVideoCall.tsx +93 -1
  276. package/template/src/components/virtual-background/VBButton.tsx +64 -0
  277. package/template/src/components/virtual-background/VBCard.native.tsx +282 -0
  278. package/template/src/components/virtual-background/VBCard.tsx +272 -0
  279. package/template/src/components/virtual-background/VBPanel.tsx +279 -0
  280. package/template/src/components/virtual-background/VButils.native.ts +37 -0
  281. package/template/src/components/virtual-background/VButils.ts +104 -0
  282. package/template/src/components/virtual-background/VideoPreview.native.tsx +43 -0
  283. package/template/src/components/virtual-background/VideoPreview.tsx +106 -0
  284. package/template/src/components/virtual-background/imagePaths.ts +87 -0
  285. package/template/src/components/virtual-background/images/beachImageBase64.ts +1 -0
  286. package/template/src/components/virtual-background/images/bedroomImageBase64.ts +1 -0
  287. package/template/src/components/virtual-background/images/bookImageBase64.ts +1 -0
  288. package/template/src/components/virtual-background/images/earthImageBase64.ts +1 -0
  289. package/template/src/components/virtual-background/images/index.ts +37 -0
  290. package/template/src/components/virtual-background/images/lampImageBase64.ts +1 -0
  291. package/template/src/components/virtual-background/images/mountainsImageBase64.ts +1 -0
  292. package/template/src/components/virtual-background/images/office1ImageBase64.ts +1 -0
  293. package/template/src/components/virtual-background/images/officeImageBase64.ts +1 -0
  294. package/template/src/components/virtual-background/images/plantsImageBase64.ts +1 -0
  295. package/template/src/components/virtual-background/images/skyImageBase64.ts +1 -0
  296. package/template/src/components/virtual-background/images/wallImageBase64.ts +1 -0
  297. package/template/src/components/virtual-background/useVB.native.tsx +185 -0
  298. package/template/src/components/virtual-background/useVB.tsx +267 -0
  299. package/template/src/components/whiteboard/StrokeWidthTool.tsx +137 -0
  300. package/template/src/components/whiteboard/WhiteboardButton.tsx +93 -0
  301. package/template/src/components/whiteboard/WhiteboardCanvas.tsx +99 -0
  302. package/template/src/components/whiteboard/WhiteboardConfigure.native.tsx +148 -0
  303. package/template/src/components/whiteboard/WhiteboardConfigure.tsx +446 -0
  304. package/template/src/components/whiteboard/WhiteboardCursor.tsx +152 -0
  305. package/template/src/components/whiteboard/WhiteboardToolBox.tsx +1246 -0
  306. package/template/src/components/whiteboard/WhiteboardView.native.tsx +188 -0
  307. package/template/src/components/whiteboard/WhiteboardView.tsx +81 -0
  308. package/template/src/components/whiteboard/WhiteboardWidget.tsx +685 -0
  309. package/template/src/components/whiteboard/WhiteboardWrapper.tsx +38 -0
  310. package/template/src/language/default-labels/commonLabels.ts +51 -14
  311. package/template/src/language/default-labels/createScreenLabels.ts +97 -17
  312. package/template/src/language/default-labels/joinScreenLabels.ts +45 -6
  313. package/template/src/language/default-labels/precallScreenLabels.ts +149 -25
  314. package/template/src/language/default-labels/shareLinkScreenLabels.ts +85 -37
  315. package/template/src/language/default-labels/videoCallScreenLabels.ts +1195 -158
  316. package/template/src/pages/Create.tsx +136 -106
  317. package/template/src/pages/Endcall.tsx +2 -2
  318. package/template/src/pages/Join.tsx +82 -40
  319. package/template/src/pages/Login.tsx +26 -0
  320. package/template/src/pages/VideoCall.tsx +329 -127
  321. package/template/src/pages/video-call/ActionSheet.native.tsx +54 -6
  322. package/template/src/pages/video-call/ActionSheet.tsx +55 -15
  323. package/template/src/pages/video-call/ActionSheetContent.tsx +498 -308
  324. package/template/src/pages/video-call/ActionSheetHandle.tsx +7 -1
  325. package/template/src/pages/video-call/DefaultLayouts.ts +20 -8
  326. package/template/src/pages/video-call/NameWithMicIcon.tsx +41 -64
  327. package/template/src/pages/video-call/PinchableView.tsx +119 -0
  328. package/template/src/pages/video-call/RenderComponent.tsx +14 -30
  329. package/template/src/pages/video-call/SidePanelHeader.tsx +227 -29
  330. package/template/src/pages/video-call/VideoCallMobileView.tsx +231 -89
  331. package/template/src/pages/video-call/VideoCallScreen.native.tsx +3 -2
  332. package/template/src/pages/video-call/VideoCallScreen.tsx +233 -84
  333. package/template/src/pages/video-call/VideoCallScreenWrapper.tsx +41 -0
  334. package/template/src/pages/video-call/VideoComponent.tsx +60 -8
  335. package/template/src/pages/video-call/VideoRenderer.tsx +343 -57
  336. package/template/src/pages/video-call/VisibilitySensor.tsx +104 -0
  337. package/template/src/pages/video-call/ZoomableWrapper.native.tsx +34 -0
  338. package/template/src/pages/video-call/ZoomableWrapper.tsx +5 -0
  339. package/template/src/pages/video-call/index.ts +42 -8
  340. package/template/src/rtm/RTMEngine.ts +17 -4
  341. package/template/src/rtm-events/constants.ts +21 -3
  342. package/template/src/rtm-events-api/Events.ts +7 -4
  343. package/template/src/rtm-events-api/LocalEvents.ts +14 -0
  344. package/template/src/rtm-events-api/types.ts +5 -5
  345. package/template/src/selection.json +1 -0
  346. package/template/src/subComponents/ChatBubble.tsx +87 -67
  347. package/template/src/subComponents/ChatContainer.tsx +70 -49
  348. package/template/src/subComponents/ChatInput.ios.tsx +32 -85
  349. package/template/src/subComponents/ChatInput.tsx +31 -80
  350. package/template/src/subComponents/Checkbox.native.tsx +46 -46
  351. package/template/src/subComponents/Checkbox.tsx +7 -6
  352. package/template/src/subComponents/CopyJoinInfo.tsx +31 -11
  353. package/template/src/subComponents/EndcallPopup.tsx +83 -12
  354. package/template/src/subComponents/FallbackLogo.tsx +2 -2
  355. package/template/src/subComponents/LanguageSelector.tsx +34 -30
  356. package/template/src/subComponents/LayoutIconButton.tsx +34 -17
  357. package/template/src/subComponents/LayoutIconDropdown.tsx +21 -8
  358. package/template/src/subComponents/Loading.tsx +60 -0
  359. package/template/src/subComponents/LocalAudioMute.tsx +87 -34
  360. package/template/src/subComponents/LocalEndCall.tsx +61 -24
  361. package/template/src/subComponents/LocalSwitchCamera.tsx +57 -13
  362. package/template/src/subComponents/LocalVideoMute.tsx +105 -36
  363. package/template/src/subComponents/LogoutButton.tsx +1 -1
  364. package/template/src/subComponents/NetworkQualityPill.tsx +22 -38
  365. package/template/src/subComponents/Recording.tsx +29 -9
  366. package/template/src/subComponents/RemoteAudioMute.tsx +5 -5
  367. package/template/src/subComponents/RemoteMutePopup.tsx +55 -14
  368. package/template/src/subComponents/RemoteVideoMute.tsx +5 -5
  369. package/template/src/subComponents/RemoveMeetingPopup.tsx +19 -6
  370. package/template/src/subComponents/RemoveScreensharePopup.tsx +20 -5
  371. package/template/src/subComponents/ScreenShareNotice.tsx +11 -6
  372. package/template/src/subComponents/SelectDevice.tsx +103 -34
  373. package/template/src/subComponents/SelectDeviceSettings.backup.tsx +9 -6
  374. package/template/src/subComponents/SidePanelButtons.ts +0 -3
  375. package/template/src/subComponents/SidePanelEnum.tsx +2 -0
  376. package/template/src/subComponents/SidePanelHeader.tsx +97 -63
  377. package/template/src/subComponents/ToastConfig.tsx +70 -61
  378. package/template/src/subComponents/caption/Caption.tsx +132 -0
  379. package/template/src/subComponents/caption/CaptionContainer.tsx +302 -0
  380. package/template/src/subComponents/caption/CaptionIcon.tsx +111 -0
  381. package/template/src/subComponents/caption/CaptionText.tsx +182 -0
  382. package/template/src/subComponents/caption/DownloadTranscriptBtn.tsx +65 -0
  383. package/template/src/subComponents/caption/LanguageSelectorPopup.tsx +192 -0
  384. package/template/src/subComponents/caption/Transcript.tsx +452 -0
  385. package/template/src/subComponents/caption/TranscriptIcon.tsx +123 -0
  386. package/template/src/subComponents/caption/TranscriptText.tsx +98 -0
  387. package/template/src/subComponents/caption/index.ts +3 -0
  388. package/template/src/subComponents/caption/proto/ptoto.js +91 -0
  389. package/template/src/subComponents/caption/proto/test.proto +23 -0
  390. package/template/src/subComponents/caption/useCaption.tsx +123 -0
  391. package/template/src/subComponents/caption/useCaptionWidth.ts +27 -0
  392. package/template/src/subComponents/caption/useSTTAPI.tsx +179 -0
  393. package/template/src/subComponents/caption/useStreamMessageUtils.native.ts +211 -0
  394. package/template/src/subComponents/caption/useStreamMessageUtils.ts +235 -0
  395. package/template/src/subComponents/caption/useTranscriptDownload.native.ts +63 -0
  396. package/template/src/subComponents/caption/useTranscriptDownload.ts +52 -0
  397. package/template/src/subComponents/caption/utils.ts +126 -0
  398. package/template/src/subComponents/chat/ChatParticipants.tsx +60 -24
  399. package/template/src/subComponents/livestream/ApprovedLiveStreamControlsView.tsx +2 -2
  400. package/template/src/subComponents/livestream/CurrentLiveStreamRequestsView.tsx +19 -20
  401. package/template/src/subComponents/livestream/controls/LocalRaiseHand.tsx +66 -35
  402. package/template/src/subComponents/livestream/controls/RemoteLiveStreamApprovedRequestRecall.tsx +3 -2
  403. package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestApprove.tsx +10 -6
  404. package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestReject.tsx +28 -19
  405. package/template/src/subComponents/recording/useIsRecordingBot.tsx +38 -0
  406. package/template/src/subComponents/recording/useRecording.tsx +251 -138
  407. package/template/src/subComponents/recording/useRecordingLayoutQuery.tsx +0 -1
  408. package/template/src/subComponents/screenshare/ScreenshareButton.tsx +39 -15
  409. package/template/src/subComponents/screenshare/ScreenshareConfigure.native.tsx +275 -69
  410. package/template/src/subComponents/screenshare/ScreenshareConfigure.tsx +193 -124
  411. package/template/src/subComponents/screenshare/useScreenshare.tsx +2 -0
  412. package/template/src/subComponents/waiting-rooms/WaitingRoomControls.tsx +85 -0
  413. package/template/src/subComponents/waiting-rooms/useWaitingRoomAPI.ts +75 -0
  414. package/template/src/theme/index.ts +13 -0
  415. package/template/src/utils/SdkEvents.ts +37 -14
  416. package/template/src/utils/SdkMethodEvents.ts +101 -0
  417. package/template/src/utils/axiomLogger.ts +117 -0
  418. package/template/src/utils/book.jpg +0 -0
  419. package/template/src/utils/common.tsx +118 -6
  420. package/template/src/utils/constants.ts +4 -0
  421. package/template/src/utils/getCustomRoute.ts +7 -0
  422. package/template/src/utils/index.tsx +34 -0
  423. package/template/src/utils/useActionSheet.tsx +50 -0
  424. package/template/src/utils/useActiveSpeaker.ts +38 -0
  425. package/template/src/utils/useAppState.ts +17 -0
  426. package/template/src/utils/useAsyncEffect.ts +138 -0
  427. package/template/src/utils/{useCreateMeeting.ts → useCreateRoom.ts} +27 -26
  428. package/template/src/utils/useEndCall.ts +65 -0
  429. package/template/src/utils/useFindActiveSpeaker.native.ts +4 -0
  430. package/template/src/utils/useFindActiveSpeaker.ts +335 -0
  431. package/template/src/utils/useGetMeetingPhrase.ts +10 -10
  432. package/template/src/utils/useIsAudioEnabled.ts +3 -3
  433. package/template/src/utils/useIsLocalUserSpeaking.native.ts +4 -0
  434. package/template/src/utils/useIsLocalUserSpeaking.ts +103 -0
  435. package/template/src/utils/useIsPSTN.ts +3 -3
  436. package/template/src/utils/useIsVideoEnabled.ts +3 -3
  437. package/template/src/utils/useJoinRoom.ts +199 -0
  438. package/template/src/utils/{useIsActiveSpeaker.ts → useLocalAudio.ts} +23 -12
  439. package/template/src/{components/OAuth.tsx → utils/useMenu.tsx} +16 -15
  440. package/template/src/utils/useModal.tsx +8 -0
  441. package/template/src/utils/useMutePSTN.ts +2 -2
  442. package/template/src/utils/useMuteToggleLocal.ts +121 -96
  443. package/template/src/utils/useRemoteEndCall.ts +4 -4
  444. package/template/src/utils/useRemoteEndScreenshare.ts +4 -4
  445. package/template/src/utils/useRemoteMute.ts +7 -7
  446. package/template/src/utils/useRemoteRequest.ts +7 -7
  447. package/template/src/utils/useSearchParams.tsx +18 -0
  448. package/template/src/utils/useString.ts +13 -3
  449. package/template/src/utils/useSwitchCamera.native.tsx +25 -0
  450. package/template/src/{subComponents/screenshare/ScreenshareButton.native.tsx → utils/useSwitchCamera.tsx} +12 -11
  451. package/template/src/utils/useToolbar.tsx +59 -0
  452. package/template/src/wasms/agora-virtual-background.wasm +0 -0
  453. package/template/static.d.ts +42 -0
  454. package/template/tsconfig_rsdk_index.json +3 -3
  455. package/template/tsconfig_wsdk_index.json +1 -1
  456. package/template/web/index.html +20 -0
  457. package/template/webpack.commons.js +21 -10
  458. package/template/webpack.rsdk.config.js +1 -2
  459. package/template/webpack.web.config.js +7 -3
  460. package/template/_buckconfig +0 -6
  461. package/template/_gitattributes +0 -1
  462. package/template/agora-rn-uikit/src/Contexts/RenderContext.tsx +0 -10
  463. package/template/agora-rn-uikit/src/Reducer/ActiveSpeakerDetected.ts +0 -11
  464. package/template/android/app/_BUCK +0 -55
  465. package/template/android/app/build_defs.bzl +0 -19
  466. package/template/bridge/rtc/webNg/LocalView.tsx +0 -20
  467. package/template/ios/HelloWorld/AppDelegate.m +0 -74
  468. package/template/src/components/OAuth.electron.tsx +0 -41
  469. package/template/src/components/OAuth.native.tsx +0 -55
  470. package/template/src/components/OAuthConfig.ts +0 -77
  471. package/template/src/components/StoreToken.tsx +0 -39
  472. package/template/src/components/meeting-info/useMeetingInfo.tsx +0 -70
  473. package/template/src/pages/video-call/CustomUserContextHolder.tsx +0 -20
  474. package/template/src/utils/useButtonTemplate.tsx +0 -44
  475. package/template/src/utils/useJoinMeeting.ts +0 -132
@@ -16,26 +16,54 @@ import React, {
16
16
  useEffect,
17
17
  useRef,
18
18
  useState,
19
+ useCallback,
19
20
  } from 'react';
20
- import {gql, useMutation} from '@apollo/client';
21
- import {useParams} from '../../components/Router';
22
- import {PropsContext} from '../../../agora-rn-uikit';
23
21
  import Toast from '../../../react-native-toast-message';
24
22
  import {createHook} from 'customization-implementation';
25
23
  import {useString} from '../../utils/useString';
26
24
  import ChatContext from '../../components/ChatContext';
27
- import events, {EventPersistLevel} from '../../rtm-events-api';
25
+ import events, {PersistanceLevel} from '../../rtm-events-api';
28
26
  import {EventActions, EventNames} from '../../rtm-events';
29
- import useRecordingLayoutQuery from './useRecordingLayoutQuery';
30
- import {useScreenContext} from '../../components/contexts/ScreenShareContext';
31
- import {useRender} from 'customization-api';
27
+ import {useContent} from 'customization-api';
32
28
  import {trimText} from '../../utils/common';
29
+ import {useRoomInfo} from 'customization-api';
30
+ import StorageContext from '../../components/StorageContext';
31
+ import {useSidePanel} from '../../utils/useSidePanel';
32
+ import {useCaption} from '../caption/useCaption';
33
+ import {SidePanelType} from '../SidePanelEnum';
34
+ import {
35
+ ChatType,
36
+ useChatUIControls,
37
+ } from '../../components/chat-ui/useChatUIControls';
38
+ import {useIsRecordingBot} from './useIsRecordingBot';
39
+ import {
40
+ videoRoomRecordingToastHeading,
41
+ videoRoomRecordingToastSubHeading,
42
+ videoRoomUserFallbackText,
43
+ videoRoomRecordingStartErrorToastHeading,
44
+ videoRoomRecordingStopErrorToastHeading,
45
+ videoRoomRecordingErrorToastSubHeading,
46
+ } from '../../language/default-labels/videoCallScreenLabels';
47
+ import {getOriginURL} from '../../auth/config';
33
48
 
49
+ const getFrontendUrl = (url: string) => {
50
+ // check if it doesn't contains the https protocol
51
+ if (url.indexOf('https://') !== 0) {
52
+ url = `https://${url}`;
53
+ }
54
+ return url;
55
+ };
56
+
57
+ interface RecordingsData {
58
+ recordings: [];
59
+ pagination: {};
60
+ }
34
61
  export interface RecordingContextInterface {
35
62
  startRecording: () => void;
36
63
  stopRecording: () => void;
37
64
  isRecordingActive: boolean;
38
65
  inProgress: boolean;
66
+ fetchRecordings?: (page: number) => Promise<RecordingsData>;
39
67
  }
40
68
 
41
69
  const RecordingContext = createContext<RecordingContextInterface>({
@@ -45,18 +73,6 @@ const RecordingContext = createContext<RecordingContextInterface>({
45
73
  inProgress: false,
46
74
  });
47
75
 
48
- const START_RECORDING = gql`
49
- mutation startRecordingSession($passphrase: String!, $secret: String) {
50
- startRecordingSession(passphrase: $passphrase, secret: $secret)
51
- }
52
- `;
53
-
54
- const STOP_RECORDING = gql`
55
- mutation stopRecordingSession($passphrase: String!) {
56
- stopRecordingSession(passphrase: $passphrase)
57
- }
58
- `;
59
-
60
76
  /**
61
77
  * Component to start / stop Agora cloud recording.
62
78
  * Sends a control message to all users in the channel over RTM to indicate that
@@ -75,6 +91,7 @@ interface RecordingProviderProps {
75
91
  value: {
76
92
  setRecordingActive: React.Dispatch<SetStateAction<boolean>>;
77
93
  isRecordingActive: boolean;
94
+ callActive: boolean;
78
95
  };
79
96
  }
80
97
 
@@ -85,49 +102,55 @@ interface RecordingProviderProps {
85
102
  */
86
103
 
87
104
  const RecordingProvider = (props: RecordingProviderProps) => {
88
- const {rtcProps} = useContext(PropsContext);
89
- const {setRecordingActive, isRecordingActive} = props?.value;
105
+ const {setRecordingActive, isRecordingActive, callActive} = props?.value;
106
+ const {
107
+ data: {isHost, roomId},
108
+ } = useRoomInfo();
90
109
  const [inProgress, setInProgress] = useState(false);
91
110
  const [uidWhoStarted, setUidWhoStarted] = useState(0);
92
- const {renderList, activeUids} = useRender();
93
- const {phrase} = useParams<{phrase: string}>();
94
- const [startRecordingQuery] = useMutation(START_RECORDING);
95
- const [stopRecordingQuery] = useMutation(STOP_RECORDING);
111
+ const {defaultContent, activeUids} = useContent();
96
112
  const prevRecordingState = usePrevious<{isRecordingActive: boolean}>({
97
113
  isRecordingActive,
98
114
  });
99
- //commented for v1 release
100
- //const recordingStartedText = useString<boolean>('recordingNotificationLabel');
101
- const recordingStartedText = (active: boolean) =>
102
- active ? 'Recording Started' : 'Recording Stopped';
103
- const {executePresenterQuery, executeNormalQuery} = useRecordingLayoutQuery();
115
+ const recordingStartedText = useString<boolean>(
116
+ videoRoomRecordingToastHeading,
117
+ );
118
+ const subheading = useString(videoRoomRecordingToastSubHeading);
119
+
120
+ const headingStartError = useString(
121
+ videoRoomRecordingStartErrorToastHeading,
122
+ )();
123
+ const headingStopError = useString(videoRoomRecordingStopErrorToastHeading)();
124
+ const subheadingError = useString(videoRoomRecordingErrorToastSubHeading)();
125
+
126
+ const userlabel = useString(videoRoomUserFallbackText)();
127
+
104
128
  const {localUid} = useContext(ChatContext);
105
- const {screenShareData} = useScreenContext();
129
+ const {store} = React.useContext(StorageContext);
106
130
 
107
- React.useEffect(() => {
108
- events.on(EventNames.RECORDING_ATTRIBUTE, (data) => {
109
- const payload = JSON.parse(data.payload);
110
- const action = payload.action;
111
- const value = payload.value;
112
- switch (action) {
113
- case EventActions.RECORDING_STARTED:
114
- setUidWhoStarted(parseInt(value));
115
- setRecordingActive(true);
116
- break;
117
- case EventActions.RECORDING_STOPPED:
118
- setRecordingActive(false);
119
- break;
120
- case EventActions.RECORDING_STOP_REQUEST:
121
- stopRecording();
122
- break;
123
- default:
124
- break;
131
+ const {setChatType} = useChatUIControls();
132
+ const {setSidePanel} = useSidePanel();
133
+ const {setIsCaptionON} = useCaption();
134
+ const {isRecordingBot, recordingBotUIConfig} = useIsRecordingBot();
135
+
136
+ const setRecordingBotUI = () => {
137
+ if (isRecordingBot) {
138
+ if (recordingBotUIConfig?.chat && $config.CHAT) {
139
+ setSidePanel(SidePanelType.Chat);
140
+ setChatType(ChatType.Group);
125
141
  }
126
- });
127
- () => {
128
- events.off(EventNames.RECORDING_ATTRIBUTE);
129
- };
130
- }, []);
142
+ if (recordingBotUIConfig.stt && $config.ENABLE_STT) {
143
+ setIsCaptionON(true);
144
+ }
145
+ }
146
+ };
147
+
148
+ useEffect(() => {
149
+ if (callActive) {
150
+ setRecordingBotUI();
151
+ }
152
+ // eslint-disable-next-line react-hooks/exhaustive-deps
153
+ }, [callActive]);
131
154
 
132
155
  useEffect(() => {
133
156
  /**
@@ -138,37 +161,76 @@ const RecordingProvider = (props: RecordingProviderProps) => {
138
161
  */
139
162
  if (prevRecordingState) {
140
163
  if (prevRecordingState?.isRecordingActive === isRecordingActive) return;
164
+
165
+ if ($config.ENABLE_WAITING_ROOM && !isHost && !callActive) {
166
+ return;
167
+ }
168
+
141
169
  Toast.show({
170
+ leadingIconName: 'recording',
142
171
  type: 'info',
143
172
  text1: recordingStartedText(isRecordingActive),
144
173
  text2: isRecordingActive
145
- ? `This meeting is being recorded by ${
146
- trimText(renderList[uidWhoStarted]?.name) || 'user'
147
- }`
174
+ ? subheading(
175
+ trimText(defaultContent[uidWhoStarted]?.name) || userlabel,
176
+ )
148
177
  : '',
149
178
  visibilityTime: 3000,
150
179
  primaryBtn: null,
151
180
  secondaryBtn: null,
181
+ leadingIcon: null,
152
182
  });
153
183
  }
154
- }, [isRecordingActive]);
184
+ }, [isRecordingActive, callActive, isHost]);
185
+
186
+ const showErrorToast = (text1: string, text2?: string) => {
187
+ Toast.show({
188
+ leadingIconName: 'alert',
189
+ type: 'error',
190
+ text1: text1,
191
+ text2: text2 ? text2 : '',
192
+ visibilityTime: 3000,
193
+ primaryBtn: null,
194
+ secondaryBtn: null,
195
+ leadingIcon: null,
196
+ });
197
+ };
155
198
 
156
199
  const startRecording = () => {
200
+ const passphrase = roomId.host || '';
201
+ let recordinghostURL = getOriginURL();
202
+ console.log('web-recording - start recording API called');
203
+
204
+ if (inProgress) {
205
+ console.error('web-recording - start recording API already in progress');
206
+ return;
207
+ }
208
+ if (recordinghostURL.includes('localhost')) {
209
+ console.error(
210
+ 'web-recording - Recording url cannot be localhost. It should be a valid deployed URL',
211
+ );
212
+ return;
213
+ }
214
+ recordinghostURL = getFrontendUrl(recordinghostURL);
215
+ console.log('web-recording - recordinghostURL: ', recordinghostURL);
216
+
157
217
  setInProgress(true);
158
- // If recording is not going on, start the recording by executing the graphql query
159
- startRecordingQuery({
160
- variables: {
161
- passphrase: phrase,
162
- secret:
163
- rtcProps.encryption && rtcProps.encryption.key
164
- ? rtcProps.encryption.key
165
- : '',
218
+ fetch(`${$config.BACKEND_ENDPOINT}/v1/recording/start`, {
219
+ method: 'POST',
220
+ headers: {
221
+ 'Content-Type': 'application/json',
222
+ authorization: store.token ? `Bearer ${store.token}` : '',
166
223
  },
224
+ body: JSON.stringify({
225
+ passphrase: roomId.host,
226
+ url: `${recordinghostURL}/${passphrase}`,
227
+ webpage_ready_timeout: 10,
228
+ encryption: $config.ENCRYPTION_ENABLED,
229
+ }),
167
230
  })
168
- .then((res) => {
169
- console.log(res.data);
231
+ .then((res: any) => {
170
232
  setInProgress(false);
171
- if (res.data.startRecordingSession === 'success') {
233
+ if (res.status === 200) {
172
234
  /**
173
235
  * 1. Once the backend sucessfuly starts recording, send message
174
236
  * in the channel indicating that cloud recording is now active.
@@ -179,90 +241,140 @@ const RecordingProvider = (props: RecordingProviderProps) => {
179
241
  action: EventActions.RECORDING_STARTED,
180
242
  value: `${localUid}`,
181
243
  }),
182
- EventPersistLevel.LEVEL3,
244
+ PersistanceLevel.Session,
183
245
  );
184
246
  // 2. set the local recording state to true to update the UI
185
247
  setUidWhoStarted(localUid);
186
248
  setRecordingActive(true);
187
- // 3. set the presenter mode if screen share is active
188
- // 3.a Get the most recent screenshare uid
189
- const sorted = Object.entries(screenShareData)
190
- .filter((el) => el[1]?.ts && el[1].ts > 0 && el[1]?.isActive)
191
- .sort((a, b) => b[1].ts - a[1].ts);
192
-
193
- const activeScreenshareUid = sorted.length > 0 ? sorted[0][0] : 0;
194
- if (activeScreenshareUid) {
195
- console.log(
196
- 'screenshare: Executing presenter query for screenuid',
197
- activeScreenshareUid,
198
- );
199
- executePresenterQuery(parseInt(activeScreenshareUid));
200
- } else {
201
- executeNormalQuery();
202
- }
249
+ } else if (res.status === 500) {
250
+ showErrorToast(headingStartError, subheadingError);
251
+ } else {
252
+ showErrorToast(headingStartError);
203
253
  }
204
254
  })
205
- .catch((err) => {
255
+ .catch(err => {
206
256
  setInProgress(false);
207
257
  console.log(err);
208
258
  });
209
259
  };
210
260
 
211
- const stopRecording = () => {
261
+ const stopRecording = useCallback(() => {
212
262
  /**
213
- * if condition added for below issue
214
- *
215
- * user 1 and user 2 in the call
216
- * user 1 start the recording
217
- * user 2 stops the recording
218
- * user 2 join the call getting stop recording notification which is not needed
219
- *
220
- * solution
221
- * case 1 - if recording is not started by the host then we will send level1 message to host who started the recording
222
- * case 2 - if person who started the recording no longer available in the call then will stop the recording
263
+ * Any host in the channel can stop recording.
223
264
  */
224
- if (
225
- localUid === uidWhoStarted ||
226
- activeUids.indexOf(uidWhoStarted) === -1
227
- ) {
228
- setInProgress(true);
229
- // If recording is already going on, stop the recording by executing the graphql query.
230
- stopRecordingQuery({variables: {passphrase: phrase}})
231
- .then((res) => {
232
- console.log(res.data);
233
- setInProgress(false);
234
- if (res.data.stopRecordingSession === 'success') {
235
- /**
236
- * 1. Once the backend sucessfuly starts recording, send message
237
- * in the channel indicating that cloud recording is now inactive.
238
- */
239
- events.send(
240
- EventNames.RECORDING_ATTRIBUTE,
241
- JSON.stringify({
242
- action: EventActions.RECORDING_STOPPED,
243
- value: '',
244
- }),
245
- EventPersistLevel.LEVEL3,
246
- );
247
- // 2. set the local recording state to false to update the UI
248
- setRecordingActive(false);
249
- }
250
- })
251
- .catch((err) => {
252
- setInProgress(false);
253
- console.log(err);
254
- });
255
- } else {
256
- events.send(
257
- EventNames.RECORDING_ATTRIBUTE,
258
- JSON.stringify({
259
- action: EventActions.RECORDING_STOP_REQUEST,
260
- value: '',
261
- }),
262
- EventPersistLevel.LEVEL1,
265
+ console.log('web-recording - stop recording API called');
266
+ if (inProgress) {
267
+ console.error(
268
+ 'web-recording - stop recording already in progress. Aborting..',
263
269
  );
270
+ return;
264
271
  }
265
- };
272
+ setInProgress(true);
273
+ // If recording is already going on, stop the recording by executing the below query.
274
+ fetch(`${$config.BACKEND_ENDPOINT}/v1/recording/stop`, {
275
+ method: 'POST',
276
+ headers: {
277
+ 'Content-Type': 'application/json',
278
+ authorization: store.token ? `Bearer ${store.token}` : '',
279
+ },
280
+ body: JSON.stringify({
281
+ passphrase: roomId.host,
282
+ }),
283
+ })
284
+ .then(res => {
285
+ setInProgress(false);
286
+ if (res.status === 200) {
287
+ /**
288
+ * 1. Once the backend sucessfuly stops recording, send message
289
+ * in the channel indicating that cloud recording is now inactive.
290
+ */
291
+ events.send(
292
+ EventNames.RECORDING_ATTRIBUTE,
293
+ JSON.stringify({
294
+ action: EventActions.RECORDING_STOPPED,
295
+ value: '',
296
+ }),
297
+ PersistanceLevel.Session,
298
+ );
299
+ // 2. set the local recording state to false to update the UI
300
+ setRecordingActive(false);
301
+ } else if (res.status === 500) {
302
+ showErrorToast(headingStopError, subheadingError);
303
+ } else {
304
+ showErrorToast(headingStopError);
305
+ }
306
+ })
307
+ .catch(err => {
308
+ setInProgress(false);
309
+ console.log(err);
310
+ });
311
+ }, [
312
+ headingStopError,
313
+ inProgress,
314
+ roomId.host,
315
+ setRecordingActive,
316
+ store.token,
317
+ subheadingError,
318
+ ]);
319
+
320
+ React.useEffect(() => {
321
+ events.on(EventNames.RECORDING_ATTRIBUTE, data => {
322
+ const payload = JSON.parse(data.payload);
323
+ const action = payload.action;
324
+ const value = payload.value;
325
+ switch (action) {
326
+ case EventActions.RECORDING_STARTED:
327
+ setUidWhoStarted(parseInt(value));
328
+ setRecordingActive(true);
329
+ break;
330
+ case EventActions.RECORDING_STOPPED:
331
+ setRecordingActive(false);
332
+ break;
333
+ default:
334
+ break;
335
+ }
336
+ });
337
+ return () => {
338
+ events.off(EventNames.RECORDING_ATTRIBUTE);
339
+ };
340
+ }, [roomId.host, setRecordingActive]);
341
+
342
+ const fetchRecordings = useCallback(
343
+ (page: number) => {
344
+ return fetch(`${$config.BACKEND_ENDPOINT}/v1/recordings`, {
345
+ method: 'POST',
346
+ headers: {
347
+ 'Content-Type': 'application/json',
348
+ authorization: store.token ? `Bearer ${store.token}` : '',
349
+ },
350
+ // '2b65f378-b048-4d28-9d4c-bd71edab61b7'
351
+ body: JSON.stringify({
352
+ passphrase: roomId?.host,
353
+ limit: 10,
354
+ page,
355
+ }),
356
+ }).then(async response => {
357
+ const data = await response.json();
358
+ if (response.ok) {
359
+ if (data) {
360
+ return data;
361
+ } else {
362
+ return Promise.reject(
363
+ new Error(
364
+ `No recordings found for meeting Id: "${roomId?.host}"`,
365
+ ),
366
+ );
367
+ }
368
+ } else {
369
+ const error = {
370
+ message: data?.error?.message,
371
+ };
372
+ return Promise.reject(error);
373
+ }
374
+ });
375
+ },
376
+ [roomId?.host, store.token],
377
+ );
266
378
 
267
379
  return (
268
380
  <RecordingContext.Provider
@@ -271,6 +383,7 @@ const RecordingProvider = (props: RecordingProviderProps) => {
271
383
  startRecording,
272
384
  stopRecording,
273
385
  isRecordingActive,
386
+ fetchRecordings,
274
387
  }}>
275
388
  {props.children}
276
389
  </RecordingContext.Provider>
@@ -47,7 +47,6 @@ function useRecordingLayoutQuery() {
47
47
  const executeNormalQuery = () => {
48
48
  setNormalQuery({variables: {passphrase: phrase}})
49
49
  .then((res) => {
50
- console.log(res.data);
51
50
  if (res.data.stopRecordingSession === 'success') {
52
51
  // Once the backend sucessfuly stops recording,
53
52
  // send a control message to everbody in the channel indicating that cloud recording is now inactive.
@@ -16,9 +16,17 @@ import Styles from '../../components/styles';
16
16
  import {useString} from '../../utils/useString';
17
17
  import {useScreenshare} from './useScreenshare';
18
18
  import hexadecimalTransparency from '../../utils/hexadecimalTransparency';
19
- import {PropsContext, ClientRole} from '../../../agora-rn-uikit';
20
- import {useLocalUserInfo, useMeetingInfo} from 'customization-api';
19
+ import {PropsContext, ClientRoleType} from '../../../agora-rn-uikit';
20
+ import {useLocalUserInfo, useRoomInfo} from 'customization-api';
21
21
  import useIsHandRaised from '../../utils/useIsHandRaised';
22
+ import {isAndroid, isIOS} from '../../utils/common';
23
+ import {useVideoCall} from '../../components/useVideoCall';
24
+ import {useToolbarMenu} from '../../utils/useMenu';
25
+ import ToolbarMenuItem from '../../atoms/ToolbarMenuItem';
26
+ import {
27
+ livestreamingShareTooltipText,
28
+ toolbarItemShareText,
29
+ } from '../../language/default-labels/videoCallScreenLabels';
22
30
  /**
23
31
  * A component to start and stop screen sharing on web clients.
24
32
  * Screen sharing is not yet implemented on mobile platforms.
@@ -27,23 +35,39 @@ import useIsHandRaised from '../../utils/useIsHandRaised';
27
35
 
28
36
  export interface ScreenshareButtonProps {
29
37
  render?: (onPress: () => void, isScreenshareActive: boolean) => JSX.Element;
38
+ showLabel?: boolean;
39
+ isOnActionSheet?: boolean;
30
40
  }
31
41
 
32
42
  const ScreenshareButton = (props: ScreenshareButtonProps) => {
43
+ const {isToolbarMenuItem} = useToolbarMenu();
33
44
  const {rtcProps} = useContext(PropsContext);
45
+ const {showLabel = $config.ICON_TEXT || false, isOnActionSheet = false} =
46
+ props;
34
47
  const {
35
48
  data: {isHost},
36
- } = useMeetingInfo();
49
+ } = useRoomInfo();
37
50
  const local = useLocalUserInfo();
38
51
  const isHandRaised = useIsHandRaised();
39
52
  const {isScreenshareActive, startUserScreenshare, stopUserScreenShare} =
40
53
  useScreenshare();
41
- //commented for v1 release
42
- //const screenShareButton = useString('screenShareButton')();
54
+ const {setShowStartScreenSharePopup} = useVideoCall();
55
+ const screenShareButtonLabel = useString<boolean>(toolbarItemShareText);
56
+ const lstooltip = useString<boolean>(livestreamingShareTooltipText);
57
+ const onPress = () => {
58
+ if (isScreenshareActive) {
59
+ stopUserScreenShare();
60
+ } else {
61
+ if (isAndroid() || isIOS()) {
62
+ //native screen we need to stop user video before proceeding the screenshare
63
+ //so showing confirm popup to stop camera(if cam on ) and option to share audio
64
+ setShowStartScreenSharePopup(true);
65
+ } else {
66
+ startUserScreenshare();
67
+ }
68
+ }
69
+ };
43
70
 
44
- const onPress = () =>
45
- isScreenshareActive ? stopUserScreenShare() : startUserScreenshare();
46
- const screenShareButton = isScreenshareActive ? 'Stop Share' : 'Share';
47
71
  let iconButtonProps: IconButtonProps = {
48
72
  iconProps: {
49
73
  name: isScreenshareActive ? 'stop-screen-share' : 'screen-share',
@@ -53,13 +77,13 @@ const ScreenshareButton = (props: ScreenshareButtonProps) => {
53
77
  },
54
78
  onPress,
55
79
  btnTextProps: {
56
- text: $config.ICON_TEXT ? screenShareButton : '',
80
+ text: showLabel ? screenShareButtonLabel(isScreenshareActive) : '',
57
81
  textColor: $config.FONT_COLOR,
58
82
  },
59
83
  };
60
-
84
+ iconButtonProps.isOnActionSheet = isOnActionSheet;
61
85
  if (
62
- rtcProps.role == ClientRole.Audience &&
86
+ rtcProps.role == ClientRoleType.ClientRoleAudience &&
63
87
  $config.EVENT_MODE &&
64
88
  !$config.RAISE_HAND
65
89
  ) {
@@ -67,7 +91,7 @@ const ScreenshareButton = (props: ScreenshareButtonProps) => {
67
91
  }
68
92
 
69
93
  if (
70
- rtcProps.role == ClientRole.Audience &&
94
+ rtcProps.role == ClientRoleType.ClientRoleAudience &&
71
95
  $config.EVENT_MODE &&
72
96
  $config.RAISE_HAND &&
73
97
  !isHost
@@ -76,14 +100,14 @@ const ScreenshareButton = (props: ScreenshareButtonProps) => {
76
100
  ...iconButtonProps.iconProps,
77
101
  tintColor: $config.SEMANTIC_NEUTRAL,
78
102
  };
79
- iconButtonProps.toolTipMessage = isHandRaised(local.uid)
80
- ? 'Waiting for host to appove the request'
81
- : 'Raise Hand in order to present';
103
+ iconButtonProps.toolTipMessage = lstooltip(isHandRaised(local.uid));
82
104
  iconButtonProps.disabled = true;
83
105
  }
84
106
 
85
107
  return props?.render ? (
86
108
  props.render(onPress, isScreenshareActive)
109
+ ) : isToolbarMenuItem ? (
110
+ <ToolbarMenuItem {...iconButtonProps} />
87
111
  ) : (
88
112
  <IconButton {...iconButtonProps} />
89
113
  );