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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (406) hide show
  1. package/package.json +2 -2
  2. package/template/.bundle/config +2 -0
  3. package/template/Gemfile +4 -0
  4. package/template/Gulpfile.js +29 -29
  5. package/template/_eslintrc.js +3 -3
  6. package/template/_gitignore +12 -11
  7. package/template/_package-lock.json +26471 -22749
  8. package/template/_prettierrc.js +2 -2
  9. package/template/agora-rn-uikit/src/Contexts/PropsContext.tsx +30 -10
  10. package/template/agora-rn-uikit/src/Contexts/RtcContext.tsx +19 -0
  11. package/template/agora-rn-uikit/src/Controls/BtnTemplate.tsx +1 -0
  12. package/template/agora-rn-uikit/src/Controls/Icons.ts +45 -0
  13. package/template/agora-rn-uikit/src/Controls/Local/EndCall.tsx +6 -4
  14. package/template/agora-rn-uikit/src/Controls/Local/FullScreen.tsx +3 -1
  15. package/template/agora-rn-uikit/src/Controls/Local/LocalAudioMute.tsx +1 -0
  16. package/template/agora-rn-uikit/src/Controls/Local/LocalVideoMute.tsx +1 -0
  17. package/template/agora-rn-uikit/src/Controls/Local/SwitchCamera.tsx +1 -0
  18. package/template/agora-rn-uikit/src/Controls/Remote/RemoteAudioMute.tsx +1 -0
  19. package/template/agora-rn-uikit/src/Controls/Remote/RemoteSwap.tsx +3 -1
  20. package/template/agora-rn-uikit/src/Controls/Remote/RemoteVideoMute.tsx +1 -0
  21. package/template/agora-rn-uikit/src/Reducer/ActiveSpeaker.ts +30 -0
  22. package/template/agora-rn-uikit/src/Reducer/LocalMuteAudio.ts +3 -1
  23. package/template/agora-rn-uikit/src/Reducer/LocalMuteVideo.ts +3 -1
  24. package/template/agora-rn-uikit/src/Reducer/LocalPermissionState.ts +1 -1
  25. package/template/agora-rn-uikit/src/Reducer/RemoteAudioStateChanged.ts +3 -3
  26. package/template/agora-rn-uikit/src/Reducer/RemoteVideoStateChanged.ts +5 -4
  27. package/template/agora-rn-uikit/src/Reducer/UpdateDualStreamMode.ts +1 -1
  28. package/template/agora-rn-uikit/src/Reducer/UserJoined.ts +8 -5
  29. package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteAudio.ts +1 -1
  30. package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteVideo.ts +1 -1
  31. package/template/agora-rn-uikit/src/Reducer/UserOffline.ts +1 -1
  32. package/template/agora-rn-uikit/src/Reducer/UserPin.ts +18 -1
  33. package/template/agora-rn-uikit/src/Reducer/UserSecondaryPin.ts +23 -0
  34. package/template/agora-rn-uikit/src/Reducer/index.ts +2 -0
  35. package/template/agora-rn-uikit/src/Rtc/Create.tsx +47 -21
  36. package/template/agora-rn-uikit/src/Rtc/Join.tsx +37 -15
  37. package/template/agora-rn-uikit/src/RtcConfigure.tsx +122 -12
  38. package/template/agora-rn-uikit/src/Views/MaxVideoView.native.tsx +32 -4
  39. package/template/agora-rn-uikit/src/Views/MaxVideoView.tsx +21 -2
  40. package/template/agora-rn-uikit/src/Views/MinVideoView.tsx +2 -0
  41. package/template/android/app/build.gradle +59 -156
  42. package/template/android/app/src/debug/AndroidManifest.xml +6 -1
  43. package/template/android/app/src/debug/java/com/helloworld/ReactNativeFlipper.java +7 -4
  44. package/template/android/app/src/main/AndroidManifest.xml +6 -19
  45. package/template/android/app/src/main/assets/fonts/icomoon.ttf +0 -0
  46. package/template/android/app/src/main/java/com/helloworld/MainActivity.java +17 -0
  47. package/template/android/app/src/main/java/com/helloworld/MainApplication.java +19 -36
  48. package/template/android/app/src/release/java/com/helloworld/ReactNativeFlipper.java +20 -0
  49. package/template/android/build.gradle +19 -33
  50. package/template/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  51. package/template/android/gradle/wrapper/gradle-wrapper.properties +3 -2
  52. package/template/android/gradle.properties +18 -4
  53. package/template/android/gradlew +165 -104
  54. package/template/android/gradlew.bat +12 -23
  55. package/template/android/settings.gradle +1 -0
  56. package/template/bridge/rtc/webNg/RtcEngine.ts +131 -16
  57. package/template/bridge/rtc/webNg/index.ts +72 -1
  58. package/template/bridge/rtm/web/index.ts +5 -3
  59. package/template/configTransform.js +16 -1
  60. package/template/customization-api/action-library.ts +0 -8
  61. package/template/customization-api/app-state.ts +11 -2
  62. package/template/customization-api/customEvents.ts +6 -1
  63. package/template/customization-api/index.ts +4 -0
  64. package/template/customization-api/sub-components.ts +6 -3
  65. package/template/customization-api/temp.ts +50 -0
  66. package/template/customization-api/typeDefinition.ts +26 -14
  67. package/template/customization-api/types.ts +26 -0
  68. package/template/customization-api/utils.ts +2 -0
  69. package/template/customization-implementation/index.ts +0 -1
  70. package/template/defaultConfig.js +72 -0
  71. package/template/global.d.ts +13 -1
  72. package/template/index.js +0 -4
  73. package/template/index.web.js +0 -5
  74. package/template/index.wsdk.tsx +1 -19
  75. package/template/ios/.xcode.env +11 -0
  76. package/template/ios/HelloWorld/AppDelegate.h +2 -4
  77. package/template/ios/HelloWorld/AppDelegate.mm +42 -0
  78. package/template/ios/HelloWorld/Info.plist +1 -1
  79. package/template/ios/HelloWorld/main.m +2 -1
  80. package/template/ios/HelloWorld.xcodeproj/project.pbxproj +529 -17
  81. package/template/ios/HelloWorld.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  82. package/template/ios/HelloWorld.xcworkspace/contents.xcworkspacedata +10 -0
  83. package/template/ios/HelloWorld.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  84. package/template/ios/HelloWorldTests/HelloWorldTests.m +14 -13
  85. package/template/ios/HelloWorldTests/Info.plist +2 -2
  86. package/template/ios/Podfile +53 -20
  87. package/template/ios/Podfile.lock +873 -0
  88. package/template/ios/ScreenSharing/Info.plist +15 -0
  89. package/template/ios/ScreenSharing/SampleHandler.h +9 -0
  90. package/template/ios/ScreenSharing/SampleHandler.m +70 -0
  91. package/template/jest.config.js +4 -0
  92. package/template/metro.config.js +7 -32
  93. package/template/package.json +52 -39
  94. package/template/react-native-toast-message/index.d.ts +3 -1
  95. package/template/react-native-toast-message/index.js +1 -0
  96. package/template/react-native-toast-message/src/components/base/index.js +20 -32
  97. package/template/react-native-toast-message/src/components/base/styles.js +18 -21
  98. package/template/react-native-toast-message/src/components/checkbox.js +24 -19
  99. package/template/react-native-toast-message/src/index.js +3 -1
  100. package/template/react-native-toast-message/src/index.sdk.tsx +4 -1
  101. package/template/src/App.tsx +13 -85
  102. package/template/src/AppRoutes.tsx +77 -0
  103. package/template/src/AppWrapper.tsx +38 -33
  104. package/template/src/SDKAppWrapper.tsx +79 -43
  105. package/template/src/app-state/useNoiseSupression.native.tsx +67 -0
  106. package/template/src/app-state/useNoiseSupression.tsx +107 -0
  107. package/template/src/app-state/useVideoQuality.tsx +39 -0
  108. package/template/src/assets/font-styles.css +171 -3
  109. package/template/src/assets/fonts/icomoon.ttf +0 -0
  110. package/template/src/assets/selection.json +1 -1
  111. package/template/src/atoms/ActionMenu.tsx +50 -11
  112. package/template/src/atoms/Avatar.tsx +51 -0
  113. package/template/src/atoms/Card.tsx +21 -8
  114. package/template/src/atoms/Carousel.native.tsx +105 -0
  115. package/template/src/atoms/Carousel.tsx +103 -0
  116. package/template/src/atoms/Checkbox.tsx +98 -0
  117. package/template/src/atoms/CircularProgress.tsx +0 -1
  118. package/template/src/atoms/ClipboardIconButton.tsx +91 -0
  119. package/template/src/atoms/CustomIcon.tsx +45 -0
  120. package/template/src/atoms/DropDownMulti.tsx +349 -0
  121. package/template/src/atoms/Dropdown.tsx +3 -3
  122. package/template/src/atoms/IconButton.tsx +52 -9
  123. package/template/src/atoms/ImageIcon.tsx +6 -3
  124. package/template/src/atoms/InlineNotification.tsx +81 -0
  125. package/template/src/atoms/MeetingLink.tsx +160 -0
  126. package/template/src/atoms/ParticipantsCount.tsx +18 -7
  127. package/template/src/atoms/Popup.tsx +49 -27
  128. package/template/src/atoms/PrimaryButton.tsx +19 -5
  129. package/template/src/atoms/RecordingInfo.tsx +2 -2
  130. package/template/src/atoms/SecondaryButton.tsx +2 -0
  131. package/template/src/atoms/Spacer.tsx +1 -0
  132. package/template/src/atoms/TertiaryButton.tsx +35 -5
  133. package/template/src/atoms/TextInput.tsx +2 -1
  134. package/template/src/atoms/Toolbar.tsx +64 -30
  135. package/template/src/atoms/ToolbarItem.tsx +11 -5
  136. package/template/src/atoms/ToolbarPreset.tsx +13 -2
  137. package/template/src/atoms/Tooltip.tsx +26 -4
  138. package/template/src/auth/AuthProvider.tsx +500 -0
  139. package/template/src/auth/AuthRoute.tsx +94 -0
  140. package/template/src/auth/IDPAuth.electron.tsx +31 -0
  141. package/template/src/auth/IDPAuth.tsx +67 -0
  142. package/template/src/auth/IDPLogoutComponent.tsx +158 -0
  143. package/template/src/auth/UserCancelPopup.tsx +115 -0
  144. package/template/src/auth/config.ts +52 -0
  145. package/template/src/auth/openIDPURL.electron.tsx +39 -0
  146. package/template/src/auth/openIDPURL.native.tsx +51 -0
  147. package/template/src/auth/openIDPURL.tsx +20 -0
  148. package/template/src/auth/useIDPAuth.electron.tsx +65 -0
  149. package/template/src/auth/useIDPAuth.native.tsx +70 -0
  150. package/template/src/auth/useIDPAuth.tsx +63 -0
  151. package/template/src/auth/useTokenAuth.tsx +194 -0
  152. package/template/src/components/Chat.tsx +5 -8
  153. package/template/src/components/ChatContext.ts +4 -0
  154. package/template/src/components/ColorConfigure.tsx +0 -1
  155. package/template/src/components/CommonStyles.ts +9 -2
  156. package/template/src/components/Controls.tsx +659 -52
  157. package/template/src/components/DeviceConfigure.tsx +362 -156
  158. package/template/src/components/DeviceContext.tsx +2 -0
  159. package/template/src/components/EventsConfigure.tsx +713 -109
  160. package/template/src/components/GraphQLProvider.tsx +62 -36
  161. package/template/src/components/GridVideo.tsx +23 -13
  162. package/template/src/components/HostControlView.tsx +11 -14
  163. package/template/src/components/JoinPhrase.tsx +0 -1
  164. package/template/src/components/Leftbar.tsx +4 -3
  165. package/template/src/components/Navbar.tsx +110 -42
  166. package/template/src/components/NavbarMobile.tsx +47 -36
  167. package/template/src/components/Navigation.native.tsx +1 -15
  168. package/template/src/{subComponents/screenshare/ScreenshareButton.native.tsx → components/Navigation.sdk.tsx} +17 -3
  169. package/template/src/components/Navigation.tsx +1 -15
  170. package/template/src/components/ParticipantsView.tsx +56 -48
  171. package/template/src/components/PinnedVideo.tsx +188 -114
  172. package/template/src/components/Precall.native.tsx +169 -67
  173. package/template/src/components/Precall.tsx +237 -71
  174. package/template/src/components/RTMConfigure.tsx +167 -55
  175. package/template/src/components/Rightbar.tsx +4 -3
  176. package/template/src/components/Router.electron.ts +1 -0
  177. package/template/src/components/Router.native.ts +1 -0
  178. package/template/src/components/Router.sdk.ts +1 -0
  179. package/template/src/components/Router.ts +1 -0
  180. package/template/src/components/SdkApiContext.tsx +179 -27
  181. package/template/src/components/SdkMuteToggleListener.tsx +88 -0
  182. package/template/src/components/SessionContext.tsx +0 -1
  183. package/template/src/components/Settings.tsx +25 -3
  184. package/template/src/components/SettingsView.tsx +44 -9
  185. package/template/src/components/Share.tsx +149 -71
  186. package/template/src/components/StorageContext.tsx +19 -5
  187. package/template/src/components/ToastComponent.tsx +3 -0
  188. package/template/src/components/WhiteboardLayout.tsx +291 -0
  189. package/template/src/components/chat-messages/useChatMessages.tsx +420 -207
  190. package/template/src/components/common/Error.tsx +2 -0
  191. package/template/src/components/common/Logo.tsx +2 -2
  192. package/template/src/components/contexts/LiveStreamDataContext.tsx +5 -4
  193. package/template/src/components/contexts/ScreenShareContext.tsx +15 -1
  194. package/template/src/components/contexts/WaitingRoomContext.tsx +50 -0
  195. package/template/src/components/contexts/WhiteboardContext.tsx +54 -54
  196. package/template/src/components/disable-chat/useDisableChat.tsx +32 -0
  197. package/template/src/components/livestream/LiveStreamContext.tsx +262 -177
  198. package/template/src/components/livestream/Types.ts +34 -18
  199. package/template/src/components/livestream/views/LiveStreamAttendeeLandingTile.tsx +295 -0
  200. package/template/src/components/livestream/views/LiveStreamControls.tsx +2 -4
  201. package/template/src/components/meeting-info-invite/MeetingInfo.tsx +82 -0
  202. package/template/src/components/meeting-info-invite/MeetingInfoCardHeader.tsx +86 -0
  203. package/template/src/components/meeting-info-invite/MeetingInfoGridTile.tsx +218 -0
  204. package/template/src/components/meeting-info-invite/MeetingInfoLinks.tsx +122 -0
  205. package/template/src/components/participants/AllAudienceParticipants.tsx +4 -5
  206. package/template/src/components/participants/AllHostParticipants.tsx +5 -6
  207. package/template/src/components/participants/Participant.tsx +40 -9
  208. package/template/src/components/participants/ParticipantSectionTitle.tsx +5 -2
  209. package/template/src/components/participants/ScreenshareParticipants.tsx +15 -17
  210. package/template/src/components/participants/UserActionMenuOptions.tsx +157 -49
  211. package/template/src/components/participants/WaitingRoomParticipants.tsx +74 -0
  212. package/template/src/components/popups/InvitePopup.tsx +110 -45
  213. package/template/src/components/popups/StartScreenSharePopup.native.tsx +182 -0
  214. package/template/src/components/popups/StartScreenSharePopup.tsx +6 -0
  215. package/template/src/components/popups/StopRecordingPopup.tsx +11 -5
  216. package/template/src/components/popups/StopScreenSharePopup.native.tsx +135 -0
  217. package/template/src/components/popups/StopScreenSharePopup.tsx +6 -0
  218. package/template/src/components/popups/WhiteboardClearAllPopup.tsx +123 -0
  219. package/template/src/components/precall/LocalMute.tsx +69 -45
  220. package/template/src/components/precall/PermissionHelper.tsx +52 -24
  221. package/template/src/components/precall/PreCallSettings.tsx +1 -0
  222. package/template/src/components/precall/VideoFallback.tsx +173 -0
  223. package/template/src/components/precall/VideoPreview.native.tsx +16 -50
  224. package/template/src/components/precall/VideoPreview.tsx +27 -162
  225. package/template/src/components/precall/index.tsx +2 -0
  226. package/template/src/components/precall/joinCallBtn.native.tsx +10 -3
  227. package/template/src/components/precall/joinCallBtn.tsx +11 -2
  228. package/template/src/components/precall/joinWaitingRoomBtn.native.tsx +210 -0
  229. package/template/src/components/precall/joinWaitingRoomBtn.tsx +250 -0
  230. package/template/src/components/precall/meetingTitle.tsx +35 -9
  231. package/template/src/components/precall/selectDevice.tsx +5 -5
  232. package/template/src/components/precall/textInput.tsx +16 -18
  233. package/template/src/components/precall/usePreCall.tsx +14 -4
  234. package/template/src/components/room-info/useRoomInfo.tsx +34 -0
  235. package/template/src/components/useShareLink.tsx +24 -59
  236. package/template/src/components/useUserPreference.tsx +73 -10
  237. package/template/src/components/useVideoCall.tsx +76 -3
  238. package/template/src/components/virtual-background/VBButton.tsx +64 -0
  239. package/template/src/components/virtual-background/VBCard.native.tsx +282 -0
  240. package/template/src/components/virtual-background/VBCard.tsx +272 -0
  241. package/template/src/components/virtual-background/VBPanel.tsx +279 -0
  242. package/template/src/components/virtual-background/VButils.native.ts +37 -0
  243. package/template/src/components/virtual-background/VButils.ts +104 -0
  244. package/template/src/components/virtual-background/VideoPreview.native.tsx +43 -0
  245. package/template/src/components/virtual-background/VideoPreview.tsx +106 -0
  246. package/template/src/components/virtual-background/imagePaths.ts +87 -0
  247. package/template/src/components/virtual-background/images/beachImageBase64.ts +1 -0
  248. package/template/src/components/virtual-background/images/bedroomImageBase64.ts +1 -0
  249. package/template/src/components/virtual-background/images/bookImageBase64.ts +1 -0
  250. package/template/src/components/virtual-background/images/earthImageBase64.ts +1 -0
  251. package/template/src/components/virtual-background/images/index.ts +37 -0
  252. package/template/src/components/virtual-background/images/lampImageBase64.ts +1 -0
  253. package/template/src/components/virtual-background/images/mountainsImageBase64.ts +1 -0
  254. package/template/src/components/virtual-background/images/office1ImageBase64.ts +1 -0
  255. package/template/src/components/virtual-background/images/officeImageBase64.ts +1 -0
  256. package/template/src/components/virtual-background/images/plantsImageBase64.ts +1 -0
  257. package/template/src/components/virtual-background/images/skyImageBase64.ts +1 -0
  258. package/template/src/components/virtual-background/images/wallImageBase64.ts +1 -0
  259. package/template/src/components/virtual-background/useVB.native.tsx +188 -0
  260. package/template/src/components/virtual-background/useVB.tsx +267 -0
  261. package/template/src/components/whiteboard/StrokeWidthTool.tsx +137 -0
  262. package/template/src/components/whiteboard/WhiteboardButton.tsx +93 -0
  263. package/template/src/components/whiteboard/WhiteboardCanvas.tsx +99 -0
  264. package/template/src/components/whiteboard/WhiteboardConfigure.native.tsx +137 -0
  265. package/template/src/components/whiteboard/WhiteboardConfigure.tsx +441 -0
  266. package/template/src/components/whiteboard/WhiteboardCursor.tsx +152 -0
  267. package/template/src/components/whiteboard/WhiteboardToolBox.tsx +1246 -0
  268. package/template/src/components/whiteboard/WhiteboardView.native.tsx +109 -0
  269. package/template/src/components/whiteboard/WhiteboardView.tsx +81 -0
  270. package/template/src/components/whiteboard/WhiteboardWidget.tsx +674 -0
  271. package/template/src/components/whiteboard/WhiteboardWrapper.tsx +38 -0
  272. package/template/src/language/default-labels/commonLabels.ts +51 -14
  273. package/template/src/language/default-labels/createScreenLabels.ts +97 -17
  274. package/template/src/language/default-labels/joinScreenLabels.ts +45 -6
  275. package/template/src/language/default-labels/precallScreenLabels.ts +145 -23
  276. package/template/src/language/default-labels/shareLinkScreenLabels.ts +85 -37
  277. package/template/src/language/default-labels/videoCallScreenLabels.ts +1137 -158
  278. package/template/src/pages/Create.tsx +125 -80
  279. package/template/src/pages/Join.tsx +76 -34
  280. package/template/src/pages/Login.tsx +26 -0
  281. package/template/src/pages/VideoCall.tsx +229 -114
  282. package/template/src/pages/video-call/ActionSheet.native.tsx +54 -7
  283. package/template/src/pages/video-call/ActionSheet.tsx +55 -16
  284. package/template/src/pages/video-call/ActionSheetContent.tsx +366 -291
  285. package/template/src/pages/video-call/ActionSheetHandle.tsx +7 -1
  286. package/template/src/pages/video-call/DefaultLayouts.ts +11 -5
  287. package/template/src/pages/video-call/NameWithMicIcon.tsx +17 -9
  288. package/template/src/pages/video-call/PinchableView.tsx +119 -0
  289. package/template/src/pages/video-call/RenderComponent.tsx +12 -3
  290. package/template/src/pages/video-call/SidePanelHeader.tsx +208 -6
  291. package/template/src/pages/video-call/VideoCallMobileView.tsx +140 -106
  292. package/template/src/pages/video-call/VideoCallScreen.native.tsx +3 -2
  293. package/template/src/pages/video-call/VideoCallScreen.tsx +113 -66
  294. package/template/src/pages/video-call/VideoComponent.tsx +53 -5
  295. package/template/src/pages/video-call/VideoRenderer.tsx +309 -52
  296. package/template/src/pages/video-call/VisibilitySensor.tsx +104 -0
  297. package/template/src/pages/video-call/ZoomableWrapper.native.tsx +34 -0
  298. package/template/src/pages/video-call/ZoomableWrapper.tsx +5 -0
  299. package/template/src/pages/video-call/index.ts +2 -0
  300. package/template/src/rtm/RTMEngine.ts +9 -4
  301. package/template/src/rtm-events/constants.ts +20 -0
  302. package/template/src/rtm-events-api/Events.ts +2 -0
  303. package/template/src/rtm-events-api/LocalEvents.ts +8 -0
  304. package/template/src/selection.json +1 -0
  305. package/template/src/subComponents/ChatBubble.tsx +81 -64
  306. package/template/src/subComponents/ChatContainer.tsx +20 -13
  307. package/template/src/subComponents/ChatInput.ios.tsx +11 -2
  308. package/template/src/subComponents/ChatInput.tsx +12 -3
  309. package/template/src/subComponents/Checkbox.native.tsx +46 -46
  310. package/template/src/subComponents/Checkbox.tsx +7 -6
  311. package/template/src/subComponents/CopyJoinInfo.tsx +26 -11
  312. package/template/src/subComponents/EndcallPopup.tsx +83 -12
  313. package/template/src/subComponents/LanguageSelector.tsx +34 -30
  314. package/template/src/subComponents/LayoutIconButton.tsx +30 -8
  315. package/template/src/subComponents/LayoutIconDropdown.tsx +19 -3
  316. package/template/src/subComponents/Loading.tsx +60 -0
  317. package/template/src/subComponents/LocalAudioMute.tsx +106 -30
  318. package/template/src/subComponents/LocalEndCall.tsx +91 -15
  319. package/template/src/subComponents/LocalSwitchCamera.tsx +50 -11
  320. package/template/src/subComponents/LocalVideoMute.tsx +126 -32
  321. package/template/src/subComponents/LogoutButton.tsx +1 -1
  322. package/template/src/subComponents/NetworkQualityPill.tsx +14 -31
  323. package/template/src/subComponents/Recording.tsx +23 -6
  324. package/template/src/subComponents/RemoteAudioMute.tsx +3 -3
  325. package/template/src/subComponents/RemoteMutePopup.tsx +55 -14
  326. package/template/src/subComponents/RemoteVideoMute.tsx +3 -3
  327. package/template/src/subComponents/RemoveMeetingPopup.tsx +19 -6
  328. package/template/src/subComponents/RemoveScreensharePopup.tsx +20 -5
  329. package/template/src/subComponents/ScreenShareNotice.tsx +11 -6
  330. package/template/src/subComponents/SelectDevice.tsx +98 -32
  331. package/template/src/subComponents/SidePanelEnum.tsx +2 -0
  332. package/template/src/subComponents/SidePanelHeader.tsx +97 -63
  333. package/template/src/subComponents/ToastConfig.tsx +70 -61
  334. package/template/src/subComponents/caption/Caption.tsx +130 -0
  335. package/template/src/subComponents/caption/CaptionContainer.tsx +302 -0
  336. package/template/src/subComponents/caption/CaptionIcon.tsx +111 -0
  337. package/template/src/subComponents/caption/CaptionText.tsx +182 -0
  338. package/template/src/subComponents/caption/DownloadTranscriptBtn.tsx +65 -0
  339. package/template/src/subComponents/caption/LanguageSelectorPopup.tsx +192 -0
  340. package/template/src/subComponents/caption/Transcript.tsx +449 -0
  341. package/template/src/subComponents/caption/TranscriptIcon.tsx +123 -0
  342. package/template/src/subComponents/caption/TranscriptText.tsx +98 -0
  343. package/template/src/subComponents/caption/index.ts +3 -0
  344. package/template/src/subComponents/caption/proto/ptoto.js +91 -0
  345. package/template/src/subComponents/caption/proto/test.proto +23 -0
  346. package/template/src/subComponents/caption/useCaption.tsx +123 -0
  347. package/template/src/subComponents/caption/useCaptionWidth.ts +27 -0
  348. package/template/src/subComponents/caption/useSTTAPI.tsx +179 -0
  349. package/template/src/subComponents/caption/useStreamMessageUtils.native.ts +211 -0
  350. package/template/src/subComponents/caption/useStreamMessageUtils.ts +235 -0
  351. package/template/src/subComponents/caption/useTranscriptDownload.native.ts +68 -0
  352. package/template/src/subComponents/caption/useTranscriptDownload.ts +52 -0
  353. package/template/src/subComponents/caption/utils.ts +125 -0
  354. package/template/src/subComponents/chat/ChatParticipants.tsx +53 -17
  355. package/template/src/subComponents/livestream/CurrentLiveStreamRequestsView.tsx +11 -13
  356. package/template/src/subComponents/livestream/controls/LocalRaiseHand.tsx +33 -9
  357. package/template/src/subComponents/livestream/controls/RemoteLiveStreamApprovedRequestRecall.tsx +1 -0
  358. package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestApprove.tsx +10 -6
  359. package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestReject.tsx +28 -19
  360. package/template/src/subComponents/recording/useRecording.tsx +49 -20
  361. package/template/src/subComponents/recording/useRecordingLayoutQuery.tsx +0 -1
  362. package/template/src/subComponents/screenshare/ScreenshareButton.tsx +29 -10
  363. package/template/src/subComponents/screenshare/ScreenshareConfigure.native.tsx +270 -66
  364. package/template/src/subComponents/screenshare/ScreenshareConfigure.tsx +182 -95
  365. package/template/src/subComponents/screenshare/useScreenshare.tsx +2 -0
  366. package/template/src/subComponents/waiting-rooms/WaitingRoomControls.tsx +85 -0
  367. package/template/src/subComponents/waiting-rooms/useWaitingRoomAPI.ts +75 -0
  368. package/template/src/theme/index.ts +9 -0
  369. package/template/src/utils/SdkEvents.ts +14 -0
  370. package/template/src/utils/SdkMethodEvents.ts +23 -3
  371. package/template/src/utils/axiomLogger.ts +117 -0
  372. package/template/src/utils/book.jpg +0 -0
  373. package/template/src/utils/common.tsx +118 -6
  374. package/template/src/utils/endCallEveryOne.ts +7 -0
  375. package/template/src/utils/getCustomRoute.ts +7 -0
  376. package/template/src/utils/index.tsx +23 -0
  377. package/template/src/utils/useActionSheet.tsx +50 -0
  378. package/template/src/utils/useActiveSpeaker.ts +3 -7
  379. package/template/src/utils/useAppState.ts +17 -0
  380. package/template/src/utils/useAsyncEffect.ts +138 -0
  381. package/template/src/utils/useCreateRoom.ts +8 -12
  382. package/template/src/utils/useDisableButton.tsx +37 -0
  383. package/template/src/utils/useFindActiveSpeaker.native.ts +4 -0
  384. package/template/src/utils/useFindActiveSpeaker.ts +335 -0
  385. package/template/src/utils/useIsLocalUserSpeaking.native.ts +4 -0
  386. package/template/src/utils/useIsLocalUserSpeaking.ts +98 -0
  387. package/template/src/utils/useJoinRoom.ts +97 -36
  388. package/template/src/utils/useMuteToggleLocal.ts +114 -96
  389. package/template/src/utils/useString.ts +13 -3
  390. package/template/static.d.ts +42 -0
  391. package/template/tsconfig_rsdk_index.json +3 -3
  392. package/template/tsconfig_wsdk_index.json +1 -1
  393. package/template/web/index.html +20 -0
  394. package/template/webpack.commons.js +21 -10
  395. package/template/webpack.web.config.js +7 -3
  396. package/template/_buckconfig +0 -6
  397. package/template/_gitattributes +0 -1
  398. package/template/android/app/_BUCK +0 -55
  399. package/template/android/app/build_defs.bzl +0 -19
  400. package/template/ios/HelloWorld/AppDelegate.m +0 -74
  401. package/template/src/components/OAuth.electron.tsx +0 -41
  402. package/template/src/components/OAuth.native.tsx +0 -55
  403. package/template/src/components/OAuth.tsx +0 -30
  404. package/template/src/components/OAuthConfig.ts +0 -77
  405. package/template/src/components/Settings.native.tsx +0 -21
  406. package/template/src/components/StoreToken.tsx +0 -39
