agora-appbuilder-core 4.0.0 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (475) hide show
  1. package/package.json +3 -3
  2. package/template/.bundle/config +2 -0
  3. package/template/Gemfile +4 -0
  4. package/template/Gulpfile.js +29 -29
  5. package/template/_eslintrc.js +3 -3
  6. package/template/_gitignore +12 -11
  7. package/template/_package-lock.json +28491 -23647
  8. package/template/_prettierrc.js +2 -2
  9. package/template/agora-rn-uikit/.eslintrc.js +5 -0
  10. package/template/agora-rn-uikit/package.json +14 -14
  11. package/template/agora-rn-uikit/src/AgoraUIKit.tsx +6 -6
  12. package/template/agora-rn-uikit/src/Contexts/ContentContext.tsx +10 -0
  13. package/template/agora-rn-uikit/src/Contexts/DispatchContext.tsx +22 -0
  14. package/template/agora-rn-uikit/src/Contexts/LocalUserContext.tsx +6 -6
  15. package/template/agora-rn-uikit/src/Contexts/PropsContext.tsx +79 -38
  16. package/template/agora-rn-uikit/src/Contexts/RtcContext.tsx +26 -17
  17. package/template/agora-rn-uikit/src/Controls/BtnTemplate.tsx +1 -0
  18. package/template/agora-rn-uikit/src/Controls/Icons.ts +45 -0
  19. package/template/agora-rn-uikit/src/Controls/Local/EndCall.tsx +6 -4
  20. package/template/agora-rn-uikit/src/Controls/Local/FullScreen.tsx +3 -1
  21. package/template/agora-rn-uikit/src/Controls/Local/LocalAudioMute.tsx +5 -2
  22. package/template/agora-rn-uikit/src/Controls/Local/LocalVideoMute.tsx +5 -2
  23. package/template/agora-rn-uikit/src/Controls/Local/Recording.tsx +0 -2
  24. package/template/agora-rn-uikit/src/Controls/Local/SwitchCamera.tsx +7 -6
  25. package/template/agora-rn-uikit/src/Controls/LocalControls.tsx +5 -5
  26. package/template/agora-rn-uikit/src/Controls/Remote/RemoteAudioMute.tsx +5 -4
  27. package/template/agora-rn-uikit/src/Controls/Remote/RemoteSwap.tsx +3 -1
  28. package/template/agora-rn-uikit/src/Controls/Remote/RemoteVideoMute.tsx +5 -4
  29. package/template/agora-rn-uikit/src/Controls/RemoteControls.tsx +2 -2
  30. package/template/agora-rn-uikit/src/Reducer/ActiveSpeaker.ts +30 -0
  31. package/template/agora-rn-uikit/src/Reducer/LocalMuteAudio.ts +8 -7
  32. package/template/agora-rn-uikit/src/Reducer/LocalMuteVideo.ts +8 -7
  33. package/template/agora-rn-uikit/src/Reducer/LocalPermissionState.ts +6 -7
  34. package/template/agora-rn-uikit/src/Reducer/RemoteAudioStateChanged.ts +7 -8
  35. package/template/agora-rn-uikit/src/Reducer/RemoteVideoStateChanged.ts +9 -9
  36. package/template/agora-rn-uikit/src/Reducer/UpdateDualStreamMode.ts +7 -8
  37. package/template/agora-rn-uikit/src/Reducer/UserJoined.ts +14 -13
  38. package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteAudio.ts +6 -7
  39. package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteVideo.ts +6 -7
  40. package/template/agora-rn-uikit/src/Reducer/UserOffline.ts +5 -6
  41. package/template/agora-rn-uikit/src/Reducer/UserPin.ts +20 -3
  42. package/template/agora-rn-uikit/src/Reducer/UserSecondaryPin.ts +23 -0
  43. package/template/agora-rn-uikit/src/Reducer/index.ts +2 -1
  44. package/template/agora-rn-uikit/src/Rtc/Create.tsx +138 -100
  45. package/template/agora-rn-uikit/src/Rtc/Join.tsx +55 -28
  46. package/template/agora-rn-uikit/src/RtcConfigure.tsx +177 -77
  47. package/template/agora-rn-uikit/src/Utils/isBotUser.ts +15 -0
  48. package/template/agora-rn-uikit/src/Utils/quality.tsx +8 -0
  49. package/template/agora-rn-uikit/src/Views/MaxVideoView.native.tsx +56 -12
  50. package/template/agora-rn-uikit/src/Views/MaxVideoView.tsx +47 -17
  51. package/template/agora-rn-uikit/src/Views/MinVideoView.tsx +19 -11
  52. package/template/agora-rn-uikit/src/index.ts +15 -9
  53. package/template/android/app/build.gradle +59 -156
  54. package/template/android/app/src/debug/AndroidManifest.xml +6 -1
  55. package/template/android/app/src/debug/java/com/helloworld/ReactNativeFlipper.java +7 -4
  56. package/template/android/app/src/main/AndroidManifest.xml +6 -19
  57. package/template/android/app/src/main/assets/fonts/icomoon.ttf +0 -0
  58. package/template/android/app/src/main/java/com/helloworld/MainActivity.java +17 -0
  59. package/template/android/app/src/main/java/com/helloworld/MainApplication.java +22 -36
  60. package/template/android/app/src/main/java/com/helloworld/SSLPinningFactory.java +30 -0
  61. package/template/android/app/src/main/res/values/strings.xml +3 -0
  62. package/template/android/app/src/release/java/com/helloworld/ReactNativeFlipper.java +20 -0
  63. package/template/android/build.gradle +19 -33
  64. package/template/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  65. package/template/android/gradle/wrapper/gradle-wrapper.properties +3 -2
  66. package/template/android/gradle.properties +18 -4
  67. package/template/android/gradlew +165 -104
  68. package/template/android/gradlew.bat +12 -23
  69. package/template/android/settings.gradle +1 -0
  70. package/template/bridge/rtc/webNg/RtcEngine.ts +200 -70
  71. package/template/bridge/rtc/webNg/{SurfaceView.tsx → RtcSurfaceView.tsx} +20 -26
  72. package/template/bridge/rtc/webNg/Types.ts +20 -5
  73. package/template/bridge/rtc/webNg/index.ts +81 -14
  74. package/template/bridge/rtm/web/index.ts +5 -3
  75. package/template/configTransform.js +16 -1
  76. package/template/customization-api/action-library.ts +4 -16
  77. package/template/customization-api/app-state.ts +15 -8
  78. package/template/customization-api/customEvents.ts +7 -2
  79. package/template/customization-api/customize.ts +1 -1
  80. package/template/customization-api/index.ts +4 -0
  81. package/template/customization-api/sub-components.ts +17 -16
  82. package/template/customization-api/temp.ts +52 -0
  83. package/template/customization-api/typeDefinition.ts +34 -46
  84. package/template/customization-api/types.ts +26 -0
  85. package/template/customization-api/utils.ts +4 -0
  86. package/template/customization-implementation/createHook.ts +24 -6
  87. package/template/customization-implementation/index.ts +1 -2
  88. package/template/customization-implementation/useCustomization.tsx +5 -7
  89. package/template/defaultConfig.js +72 -0
  90. package/template/global.d.ts +14 -1
  91. package/template/index.js +1 -4
  92. package/template/index.web.js +0 -5
  93. package/template/index.wsdk.tsx +1 -12
  94. package/template/ios/.xcode.env +11 -0
  95. package/template/ios/HelloWorld/AppDelegate.h +2 -4
  96. package/template/ios/HelloWorld/AppDelegate.mm +64 -0
  97. package/template/ios/HelloWorld/HelloWorldDebug.entitlements +10 -0
  98. package/template/ios/HelloWorld/Info.plist +8 -2
  99. package/template/ios/HelloWorld/main.m +2 -1
  100. package/template/ios/HelloWorld.xcodeproj/project.pbxproj +533 -17
  101. package/template/ios/HelloWorld.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  102. package/template/ios/HelloWorld.xcworkspace/contents.xcworkspacedata +10 -0
  103. package/template/ios/HelloWorld.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  104. package/template/ios/HelloWorldTests/HelloWorldTests.m +14 -13
  105. package/template/ios/HelloWorldTests/Info.plist +2 -2
  106. package/template/ios/Podfile +54 -20
  107. package/template/ios/Podfile.lock +809 -0
  108. package/template/ios/ScreenSharing/Info.plist +15 -0
  109. package/template/ios/ScreenSharing/SampleHandler.h +9 -0
  110. package/template/ios/ScreenSharing/SampleHandler.m +70 -0
  111. package/template/jest.config.js +4 -0
  112. package/template/metro.config.js +7 -32
  113. package/template/package.json +53 -39
  114. package/template/react-native-toast-message/index.d.ts +3 -1
  115. package/template/react-native-toast-message/index.js +1 -0
  116. package/template/react-native-toast-message/src/components/base/index.js +20 -32
  117. package/template/react-native-toast-message/src/components/base/styles.js +18 -21
  118. package/template/react-native-toast-message/src/components/checkbox.js +24 -19
  119. package/template/react-native-toast-message/src/index.js +3 -1
  120. package/template/react-native-toast-message/src/index.sdk.tsx +4 -1
  121. package/template/src/App.tsx +53 -69
  122. package/template/src/AppRoutes.tsx +90 -0
  123. package/template/src/AppWrapper.tsx +42 -25
  124. package/template/src/SDKAppWrapper.tsx +89 -57
  125. package/template/src/app-state/useLocalUserInfo.ts +3 -3
  126. package/template/src/app-state/useNoiseSupression.native.tsx +67 -0
  127. package/template/src/app-state/useNoiseSupression.tsx +107 -0
  128. package/template/src/app-state/useVideoQuality.tsx +39 -0
  129. package/template/src/assets/font-styles.css +175 -3
  130. package/template/src/assets/fonts/icomoon.ttf +0 -0
  131. package/template/src/assets/selection.json +1 -1
  132. package/template/src/atoms/ActionMenu.tsx +50 -11
  133. package/template/src/atoms/Avatar.tsx +51 -0
  134. package/template/src/atoms/Card.tsx +21 -8
  135. package/template/src/atoms/Carousel.native.tsx +105 -0
  136. package/template/src/atoms/Carousel.tsx +103 -0
  137. package/template/src/atoms/Checkbox.tsx +98 -0
  138. package/template/src/atoms/CircularProgress.tsx +0 -1
  139. package/template/src/atoms/ClipboardIconButton.tsx +91 -0
  140. package/template/src/atoms/CustomIcon.tsx +46 -0
  141. package/template/src/atoms/DropDownMulti.tsx +349 -0
  142. package/template/src/atoms/Dropdown.tsx +3 -3
  143. package/template/src/atoms/IconButton.tsx +52 -9
  144. package/template/src/atoms/ImageIcon.tsx +18 -5
  145. package/template/src/atoms/InlineNotification.tsx +81 -0
  146. package/template/src/atoms/InviteInfo.tsx +4 -4
  147. package/template/src/atoms/MeetingLink.tsx +160 -0
  148. package/template/src/atoms/ParticipantsCount.tsx +20 -8
  149. package/template/src/atoms/Popup.tsx +49 -27
  150. package/template/src/atoms/PrimaryButton.tsx +19 -5
  151. package/template/src/atoms/RecordingInfo.tsx +8 -5
  152. package/template/src/atoms/SecondaryButton.tsx +2 -0
  153. package/template/src/atoms/Spacer.tsx +1 -0
  154. package/template/src/atoms/TertiaryButton.tsx +35 -5
  155. package/template/src/atoms/TextInput.tsx +2 -1
  156. package/template/src/atoms/Toolbar.tsx +102 -0
  157. package/template/src/atoms/ToolbarItem.tsx +85 -0
  158. package/template/src/atoms/ToolbarMenu.tsx +40 -0
  159. package/template/src/atoms/ToolbarMenuItem.tsx +104 -0
  160. package/template/src/atoms/ToolbarPreset.tsx +71 -0
  161. package/template/src/atoms/Tooltip.tsx +30 -13
  162. package/template/src/atoms/pagination/Pagination.tsx +127 -0
  163. package/template/src/atoms/pagination/usePagination.tsx +88 -0
  164. package/template/src/auth/AuthProvider.tsx +500 -0
  165. package/template/src/auth/AuthRoute.tsx +94 -0
  166. package/template/src/auth/IDPAuth.electron.tsx +31 -0
  167. package/template/src/auth/IDPAuth.tsx +67 -0
  168. package/template/src/auth/IDPLogoutComponent.tsx +158 -0
  169. package/template/src/auth/UserCancelPopup.tsx +115 -0
  170. package/template/src/auth/config.ts +52 -0
  171. package/template/src/auth/openIDPURL.electron.tsx +39 -0
  172. package/template/src/auth/openIDPURL.native.tsx +51 -0
  173. package/template/src/auth/openIDPURL.tsx +20 -0
  174. package/template/src/auth/useIDPAuth.electron.tsx +65 -0
  175. package/template/src/auth/useIDPAuth.native.tsx +70 -0
  176. package/template/src/auth/useIDPAuth.tsx +63 -0
  177. package/template/src/auth/useTokenAuth.tsx +194 -0
  178. package/template/src/components/Chat.tsx +92 -72
  179. package/template/src/components/ChatContext.ts +2 -0
  180. package/template/src/components/ColorConfigure.tsx +0 -1
  181. package/template/src/components/CommonStyles.ts +9 -2
  182. package/template/src/components/Controls.tsx +914 -182
  183. package/template/src/components/Controls1.native.tsx +9 -5
  184. package/template/src/components/DeviceConfigure.native.tsx +2 -2
  185. package/template/src/components/DeviceConfigure.tsx +400 -149
  186. package/template/src/components/DeviceContext.tsx +2 -0
  187. package/template/src/components/EventsConfigure.tsx +722 -82
  188. package/template/src/components/GraphQLProvider.tsx +82 -39
  189. package/template/src/components/GridVideo.tsx +30 -16
  190. package/template/src/components/HostControlView.tsx +11 -14
  191. package/template/src/components/JoinPhrase.tsx +0 -1
  192. package/template/src/components/Leftbar.tsx +110 -0
  193. package/template/src/components/Navbar.tsx +305 -147
  194. package/template/src/components/NavbarMobile.tsx +119 -0
  195. package/template/src/components/Navigation.native.tsx +1 -15
  196. package/template/src/components/{Settings.native.tsx → Navigation.sdk.tsx} +17 -6
  197. package/template/src/components/NetworkQualityContext.tsx +12 -6
  198. package/template/src/components/ParticipantsView.tsx +63 -56
  199. package/template/src/components/PinnedVideo.tsx +191 -119
  200. package/template/src/components/Precall.native.tsx +177 -72
  201. package/template/src/components/Precall.tsx +247 -78
  202. package/template/src/components/RTMConfigure.tsx +205 -67
  203. package/template/src/components/Rightbar.tsx +112 -0
  204. package/template/src/components/Router.electron.ts +1 -0
  205. package/template/src/components/Router.native.ts +1 -0
  206. package/template/src/components/Router.sdk.ts +1 -0
  207. package/template/src/components/Router.ts +1 -0
  208. package/template/src/components/SdkApiContext.tsx +313 -0
  209. package/template/src/components/SdkMuteToggleListener.tsx +88 -0
  210. package/template/src/components/SessionContext.tsx +0 -1
  211. package/template/src/components/Settings.tsx +33 -4
  212. package/template/src/components/SettingsView.tsx +44 -9
  213. package/template/src/components/Share.tsx +152 -74
  214. package/template/src/components/StorageContext.tsx +23 -6
  215. package/template/src/components/ToastComponent.tsx +10 -1
  216. package/template/src/components/WhiteboardLayout.tsx +291 -0
  217. package/template/src/components/chat-messages/useChatMessages.tsx +454 -239
  218. package/template/src/components/chat-ui/{useChatUIControl.tsx → useChatUIControls.tsx} +29 -29
  219. package/template/src/components/common/Error.tsx +2 -0
  220. package/template/src/components/common/Logo.tsx +2 -2
  221. package/template/src/components/contexts/LiveStreamDataContext.tsx +13 -12
  222. package/template/src/components/contexts/ScreenShareContext.tsx +15 -1
  223. package/template/src/components/contexts/VideoMeetingDataContext.tsx +6 -6
  224. package/template/src/components/contexts/WaitingRoomContext.tsx +50 -0
  225. package/template/src/components/contexts/WhiteboardContext.tsx +54 -54
  226. package/template/src/components/disable-chat/useDisableChat.tsx +32 -0
  227. package/template/src/components/livestream/LiveStreamContext.tsx +314 -220
  228. package/template/src/components/livestream/Types.ts +36 -20
  229. package/template/src/components/livestream/views/LiveStreamAttendeeLandingTile.tsx +295 -0
  230. package/template/src/components/livestream/views/LiveStreamControls.tsx +5 -10
  231. package/template/src/components/meeting-info-invite/MeetingInfo.tsx +82 -0
  232. package/template/src/components/meeting-info-invite/MeetingInfoCardHeader.tsx +86 -0
  233. package/template/src/components/meeting-info-invite/MeetingInfoGridTile.tsx +218 -0
  234. package/template/src/components/meeting-info-invite/MeetingInfoLinks.tsx +122 -0
  235. package/template/src/components/participants/AllAudienceParticipants.tsx +19 -20
  236. package/template/src/components/participants/AllHostParticipants.tsx +20 -19
  237. package/template/src/components/participants/Participant.tsx +45 -16
  238. package/template/src/components/participants/ParticipantSectionTitle.tsx +5 -2
  239. package/template/src/components/participants/ScreenshareParticipants.tsx +17 -19
  240. package/template/src/components/participants/UserActionMenuOptions.tsx +173 -62
  241. package/template/src/components/participants/WaitingRoomParticipants.tsx +74 -0
  242. package/template/src/components/popups/InvitePopup.tsx +110 -45
  243. package/template/src/components/popups/StartScreenSharePopup.native.tsx +182 -0
  244. package/template/src/components/popups/StartScreenSharePopup.tsx +6 -0
  245. package/template/src/components/popups/StopRecordingPopup.tsx +11 -5
  246. package/template/src/components/popups/StopScreenSharePopup.native.tsx +135 -0
  247. package/template/src/components/popups/StopScreenSharePopup.tsx +6 -0
  248. package/template/src/components/popups/WhiteboardClearAllPopup.tsx +123 -0
  249. package/template/src/components/precall/LocalMute.tsx +69 -45
  250. package/template/src/components/precall/PermissionHelper.tsx +56 -28
  251. package/template/src/components/precall/PreCallSettings.tsx +1 -0
  252. package/template/src/components/precall/VideoFallback.tsx +173 -0
  253. package/template/src/components/precall/VideoPreview.native.tsx +19 -53
  254. package/template/src/components/precall/VideoPreview.tsx +29 -164
  255. package/template/src/components/precall/index.tsx +2 -0
  256. package/template/src/components/precall/joinCallBtn.native.tsx +12 -5
  257. package/template/src/components/precall/joinCallBtn.tsx +13 -4
  258. package/template/src/components/precall/joinWaitingRoomBtn.native.tsx +210 -0
  259. package/template/src/components/precall/joinWaitingRoomBtn.tsx +250 -0
  260. package/template/src/components/precall/meetingTitle.tsx +37 -11
  261. package/template/src/components/precall/selectDevice.tsx +5 -5
  262. package/template/src/components/precall/textInput.tsx +17 -19
  263. package/template/src/components/precall/usePreCall.tsx +33 -1
  264. package/template/src/components/recording-bot/RecordingBotRoute.tsx +42 -0
  265. package/template/src/components/recordings/RecordingsDateTable.tsx +62 -0
  266. package/template/src/components/recordings/RecordingsModal.tsx +135 -0
  267. package/template/src/components/recordings/ViewRecordingsModal.tsx +51 -0
  268. package/template/src/components/recordings/recording-table.tsx +154 -0
  269. package/template/src/components/recordings/style.ts +183 -0
  270. package/template/src/components/recordings/utils.ts +80 -0
  271. package/template/src/components/room-info/useRoomInfo.tsx +128 -0
  272. package/template/src/components/{meeting-info/useSetMeetingInfo.tsx → room-info/useSetRoomInfo.tsx} +12 -12
  273. package/template/src/components/useShareLink.tsx +28 -63
  274. package/template/src/components/useUserPreference.tsx +82 -16
  275. package/template/src/components/useVideoCall.tsx +93 -1
  276. package/template/src/components/virtual-background/VBButton.tsx +64 -0
  277. package/template/src/components/virtual-background/VBCard.native.tsx +282 -0
  278. package/template/src/components/virtual-background/VBCard.tsx +272 -0
  279. package/template/src/components/virtual-background/VBPanel.tsx +279 -0
  280. package/template/src/components/virtual-background/VButils.native.ts +37 -0
  281. package/template/src/components/virtual-background/VButils.ts +104 -0
  282. package/template/src/components/virtual-background/VideoPreview.native.tsx +43 -0
  283. package/template/src/components/virtual-background/VideoPreview.tsx +106 -0
  284. package/template/src/components/virtual-background/imagePaths.ts +87 -0
  285. package/template/src/components/virtual-background/images/beachImageBase64.ts +1 -0
  286. package/template/src/components/virtual-background/images/bedroomImageBase64.ts +1 -0
  287. package/template/src/components/virtual-background/images/bookImageBase64.ts +1 -0
  288. package/template/src/components/virtual-background/images/earthImageBase64.ts +1 -0
  289. package/template/src/components/virtual-background/images/index.ts +37 -0
  290. package/template/src/components/virtual-background/images/lampImageBase64.ts +1 -0
  291. package/template/src/components/virtual-background/images/mountainsImageBase64.ts +1 -0
  292. package/template/src/components/virtual-background/images/office1ImageBase64.ts +1 -0
  293. package/template/src/components/virtual-background/images/officeImageBase64.ts +1 -0
  294. package/template/src/components/virtual-background/images/plantsImageBase64.ts +1 -0
  295. package/template/src/components/virtual-background/images/skyImageBase64.ts +1 -0
  296. package/template/src/components/virtual-background/images/wallImageBase64.ts +1 -0
  297. package/template/src/components/virtual-background/useVB.native.tsx +185 -0
  298. package/template/src/components/virtual-background/useVB.tsx +267 -0
  299. package/template/src/components/whiteboard/StrokeWidthTool.tsx +137 -0
  300. package/template/src/components/whiteboard/WhiteboardButton.tsx +93 -0
  301. package/template/src/components/whiteboard/WhiteboardCanvas.tsx +99 -0
  302. package/template/src/components/whiteboard/WhiteboardConfigure.native.tsx +148 -0
  303. package/template/src/components/whiteboard/WhiteboardConfigure.tsx +446 -0
  304. package/template/src/components/whiteboard/WhiteboardCursor.tsx +152 -0
  305. package/template/src/components/whiteboard/WhiteboardToolBox.tsx +1246 -0
  306. package/template/src/components/whiteboard/WhiteboardView.native.tsx +188 -0
  307. package/template/src/components/whiteboard/WhiteboardView.tsx +81 -0
  308. package/template/src/components/whiteboard/WhiteboardWidget.tsx +685 -0
  309. package/template/src/components/whiteboard/WhiteboardWrapper.tsx +38 -0
  310. package/template/src/language/default-labels/commonLabels.ts +51 -14
  311. package/template/src/language/default-labels/createScreenLabels.ts +97 -17
  312. package/template/src/language/default-labels/joinScreenLabels.ts +45 -6
  313. package/template/src/language/default-labels/precallScreenLabels.ts +149 -25
  314. package/template/src/language/default-labels/shareLinkScreenLabels.ts +85 -37
  315. package/template/src/language/default-labels/videoCallScreenLabels.ts +1195 -158
  316. package/template/src/pages/Create.tsx +136 -106
  317. package/template/src/pages/Endcall.tsx +2 -2
  318. package/template/src/pages/Join.tsx +82 -40
  319. package/template/src/pages/Login.tsx +26 -0
  320. package/template/src/pages/VideoCall.tsx +329 -127
  321. package/template/src/pages/video-call/ActionSheet.native.tsx +54 -6
  322. package/template/src/pages/video-call/ActionSheet.tsx +55 -15
  323. package/template/src/pages/video-call/ActionSheetContent.tsx +498 -308
  324. package/template/src/pages/video-call/ActionSheetHandle.tsx +7 -1
  325. package/template/src/pages/video-call/DefaultLayouts.ts +20 -8
  326. package/template/src/pages/video-call/NameWithMicIcon.tsx +41 -64
  327. package/template/src/pages/video-call/PinchableView.tsx +119 -0
  328. package/template/src/pages/video-call/RenderComponent.tsx +14 -30
  329. package/template/src/pages/video-call/SidePanelHeader.tsx +227 -29
  330. package/template/src/pages/video-call/VideoCallMobileView.tsx +231 -89
  331. package/template/src/pages/video-call/VideoCallScreen.native.tsx +3 -2
  332. package/template/src/pages/video-call/VideoCallScreen.tsx +233 -84
  333. package/template/src/pages/video-call/VideoCallScreenWrapper.tsx +41 -0
  334. package/template/src/pages/video-call/VideoComponent.tsx +60 -8
  335. package/template/src/pages/video-call/VideoRenderer.tsx +343 -57
  336. package/template/src/pages/video-call/VisibilitySensor.tsx +104 -0
  337. package/template/src/pages/video-call/ZoomableWrapper.native.tsx +34 -0
  338. package/template/src/pages/video-call/ZoomableWrapper.tsx +5 -0
  339. package/template/src/pages/video-call/index.ts +42 -8
  340. package/template/src/rtm/RTMEngine.ts +17 -4
  341. package/template/src/rtm-events/constants.ts +21 -3
  342. package/template/src/rtm-events-api/Events.ts +7 -4
  343. package/template/src/rtm-events-api/LocalEvents.ts +14 -0
  344. package/template/src/rtm-events-api/types.ts +5 -5
  345. package/template/src/selection.json +1 -0
  346. package/template/src/subComponents/ChatBubble.tsx +87 -67
  347. package/template/src/subComponents/ChatContainer.tsx +70 -49
  348. package/template/src/subComponents/ChatInput.ios.tsx +32 -85
  349. package/template/src/subComponents/ChatInput.tsx +31 -80
  350. package/template/src/subComponents/Checkbox.native.tsx +46 -46
  351. package/template/src/subComponents/Checkbox.tsx +7 -6
  352. package/template/src/subComponents/CopyJoinInfo.tsx +31 -11
  353. package/template/src/subComponents/EndcallPopup.tsx +83 -12
  354. package/template/src/subComponents/FallbackLogo.tsx +2 -2
  355. package/template/src/subComponents/LanguageSelector.tsx +34 -30
  356. package/template/src/subComponents/LayoutIconButton.tsx +34 -17
  357. package/template/src/subComponents/LayoutIconDropdown.tsx +21 -8
  358. package/template/src/subComponents/Loading.tsx +60 -0
  359. package/template/src/subComponents/LocalAudioMute.tsx +87 -34
  360. package/template/src/subComponents/LocalEndCall.tsx +61 -24
  361. package/template/src/subComponents/LocalSwitchCamera.tsx +57 -13
  362. package/template/src/subComponents/LocalVideoMute.tsx +105 -36
  363. package/template/src/subComponents/LogoutButton.tsx +1 -1
  364. package/template/src/subComponents/NetworkQualityPill.tsx +22 -38
  365. package/template/src/subComponents/Recording.tsx +29 -9
  366. package/template/src/subComponents/RemoteAudioMute.tsx +5 -5
  367. package/template/src/subComponents/RemoteMutePopup.tsx +55 -14
  368. package/template/src/subComponents/RemoteVideoMute.tsx +5 -5
  369. package/template/src/subComponents/RemoveMeetingPopup.tsx +19 -6
  370. package/template/src/subComponents/RemoveScreensharePopup.tsx +20 -5
  371. package/template/src/subComponents/ScreenShareNotice.tsx +11 -6
  372. package/template/src/subComponents/SelectDevice.tsx +103 -34
  373. package/template/src/subComponents/SelectDeviceSettings.backup.tsx +9 -6
  374. package/template/src/subComponents/SidePanelButtons.ts +0 -3
  375. package/template/src/subComponents/SidePanelEnum.tsx +2 -0
  376. package/template/src/subComponents/SidePanelHeader.tsx +97 -63
  377. package/template/src/subComponents/ToastConfig.tsx +70 -61
  378. package/template/src/subComponents/caption/Caption.tsx +132 -0
  379. package/template/src/subComponents/caption/CaptionContainer.tsx +302 -0
  380. package/template/src/subComponents/caption/CaptionIcon.tsx +111 -0
  381. package/template/src/subComponents/caption/CaptionText.tsx +182 -0
  382. package/template/src/subComponents/caption/DownloadTranscriptBtn.tsx +65 -0
  383. package/template/src/subComponents/caption/LanguageSelectorPopup.tsx +192 -0
  384. package/template/src/subComponents/caption/Transcript.tsx +452 -0
  385. package/template/src/subComponents/caption/TranscriptIcon.tsx +123 -0
  386. package/template/src/subComponents/caption/TranscriptText.tsx +98 -0
  387. package/template/src/subComponents/caption/index.ts +3 -0
  388. package/template/src/subComponents/caption/proto/ptoto.js +91 -0
  389. package/template/src/subComponents/caption/proto/test.proto +23 -0
  390. package/template/src/subComponents/caption/useCaption.tsx +123 -0
  391. package/template/src/subComponents/caption/useCaptionWidth.ts +27 -0
  392. package/template/src/subComponents/caption/useSTTAPI.tsx +179 -0
  393. package/template/src/subComponents/caption/useStreamMessageUtils.native.ts +211 -0
  394. package/template/src/subComponents/caption/useStreamMessageUtils.ts +235 -0
  395. package/template/src/subComponents/caption/useTranscriptDownload.native.ts +63 -0
  396. package/template/src/subComponents/caption/useTranscriptDownload.ts +52 -0
  397. package/template/src/subComponents/caption/utils.ts +126 -0
  398. package/template/src/subComponents/chat/ChatParticipants.tsx +60 -24
  399. package/template/src/subComponents/livestream/ApprovedLiveStreamControlsView.tsx +2 -2
  400. package/template/src/subComponents/livestream/CurrentLiveStreamRequestsView.tsx +19 -20
  401. package/template/src/subComponents/livestream/controls/LocalRaiseHand.tsx +66 -35
  402. package/template/src/subComponents/livestream/controls/RemoteLiveStreamApprovedRequestRecall.tsx +3 -2
  403. package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestApprove.tsx +10 -6
  404. package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestReject.tsx +28 -19
  405. package/template/src/subComponents/recording/useIsRecordingBot.tsx +38 -0
  406. package/template/src/subComponents/recording/useRecording.tsx +251 -138
  407. package/template/src/subComponents/recording/useRecordingLayoutQuery.tsx +0 -1
  408. package/template/src/subComponents/screenshare/ScreenshareButton.tsx +39 -15
  409. package/template/src/subComponents/screenshare/ScreenshareConfigure.native.tsx +275 -69
  410. package/template/src/subComponents/screenshare/ScreenshareConfigure.tsx +193 -124
  411. package/template/src/subComponents/screenshare/useScreenshare.tsx +2 -0
  412. package/template/src/subComponents/waiting-rooms/WaitingRoomControls.tsx +85 -0
  413. package/template/src/subComponents/waiting-rooms/useWaitingRoomAPI.ts +75 -0
  414. package/template/src/theme/index.ts +13 -0
  415. package/template/src/utils/SdkEvents.ts +37 -14
  416. package/template/src/utils/SdkMethodEvents.ts +101 -0
  417. package/template/src/utils/axiomLogger.ts +117 -0
  418. package/template/src/utils/book.jpg +0 -0
  419. package/template/src/utils/common.tsx +118 -6
  420. package/template/src/utils/constants.ts +4 -0
  421. package/template/src/utils/getCustomRoute.ts +7 -0
  422. package/template/src/utils/index.tsx +34 -0
  423. package/template/src/utils/useActionSheet.tsx +50 -0
  424. package/template/src/utils/useActiveSpeaker.ts +38 -0
  425. package/template/src/utils/useAppState.ts +17 -0
  426. package/template/src/utils/useAsyncEffect.ts +138 -0
  427. package/template/src/utils/{useCreateMeeting.ts → useCreateRoom.ts} +27 -26
  428. package/template/src/utils/useEndCall.ts +65 -0
  429. package/template/src/utils/useFindActiveSpeaker.native.ts +4 -0
  430. package/template/src/utils/useFindActiveSpeaker.ts +335 -0
  431. package/template/src/utils/useGetMeetingPhrase.ts +10 -10
  432. package/template/src/utils/useIsAudioEnabled.ts +3 -3
  433. package/template/src/utils/useIsLocalUserSpeaking.native.ts +4 -0
  434. package/template/src/utils/useIsLocalUserSpeaking.ts +103 -0
  435. package/template/src/utils/useIsPSTN.ts +3 -3
  436. package/template/src/utils/useIsVideoEnabled.ts +3 -3
  437. package/template/src/utils/useJoinRoom.ts +199 -0
  438. package/template/src/utils/{useIsActiveSpeaker.ts → useLocalAudio.ts} +23 -12
  439. package/template/src/{components/OAuth.tsx → utils/useMenu.tsx} +16 -15
  440. package/template/src/utils/useModal.tsx +8 -0
  441. package/template/src/utils/useMutePSTN.ts +2 -2
  442. package/template/src/utils/useMuteToggleLocal.ts +121 -96
  443. package/template/src/utils/useRemoteEndCall.ts +4 -4
  444. package/template/src/utils/useRemoteEndScreenshare.ts +4 -4
  445. package/template/src/utils/useRemoteMute.ts +7 -7
  446. package/template/src/utils/useRemoteRequest.ts +7 -7
  447. package/template/src/utils/useSearchParams.tsx +18 -0
  448. package/template/src/utils/useString.ts +13 -3
  449. package/template/src/utils/useSwitchCamera.native.tsx +25 -0
  450. package/template/src/{subComponents/screenshare/ScreenshareButton.native.tsx → utils/useSwitchCamera.tsx} +12 -11
  451. package/template/src/utils/useToolbar.tsx +59 -0
  452. package/template/src/wasms/agora-virtual-background.wasm +0 -0
  453. package/template/static.d.ts +42 -0
  454. package/template/tsconfig_rsdk_index.json +3 -3
  455. package/template/tsconfig_wsdk_index.json +1 -1
  456. package/template/web/index.html +20 -0
  457. package/template/webpack.commons.js +21 -10
  458. package/template/webpack.rsdk.config.js +1 -2
  459. package/template/webpack.web.config.js +7 -3
  460. package/template/_buckconfig +0 -6
  461. package/template/_gitattributes +0 -1
  462. package/template/agora-rn-uikit/src/Contexts/RenderContext.tsx +0 -10
  463. package/template/agora-rn-uikit/src/Reducer/ActiveSpeakerDetected.ts +0 -11
  464. package/template/android/app/_BUCK +0 -55
  465. package/template/android/app/build_defs.bzl +0 -19
  466. package/template/bridge/rtc/webNg/LocalView.tsx +0 -20
  467. package/template/ios/HelloWorld/AppDelegate.m +0 -74
  468. package/template/src/components/OAuth.electron.tsx +0 -41
  469. package/template/src/components/OAuth.native.tsx +0 -55
  470. package/template/src/components/OAuthConfig.ts +0 -77
  471. package/template/src/components/StoreToken.tsx +0 -39
  472. package/template/src/components/meeting-info/useMeetingInfo.tsx +0 -70
  473. package/template/src/pages/video-call/CustomUserContextHolder.tsx +0 -20
  474. package/template/src/utils/useButtonTemplate.tsx +0 -44
  475. package/template/src/utils/useJoinMeeting.ts +0 -132
