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
@@ -0,0 +1,117 @@
1
+ import createRetryFetch from 'fetch-retry';
2
+ import isSDK from './isSDK';
3
+ import {isAndroid, isWeb, isIOS} from './common';
4
+
5
+ /* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Cyclic_object_value#examples */
6
+ export function getCircularReplacer() {
7
+ const ancestors = [];
8
+ return function (key, value) {
9
+ if (typeof value !== 'object' || value === null) {
10
+ return value;
11
+ }
12
+ // `this` is the object that value is contained in,
13
+ // i.e., its direct parent.
14
+ while (ancestors.length > 0 && ancestors[ancestors.length - 1] !== this) {
15
+ ancestors.pop();
16
+ }
17
+ if (ancestors.includes(value)) {
18
+ return '[Circular]';
19
+ }
20
+ ancestors.push(value);
21
+ return value;
22
+ };
23
+ }
24
+
25
+ const fetchRetry = createRetryFetch(fetch, {
26
+ retries: 23,
27
+ retryDelay: function (attempt) {
28
+ return Math.pow(2, attempt) * 1000; // 1000, 2000, 4000
29
+ },
30
+ retryOn: function (attempt, error, response) {
31
+ // retry on any network error, or 4xx or 5xx status codes
32
+ if (error !== null || response.status > 400) {
33
+ return true;
34
+ }
35
+ },
36
+ });
37
+
38
+ const sendLogs = (p: any[]) => {
39
+ fetchRetry(
40
+ 'https://axiom-queue.appbuilder.workers.dev?dataset=app-builder-core',
41
+ // "&strategy=queue", // to send logs to a specific dataset [default: queue]
42
+ {
43
+ method: 'POST',
44
+ headers: new Headers({
45
+ 'Content-Type': 'application/json',
46
+ }),
47
+ body: JSON.stringify(p, getCircularReplacer()),
48
+ },
49
+ );
50
+ };
51
+
52
+ export const createAxiomLogger = () => {
53
+ const queue: any[] = [];
54
+ let batchId = 0;
55
+ let timeout: number | null = null;
56
+
57
+ const sendInterval = 45000; // 45s
58
+
59
+ const flush = () => {
60
+ if (timeout !== null) {
61
+ clearTimeout(timeout);
62
+ timeout = null;
63
+ }
64
+ if (queue.length === 0) return;
65
+ sendLogs(queue);
66
+ queue.length = 0;
67
+ batchId = batchId + 1;
68
+ };
69
+
70
+ const log = (logContent: {[key: string]: any}) => {
71
+ logContent.batchId = batchId;
72
+ queue.push(logContent);
73
+ if (queue.length >= 1000) {
74
+ flush();
75
+ } else {
76
+ if (timeout === null) {
77
+ // @ts-ignore
78
+ timeout = setTimeout(() => {
79
+ flush();
80
+ }, sendInterval);
81
+ }
82
+ }
83
+ };
84
+
85
+ return [log, flush] as const;
86
+ };
87
+
88
+ export const setupLogger = () => {
89
+ const [log, flush] = createAxiomLogger();
90
+
91
+ const _console_log = console.log;
92
+
93
+ console.log = (...args: any[]) => {
94
+ log({
95
+ data: args,
96
+ _time: Date.now(),
97
+ projectId: $config.APP_ID,
98
+ service: 'app-builder-core',
99
+ env: isSDK()
100
+ ? 'SDK'
101
+ : isWeb()
102
+ ? 'Web'
103
+ : isAndroid()
104
+ ? 'Android'
105
+ : isIOS()
106
+ ? 'Ios'
107
+ : 'Electron',
108
+ });
109
+
110
+ isWeb() &&
111
+ window.addEventListener('beforeunload', () => {
112
+ flush();
113
+ });
114
+
115
+ _console_log(...args);
116
+ };
117
+ };
Binary file
@@ -172,13 +172,15 @@ const BREAKPOINTS = {
172
172
 
173
173
  const useIsDesktop = () => {
174
174
  const {width, height} = useWindowDimensions();
175
- return (from: 'default' | 'toolbar' | 'popup' = 'default') => {
175
+ return (from: 'default' | 'toolbar' | 'popup' | 'large' = 'default') => {
176
176
  if (from === 'default') {
177
177
  return width > height ? true : false;
178
178
  } else if (from === 'toolbar') {
179
179
  return width > BREAKPOINTS.xl;
180
180
  } else if (from === 'popup') {
181
181
  return width > BREAKPOINTS.md;
182
+ } else if (from === 'large') {
183
+ return width > BREAKPOINTS.lg;
182
184
  }
183
185
  return width >= BREAKPOINTS.xl;
184
186
  };
@@ -219,6 +221,91 @@ const getParamFromURL = (url, param) => {
219
221
  const value = params[index + 2];
220
222
  return value;
221
223
  };
224
+ const throttleFn = (fn: Function, wait: number = 300) => {
225
+ let inThrottle: boolean,
226
+ lastFn: ReturnType<typeof setTimeout>,
227
+ lastTime: number;
228
+ return function (this: any) {
229
+ const context = this,
230
+ args = arguments;
231
+ if (!inThrottle) {
232
+ fn.apply(context, args);
233
+ lastTime = Date.now();
234
+ inThrottle = true;
235
+ } else {
236
+ clearTimeout(lastFn);
237
+ lastFn = setTimeout(() => {
238
+ if (Date.now() - lastTime >= wait) {
239
+ fn.apply(context, args);
240
+ lastTime = Date.now();
241
+ }
242
+ }, Math.max(wait - (Date.now() - lastTime), 0));
243
+ }
244
+ };
245
+ };
246
+
247
+ const debounceFn = (fn: Function, ms = 300) => {
248
+ let timeoutId: ReturnType<typeof setTimeout>;
249
+ return function (this: any, ...args: any[]) {
250
+ clearTimeout(timeoutId);
251
+ timeoutId = setTimeout(() => fn.apply(this, args), ms);
252
+ };
253
+ };
254
+
255
+ const capitalizeFirstLetter = (word: string): string => {
256
+ return word.charAt(0).toUpperCase() + word.slice(1);
257
+ };
258
+
259
+ const CustomToolbarSort = (a, b) =>
260
+ (a.hasOwnProperty('order') ? a.order : 999999) -
261
+ (b.hasOwnProperty('order') ? b.order : 999999);
262
+
263
+ const randomString = (
264
+ length = 5,
265
+ chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
266
+ ) => {
267
+ var result = '';
268
+ for (var i = length; i > 0; --i)
269
+ result += chars[Math.floor(Math.random() * chars.length)];
270
+ return result;
271
+ };
272
+
273
+ function randomIntFromInterval(min, max) {
274
+ // min and max included
275
+ return Math.floor(Math.random() * (max - min + 1) + min);
276
+ }
277
+ function getOS() {
278
+ let userAgent = window.navigator.userAgent.toLowerCase(),
279
+ macosPlatforms = /(macintosh|macintel|macppc|mac68k|macos)/i,
280
+ windowsPlatforms = /(win32|win64|windows|wince)/i,
281
+ iosPlatforms = /(iphone|ipad|ipod)/i,
282
+ os = null;
283
+
284
+ if (macosPlatforms.test(userAgent)) {
285
+ os = 'macos';
286
+ } else if (iosPlatforms.test(userAgent)) {
287
+ os = 'ios';
288
+ } else if (windowsPlatforms.test(userAgent)) {
289
+ os = 'windows';
290
+ } else if (/android/.test(userAgent)) {
291
+ os = 'android';
292
+ } else if (!os && /linux/.test(userAgent)) {
293
+ os = 'linux';
294
+ }
295
+
296
+ return os;
297
+ }
298
+
299
+ function hexToRgb(hex: string): [number, number, number] {
300
+ var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
301
+ return result
302
+ ? [
303
+ parseInt(result[1], 16),
304
+ parseInt(result[2], 16),
305
+ parseInt(result[3], 16),
306
+ ]
307
+ : [0, 0, 0];
308
+ }
222
309
 
223
310
  export {
224
311
  useIsDesktop,
@@ -240,4 +327,12 @@ export {
240
327
  useResponsive,
241
328
  processDeepLinkURI,
242
329
  getParamFromURL,
330
+ throttleFn,
331
+ debounceFn,
332
+ capitalizeFirstLetter,
333
+ CustomToolbarSort,
334
+ randomString,
335
+ randomIntFromInterval,
336
+ getOS,
337
+ hexToRgb,
243
338
  };
@@ -0,0 +1,4 @@
1
+ const RECORDING_BOT_UID = '100000';
2
+ const RECORDING_BOT_SCREENSHARE_UID = '100001';
3
+
4
+ export {RECORDING_BOT_UID, RECORDING_BOT_SCREENSHARE_UID};
@@ -0,0 +1,7 @@
1
+ import {CUSTOM_ROUTES_PREFIX} from 'customization-api';
2
+
3
+ const getCustomRoute = customRouteName => {
4
+ return CUSTOM_ROUTES_PREFIX + customRouteName;
5
+ };
6
+
7
+ export default getCustomRoute;
@@ -1,3 +1,6 @@
1
+ import {isWebInternal} from './common';
2
+
3
+ const Buffer = require('buffer/').Buffer;
1
4
  type Entry<T> = {
2
5
  [K in keyof T]: [K, T[K]];
3
6
  }[keyof T];
@@ -74,3 +77,34 @@ export function formatAMPM(date) {
74
77
  var strTime = hours + ':' + minutes + ' ' + ampm;
75
78
  return strTime;
76
79
  }
80
+ export function isURL(str) {
81
+ if (!str) {
82
+ return false;
83
+ }
84
+ var urlRegex =
85
+ '^(?!mailto:)(?:(?:http|https|ftp)://)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$';
86
+ var url = new RegExp(urlRegex, 'i');
87
+ return str.length < 2083 && url.test(str);
88
+ }
89
+
90
+ export const base64ToUint8Array = (base64Str: string) => {
91
+ let decodedData;
92
+
93
+ decodedData = Buffer.from(base64Str, 'base64').toString('binary');
94
+
95
+ if (isWebInternal()) {
96
+ const result: Uint8Array = new Uint8Array(
97
+ new ArrayBuffer(decodedData.length),
98
+ );
99
+ for (let i = 0; i < decodedData.length; i += 1) {
100
+ result[i] = decodedData.charCodeAt(i);
101
+ }
102
+ return result;
103
+ } else {
104
+ const result: number[] = [];
105
+ for (let i = 0; i < decodedData.length; i++) {
106
+ result.push(decodedData.charCodeAt(i));
107
+ }
108
+ return result;
109
+ }
110
+ };
@@ -0,0 +1,50 @@
1
+ /*
2
+ ********************************************
3
+ Copyright © 2021 Agora Lab, Inc., all rights reserved.
4
+ AppBuilder and all associated components, source code, APIs, services, and documentation
5
+ (the “Materials”) are owned by Agora Lab, Inc. and its licensors. The Materials may not be
6
+ accessed, used, modified, or distributed for any purpose without a license from Agora Lab, Inc.
7
+ Use without a license or in violation of any license terms and conditions (including use for
8
+ any purpose competitive to Agora Lab, Inc.’s business) is strictly prohibited. For more
9
+ information visit https://appbuilder.agora.io.
10
+ *********************************************
11
+ */
12
+
13
+ import React, {useState} from 'react';
14
+ import {createHook} from 'customization-implementation';
15
+ import {useToolbar} from './useToolbar';
16
+
17
+ export interface ActionSheetInferface {
18
+ isOnActionSheet: boolean;
19
+ isOnFirstRow: boolean;
20
+ showLabel: boolean;
21
+ }
22
+
23
+ const ActionSheetContext = React.createContext<ActionSheetInferface>({
24
+ isOnActionSheet: false,
25
+ isOnFirstRow: false,
26
+ showLabel: $config.ICON_TEXT,
27
+ });
28
+
29
+ interface ActionSheetProviderProps {
30
+ children: React.ReactNode;
31
+ isOnFirstRow?: boolean;
32
+ }
33
+ const ActionSheetProvider = (props: ActionSheetProviderProps) => {
34
+ const {position} = useToolbar();
35
+ return (
36
+ <ActionSheetContext.Provider
37
+ value={{
38
+ isOnActionSheet: true,
39
+ isOnFirstRow: props?.isOnFirstRow,
40
+ showLabel:
41
+ !props?.isOnFirstRow && $config.ICON_TEXT && position !== undefined,
42
+ }}>
43
+ {props.children}
44
+ </ActionSheetContext.Provider>
45
+ );
46
+ };
47
+
48
+ const useActionSheet = createHook(ActionSheetContext);
49
+
50
+ export {ActionSheetProvider, useActionSheet};
@@ -0,0 +1,38 @@
1
+ /*
2
+ ********************************************
3
+ Copyright © 2021 Agora Lab, Inc., all rights reserved.
4
+ AppBuilder and all associated components, source code, APIs, services, and documentation
5
+ (the “Materials”) are owned by Agora Lab, Inc. and its licensors. The Materials may not be
6
+ accessed, used, modified, or distributed for any purpose without a license from Agora Lab, Inc.
7
+ Use without a license or in violation of any license terms and conditions (including use for
8
+ any purpose competitive to Agora Lab, Inc.’s business) is strictly prohibited. For more
9
+ information visit https://appbuilder.agora.io.
10
+ *********************************************
11
+ */
12
+ import {useEffect, useState} from 'react';
13
+ import LocalEventEmitter, {
14
+ LocalEventsEnum,
15
+ } from '../rtm-events-api/LocalEvents';
16
+
17
+ /**
18
+ * Returns active speaker uid or undefined if nobody speaking
19
+ * @returns function
20
+ */
21
+ function useActiveSpeaker() {
22
+ const [activeSpeaker, setActiveSpeaker] = useState(undefined);
23
+ useEffect(() => {
24
+ const listenActiveSpeaker = data => {
25
+ setActiveSpeaker(data);
26
+ };
27
+ LocalEventEmitter.on(LocalEventsEnum.ACTIVE_SPEAKER, listenActiveSpeaker);
28
+ return () => {
29
+ LocalEventEmitter.off(
30
+ LocalEventsEnum.ACTIVE_SPEAKER,
31
+ listenActiveSpeaker,
32
+ );
33
+ };
34
+ }, []);
35
+ return activeSpeaker;
36
+ }
37
+
38
+ export default useActiveSpeaker;
@@ -0,0 +1,17 @@
1
+ import {useEffect, useState} from 'react';
2
+ import {AppState} from 'react-native';
3
+
4
+ const useAppState = () => {
5
+ const [appStateVisible, setAppStateVisible] = useState(AppState.currentState);
6
+ useEffect(() => {
7
+ const subscription = AppState.addEventListener('change', nextAppState => {
8
+ setAppStateVisible(nextAppState);
9
+ });
10
+ return () => {
11
+ subscription?.remove();
12
+ };
13
+ }, []);
14
+ return appStateVisible;
15
+ };
16
+
17
+ export default useAppState;
@@ -0,0 +1,138 @@
1
+ import {useRef, useEffect} from 'react';
2
+
3
+ export type Disposer = () => void;
4
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
5
+ export type Fn = (...args: any[]) => any;
6
+ export type Nullable<T> = T | null | undefined;
7
+ export type MaybePromise<T> = T | PromiseLike<T>;
8
+ export type MaybePromiseOrNull<T> = MaybePromise<Nullable<T>>;
9
+
10
+ export function invoke<T>(fn: () => T): T | void {
11
+ try {
12
+ return fn();
13
+ } catch (e) {
14
+ console.error(e);
15
+ }
16
+ }
17
+
18
+ export function joinDisposers(disposers: Disposer[]): Disposer {
19
+ return () => disposers.forEach(invoke);
20
+ }
21
+
22
+ export function interval(fn: Fn, interval: number): Disposer {
23
+ const id = setInterval(fn, interval);
24
+ return () => clearInterval(id);
25
+ }
26
+
27
+ export function timeout(fn: Fn, ms: number): Disposer {
28
+ const id = setTimeout(fn, ms);
29
+ return () => clearTimeout(id);
30
+ }
31
+
32
+ export interface AsyncTaskRunner {
33
+ run: (
34
+ this: void,
35
+ task: () => MaybePromise<void | (() => MaybePromise<void>)>,
36
+ ) => void;
37
+ dispose: (this: void) => void;
38
+ }
39
+
40
+ /**
41
+ * Chain async tasks. During the task running/stopping, if multiple tasks are triggered, only the last one will be executed.
42
+ */
43
+ export function createAsyncTaskRunner(): AsyncTaskRunner {
44
+ let isRunning: boolean | undefined;
45
+ let nextTask: undefined | (() => MaybePromise<void>);
46
+ let disposer: undefined | void | (() => MaybePromise<void>);
47
+
48
+ function runNextTask() {
49
+ if (nextTask) {
50
+ const _nextTask = nextTask;
51
+ nextTask = void 0;
52
+ _nextTask();
53
+ }
54
+ }
55
+
56
+ async function disposeEffect() {
57
+ if (disposer) {
58
+ const _disposer = disposer;
59
+ disposer = void 0;
60
+ try {
61
+ await _disposer();
62
+ } catch (e) {
63
+ console.error(e);
64
+ }
65
+ }
66
+ }
67
+
68
+ async function runTask(
69
+ effect: () => MaybePromise<void | (() => MaybePromise<void>)>,
70
+ ) {
71
+ isRunning = true;
72
+
73
+ await disposeEffect();
74
+
75
+ try {
76
+ disposer = await effect();
77
+ } catch (e) {
78
+ console.error(e);
79
+ }
80
+
81
+ isRunning = false;
82
+
83
+ runNextTask();
84
+ }
85
+
86
+ async function stopTask() {
87
+ isRunning = true;
88
+
89
+ await disposeEffect();
90
+
91
+ isRunning = false;
92
+
93
+ runNextTask();
94
+ }
95
+
96
+ function run(
97
+ task: () => MaybePromise<void | (() => MaybePromise<void>)>,
98
+ ): void {
99
+ if (isRunning) {
100
+ nextTask = () => runTask(task);
101
+ } else {
102
+ runTask(task);
103
+ }
104
+ }
105
+
106
+ function dispose(): void {
107
+ if (isRunning) {
108
+ nextTask = stopTask;
109
+ } else {
110
+ stopTask();
111
+ }
112
+ }
113
+
114
+ return {
115
+ run,
116
+ dispose,
117
+ };
118
+ }
119
+
120
+ /**
121
+ * Accepts a function that contains imperative, possibly asynchronous effect-ful code.
122
+ * During the side-effect running/removing, if multiple effects are triggered, only the last one will be executed.
123
+ */
124
+ export function useAsyncEffect(
125
+ effect: () => MaybePromise<void | (() => MaybePromise<void>)>,
126
+ deps?: ReadonlyArray<unknown>,
127
+ ): void {
128
+ const runnerRef = useRef<AsyncTaskRunner | undefined>();
129
+ useEffect(() => {
130
+ if (!runnerRef.current) {
131
+ runnerRef.current = createAsyncTaskRunner();
132
+ }
133
+ const {run, dispose} = runnerRef.current;
134
+ run(effect);
135
+ return dispose;
136
+ // eslint-disable-next-line react-hooks/exhaustive-deps
137
+ }, deps);
138
+ }
@@ -1,6 +1,6 @@
1
1
  import {gql, useMutation} from '@apollo/client';
2
- import {MeetingInfoContextInterface} from '../components/meeting-info/useMeetingInfo';
3
- import {useSetMeetingInfo} from '../components/meeting-info/useSetMeetingInfo';
2
+ import {RoomInfoContextInterface} from '../components/room-info/useRoomInfo';
3
+ import {useSetRoomInfo} from '../components/room-info/useSetRoomInfo';
4
4
  import SDKEvents from '../utils/SdkEvents';
5
5
  import isSDK from './isSDK';
6
6
 
@@ -23,12 +23,17 @@ const CREATE_CHANNEL = gql`
23
23
  /**
24
24
  * Returns an asynchronous function to create a meeting with the given options.
25
25
  */
26
- export default function useCreateMeeting() {
26
+ export type createRoomFun = (
27
+ roomTitle: string,
28
+ enablePSTN?: boolean,
29
+ ) => Promise<void>;
30
+ export default function useCreateRoom(): createRoomFun {
27
31
  const [createChannel, {error}] = useMutation(CREATE_CHANNEL);
28
- const {setMeetingInfo} = useSetMeetingInfo();
32
+ const {setRoomInfo} = useSetRoomInfo();
29
33
  return async (
30
34
  roomTitle: string,
31
35
  enablePSTN?: boolean,
36
+ //isSeparateHostLink will be for internal usage since backend integration is not there
32
37
  isSeparateHostLink?: boolean,
33
38
  ) => {
34
39
  const res = await createChannel({
@@ -45,37 +50,37 @@ export default function useCreateMeeting() {
45
50
  throw error;
46
51
  }
47
52
  if (res && res?.data && res?.data?.createChannel) {
48
- let meetingInfo: Partial<MeetingInfoContextInterface['data']> = {
53
+ let roomInfo: Partial<RoomInfoContextInterface['data']> = {
49
54
  roomId: {
50
55
  attendee: '',
51
56
  },
52
57
  };
53
58
  if (res?.data?.createChannel?.passphrase?.view) {
54
- meetingInfo.roomId.attendee = res.data.createChannel.passphrase.view;
59
+ roomInfo.roomId.attendee = res.data.createChannel.passphrase.view;
55
60
  }
56
61
  if (res?.data?.createChannel?.passphrase?.host) {
57
- meetingInfo.roomId.host = res.data.createChannel.passphrase.host;
62
+ roomInfo.roomId.host = res.data.createChannel.passphrase.host;
58
63
  }
59
64
  if (enablePSTN === true && res?.data?.createChannel?.pstn) {
60
- meetingInfo.pstn = {
65
+ roomInfo.pstn = {
61
66
  number: res.data.createChannel.pstn.number,
62
67
  pin: res.data.createChannel.pstn.dtmf,
63
68
  };
64
69
  }
65
- setMeetingInfo({
70
+ setRoomInfo({
66
71
  data: {
67
72
  isHost: true,
68
73
  isSeparateHostLink: isSeparateHostLink ? true : false,
69
74
  meetingTitle: roomTitle,
70
- roomId: meetingInfo?.roomId,
71
- pstn: meetingInfo?.pstn,
75
+ roomId: roomInfo?.roomId,
76
+ pstn: roomInfo?.pstn,
72
77
  },
73
78
  });
74
79
  SDKEvents.emit(
75
80
  'create',
76
- meetingInfo.roomId.host,
77
- meetingInfo.roomId.attendee,
78
- meetingInfo?.pstn,
81
+ roomInfo.roomId.host,
82
+ roomInfo.roomId.attendee,
83
+ roomInfo?.pstn,
79
84
  );
80
85
  } else {
81
86
  throw new Error(`An error occurred in parsing the channel data.`);
@@ -0,0 +1,65 @@
1
+ import {useContext} from 'react';
2
+ import {useCustomization} from 'customization-implementation';
3
+ import {useCaption, useContent, useRoomInfo} from 'customization-api';
4
+ import {PropsContext, DispatchContext} from '../../agora-rn-uikit';
5
+ import {useHistory} from '../components/Router';
6
+ import {stopForegroundService} from '../subComponents/LocalEndCall';
7
+ import RTMEngine from '../rtm/RTMEngine';
8
+ import {ENABLE_AUTH} from '../auth/config';
9
+ import {useAuth} from '../auth/AuthProvider';
10
+
11
+ const useEndCall = () => {
12
+ const history = useHistory();
13
+ const {defaultContent} = useContent();
14
+ const {isSTTActive} = useCaption();
15
+ const {
16
+ data: {isHost},
17
+ } = useRoomInfo();
18
+ const {authLogin} = useAuth();
19
+
20
+ const {rtcProps} = useContext(PropsContext);
21
+ const {dispatch} = useContext(DispatchContext);
22
+
23
+ const beforeEndCall = useCustomization(
24
+ data =>
25
+ data?.lifecycle?.useBeforeEndCall && data?.lifecycle?.useBeforeEndCall(),
26
+ );
27
+ const afterEndCall = useCustomization(
28
+ data =>
29
+ data?.lifecycle?.useAfterEndCall && data?.lifecycle?.useAfterEndCall(),
30
+ );
31
+
32
+ return async () => {
33
+ try {
34
+ await beforeEndCall(isHost, history as unknown as History);
35
+ } catch (error) {
36
+ console.log('debugging error on beforeEndCall');
37
+ }
38
+
39
+ setTimeout(() => {
40
+ dispatch({
41
+ type: 'EndCall',
42
+ value: [],
43
+ });
44
+ });
45
+ // stopping foreground servie on end call
46
+ stopForegroundService();
47
+ // stopping STT on call end,if only last user is remaining in call
48
+ const usersInCall = Object.entries(defaultContent).filter(
49
+ item => item[1].type === 'rtc',
50
+ );
51
+ usersInCall.length === 1 && isSTTActive && stop();
52
+ RTMEngine.getInstance().engine.leaveChannel(rtcProps.channel);
53
+ if (!ENABLE_AUTH) {
54
+ // await authLogout();
55
+ await authLogin();
56
+ }
57
+ try {
58
+ await afterEndCall(isHost, history as unknown as History);
59
+ } catch (error) {
60
+ console.log('debugging error on afterEndCall');
61
+ }
62
+ };
63
+ };
64
+
65
+ export default useEndCall;
@@ -0,0 +1,4 @@
1
+ const useFindActiveSpeaker = () => {
2
+ return null;
3
+ };
4
+ export default useFindActiveSpeaker;