@@ -9,9 +9,20 @@
9
9
  information visit https://appbuilder.agora.io.
10
10
  *********************************************
11
11
  */
12
- import React, {useState, useContext, useEffect, useRef} from 'react';
12
+ import React, {
13
+ useState,
14
+ useContext,
15
+ useEffect,
16
+ useRef,
17
+ useReducer,
18
+ } from 'react';
13
19
  import {View, StyleSheet, useWindowDimensions} from 'react-native';
14
- import {PropsContext} from '../../agora-rn-uikit';
20
+ import {
21
+ DispatchContext,
22
+ PropsContext,
23
+ ToggleState,
24
+ useLocalUid,
25
+ } from '../../agora-rn-uikit';
15
26
  import LocalAudioMute from '../subComponents/LocalAudioMute';
16
27
  import LocalVideoMute from '../subComponents/LocalVideoMute';
17
28
  import Recording from '../subComponents/Recording';
@@ -20,8 +31,14 @@ import ScreenshareButton from '../subComponents/screenshare/ScreenshareButton';
20
31
  import isMobileOrTablet from '../utils/isMobileOrTablet';
21
32
  import {ClientRole} from '../../agora-rn-uikit';
22
33
  import LiveStreamControls from './livestream/views/LiveStreamControls';
23
- import {BREAKPOINTS, useIsDesktop} from '../utils/common';
24
- import {useRoomInfo} from './room-info/useRoomInfo';
34
+ import {
35
+ BREAKPOINTS,
36
+ CustomToolbarSort,
37
+ isWeb,
38
+ isWebInternal,
39
+ useIsDesktop,
40
+ } from '../utils/common';
41
+ import {RoomInfoContextInterface, useRoomInfo} from './room-info/useRoomInfo';
25
42
  import LocalEndcall from '../subComponents/LocalEndCall';