@@ -9,45 +9,47 @@
9
9
  information visit https://appbuilder.agora.io.
10
10
  *********************************************
11
11
  */
12
- import React, {useState, useContext, useEffect, useRef} from 'react';
13
- import {View, StyleSheet, Text, useWindowDimensions} from 'react-native';
14
- import {PropsContext} from '../../agora-rn-uikit';
15
- import LocalAudioMute, {
16
- LocalAudioMuteProps,
17
- } from '../subComponents/LocalAudioMute';
18
- import LocalVideoMute, {
19
- LocalVideoMuteProps,
20
- } from '../subComponents/LocalVideoMute';
21
- import Recording, {RecordingButtonProps} from '../subComponents/Recording';
22
- import LocalSwitchCamera, {
23
- LocalSwitchCameraProps,
24
- } from '../subComponents/LocalSwitchCamera';
25
- import ScreenshareButton, {
26
- ScreenshareButtonProps,
27
- } from '../subComponents/screenshare/ScreenshareButton';
12
+ import React, {
13
+ useState,
14
+ useContext,
15
+ useEffect,
16
+ useRef,
17
+ useReducer,
18
+ } from 'react';
19
+ import {View, StyleSheet, useWindowDimensions} from 'react-native';
20
+ import {
21
+ DispatchContext,
22
+ PropsContext,
23
+ ToggleState,
24
+ useLocalUid,
25
+ } from '../../agora-rn-uikit';
26
+ import LocalAudioMute from '../subComponents/LocalAudioMute';
27
+ import LocalVideoMute from '../subComponents/LocalVideoMute';
28
+ import Recording from '../subComponents/Recording';
29
+ import LocalSwitchCamera from '../subComponents/LocalSwitchCamera';
30
+ import ScreenshareButton from '../subComponents/screenshare/ScreenshareButton';
28
31
  import isMobileOrTablet from '../utils/isMobileOrTablet';
