agora-appbuilder-core 2.2.0 → 2.3.0-beta.2

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 (301) hide show
  1. package/Readme.md +7 -1
  2. package/package.json +4 -3
  3. package/template/Gulpfile.js +306 -87
  4. package/template/_gitignore +4 -1
  5. package/template/_package-lock.json +32186 -3078
  6. package/template/agora-rn-uikit/src/AgoraUIKit.tsx +23 -20
  7. package/template/agora-rn-uikit/src/Contexts/LocalUserContext.tsx +13 -8
  8. package/template/agora-rn-uikit/src/Contexts/PropsContext.tsx +25 -9
  9. package/template/agora-rn-uikit/src/Contexts/RenderContext.tsx +10 -0
  10. package/template/agora-rn-uikit/src/Contexts/RtcContext.tsx +11 -5
  11. package/template/agora-rn-uikit/src/Controls/BtnTemplate.tsx +6 -2
  12. package/template/agora-rn-uikit/src/Controls/ImageIcon.tsx +1 -1
  13. package/template/agora-rn-uikit/src/Controls/Local/EndCall.tsx +6 -2
  14. package/template/agora-rn-uikit/src/Controls/Local/LocalAudioMute.tsx +2 -2
  15. package/template/agora-rn-uikit/src/Controls/Local/LocalVideoMute.tsx +2 -2
  16. package/template/agora-rn-uikit/src/Controls/Local/SwitchCamera.tsx +6 -2
  17. package/template/agora-rn-uikit/src/Controls/LocalControls.tsx +11 -6
  18. package/template/agora-rn-uikit/src/Controls/Remote/RemoteAudioMute.tsx +10 -6
  19. package/template/agora-rn-uikit/src/Controls/Remote/RemoteSwap.tsx +7 -6
  20. package/template/agora-rn-uikit/src/Controls/Remote/RemoteVideoMute.tsx +6 -5
  21. package/template/agora-rn-uikit/src/Controls/RemoteControls.tsx +3 -3
  22. package/template/agora-rn-uikit/src/Reducer/LocalMuteAudio.ts +16 -13
  23. package/template/agora-rn-uikit/src/Reducer/LocalMuteVideo.ts +16 -13
  24. package/template/agora-rn-uikit/src/Reducer/RemoteAudioStateChanged.ts +13 -13
  25. package/template/agora-rn-uikit/src/Reducer/RemoteVideoStateChanged.ts +16 -13
  26. package/template/agora-rn-uikit/src/Reducer/UpdateDualStreamMode.ts +28 -31
  27. package/template/agora-rn-uikit/src/Reducer/UserJoined.ts +48 -35
  28. package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteAudio.ts +11 -13
  29. package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteVideo.ts +11 -13
  30. package/template/agora-rn-uikit/src/Reducer/UserOffline.ts +18 -15
  31. package/template/agora-rn-uikit/src/Rtc/Create.tsx +14 -2
  32. package/template/agora-rn-uikit/src/Rtc/Join.tsx +19 -3
  33. package/template/agora-rn-uikit/src/RtcConfigure.tsx +161 -44
  34. package/template/agora-rn-uikit/src/Utils/useLocalUid.ts +8 -0
  35. package/template/agora-rn-uikit/src/Views/MaxVideoView.native.tsx +8 -6
  36. package/template/agora-rn-uikit/src/Views/MaxVideoView.tsx +8 -6
  37. package/template/agora-rn-uikit/src/Views/MinVideoView.tsx +18 -9
  38. package/template/agora-rn-uikit/src/index.ts +12 -12
  39. package/template/babel.config.js +17 -1
  40. package/template/bridge/rtc/webNg/RtcEngine.ts +34 -28
  41. package/template/bridge/rtc/webNg/SurfaceView.tsx +3 -2
  42. package/template/bridge/rtc/webNg/Types.ts +14 -0
  43. package/template/bridge/rtc/webNg/index.ts +5 -2
  44. package/template/bridge/rtm/web/index.ts +13 -7
  45. package/template/electron-builder.js +3 -2
  46. package/template/esbuild.rsdk.go +226 -0
  47. package/template/{src/subComponents/LayoutEnum.tsx → esbuildConfigTransform.js} +1 -5
  48. package/template/fpe-api/components.ts +42 -0
  49. package/template/fpe-api/context.ts +45 -0
  50. package/template/fpe-api/fpeEvents.ts +9 -0
  51. package/template/fpe-api/index.ts +21 -0
  52. package/template/fpe-api/install.ts +128 -0
  53. package/template/fpe-api/typeDefinition.ts +143 -0
  54. package/template/fpe-api/useFpe.tsx +35 -0
  55. package/template/fpe-api/utils.ts +62 -0
  56. package/template/fpe-implementation/createHook.ts +33 -0
  57. package/template/fpe-implementation/dummyFpe.ts +17 -0
  58. package/template/fpe-implementation/index.ts +1 -0
  59. package/template/fpe-todo.txt +14 -0
  60. package/template/fpe.config.js +29 -0
  61. package/template/global.d.ts +4 -0
  62. package/template/index.rsdk.tsx +27 -0
  63. package/template/index.wsdk.tsx +27 -0
  64. package/template/package.json +28 -12
  65. package/template/react-native-toast-message/src/index.js +9 -10
  66. package/template/react-native-toast-message/src/index.wsdk.js +419 -0
  67. package/template/src/App.tsx +97 -65
  68. package/template/src/AppWrapper.tsx +79 -0
  69. package/template/src/SDKAppWrapper.tsx +67 -0
  70. package/template/src/atoms/PrimaryButton.tsx +14 -8
  71. package/template/src/atoms/TextInput.tsx +13 -5
  72. package/template/src/components/Chat.tsx +171 -139
  73. package/template/src/components/ChatContext.ts +14 -22
  74. package/template/src/components/ColorConfigure.tsx +2 -2
  75. package/template/src/components/Controls.native.tsx +72 -62
  76. package/template/src/components/Controls.tsx +90 -69
  77. package/template/src/components/DeviceConfigure.tsx +1 -1
  78. package/template/src/components/DeviceContext.tsx +14 -7
  79. package/template/src/components/GraphQLProvider.tsx +9 -2
  80. package/template/src/components/GridVideo.tsx +20 -159
  81. package/template/src/components/HostControlView.tsx +54 -15
  82. package/template/src/components/Navbar.tsx +408 -157
  83. package/template/src/components/NetworkQualityContext.tsx +29 -22
  84. package/template/src/components/ParticipantsView.tsx +91 -115
  85. package/template/src/components/PinnedVideo.tsx +41 -188
  86. package/template/src/components/Precall.native.tsx +131 -97
  87. package/template/src/components/Precall.tsx +193 -158
  88. package/template/src/components/RTMConfigure.tsx +328 -416
  89. package/template/src/components/Router.sdk.ts +20 -0
  90. package/template/src/components/SessionContext.tsx +6 -3
  91. package/template/src/components/Settings.native.tsx +3 -0
  92. package/template/src/components/Settings.tsx +65 -31
  93. package/template/src/components/SettingsView.tsx +14 -8
  94. package/template/src/components/Share.tsx +188 -220
  95. package/template/src/components/StorageContext.tsx +5 -5
  96. package/template/src/components/StoreToken.tsx +5 -1
  97. package/template/src/components/chat-messages/useChatMessages.tsx +208 -0
  98. package/template/src/components/chat-notification/useChatNotification.tsx +78 -0
  99. package/template/src/components/chat-ui/useChatUIControl.tsx +66 -0
  100. package/template/src/components/common/Error.tsx +54 -0
  101. package/template/src/components/common/Logo.tsx +35 -0
  102. package/template/src/components/common/index.tsx +8 -0
  103. package/template/src/components/contexts/LiveStreamDataContext.tsx +79 -0
  104. package/template/src/components/contexts/ScreenShareContext.tsx +47 -0
  105. package/template/src/components/contexts/WhiteboardContext.tsx +59 -0
  106. package/template/src/components/dimension/DimensionContext.ts +27 -0
  107. package/template/src/components/dimension/DimensionProvider.tsx +34 -0
  108. package/template/src/components/livestream/LiveStreamContext.tsx +293 -272
  109. package/template/src/components/livestream/Types.ts +26 -7
  110. package/template/src/components/livestream/index.ts +13 -2
  111. package/template/src/components/livestream/views/LiveStreamControls.tsx +5 -1
  112. package/template/src/components/meeting-info/useMeetingInfo.tsx +63 -0
  113. package/template/src/components/meeting-info/useSetMeetingInfo.tsx +38 -0
  114. package/template/src/components/participants/AllAudienceParticipants.tsx +26 -21
  115. package/template/src/components/participants/AllHostParticipants.tsx +41 -53
  116. package/template/src/components/participants/MeParticipant.tsx +9 -10
  117. package/template/src/components/participants/ParticipantName.tsx +2 -1
  118. package/template/src/components/participants/RemoteParticipants.tsx +3 -3
  119. package/template/src/components/precall/LocalMute.native.tsx +91 -0
  120. package/template/src/components/precall/LocalMute.tsx +90 -0
  121. package/template/src/components/precall/VideoPreview.native.tsx +35 -0
  122. package/template/src/components/precall/VideoPreview.tsx +33 -0
  123. package/template/src/components/precall/index.tsx +28 -0
  124. package/template/src/components/precall/joinCallBtn.native.tsx +69 -0
  125. package/template/src/components/precall/joinCallBtn.tsx +91 -0
  126. package/template/src/components/precall/meetingTitle.tsx +26 -0
  127. package/template/src/components/precall/selectDevice.tsx +46 -0
  128. package/template/src/components/precall/textInput.tsx +43 -0
  129. package/template/src/components/precall/usePreCall.tsx +41 -0
  130. package/template/src/components/styles.ts +20 -3
  131. package/template/src/components/useShareLink.tsx +239 -0
  132. package/template/src/components/useWakeLock.tsx +3 -3
  133. package/template/src/custom-events/CustomEvents.ts +221 -0
  134. package/template/src/custom-events/index.tsx +4 -0
  135. package/template/src/custom-events/types.ts +51 -0
  136. package/template/src/language/default-labels/commonLabels.ts +21 -0
  137. package/template/src/language/default-labels/createScreenLabels.ts +22 -0
  138. package/template/src/language/default-labels/index.ts +38 -0
  139. package/template/src/language/default-labels/joinScreenLabels.ts +13 -0
  140. package/template/src/language/default-labels/precallScreenLabels.ts +33 -0
  141. package/template/src/language/default-labels/shareLinkScreenLabels.ts +44 -0
  142. package/template/src/language/default-labels/videoCallScreenLabels.ts +189 -0
  143. package/template/src/language/i18nTypes.ts +10 -0
  144. package/template/src/language/index.ts +18 -0
  145. package/template/src/language/useLanguage.tsx +92 -0
  146. package/template/src/pages/Authenticate.tsx +21 -15
  147. package/template/src/pages/Create.tsx +176 -159
  148. package/template/src/pages/Join.tsx +44 -32
  149. package/template/src/pages/VideoCall.tsx +134 -406
  150. package/template/src/pages/create/useCreate.tsx +37 -0
  151. package/template/src/pages/video-call/CustomLayout.ts +17 -0
  152. package/template/src/pages/video-call/CustomUserContextHolder.tsx +12 -0
  153. package/template/src/pages/video-call/DefaultLayouts.ts +65 -0
  154. package/template/src/pages/video-call/NameWithMicStatus.tsx +62 -0
  155. package/template/src/pages/video-call/RenderComponent.tsx +52 -0
  156. package/template/src/pages/video-call/VideoCallScreen.tsx +191 -0
  157. package/template/src/pages/video-call/VideoComponent.tsx +34 -0
  158. package/template/src/pages/video-call/VideoRenderer.tsx +86 -0
  159. package/template/src/pages/video-call/index.ts +20 -0
  160. package/template/src/rtm/RTMEngine.ts +58 -0
  161. package/template/src/rtm/utils.ts +44 -0
  162. package/template/src/rtm-events/EventUtils.ts +267 -0
  163. package/template/src/rtm-events/EventsQueue.ts +38 -0
  164. package/template/src/rtm-events/constants.ts +40 -0
  165. package/template/src/rtm-events/index.tsx +8 -0
  166. package/template/src/rtm-events/types.ts +7 -0
  167. package/template/src/subComponents/ChatBubble.tsx +18 -11
  168. package/template/src/subComponents/ChatContainer.tsx +79 -30
  169. package/template/src/subComponents/ChatInput.tsx +146 -70
  170. package/template/src/subComponents/CopyJoinInfo.tsx +52 -67
  171. package/template/src/subComponents/Error.tsx +35 -24
  172. package/template/src/subComponents/LanguageSelector.tsx +85 -0
  173. package/template/src/subComponents/LayoutIconDropdown.native.tsx +163 -0
  174. package/template/src/subComponents/LayoutIconDropdown.tsx +198 -0
  175. package/template/src/subComponents/LocalAudioMute.tsx +52 -30
  176. package/template/src/subComponents/LocalEndCall.tsx +52 -0
  177. package/template/src/subComponents/LocalSwitchCamera.tsx +61 -0
  178. package/template/src/subComponents/LocalVideoMute.tsx +48 -30
  179. package/template/src/subComponents/LogoutButton.tsx +20 -5
  180. package/template/src/subComponents/NetworkQualityPill.tsx +43 -13
  181. package/template/src/subComponents/OpenInNativeButton.tsx +3 -2
  182. package/template/src/subComponents/Recording.tsx +46 -138
  183. package/template/src/subComponents/RemoteAudioMute.tsx +30 -34
  184. package/template/src/subComponents/RemoteEndCall.tsx +18 -7
  185. package/template/src/subComponents/RemoteVideoMute.tsx +17 -9
  186. package/template/src/subComponents/ScreenShareNotice.tsx +40 -40
  187. package/template/src/subComponents/SelectDevice.tsx +88 -45
  188. package/template/src/subComponents/SelectOAuth.tsx +30 -6
  189. package/template/src/subComponents/SidePanelButtons.ts +39 -0
  190. package/template/src/subComponents/TextWithTooltip.native.tsx +2 -1
  191. package/template/src/subComponents/TextWithTooltip.tsx +15 -20
  192. package/template/src/subComponents/chat/ChatParticipants.tsx +31 -32
  193. package/template/src/subComponents/livestream/ApprovedLiveStreamControlsView.tsx +7 -3
  194. package/template/src/subComponents/livestream/CurrentLiveStreamRequestsView.tsx +32 -18
  195. package/template/src/subComponents/livestream/controls/LocalRaiseHand.tsx +22 -8
  196. package/template/src/subComponents/livestream/controls/RemoteLiveStreamApprovedRequestRecall.tsx +12 -7
  197. package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestApprove.tsx +24 -27
  198. package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestReject.tsx +23 -26
  199. package/template/src/subComponents/livestream/index.ts +10 -2
  200. package/template/src/subComponents/recording/useRecording.tsx +209 -0
  201. package/template/src/subComponents/recording/useRecordingLayoutQuery.tsx +64 -0
  202. package/template/src/subComponents/screenshare/ScreenshareButton.native.tsx +18 -0
  203. package/template/src/subComponents/screenshare/ScreenshareButton.tsx +61 -31
  204. package/template/src/subComponents/screenshare/ScreenshareConfigure.native.tsx +57 -52
  205. package/template/src/subComponents/screenshare/ScreenshareConfigure.tsx +102 -143
  206. package/template/src/subComponents/screenshare/useScreenshare.tsx +29 -0
  207. package/template/src/subComponents/toastConfig.tsx +25 -20
  208. package/template/src/utils/IsAttendeeUser.ts +34 -0
  209. package/template/src/utils/SdkEvents.ts +68 -0
  210. package/template/src/utils/common.tsx +40 -0
  211. package/template/src/utils/eventEmitter.ts +29 -0
  212. package/template/src/utils/getMeetingInvite.ts +30 -0
  213. package/template/src/utils/index.tsx +11 -2
  214. package/template/src/utils/isAudioEnabled.ts +29 -0
  215. package/template/src/utils/isHostUser.ts +33 -0
  216. package/template/src/utils/isMobileOrTablet.native.ts +5 -0
  217. package/template/src/utils/{mobileWebTest.tsx → isMobileOrTablet.ts} +5 -2
  218. package/template/src/utils/isPSTNUser.ts +30 -0
  219. package/template/src/utils/isSDK.sdk.ts +5 -0
  220. package/template/src/utils/isSDK.ts +5 -0
  221. package/template/src/utils/isScreenShareUser.ts +31 -0
  222. package/template/src/utils/isVideoEnabled.ts +29 -0
  223. package/template/src/utils/useButtonTemplate.tsx +43 -0
  224. package/template/src/utils/useCreateMeeting.ts +74 -0
  225. package/template/src/utils/useGetLiveStreamingRequests.ts +24 -0
  226. package/template/src/utils/useGetMeetingPhrase.ts +68 -0
  227. package/template/src/utils/useGetName.ts +20 -0
  228. package/template/src/{subComponents/screenshare/ScreenshareContext.tsx → utils/useGroupMessages.ts} +10 -7
  229. package/template/src/utils/useJoinMeeting.ts +120 -0
  230. package/template/src/utils/useLayout.tsx +40 -0
  231. package/template/src/utils/useLiveStreamingUids.ts +26 -0
  232. package/template/src/utils/useMutePSTN.ts +43 -0
  233. package/template/src/utils/useMuteToggleLocal.ts +109 -0
  234. package/template/src/utils/useNavParams.ts +6 -0
  235. package/template/src/utils/useNavigateTo.ts +8 -0
  236. package/template/src/utils/usePrivateMessages.ts +33 -0
  237. package/template/src/utils/useRemoteEndCall.ts +27 -0
  238. package/template/src/utils/useRemoteMute.ts +64 -0
  239. package/template/src/utils/useSendControlMessage.ts +51 -0
  240. package/template/src/utils/useSendMessage.ts +40 -0
  241. package/template/src/utils/useSetName.ts +20 -0
  242. package/template/src/utils/useSetUnreadMessageCount.ts +43 -0
  243. package/template/src/utils/useSidePanel.tsx +41 -0
  244. package/template/src/utils/useString.ts +61 -0
  245. package/template/src/utils/useUnreadMessageCount.ts +50 -0
  246. package/template/src/utils/useUserList.ts +26 -0
  247. package/template/tsconfig.json +4 -4
  248. package/template/tsconfig_fpeApi.json +103 -0
  249. package/template/tsconfig_rsdk_index.json +105 -0
  250. package/template/tsconfig_wsdk_index.json +104 -0
  251. package/template/webpack.commons.js +40 -16
  252. package/template/webpack.main.config.js +2 -1
  253. package/template/webpack.renderer.config.js +1 -1
  254. package/template/webpack.rsdk.config.js +33 -0
  255. package/template/webpack.ts.config.js +89 -0
  256. package/template/webpack.web.config.js +8 -1
  257. package/template/webpack.wsdk.config.js +34 -0
  258. package/template/agora-rn-uikit/.git/HEAD +0 -1
  259. package/template/agora-rn-uikit/.git/config +0 -16
  260. package/template/agora-rn-uikit/.git/description +0 -1
  261. package/template/agora-rn-uikit/.git/hooks/applypatch-msg.sample +0 -15
  262. package/template/agora-rn-uikit/.git/hooks/commit-msg.sample +0 -24
  263. package/template/agora-rn-uikit/.git/hooks/fsmonitor-watchman.sample +0 -173
  264. package/template/agora-rn-uikit/.git/hooks/post-update.sample +0 -8
  265. package/template/agora-rn-uikit/.git/hooks/pre-applypatch.sample +0 -14
  266. package/template/agora-rn-uikit/.git/hooks/pre-commit.sample +0 -49
  267. package/template/agora-rn-uikit/.git/hooks/pre-merge-commit.sample +0 -13
  268. package/template/agora-rn-uikit/.git/hooks/pre-push.sample +0 -53
  269. package/template/agora-rn-uikit/.git/hooks/pre-rebase.sample +0 -169
  270. package/template/agora-rn-uikit/.git/hooks/pre-receive.sample +0 -24
  271. package/template/agora-rn-uikit/.git/hooks/prepare-commit-msg.sample +0 -42
  272. package/template/agora-rn-uikit/.git/hooks/push-to-checkout.sample +0 -78
  273. package/template/agora-rn-uikit/.git/hooks/update.sample +0 -128
  274. package/template/agora-rn-uikit/.git/index +0 -0
  275. package/template/agora-rn-uikit/.git/info/exclude +0 -6
  276. package/template/agora-rn-uikit/.git/logs/HEAD +0 -2
  277. package/template/agora-rn-uikit/.git/logs/refs/heads/ab-dev-auto +0 -1
  278. package/template/agora-rn-uikit/.git/logs/refs/heads/master +0 -1
  279. package/template/agora-rn-uikit/.git/logs/refs/remotes/origin/HEAD +0 -1
  280. package/template/agora-rn-uikit/.git/objects/pack/pack-0061d00cd98162a329a32b537488a35d0abeb069.idx +0 -0
  281. package/template/agora-rn-uikit/.git/objects/pack/pack-0061d00cd98162a329a32b537488a35d0abeb069.pack +0 -0
  282. package/template/agora-rn-uikit/.git/packed-refs +0 -24
  283. package/template/agora-rn-uikit/.git/refs/heads/ab-dev-auto +0 -1
  284. package/template/agora-rn-uikit/.git/refs/heads/master +0 -1
  285. package/template/agora-rn-uikit/.git/refs/remotes/origin/HEAD +0 -1
  286. package/template/agora-rn-uikit/.gitignore +0 -63
  287. package/template/agora-rn-uikit/package-lock.json +0 -7612
  288. package/template/agora-rn-uikit/src/Contexts/MaxUidContext.tsx +0 -7
  289. package/template/agora-rn-uikit/src/Contexts/MinUidContext.tsx +0 -8
  290. package/template/package-lock.json +0 -22923
  291. package/template/react-native-toast-message/.gitignore +0 -5
  292. package/template/react-native-toast-message/.npmignore +0 -5
  293. package/template/react-native-toast-message/package-lock.json +0 -10553
  294. package/template/src/.DS_Store +0 -0
  295. package/template/src/components/participants/context/ParticipantContext.tsx +0 -97
  296. package/template/src/subComponents/.DS_Store +0 -0
  297. package/template/src/subComponents/ScreenshareButton.tsx +0 -257
  298. package/template/src/subComponents/SwitchCamera.tsx +0 -35
  299. package/template/src/utils/hasBrandLogo.tsx +0 -3
  300. package/template/src/utils/mobileWebTest.native.tsx +0 -5
  301. package/template/src/utils/shouldAuthenticate.tsx +0 -7