26
43
  import LayoutIconButton from '../subComponents/LayoutIconButton';
27
44
  import CopyJoinInfo from '../subComponents/CopyJoinInfo';
@@ -32,6 +49,7 @@ import {
32
49
  ChatType,
33
50
  SidePanelType,
34
51
  useChatUIControls,
52
+ useContent,
35
53
  useLayout,
36
54
  useRecording,
37
55
  useSidePanel,
@@ -39,42 +57,454 @@ import {
39
57
  import {useVideoCall} from './useVideoCall';
40
58
  import {useScreenshare} from '../subComponents/screenshare/useScreenshare';
41
59
  import LayoutIconDropdown from '../subComponents/LayoutIconDropdown';
60
+ import {useCaption} from '../../src/subComponents/caption/useCaption';
61
+ import LanguageSelectorPopup from '../../src/subComponents/caption/LanguageSelectorPopup';
62
+ import useSTTAPI from '../../src/subComponents/caption/useSTTAPI';
63
+ import {EventNames} from '../rtm-events';
64
+ import events, {PersistanceLevel} from '../rtm-events-api';
65
+ import Toast from '../../react-native-toast-message';
66
+ import {getLanguageLabel} from '../../src/subComponents/caption/utils';
67
+ import ImageIcon from '../atoms/ImageIcon';
68
+ import useGetName from '../utils/useGetName';
42
69
  import Toolbar from '../atoms/Toolbar';
43
70
  import ToolbarItem from '../atoms/ToolbarItem';
44
71
  import {ToolbarCustomItem} from '../atoms/ToolbarPreset';
45
72
 
73
+ import {BoardColor, whiteboardContext} from './whiteboard/WhiteboardConfigure';
74
+ import {RoomPhase} from 'white-web-sdk';
75
+ import {useNoiseSupression} from '../app-state/useNoiseSupression';
76
+
77
+ import {useVB} from './virtual-background/useVB';
78
+ import WhiteboardWrapper from './whiteboard/WhiteboardWrapper';
79
+ import isSDK from '../utils/isSDK';
80
+ import LocalEventEmitter, {
81
+ LocalEventsEnum,
82
+ } from '../rtm-events-api/LocalEvents';
83
+ import {useSetRoomInfo} from './room-info/useSetRoomInfo';
84
+ import {useString} from '../utils/useString';
85
+ import {
86
+ sttSpokenLanguageToastHeading,
87
+ sttSpokenLanguageToastSubHeading,
88
+ toolbarItemCaptionText,
89
+ toolbarItemChatText,
90
+ toolbarItemInviteText,
91
+ toolbarItemLayoutText,
92
+ toolbarItemMoreText,
93
+ toolbarItemNoiseCancellationText,
94
+ toolbarItemPeopleText,
95
+ toolbarItemRecordingText,
96
+ toolbarItemSettingText,
97
+ toolbarItemShareText,
98
+ toolbarItemTranscriptText,
99
+ toolbarItemVirtualBackgroundText,
100
+ toolbarItemWhiteboardText,
101
+ } from '../language/default-labels/videoCallScreenLabels';
102
+
103
+ export const useToggleWhiteboard = () => {
104
+ const {
105
+ whiteboardActive,
106
+ joinWhiteboardRoom,
107
+ leaveWhiteboardRoom,
108
+ getWhiteboardUid,
109
+ } = useContext(whiteboardContext);
110
+ const {setCustomContent} = useContent();
111
+ const {setLayout} = useLayout();
112
+ const {dispatch} = useContext(DispatchContext);
113
+ return () => {
114
+ if ($config.ENABLE_WHITEBOARD) {
115
+ if (whiteboardActive) {
116
+ leaveWhiteboardRoom();
117
+ setCustomContent(getWhiteboardUid(), false);
118
+ setLayout('grid');
119
+ events.send(
120
+ EventNames.WHITEBOARD_ACTIVE,
121
+ JSON.stringify({status: false}),
122
+ PersistanceLevel.Session,
123
+ );
124
+ } else {
125
+ joinWhiteboardRoom();
126
+ setCustomContent(getWhiteboardUid(), WhiteboardWrapper, {}, true);
127
+ dispatch({
128
+ type: 'UserPin',
129
+ value: [getWhiteboardUid()],
130
+ });
131
+ setLayout('pinned');
132
+ events.send(
133
+ EventNames.WHITEBOARD_ACTIVE,
134
+ JSON.stringify({status: true}),
135
+ PersistanceLevel.Session,
136
+ );
137
+ }
138
+ }
139
+ };
140
+ };
141
+
142
+ export const WhiteboardListener = () => {
143
+ const {dispatch} = useContext(DispatchContext);
144
+ const {setCustomContent} = useContent();
145
+ const {currentLayout, setLayout} = useLayout();
146
+ const {
147
+ data: {isHost},
148
+ isWhiteBoardOn,
149
+ } = useRoomInfo();
150
+
151
+ React.useEffect(() => {
152
+ if ($config.ENABLE_WAITING_ROOM && !isHost) {
153
+ if (isWhiteBoardOn) {
154
+ WhiteboardStartedCallBack();
155
+ } else {
156
+ WhiteboardStoppedCallBack();
157
+ }
158
+ }
159
+ }, [isWhiteBoardOn, isHost]);
160
+
161
+ const WhiteboardCallBack = ({status}) => {
162
+ if (status) {
163
+ WhiteboardStartedCallBack();
164
+ } else {
165
+ WhiteboardStoppedCallBack();
166
+ }
167
+ };
168
+
169
+ useEffect(() => {
170
+ if (
171
+ !$config.ENABLE_WAITING_ROOM ||
172
+ ($config.ENABLE_WAITING_ROOM && isHost)
173
+ ) {
174
+ LocalEventEmitter.on(
175
+ LocalEventsEnum.WHITEBOARD_ACTIVE_LOCAL,
176
+ WhiteboardCallBack,
177
+ );
178
+
179
+ return () => {
180
+ LocalEventEmitter.on(
181
+ LocalEventsEnum.WHITEBOARD_ACTIVE_LOCAL,
182
+ WhiteboardCallBack,
183
+ );
184
+ };
185
+ }
186
+ }, [isHost]);
187
+
188
+ //whiteboard start
189
+
190
+ const {
191
+ whiteboardActive,
192
+ joinWhiteboardRoom,
193
+ leaveWhiteboardRoom,
194
+ getWhiteboardUid,
195
+ } = useContext(whiteboardContext);
196
+
197
+ const WhiteboardStoppedCallBack = () => {
198
+ toggleWhiteboard(true, false);
199
+ };
200
+
201
+ const WhiteboardStartedCallBack = () => {
202
+ toggleWhiteboard(false, false);
203
+ };
204
+
205
+ useEffect(() => {
206
+ whiteboardActive && currentLayout !== 'pinned' && setLayout('pinned');
207
+ }, []);
208
+
209
+ const toggleWhiteboard = (
210
+ whiteboardActive: boolean,
211
+ triggerEvent: boolean,
212
+ ) => {
213
+ if ($config.ENABLE_WHITEBOARD) {
214
+ if (whiteboardActive) {
215
+ leaveWhiteboardRoom();
216
+ setCustomContent(getWhiteboardUid(), false);
217
+ setLayout('grid');
218
+ triggerEvent &&
219
+ events.send(
220
+ EventNames.WHITEBOARD_ACTIVE,
221
+ JSON.stringify({status: false}),
222
+ PersistanceLevel.Session,
223
+ );
224
+ } else {
225
+ joinWhiteboardRoom();
226
+ setCustomContent(getWhiteboardUid(), WhiteboardWrapper, {}, true);
227
+ dispatch({
228
+ type: 'UserPin',
229
+ value: [getWhiteboardUid()],
230
+ });
231
+ setLayout('pinned');
232
+ triggerEvent &&
233
+ events.send(
234
+ EventNames.WHITEBOARD_ACTIVE,
235
+ JSON.stringify({status: true}),
236
+ PersistanceLevel.Session,
237
+ );
238
+ }
239
+ }
240
+ };
241
+ return null;
242
+ };
243
+
46
244
  const MoreButton = () => {
245
+ const noiseCancellationLabel = useString(toolbarItemNoiseCancellationText)();
246
+ const whiteboardLabel = useString<boolean>(toolbarItemWhiteboardText);
247
+ const captionLabel = useString<boolean>(toolbarItemCaptionText);
248
+ const transcriptLabel = useString<boolean>(toolbarItemTranscriptText);
249
+ const settingsLabel = useString(toolbarItemSettingText)();
250
+ const screenShareButton = useString<boolean>(toolbarItemShareText);
251
+ const recordingButton = useString<boolean>(toolbarItemRecordingText);
252
+ const moreButtonLabel = useString(toolbarItemMoreText)();
253
+ const virtualBackgroundLabel = useString(toolbarItemVirtualBackgroundText)();
254
+ const chatLabel = useString(toolbarItemChatText)();
255
+ const inviteLabel = useString(toolbarItemInviteText)();
256
+ const peopleLabel = useString(toolbarItemPeopleText)();
257
+ const layoutLabel = useString(toolbarItemLayoutText)();
258
+ const {dispatch} = useContext(DispatchContext);
47
259
  const {rtcProps} = useContext(PropsContext);
48
- const [actionMenuVisible, setActionMenuVisible] = React.useState(false);
260
+ const {setCustomContent} = useContent();
261
+ const [_, setActionMenuVisible] = React.useState(false);
49
262
  const [isHovered, setIsHovered] = useState(false);
50
263
  const [isHoveredOnModal, setIsHoveredOnModal] = useState(false);
51
264
  const moreBtnRef = useRef(null);
52
265
  const {width: globalWidth, height: globalHeight} = useWindowDimensions();
53
266
  const layouts = useLayoutsData();
54
267
  const {currentLayout, setLayout} = useLayout();
55
- const layout = layouts.findIndex((item) => item.name === currentLayout);
268
+ const layout = layouts.findIndex(item => item.name === currentLayout);
56
269
  const {setSidePanel, sidePanel} = useSidePanel();
270
+ const {
271
+ isCaptionON,
272
+ setIsCaptionON,
273
+ language: prevLang,
274
+ isSTTActive,
275
+ setIsSTTActive,
276
+ isSTTError,
277
+ } = useCaption();
278
+
279
+ const isTranscriptON = sidePanel === SidePanelType.Transcript;
280
+
281
+ const [isLanguagePopupOpen, setLanguagePopup] =
282
+ React.useState<boolean>(false);
283
+ const isFirstTimePopupOpen = React.useRef(false);
284
+ const STT_clicked = React.useRef(null);
285
+
286
+ const {start, restart} = useSTTAPI();
57
287
  const {
58
288
  data: {isHost},
59
289
  } = useRoomInfo();
60
- const {
61
- showLayoutOption,
62
- setShowInvitePopup,
63
- setShowStopRecordingPopup,
64
- setShowLayoutOption,
65
- } = useVideoCall();
290
+ const {setShowInvitePopup, setShowStopRecordingPopup, setShowLayoutOption} =
291
+ useVideoCall();
66
292
  const {isScreenshareActive, startUserScreenshare, stopUserScreenShare} =
67
293
  useScreenshare();
68
294
  const {isRecordingActive, startRecording, inProgress} = useRecording();
69
295
  const {setChatType} = useChatUIControls();
70
296
  const actionMenuitems: ActionMenuItem[] = [];
71
297
 
298
+ const {isNoiseSupressionEnabled, setNoiseSupression} = useNoiseSupression();
299
+
300
+ //AINS
301
+ if ($config.ENABLE_NOISE_CANCELLATION) {
302
+ actionMenuitems.push({
303
+ toggleStatus: isNoiseSupressionEnabled === ToggleState.enabled,
304
+ disabled:
305
+ isNoiseSupressionEnabled === ToggleState.disabling ||
306
+ isNoiseSupressionEnabled === ToggleState.enabling,
307
+ isBase64Icon: true,
308
+ //@ts-ignore
309
+ icon: 'noise-cancellation',
310
+ iconColor: $config.SECONDARY_ACTION_COLOR,
311
+ textColor: $config.FONT_COLOR,
312
+ title: noiseCancellationLabel,
313
+ //isNoiseSupressionEnabled === ToggleState.enabled
314
+ callback: () => {
315
+ setActionMenuVisible(false);
316
+ setNoiseSupression(p => !p);
317
+ },
318
+ });
319
+ }
320
+ //AINS
321
+
322
+ //virtual background
323
+ const {isVBActive, setIsVBActive} = useVB();
324
+
325
+ const toggleVB = () => {
326
+ if (isVBActive) {
327
+ setSidePanel(SidePanelType.None);
328
+ } else {
329
+ setSidePanel(SidePanelType.VirtualBackground);
330
+ }
331
+ setIsVBActive(prev => !prev);
332
+ };
333
+ if ($config.ENABLE_VIRTUAL_BACKGROUND && !$config.AUDIO_ROOM) {
334
+ actionMenuitems.push({
335
+ isBase64Icon: true,
336
+ //@ts-ignore
337
+ icon: 'vb',
338
+ iconColor: $config.SECONDARY_ACTION_COLOR,
339
+ textColor: $config.FONT_COLOR,
340
+ //title: `${isVBActive ? 'Hide' : 'Show'} Virtual Background`,
341
+ title: virtualBackgroundLabel,
342
+ callback: () => {
343
+ setActionMenuVisible(false);
344
+ toggleVB();
345
+ },
346
+ });
347
+ }
348
+ //virtual background
349
+
350
+ //whiteboard start
351
+
352
+ const {
353
+ whiteboardRoomState,
354
+ whiteboardActive,
355
+ joinWhiteboardRoom,
356
+ leaveWhiteboardRoom,
357
+ getWhiteboardUid,
358
+ whiteboardStartedFirst,
359
+ } = useContext(whiteboardContext);
360
+
361
+ const WhiteboardStoppedCallBack = () => {
362
+ toggleWhiteboard(true, false);
363
+ };
364
+
365
+ const WhiteboardStartedCallBack = () => {
366
+ toggleWhiteboard(false, false);
367
+ };
368
+
369
+ useEffect(() => {
370
+ whiteboardActive && currentLayout !== 'pinned' && setLayout('pinned');
371
+ }, []);
372
+
373
+ const WhiteboardCallBack = ({status}) => {
374
+ if (status) {
375
+ WhiteboardStartedCallBack();
376
+ } else {
377
+ WhiteboardStoppedCallBack();
378
+ }
379
+ };
380
+
381
+ useEffect(() => {
382
+ LocalEventEmitter.on(
383
+ LocalEventsEnum.WHITEBOARD_ACTIVE_LOCAL,
384
+ WhiteboardCallBack,
385
+ );
386
+ return () => {
387
+ LocalEventEmitter.off(
388
+ LocalEventsEnum.WHITEBOARD_ACTIVE_LOCAL,
389
+ WhiteboardCallBack,
390
+ );
391
+ };
392
+ }, []);
393
+
394
+ const toggleWhiteboard = (
395
+ whiteboardActive: boolean,
396
+ triggerEvent: boolean,
397
+ ) => {
398
+ if ($config.ENABLE_WHITEBOARD) {
399
+ if (whiteboardActive) {
400
+ leaveWhiteboardRoom();
401
+ setCustomContent(getWhiteboardUid(), false);
402
+ setLayout('grid');
403
+ triggerEvent &&
404
+ events.send(
405
+ EventNames.WHITEBOARD_ACTIVE,
406
+ JSON.stringify({status: false}),
407
+ PersistanceLevel.Session,
408
+ );
409
+ } else {
410
+ joinWhiteboardRoom();
411
+ setCustomContent(getWhiteboardUid(), WhiteboardWrapper, {}, true);
412
+ dispatch({
413
+ type: 'UserPin',
414
+ value: [getWhiteboardUid()],
415
+ });
416
+ setLayout('pinned');
417
+ triggerEvent &&
418
+ events.send(
419
+ EventNames.WHITEBOARD_ACTIVE,
420
+ JSON.stringify({status: true}),
421
+ PersistanceLevel.Session,
422
+ );
423
+ }
424
+ }
425
+ };
426
+ const WhiteboardDisabled =
427
+ !isHost ||
428
+ whiteboardRoomState === RoomPhase.Connecting ||
429
+ whiteboardRoomState === RoomPhase.Disconnecting;
430
+
431
+ //whiteboard ends
432
+
433
+ if (isHost && $config.ENABLE_WHITEBOARD && isWebInternal()) {
434
+ actionMenuitems.push({
435
+ disabled: WhiteboardDisabled,
436
+ isBase64Icon: true,
437
+ //@ts-ignore
438
+ icon: 'whiteboard-new',
439
+ iconColor: $config.SECONDARY_ACTION_COLOR,
440
+ textColor: $config.FONT_COLOR,
441
+ title: whiteboardLabel(whiteboardActive),
442
+ callback: () => {
443
+ setActionMenuVisible(false);
444
+ toggleWhiteboard(whiteboardActive, true);
445
+ },
446
+ });
447
+ }
448
+
449
+ // host can see stt options and attendee can view only when stt is enabled by a host in the channel
450
+
451
+ if ($config.ENABLE_STT) {
452
+ actionMenuitems.push({
453
+ icon: `${isCaptionON ? 'captions-off' : 'captions'}`,
454
+ iconColor: $config.SECONDARY_ACTION_COLOR,
455
+ textColor: $config.FONT_COLOR,
456
+ disabled: !($config.ENABLE_STT && (isHost || (!isHost && isSTTActive))),
457
+ title: captionLabel(isCaptionON),
458
+ callback: () => {
459
+ setActionMenuVisible(false);
460
+ STT_clicked.current = !isCaptionON ? 'caption' : null;
461
+ if (isSTTError) {
462
+ setIsCaptionON(prev => !prev);
463
+ return;
464
+ }
465
+ if (isSTTActive) {
466
+ setIsCaptionON(prev => !prev);
467
+ // is lang popup has been shown once for any user in meeting
468
+ } else {
469
+ isFirstTimePopupOpen.current = true;
470
+ setLanguagePopup(true);
471
+ }
472
+ },
473
+ });
474
+
475
+ actionMenuitems.push({
476
+ icon: 'transcript',
477
+ iconColor: $config.SECONDARY_ACTION_COLOR,
478
+ textColor: $config.FONT_COLOR,
479
+ disabled: !($config.ENABLE_STT && (isHost || (!isHost && isSTTActive))),
480
+ title: transcriptLabel(isTranscriptON),
481
+ callback: () => {
482
+ setActionMenuVisible(false);
483
+ STT_clicked.current = !isTranscriptON ? 'transcript' : null;
484
+ if (isSTTError) {
485
+ !isTranscriptON
486
+ ? setSidePanel(SidePanelType.Transcript)
487
+ : setSidePanel(SidePanelType.None);
488
+ return;
489
+ }
490
+ if (isSTTActive) {
491
+ !isTranscriptON
492
+ ? setSidePanel(SidePanelType.Transcript)
493
+ : setSidePanel(SidePanelType.None);
494
+ } else {
495
+ isFirstTimePopupOpen.current = true;
496
+ setLanguagePopup(true);
497
+ }
498
+ },
499
+ });
500
+ }
501
+
72
502
  if (globalWidth <= BREAKPOINTS.sm) {
73
503
  actionMenuitems.push({
74
504
  icon: 'participants',
75
505
  iconColor: $config.SECONDARY_ACTION_COLOR,
76
506
  textColor: $config.FONT_COLOR,
77
- title: 'People',
507
+ title: peopleLabel,
78
508
  callback: () => {
79
509
  setActionMenuVisible(false);
80
510
  setSidePanel(SidePanelType.Participants);
@@ -84,7 +514,7 @@ const MoreButton = () => {
84
514
  icon: 'chat-nav',
85
515
  iconColor: $config.SECONDARY_ACTION_COLOR,
86
516
  textColor: $config.FONT_COLOR,
87
- title: 'Chat',
517
+ title: chatLabel,
88
518
  callback: () => {
89
519
  setActionMenuVisible(false);
90
520
  setChatType(ChatType.Group);
@@ -113,7 +543,7 @@ const MoreButton = () => {
113
543
  textColor: isScreenshareActive
114
544
  ? $config.SEMANTIC_ERROR
115
545
  : $config.FONT_COLOR,
116
- title: isScreenshareActive ? 'Stop Share' : 'Share',
546
+ title: screenShareButton(isScreenshareActive),
117
547
  callback: () => {
118
548
  setActionMenuVisible(false);
119
549
  isScreenshareActive
@@ -133,7 +563,7 @@ const MoreButton = () => {
133
563
  textColor: isRecordingActive
134
564
  ? $config.SEMANTIC_ERROR
135
565
  : $config.FONT_COLOR,
136
- title: isRecordingActive ? 'Stop Recording' : 'Record',
566
+ title: recordingButton(isRecordingActive),
137
567
  callback: () => {
138
568
  setActionMenuVisible(false);
139
569
  if (!isRecordingActive) {
@@ -148,14 +578,17 @@ const MoreButton = () => {
148
578
 
149
579
  if (globalWidth <= BREAKPOINTS.md) {
150
580
  actionMenuitems.push({
151
- icon: layouts[layout]?.iconName,
581
+ //below icon key is dummy value
582
+ icon: 'grid',
583
+ externalIconString: layouts[layout]?.icon,
584
+ isExternalIcon: true,
152
585
  iconColor: $config.SECONDARY_ACTION_COLOR,
153
586
  textColor: $config.FONT_COLOR,
154
- title: 'Layout',
587
+ title: layoutLabel,
155
588
  callback: () => {
156
589
  //setShowLayoutOption(true);
157
590
  },
158
- onHoverCallback: (isHovered) => {
591
+ onHoverCallback: isHovered => {
159
592
  setShowLayoutOption(isHovered);
160
593
  },
161
594
  onHoverContent: (
@@ -176,7 +609,7 @@ const MoreButton = () => {
176
609
  icon: 'share',
177
610
  iconColor: $config.SECONDARY_ACTION_COLOR,
178
611
  textColor: $config.FONT_COLOR,
179
- title: 'Invite',
612
+ title: inviteLabel,
180
613
  callback: () => {
181
614
  setActionMenuVisible(false);
182
615
  setShowInvitePopup(true);
@@ -189,7 +622,7 @@ const MoreButton = () => {
189
622
  icon: 'settings',
190
623
  iconColor: $config.SECONDARY_ACTION_COLOR,
191
624
  textColor: $config.FONT_COLOR,
192
- title: 'Settings',
625
+ title: settingsLabel,
193
626
  callback: () => {
194
627
  setActionMenuVisible(false);
195
628
  setSidePanel(SidePanelType.Settings);
@@ -200,7 +633,7 @@ const MoreButton = () => {
200
633
  useEffect(() => {
201
634
  if (isHovered) {
202
635
  setActionMenuVisible(true);
203
- }
636
+ } else setActionMenuVisible(false);
204
637
  }, [isHovered]);
205
638
 
206
639
  useEffect(() => {
@@ -208,14 +641,56 @@ const MoreButton = () => {
208
641
  setActionMenuVisible(false);
209
642
  }, [currentLayout]);
210
643
 
644
+ const onConfirm = async (langChanged, language) => {
645
+ const isCaptionClicked = STT_clicked.current === 'caption';
646
+ const isTranscriptClicked = STT_clicked.current === 'transcript';
647
+ setLanguagePopup(false);
648
+ isFirstTimePopupOpen.current = false;
649
+ const method = isCaptionClicked
650
+ ? isCaptionON
651
+ : isTranscriptON
652
+ ? 'stop'
653
+ : 'start';
654
+ if (isTranscriptClicked) {
655
+ if (!isTranscriptON) {
656
+ setSidePanel(SidePanelType.Transcript);
657
+ } else {
658
+ setSidePanel(SidePanelType.None);
659
+ }
660
+ }
661
+ if (method === 'stop') return; // not closing the stt service as it will stop for whole channel
662
+ if (method === 'start' && isSTTActive === true) return; // not triggering the start service if STT Service already started by anyone else in the channel
663
+
664
+ if (isCaptionClicked) {
665
+ setIsCaptionON(prev => !prev);
666
+ } else {
667
+ }
668
+
669
+ try {
670
+ const res = await start(language);
671
+ if (res?.message.includes('STARTED')) {
672
+ // channel is already started now restart
673
+ await restart(language);
674
+ }
675
+ } catch (error) {
676
+ console.log('eror in starting stt', error);
677
+ }
678
+ };
679
+
211
680
  return (
212
681
  <>
682
+ <LanguageSelectorPopup
683
+ modalVisible={isLanguagePopupOpen}
684
+ setModalVisible={setLanguagePopup}
685
+ onConfirm={onConfirm}
686
+ isFirstTimePopupOpen={isFirstTimePopupOpen.current}
687
+ />
213
688
  <ActionMenu
214
- containerStyle={{width: 180}}
689
+ containerStyle={globalWidth < 720 ? {width: 180} : {width: 260}}
215
690
  hoverMode={true}
216
- onHover={(isVisible) => setIsHoveredOnModal(isVisible)}
691
+ onHover={isVisible => setIsHoveredOnModal(isVisible)}
217
692
  from={'control-bar'}
218
- actionMenuVisible={(isHovered || isHoveredOnModal) && actionMenuVisible}
693
+ actionMenuVisible={isHovered || isHoveredOnModal}
219
694
  setActionMenuVisible={setActionMenuVisible}
220
695
  modalPosition={{
221
696
  bottom: 8,
@@ -242,7 +717,7 @@ const MoreButton = () => {
242
717
  }}
243
718
  />
244
719
  <IconButton
245
- setRef={(ref) => {
720
+ setRef={ref => {
246
721
  moreBtnRef.current = ref;
247
722
  }}
248
723
  onPress={() => {
@@ -253,7 +728,7 @@ const MoreButton = () => {
253
728
  tintColor: $config.SECONDARY_ACTION_COLOR,
254
729
  }}
255
730
  btnTextProps={{
256
- text: $config.ICON_TEXT ? 'More' : '',
731
+ text: $config.ICON_TEXT ? moreButtonLabel : '',
257
732
  textColor: $config.FONT_COLOR,
258
733
  }}
259
734
  />
@@ -295,26 +770,20 @@ const defaultStartItems: Array<ToolbarCustomItem> = [
295
770
 
296
771
  export const RaiseHandToolbarItem = () => {
297
772
  const {rtcProps} = useContext(PropsContext);
298
- const isDesktop = useIsDesktop();
773
+ // attendee can view option if any host has started STT
299
774
  const {
300
775
  data: {isHost},
301
776
  } = useRoomInfo();
302
777
  return $config.EVENT_MODE ? (
303
778
  rtcProps.role == ClientRole.Audience ? (
304
- <LiveStreamControls
305
- showControls={true}
306
- isDesktop={isDesktop('toolbar')}
307
- />
779
+ <LiveStreamControls showControls={true} />
308
780
  ) : rtcProps?.role == ClientRole.Broadcaster ? (
309
781
  /**
310
782
  * In event mode when raise hand feature is active
311
783
  * and audience is promoted to host, the audience can also
312
784
  * demote himself
313
785
  */
314
- <LiveStreamControls
315
- isDesktop={isDesktop('toolbar')}
316
- showControls={!isHost}
317
- />
786
+ <LiveStreamControls showControls={!isHost} />
318
787
  ) : (
319
788
  <></>
320
789
  )
@@ -382,18 +851,43 @@ export const RecordingToolbarItem = () => {
382
851
 
383
852
  export const MoreButtonToolbarItem = () => {
384
853
  const {width} = useWindowDimensions();
385
- return (
386
- width < BREAKPOINTS.md && (
387
- <ToolbarItem testID="more-btn">
388
- <MoreButton />
389
- </ToolbarItem>
390
- )
854
+ const {
855
+ data: {isHost},
856
+ } = useRoomInfo();
857
+ const {isSTTActive} = useCaption();
858
+ const [_, forceUpdate] = useReducer(x => x + 1, 0);
859
+
860
+ useEffect(() => {
861
+ forceUpdate();
862
+ }, [isHost]);
863
+
864
+ return width < BREAKPOINTS.md ||
865
+ ($config.ENABLE_STT && (isHost || (!isHost && isSTTActive))) ||
866
+ $config.ENABLE_NOISE_CANCELLATION ||
867
+ ($config.ENABLE_VIRTUAL_BACKGROUND && !$config.AUDIO_ROOM) ||
868
+ (isHost && $config.ENABLE_WHITEBOARD && isWebInternal()) ? (
869
+ <ToolbarItem testID="more-btn">
870
+ {!isHost && $config.ENABLE_WHITEBOARD && isWebInternal() ? (
871
+ <WhiteboardListener />
872
+ ) : (
873
+ <></>
874
+ )}
875
+ <MoreButton />
876
+ </ToolbarItem>
877
+ ) : (
878
+ <WhiteboardListener />
391
879
  );
392
880
  };
393
- export const LocalEndcallToolbarItem = () => {
881
+ export interface LocalEndcallToolbarItemProps {
882
+ customExit?: () => void;
883
+ }
884
+ export const LocalEndcallToolbarItem = (
885
+ props?: LocalEndcallToolbarItemProps,
886
+ ) => {
394
887
  return (
395
- <ToolbarItem testID="endCall-btn">
396
- <LocalEndcall />
888
+ <ToolbarItem
889
+ testID={props?.customExit ? 'endCall-btn-custom' : 'endCall-btn'}>
890
+ <LocalEndcall {...props} />
397
891
  </ToolbarItem>
398
892
  );
399
893
  };
@@ -458,24 +952,123 @@ export interface ControlsProps {
458
952
  const Controls = (props: ControlsProps) => {
459
953
  const {customItems = [], includeDefaultItems = true} = props;
460
954
  const {width} = useWindowDimensions();
955
+ const {defaultContent} = useContent();
956
+ const {setLanguage, setMeetingTranscript, setIsSTTActive} = useCaption();
957
+ const defaultContentRef = React.useRef(defaultContent);
958
+ const {setRoomInfo} = useSetRoomInfo();
959
+ const heading = useString<'Set' | 'Changed'>(sttSpokenLanguageToastHeading);
960
+ const subheading = useString<{
961
+ action: 'Set' | 'Changed';
962
+ newLanguage: string;
963
+ oldLanguage: string;
964
+ username: string;
965
+ }>(sttSpokenLanguageToastSubHeading);
966
+
967
+ const {
968
+ data: {isHost},
969
+ sttLanguage,
970
+ isSTTActive,
971
+ } = useRoomInfo();
972
+
973
+ React.useEffect(() => {
974
+ defaultContentRef.current = defaultContent;
975
+ }, [defaultContent]);
976
+
977
+ React.useEffect(() => {
978
+ // for mobile events are set in ActionSheetContent
979
+ if (!sttLanguage) return;
980
+ const {
981
+ username,
982
+ prevLang,
983
+ newLang,
984
+ uid,
985
+ langChanged,
986
+ }: RoomInfoContextInterface['sttLanguage'] = sttLanguage;
987
+ if (!langChanged) return;
988
+ const actionText =
989
+ prevLang.indexOf('') !== -1
990
+ ? `has set the spoken language to "${getLanguageLabel(newLang)}" `
991
+ : `changed the spoken language from "${getLanguageLabel(
992
+ prevLang,
993
+ )}" to "${getLanguageLabel(newLang)}" `;
994
+ // const msg = `${
995
+ // //@ts-ignore
996
+ // defaultContentRef.current[uid]?.name || username
997
+ // } ${actionText} `;
998
+ let subheadingObj: any = {};
999
+ if (prevLang.indexOf('') !== -1) {
1000
+ subheadingObj = {
1001
+ username: defaultContentRef.current[uid]?.name || username,
1002
+ action: prevLang.indexOf('') !== -1 ? 'Set' : 'Changed',
1003
+ newLanguage: getLanguageLabel(newLang),
1004
+ };
1005
+ } else {
1006
+ subheadingObj = {
1007
+ username: defaultContentRef.current[uid]?.name || username,
1008
+ action: prevLang.indexOf('') !== -1 ? 'Set' : 'Changed',
1009
+ newLanguage: getLanguageLabel(newLang),
1010
+ oldLanguage: getLanguageLabel(prevLang),
1011
+ };
1012
+ }
461
1013
 
462
- const isHidden = (i) => {
1014
+ Toast.show({
1015
+ leadingIconName: 'lang-select',
1016
+ type: 'info',
1017
+ text1: heading(prevLang.indexOf('') !== -1 ? 'Set' : 'Changed'),
1018
+ visibilityTime: 3000,
1019
+ primaryBtn: null,
1020
+ secondaryBtn: null,
1021
+ text2: subheading(subheadingObj),
1022
+ });
1023
+ setRoomInfo(prev => {
1024
+ return {
1025
+ ...prev,
1026
+ sttLanguage: {...sttLanguage, langChanged: false},
1027
+ };
1028
+ });
1029
+ // syncing local set language
1030
+ newLang && setLanguage(newLang);
1031
+ // add spoken lang msg to transcript
1032
+ setMeetingTranscript(prev => {
1033
+ return [
1034
+ ...prev,
1035
+ {
1036
+ name: 'langUpdate',
1037
+ time: new Date().getTime(),
1038
+ uid: `langUpdate-${uid}`,
1039
+ text: actionText,
1040
+ },
1041
+ ];
1042
+ });
1043
+ }, [sttLanguage]);
1044
+
1045
+ React.useEffect(() => {
1046
+ setIsSTTActive(isSTTActive);
1047
+ }, [isSTTActive]);
1048
+
1049
+ const ToastIcon = ({color}) => (
1050
+ <View style={{marginRight: 12, alignSelf: 'center', width: 24, height: 24}}>
1051
+ <ImageIcon iconType="plain" tintColor={color} name={'lang-select'} />
1052
+ </View>
1053
+ );
1054
+
1055
+ const isHidden = i => {
463
1056
  return i?.hide === 'yes';
464
1057
  };
465
1058
  const customStartItems = customItems
466
- ?.filter((i) => i?.align === 'start' && !isHidden(i))
1059
+ ?.filter(i => i?.align === 'start' && !isHidden(i))
467
1060
  ?.concat(includeDefaultItems ? defaultStartItems : [])
468
- ?.sort((a, b) => a?.order - b?.order);
1061
+ ?.sort(CustomToolbarSort);
469
1062
 
470
1063
  const customCenterItems = customItems
471
- ?.filter((i) => i?.align === 'center' && !isHidden(i))
1064
+ ?.filter(i => i?.align === 'center' && !isHidden(i))
472
1065
  ?.concat(includeDefaultItems ? defaultCenterItems : [])
473
- ?.sort((a, b) => a?.order - b?.order);
1066
+ ?.sort(CustomToolbarSort);
474
1067
 
475
1068
  const customEndItems = customItems
476
- ?.filter((i) => i?.align === 'end' && !isHidden(i))
1069
+ ?.filter(i => i?.align === 'end' && !isHidden(i))
477
1070
  ?.concat(includeDefaultItems ? defaultEndItems : [])
478
- ?.sort((a, b) => a?.order - b?.order);
1071
+ ?.sort(CustomToolbarSort);
479
1072
 
480
1073
  const renderContent = (
481
1074
  items: ToolbarCustomItem[],
@@ -529,6 +1122,20 @@ const style = StyleSheet.create({
529
1122
  justifyContent: 'flex-end',
530
1123
  alignItems: 'center',
531
1124
  },
1125
+ secondaryBtn: {marginLeft: 16, height: 40, paddingVertical: 5},
1126
+ primaryBtn: {
1127
+ maxWidth: 109,
1128
+ minWidth: 109,
1129
+ height: 40,
1130
+ borderRadius: 4,
1131
+ paddingVertical: 5,
1132
+ paddingHorizontal: 12,
1133
+ },
1134
+ primaryBtnText: {
1135
+ fontWeight: '600',
1136
+ fontSize: 16,
1137
+ paddingLeft: 0,
1138
+ },
532
1139
  });
533
1140
 
534
1141
  export default Controls;