29
- import {ClientRole} from '../../agora-rn-uikit';
30
- import LiveStreamControls, {
31
- LiveStreamControlsProps,
32
- } from './livestream/views/LiveStreamControls';
32
+ import {ClientRoleType} from '../../agora-rn-uikit';
33
+ import LiveStreamControls from './livestream/views/LiveStreamControls';
33
34
  import {
34
35
  BREAKPOINTS,
35
- calculatePosition,
36
+ CustomToolbarSort,
37
+ isWeb,
36
38
  isWebInternal,
37
39
  useIsDesktop,
38
40
  } from '../utils/common';
39
- import {useMeetingInfo} from './meeting-info/useMeetingInfo';
40
- import LocalEndcall, {LocalEndcallProps} from '../subComponents/LocalEndCall';
41
- import Spacer from '../atoms/Spacer';
41
+ import {RoomInfoContextInterface, useRoomInfo} from './room-info/useRoomInfo';
42
+ import LocalEndcall from '../subComponents/LocalEndCall';
42
43
  import LayoutIconButton from '../subComponents/LayoutIconButton';
43
44
  import CopyJoinInfo from '../subComponents/CopyJoinInfo';
44
- import hexadecimalTransparency from '../utils/hexadecimalTransparency';
45
45
  import IconButton from '../atoms/IconButton';
