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
@@ -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,26 +73,6 @@ const RecordingContext = createContext<RecordingContextInterface>({
45
73
  inProgress: false,
46
74
  });
47
75
 
48
- const START_RECORDING = gql`
49
- mutation startRecordingSession(
50
- $passphrase: String!
51
- $secret: String
52
- $config: recordingConfig!
53
- ) {
54
- startRecordingSession(
55
- passphrase: $passphrase
56
- secret: $secret
57
- config: $config
58
- )
59
- }
60
- `;
61
-
62
- const STOP_RECORDING = gql`
63
- mutation stopRecordingSession($passphrase: String!) {
64
- stopRecordingSession(passphrase: $passphrase)
65
- }
66
- `;
67
-
68
76
  /**
69
77
  * Component to start / stop Agora cloud recording.
70
78
  * Sends a control message to all users in the channel over RTM to indicate that
@@ -83,6 +91,7 @@ interface RecordingProviderProps {
83
91
  value: {
84
92
  setRecordingActive: React.Dispatch<SetStateAction<boolean>>;
85
93
  isRecordingActive: boolean;
94
+ callActive: boolean;
86
95
  };
87
96
  }
88
97
 
@@ -93,49 +102,55 @@ interface RecordingProviderProps {
93
102
  */
94
103
 
95
104
  const RecordingProvider = (props: RecordingProviderProps) => {
96
- const {rtcProps} = useContext(PropsContext);
97
- const {setRecordingActive, isRecordingActive} = props?.value;
105
+ const {setRecordingActive, isRecordingActive, callActive} = props?.value;
106
+ const {
107
+ data: {isHost, roomId},
108
+ } = useRoomInfo();
98
109
  const [inProgress, setInProgress] = useState(false);
99
110
  const [uidWhoStarted, setUidWhoStarted] = useState(0);
100
- const {renderList, activeUids} = useRender();
101
- const {phrase} = useParams<{phrase: string}>();
102
- const [startRecordingQuery] = useMutation(START_RECORDING);
103
- const [stopRecordingQuery] = useMutation(STOP_RECORDING);
111
+ const {defaultContent, activeUids} = useContent();
104
112
  const prevRecordingState = usePrevious<{isRecordingActive: boolean}>({
105
113
  isRecordingActive,
106
114
  });
107
- //commented for v1 release
108
- //const recordingStartedText = useString<boolean>('recordingNotificationLabel');
109
- const recordingStartedText = (active: boolean) =>
110
- active ? 'Recording Started' : 'Recording Stopped';
111
- 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
+
112
128
  const {localUid} = useContext(ChatContext);
113
- const {screenShareData} = useScreenContext();
129
+ const {store} = React.useContext(StorageContext);
114
130
 
115
- React.useEffect(() => {
116
- events.on(EventNames.RECORDING_ATTRIBUTE, (data) => {
117
- const payload = JSON.parse(data.payload);
118
- const action = payload.action;
119
- const value = payload.value;
120
- switch (action) {
121
- case EventActions.RECORDING_STARTED:
122
- setUidWhoStarted(parseInt(value));
123
- setRecordingActive(true);
124
- break;
125
- case EventActions.RECORDING_STOPPED:
126
- setRecordingActive(false);
127
- break;
128
- case EventActions.RECORDING_STOP_REQUEST:
129
- stopRecording();
130
- break;
131
- default:
132
- 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);
133
141
  }
134
- });
135
- () => {
136
- events.off(EventNames.RECORDING_ATTRIBUTE);
137
- };
138
- }, []);
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]);
139
154
 