@@ -3,8 +3,7 @@ import {ScrollView, View} from 'react-native';
3
3
  import RtcConfigure from './RtcConfigure';
4
4
  import MaxVideoView from './Views/MaxVideoView';
5
5
  import MinVideoView from './Views/MinVideoView';
6
- import {MinUidConsumer} from './Contexts/MinUidContext';
7
- import {MaxUidConsumer} from './Contexts/MaxUidContext';
6
+ import {RenderConsumer} from './Contexts/RenderContext';
8
7
  import {PropsProvider, PropsInterface} from './Contexts/PropsContext';
9
8
 
10
9
  import styles from './Style';
@@ -17,24 +16,28 @@ const AgoraUIKit: React.FC<PropsInterface> = (props) => {
17
16
  <PropsProvider value={props}>
18
17
  <View style={{backgroundColor: '#000', flex: 1}}>
19
18
  <RtcConfigure>
20
- <MaxUidConsumer>
21
- {(maxUsers) => (
22
- <MaxVideoView user={maxUsers[0]} key={maxUsers[0].uid} />
23
- )}
24
- </MaxUidConsumer>
25
-
26
- <ScrollView
27
- showsHorizontalScrollIndicator={false}
28
- horizontal={true}
29
- style={styles.minContainer}>
30
- <MinUidConsumer>
31
- {(minUsers) =>
32
- minUsers.map((user) => (
33
- <MinVideoView showOverlay user={user} key={user.uid} />
34
- ))
35
- }
36
- </MinUidConsumer>
37
- </ScrollView>
19
+ <RenderConsumer>
20
+ {({renderList, renderPosition}) => {
21
+ const [maxUid, ...minUids] = renderPosition;
22
+ return (
23
+ <>
24
+ <MaxVideoView user={renderList[maxUid]} key={maxUid} />
25
+ <ScrollView
26
+ showsHorizontalScrollIndicator={false}
27
+ horizontal={true}
28
+ style={styles.minContainer}>
29
+ {minUids.map((minUid) => (
30
+ <MinVideoView
31
+ showOverlay
32
+ user={renderList[minUid]}
33
+ key={minUid}
34
+ />
35
+ ))}
36
+ </ScrollView>
37
+ </>
38
+ );
39
+ }}
40
+ </RenderConsumer>
38
41
  <LocalControls />
39
42
  </RtcConfigure>
40
43
  </View>
@@ -1,21 +1,26 @@
1
1
  import React, {useContext, createContext} from 'react';
2
- import MaxUidContext from './MaxUidContext';
3
- import MinUidContext from './MinUidContext';
4
- import {UidInterface} from './PropsContext';
2
+ import RenderContext from './RenderContext';
3
+ import {RenderInterface} from './PropsContext';
4
+ import {UidType} from './RtcContext';
5
5
 
6
- export const LocalContext = createContext<UidInterface>({} as UidInterface);
6
+ export const LocalContext = createContext<RenderInterface>(
7
+ {} as RenderInterface,
8
+ );
7
9
  export const LocalProvider = LocalContext.Provider;
8
10
  export const LocalConsumer = LocalContext.Consumer;
9
11
 
10
12
  interface LocalUserContextInterface {
11
13
  children: React.ReactNode;
14
+ localUid: UidType;
12
15
  }
13
16
 
14
17
  const LocalUserContext: React.FC<LocalUserContextInterface> = (props) => {
15
- const max = useContext(MaxUidContext);
16
- const min = useContext(MinUidContext);
17
- // if(min && min[0] && max )
18
- let localUser: UidInterface = max[0].uid === 'local' ? max[0] : min[0];
18
+ const {renderList} = useContext(RenderContext);
19
+ let localUser: RenderInterface = renderList[props?.localUid];
20
+ if (!localUser) {
21
+ console.error("Error: we couldn't find the local user data");
22
+ return null;
23
+ }
19
24
  return (
20
25
  <LocalContext.Provider value={localUser}>
21
26
  {props.children}
@@ -3,6 +3,7 @@ import {StyleProp, ViewStyle} from 'react-native';
3
3
  import {RtcEngineEvents} from 'react-native-agora/lib/typescript/src/common/RtcEvents';
4
4
  import {EncryptionMode} from 'react-native-agora';
5
5
  import {VideoProfile} from '../Utils/quality';
6
+ import {UidType} from './RtcContext';
6
7
 
7
8
  /* User role for live streaming mode */
8
9
  export enum ClientRole {
@@ -34,13 +35,20 @@ export enum ToggleState {
34
35
  export const toggleHelper = (state: ToggleState) =>
35
36
  state === ToggleState.enabled ? ToggleState.disabled : ToggleState.enabled;
36
37
 
37
- export interface UidInterface {
38
- // TODO: refactor local to 0 and remove string.
39
- uid: number | string;
38
+ export interface DefaultRenderInterface {
39
+ uid: UidType;
40
40
  audio: ToggleState;
41
41
  video: ToggleState;
42
42
  streamType: 'high' | 'low';
43
+ type: 'rtc';
43
44
  }
45
+ export interface CustomRenderInterface<T> {
46
+ type: T extends DefaultRenderInterface['type'] ? never : T;
47
+ }
48
+ interface ExtenedRenderInterface extends CustomRenderInterface<string> {
49
+ [key: string]: any;
50
+ }
51
+ export type RenderInterface = DefaultRenderInterface | ExtenedRenderInterface;
44
52
 
45
53
  interface remoteBtnStylesInterface {
46
54
  muteRemoteAudio?: StyleProp<ViewStyle>;
@@ -78,7 +86,7 @@ export enum DualStreamMode {
78
86
  export interface RtcPropsInterface {
79
87
  appId: string;
80
88
  channel: string;
81
- uid?: number;
89
+ uid?: UidType;
82
90
  token?: string | null;
83
91
  dual?: boolean | null;
84
92
  profile?: VideoProfile;
@@ -92,7 +100,12 @@ export interface RtcPropsInterface {
92
100
  | EncryptionMode.AES256XTS
93
101
  | EncryptionMode.AES128ECB;
94
102
  };
95
- geoFencing?: boolean
103
+ // commented for v1 release
104
+ // lifecycle?: {
105
+ // useBeforeJoin?: () => () => Promise<void>;
106
+ // useBeforeCreate?: () => () => Promise<void>;
107
+ // };
108
+ geoFencing?: boolean;
96
109
  }
97
110
 
98
111
  export interface CallbacksInterface {
@@ -102,14 +115,17 @@ export interface CallbacksInterface {
102
115
  UpdateDualStreamMode(mode: DualStreamMode): void;
103
116
  UserJoined: RtcEngineEvents['UserJoined'];
104
117
  UserOffline: RtcEngineEvents['UserOffline'];
105
- SwapVideo(user: UidInterface): void;
106
- UserMuteRemoteAudio(user: UidInterface, muted: UidInterface['audio']): void;
107
- UserMuteRemoteVideo(user: UidInterface, muted: UidInterface['video']): void;
118
+ SwapVideo(uid: UidType): void;
119
+ DequeVideo(uid: UidType): void;
120
+ UserMuteRemoteAudio(uid: UidType, muted: RenderInterface['audio']): void;
121
+ UserMuteRemoteVideo(uid: UidType, muted: RenderInterface['video']): void;
108
122
  LocalMuteAudio(muted: ToggleState): void;
109
123
  LocalMuteVideo(muted: ToggleState): void;
110
124
  RemoteAudioStateChanged: RtcEngineEvents['RemoteAudioStateChanged'];
111
125
  RemoteVideoStateChanged: RtcEngineEvents['RemoteVideoStateChanged'];
112
126
  JoinChannelSuccess: RtcEngineEvents['JoinChannelSuccess'];
127
+ UpdateRenderList(uid: UidType, user: Partial<RenderInterface>): void;
128
+ AddCustomContent(uid: UidType, data: any): void;
113
129
  }
114
130
 
115
131
  export type CustomCallbacksInterface = CallbacksInterface;
@@ -125,7 +141,7 @@ const initialValue: PropsInterface = {
125
141
  rtcProps: {
126
142
  appId: '',
127
143
  channel: '',
128
- geoFencing: true
144
+ geoFencing: true,
129
145
  },
130
146
  };
131
147
 
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ import {RenderStateInterface} from './RtcContext';
3
+
4
+ const RenderContext = React.createContext<RenderStateInterface>(
5
+ {} as RenderStateInterface,
6
+ );
7
+
8
+ export const RenderProvider = RenderContext.Provider;
9
+ export const RenderConsumer = RenderContext.Consumer;
10
+ export default RenderContext;
@@ -1,11 +1,17 @@
1
- import React, {Dispatch} from 'react';
1
+ import React from 'react';
2
2
  import {CallbacksInterface} from './PropsContext';
3
3
  import RtcEngine from 'react-native-agora';
4
- import type {DualStreamMode, UidInterface} from './PropsContext';
4
+ import type {DualStreamMode, RenderInterface} from './PropsContext';
5
5
 
6
- export interface UidStateInterface {
7
- min: Array<UidInterface>;
8
- max: Array<UidInterface>;
6
+ export type UidType = number;
7
+
8
+ export interface RenderObjectInterface {
9
+ [key: number]: RenderInterface;
10
+ }
11
+
12
+ export interface RenderStateInterface {
13
+ renderList: RenderObjectInterface;
14
+ renderPosition: Array<UidType>;
9
15
  }
10
16
 
11
17
  export interface ActionInterface<T extends keyof CallbacksInterface> {
@@ -28,7 +28,7 @@ interface BtnTemplateInterfaceWithName extends BtnTemplateBasicInterface {
28
28
  interface BtnTemplateInterfaceWithIcon extends BtnTemplateBasicInterface {
29
29
  icon?: any;
30
30
  }
31
- type BtnTemplateInterface = Either<
31
+ export type BtnTemplateInterface = Either<
32
32
  BtnTemplateInterfaceWithIcon,
33
33
  BtnTemplateInterfaceWithName
34
34
  >;
@@ -62,7 +62,11 @@ const BtnTemplate: React.FC<BtnTemplateInterface> = (props) => {
62
62
  tintColor: disabled ? 'grey' : props.color || theme || '#fff',
63
63
  }}
64
64
  resizeMode={'contain'}
65
- source={{uri: props.name ? icons[props.name] : props.icon}}
65
+ source={
66
+ props.name && icons[props.name]
67
+ ? {uri: icons[props.name]}
68
+ : props.icon
69
+ }
66
70
  />
67
71
  </View>
68
72
  <Text
@@ -49,7 +49,7 @@ const ImageIcon: React.FC<ImageIconInterface> = (props) => {
49
49
  props.style as object,
50
50
  ]}
51
51
  resizeMode={'contain'}
52
- source={{uri: props.name ? icons[props.name] : props.icon}}
52
+ source={props.name && icons[props.name] ? {uri: icons[props.name] } : props.icon}
53
53
  />
54
54
  );
55
55
  };
@@ -4,7 +4,11 @@ import RtcContext from '../../Contexts/RtcContext';
4
4
  import BtnTemplate from '../BtnTemplate';
5
5
  import styles from '../../Style';
6
6
 
7
- function EndCall() {
7
+ interface EndCallProps{
8
+ btnText?: string
9
+ }
10
+
11
+ function EndCall(props?: EndCallProps) {
8
12
  const {styleProps} = useContext(PropsContext);
9
13
  const {localBtnStyles} = styleProps || {};
10
14
  const {endCall} = localBtnStyles || {};
@@ -13,7 +17,7 @@ function EndCall() {
13
17
  return (
14
18
  <BtnTemplate
15
19
  name={'callEnd'}
16
- btnText={'Hang Up'}
20
+ btnText={props?.btnText || 'Hang Up'}
17
21
  color='#FD0845'
18
22
  style={{...styles.endCall, ...(endCall as object)}}
19
23
  onPress={() =>
@@ -5,11 +5,11 @@ import BtnTemplate from '../BtnTemplate';
5
5
  import styles from '../../Style';
6
6
  import {LocalContext} from '../../Contexts/LocalUserContext';
7
7
 
8
- interface Props {
8
+ interface LocalAudioMuteProps {
9
9
  btnText?: string;
10
10
  variant?: 'outlined' | 'text';
11
11
  }
12
- function LocalAudioMute(props: Props) {
12
+ function LocalAudioMute(props: LocalAudioMuteProps) {
13
13
  const {btnText = 'Audio', variant = 'Outlined'} = props;
14
14
  const {styleProps} = useContext(PropsContext);
15
15
  const {localBtnStyles, remoteBtnStyles} = styleProps || {};
@@ -5,12 +5,12 @@ import BtnTemplate from '../BtnTemplate';
5
5
  import styles from '../../Style';
6
6
  import {LocalContext} from '../../Contexts/LocalUserContext';
7
7
 
8
- interface Props {
8
+ interface LocalVideoMuteProps {
9
9
  btnText?: string;
10
10
  variant?: 'outlined' | 'text';
11
11
  }
12
12
 
13
- function LocalVideoMute(props: Props) {
13
+ function LocalVideoMute(props: LocalVideoMuteProps) {
14
14
  const {btnText = 'Video', variant = 'Outlined'} = props;
15
15
  const {styleProps} = useContext(PropsContext);
16
16
  const {localBtnStyles, remoteBtnStyles} = styleProps || {};
@@ -5,7 +5,11 @@ import RtcContext from '../../Contexts/RtcContext';
5
5
  import BtnTemplate from '../BtnTemplate';
6
6
  import styles from '../../Style';
7
7
 
8
- function SwitchCamera() {
8
+ interface Props{
9
+ btnText?: string
10
+ }
11
+
12
+ function SwitchCamera(props?: Props) {
9
13
  const {styleProps, callbacks} = useContext(PropsContext);
10
14
  const {localBtnStyles} = styleProps || {};
11
15
  const {switchCamera} = localBtnStyles || {};
@@ -15,7 +19,7 @@ function SwitchCamera() {
15
19
  <BtnTemplate
16
20
  name={'switchCamera'}
17
21
  style={{...styles.localBtn, ...(switchCamera as object)}}
18
- btnText={'Switch'}
22
+ btnText={props?.btnText ||'Switch'}
19
23
  disabled={local.video === ToggleState.enabled ? false : true}
20
24
  onPress={() => {
21
25
  RtcEngine.switchCamera();
@@ -6,9 +6,10 @@ import LocalAudioMute from './Local/LocalAudioMute';
6
6
  import LocalVideoMute from './Local/LocalVideoMute';
7
7
  import SwitchCamera from './Local/SwitchCamera';
8
8
  import RemoteControls from './RemoteControls';
9
- import {MaxUidConsumer} from '../Contexts/MaxUidContext';
9
+ import {RenderConsumer} from '../Contexts/RenderContext';
10
10
  import PropsContext from '../Contexts/PropsContext';
11
11
  import LocalUserContextComponent from '../Contexts/LocalUserContext';
12
+ import useLocalUid from '../Utils/useLocalUid';
12
13
 
13
14
  interface ControlsPropsInterface {
14
15
  showButton?: boolean;
@@ -16,10 +17,11 @@ interface ControlsPropsInterface {
16
17
 
17
18
  function Controls(props: ControlsPropsInterface) {
18
19
  const {styleProps} = useContext(PropsContext);
20
+ const localUid = useLocalUid();
19
21
  const {localBtnContainer} = styleProps || {};
20
22
  const showButton = props.showButton !== undefined ? props.showButton : true;
21
23
  return (
22
- <LocalUserContextComponent>
24
+ <LocalUserContextComponent localUid={localUid}>
23
25
  <View style={{...styles.Controls, ...(localBtnContainer as object)}}>
24
26
  <LocalAudioMute />
25
27
  <LocalVideoMute />
@@ -27,13 +29,16 @@ function Controls(props: ControlsPropsInterface) {
27
29
  <EndCall />
28
30
  </View>
29
31
  {showButton ? (
30
- <MaxUidConsumer>
31
- {(users) => (
32
+ <RenderConsumer>
33
+ {({renderList, renderPosition}) => (
32
34
  <View style={{...styles.Controls, top: styles.Controls.top - 100}}>
33
- <RemoteControls user={users[0]} showRemoteSwap={false} />
35
+ <RemoteControls
36
+ user={renderList[renderPosition[0]]}
37
+ showRemoteSwap={false}
38
+ />
34
39
  </View>
35
40
  )}
36
- </MaxUidConsumer>
41
+ </RenderConsumer>
37
42
  ) : (
38
43
  <></>
39
44
  )}
@@ -1,20 +1,24 @@
1
1
  import React, {useContext} from 'react';
2
- import RtcContext from '../../Contexts/RtcContext';
2
+ import RtcContext, {UidType} from '../../Contexts/RtcContext';
3
3
  import BtnTemplate from '../BtnTemplate';
4
4
  import styles from '../../Style';
5
- import PropsContext, {ToggleState, UidInterface} from '../../Contexts/PropsContext';
5
+ import PropsContext, {
6
+ ToggleState,
7
+ RenderInterface,
8
+ } from '../../Contexts/PropsContext';
9
+ import useLocalUid from '../../Utils/useLocalUid';
6
10
 
7
11
  interface RemoteAudioMuteInterface {
8
- user: UidInterface;
12
+ user: RenderInterface;
9
13
  }
10
14
 
11
15
  const RemoteAudioMute: React.FC<RemoteAudioMuteInterface> = (props) => {
12
- const {RtcEngine, dispatch} = useContext(RtcContext);
16
+ const {RtcEngine} = useContext(RtcContext);
13
17
  const {styleProps} = useContext(PropsContext);
14
18
  const {remoteBtnStyles} = styleProps || {};
15
19
  const {muteRemoteAudio} = remoteBtnStyles || {};
16
-
17
- return props.user.uid !== 'local' ? (
20
+ const localUid = useLocalUid();
21
+ return props.user.uid !== localUid ? (
18
22
  <BtnTemplate
19
23
  name={props.user.audio === ToggleState.enabled ? 'mic' : 'micOff'}
20
24
  style={{...styles.leftRemoteBtn, ...(muteRemoteAudio as object)}}
@@ -1,11 +1,12 @@
1
1
  import React, {useContext} from 'react';
2
- import RtcContext from '../../Contexts/RtcContext';
2
+ import RtcContext, {UidType} from '../../Contexts/RtcContext';
3
3
  import BtnTemplate from '../BtnTemplate';
4
4
  import styles from '../../Style';
5
- import PropsContext, {UidInterface} from '../../Contexts/PropsContext';
5
+ import PropsContext from '../../Contexts/PropsContext';
6
+ import useLocalUid from '../../Utils/useLocalUid';
6
7
 
7
8
  interface RemoteSwapInterface {
8
- user: UidInterface;
9
+ uid: UidType;
9
10
  }
10
11
 
11
12
  const RemoteSwap: React.FC<RemoteSwapInterface> = (props) => {
@@ -13,19 +14,19 @@ const RemoteSwap: React.FC<RemoteSwapInterface> = (props) => {
13
14
  const {styleProps} = useContext(PropsContext);
14
15
  const {remoteBtnStyles} = styleProps || {};
15
16
  const {remoteSwap} = remoteBtnStyles || {};
16
-
17
+ const localUid = useLocalUid();
17
18
  return (
18
19
  <BtnTemplate
19
20
  name={'remoteSwap'}
20
21
  style={
21
- props.user.uid !== 'local'
22
+ props.uid !== localUid
22
23
  ? {...styles.rightRemoteBtn, ...(remoteSwap as object)}
23
24
  : {}
24
25
  }
25
26
  onPress={() => {
26
27
  dispatch({
27
28
  type: 'SwapVideo',
28
- value: [props.user],
29
+ value: [props.uid],
29
30
  });
30
31
  }}
31
32
  />
@@ -1,24 +1,25 @@
1
1
  import React, {useContext} from 'react';
2
+ import useLocalUid from '../../Utils/useLocalUid';
2
3
  import PropsContext, {
3
4
  ToggleState,
4
- UidInterface,
5
+ RenderInterface,
5
6
  } from '../../Contexts/PropsContext';
6
7
  import RtcContext from '../../Contexts/RtcContext';
7
8
  import styles from '../../Style';
8
9
  import BtnTemplate from '../BtnTemplate';
9
10
 
10
11
  interface RemoteVideoMuteInterface {
11
- user: UidInterface;
12
+ user: RenderInterface;
12
13
  rightButton: boolean;
13
14
  }
14
15
 
15
16
  const RemoteVideoMute: React.FC<RemoteVideoMuteInterface> = (props) => {
16
- const {RtcEngine, dispatch} = useContext(RtcContext);
17
+ const {RtcEngine} = useContext(RtcContext);
17
18
  const {styleProps} = useContext(PropsContext);
18
19
  const {remoteBtnStyles} = styleProps || {};
19
20
  const {muteRemoteVideo} = remoteBtnStyles || {};
20
-
21
- return props.user.uid !== 'local' ? (
21
+ const localUid = useLocalUid();
22
+ return props.user.uid !== localUid ? (
22
23
  <BtnTemplate
23
24
  name={
24
25
  props.user.video === ToggleState.enabled ? 'videocam' : 'videocamOff'
@@ -1,6 +1,6 @@
1
1
  import React, {useContext} from 'react';
2
2
  import {View} from 'react-native';
3
- import PropsContext, {UidInterface} from '../Contexts/PropsContext';
3
+ import PropsContext, {RenderInterface} from '../Contexts/PropsContext';
4
4
  import styles from '../Style';
5
5
  import RemoteAudioMute from './Remote/RemoteAudioMute';
6
6
  import RemoteSwap from './Remote/RemoteSwap';
@@ -10,7 +10,7 @@ interface RemoteControlsInterface {
10
10
  showMuteRemoteVideo?: boolean;
11
11
  showMuteRemoteAudio?: boolean;
12
12
  showRemoteSwap?: boolean;
13
- user: UidInterface;
13
+ user: RenderInterface;
14
14
  }
15
15
 
16
16
  const RemoteControls: React.FC<RemoteControlsInterface> = (props) => {
@@ -34,7 +34,7 @@ const RemoteControls: React.FC<RemoteControlsInterface> = (props) => {
34
34
  <></>
35
35
  )}
36
36
  {props.showRemoteSwap !== false ? (
37
- <RemoteSwap user={props.user} />
37
+ <RemoteSwap uid={props.user.uid} />
38
38
  ) : (
39
39
  <></>
40
40
  )}
@@ -1,20 +1,23 @@
1
- import {UidInterface} from '../Contexts/PropsContext';
2
- import {ActionType, UidStateInterface} from '../Contexts/RtcContext';
1
+ import {
2
+ ActionType,
3
+ RenderStateInterface,
4
+ UidType,
5
+ } from '../Contexts/RtcContext';
3
6
 
4
7
  export default function LocalMuteAudio(
5
- state: UidStateInterface,
8
+ state: RenderStateInterface,
6
9
  action: ActionType<'LocalMuteAudio'>,
10
+ localUid: UidType,
7
11
  ) {
8
- let stateUpdate = {};
9
- const LocalAudioMute = (user: UidInterface) => {
10
- if (user.uid === 'local') {
11
- user.audio = action.value[0];
12
- }
13
- return user;
14
- };
15
- stateUpdate = {
16
- min: state.min.map(LocalAudioMute),
17
- max: state.max.map(LocalAudioMute),
12
+ let stateUpdate: RenderStateInterface = {
13
+ renderList: {
14
+ ...state.renderList,
15
+ [localUid]: {
16
+ ...state.renderList[localUid],
17
+ audio: action.value[0],
18
+ },
19
+ },
20
+ renderPosition: [...state.renderPosition],
18
21
  };
19
22
  return stateUpdate;
20
23
  }
@@ -1,20 +1,23 @@
1
- import {UidInterface} from '../Contexts/PropsContext';
2
- import {ActionType, UidStateInterface} from '../Contexts/RtcContext';
1
+ import {
2
+ ActionType,
3
+ RenderStateInterface,
4
+ UidType,
5
+ } from '../Contexts/RtcContext';
3
6
 
4
7
  export default function LocalMuteVideo(
5
- state: UidStateInterface,
8
+ state: RenderStateInterface,
6
9
  action: ActionType<'LocalMuteVideo'>,
10
+ localUid: UidType,
7
11
  ) {
8
- let stateUpdate = {};
9
- const LocalVideoMute = (user: UidInterface) => {
10
- if (user.uid === 'local') {
11
- user.video = action.value[0];
12
- }
13
- return user;
14
- };
15
- stateUpdate = {
16
- min: state.min.map(LocalVideoMute),
17
- max: state.max.map(LocalVideoMute),
12
+ let stateUpdate: RenderStateInterface = {
13
+ renderList: {
14
+ ...state.renderList,
15
+ [localUid]: {
16
+ ...state.renderList[localUid],
17
+ video: action.value[0],
18
+ },
19
+ },
20
+ renderPosition: [...state.renderPosition],
18
21
  };
19
22
  return stateUpdate;
20
23
  }
@@ -1,26 +1,26 @@
1
- import {ToggleState, UidInterface} from '../Contexts/PropsContext';
2
- import {ActionType, UidStateInterface} from '../Contexts/RtcContext';
1
+ import {ToggleState} from '../Contexts/PropsContext';
2
+ import {ActionType, RenderStateInterface} from '../Contexts/RtcContext';
3
3
 
4
4
  export default function RemoteAudioStateChanged(
5
- state: UidStateInterface,
5
+ state: RenderStateInterface,
6
6
  action: ActionType<'RemoteAudioStateChanged'>,
7
7
  ) {
8
- let stateUpdate = {};
9
8
  let audioState: ToggleState;
10
9
  if (action.value[1] === 2 || action.value[1] === 1) {
11
10
  audioState = ToggleState.enabled;
12
11
  } else {
13
12
  audioState = ToggleState.disabled;
14
13
  }
15
- const audioChange = (user: UidInterface) => {
16
- if (user.uid === action.value[0]) {
17
- user.audio = audioState;
18
- }
19
- return user;
20
- };
21
- stateUpdate = {
22
- min: state.min.map(audioChange),
23
- max: state.max.map(audioChange),
14
+
15
+ const stateUpdate: RenderStateInterface = {
16
+ renderList: {
17
+ ...state.renderList,
18
+ [action.value[0]]: {
19
+ ...state.renderList[action.value[0]],
20
+ audio: audioState,
21
+ },
22
+ },
23
+ renderPosition: [...state.renderPosition],
24
24
  };
25
25
  return stateUpdate;
26
26
  }
@@ -1,26 +1,29 @@
1
- import {ToggleState, UidInterface} from '../Contexts/PropsContext';
2
- import {ActionType, UidStateInterface} from '../Contexts/RtcContext';
1
+ import {ToggleState} from '../Contexts/PropsContext';
2
+ import {ActionType, RenderStateInterface} from '../Contexts/RtcContext';
3
3
 
4
4
  export default function RemoteVideoStateChanged(
5
- state: UidStateInterface,
5
+ state: RenderStateInterface,
6
6
  action: ActionType<'RemoteVideoStateChanged'>,
7
7
  ) {
8
- let stateUpdate = {};
9
8
  let videoState: ToggleState;
10
9
  if (action.value[1] === 0) {
11
10
  videoState = ToggleState.disabled;
12
11
  } else if (action.value[1] === 2) {
13
12
  videoState = ToggleState.enabled;
14
13
  }
15
- const videoChange = (user: UidInterface) => {
16
- if (user.uid === action.value[0] && videoState !== undefined) {
17
- user.video = videoState;
18
- }
19
- return user;
20
- };
21
- stateUpdate = {
22
- min: state.min.map(videoChange),
23
- max: state.max.map(videoChange),
14
+
15
+ const stateUpdate: RenderStateInterface = {
16
+ renderList: {
17
+ ...state.renderList,
18
+ [action.value[0]]: {
19
+ ...state.renderList[action.value[0]],
20
+ video:
21
+ videoState !== undefined
22
+ ? videoState
23
+ : state.renderList[action.value[0]].video,
24
+ },
25
+ },
26
+ renderPosition: [...state.renderPosition],
24
27
  };
25
28
  return stateUpdate;
26
29
  }