46
46
  import ActionMenu, {ActionMenuItem} from '../atoms/ActionMenu';
47
47
  import useLayoutsData from '../pages/video-call/useLayoutsData';
48
48
  import {
49
+ ChatType,
49
50
  SidePanelType,
50
- useChatUIControl,
51
+ useChatUIControls,
52
+ useContent,
51
53
  useLayout,
52
54
  useRecording,
53
55
  useSidePanel,
@@ -55,39 +57,479 @@ import {
55
57
  import {useVideoCall} from './useVideoCall';
56
58
  import {useScreenshare} from '../subComponents/screenshare/useScreenshare';
57
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';
69
+ import Toolbar from '../atoms/Toolbar';
70
+ import ToolbarItem from '../atoms/ToolbarItem';
71
+ import {ToolbarCustomItem} from '../atoms/ToolbarPreset';
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
+ toolbarItemViewRecordingText,
97
+ toolbarItemSettingText,
98
+ toolbarItemShareText,
99
+ toolbarItemTranscriptText,
100
+ toolbarItemVirtualBackgroundText,
101
+ toolbarItemWhiteboardText,
102
+ } from '../language/default-labels/videoCallScreenLabels';
103
+ import {useModal} from '../utils/useModal';
104
+ import ViewRecordingsModal from './recordings/ViewRecordingsModal';
105
+
106
+ export const useToggleWhiteboard = () => {
107
+ const {
108
+ whiteboardActive,
109
+ joinWhiteboardRoom,
110
+ leaveWhiteboardRoom,
111
+ getWhiteboardUid,
112
+ } = useContext(whiteboardContext);
113
+ const {setCustomContent} = useContent();
114
+ const {setLayout} = useLayout();
115
+ const {dispatch} = useContext(DispatchContext);
116
+ return () => {
117
+ if ($config.ENABLE_WHITEBOARD) {
118
+ if (whiteboardActive) {
119
+ leaveWhiteboardRoom();
120
+ setCustomContent(getWhiteboardUid(), false);
121
+ setLayout('grid');
122
+ events.send(
123
+ EventNames.WHITEBOARD_ACTIVE,
124
+ JSON.stringify({status: false}),
125
+ PersistanceLevel.Session,
126
+ );
127
+ } else {
128
+ joinWhiteboardRoom();
129
+ setCustomContent(getWhiteboardUid(), WhiteboardWrapper, {}, true);
130
+ dispatch({
131
+ type: 'UserPin',
132
+ value: [getWhiteboardUid()],
133
+ });
134
+ setLayout('pinned');
135
+ events.send(
136
+ EventNames.WHITEBOARD_ACTIVE,
137
+ JSON.stringify({status: true}),
138
+ PersistanceLevel.Session,
139
+ );
140
+ }
141
+ }
142
+ };
143
+ };
144
+
145
+ export const WhiteboardListener = () => {
146
+ const {dispatch} = useContext(DispatchContext);
147
+ const {setCustomContent} = useContent();
148
+ const {currentLayout, setLayout} = useLayout();
149
+ const {
150
+ data: {isHost},
151
+ isWhiteBoardOn,
152
+ } = useRoomInfo();
153
+
154
+ React.useEffect(() => {
155
+ if ($config.ENABLE_WAITING_ROOM && !isHost) {
156
+ if (isWhiteBoardOn) {
157
+ WhiteboardStartedCallBack();
158
+ } else {
159
+ WhiteboardStoppedCallBack();
160
+ }
161
+ }
162
+ }, [isWhiteBoardOn, isHost]);
163
+
164
+ const WhiteboardCallBack = ({status}) => {
165
+ if (status) {
166
+ WhiteboardStartedCallBack();
167
+ } else {
168
+ WhiteboardStoppedCallBack();
169
+ }
170
+ };
171
+
172
+ useEffect(() => {
173
+ if (
174
+ !$config.ENABLE_WAITING_ROOM ||
175
+ ($config.ENABLE_WAITING_ROOM && isHost)
176
+ ) {
177
+ LocalEventEmitter.on(
178
+ LocalEventsEnum.WHITEBOARD_ACTIVE_LOCAL,
179
+ WhiteboardCallBack,
180
+ );
181
+
182
+ return () => {
183
+ LocalEventEmitter.on(
184
+ LocalEventsEnum.WHITEBOARD_ACTIVE_LOCAL,
185
+ WhiteboardCallBack,
186
+ );
187
+ };
188
+ }
189
+ }, [isHost]);
190
+
191
+ //whiteboard start
192
+
193
+ const {
194
+ whiteboardActive,
195
+ joinWhiteboardRoom,
196
+ leaveWhiteboardRoom,
197
+ getWhiteboardUid,
198
+ } = useContext(whiteboardContext);
199
+
200
+ const WhiteboardStoppedCallBack = () => {
201
+ toggleWhiteboard(true, false);
202
+ };
203
+
204
+ const WhiteboardStartedCallBack = () => {
205
+ toggleWhiteboard(false, false);
206
+ };
207
+
208
+ useEffect(() => {
209
+ whiteboardActive && currentLayout !== 'pinned' && setLayout('pinned');
210
+ }, []);
211
+
212
+ const toggleWhiteboard = (
213
+ whiteboardActive: boolean,
214
+ triggerEvent: boolean,
215
+ ) => {
216
+ if ($config.ENABLE_WHITEBOARD) {
217
+ if (whiteboardActive) {
218
+ leaveWhiteboardRoom();
219
+ setCustomContent(getWhiteboardUid(), false);
220
+ setLayout('grid');
221
+ triggerEvent &&
222
+ events.send(
223
+ EventNames.WHITEBOARD_ACTIVE,
224
+ JSON.stringify({status: false}),
225
+ PersistanceLevel.Session,
226
+ );
227
+ } else {
228
+ joinWhiteboardRoom();
229
+ setCustomContent(getWhiteboardUid(), WhiteboardWrapper, {}, true);
230
+ dispatch({
231
+ type: 'UserPin',
232
+ value: [getWhiteboardUid()],
233
+ });
234
+ setLayout('pinned');
235
+ triggerEvent &&
236
+ events.send(
237
+ EventNames.WHITEBOARD_ACTIVE,
238
+ JSON.stringify({status: true}),
239
+ PersistanceLevel.Session,
240
+ );
241
+ }
242
+ }
243
+ };
244
+ return null;
245
+ };
58
246
 
59
247
  const MoreButton = () => {
248
+ const noiseCancellationLabel = useString(toolbarItemNoiseCancellationText)();
249
+ const whiteboardLabel = useString<boolean>(toolbarItemWhiteboardText);
250
+ const captionLabel = useString<boolean>(toolbarItemCaptionText);
251
+ const transcriptLabel = useString<boolean>(toolbarItemTranscriptText);
252
+ const settingsLabel = useString(toolbarItemSettingText)();
253
+ const screenShareButton = useString<boolean>(toolbarItemShareText);
254
+ const recordingButton = useString<boolean>(toolbarItemRecordingText);
255
+ const viewRecordingsLabel = useString<boolean>(
256
+ toolbarItemViewRecordingText,
257
+ )();
258
+ const moreButtonLabel = useString(toolbarItemMoreText)();
259
+ const virtualBackgroundLabel = useString(toolbarItemVirtualBackgroundText)();
260
+ const chatLabel = useString(toolbarItemChatText)();
261
+ const inviteLabel = useString(toolbarItemInviteText)();
262
+ const peopleLabel = useString(toolbarItemPeopleText)();
263
+ const layoutLabel = useString(toolbarItemLayoutText)();
264
+ const {dispatch} = useContext(DispatchContext);
60
265
  const {rtcProps} = useContext(PropsContext);
61
- const [actionMenuVisible, setActionMenuVisible] = React.useState(false);
266
+ const {setCustomContent} = useContent();
267
+ const [_, setActionMenuVisible] = React.useState(false);
62
268
  const [isHovered, setIsHovered] = useState(false);
63
269
  const [isHoveredOnModal, setIsHoveredOnModal] = useState(false);
270
+ const {
271
+ modalOpen: isVRModalOpen,
272
+ setModalOpen: setVRModalOpen,
273
+ toggle: toggleVRModal,
274
+ } = useModal();
64
275
  const moreBtnRef = useRef(null);
65
276
  const {width: globalWidth, height: globalHeight} = useWindowDimensions();
66
277
  const layouts = useLayoutsData();
67
278
  const {currentLayout, setLayout} = useLayout();
68
- const layout = layouts.findIndex((item) => item.name === currentLayout);
279
+ const layout = layouts.findIndex(item => item.name === currentLayout);
69
280
  const {setSidePanel, sidePanel} = useSidePanel();
70
281
  const {
71
- data: {isHost},
72
- } = useMeetingInfo();
282
+ isCaptionON,
283
+ setIsCaptionON,
284
+ language: prevLang,
285
+ isSTTActive,
286
+ setIsSTTActive,
287
+ isSTTError,
288
+ } = useCaption();
289
+
290
+ const isTranscriptON = sidePanel === SidePanelType.Transcript;
291
+
292
+ const [isLanguagePopupOpen, setLanguagePopup] =
293
+ React.useState<boolean>(false);
294
+ const isFirstTimePopupOpen = React.useRef(false);
295
+ const STT_clicked = React.useRef(null);
296
+
297
+ const {start, restart} = useSTTAPI();
73
298
  const {
74
- showLayoutOption,
75
- setShowInvitePopup,
76
- setShowStopRecordingPopup,
77
- setShowLayoutOption,
78
- } = useVideoCall();
299
+ data: {isHost},
300
+ } = useRoomInfo();
301
+ const {setShowInvitePopup, setShowStopRecordingPopup, setShowLayoutOption} =
302
+ useVideoCall();
79
303
  const {isScreenshareActive, startUserScreenshare, stopUserScreenShare} =
