agora-appbuilder-core 4.0.0-api.4 → 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 +3 -3
  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 +48 -26
  136. package/template/src/atoms/ToolbarPreset.tsx +38 -6
  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 +664 -56
  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 +9 -7
  165. package/template/src/components/Navbar.tsx +115 -46
  166. package/template/src/components/NavbarMobile.tsx +119 -0
  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 +9 -7
  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 -6
  283. package/template/src/pages/video-call/ActionSheet.tsx +55 -15
  284. package/template/src/pages/video-call/ActionSheetContent.tsx +495 -306
  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 +201 -82
  292. package/template/src/pages/video-call/VideoCallScreen.native.tsx +3 -2
  293. package/template/src/pages/video-call/VideoCallScreen.tsx +116 -41
  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
@@ -10,9 +10,9 @@
10
10
  *********************************************
11
11
  */
12
12
  module.exports = {
13
+ arrowParens: 'avoid',
14
+ bracketSameLine: true,
13
15
  bracketSpacing: false,
14
- jsxBracketSameLine: true,
15
16
  singleQuote: true,
16
17
  trailingComma: 'all',
17
- endOfLine:"auto"
18
18
  };
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import {StyleProp, ViewStyle} from 'react-native';
3
- import {RtcEngineEvents} from 'react-native-agora/lib/typescript/src/common/RtcEvents';
3
+ import {RtcEngineEvents} from 'react-native-agora/lib/typescript/common/RtcEvents';
4
4
  import {EncryptionMode} from 'react-native-agora';
5
5
  import {VideoProfile} from '../Utils/quality';
6
6
  import {UidType} from './RtcContext';
@@ -46,14 +46,26 @@ export const toggleHelper = (state: ToggleState) =>
46
46
  state === ToggleState.enabled ? ToggleState.disabled : ToggleState.enabled;
47
47
 
48
48
  export interface DefaultContentInterface {
49
+ //uikit and core
49
50
  uid: UidType;
50
51
  audio: ToggleState;
51
52
  video: ToggleState;
52
53
  streamType: 'high' | 'low';
53
54
  type: 'rtc';
54
55
  permissionStatus?: PermissionState;
56
+ localAudioForceDisabled?: boolean;
57
+ localVideoForceDisabled?: boolean;
55
58
  //applicable only to the screenshare
56
59
  parentUid?: UidType;
60
+ //uikit and core
61
+
62
+ //core only
63
+ name: string;
64
+ screenUid: number;
65
+ offline: boolean;
66
+ lastMessageTimeStamp: number;
67
+ isInWaitingRoom?: boolean;
68
+ //core only
57
69
  }