140
155
  useEffect(() => {
141
156
  /**
@@ -146,41 +161,76 @@ const RecordingProvider = (props: RecordingProviderProps) => {
146
161
  */
147
162
  if (prevRecordingState) {
148
163
  if (prevRecordingState?.isRecordingActive === isRecordingActive) return;
164
+
165
+ if ($config.ENABLE_WAITING_ROOM && !isHost && !callActive) {
166
+ return;
167
+ }
168
+
149
169
  Toast.show({
170
+ leadingIconName: 'recording',
150
171
  type: 'info',
151
172
  text1: recordingStartedText(isRecordingActive),
152
173
  text2: isRecordingActive
153
- ? `This meeting is being recorded by ${
154
- trimText(renderList[uidWhoStarted]?.name) || 'user'
155
- }`
174
+ ? subheading(
175
+ trimText(defaultContent[uidWhoStarted]?.name) || userlabel,
176
+ )
156
177
  : '',
157
178
  visibilityTime: 3000,
158
179
  primaryBtn: null,
159
180
  secondaryBtn: null,
181
+ leadingIcon: null,
160
182
  });
161
183
  }
162
- }, [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
+ };
163
198
 
164
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
+
165
217
  setInProgress(true);
166
- // If recording is not going on, start the recording by executing the graphql query
167
- startRecordingQuery({
168
- variables: {
169
- passphrase: phrase,
170
- secret:
171
- rtcProps.encryption && rtcProps.encryption.key
172
- ? rtcProps.encryption.key
173
- : '',
174
- config: {
175
- resolution: 'SD360p',
176
- trigger: 'AUTO',
177
- },
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}` : '',
178
223
  },
224
+ body: JSON.stringify({
225
+ passphrase: roomId.host,
226
+ url: `${recordinghostURL}/${passphrase}`,
227
+ webpage_ready_timeout: 10,
228
+ encryption: $config.ENCRYPTION_ENABLED,
229
+ }),
179
230
  })
180
- .then((res) => {
181
- console.log(res.data);
231
+ .then((res: any) => {
182
232
  setInProgress(false);
183
- if (res.data.startRecordingSession === 'success') {
233
+ if (res.status === 200) {
184
234
  /**
185
235
  * 1. Once the backend sucessfuly starts recording, send message
186
236
  * in the channel indicating that cloud recording is now active.
@@ -191,90 +241,140 @@ const RecordingProvider = (props: RecordingProviderProps) => {
191
241
  action: EventActions.RECORDING_STARTED,
192
242
  value: `${localUid}`,
193
243
  }),
194
- EventPersistLevel.LEVEL3,
244
+ PersistanceLevel.Session,
195
245
  );
196
246
  // 2. set the local recording state to true to update the UI
197
247
  setUidWhoStarted(localUid);
198
248
  setRecordingActive(true);
199
- // 3. set the presenter mode if screen share is active
200
- // 3.a Get the most recent screenshare uid
201
- const sorted = Object.entries(screenShareData)
202
- .filter((el) => el[1]?.ts && el[1].ts > 0 && el[1]?.isActive)
203
- .sort((a, b) => b[1].ts - a[1].ts);
204
-
205
- const activeScreenshareUid = sorted.length > 0 ? sorted[0][0] : 0;
206
- if (activeScreenshareUid) {
207
- console.log(
208
- 'screenshare: Executing presenter query for screenuid',
209
- activeScreenshareUid,
210
- );
211
- executePresenterQuery(parseInt(activeScreenshareUid));
212
- } else {
213
- executeNormalQuery();
214
- }
249
+ } else if (res.status === 500) {
250
+ showErrorToast(headingStartError, subheadingError);
251
+ } else {
252
+ showErrorToast(headingStartError);
215
253
  }
216
254
  })
217
- .catch((err) => {
255
+ .catch(err => {
218
256
  setInProgress(false);
219
257
  console.log(err);
220
258
  });
221
259
  };
222
260
 
223
- const stopRecording = () => {
261
+ const stopRecording = useCallback(() => {
224
262
  /**
225
- * if condition added for below issue
226
- *
227
- * user 1 and user 2 in the call
228
- * user 1 start the recording
229
- * user 2 stops the recording
230
- * user 2 join the call getting stop recording notification which is not needed
231
- *
232
- * solution
233
- * case 1 - if recording is not started by the host then we will send level1 message to host who started the recording
234
- * 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.
235
264
  */
236
- if (
237
- localUid === uidWhoStarted ||
238
- activeUids.indexOf(uidWhoStarted) === -1
239
- ) {
240
- setInProgress(true);
241
- // If recording is already going on, stop the recording by executing the graphql query.
242
- stopRecordingQuery({variables: {passphrase: phrase}})
243
- .then((res) => {
244
- console.log(res.data);
245
- setInProgress(false);
246
- if (res.data.stopRecordingSession === 'success') {
247
- /**
248
- * 1. Once the backend sucessfuly starts recording, send message
249
- * in the channel indicating that cloud recording is now inactive.
250
- */
251
- events.send(
252
- EventNames.RECORDING_ATTRIBUTE,
253
- JSON.stringify({
254
- action: EventActions.RECORDING_STOPPED,
255
- value: '',
256
- }),
257
- EventPersistLevel.LEVEL3,
258
- );
259
- // 2. set the local recording state to false to update the UI
260
- setRecordingActive(false);
261
- }
262
- })
263
- .catch((err) => {
264
- setInProgress(false);
265
- console.log(err);
266
- });
267
- } else {
268
- events.send(
269
- EventNames.RECORDING_ATTRIBUTE,
270
- JSON.stringify({
271
- action: EventActions.RECORDING_STOP_REQUEST,
272
- value: '',
273
- }),
274
- 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..',
275
269
  );
270
+ return;
276
271
  }
277
- };
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
+ );
278
378
 
279
379
  return (
280
380
  <RecordingContext.Provider
@@ -283,6 +383,7 @@ const RecordingProvider = (props: RecordingProviderProps) => {
283
383
  startRecording,
284
384
  stopRecording,
285
385
  isRecordingActive,
386
+ fetchRecordings,
286
387
  }}>
287
388
  {props.children}
288
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,11 +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
22
  import {isAndroid, isIOS} from '../../utils/common';
23
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';
24
30
  /**
25
31
  * A component to start and stop screen sharing on web clients.
26
32
  * Screen sharing is not yet implemented on mobile platforms.
@@ -34,20 +40,20 @@ export interface ScreenshareButtonProps {
34
40
  }
35
41
 
36
42
  const ScreenshareButton = (props: ScreenshareButtonProps) => {
43
+ const {isToolbarMenuItem} = useToolbarMenu();
37
44
  const {rtcProps} = useContext(PropsContext);
38
45
  const {showLabel = $config.ICON_TEXT || false, isOnActionSheet = false} =
39
46
  props;
40
47
  const {
41
48
  data: {isHost},
42
- } = useMeetingInfo();
49
+ } = useRoomInfo();
43
50
  const local = useLocalUserInfo();
44
51
  const isHandRaised = useIsHandRaised();
45
52
  const {isScreenshareActive, startUserScreenshare, stopUserScreenShare} =
46
53
  useScreenshare();
47
54
  const {setShowStartScreenSharePopup} = useVideoCall();
48
- //commented for v1 release
49
- //const screenShareButton = useString('screenShareButton')();
50
-
55
+ const screenShareButtonLabel = useString<boolean>(toolbarItemShareText);
56
+ const lstooltip = useString<boolean>(livestreamingShareTooltipText);
51
57
  const onPress = () => {
52
58
  if (isScreenshareActive) {
53
59
  stopUserScreenShare();
@@ -62,7 +68,6 @@ const ScreenshareButton = (props: ScreenshareButtonProps) => {
62
68
  }
63
69
  };
64
70
 
65
- const screenShareButton = isScreenshareActive ? 'Stop Share' : 'Share';
66
71
  let iconButtonProps: IconButtonProps = {
67
72
  iconProps: {
68
73
  name: isScreenshareActive ? 'stop-screen-share' : 'screen-share',
@@ -72,13 +77,13 @@ const ScreenshareButton = (props: ScreenshareButtonProps) => {
72
77
  },
73
78
  onPress,
74
79
  btnTextProps: {
75
- text: showLabel ? screenShareButton : '',
80
+ text: showLabel ? screenShareButtonLabel(isScreenshareActive) : '',
76
81
  textColor: $config.FONT_COLOR,
77
82
  },
78
83
  };
79
84
  iconButtonProps.isOnActionSheet = isOnActionSheet;
80
85
  if (
81
- rtcProps.role == ClientRole.Audience &&
86
+ rtcProps.role == ClientRoleType.ClientRoleAudience &&
82
87
  $config.EVENT_MODE &&
83
88
  !$config.RAISE_HAND
84
89
  ) {
@@ -86,7 +91,7 @@ const ScreenshareButton = (props: ScreenshareButtonProps) => {
86
91
  }
87
92
 
88
93
  if (
89
- rtcProps.role == ClientRole.Audience &&
94
+ rtcProps.role == ClientRoleType.ClientRoleAudience &&
90
95
  $config.EVENT_MODE &&
91
96
  $config.RAISE_HAND &&
92
97
  !isHost
@@ -95,14 +100,14 @@ const ScreenshareButton = (props: ScreenshareButtonProps) => {
95
100
  ...iconButtonProps.iconProps,
96
101
  tintColor: $config.SEMANTIC_NEUTRAL,
97
102
  };
98
- iconButtonProps.toolTipMessage = isHandRaised(local.uid)
99
- ? 'Waiting for host to appove the request'
100
- : 'Raise Hand in order to present';
103
+ iconButtonProps.toolTipMessage = lstooltip(isHandRaised(local.uid));
101
104
  iconButtonProps.disabled = true;
102
105
  }
103
106
 
104
107
  return props?.render ? (
105
108
  props.render(onPress, isScreenshareActive)
109
+ ) : isToolbarMenuItem ? (
110
+ <ToolbarMenuItem {...iconButtonProps} />
106
111
  ) : (
107
112
  <IconButton {...iconButtonProps} />
108
113
  );