80
304
  useScreenshare();
81
305
  const {isRecordingActive, startRecording, inProgress} = useRecording();
82
- const {setGroupActive} = useChatUIControl();
306
+ const {setChatType} = useChatUIControls();
83
307
  const actionMenuitems: ActionMenuItem[] = [];
84
308
 
309
+ const {isNoiseSupressionEnabled, setNoiseSupression} = useNoiseSupression();
310
+
311
+ //AINS
312
+ if ($config.ENABLE_NOISE_CANCELLATION) {
313
+ actionMenuitems.push({
314
+ toggleStatus: isNoiseSupressionEnabled === ToggleState.enabled,
315
+ disabled:
316
+ isNoiseSupressionEnabled === ToggleState.disabling ||
317
+ isNoiseSupressionEnabled === ToggleState.enabling,
318
+ isBase64Icon: true,
319
+ //@ts-ignore
320
+ icon: 'noise-cancellation',
321
+ iconColor: $config.SECONDARY_ACTION_COLOR,
322
+ textColor: $config.FONT_COLOR,
323
+ title: noiseCancellationLabel,
324
+ //isNoiseSupressionEnabled === ToggleState.enabled
325
+ callback: () => {
326
+ setActionMenuVisible(false);
327
+ setNoiseSupression(p => !p);
328
+ },
329
+ });
330
+ }
331
+ //AINS
332
+
333
+ //virtual background
334
+ const {isVBActive, setIsVBActive} = useVB();
335
+
336
+ const toggleVB = () => {
337
+ if (isVBActive) {
338
+ setSidePanel(SidePanelType.None);
339
+ } else {
340
+ setSidePanel(SidePanelType.VirtualBackground);
341
+ }
342
+ setIsVBActive(prev => !prev);
343
+ };
344
+ if ($config.ENABLE_VIRTUAL_BACKGROUND && !$config.AUDIO_ROOM) {
345
+ actionMenuitems.push({
346
+ isBase64Icon: true,
347
+ //@ts-ignore
348
+ icon: 'vb',
349
+ iconColor: $config.SECONDARY_ACTION_COLOR,
350
+ textColor: $config.FONT_COLOR,
351
+ //title: `${isVBActive ? 'Hide' : 'Show'} Virtual Background`,
352
+ title: virtualBackgroundLabel,
353
+ callback: () => {
354
+ setActionMenuVisible(false);
355
+ toggleVB();
356
+ },
357
+ });
358
+ }
359
+ //virtual background
360
+
361
+ //whiteboard start
362
+
363
+ const {
364
+ whiteboardRoomState,
365
+ whiteboardActive,
366
+ joinWhiteboardRoom,
367
+ leaveWhiteboardRoom,
368
+ getWhiteboardUid,
369
+ whiteboardStartedFirst,
370
+ } = useContext(whiteboardContext);
371
+
372
+ const WhiteboardStoppedCallBack = () => {
373
+ toggleWhiteboard(true, false);
374
+ };
375
+
376
+ const WhiteboardStartedCallBack = () => {
377
+ toggleWhiteboard(false, false);
378
+ };
379
+
380
+ useEffect(() => {
381
+ whiteboardActive && currentLayout !== 'pinned' && setLayout('pinned');
382
+ }, []);
383
+
384
+ const WhiteboardCallBack = ({status}) => {
385
+ if (status) {
386
+ WhiteboardStartedCallBack();
387
+ } else {
388
+ WhiteboardStoppedCallBack();
389
+ }
390
+ };
391
+
392
+ useEffect(() => {
393
+ LocalEventEmitter.on(
394
+ LocalEventsEnum.WHITEBOARD_ACTIVE_LOCAL,
395
+ WhiteboardCallBack,
396
+ );
397
+ return () => {
398
+ LocalEventEmitter.off(
399
+ LocalEventsEnum.WHITEBOARD_ACTIVE_LOCAL,
400
+ WhiteboardCallBack,
401
+ );
402
+ };
403
+ }, []);
404
+
405
+ const toggleWhiteboard = (
406
+ whiteboardActive: boolean,
407
+ triggerEvent: boolean,
408
+ ) => {
409
+ if ($config.ENABLE_WHITEBOARD) {
410
+ if (whiteboardActive) {
411
+ leaveWhiteboardRoom();
412
+ setCustomContent(getWhiteboardUid(), false);
413
+ setLayout('grid');
414
+ triggerEvent &&
415
+ events.send(
416
+ EventNames.WHITEBOARD_ACTIVE,
417
+ JSON.stringify({status: false}),
418
+ PersistanceLevel.Session,
419
+ );
420
+ } else {
421
+ joinWhiteboardRoom();
422
+ setCustomContent(getWhiteboardUid(), WhiteboardWrapper, {}, true);
423
+ dispatch({
424
+ type: 'UserPin',
425
+ value: [getWhiteboardUid()],
426
+ });
427
+ setLayout('pinned');
428
+ triggerEvent &&
429
+ events.send(
430
+ EventNames.WHITEBOARD_ACTIVE,
431
+ JSON.stringify({status: true}),
432
+ PersistanceLevel.Session,
433
+ );
434
+ }
435
+ }
436
+ };
437
+ const WhiteboardDisabled =
438
+ !isHost ||
439
+ whiteboardRoomState === RoomPhase.Connecting ||
440
+ whiteboardRoomState === RoomPhase.Disconnecting;
441
+
442
+ //whiteboard ends
443
+
444
+ if (isHost && $config.ENABLE_WHITEBOARD && isWebInternal()) {
445
+ actionMenuitems.push({
446
+ disabled: WhiteboardDisabled,
447
+ isBase64Icon: true,
448
+ //@ts-ignore
449
+ icon: 'whiteboard-new',
450
+ iconColor: $config.SECONDARY_ACTION_COLOR,
451
+ textColor: $config.FONT_COLOR,
452
+ title: whiteboardLabel(whiteboardActive),
453
+ callback: () => {
454
+ setActionMenuVisible(false);
455
+ toggleWhiteboard(whiteboardActive, true);
456
+ },
457
+ });
458
+ }
459
+
460
+ // host can see stt options and attendee can view only when stt is enabled by a host in the channel
461
+
462
+ if ($config.ENABLE_STT) {
463
+ actionMenuitems.push({
464
+ icon: `${isCaptionON ? 'captions-off' : 'captions'}`,
465
+ iconColor: $config.SECONDARY_ACTION_COLOR,
466
+ textColor: $config.FONT_COLOR,
467
+ disabled: !($config.ENABLE_STT && (isHost || (!isHost && isSTTActive))),
468
+ title: captionLabel(isCaptionON),
469
+ callback: () => {
470
+ setActionMenuVisible(false);
471
+ STT_clicked.current = !isCaptionON ? 'caption' : null;
472
+ if (isSTTError) {
473
+ setIsCaptionON(prev => !prev);
474
+ return;
475
+ }
476
+ if (isSTTActive) {
477
+ setIsCaptionON(prev => !prev);
478
+ // is lang popup has been shown once for any user in meeting
479
+ } else {
480
+ isFirstTimePopupOpen.current = true;
481
+ setLanguagePopup(true);
482
+ }
483
+ },
484
+ });
485
+
486
+ actionMenuitems.push({
487
+ icon: 'transcript',
488
+ iconColor: $config.SECONDARY_ACTION_COLOR,
489
+ textColor: $config.FONT_COLOR,
490
+ disabled: !($config.ENABLE_STT && (isHost || (!isHost && isSTTActive))),
491
+ title: transcriptLabel(isTranscriptON),
492
+ callback: () => {
493
+ setActionMenuVisible(false);
494
+ STT_clicked.current = !isTranscriptON ? 'transcript' : null;
495
+ if (isSTTError) {
496
+ !isTranscriptON
497
+ ? setSidePanel(SidePanelType.Transcript)
498
+ : setSidePanel(SidePanelType.None);
499
+ return;
500
+ }
501
+ if (isSTTActive) {
502
+ !isTranscriptON
503
+ ? setSidePanel(SidePanelType.Transcript)
504
+ : setSidePanel(SidePanelType.None);
505
+ } else {
506
+ isFirstTimePopupOpen.current = true;
507
+ setLanguagePopup(true);
508
+ }
509
+ },
510
+ });
511
+ }
512
+
513
+ // view recordings
514
+
515
+ if (isHost && $config.CLOUD_RECORDING && isWeb()) {
516
+ actionMenuitems.push({
517
+ icon: 'play-circle',
518
+ iconColor: $config.SECONDARY_ACTION_COLOR,
519
+ textColor: $config.FONT_COLOR,
520
+ title: viewRecordingsLabel,
521
+ callback: () => {
522
+ toggleVRModal();
523
+ },
524
+ });
525
+ }
526
+
85
527
  if (globalWidth <= BREAKPOINTS.sm) {
86
528
  actionMenuitems.push({
87
529
  icon: 'participants',
88
530
  iconColor: $config.SECONDARY_ACTION_COLOR,
89
531
  textColor: $config.FONT_COLOR,
90
- title: 'People',
532
+ title: peopleLabel,
91
533
  callback: () => {
92
534
  setActionMenuVisible(false);
93
535
  setSidePanel(SidePanelType.Participants);
@@ -97,10 +539,10 @@ const MoreButton = () => {
97
539
  icon: 'chat-nav',
98
540
  iconColor: $config.SECONDARY_ACTION_COLOR,
99
541
  textColor: $config.FONT_COLOR,
100
- title: 'Chat',
542
+ title: chatLabel,
101
543
  callback: () => {
102
544
  setActionMenuVisible(false);
103
- setGroupActive(true);
545
+ setChatType(ChatType.Group);
104
546
  setSidePanel(SidePanelType.Chat);
105
547
  },
106
548
  });
@@ -108,14 +550,14 @@ const MoreButton = () => {
108
550
  if ($config.SCREEN_SHARING) {
109
551
  if (
110
552
  !(
111
- rtcProps.role == ClientRole.Audience &&
553
+ rtcProps.role == ClientRoleType.ClientRoleAudience &&
112
554
  $config.EVENT_MODE &&
113
555
  !$config.RAISE_HAND
114
556
  )
115
557
  ) {
116
558
  actionMenuitems.push({
117
559
  disabled:
118
- rtcProps.role == ClientRole.Audience &&
560
+ rtcProps.role == ClientRoleType.ClientRoleAudience &&
119
561
  $config.EVENT_MODE &&
120
562
  $config.RAISE_HAND &&
121
563
  !isHost,
@@ -126,7 +568,7 @@ const MoreButton = () => {
126
568
  textColor: isScreenshareActive
127
569
  ? $config.SEMANTIC_ERROR
128
570
  : $config.FONT_COLOR,
129
- title: isScreenshareActive ? 'Stop Share' : 'Share',
571
+ title: screenShareButton(isScreenshareActive),
130
572
  callback: () => {
131
573
  setActionMenuVisible(false);
132
574
  isScreenshareActive
@@ -146,7 +588,7 @@ const MoreButton = () => {
146
588
  textColor: isRecordingActive
147
589
  ? $config.SEMANTIC_ERROR
148
590
  : $config.FONT_COLOR,
149
- title: isRecordingActive ? 'Stop Recording' : 'Record',
591
+ title: recordingButton(isRecordingActive),
150
592
  callback: () => {
151
593
  setActionMenuVisible(false);
152
594
  if (!isRecordingActive) {
@@ -161,14 +603,17 @@ const MoreButton = () => {
161
603
 
162
604
  if (globalWidth <= BREAKPOINTS.md) {
163
605
  actionMenuitems.push({
164
- icon: layouts[layout]?.iconName,
606
+ //below icon key is dummy value
607
+ icon: 'grid',
608
+ externalIconString: layouts[layout]?.icon,
609
+ isExternalIcon: true,
165
610
  iconColor: $config.SECONDARY_ACTION_COLOR,
166
611
  textColor: $config.FONT_COLOR,
167
- title: 'Layout',
612
+ title: layoutLabel,
168
613
  callback: () => {
169
614
  //setShowLayoutOption(true);
170
615
  },
171
- onHoverCallback: (isHovered) => {
616
+ onHoverCallback: isHovered => {
172
617
  setShowLayoutOption(isHovered);
173
618
  },
174
619
  onHoverContent: (
@@ -189,7 +634,7 @@ const MoreButton = () => {
189
634
  icon: 'share',
190
635
  iconColor: $config.SECONDARY_ACTION_COLOR,
191
636
  textColor: $config.FONT_COLOR,
192
- title: 'Invite',
637
+ title: inviteLabel,
193
638
  callback: () => {
194
639
  setActionMenuVisible(false);
195
640
  setShowInvitePopup(true);
@@ -202,7 +647,7 @@ const MoreButton = () => {
202
647
  icon: 'settings',
203
648
  iconColor: $config.SECONDARY_ACTION_COLOR,
204
649
  textColor: $config.FONT_COLOR,
205
- title: 'Settings',
650
+ title: settingsLabel,
206
651
  callback: () => {
207
652
  setActionMenuVisible(false);
208
653
  setSidePanel(SidePanelType.Settings);
@@ -213,7 +658,7 @@ const MoreButton = () => {
213
658
  useEffect(() => {
214
659
  if (isHovered) {
215
660
  setActionMenuVisible(true);
216
- }
661
+ } else setActionMenuVisible(false);
217
662
  }, [isHovered]);
218
663
 
219
664
  useEffect(() => {
@@ -221,14 +666,59 @@ const MoreButton = () => {
221
666
  setActionMenuVisible(false);
222
667
  }, [currentLayout]);
223
668
 
669
+ const onConfirm = async (langChanged, language) => {
670
+ const isCaptionClicked = STT_clicked.current === 'caption';
671
+ const isTranscriptClicked = STT_clicked.current === 'transcript';
672
+ setLanguagePopup(false);
673
+ isFirstTimePopupOpen.current = false;
674
+ const method = isCaptionClicked
675
+ ? isCaptionON
676
+ : isTranscriptON
677
+ ? 'stop'
678
+ : 'start';
679
+ if (isTranscriptClicked) {
680
+ if (!isTranscriptON) {
681
+ setSidePanel(SidePanelType.Transcript);
682
+ } else {
683
+ setSidePanel(SidePanelType.None);
684
+ }
685
+ }
686
+ if (method === 'stop') return; // not closing the stt service as it will stop for whole channel
687
+ if (method === 'start' && isSTTActive === true) return; // not triggering the start service if STT Service already started by anyone else in the channel
688
+
689
+ if (isCaptionClicked) {
690
+ setIsCaptionON(prev => !prev);
691
+ } else {
692
+ }
693
+
694
+ try {
695
+ const res = await start(language);
696
+ if (res?.message.includes('STARTED')) {
697
+ // channel is already started now restart
698
+ await restart(language);
699
+ }
700
+ } catch (error) {
701
+ console.log('eror in starting stt', error);
702
+ }
703
+ };
704
+
224
705
  return (
225
706
  <>
707
+ <LanguageSelectorPopup
708
+ modalVisible={isLanguagePopupOpen}
709
+ setModalVisible={setLanguagePopup}
710
+ onConfirm={onConfirm}
711
+ isFirstTimePopupOpen={isFirstTimePopupOpen.current}
712
+ />
713
+ {$config.CLOUD_RECORDING && isHost && isWeb() && isVRModalOpen && (
714
+ <ViewRecordingsModal setModalOpen={setVRModalOpen} />
715
+ )}
226
716
  <ActionMenu
227
- containerStyle={{width: 180}}
717
+ containerStyle={globalWidth < 720 ? {width: 180} : {width: 260}}
228
718
  hoverMode={true}
229
- onHover={(isVisible) => setIsHoveredOnModal(isVisible)}
719
+ onHover={isVisible => setIsHoveredOnModal(isVisible)}
230
720
  from={'control-bar'}
231
- actionMenuVisible={(isHovered || isHoveredOnModal) && actionMenuVisible}
721
+ actionMenuVisible={isHovered || isHoveredOnModal}
232
722
  setActionMenuVisible={setActionMenuVisible}
233
723
  modalPosition={{
234
724
  bottom: 8,
@@ -255,7 +745,7 @@ const MoreButton = () => {
255
745
  }}
256
746
  />
257
747
  <IconButton
258
- setRef={(ref) => {
748
+ setRef={ref => {
259
749
  moreBtnRef.current = ref;
260
750
  }}
261
751
  onPress={() => {
@@ -266,7 +756,7 @@ const MoreButton = () => {
266
756
  tintColor: $config.SECONDARY_ACTION_COLOR,
267
757
  }}
268
758
  btnTextProps={{
269
- text: $config.ICON_TEXT ? 'More' : '',
759
+ text: $config.ICON_TEXT ? moreButtonLabel : '',
270
760
  textColor: $config.FONT_COLOR,
271
761
  }}
272
762
  />
@@ -274,149 +764,374 @@ const MoreButton = () => {
274
764
  </>
275
765
  );
276
766
  };
277
- const Controls = () => {
767
+ export const LayoutToolbarItem = () => (
768
+ <ToolbarItem testID="layout-btn" collapsable={false}>
769
+ {/**
770
+ * .measure returns undefined on Android unless collapsable=false or onLayout are specified
771
+ * so added collapsable property
772
+ * https://github.com/facebook/react-native/issues/29712
773
+ * */}
774
+ <LayoutIconButton />
775
+ </ToolbarItem>
776
+ );
777
+ export const InviteToolbarItem = () => {
778
+ return (
779
+ <ToolbarItem testID="invite-btn">
780
+ <CopyJoinInfo />
781
+ </ToolbarItem>
782
+ );
783
+ };
784
+ const defaultStartItems: Array<ToolbarCustomItem> = [
785
+ {
786
+ align: 'start',
787
+ component: LayoutToolbarItem,
788
+ order: 0,
789
+ hide: 'no',
790
+ },
791
+ {
792
+ align: 'start',
793
+ component: InviteToolbarItem,
794
+ order: 1,
795
+ hide: 'no',
796
+ },
797
+ ];
798
+
799
+ export const RaiseHandToolbarItem = () => {
278
800
  const {rtcProps} = useContext(PropsContext);
279
- const isDesktop = useIsDesktop();
801
+ // attendee can view option if any host has started STT
802
+ const {
803
+ data: {isHost},
804
+ } = useRoomInfo();
805
+ return $config.EVENT_MODE ? (
806
+ rtcProps.role == ClientRoleType.ClientRoleAudience ? (
807
+ <LiveStreamControls showControls={true} />
808
+ ) : rtcProps?.role == ClientRoleType.ClientRoleBroadcaster ? (
809
+ /**
810
+ * In event mode when raise hand feature is active
811
+ * and audience is promoted to host, the audience can also
812
+ * demote himself
813
+ */
814
+ <LiveStreamControls showControls={!isHost} />
815
+ ) : (
816
+ <></>
817
+ )
818
+ ) : (
819
+ <></>
820
+ );
821
+ };
822
+
823
+ export const LocalAudioToolbarItem = () => {
824
+ return (
825
+ <ToolbarItem testID="localAudio-btn">
826
+ <LocalAudioMute showToolTip={true} />
827
+ </ToolbarItem>
828
+ );
829
+ };
830
+
831
+ export const LocalVideoToolbarItem = () => {
832
+ return (
833
+ !$config.AUDIO_ROOM && (
834
+ <ToolbarItem testID="localVideo-btn">
835
+ <LocalVideoMute showToolTip={true} />
836
+ </ToolbarItem>
837
+ )
838
+ );
839
+ };
840
+
841
+ export const SwitchCameraToolbarItem = () => {
842
+ return (
843
+ !$config.AUDIO_ROOM &&
844
+ isMobileOrTablet() && (
845
+ <ToolbarItem testID="switchCamera-btn">
846
+ <LocalSwitchCamera />
847
+ </ToolbarItem>
848
+ )
849
+ );
850
+ };
851
+
852
+ export const ScreenShareToolbarItem = () => {
853
+ const {width} = useWindowDimensions();
854
+ return (
855
+ width > BREAKPOINTS.sm &&
856
+ $config.SCREEN_SHARING &&
857
+ !isMobileOrTablet() && (
858
+ <ToolbarItem testID="screenShare-btn">
859
+ <ScreenshareButton />
860
+ </ToolbarItem>
861
+ )
862
+ );
863
+ };
864
+ export const RecordingToolbarItem = () => {
865
+ const {width} = useWindowDimensions();
280
866
  const {
281
867
  data: {isHost},
282
- } = useMeetingInfo();
868
+ } = useRoomInfo();
869
+ return (
870
+ width > BREAKPOINTS.sm &&
871
+ isHost &&
872
+ $config.CLOUD_RECORDING && (
873
+ <ToolbarItem testID="recording-btn">
874
+ <Recording />
875
+ </ToolbarItem>
876
+ )
877
+ );
878
+ };
879
+
880
+ export const MoreButtonToolbarItem = () => {
283
881
  const {width} = useWindowDimensions();
882
+ const {
883
+ data: {isHost},
884
+ } = useRoomInfo();
885
+ const {isSTTActive} = useCaption();
886
+ const [_, forceUpdate] = useReducer(x => x + 1, 0);
887
+
888
+ useEffect(() => {
889
+ forceUpdate();
890
+ }, [isHost]);
284
891
 
892
+ return width < BREAKPOINTS.md ||
893
+ ($config.ENABLE_STT && (isHost || (!isHost && isSTTActive))) ||
894
+ $config.ENABLE_NOISE_CANCELLATION ||
895
+ ($config.ENABLE_VIRTUAL_BACKGROUND && !$config.AUDIO_ROOM) ||
896
+ (isHost && $config.ENABLE_WHITEBOARD && isWebInternal()) ? (
897
+ <ToolbarItem testID="more-btn">
898
+ {!isHost && $config.ENABLE_WHITEBOARD && isWebInternal() ? (
899
+ <WhiteboardListener />
900
+ ) : (
901
+ <></>
902
+ )}
903
+ <MoreButton />
904
+ </ToolbarItem>
905
+ ) : (
906
+ <WhiteboardListener />
907
+ );
908
+ };
909
+ export interface LocalEndcallToolbarItemProps {
910
+ customExit?: () => void;
911
+ }
912
+ export const LocalEndcallToolbarItem = (
913
+ props?: LocalEndcallToolbarItemProps,
914
+ ) => {
285
915
  return (
286
- <View
287
- testID="videocall-controls"
288
- style={[
289
- style.container,
916
+ <ToolbarItem
917
+ testID={props?.customExit ? 'endCall-btn-custom' : 'endCall-btn'}>
918
+ <LocalEndcall {...props} />
919
+ </ToolbarItem>
920
+ );
921
+ };
922
+
923
+ const defaultCenterItems: ToolbarCustomItem[] = [
924
+ {
925
+ align: 'start',
926
+ component: RaiseHandToolbarItem,
927
+ order: 0,
928
+ hide: 'no',
929
+ },
930
+ {
931
+ align: 'start',
932
+ component: LocalAudioToolbarItem,
933
+ order: 1,
934
+ hide: 'no',
935
+ },
936
+ {
937
+ align: 'start',
938
+ component: LocalVideoToolbarItem,
939
+ order: 2,
940
+ hide: 'no',
941
+ },
942
+ {
943
+ align: 'start',
944
+ component: SwitchCameraToolbarItem,
945
+ order: 3,
946
+ hide: 'no',
947
+ },
948
+ {
949
+ align: 'start',
950
+ component: ScreenShareToolbarItem,
951
+ order: 4,
952
+ hide: 'no',
953
+ },
954
+ {
955
+ align: 'start',
956
+ component: RecordingToolbarItem,
957
+ order: 5,
958
+ hide: 'no',
959
+ },
960
+ {
961
+ align: 'start',
962
+ component: MoreButtonToolbarItem,
963
+ order: 6,
964
+ hide: 'no',
965
+ },
966
+ {
967
+ align: 'start',
968
+ component: LocalEndcallToolbarItem,
969
+ order: 7,
970
+ hide: 'no',
971
+ },
972
+ ];
973
+
974
+ const defaultEndItems: ToolbarCustomItem[] = [];
975
+
976
+ export interface ControlsProps {
977
+ customItems?: ToolbarCustomItem[];
978
+ includeDefaultItems?: boolean;
979
+ }
980
+ const Controls = (props: ControlsProps) => {
981
+ const {customItems = [], includeDefaultItems = true} = props;
982
+ const {width} = useWindowDimensions();
983
+ const {defaultContent} = useContent();
984
+ const {setLanguage, setMeetingTranscript, setIsSTTActive} = useCaption();
985
+ const defaultContentRef = React.useRef(defaultContent);
986
+ const {setRoomInfo} = useSetRoomInfo();
987
+ const heading = useString<'Set' | 'Changed'>(sttSpokenLanguageToastHeading);
988
+ const subheading = useString<{
989
+ action: 'Set' | 'Changed';
990
+ newLanguage: string;
991
+ oldLanguage: string;
992
+ username: string;
993
+ }>(sttSpokenLanguageToastSubHeading);
994
+
995
+ const {
996
+ data: {isHost},
997
+ sttLanguage,
998
+ isSTTActive,
999
+ } = useRoomInfo();
1000
+
1001
+ React.useEffect(() => {
1002
+ defaultContentRef.current = defaultContent;
1003
+ }, [defaultContent]);
1004
+
1005
+ React.useEffect(() => {
1006
+ // for mobile events are set in ActionSheetContent
1007
+ if (!sttLanguage) return;
1008
+ const {
1009
+ username,
1010
+ prevLang,
1011
+ newLang,
1012
+ uid,
1013
+ langChanged,
1014
+ }: RoomInfoContextInterface['sttLanguage'] = sttLanguage;
1015
+ if (!langChanged) return;
1016
+ const actionText =
1017
+ prevLang.indexOf('') !== -1
1018
+ ? `has set the spoken language to "${getLanguageLabel(newLang)}" `
1019
+ : `changed the spoken language from "${getLanguageLabel(
1020
+ prevLang,
1021
+ )}" to "${getLanguageLabel(newLang)}" `;
1022
+ // const msg = `${
1023
+ // //@ts-ignore
1024
+ // defaultContentRef.current[uid]?.name || username
1025
+ // } ${actionText} `;
1026
+ let subheadingObj: any = {};
1027
+ if (prevLang.indexOf('') !== -1) {
1028
+ subheadingObj = {
1029
+ username: defaultContentRef.current[uid]?.name || username,
1030
+ action: prevLang.indexOf('') !== -1 ? 'Set' : 'Changed',
1031
+ newLanguage: getLanguageLabel(newLang),
1032
+ };
1033
+ } else {
1034
+ subheadingObj = {
1035
+ username: defaultContentRef.current[uid]?.name || username,
1036
+ action: prevLang.indexOf('') !== -1 ? 'Set' : 'Changed',
1037
+ newLanguage: getLanguageLabel(newLang),
1038
+ oldLanguage: getLanguageLabel(prevLang),
1039
+ };
1040
+ }
1041
+
1042
+ Toast.show({
1043
+ leadingIconName: 'lang-select',
1044
+ type: 'info',
1045
+ text1: heading(prevLang.indexOf('') !== -1 ? 'Set' : 'Changed'),
1046
+ visibilityTime: 3000,
1047
+ primaryBtn: null,
1048
+ secondaryBtn: null,
1049
+ text2: subheading(subheadingObj),
1050
+ });
1051
+ setRoomInfo(prev => {
1052
+ return {
1053
+ ...prev,
1054
+ sttLanguage: {...sttLanguage, langChanged: false},
1055
+ };
1056
+ });
1057
+ // syncing local set language
1058
+ newLang && setLanguage(newLang);
1059
+ // add spoken lang msg to transcript
1060
+ setMeetingTranscript(prev => {
1061
+ return [
1062
+ ...prev,
290
1063
  {
291
- paddingHorizontal: isDesktop('toolbar') ? 32 : 16,
1064
+ name: 'langUpdate',
1065
+ time: new Date().getTime(),
1066
+ uid: `langUpdate-${uid}`,
1067
+ text: actionText,
292
1068
  },
293
- ]}>
1069
+ ];
1070
+ });
1071
+ }, [sttLanguage]);
1072
+
1073
+ React.useEffect(() => {
1074
+ setIsSTTActive(isSTTActive);
1075
+ }, [isSTTActive]);
1076
+
1077
+ const ToastIcon = ({color}) => (
1078
+ <View style={{marginRight: 12, alignSelf: 'center', width: 24, height: 24}}>
1079
+ <ImageIcon iconType="plain" tintColor={color} name={'lang-select'} />
1080
+ </View>
1081
+ );
1082
+
1083
+ const isHidden = i => {
1084
+ return i?.hide === 'yes';
1085
+ };
1086
+ const customStartItems = customItems
1087
+ ?.filter(i => i?.align === 'start' && !isHidden(i))
1088
+ ?.concat(includeDefaultItems ? defaultStartItems : [])
1089
+ ?.sort(CustomToolbarSort);
1090
+
1091
+ const customCenterItems = customItems
1092
+ ?.filter(i => i?.align === 'center' && !isHidden(i))
1093
+ ?.concat(includeDefaultItems ? defaultCenterItems : [])
1094
+ ?.sort(CustomToolbarSort);
1095
+
1096
+ const customEndItems = customItems
1097
+ ?.filter(i => i?.align === 'end' && !isHidden(i))
1098
+ ?.concat(includeDefaultItems ? defaultEndItems : [])
1099
+ ?.sort(CustomToolbarSort);
1100
+
1101
+ const renderContent = (
1102
+ items: ToolbarCustomItem[],
1103
+ type: 'start' | 'center' | 'end',
1104
+ ) => {
1105
+ return items?.map((item, index) => {
1106
+ const ToolbarItem = item?.component;
1107
+ if (ToolbarItem) {
1108
+ return <ToolbarItem key={`bottom-toolbar-${type}` + index} />;
1109
+ } else {
1110
+ return null;
1111
+ }
1112
+ });
1113
+ };
1114
+ return (
1115
+ <Toolbar>
294
1116
  {width >= BREAKPOINTS.md && (
295
- <View style={style.leftContent}>
296
- <View
297
- testID="layout-btn"
298
- style={{marginRight: 10}}
299
- collapsable={false}>
300
- {/**
301
- * .measure returns undefined on Android unless collapsable=false or onLayout are specified
302
- * so added collapsable property
303
- * https://github.com/facebook/react-native/issues/29712
304
- * */}
305
- <LayoutIconButton />
306
- </View>
307
- <View testID="invite-btn" style={{marginHorizontal: 10}}>
308
- <CopyJoinInfo />
309
- </View>
1117
+ <View style={[style.startContent]}>
1118
+ {renderContent(customStartItems, 'start')}
310
1119
  </View>
311
1120
  )}
312
- <View style={style.centerContent}>
313
- {$config.EVENT_MODE && rtcProps.role == ClientRole.Audience ? (
314
- <LiveStreamControls
315
- showControls={true}
316
- isDesktop={isDesktop('toolbar')}
317
- />
318
- ) : (
319
- <></>
320
- )}
321
- <>
322
- {/**
323
- * In event mode when raise hand feature is active
324
- * and audience is promoted to host, the audience can also
325
- * demote himself
326
- */}
327
- {$config.EVENT_MODE ? (
328
- <LiveStreamControls
329
- isDesktop={isDesktop('toolbar')}
330
- showControls={rtcProps?.role == ClientRole.Broadcaster && !isHost}
331
- />
332
- ) : (
333
- <></>
334
- )}
335
- <View testID="localAudio-btn" style={{marginHorizontal: 10}}>
336
- <LocalAudioMute showToolTip={true} />
337
- </View>
338
- {!$config.AUDIO_ROOM && (
339
- <View
340
- testID="localVideo-btn"
341
- style={{
342
- marginHorizontal: 10,
343
- }}>
344
- <LocalVideoMute showToolTip={true} />
345
- </View>
346
- )}
347
- {!$config.AUDIO_ROOM && isMobileOrTablet() && (
348
- <View
349
- testID="switchCamera-btn"
350
- style={{
351
- marginHorizontal: 10,
352
- }}>
353
- <LocalSwitchCamera />
354
- </View>
355
- )}
356
- {width > BREAKPOINTS.sm &&
357
- $config.SCREEN_SHARING &&
358
- !isMobileOrTablet() && (
359
- <View
360
- testID="screenShare-btn"
361
- style={{
362
- marginHorizontal: 10,
363
- }}>
364
- <ScreenshareButton />
365
- </View>
366
- )}
367
- {width > BREAKPOINTS.sm && isHost && $config.CLOUD_RECORDING && (
368
- <View
369
- testID="recording-btn"
370
- style={{
371
- marginHorizontal: 10,
372
- }}>
373
- <Recording />
374
- </View>
375
- )}
376
- </>
377
- {width < BREAKPOINTS.md && (
378
- <View testID="more-btn" style={{marginHorizontal: 10}}>
379
- <MoreButton />
380
- </View>
381
- )}
382
- <View testID="endCall-btn" style={{marginHorizontal: 10}}>
383
- <LocalEndcall />
384
- </View>
1121
+ <View style={[style.centerContent]}>
1122
+ {renderContent(customCenterItems, 'center')}
385
1123
  </View>
386
- {width >= BREAKPOINTS.md && <View style={style.rightContent}></View>}
387
- </View>
1124
+ {width >= BREAKPOINTS.md && (
1125
+ <View style={style.endContent}>
1126
+ {renderContent(customEndItems, 'end')}
1127
+ </View>
1128
+ )}
1129
+ </Toolbar>
388
1130
  );
389
1131
  };
390
1132
 
391
- type ControlsComponentsArrayProps = [
392
- (props: LocalAudioMuteProps) => JSX.Element,
393
- (props: LocalVideoMuteProps) => JSX.Element,
394
- (props: LocalSwitchCameraProps) => JSX.Element,
395
- (props: ScreenshareButtonProps) => JSX.Element,
396
- (props: RecordingButtonProps) => JSX.Element,
397
- (props: LocalEndcallProps) => JSX.Element,
398
- (props: LiveStreamControlsProps) => JSX.Element,
399
- ];
400
-
401
- export const ControlsComponentsArray: ControlsComponentsArrayProps = [
402
- LocalAudioMute,
403
- LocalVideoMute,
404
- LocalSwitchCamera,
405
- ScreenshareButton,
406
- Recording,
407
- LocalEndcall,
408
- LiveStreamControls,
409
- ];
410
-
411
1133
  const style = StyleSheet.create({
412
- container: {
413
- flexDirection: 'row',
414
- justifyContent: 'space-between',
415
- paddingTop: 10,
416
- paddingBottom: 16,
417
- backgroundColor: $config.TOOLBAR_COLOR,
418
- },
419
- leftContent: {
1134
+ startContent: {
420
1135
  flex: 1,
421
1136
  flexDirection: 'row',
422
1137
  justifyContent: 'flex-start',
@@ -429,8 +1144,25 @@ const style = StyleSheet.create({
429
1144
  justifyContent: 'center',
430
1145
  alignItems: 'center',
431
1146
  },
432
- rightContent: {
1147
+ endContent: {
433
1148
  flex: 1,
1149
+ flexDirection: 'row',
1150
+ justifyContent: 'flex-end',
1151
+ alignItems: 'center',
1152
+ },
1153
+ secondaryBtn: {marginLeft: 16, height: 40, paddingVertical: 5},
1154
+ primaryBtn: {
1155
+ maxWidth: 109,
1156
+ minWidth: 109,
1157
+ height: 40,
1158
+ borderRadius: 4,
1159
+ paddingVertical: 5,
1160
+ paddingHorizontal: 12,
1161
+ },
1162
+ primaryBtnText: {
1163
+ fontWeight: '600',
1164
+ fontSize: 16,
1165
+ paddingLeft: 0,
434
1166
  },
435
1167
  });
436
1168