58
70
  export interface CustomContentInterface<T> {
59
71
  type: T extends DefaultContentInterface['type'] ? never : T;
@@ -110,10 +122,8 @@ export interface RtcPropsInterface {
110
122
  callActive?: boolean;
111
123
  encryption?: {
112
124
  key: string;
113
- mode:
114
- | EncryptionMode.AES128XTS
115
- | EncryptionMode.AES256XTS
116
- | EncryptionMode.AES128ECB;
125
+ mode: EncryptionMode.AES128GCM2 | EncryptionMode.AES128GCM2;
126
+ salt: number[];
117
127
  };
118
128
  // commented for v1 release
119
129
  // lifecycle?: {
@@ -123,10 +133,16 @@ export interface RtcPropsInterface {
123
133
  geoFencing?: boolean;
124
134
  audioRoom?: boolean;
125
135
  activeSpeaker?: boolean;
136
+ preventJoin?: boolean;
137
+
138
+ //core only
139
+ screenShareUid?: number;
140
+ screenShareToken?: string;
141
+ //core only
126
142
  }
127
143
 
128
144
  export interface CallbacksInterface {
129
- EndCall(): void; //?
145
+ EndCall(isHost: boolean, isTriggeredByHost: boolean): void; //?
130
146
  FullScreen(): void; //?
131
147
  SwitchCamera(): void; //Not in reducer
132
148
  UpdateDualStreamMode(mode: DualStreamMode): void;
@@ -136,8 +152,8 @@ export interface CallbacksInterface {
136
152
  DequeVideo(uid: UidType): void;
137
153
  UserMuteRemoteAudio(uid: UidType, muted: ContentInterface['audio']): void;
138
154
  UserMuteRemoteVideo(uid: UidType, muted: ContentInterface['video']): void;
139
- LocalMuteAudio(muted: ToggleState): void;
140
- LocalMuteVideo(muted: ToggleState): void;
155
+ LocalMuteAudio(muted: ToggleState, forceDisabled?: boolean): void;
156
+ LocalMuteVideo(muted: ToggleState, forceDisabled?: boolean): void;
141
157
  LocalPermissionState(
142
158
  permissionState: ContentInterface['permissionStatus'],
143
159
  ): void;
@@ -146,7 +162,10 @@ export interface CallbacksInterface {
146
162
  JoinChannelSuccess: RtcEngineEvents['JoinChannelSuccess'];
147
163
  UpdateRenderList(uid: UidType, user: Partial<ContentInterface>): void;
148
164
  AddCustomContent(uid: UidType, data: any): void;
165
+ RemoveCustomContent(uid: UidType): void;
149
166
  UserPin(Uid: UidType): void;
167
+ UserSecondaryPin(Uid: UidType): void;
168
+ ActiveSpeaker(Uid: UidType): void;
150
169
  }
151
170
 
152
171
  export type CustomCallbacksInterface = CallbacksInterface;
@@ -158,16 +177,17 @@ export interface PropsInterface {
158
177
  mode?: ChannelProfile;
159
178
  }
160
179
 
161
- const initialValue: PropsInterface = {
180
+ const initialValue: Partial<PropsInterface> = {
162
181
  rtcProps: {
163
182
  appId: '',
164
183
  channel: '',
165
184
  geoFencing: true,
166
185
  audioRoom: false,
186
+ preventJoin: true,
167
187
  },
168
188
  };
169
189
 
170
- const PropsContext = React.createContext<PropsInterface>(initialValue);
190
+ const PropsContext = React.createContext<Partial<PropsInterface>>(initialValue);
171
191
 
172
192
  export const PropsProvider = PropsContext.Provider;
173
193
  export const PropsConsumer = PropsContext.Consumer;
@@ -9,10 +9,29 @@ export interface ContentObjects {
9
9
  [key: number]: ContentInterface;
10
10
  }
11
11
 
12
+ type JSXElement = () => JSX.Element;
13
+ export interface CustomContentInferface {
14
+ uid: UidType;
15
+ component: boolean | React.ComponentType | JSXElement;
16
+ props: any;
17
+ onStage?: boolean; //true by default
18
+ }
19
+
20
+ export interface CustomContentObjects {
21
+ [key: number]: CustomContentInferface;
22
+ }
12
23
  export interface ContentStateInterface {
24
+ customContent?: CustomContentObjects;
25
+ setCustomContent: (
26
+ uid: CustomContentInferface['uid'],
27
+ component: CustomContentInferface['component'],
28
+ props?: CustomContentInferface['props'],
29
+ onStage?: CustomContentInferface['onStage'],
30
+ ) => void;
13
31
  defaultContent: ContentObjects;
14
32
  activeUids: Array<UidType>;
15
33
  pinnedUid?: UidType;
34
+ secondaryPinnedUid?: UidType;
16
35
  lastJoinedUid?: UidType;
17
36
  }
18
37
 
@@ -26,6 +26,7 @@ interface BtnTemplateBasicInterface {
26
26
  disabled?: boolean;
27
27
  }
28
28
  interface BtnTemplateInterfaceWithName extends BtnTemplateBasicInterface {
29
+ //@ts-ignore
29
30
  name?: keyof IconsInterface;
30
31
  }
31
32
  interface BtnTemplateInterfaceWithIcon extends BtnTemplateBasicInterface {
@@ -9,9 +9,41 @@ export interface IconsInterface {
9
9
  'demote-outlined': string;
10
10
  'lower-hand': string;
11
11
  'raise-hand': string;
12
+ 'white-board': string;
13
+ ains: string;
14
+ 'vb-blur': string;
15
+ 'vb-color': string;
16
+ 'vb-image': string;
17
+ vb: string;
18
+ 'turn-off-stt': string;
19
+ 'live-caption-mode': string;
20
+ done: string;
21
+ warning: string;
22
+ 'noise-cancellation': string;
23
+ 'whiteboard-new': string;
24
+ chat_attachment_pdf: string;
25
+ chat_attachment_image: string;
26
+ chat_attachment_doc: string;
27
+ chat_attachment_unknown: string;
12
28
  }
13
29
 
14
30
  const icons: IconsInterface = {
31
+ 'whiteboard-new':
32
+ 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAACXBIWXMAACE4AAAhOAFFljFgAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANWSURBVHgB7ZuBcdswDEWhXgdIN1C6QNNO4HSCbBB3gmYDuxPEncC+LuJs4GwgbxBvgAIVXcs2KQKU5MgS3h3PdzIBif8gUIQoAMMwjDQQMad2A8YxJModtQIPLFksMP5HTVUcNKEqkAAzjPMMY8RFj5Q5jA0a9Eoh0BuMCWX0iAX6AMNBm1d+w1igaHhAHQWOaTbD8LQe4hHGAg12ijoKGBNdR08W60AOJ/TDTvk3h+tmm2XZrcbgY+gPLJPYEkphhsIPUOIViMS5o581tSGthFcUPS+g5OwWc5GzgWGJw9ySQFtQ4ntQHFrkMKsUcZgjgVxCzmF4/JJ2dOkl+GdosfdG7Ql7UJ1LmNbnCt8zasu6Dhts4dmhKzDhoRCFSwo8FNqKuk4hepGTsMOHQqzcPXWdvEAPwA6XFHhSKqnr2EuBsL7OHCIpeq5VoGfUsVH4zsXj7aNAqK8UMncK/+vOBaIuN24grb+oQ12dmVkqfHvzWp2BWCA6PKG2QH9u4MeFn9iwaodp0ZMr/Bc+B3UGUYGwjBZNTphBIugJ/wji6JGOV22A+oTJFJgQTaij0J4j5KiRATZDFU2oYw5KQo4aGWC5LmsCR6AokSt8JtWZQ86qfVLei714ju3c8VeI80SNk3gO7TGHSyBRFMskvZ96OZoW1YjAcuaRTM0FRp52UUbyW4qQw/YM6k8+RdnyYImVaMLDLCm5ldk2+bkr5LQ9g/gFaNZQfNutFcLk0JCQ8/YMZBfBEbHA5uxv5xxaInSi9gx0FzPHBkAHqM+lNtBfUErZgllAB6jHqzZIvzBNNB3Nki1fRz8FcufiaOIXAb46eOGEmUCHSMabnRr4HNE7peg7/Ca4CNlHyY5Ot4MLIBlvLwR6LyTjHdIWvE4wgSKYQBFMoAgmUAQTKIIJFMEEijBagaQrKJFAOMzPGkVjOhVoG+g3hYHAkeOi5yHQ5bXOOFRs52re4zVFEl1rFmifXBUhVNo9ejt7ulidQLnLdczcV/dT+/ZJs0ATGCcFifO5esCXpHm7/kXqMT2Dv0D8fnrwTCC34foexiXSP3F8m8290zx15Ez+FcKz2lDg6YxTyjc35jOkn0NNqX2hJt7adkFSauZbKPcS/En5wMUwDMMwDMMw4C9ycj0K0Sb6NAAAAABJRU5ErkJggg==',
33
+ 'noise-cancellation':
34
+ 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAACXBIWXMAACE4AAAhOAFFljFgAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANxSURBVHgB7ZvxddowEMaPvv5fRlA2yAjuBMkGYYPSCeJMAJ0AMkGyAWzQdAKzAXSCr6dafjjGtiRbxgLu9949g5Fk+8vJOukUIkEQBEEQBEEQ/JlQBACY8uGRTZlTH9omk8mObhkWRrFt0MxKl/Fsc8G2N6JfLvwA92wZ7Ogy945tqlKbKV0qlQdxIbN5kmlzXaqjveiJxoRvYGZu5sGz3hr+bFrae0YPcQcDRy/YeNRR6M60oc15S539KALxRZPKjSSO9R7RnVlLu1r4t1LZDGN2MZyOPk5exOVSdCe1tD1F7jGaBQXgC3libuKZPyaVn7RHaVdXNBIcNx348IutOJ6PQpjSX6iJDC3xy5AeNAROHoS872dsKZstAFNs/8tj7GE2AD5dzDcyPdAV4CQQ9+01H+7YXtl2luJamBddnuu90oXj7EF64sg244/f2X42FCuESc0LMwqQT2vQpct7j2JGqCV/3FZ+2sYmTIm5Oc7IE2+BSrxYvo9OKSQpPCcxI7Gic4BjsJh51DnLMI88Ym8LSeYu7fTxIE0RjKUUJ4eW8zuKEZwxUEQ+P6tOZJfwWEzr60FRUzOg6O9zn4HkqgUqUQwgKXnylW4A9pgtdUxQ3IoHdUYEsiACWRCBLAQRCMeFtAyOOawhQD4pLaLnZ4oBnC7Ct2Y1cUwVdeHBci9ZpXxCPQnhQdOa76ql/Dt150/TD0YMVTn9jXoSQqCPmnNJU2ETxW7Jn7VlM4OqOfeXxgafUy0FK0udIVLPb9VKFAs4zZFZd1cg4OYF1GdrnbO9g4P61G/qUK+64eDkIeGwuIX6F3+QjEqQDVTGW/SiWdlr9LvmzmXmbES4N6bZsb171NXeoio/3UW1AavBE4Kkfztcd0WxYbpL3RKn09Jmx2v+QD2KYgTNq4XBM6y6zYZrpRQzfIO/G248mCe1eI5z8mA00B7jrPq4P/KYa9EkDmLtWlXwedJY9yBP8Fg4h31nyTi7yPoAe7S8Nx71ZASdlupOzbmZKdOW38ow4gpCL+A/pfBFv+8UXTrolwurQ3tUStcE7NMKV2FWuAavacIIpd8tGw9RdFk9tF/2vxd0AfnLuK4L6nOX+fINDU73XGsSigDJalgQgSyIQBZEIAsikAURyEIsAl3FrvxBQb53sGBJwikmqpboWRAEQRCC8A+7wtIN3wzWKgAAAABJRU5ErkJggg==',
35
+ warning:
36
+ 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAADNUlEQVR4Ae2c0W0TQRCG/zXxe0pwOoAOLh0kEkQ8kgpIKoioAKggvAEJUkwFuAPoADrABcQssxs7SqSsvXu3Mztx5pMsnew7Rxn/s9/tns+AYRiGYRiGYRiGYRjGtuCvMKHHLhTjoJBYtGtc0WZ38wSmGOPYHWIOZYygkWu8xap4AYcDeu4EClGXwNC2VKzfD7w0xw5eUAr/QBH6ErjA+8Qroa3PoQxVBfQXeEPj3cGaXTp/eae1FaCmhWPrLvCDCjhZu6OjFn4WW1mFUPQkMIhjU/ECPo6RaoSiIoFrxJFCjVB0JPDmnK8ENUJpXsAoDuA5ylEhlKYtnC2OFAqE0jaBueJIoUAozRLYQxxpdrDXSijtElgujnXv1UwoTQo4QBwpOv917QyGDfEWHiyOFI2EIp/AoeJI0UgoogmsKo4UwkKRTWC5OGb0EU+LjhAWilgBe4hj372ix0schu2C40SFItLCxeIgIVDh9u69xwW1vss/XkooMglc4IxFHCkEhcJewJg+H9tXmrP4t5nhT2Bo3VYICIW1gMtrHBO0g10obAWM7TOisa81I5xzfruBL4HS4kgTVq/ZPkiWAjYUR4oTGk5qLl7cwpPAluJI4ZIX7AdRvYAKxJGiW86GqlK1gGrEkYJSWFsodROoRxwpqgulWgEViiNFVaHUS2BNcXjs3p2GxW1XMdkVhVJlNSYOzq7ytCmsqHh8XG7XX8X2OHZH+ISBDC4g2zUOfubL1etBS17DW1i/OFJUEcqgBIpc4+DG08LrEX6hJ8MSyD/jKL8mUspAofQuIPuMIyRjdU2EtsFH57/0X73u1cLs4vD4Tm11bx3PX8a0d+Cht1D6JZBbHCP8hSy9hVKcQCFxzOkD2l8N7nHm4PAT/IRLqbOSA8oL+I2KJ3XaEm7xcnHy30GGWRh3Sw4oKiDLjEMbC5y61/iQu3t2AR/xjKOUIqHkS+TxzjhKKRJKVgIFB3FNZAklL4HbPu49TFYKNyZwefOz9HmZCiiBG+uTm0B1d4qz4/O+pLmxgNFGHu/wtAj/82nOjvmnMZ/JwGOSyT/dPwJRhTGmGn+fwTAMwzAMwzAMwzCMLeA/aQAlpfLwqQYAAAAASUVORK5CYII=',
37
+ vb: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAEfSURBVHgB7VNbEcIwELwwCCgOkIADggMcgAQcVAI4KBJAARLAQeugdXBc6KVzpE2a5Ls7szNtsrebywNgQSoQsSWe+XtLrIlvYsFjJ+xhNQXPD5q5gJD5kfgKmZsFxISMzD26cqq7LHNe7YVYmQ6Mzo5Lc9tdKGDK3IZK1CIkzpzFsmVrUOE0Xjx/k+cyF2DNS1HkQ+vU/A4dIroo2UDzfxsKkOazAcL8LMbunoDKNY/ZosGcCwth8Lf/YmuyHpo1vYg5jf0V1W4NJj40e+c1JAAnHpqaKTCrOhL3xB1xSzRjHbEhfohPpdSD9dpo6P8OER2UgdvjojZ6SGi1wjxcXS/lCUDIQ0fbs5EDK58Q8jC6pmuP8AD9oaaigQWp+AKsAoDF7uWeIAAAAABJRU5ErkJggg==',
38
+ 'vb-image':
39
+ 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAB20lEQVRIie2UPWsUURSGn2siwcRsdgU/EkjnT5BgsZVgxCaNCiqIIi4WRrD1F6RQxMKAgTRWahkIikktRtzSD1IpCIIEsfAjCQQei5zRyZDdmVjnheHcc+5733fuzLkXdrFTqJ/UEzE+pLbVp+reqF1Rv6rjkTfUl+ozdV8Vg4mIh9W36kK2UG2qi+qZnHhbfaXWona5iskR9V1evANvqiiurlcRf18UV/vVlno3Yr/aow7kxdULZQYfthEfVpfdxK+Iy+pwzF+qJB7k/DcfjPhE/aE2I29G/jjyO5m42igzyMSvqedjvKJOF3jT6kr2+SLW1Td53p6iQUppVW0BD4CPUV4DagVqDViNNb/VOrAAWLaDlrqWtWvU7qsb6g31aMQN9V7MD6mv46mXGfwVjz4/qA6o827FfNR74qAtqUNdxUM0L95WJ3NzY9ExY4U1FzNx9VwVk/3qLePKqAr1bPGgpQ7ElFIyOuo0cAo4BowAfcA68AVoAy+A59EcJ4GRlNKjMoM+4DZwEzgAfAeWgM8xbgCjwPEYf2Oz66ZSSt2vijCYiR85p06ovR14vTE/F/yHRU6nHfwEFoGrpW/zD7PAeEppsIpB98PSBSmlLZrbbh24/r8Gu9gx/gBohhCCgI16xQAAAABJRU5ErkJggg==',
40
+ 'vb-color':
41
+ 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAAvVBMVEUAAAAAAAAAAAAAAABAQEAgICAcHBwaGhogICAeHh4mGiYhISEfHx8eGB4aGh8eGR4cHCAeHiIdHSEbGx8fGx8eGiIeHiEdHSAdGiAdGh8cGh8cGh8cHB4bGyAcHCAdGx8cHB4eGx4dGx0dGx8bGx8cGh8bGh8bGyAdHB8dGx4cGx8cHB8cHB8cHB8cHB4bGx4bGx8cGiAbGx8cGyAcGh8cGh8cGx8cGyAcGyAcGyAcGx8dGx8cGx8cGx////9owITRAAAAPnRSTlMAAQIDBAgJChARFBcZKzIzNzw9QkJERUdhYmNkZWhvcnd5enuCioyer7K0tba3ubq8wcXJy8zOz9DR09bY2WCHnYUAAAABYktHRD5JZADjAAAAuklEQVQoz52R2RKCMAxFiyLu+4KCiiuKAm6oqOT/f0sMbaEwvnAfMpNzm9xpS0heSb3N0XtfduOayDt7oHotSgk+/UAsq8H5DATZFcq7QdhNFI0WgG3Ei/avUUiZFoCgicYI5zVFpyXUGg0TMjqg4fLdwLLuaDz4bp7lo/GMd7MsB41TNmP1J9yro6Gm+bUVXVB2k9S35lX2VIOA0bMkPrrBz7dFo2CwGT39gX2aM8x8rayajn9bSiS/vu5rPfA8hChsAAAAAElFTkSuQmCC',
42
+ 'vb-blur':
43
+ 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAABWUlEQVRIieWUP0oDYRDF36gRxMZOUQRbIZBIPICYxsZKm1SxtMoBvIBN0qRJrpDaY6iQwt5CCGiUFGLjv5+Fm2SyZDdfFATJg4VvmDdvZmeGkWYCwB6w7uxd4CAkdiEwx6KkeWd3JD2Hl/jXAOpA3dlVoOHsBlBN4nvMBea06EuyZwFAFshF7xpQc74SUI5x/QwGfCAHZPs+v6YZDVdxOZa/JddzM7sBzpzf8zOadj6AARWgDVwCpakEAhKcMIpPYD8kdrCmwA5QiN5NoOl4R7E4k3TsYgd8oADk+z4/gzcNZ/ASE3waU9yje3v+u6SPsb+TBGAb6LkW3QGrIbHB0wY29N2qV0ktM+v9OEH/rphZBShKOpW0EqN1JdXM7Nrz41qp5zqq+kLSUgKlCGylaaQCOGQy8mkak67praS0XnckPUxb+AiAzejWtIEucA9cAefA2q/E/wW+AK4bGrj694GPAAAAAElFTkSuQmCC',
44
+ ains: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYAgMAAACdGdVrAAAACVBMVEUAAAD///////9zeKVjAAAAA3RSTlMAZr+SD6biAAAAAWJLR0QB/wIt3gAAADVJREFUCNdjYEADjA5giqkBk2J0agRJMjU1NaBTjE5NTUBJIAfEhVJQQawaYIZhtQjmCCQAAMpYF99YsyCnAAAAAElFTkSuQmCC',
45
+ 'white-board':
46
+ 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAABeElEQVRIie3Uz4tNcRjH8c/XlRgjkiKzUNyr/EjK1n/g/5C/wI8F+ROklNjMjZKysrDT2GuahcjCxqCIJMKUppfFPeo6fWfuGZrdfDbn9Dzf8/48z3POeZINTVBpB7Avybkkp5IsJ3me5GYp5c1/u+EQPuMXnuEplvAVJ1d4poddXQ0OYojjY7EZvMewcn6AV1jG5X/t6gA+4E4ld8vfurQW8F5cw098xNGxXK+5bsHDMYMvXcC7G/D35l0MsX8sP8BLnK6YPJgEP4x3DXgW/VZ+gLcN7FvL5CqmJhncbcZxpJIbh2ubrKRNlVhJMt2GJ5lLMtM6O53kwqpVt0B9vMYL7Fil8j+amziWisl27FkXeMuoExw71xN+Ap9wD1u7wvtdx4JtuGi0Kq50Nbi+1pkbLcZHtVztM+1VYk+SnCml/GiBp3A+ybEkC107uDGpcpzFvNGPxmhVVLvbXInNJlls7peS3G5X3mgxyeMk90sp852q31BNvwGhl1TXx/9xfQAAAABJRU5ErkJggg==',
15
47
  profile:
16
48
  'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAYAAAB5fY51AAAACXBIWXMAACE4AAAhOAFFljFgAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAABxMSURBVHgB7d1PjFzFnQfwX1X3jGdIkDv4Yu/B00hxtJsE/8kl5DBmrI3kCGEwl3CIEXZMvIqWlfEhOYRI2FLIITnYSERRAGfGAg5wwfwRIVIQg31ZX+KxWXZXa6T0cIFD8LYFa49nuqu2fq+77Z7pP/O6+71X9aq+H2mYGccopv36O7/61e/VEwSwxsTvb5TrhUJpTMqyElQipctCyo2CqKRJlIh/Tety279San70U21+kBCiqltfa13hr7VS10iKitRUVVpXqVarLP10skIAbQRBkDiUaHxsxgRFqSALO6IgIr3T/E9lckvFJFyFg00ptSiFWFhRqrJyZHyBIDgILM+VZnVpuV6fqWtVbgQTzZB7oTQUU6ktaE0VreqXzLfzE8XiQvWQqBJ4C4HlEQ6npVptpzaVkpTF+xytmNJWMZf1glK1D4T5vPSTsXkCbyCwcqwVUKa/9JApN3aavtIMQSch5s1rs2CWv2+gCss3BFbOjD2/vFMKmpGF4kPmTcgV1HrNbljLBJiq195QmubRC8sXBJbjVlVRRAcJAZW0inkTzJuG/hksH92HwHJQK6SklI+ZJvl+QkhlpWreEGdN5frG9ceLZwmcg8ByyMQLKzMIKWdE4YXKyy0ILMs4pLDcc15j2bi8fALDrHYhsCzgJd+N2srBZuN8hiA3ePZLafXshCycxW5j9hBYGUI15ZXGkhFVV6YQWBmIgqpQeBrVlKeEmBdKPYtGffoQWClpW/Y91pyXAv9VNOkTS4eLcwSpQGAlLLp3j+ioVupJwrIvVFFw0fLKPJaLyUJgJQRBBV1UTM9yTi0tnUFwJQOBNSIEFcQQBdc40bPYWRwNAmtICCoYAnpcI0JgDeGOF2v7tRAnKbyjWyAZCK4hIbAGgPEESFhFLy/vQX8rPgRWDNHNyEqdFI2BT4BEmetqDgOo8SCw1nHHrH4afSrIQNU05k9dPyROEPSEwOohOjmhUDipMfQJ2cIysQ8E1hq8/LtJ9DQ1qioAO0y1pZeWnkVwrYbAatO8OXmWsPsHbsBu4hoILEJVBW5DU/624AMLVRXkRMVs/hwK/fTTYAMLVRXkkfnhejzkncQgA2tiVpel1q9jBxByKtidREmBmZzVR4VSFxFWkGNlMT5+cfJ0PbjVQTAVFpaA4CUpT20gOhHKKRBBBBYvAU1V9T6hsQ5+CmaJ6P2SkE9W4CUgIazAX9ESka918pzXgRXdByjE64T7AMF/Jb7W+Zonj3m5JIwO11PqpMbpChAgHjQdl/KYj30t7wILIwsAES/7Wl4FFprrAKt4F1re9LCiW2zQXAdoFzXj+b1BnvAisL7yR/2YkJIrKzTXAVYr8XvDlyHT3AcW74ooreYIAPo56cMOYq57WM3ji48TAMSS95uncxtYCCuA4eQ5tHIZWAgrgNHkNbRyF1h3nK7PYiAUIAFSnrpxSByjHMlVYE3O6pM4bQEgOTwVf/1w4RDlRG52CaMdDoQVQKJ4tZKn3cNcVFjoWQGkKy89LecDC2EFkI08hJbTgYWwAsiW66HlbGDx2eumZ3WKACBTUsiD//djcYYc5GRgNZ8V+D4BgBVmZbPHxWcgOhdYzSNi+NQF3MgMYE9VLy/vcu1oGqfGGtrOs0JYAdhVEuPj70/8/kaZHOJMhRU9hgvnWQE4RQixMC7EHleOW3amwlpS6iQhrACcwkeNLzfem05wIrB4fEHg/kAAJ7k0DW99ScjPUms+igsAHCa0fvj648WzZJHVwMKOIECuWN85tLYk5CY7dgQBciXaOeT3LlliLbBuEvGauEwAkCfl5nvXCitLQtx2A5B7x24cLmT+Hs48sNC3AvCClX5W5ktC9K0AvFCSGza8nnU/K9PAas5ylAkAco+HSrPuZ2W2JMQJDAB+yvJkh0wCq+2m5jIBgG8qG6TclcX9hkXKglJYCnpm4zjR1FcbH/x19GsbBJXM19Vloms3dfRri1+ar5dvfwYvtUYdUn9kWOoV1sTp2kFBYpYgt7bfRTS9RdCOTSL6eqsJqdI4DYyD7MOrJry+0HTJfD7/qabLVwk8kcXSMNXAwlIwn7hiOrBN0L6pRkANE05xcYid/4zorUVN50yAffIlQX6lvjRMdUlo0vAoIaxyoT2kdm+mzHAY7tvKH/yzU0Th9dIVHQUYlpC5k/rSMLUKq1ld/Y3AaRxOHFI/2iZSraQGxZXX2ya0fnURVVfepLk0TC2wJk/XOazKBE7ioPrFd2Sm1dSwXr6C4MoTPqX0+o/lLkpBKoGF5wm6ixvmz+/OR1CtheDKD/P+P2GqrOOUsMQDC/cKuol7VE98S9BTu5x/2Pe6njGhxR/gtKppwN+ddAM++VtzGjNXCCuHcDX17/ulF2HF+L/jv34oaTqHVWJASmmcBZ/oFYxGu1u4quI3N1dWvkK15bakG/CJVljNmStwAPeq/ny/9DqsWKva4v9ecI8oFBK9OTqxwOKJdsKuoBNaS0Ae+gzBVDOcsUR0kNYz/KAZSkhigSVIOPEYoNBxRfWuefO6NFOVhalAKso80kKcTOrcrEQCC9WVG3h59Jvvhv2G5f9+XzYXPFJeqtWepASM/DeLR8y7gd+keKPehma8cxIZcxi5wlrG/YLWIaw64TVxTimJKmukv1GcxmAf3pj9odJyyshV1kgVlvmXHyOElTW+TK6niV+fA18ncMPIVdbQVzuqK7vuuYvown5rz8HNFT6mZu87CocFumGkKmv4K17VZwhhZQUPSb72fYRVXDzx/6p5vTYGNurhqJGqrKGvesxd2cOnLUxhsnsg/Hq99s9YPrtASHl02LmsoQILc1f2cE8mj0fDuIDPpcdgqRNKN2srB2kIQwUWqis7eCmIJvto+PXDfYcOkIWjNISBA6t5X1CZIHN86wmMhvtYL0wj9B1Q5ocr04AGfgdos/4kyBw/IAJ9q2Tw0pAffAF2DXOSw0A/anDelR1cFfDpCwis5PCDXe89q/BkHssGPS9rsAqrcZooZIwbxQirZPHriQa8fULQQEfPxP4ba97kzNUVjj/OUOsgPgRW8ri6+sfXUGVZNtAgaewKa0nVOQkRVhl7FL2r1LQezAFWDTTiEDuwhBBotlvAzXZIDwLLAYXiQ3F/a6zA4mY7adpJkCnsDKaPq6wHphBaVmk9E3fEIV6FhWa7FaiusvFv3ySwLG7zPVZgmbfNDEGmuNmOW3CywXNZuDHaMiEfi/Pb1g2sZqlWJsgUeivZwuttXSnOsnD9CkvGSz5I1u4teANlCdWsfTJG1qwbWOZtk9gzxSAeXg6G8kxBV2BZaJ82WbPesTN9A6t5ozNmrzKG6sqOfdgttI0P9+s7jdA3sJQQsecjIDkP4sZcK7AstG+9ZWHfwMJy0I57NuEnvQ3TqGytW29Z2DOwmh17LAczxv0rDIvawa87+ljW9V0W9q6wsDtoxXZUV1ZNb8brb1u/IdKegYVhUTt2YHfQqvKdBLb1GSLtGlhfeX6ZS7IyQeawHLQLr78TSmONDOrQNbBqAtWVLVvvxJLEJgSWG4o9MqhrYMkBjnuAZJXQ9LUKPzAc0SODOgIr2lLUeobACjyCyi7sEjpC653dxhs6Amu9SVNIFyosu7AkdEbX8YaOwBr0UHgAgDR0y6LOHpYs7CCwAssRgDZdsqgzsNC/sgbLQYA2JovW9rFWBdYwj46G5PDDPQHgtrV9rFWBpUmj4Q4AzhBrMmlVYEkh7yOwqoqHelqFKtcxQs60f7u6hyUEKizL8BRiu/D6O0aIVY33W4HVbG6VCazCG8YuvP7OKbc33m8FFgZG3XD5c01gz+IXeP1dc71en2l93b4knCGwDj0Uu/D6u6egVbn19a3AEmvWimAH3jB2XfqcwDGibYD0doUlRZnAuvOfYkli04dX8fq7Rret/mTbr6KH5QCusDDaYAc33FHhOqnc+iIKrK/0ON0P7EDj3Q5Ut+6aeFFP8ecosLSUZQJnvP0JgQXnPiNwlVrZw5+iwFIat+S45BIqLCvOocJylhCNRw7K5ndlAmec/wx9rKxx7+ryVQJHtXYKZeMbOUXglJev4Kd9lt5exOvtMq311/izbH5TJnDKW3gDZeol/IBwW3NOtFFh4R5C5/CyEFvs2cByMBfK/A85MYvqylVYFmbjmb/idc4DHm2QVKuVCZz03EcazfeUcXV1/jMEVh7U1crXpBSiROAknrxGlZUuHhbF0jsfzOZgWarmfAO46XcfIbDS9MxFvL55IZUqSVLoYbmMf/qjykoHv66ornJEiLIUqLCc97ML6GUljYMK1VW+cFZJTehhuY57WVgaJgvVVf4IITdKTLnnA+8Y4g2WDFRX+cTT7pIgF7jKOnJOEYzuyDmEVR6Zv7WNJrA0loQ5wdPvz2FpOBJeWmPuKp8EN921RtM9T3gpg6XhcPh14w0MyC8sCXOGl4aP/EVh13BA/Hr94B0sqfNOCkKFlTd8o+6vcf/bQH6NytQHJa6wEFg59Nx/aux0xcSvE3p/XihhSZhj/EbEOU79cZMdwe4PBFbO/ct5jbPIe+DhUDTZ/YLA8sAj72k8GmwNDqsj5/Ga+AaB5QHeOdz7J41jlZsQVv5CYHkiGnd4D81l7lkhrPyFwPLMzy+E22Tm/270rPwmJk/X8TfsoQe2Ev32XklTXyXvVaNhWtxyEwKusKoE3uHH3fNkt+/NeL6/8ntnFcIqDFWpEVje4snue9/wc4nIVRUvf/eaUMYEezCq6GEFgAPrn15T3jzduFVVYXo9PAisQHAV8kOzi8hnQeW1IuE/9953UFUFS4iqFEJUCILx8seNaitPwcV/Tv7z8p8bvapwaaWqRTL/4NPdISwcXPxx4OuCnvi2oO13kXOiAwv/Q9NbnyCkoKFoLoVriKtwtYJrerOgR7cRTW8RVkchuJn+yhVNby7iicywmlkOVoqCtNklRGSFjsOBKxo+OfuBrYIenMouvBBSEIfW6lpRa6piRQjt3jZLMJ7j4vDafldjubh7C9H2TcksHfkAQv649PfG/8/ilwgpWB9nVdHUWRUC6OHyVR2Fy8sf83eNYOEQ2zhOUfU1dSdRyXy9cUPnT71rNxsPgF38olFFfXgV4QQj0LpSlOaa0qiwYAAcYuz8ql9FEEG6lJRVKZSqEACA46TWVVkfG8OtOQDgPlH8W7QYxIkNAOC6G4cLIro1x6RVhQAA3FXhf0SBJbReIAAAR2mzQ8ifWxXWNQIAcJRs3vPcCCytUGEBgLOUUov8ubEklBI7hQDgLCVEVFQ1zsOShXkCAHCUbs6L3ppxx2gDALiKRxr4860TRzHaAABOai4H2e0jkrX+gAAAXNNsuLPbFRZ2CgHAQbptTrTY+qIgZAVNLLeE8BBUF/DRN9eWCdw13/riVmCNFwrzN5UiyB4fiscfOzaJ6JTP1llTkC1+2MUn5oMfPnvpauMznwUGdk0UiwtLza9XnYQ1cbrOd0OXCVLFgbTDBNSBb8jokfJ8AB64iUPs/Kea3lrkh2EQZK9idgjvbn1TbP9fonsKhSgTpGL3ZqJ9U4J+tE0gpHIiOlXV/H0dMB+t8PrVRR1VYpABrS+1f7sqsJRWH0hR2E+QKA6qX3xHRp8hv9rD6+UrCK5MaDXf/u2qJz8LEtgpTNBWc4G/e7+MPhBWfuHQ+u8fSnp+WkR/z5AOvSaTVvWwSrO6ZBrv/0swEu5RPfEtQU/twmH5oXjGVFv8AclqTbi3dLyjJv+o3jfrxhmCodxjmumvfV9ily9A3OPa+47CMjEhWuv5pceLe9p/TXb8LlW/RDAUrqr+fD/CKlT8935hv4yuAxidIN2RRR2BpTWdJRjYb74rog/s/oWN2wF8HaAdMLpuWdQRWDykZT7hfKwBcOMVP1WhHQfWH6ZxTYyimUWrdARW9ZCott8dDf3xDiDvGAGs9eg2hNawuH8VZdEasttvVvXaGwTr4soK4wrQD0JrOEKrrhnUNbCK+vbNhtAd9ylQWUEcHFp8vUB8tR4Z1PNVnDxd53msEkEH7k+gqQqD+vkFTc99hFmtGFbdP9hO9vxXtDpD0IHnrBBWMAyusvhUDuhPUO8VXs/AwnhDJ74Fg4dCAYb1qrl+NmL0pS+lehdLPd99GG/o9EtTWWEoFEbB1w8q9L6qSz8Zm+/1P/YMLN5SNFuL2C1s4lIeTXZIAs/sTWN3uSvzDuu7suu/vtF6jiDyKpaCkKBfosrqqrZOkdT3XYhlYQNXVlgKQpL4KGxUWR2qy48Xh6+wsCxsQM8B0oAqa7X1loNs/XVO4MtCVFeQFlRZq/XbHWxZN7CaHftgl4VotEOaUGXdUum3O9gSr5Mc6BApz13hXkFIU+uxbqHrNyzaLlZghTpE+uAUfvpB+h5FFU9qeflEnN8XK7CiUk2IeQoMloOQhX1bKWxCLCz9dLIS57fGHi4K7cgZXg7ivi/IQujLQq3Vs3F/b+zAmiyOzVFAzfftm1BdQXamNwd7vVUnZCF2yyl2YEWn/wXUfEezHbJ03xYKEs9edTtZtJeB7jcJqfmOCguyFGr7IW6zvWWgwAqp+Y7+FWQpxB+Q0XMHYzbbWwa+o1fX6wMlYh7xZDse1wVZ4qZ7aI13RRS72d4ycGA1qizy+qk6W3ErDlgQ2C1glfVudO5mqDNTVL3udfN94wb0ryB7G8fDue406aFWakMFlu8jDlgOgg1Td1IoKkuHi3M0hKECKzp2RqmB158AAMNWV2zoYzQnisVThMP9AGAwFVpemachDR1YqLIAYFAmM84MOsrQbqSDylFlAcAAKlSrzdEIRgosVFkAENeo1RUb+VEwqLIAIIZKMytGMnJgocoCgPXwzuAgNzn3ksjD9prJWSEAgE5Dz12tlUhgcXIKrY8RAMAao8xdrZXY44yv831BAR6jDJCExS+Jzn+qyUOJVVcs0eevh3CSA0DSOKx+8I6KPvtGLy/voQQlGlh8koPWOshHggEMw+ewEkRzo44xrJVoYLGJQuFJyvmYA5fmPl5A4Bafw8qoDnqaaByJB5YPYw6eX0jgAN+vMc6ApKsrltoBPJN/VBdJ652UY3yg2rv3y9AOVoOUBfADsXLjcOFuSkHiFVaLacDnfswBlRYk7fJVou+d9fuaSrrR3i61wIqOUtb5n4DnC+tec4G9tejlljNk6OUrOvoBWF0mf+l0loItqQUW21AoHicPJuCvmQvskfc0PXMRoQXD4WvnyHntd1iZ97peqY18v2A/qQZWswF/iDzBFx1CCwbBAfXzC2FcNzzRnmZ1xTI59X7yxZVTJORR8gQ/s/DV76MZD/1xO+GRv6iob+U7nrm6friQenGSaoXV4svSsIUvQDTjoZ/znzWukRDCyqikMXPVTWbPFZp4YWVGSPk+eeapXSL6AGj53UeafnYhnNaBafvsiTbZMpBJhcV82TVcK2qmnsNkPDSWgHvfCS6sTmQVVizT0qA0q0s3tX4/7wOl3XA/6w/TgnZvQbUVIl4Ccr/K813AtVIbEO0lswqLRbuGQjxMHh6pHA2Z/gm7iKFp7QLu9X2+qlM1zQHRXqyUA5MvLD9JsnCSPIVbesLAVdWRc4Fuvqj6sRs/GU915qoba+sX30Ydunnim4L+9dsCweUZrqR+bSrp5z4KtJo2vegbj489SRZYC6yon6XURfNlmTzGYcW7iAe2obflA94B5GV/YMu/dpUNUu5K4oESw7D6LpqY1WXRCK0See6BrYJ+ey+qrbzi5d+v/qrN56B7lNy32pX2NHs/1n/s3/Fibb9pxL9OgTjwdUFPfQfBlRfBL//aCK0fjp7dYPPPQA6YeGHluJDyaQoEhxUvETFw6i4OKl7+8UfAy79bmvNWx8kyZ94xEy/W5oQQj1FA0N9yD4KqU1b3CcbhzDvF56HS9SC47ENQ9WS1yb6WU++QZhOe7zcsU4BawTW9BT2urCCo+qrwcKjNJvtazv1ID2nnsBcOq+nNaM6niU9ReOl/NL3yMYKqB+s7gt04uQbx9WSHYfA4xKPfELRvK0ECMJ4QT5YnMAzC2abJxOnaQUFiliDClRaH1xOYnB8YV1N8Jj+WfTFZuu0mDqe7vKGNO8TFy8VHtxF6XX1wML1yRdObi4RqagCujC/04vy2FEKrP4TXbXwT8tuLCKlhuR5WLBf76AiteLbfZXYYNxPtKwvavZm8x1XUh2a592ZFR72py1cRUsPKQ1ix3Az+ILQGUxonuscE2INT5vMmPwKsFVCXP29UUR9eRU8qCXkJK5arScUQp+GTxMtHfuLP7n9oLB/5a5fxEo8rp0t/11HjHAGVAotHxQwjd6PVIZyjlSVeRm414bVjk/naVGIbxxtBxhVaFjiU+EG1HEiLX2jz0fgay7v0aa3PLD1ePEg5kst7QbA8zMbUVxthxiHGATZ1Z/PX77x92Wzt0ujnALrWVglxEDU+N783IfXJl/wZoWRLnpaB7XJ78xpCC2A4eQ0rluu7bRFaAIPJc1ix3B8PgNACiCfvYcW8OM/E96fwAIxKkz60dLg4RznnzQFMzRum+ajlYE95AOiiaiqrh128kXkYXp0YF/p5WgBrOHee1agyffJz2pYOiYqWkp9GWyGAgAkhFnwLK+ZVYDEOLT7SlYfiCCBAfO2PC+FdWDGvDxHHDiKExoedwH68f+pB87mHfBAgmvHgs6rQ+pDt5wamLYjHtKAZD57zrrnei3c9rG5afS2+M50AfGKuab62QwgrFtyD8JpDptzXwhIR8qxKqn7C1bPX0xLkkzuxRIQ845EFdfPmw6FUVe2CWBKuxUvEG4cLd/OOCgHkiVkC+jqyEEfwz0Zv3tLDu4hlAnBXxfyAPeTLLTbDCrLCascXAE/HY9AUnNVqrAceViz4Cqtd8+Gt3JAvE4B9qKrWCL7CasfHb0T3ImL8AWxDVdUVKqwesJMINkQ7gPX6MQRVdwisdTTvR+Sn9GBuC9LE51Y96/N9gElAYMXA1RbV68fxTERIg3kTzo1Leax6SFQJ+kJgDQDLREiS2ZmeN/84geVffAisIWA3EUZUEVof8/1khTQgsEaA4IIBRX2qiWLxFJZ/w0Fgjag0q0tLtdqTpjHP/a0yAXRCUCUEgZWQqDFfMxUXggtuQ1AlDIGVsCi4VH0GS8WgIahSgsBKEXpcgdG0oHT9zGRxbA5BlQ4EVgb4XHlFdFQIMUPgHYwnZAeBlaG2AdSHCJPzeVclrc5oTWcRVNlBYFkQ7Syq+n6hxVHzN7CTIDe4mtJavYFlnx0ILMvaqq77CL0uV6GacgQCyyF8+ikJcRBLRidUNdFZUuoMQsodCCxHNRv1+xFemboVUhPF4gKWfO5BYOVAW+WFZWPybi33EFLuQ2DlzNjzyzuloBkh5EMYkxhK1TTOF7hxrjTNrxwZXyDIDQRWjjXvY9wpBO3XJHYgwLrjnT1B+hKqqPxDYHmGl4+a9E4S8j4pBI9MlCkgmh/cYCoos8z7QJBYQED5BYHluVYVZr6c0ULskCTKvsx+cTiZT/Na1S8VhKyolZWFUB8wGgoEVqC4FzYmZVlpU41JOWXWTSbIRFk4VpG1Kiaz3K1yMAkpq7S8Mo9gChMCCzpM/P5GmYrFsllSlpSgEildNn2ykhZyYxRsxBeOMN83xi1EY+xivdELHhm4vTTTusLfcxAJra6Z/lKVpKhI83lFqUqhXq8ilGCt/wedGY9rV99gfgAAAABJRU5ErkJggg==',
17
49
  'no-mic':
@@ -32,6 +64,19 @@ const icons: IconsInterface = {
32
64
  'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAADvSURBVHgB5ZRREcIwDIZbB5MQCZOABBxQCUMBSJgEHCBhczAJlTAJITmyo1dW2vTKC/x3ubVZky9JbzPmr4SInmySdcemCR7I7nFQmAhFAcxrAE7ilyBhJ75pBxCu+VxfC3FbpR8Ai2zzI5OEq4wAxAcZgJctmBJxuzFE/GsTQAqy+ZoAJPAggblxVQMAX/LRuHxrwFsnQWIsBtChkcwlACj30icgkEveR9VecV8pCJR0cMMyMeQYQfIAJYR1khj1z08NUUsJGUyNlJCLqVEhZNqDWAXE0QMSr2dr7cyF0Jrv40z70XxD+Px2nPkZPQCoHCglmaLpAgAAAABJRU5ErkJggg==',
33
65
  'raise-hand':
34
66
  'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAADxSURBVHgB5ZTtEYIwDIYD5391gzqBjIAbOIojsIFuoBs4AmyAG+AIblATDSdW+pFSf3g+d+81V0jeNrQA/BVa644EKcGCNapFFfqFQi1IvvxZgEfJ43wwR3HN8cqVnI9N8uoKRx6tXLGc2HbQUjKaLGEiuWVe8ejtcaxBMpIYYCvPqP1XDOjI4rBF7SRJPeUgri2x6oOxWpnNAMKhe/C43RliPpzaosb3QqzBFbVhgyNI0X6o7xdzEgQ7uIGdBp7/p7Ug52MHJ8fqO5ZJeKv0+/EMRYEETKgExSuIIdAk/AZbTOjE0DdpB0U71EHclp/kDilNkhWhg0nUAAAAAElFTkSuQmCC',
67
+ 'turn-off-stt':
68
+ 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAECSURBVHgBzVQLEcIwDE25CZgDhoNJQMJQADiYA4YCcDAsoIA6GChYHQAKSnJLj1LaXvncwbt710/SlyzpCvAP0FrnxBTHFbIPcMs+JfLMLF2NzI6KQ4OskVdPPMVjhTTZkeDRK2g57YUQCt7ECL6MJEFuQhGxF6ZJqRlS3TqeS2vf1K+HoZ5PUbQvE86Qulrzemo6bN2MPFmQ7TXbWxaskBveq3wHooLss0B2+o4DiYecHwSdS906vjt3zyCDMNbW/AKJiAkW9oKbIPHSSxj+ppcF5549ylRGzoQFMZMJhEEPhUYuY4KmTtRJBXGMkSefQdgLFGrA/6kuKPjsk0fkd7gBEy7vamLyRFEAAAAASUVORK5CYII=',
69
+ 'live-caption-mode':
70
+ 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAADUSURBVHgB5VPtDYIwEL0S/ssIHYERGEE3qBPoBuIGMgFsAk6iI7hBfadHUpsirZFfvOSlxx333RKtDmoUrLUax4nS8QDPSik+KXMMBqwoHUb4Qu4Z78i0pwRIZ8X4ndGfkVM4q8GhHdWFZwT90amGu+l836kKW0c+gCWCVfS5tJa+AQ412ItsA/YKvAX0PfvOVfgz8ikDso4tbcEdve9b4egNZqhiA/LV0SI38BsQiJfReP/EVRjanryEmmaw6Ay5gtKZUSw0eA0F7MS4oTQM4rtWPAFxAE4MEjNhpQAAAABJRU5ErkJggg==',
71
+ done: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAABDSURBVHgB1c3BDQAgCAPAjuIIbKQjuJmjOIKjICS+TBPCkyZ99QhAvahqs64M3lZhoxB8KH7Ax/7hgeC9oxlidoQ6ue+PS8aRUCPDAAAAAElFTkSuQmCC',
72
+ chat_attachment_pdf:
73
+ 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAFfSURBVHgB7ZU9S8NQGIVPShBsHRSKCpKY6qKLf0A7CCri4ioOOvozjH9A7Ci4uDjrqAgOFetSByenRImK3xZBB4fEN7lYzYfJzbVLS8+Qm/vm3PPkfpAAzS4pWDCvb004jpY00DQMSBnok8XiWpwvE6pwhNetNvSjcnkVqQAplQT5NyAJ0hBAHEQYIMtyJCTkg6AUVeXyNWyJ2gBh+T4VztKsSY2GFHqZW8Db+HS9X1AGfJnBU6R5V3UYmJkHnu+B6im7vzgHzirA4grw8Q7sbHrWjjsLcYo+ptkc8EThg0PA4wMLHxljwbku4GAPvPp7D0YpsFphIFfuxLMU3knwfC94FT0DN3R/ly1Jvg+YmAKuDOqf0EOH1YUAEi5pvOYBvt/cbbfWfzzHh74hn/0K4hT+4Vg3r9R0Q0w1OkU9vwtRe1CCoGzY28GaFGU0LWuD2Mvgn0mN4ksFRdHRcvoCpYdrkbRsJT8AAAAASUVORK5CYII=',
74
+ chat_attachment_doc:
75
+ 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAE4SURBVHgB7ZWxS8NAFMZ/KRHcrE6CJKR7B8eAFHRzdNXFUQc3cRMaoe4WHXT0P3B0cyhCdzeHRoiKi9gOglPihbPFJjG5nHVQ/CB5uceX93v3DhL47TKSCf/+0SeKnKIX/V4Po4K30mgc5PkqqYxC8ZE1xLvqdJqUApRUEeTbgCLIRAB5EG2AaZqZkJQPTVm2reSb2Ij+Adoa+1TMNSNfBIcS2nUHbNRfR+uatTBWM7kDJ76tL8LhKthVeZ2swbYrDXGM1zPTcn37PEWeMke05MBZF45FoS1XPltVCa7Pw84FDN5Q0pdnkCwQdzzsehi1Add30BIj2r+U3e8tw80TnHZlbH2MT0U/fsjpH07w8CKCYn8p9QVg9nMia0RtNBUSnidzRpbRD4Ijwd5EfSd9Ub5dsyyPP6d3/d5cbIF9MEYAAAAASUVORK5CYII=',
76
+ chat_attachment_image:
77
+ 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAFoSURBVHgB3ZSxSsNQFIb/pEFqLCrtIBQSdPUNHDq4+AaOpYtPYJcOQuIDKHZ0rE/gGzh0E5yk0CmhJkoVWksgaDBNTFssaXKT3MSC2B8Scs8953y5/00u8N/FBAOq/qLCdXeTClVFAcNCPqxUzuPy2FCEovk81YF8125LSAVIqSTIrwFJkKUA4iCZARzHESGhPGSUIIpUeUuz6M8AkRa1BjswxjnQaDM3Rq30SpyLXAFt86RcKosc21gY1/NV1NerNKXxANvS0Xs4gHK/j6F26ZthQDjGiIrcA8vsoN89wZelTcc/gKJwiovPmxnGMeGyG8gEeO4ch6zxQ3K2An7UgMsU8LF15kXz6QDB5n4I45oQ+cfpChiY4N8bQPmKmJ/pPxjo13jqd+fjCTBKJMBocivyZcRCjCF6b7P9KayVFmr9IlnU9C5JOrpFWjlwWsEY8VtTNc0zlK15j9ugk/fmTnNPEGSsnL4BS3qBidiHD9wAAAAASUVORK5CYII=',
78
+ chat_attachment_unknown:
79
+ 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAADXSURBVHgB7ZU9DoIwGIZfCBMuuhgSU4SDMHgSjyLeQI7g5mTiCRy4BzVBXWWREawLEWj6J4uGZyF8ffmetDQt8OtY3QK93inqOpB9SLMMlo14FUVbUc7uVRSaN9EK8TlNN9ASaCKTfC2QSQYRiCTGAsdxuJJeDoYQ31fKDbZEo8CY1lFxOJ4oKwXQYEkIPG/evIdk0erZmYFe8zfPshSOjz9ZV1BfoMnEdYXj/Qsnvz3YYwozCraLZp8F3hIlMKRCte/WLF6Q5vmOuddQn0nB2ichITH+jhcl6jxZhl+rzAAAAABJRU5ErkJggg==',
35
80
  };
36
81
 
37
82
  export default icons;
@@ -3,22 +3,24 @@ import PropsContext from '../../Contexts/PropsContext';
3
3
  import RtcContext from '../../Contexts/RtcContext';
4
4
  import BtnTemplate from '../BtnTemplate';
5
5
  import styles from '../../Style';
6
+ import DispatchContext from '../../Contexts/DispatchContext';
6
7
 
7
- interface EndCallProps{
8
- btnText?: string
8
+ interface EndCallProps {
9
+ btnText?: string;
9
10
  }
10
11
 
11
12
  function EndCall(props?: EndCallProps) {
12
13
  const {styleProps} = useContext(PropsContext);
13
14
  const {localBtnStyles} = styleProps || {};
14
15
  const {endCall} = localBtnStyles || {};
15
- const {dispatch} = useContext(RtcContext);
16
+ const {dispatch} = useContext(DispatchContext);
16
17
 
17
18
  return (
18
19
  <BtnTemplate
20
+ //@ts-ignore
19
21
  name={'callEnd'}
20
22
  btnText={props?.btnText || 'Hang Up'}
21
- color='#FD0845'
23
+ color="#FD0845"
22
24
  style={{...styles.endCall, ...(endCall as object)}}
23
25
  onPress={() =>
24
26
  dispatch({
@@ -3,14 +3,16 @@ import PropsContext from '../../Contexts/PropsContext';
3
3
  import RtcContext from '../../Contexts/RtcContext';
4
4
  import BtnTemplate from '../BtnTemplate';
5
5
  import styles from '../../Style';
6
+ import DispatchContext from '../../Contexts/DispatchContext';
6
7
 
7
8
  function FullScreen() {
8
9
  const {styleProps} = useContext(PropsContext);
9
10
  const {localBtnStyles} = styleProps || {};
10
11
  const {fullScreen} = localBtnStyles || {};
11
- const {dispatch} = useContext(RtcContext);
12
+ const {dispatch} = useContext(DispatchContext);
12
13
  return (
13
14
  <BtnTemplate
15
+ //@ts-ignore
14
16
  name={'fullscreen'}
15
17
  style={{...styles.localBtn, ...(fullScreen as object)}}
16
18
  onPress={() => {
@@ -22,6 +22,7 @@ function LocalAudioMute(props: LocalAudioMuteProps) {
22
22
 
23
23
  return (
24
24
  <BtnTemplate
25
+ //@ts-ignore
25
26
  name={local.audio === ToggleState.enabled ? 'mic' : 'micOff'}
26
27
  btnText={btnText}
27
28
  style={{
@@ -23,6 +23,7 @@ function LocalVideoMute(props: LocalVideoMuteProps) {
23
23
 
24
24
  return (
25
25
  <BtnTemplate
26
+ //@ts-ignore
26
27
  name={local.video === ToggleState.enabled ? 'videocam' : 'videocamOff'}
27
28
  btnText={btnText}
28
29
  style={{
@@ -17,6 +17,7 @@ function SwitchCamera(props?: Props) {
17
17
  const local = useContext(LocalContext);
18
18
  return (
19
19
  <BtnTemplate
20
+ //@ts-ignore
20
21
  name={'switchCamera'}
21
22
  style={{...styles.localBtn, ...(switchCamera as object)}}
22
23
  btnText={props?.btnText || 'Switch'}
@@ -20,6 +20,7 @@ const RemoteAudioMute: React.FC<RemoteAudioMuteInterface> = (props) => {
20
20
  const localUid = useLocalUid();
21
21
  return props.user.uid !== localUid ? (
22
22
  <BtnTemplate
23
+ //@ts-ignore
23
24
  name={props.user.audio === ToggleState.enabled ? 'mic' : 'micOff'}
24
25
  style={{...styles.leftRemoteBtn, ...(muteRemoteAudio as object)}}
25
26
  onPress={() => {
@@ -4,19 +4,21 @@ import BtnTemplate from '../BtnTemplate';
4
4
  import styles from '../../Style';
5
5
  import PropsContext from '../../Contexts/PropsContext';
6
6
  import useLocalUid from '../../Utils/useLocalUid';
7
+ import DispatchContext from '../../Contexts/DispatchContext';
7
8
 
8
9
  interface RemoteSwapInterface {
9
10
  uid: UidType;
10
11
  }
11
12
 
12
13
  const RemoteSwap: React.FC<RemoteSwapInterface> = (props) => {
13
- const {dispatch} = useContext(RtcContext);
14
+ const {dispatch} = useContext(DispatchContext);
14
15
  const {styleProps} = useContext(PropsContext);
15
16
  const {remoteBtnStyles} = styleProps || {};
16
17
  const {remoteSwap} = remoteBtnStyles || {};
17
18
  const localUid = useLocalUid();
18
19
  return (
19
20
  <BtnTemplate
21
+ //@ts-ignore
20
22
  name={'remoteSwap'}
21
23
  style={
22
24
  props.uid !== localUid
@@ -21,6 +21,7 @@ const RemoteVideoMute: React.FC<RemoteVideoMuteInterface> = (props) => {
21
21
  const localUid = useLocalUid();
22
22
  return props.user.uid !== localUid ? (
23
23
  <BtnTemplate
24
+ //@ts-ignore
24
25
  name={
25
26
  props.user.video === ToggleState.enabled ? 'videocam' : 'videocamOff'
26
27
  }
@@ -0,0 +1,30 @@
1
+ import {ActionType, ContentStateInterface} from '../Contexts/RtcContext';
2
+
3
+ export default function ActiveSpeaker(
4
+ state: ContentStateInterface,
5
+ action: ActionType<'ActiveSpeaker'>,
6
+ ) {
7
+ let localActiveUids = [...state.activeUids];
8
+ let pinnedUid = state.pinnedUid;
9
+ let secondaryPinnedUid = state.secondaryPinnedUid;
10
+ const activeSpeaker =
11
+ action?.value && action.value?.length ? action.value[0] : 0;
12
+ if (activeSpeaker) {
13
+ const filteredData = localActiveUids?.filter((i) => i !== activeSpeaker);
14
+ const [first, second, ...remaining] = filteredData;
15
+ if (pinnedUid && secondaryPinnedUid) {
16
+ localActiveUids = [first, second, activeSpeaker, ...remaining];
17
+ } else if (pinnedUid && !secondaryPinnedUid) {
18
+ localActiveUids = [first, activeSpeaker, second, ...remaining];
19
+ } else if (!pinnedUid && secondaryPinnedUid) {
20
+ localActiveUids = [activeSpeaker, second, first, ...remaining];
21
+ } else {
22
+ localActiveUids = [activeSpeaker, first, second, ...remaining];
23
+ }
24
+ console.log('debugging activeSpeaker ', activeSpeaker, localActiveUids);
25
+ }
26
+ return {
27
+ ...state,
28
+ activeUids: localActiveUids,
29
+ };
30
+ }
@@ -9,12 +9,14 @@ export default function LocalMuteAudio(
9
9
  action: ActionType<'LocalMuteAudio'>,
10
10
  localUid: UidType,
11
11
  ) {
12
- let stateUpdate: ContentStateInterface = {
12
+ let stateUpdate: Partial<ContentStateInterface> = {
13
13
  defaultContent: {
14
14
  ...state.defaultContent,
15
15
  [localUid]: {
16
16
  ...state.defaultContent[localUid],
17
17
  audio: action.value[0],
18
+ localAudioForceDisabled:
19
+ action?.value?.length === 2 ? action.value[1] : false,
18
20
  },
19
21
  },
20
22
  activeUids: [...state.activeUids],
@@ -9,12 +9,14 @@ export default function LocalMuteVideo(
9
9
  action: ActionType<'LocalMuteVideo'>,
10
10
  localUid: UidType,
11
11
  ) {
12
- let stateUpdate: ContentStateInterface = {
12
+ let stateUpdate: Partial<ContentStateInterface> = {
13
13
  defaultContent: {
14
14
  ...state.defaultContent,
15
15
  [localUid]: {
16
16
  ...state.defaultContent[localUid],
17
17
  video: action.value[0],
18
+ localVideoForceDisabled:
19
+ action?.value?.length === 2 ? action.value[1] : false,
18
20
  },
19
21
  },
20
22
  activeUids: [...state.activeUids],
@@ -9,7 +9,7 @@ export default function LocalPermissionState(
9
9
  action: ActionType<'LocalPermissionState'>,
10
10
  localUid: UidType,
11
11
  ) {
12
- let stateUpdate: ContentStateInterface = {
12
+ let stateUpdate: Partial<ContentStateInterface> = {
13
13
  defaultContent: {
14
14
  ...state.defaultContent,
15
15
  [localUid]: {
@@ -12,11 +12,11 @@ export default function RemoteAudioStateChanged(
12
12
  audioState = ToggleState.disabled;
13
13
  }
14
14
 
15
- const stateUpdate: ContentStateInterface = {
15
+ const stateUpdate: Partial<ContentStateInterface> = {
16
16
  defaultContent: {
17
17
  ...state.defaultContent,
18
- [action.value[0]]: {
19
- ...state.defaultContent[action.value[0]],
18
+ [action.value[0] as unknown as number]: {
19
+ ...state.defaultContent[action.value[0] as unknown as number],
20
20
  audio: audioState,
21
21
  },
22
22
  },
@@ -12,15 +12,16 @@ export default function RemoteVideoStateChanged(
12
12
  videoState = ToggleState.enabled;
13
13
  }
14
14
 
15
- const stateUpdate: ContentStateInterface = {
15
+ const stateUpdate: Partial<ContentStateInterface> = {
16
16
  defaultContent: {
17
17
  ...state.defaultContent,
18
- [action.value[0]]: {
19
- ...state.defaultContent[action.value[0]],
18
+ [action.value[0] as unknown as number]: {
19
+ ...state.defaultContent[action.value[0] as unknown as number],
20
20
  video:
21
+ //@ts-ignore
21
22
  videoState !== undefined
22
23
  ? videoState
23
- : state.defaultContent[action.value[0]].video,
24
+ : state.defaultContent[action.value[0] as unknown as number].video,
24
25
  },
25
26
  },
26
27
  activeUids: [...state.activeUids],
@@ -11,7 +11,7 @@ export default function UpdateDualStreamMode(
11
11
  ) {
12
12
  const newMode = action.value[0];
13
13
  let defaultContent = {...state.defaultContent};
14
- let stateUpdate: ContentStateInterface;
14
+ let stateUpdate: Partial<ContentStateInterface>;
15
15
  const setHighStreamType = (uid: UidType) => {
16
16
  defaultContent[uid].streamType = 'high';
17
17
  };
@@ -17,14 +17,17 @@ export default function UserJoined(
17
17
  let typeData = {
18
18
  type: 'rtc',
19
19
  };
20
- if (state.defaultContent[newUid] && 'type' in state.defaultContent[newUid]) {
21
- typeData.type = state.defaultContent[newUid].type;
20
+ if (
21
+ state.defaultContent[newUid as unknown as number] &&
22
+ 'type' in state.defaultContent[newUid as unknown as number]
23
+ ) {
24
+ typeData.type = state.defaultContent[newUid as unknown as number].type;
22
25
  }
23
26
 
24
27
  let defaultContent: ContentStateInterface['defaultContent'] = {
25
28
  ...state.defaultContent,
26
- [newUid]: {
27
- ...state.defaultContent[newUid],
29
+ [newUid as unknown as number]: {
30
+ ...state.defaultContent[newUid as unknown as number],
28
31
  uid: newUid,
29
32
  audio: ToggleState.disabled,
30
33
  video: ToggleState.disabled,
@@ -40,7 +43,7 @@ export default function UserJoined(
40
43
  //Only one remote and local is maximized
41
44
  //Change stream type to high if dualStreaMode is DYNAMIC
42
45
  if (dualStreamMode === DualStreamMode.DYNAMIC) {
43
- defaultContent[newUid].streamType = 'high';
46
+ defaultContent[newUid as unknown as number].streamType = 'high';
44
47
  }
45
48
  //Swap render positions
46
49
  stateUpdate = {
@@ -4,7 +4,7 @@ export default function UserMuteRemoteAudio(
4
4
  state: ContentStateInterface,
5
5
  action: ActionType<'UserMuteRemoteAudio'>,
6
6
  ) {
7
- let stateUpdate: ContentStateInterface = {
7
+ let stateUpdate: Partial<ContentStateInterface> = {
8
8
  defaultContent: {
9
9
  ...state.defaultContent,
10
10
  [action.value[0]]: {
@@ -4,7 +4,7 @@ export default function UserMuteRemoteVideo(
4
4
  state: ContentStateInterface,
5
5
  action: ActionType<'UserMuteRemoteVideo'>,
6
6
  ) {
7
- let stateUpdate: ContentStateInterface = {
7
+ let stateUpdate: Partial<ContentStateInterface> = {
8
8
  defaultContent: {
9
9
  ...state.defaultContent,
10
10
  [action.value[0]]: {
@@ -15,7 +15,7 @@ export default function UserOffline(
15
15
  const updatedActiveUids = [...state.activeUids].filter(
16
16
  (uid) => uid !== action.value[0],
17
17
  );
18
- const stateUpdate: ContentStateInterface = {
18
+ const stateUpdate: Partial<ContentStateInterface> = {
19
19
  defaultContent: state.defaultContent,
20
20
  activeUids: updatedActiveUids,
21
21
  };
@@ -4,8 +4,25 @@ export default function UserPin(
4
4
  state: ContentStateInterface,
5
5
  action: ActionType<'UserPin'>,
6
6
  ) {
7
+ let localActiveUids = [...state.activeUids];
8
+ let secondaryPinnedUid = state.secondaryPinnedUid;
9
+ const pinnedUid =
10
+ action?.value && action.value?.length ? action.value[0] : '';
11
+ if (pinnedUid) {
12
+ const filteredData = localActiveUids?.filter(
13
+ (i) => i !== pinnedUid && i !== secondaryPinnedUid,
14
+ );
15
+ if (secondaryPinnedUid && secondaryPinnedUid !== pinnedUid) {
16
+ filteredData.unshift(secondaryPinnedUid);
17
+ }
18
+ filteredData.unshift(pinnedUid);
19
+ localActiveUids = filteredData;
20
+ }
7
21
  return {
8
22
  ...state,
9
- pinnedUid: action?.value && action.value?.length ? action.value[0] : '',
23
+ pinnedUid,
24
+ secondaryPinnedUid:
25
+ pinnedUid === secondaryPinnedUid ? 0 : secondaryPinnedUid,
26
+ activeUids: localActiveUids,
10
27
  };
11
28
  }
@@ -0,0 +1,23 @@
1
+ import {ActionType, ContentStateInterface} from '../Contexts/RtcContext';
2
+
3
+ export default function UserSecondaryPin(
4
+ state: ContentStateInterface,
5
+ action: ActionType<'UserSecondaryPin'>,
6
+ ) {
7
+ let localActiveUids = [...state.activeUids];
8
+ const secondaryPinnedUid =
9
+ action?.value && action.value?.length ? action.value[0] : 0;
10
+ if (secondaryPinnedUid) {
11
+ const filteredData: any = localActiveUids?.filter(
12
+ (i) => i !== secondaryPinnedUid,
13
+ );
14
+ const [maxUid, ...minUids] = filteredData;
15
+ localActiveUids = [maxUid, secondaryPinnedUid, ...minUids];
16
+ }
17
+ return {
18
+ ...state,
19
+ secondaryPinnedUid,
20
+ pinnedUid: state?.pinnedUid === secondaryPinnedUid ? 0 : state?.pinnedUid,
21
+ activeUids: localActiveUids,
22
+ };
23
+ }
@@ -9,3 +9,5 @@ export {default as LocalPermissionState} from './LocalPermissionState';
9
9
  export {default as RemoteAudioStateChanged} from './RemoteAudioStateChanged';
10
10
  export {default as RemoteVideoStateChanged} from './RemoteVideoStateChanged';
11
11
  export {default as UserPin} from './UserPin';
12
+ export {default as UserSecondaryPin} from './UserSecondaryPin';
13
+ export {default as ActiveSpeaker} from './ActiveSpeaker';