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

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 (280) 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 +2297 -2533
  6. package/template/agora-rn-uikit/.git/HEAD +1 -1
  7. package/template/agora-rn-uikit/.git/config +3 -3
  8. package/template/agora-rn-uikit/.git/index +0 -0
  9. package/template/agora-rn-uikit/.git/logs/HEAD +2 -2
  10. package/template/agora-rn-uikit/.git/logs/refs/heads/master +1 -1
  11. package/template/agora-rn-uikit/.git/logs/refs/heads/release/fpe-1.0.0 +1 -0
  12. package/template/agora-rn-uikit/.git/logs/refs/remotes/origin/HEAD +1 -1
  13. package/template/agora-rn-uikit/.git/objects/pack/pack-f274a85fccfc9b5112d154bb3b6d34cb4b8dedde.idx +0 -0
  14. package/template/agora-rn-uikit/.git/objects/pack/{pack-0061d00cd98162a329a32b537488a35d0abeb069.pack → pack-f274a85fccfc9b5112d154bb3b6d34cb4b8dedde.pack} +0 -0
  15. package/template/agora-rn-uikit/.git/packed-refs +5 -1
  16. package/template/agora-rn-uikit/.git/refs/heads/release/fpe-1.0.0 +1 -0
  17. package/template/agora-rn-uikit/src/AgoraUIKit.tsx +23 -20
  18. package/template/agora-rn-uikit/src/Contexts/LocalUserContext.tsx +13 -8
  19. package/template/agora-rn-uikit/src/Contexts/PropsContext.tsx +25 -9
  20. package/template/agora-rn-uikit/src/Contexts/RenderContext.tsx +10 -0
  21. package/template/agora-rn-uikit/src/Contexts/RtcContext.tsx +11 -5
  22. package/template/agora-rn-uikit/src/Controls/BtnTemplate.tsx +6 -2
  23. package/template/agora-rn-uikit/src/Controls/ImageIcon.tsx +1 -1
  24. package/template/agora-rn-uikit/src/Controls/Local/EndCall.tsx +6 -2
  25. package/template/agora-rn-uikit/src/Controls/Local/LocalAudioMute.tsx +2 -2
  26. package/template/agora-rn-uikit/src/Controls/Local/LocalVideoMute.tsx +2 -2
  27. package/template/agora-rn-uikit/src/Controls/Local/SwitchCamera.tsx +6 -2
  28. package/template/agora-rn-uikit/src/Controls/LocalControls.tsx +11 -6
  29. package/template/agora-rn-uikit/src/Controls/Remote/RemoteAudioMute.tsx +10 -6
  30. package/template/agora-rn-uikit/src/Controls/Remote/RemoteSwap.tsx +7 -6
  31. package/template/agora-rn-uikit/src/Controls/Remote/RemoteVideoMute.tsx +6 -5
  32. package/template/agora-rn-uikit/src/Controls/RemoteControls.tsx +3 -3
  33. package/template/agora-rn-uikit/src/Reducer/LocalMuteAudio.ts +16 -13
  34. package/template/agora-rn-uikit/src/Reducer/LocalMuteVideo.ts +16 -13
  35. package/template/agora-rn-uikit/src/Reducer/RemoteAudioStateChanged.ts +13 -13
  36. package/template/agora-rn-uikit/src/Reducer/RemoteVideoStateChanged.ts +16 -13
  37. package/template/agora-rn-uikit/src/Reducer/UpdateDualStreamMode.ts +28 -31
  38. package/template/agora-rn-uikit/src/Reducer/UserJoined.ts +48 -35
  39. package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteAudio.ts +11 -13
  40. package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteVideo.ts +11 -13
  41. package/template/agora-rn-uikit/src/Reducer/UserOffline.ts +18 -15
  42. package/template/agora-rn-uikit/src/Rtc/Create.tsx +14 -2
  43. package/template/agora-rn-uikit/src/Rtc/Join.tsx +19 -3
  44. package/template/agora-rn-uikit/src/RtcConfigure.tsx +161 -44
  45. package/template/agora-rn-uikit/src/Utils/useLocalUid.ts +8 -0
  46. package/template/agora-rn-uikit/src/Views/MaxVideoView.native.tsx +8 -6
  47. package/template/agora-rn-uikit/src/Views/MaxVideoView.tsx +8 -6
  48. package/template/agora-rn-uikit/src/Views/MinVideoView.tsx +18 -9
  49. package/template/agora-rn-uikit/src/index.ts +12 -12
  50. package/template/babel.config.js +17 -1
  51. package/template/bridge/rtc/webNg/RtcEngine.ts +34 -28
  52. package/template/bridge/rtc/webNg/SurfaceView.tsx +3 -2
  53. package/template/bridge/rtc/webNg/Types.ts +14 -0
  54. package/template/bridge/rtc/webNg/index.ts +5 -2
  55. package/template/bridge/rtm/web/index.ts +13 -7
  56. package/template/electron-builder.js +3 -2
  57. package/template/esbuild.rsdk.go +226 -0
  58. package/template/{src/subComponents/LayoutEnum.tsx → esbuildConfigTransform.js} +1 -5
  59. package/template/fpe-api/components.ts +42 -0
  60. package/template/fpe-api/context.ts +45 -0
  61. package/template/fpe-api/fpeEvents.ts +9 -0
  62. package/template/fpe-api/index.ts +21 -0
  63. package/template/fpe-api/install.ts +128 -0
  64. package/template/fpe-api/typeDefinition.ts +143 -0
  65. package/template/fpe-api/useFpe.tsx +35 -0
  66. package/template/fpe-api/utils.ts +62 -0
  67. package/template/fpe-implementation/createHook.ts +33 -0
  68. package/template/fpe-implementation/dummyFpe.ts +17 -0
  69. package/template/fpe-implementation/index.ts +1 -0
  70. package/template/fpe-todo.txt +14 -0
  71. package/template/fpe.config.js +25 -0
  72. package/template/global.d.ts +4 -0
  73. package/template/index.rsdk.tsx +27 -0
  74. package/template/index.wsdk.tsx +27 -0
  75. package/template/package-lock.json +2297 -2533
  76. package/template/package.json +28 -12
  77. package/template/react-native-toast-message/src/index.js +9 -10
  78. package/template/react-native-toast-message/src/index.wsdk.js +419 -0
  79. package/template/src/App.tsx +97 -65
  80. package/template/src/AppWrapper.tsx +79 -0
  81. package/template/src/SDKAppWrapper.tsx +67 -0
  82. package/template/src/atoms/PrimaryButton.tsx +14 -8
  83. package/template/src/atoms/TextInput.tsx +13 -5
  84. package/template/src/components/Chat.tsx +171 -139
  85. package/template/src/components/ChatContext.ts +14 -22
  86. package/template/src/components/ColorConfigure.tsx +2 -2
  87. package/template/src/components/Controls.native.tsx +72 -62
  88. package/template/src/components/Controls.tsx +90 -69
  89. package/template/src/components/DeviceConfigure.tsx +1 -1
  90. package/template/src/components/DeviceContext.tsx +14 -7
  91. package/template/src/components/GraphQLProvider.tsx +9 -2
  92. package/template/src/components/GridVideo.tsx +20 -159
  93. package/template/src/components/HostControlView.tsx +54 -15
  94. package/template/src/components/Navbar.tsx +408 -157
  95. package/template/src/components/NetworkQualityContext.tsx +29 -22
  96. package/template/src/components/ParticipantsView.tsx +97 -119
  97. package/template/src/components/PinnedVideo.tsx +41 -188
  98. package/template/src/components/Precall.native.tsx +131 -97
  99. package/template/src/components/Precall.tsx +193 -158
  100. package/template/src/components/RTMConfigure.tsx +320 -398
  101. package/template/src/components/Router.sdk.ts +20 -0
  102. package/template/src/components/SessionContext.tsx +6 -3
  103. package/template/src/components/Settings.native.tsx +3 -0
  104. package/template/src/components/Settings.tsx +65 -31
  105. package/template/src/components/SettingsView.tsx +14 -8
  106. package/template/src/components/Share.tsx +188 -220
  107. package/template/src/components/StorageContext.tsx +5 -5
  108. package/template/src/components/StoreToken.tsx +5 -1
  109. package/template/src/components/chat-messages/useChatMessages.tsx +202 -0
  110. package/template/src/components/chat-notification/useChatNotification.tsx +78 -0
  111. package/template/src/components/chat-ui/useChatUIControl.tsx +66 -0
  112. package/template/src/components/common/Error.tsx +54 -0
  113. package/template/src/components/common/Logo.tsx +35 -0
  114. package/template/src/components/common/index.tsx +8 -0
  115. package/template/src/components/contexts/LiveStreamDataContext.tsx +79 -0
  116. package/template/src/components/contexts/ScreenShareContext.tsx +47 -0
  117. package/template/src/components/contexts/WhiteboardContext.tsx +59 -0
  118. package/template/src/components/dimension/DimensionContext.ts +27 -0
  119. package/template/src/components/dimension/DimensionProvider.tsx +34 -0
  120. package/template/src/components/livestream/LiveStreamContext.tsx +293 -272
  121. package/template/src/components/livestream/Types.ts +26 -7
  122. package/template/src/components/livestream/index.ts +13 -2
  123. package/template/src/components/livestream/views/LiveStreamControls.tsx +5 -1
  124. package/template/src/components/meeting-info/useMeetingInfo.tsx +63 -0
  125. package/template/src/components/meeting-info/useSetMeetingInfo.tsx +38 -0
  126. package/template/src/components/participants/AllAudienceParticipants.tsx +26 -21
  127. package/template/src/components/participants/AllHostParticipants.tsx +36 -53
  128. package/template/src/components/participants/MeParticipant.tsx +9 -10
  129. package/template/src/components/participants/ParticipantName.tsx +2 -1
  130. package/template/src/components/participants/RemoteParticipants.tsx +3 -3
  131. package/template/src/components/precall/LocalMute.native.tsx +91 -0
  132. package/template/src/components/precall/LocalMute.tsx +90 -0
  133. package/template/src/components/precall/VideoPreview.native.tsx +35 -0
  134. package/template/src/components/precall/VideoPreview.tsx +33 -0
  135. package/template/src/components/precall/index.tsx +28 -0
  136. package/template/src/components/precall/joinCallBtn.native.tsx +69 -0
  137. package/template/src/components/precall/joinCallBtn.tsx +91 -0
  138. package/template/src/components/precall/meetingTitle.tsx +26 -0
  139. package/template/src/components/precall/selectDevice.tsx +46 -0
  140. package/template/src/components/precall/textInput.tsx +43 -0
  141. package/template/src/components/precall/usePreCall.tsx +41 -0
  142. package/template/src/components/styles.ts +20 -3
  143. package/template/src/components/useShareLink.tsx +222 -0
  144. package/template/src/components/useWakeLock.tsx +3 -3
  145. package/template/src/custom-events/CustomEvents.ts +197 -0
  146. package/template/src/custom-events/index.tsx +4 -0
  147. package/template/src/custom-events/types.ts +51 -0
  148. package/template/src/language/default-labels/commonLabels.ts +21 -0
  149. package/template/src/language/default-labels/createScreenLabels.ts +22 -0
  150. package/template/src/language/default-labels/index.ts +38 -0
  151. package/template/src/language/default-labels/joinScreenLabels.ts +13 -0
  152. package/template/src/language/default-labels/precallScreenLabels.ts +33 -0
  153. package/template/src/language/default-labels/shareLinkScreenLabels.ts +44 -0
  154. package/template/src/language/default-labels/videoCallScreenLabels.ts +189 -0
  155. package/template/src/language/i18nTypes.ts +10 -0
  156. package/template/src/language/index.ts +18 -0
  157. package/template/src/language/useLanguage.tsx +92 -0
  158. package/template/src/pages/Authenticate.tsx +21 -15
  159. package/template/src/pages/Create.tsx +176 -159
  160. package/template/src/pages/Join.tsx +44 -32
  161. package/template/src/pages/VideoCall.tsx +134 -406
  162. package/template/src/pages/create/useCreate.tsx +37 -0
  163. package/template/src/pages/video-call/CustomLayout.ts +17 -0
  164. package/template/src/pages/video-call/CustomUserContextHolder.tsx +12 -0
  165. package/template/src/pages/video-call/DefaultLayouts.ts +65 -0
  166. package/template/src/pages/video-call/NameWithMicStatus.tsx +62 -0
  167. package/template/src/pages/video-call/RenderComponent.tsx +52 -0
  168. package/template/src/pages/video-call/VideoCallScreen.tsx +191 -0
  169. package/template/src/pages/video-call/VideoComponent.tsx +34 -0
  170. package/template/src/pages/video-call/VideoRenderer.tsx +86 -0
  171. package/template/src/pages/video-call/index.ts +20 -0
  172. package/template/src/rtm/RTMEngine.ts +58 -0
  173. package/template/src/rtm/utils.ts +28 -0
  174. package/template/src/rtm-events/EventUtils.ts +268 -0
  175. package/template/src/rtm-events/EventsQueue.ts +38 -0
  176. package/template/src/rtm-events/constants.ts +40 -0
  177. package/template/src/rtm-events/index.tsx +8 -0
  178. package/template/src/rtm-events/types.ts +7 -0
  179. package/template/src/subComponents/ChatBubble.tsx +18 -11
  180. package/template/src/subComponents/ChatContainer.tsx +78 -29
  181. package/template/src/subComponents/ChatInput.tsx +146 -70
  182. package/template/src/subComponents/CopyJoinInfo.tsx +52 -67
  183. package/template/src/subComponents/Error.tsx +35 -24
  184. package/template/src/subComponents/LanguageSelector.tsx +85 -0
  185. package/template/src/subComponents/LayoutIconDropdown.native.tsx +163 -0
  186. package/template/src/subComponents/LayoutIconDropdown.tsx +198 -0
  187. package/template/src/subComponents/LocalAudioMute.tsx +52 -30
  188. package/template/src/subComponents/LocalEndCall.tsx +52 -0
  189. package/template/src/subComponents/LocalSwitchCamera.tsx +61 -0
  190. package/template/src/subComponents/LocalVideoMute.tsx +48 -30
  191. package/template/src/subComponents/LogoutButton.tsx +20 -5
  192. package/template/src/subComponents/NetworkQualityPill.tsx +43 -13
  193. package/template/src/subComponents/OpenInNativeButton.tsx +3 -2
  194. package/template/src/subComponents/Recording.tsx +46 -138
  195. package/template/src/subComponents/RemoteAudioMute.tsx +30 -34
  196. package/template/src/subComponents/RemoteEndCall.tsx +18 -7
  197. package/template/src/subComponents/RemoteVideoMute.tsx +17 -9
  198. package/template/src/subComponents/ScreenShareNotice.tsx +40 -40
  199. package/template/src/subComponents/SelectDevice.tsx +88 -45
  200. package/template/src/subComponents/SelectOAuth.tsx +30 -6
  201. package/template/src/subComponents/SidePanelButtons.ts +39 -0
  202. package/template/src/subComponents/TextWithTooltip.native.tsx +2 -1
  203. package/template/src/subComponents/TextWithTooltip.tsx +15 -20
  204. package/template/src/subComponents/chat/ChatParticipants.tsx +31 -32
  205. package/template/src/subComponents/livestream/ApprovedLiveStreamControlsView.tsx +7 -3
  206. package/template/src/subComponents/livestream/CurrentLiveStreamRequestsView.tsx +32 -18
  207. package/template/src/subComponents/livestream/controls/LocalRaiseHand.tsx +22 -8
  208. package/template/src/subComponents/livestream/controls/RemoteLiveStreamApprovedRequestRecall.tsx +12 -7
  209. package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestApprove.tsx +24 -27
  210. package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestReject.tsx +23 -26
  211. package/template/src/subComponents/livestream/index.ts +10 -2
  212. package/template/src/subComponents/recording/useRecording.tsx +209 -0
  213. package/template/src/subComponents/recording/useRecordingLayoutQuery.tsx +64 -0
  214. package/template/src/subComponents/screenshare/ScreenshareButton.native.tsx +18 -0
  215. package/template/src/subComponents/screenshare/ScreenshareButton.tsx +59 -31
  216. package/template/src/subComponents/screenshare/ScreenshareConfigure.native.tsx +57 -52
  217. package/template/src/subComponents/screenshare/ScreenshareConfigure.tsx +97 -138
  218. package/template/src/subComponents/screenshare/useScreenshare.tsx +29 -0
  219. package/template/src/subComponents/toastConfig.tsx +25 -20
  220. package/template/src/utils/IsAttendeeUser.ts +34 -0
  221. package/template/src/utils/SdkEvents.ts +68 -0
  222. package/template/src/utils/common.tsx +40 -0
  223. package/template/src/utils/eventEmitter.ts +29 -0
  224. package/template/src/utils/getMeetingInvite.ts +30 -0
  225. package/template/src/utils/index.tsx +11 -2
  226. package/template/src/utils/isAudioEnabled.ts +29 -0
  227. package/template/src/utils/isHostUser.ts +33 -0
  228. package/template/src/utils/isMobileOrTablet.native.ts +5 -0
  229. package/template/src/utils/{mobileWebTest.tsx → isMobileOrTablet.ts} +5 -2
  230. package/template/src/utils/isPSTNUser.ts +30 -0
  231. package/template/src/utils/isSDK.sdk.ts +5 -0
  232. package/template/src/utils/isSDK.ts +5 -0
  233. package/template/src/utils/isScreenShareUser.ts +31 -0
  234. package/template/src/utils/isVideoEnabled.ts +29 -0
  235. package/template/src/utils/useButtonTemplate.tsx +43 -0
  236. package/template/src/utils/useCreateMeeting.ts +74 -0
  237. package/template/src/utils/useGetLiveStreamingRequests.ts +24 -0
  238. package/template/src/utils/useGetMeetingPhrase.ts +68 -0
  239. package/template/src/utils/useGetName.ts +20 -0
  240. package/template/src/{subComponents/screenshare/ScreenshareContext.tsx → utils/useGroupMessages.ts} +10 -7
  241. package/template/src/utils/useJoinMeeting.ts +120 -0
  242. package/template/src/utils/useLayout.tsx +40 -0
  243. package/template/src/utils/useLiveStreamingUids.ts +26 -0
  244. package/template/src/utils/useMutePSTN.ts +43 -0
  245. package/template/src/utils/useMuteToggleLocal.ts +109 -0
  246. package/template/src/utils/useNavParams.ts +6 -0
  247. package/template/src/utils/useNavigateTo.ts +8 -0
  248. package/template/src/utils/usePrivateMessages.ts +33 -0
  249. package/template/src/utils/useRemoteEndCall.ts +27 -0
  250. package/template/src/utils/useRemoteMute.ts +64 -0
  251. package/template/src/utils/useSendControlMessage.ts +51 -0
  252. package/template/src/utils/useSendMessage.ts +40 -0
  253. package/template/src/utils/useSetName.ts +20 -0
  254. package/template/src/utils/useSetUnreadMessageCount.ts +43 -0
  255. package/template/src/utils/useSidePanel.tsx +41 -0
  256. package/template/src/utils/useString.ts +61 -0
  257. package/template/src/utils/useUnreadMessageCount.ts +50 -0
  258. package/template/src/utils/useUserList.ts +26 -0
  259. package/template/tsconfig.json +4 -4
  260. package/template/tsconfig_fpeApi.json +103 -0
  261. package/template/tsconfig_rsdk_index.json +105 -0
  262. package/template/tsconfig_wsdk_index.json +104 -0
  263. package/template/webpack.commons.js +40 -16
  264. package/template/webpack.main.config.js +2 -1
  265. package/template/webpack.renderer.config.js +1 -1
  266. package/template/webpack.rsdk.config.js +33 -0
  267. package/template/webpack.ts.config.js +89 -0
  268. package/template/webpack.web.config.js +8 -1
  269. package/template/webpack.wsdk.config.js +34 -0
  270. package/template/agora-rn-uikit/.git/logs/refs/heads/ab-dev-auto +0 -1
  271. package/template/agora-rn-uikit/.git/objects/pack/pack-0061d00cd98162a329a32b537488a35d0abeb069.idx +0 -0
  272. package/template/agora-rn-uikit/.git/refs/heads/ab-dev-auto +0 -1
  273. package/template/agora-rn-uikit/src/Contexts/MaxUidContext.tsx +0 -7
  274. package/template/agora-rn-uikit/src/Contexts/MinUidContext.tsx +0 -8
  275. package/template/src/components/participants/context/ParticipantContext.tsx +0 -97
  276. package/template/src/subComponents/ScreenshareButton.tsx +0 -257
  277. package/template/src/subComponents/SwitchCamera.tsx +0 -35
  278. package/template/src/utils/hasBrandLogo.tsx +0 -3
  279. package/template/src/utils/mobileWebTest.native.tsx +0 -5
  280. package/template/src/utils/shouldAuthenticate.tsx +0 -7
@@ -0,0 +1,202 @@
1
+ /*
2
+ ********************************************
3
+ Copyright © 2021 Agora Lab, Inc., all rights reserved.
4
+ AppBuilder and all associated components, source code, APIs, services, and documentation
5
+ (the “Materials”) are owned by Agora Lab, Inc. and its licensors. The Materials may not be
6
+ accessed, used, modified, or distributed for any purpose without a license from Agora Lab, Inc.
7
+ Use without a license or in violation of any license terms and conditions (including use for
8
+ any purpose competitive to Agora Lab, Inc.’s business) is strictly prohibited. For more
9
+ information visit https://appbuilder.agora.io.
10
+ *********************************************
11
+ */
12
+ import {createHook} from 'fpe-implementation';
13
+ import React, {useState, useEffect, useRef} from 'react';
14
+ import {useRenderContext} from 'fpe-api';
15
+ import {SidePanelType} from '../../subComponents/SidePanelEnum';
16
+ import {useLocalUid} from '../../../agora-rn-uikit';
17
+ import CustomEvents from '../../custom-events';
18
+ import {EventNames} from '../../rtm-events';
19
+ import {useChatUIControl} from '../chat-ui/useChatUIControl';
20
+ import {useChatNotification} from '../chat-notification/useChatNotification';
21
+ import {useString} from '../../utils/useString';
22
+ import Toast from '../../../react-native-toast-message';
23
+ import {timeNow} from '../../rtm/utils';
24
+ import {useSidePanel} from '../../utils/useSidePanel';
25
+ import {UidType} from '../../../agora-rn-uikit';
26
+
27
+ interface ChatMessagesProviderProps {
28
+ children: React.ReactNode;
29
+ }
30
+ interface messageInterface {
31
+ ts: number;
32
+ msg: string;
33
+ }
34
+ interface messageStoreInterface extends messageInterface {
35
+ uid: string;
36
+ }
37
+
38
+ interface ChatMessagesInterface {
39
+ messageStore: messageStoreInterface | any;
40
+ privateMessageStore: any;
41
+ sendChatMessage: (msg: string, toUid?: number) => void;
42
+ }
43
+
44
+ const ChatMessagesContext = React.createContext<ChatMessagesInterface>({
45
+ messageStore: [],
46
+ privateMessageStore: {},
47
+ sendChatMessage: () => {},
48
+ });
49
+
50
+ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
51
+ const {renderList} = useRenderContext();
52
+ const localUid = useLocalUid();
53
+ const {setSidePanel} = useSidePanel();
54
+ const {groupActive, selectedChatUserId, setGroupActive} = useChatUIControl();
55
+ const {setUnreadGroupMessageCount, setUnreadIndividualMessageCount} =
56
+ useChatNotification();
57
+ const [messageStore, setMessageStore] = useState<messageStoreInterface[]>([]);
58
+ const [privateMessageStore, setPrivateMessageStore] = useState({});
59
+
60
+ const renderListRef = useRef({renderList: renderList});
61
+ const groupActiveRef = useRef<boolean>();
62
+ const individualActiveRef = useRef<string | number>();
63
+
64
+ //commented for v1 release
65
+ //const fromText = useString('messageSenderNotificationLabel');
66
+ const fromText = (name: string) => `From : ${name}`;
67
+ useEffect(() => {
68
+ renderListRef.current.renderList = renderList;
69
+ }, [renderList]);
70
+
71
+ useEffect(() => {
72
+ groupActiveRef.current = groupActive;
73
+ }, [groupActive]);
74
+
75
+ useEffect(() => {
76
+ individualActiveRef.current = selectedChatUserId;
77
+ }, [selectedChatUserId]);
78
+
79
+ React.useEffect(() => {
80
+ const showMessageNotification = (msg: string, uid: string) => {
81
+ Toast.show({
82
+ type: 'success',
83
+ text1: msg.length > 30 ? msg.slice(0, 30) + '...' : msg,
84
+ text2: renderListRef.current.renderList[parseInt(uid)]?.name
85
+ ? fromText(renderListRef.current.renderList[parseInt(uid)]?.name)
86
+ : '',
87
+ visibilityTime: 1000,
88
+ onPress: () => {
89
+ setSidePanel(SidePanelType.Chat);
90
+ setUnreadGroupMessageCount(0);
91
+ setGroupActive(true);
92
+ },
93
+ });
94
+ };
95
+ CustomEvents.on(EventNames.PUBLIC_CHAT_MESSAGE, (data) => {
96
+ showMessageNotification(data.payload.value, data.sender);
97
+ addMessageToStore(data.sender, {
98
+ msg: data.payload.value,
99
+ ts: data.ts,
100
+ });
101
+ /**
102
+ * if chat group window is not active.
103
+ * then we will increment the unread count
104
+ */
105
+ if (!groupActiveRef.current) {
106
+ setUnreadGroupMessageCount((prevState) => {
107
+ return prevState + 1;
108
+ });
109
+ }
110
+ });
111
+ CustomEvents.on(EventNames.PRIVATE_CHAT_MESSAGE, (data) => {
112
+ showMessageNotification(data.payload.value, data.sender);
113
+ addMessageToPrivateStore(
114
+ data.sender,
115
+ {
116
+ msg: data.payload.value,
117
+ ts: data.ts,
118
+ },
119
+ false,
120
+ );
121
+ if (!(individualActiveRef.current === data.sender)) {
122
+ setUnreadIndividualMessageCount((prevState) => {
123
+ const prevCount =
124
+ prevState && prevState[data.sender] ? prevState[data.sender] : 0;
125
+ return {
126
+ ...prevState,
127
+ [data.sender]: prevCount + 1,
128
+ };
129
+ });
130
+ }
131
+ });
132
+ }, []);
133
+
134
+ const addMessageToStore = (uid: string, body: messageInterface) => {
135
+ setMessageStore((m: messageStoreInterface[]) => {
136
+ return [...m, {ts: body.ts, uid, msg: body.msg}];
137
+ });
138
+ };
139
+
140
+ const addMessageToPrivateStore = (
141
+ uid: string,
142
+ body: messageInterface,
143
+ local: boolean,
144
+ ) => {
145
+ setPrivateMessageStore((state: any) => {
146
+ let newState = {...state};
147
+ newState[uid] !== undefined
148
+ ? (newState[uid] = [
149
+ ...newState[uid],
150
+ {ts: body.ts, uid: local ? localUid : uid, msg: body.msg},
151
+ ])
152
+ : (newState = {
153
+ ...newState,
154
+ [uid]: [{ts: body.ts, uid: local ? localUid : uid, msg: body.msg}],
155
+ });
156
+ return {...newState};
157
+ });
158
+ };
159
+
160
+ const sendChatMessage = (msg: string, toUid?: UidType) => {
161
+ if (toUid) {
162
+ CustomEvents.send(
163
+ EventNames.PRIVATE_CHAT_MESSAGE,
164
+ {
165
+ value: msg,
166
+ },
167
+ toUid,
168
+ );
169
+ addMessageToPrivateStore(
170
+ toUid.toString(),
171
+ {
172
+ msg: msg,
173
+ ts: timeNow(),
174
+ },
175
+ true,
176
+ );
177
+ } else {
178
+ CustomEvents.send(EventNames.PUBLIC_CHAT_MESSAGE, {
179
+ value: msg,
180
+ });
181
+ addMessageToStore(localUid.toString(), {
182
+ msg: msg,
183
+ ts: timeNow(),
184
+ });
185
+ }
186
+ };
187
+
188
+ return (
189
+ <ChatMessagesContext.Provider
190
+ value={{
191
+ messageStore,
192
+ privateMessageStore,
193
+ sendChatMessage,
194
+ }}>
195
+ {props.children}
196
+ </ChatMessagesContext.Provider>
197
+ );
198
+ };
199
+
200
+ const useChatMessages = createHook(ChatMessagesContext);
201
+
202
+ export {ChatMessagesProvider, useChatMessages};
@@ -0,0 +1,78 @@
1
+ /*
2
+ ********************************************
3
+ Copyright © 2021 Agora Lab, Inc., all rights reserved.
4
+ AppBuilder and all associated components, source code, APIs, services, and documentation
5
+ (the “Materials”) are owned by Agora Lab, Inc. and its licensors. The Materials may not be
6
+ accessed, used, modified, or distributed for any purpose without a license from Agora Lab, Inc.
7
+ Use without a license or in violation of any license terms and conditions (including use for
8
+ any purpose competitive to Agora Lab, Inc.’s business) is strictly prohibited. For more
9
+ information visit https://appbuilder.agora.io.
10
+ *********************************************
11
+ */
12
+ import {createHook} from 'fpe-implementation';
13
+ import React, {SetStateAction, useState, useEffect} from 'react';
14
+
15
+ interface individualUnreadMessageCount {
16
+ [key: number]: number;
17
+ }
18
+
19
+ export interface ChatNotificationInterface {
20
+ totalUnreadCount: number;
21
+ unreadGroupMessageCount: number;
22
+ setUnreadGroupMessageCount: React.Dispatch<SetStateAction<number>>;
23
+ unreadPrivateMessageCount: number;
24
+ setUnreadPrivateMessageCount: React.Dispatch<SetStateAction<number>>;
25
+ unreadIndividualMessageCount: individualUnreadMessageCount;
26
+ setUnreadIndividualMessageCount: React.Dispatch<
27
+ SetStateAction<individualUnreadMessageCount>
28
+ >;
29
+ }
30
+
31
+ const ChatNotificationContext = React.createContext<ChatNotificationInterface>({
32
+ totalUnreadCount: 0,
33
+ unreadGroupMessageCount: 0,
34
+ unreadPrivateMessageCount: 0,
35
+ unreadIndividualMessageCount: {},
36
+ setUnreadGroupMessageCount: () => {},
37
+ setUnreadIndividualMessageCount: () => {},
38
+ setUnreadPrivateMessageCount: () => {},
39
+ });
40
+
41
+ interface ChatNotificationProviderProps {
42
+ children: React.ReactNode;
43
+ }
44
+
45
+ const ChatNotificationProvider = (props: ChatNotificationProviderProps) => {
46
+ const [unreadGroupMessageCount, setUnreadGroupMessageCount] = useState(0);
47
+ const [unreadPrivateMessageCount, setUnreadPrivateMessageCount] = useState(0);
48
+ const [unreadIndividualMessageCount, setUnreadIndividualMessageCount] =
49
+ useState<individualUnreadMessageCount>({});
50
+
51
+ useEffect(() => {
52
+ let privateUnreadCount = 0;
53
+ for (const key in unreadIndividualMessageCount) {
54
+ privateUnreadCount =
55
+ privateUnreadCount + unreadIndividualMessageCount[key];
56
+ }
57
+ setUnreadPrivateMessageCount(privateUnreadCount);
58
+ }, [unreadIndividualMessageCount]);
59
+
60
+ return (
61
+ <ChatNotificationContext.Provider
62
+ value={{
63
+ totalUnreadCount: unreadGroupMessageCount + unreadPrivateMessageCount,
64
+ unreadGroupMessageCount,
65
+ setUnreadGroupMessageCount,
66
+ unreadPrivateMessageCount,
67
+ setUnreadPrivateMessageCount,
68
+ unreadIndividualMessageCount,
69
+ setUnreadIndividualMessageCount,
70
+ }}>
71
+ {props.children}
72
+ </ChatNotificationContext.Provider>
73
+ );
74
+ };
75
+
76
+ const useChatNotification = createHook(ChatNotificationContext);
77
+
78
+ export {ChatNotificationProvider, useChatNotification};
@@ -0,0 +1,66 @@
1
+ /*
2
+ ********************************************
3
+ Copyright © 2021 Agora Lab, Inc., all rights reserved.
4
+ AppBuilder and all associated components, source code, APIs, services, and documentation
5
+ (the “Materials”) are owned by Agora Lab, Inc. and its licensors. The Materials may not be
6
+ accessed, used, modified, or distributed for any purpose without a license from Agora Lab, Inc.
7
+ Use without a license or in violation of any license terms and conditions (including use for
8
+ any purpose competitive to Agora Lab, Inc.’s business) is strictly prohibited. For more
9
+ information visit https://appbuilder.agora.io.
10
+ *********************************************
11
+ */
12
+ import {createHook} from 'fpe-implementation';
13
+ import React, {SetStateAction, useState} from 'react';
14
+ import {UidType} from '../../../agora-rn-uikit';
15
+
16
+ export interface ChatUIControlInterface {
17
+ groupActive: boolean;
18
+ privateActive: boolean;
19
+ selectedChatUserId: UidType;
20
+ setGroupActive: React.Dispatch<SetStateAction<boolean>>;
21
+ setPrivateActive: React.Dispatch<SetStateAction<boolean>>;
22
+ setSelectedChatUserId: React.Dispatch<SetStateAction<UidType>>;
23
+ message: string;
24
+ setMessage: React.Dispatch<SetStateAction<string>>;
25
+ }
26
+
27
+ const ChatUIControlContext = React.createContext<ChatUIControlInterface>({
28
+ groupActive: false,
29
+ privateActive: false,
30
+ selectedChatUserId: 0,
31
+ message: '',
32
+ setGroupActive: () => {},
33
+ setPrivateActive: () => {},
34
+ setSelectedChatUserId: () => {},
35
+ setMessage: () => {},
36
+ });
37
+
38
+ interface ChatUIControlProviderProps {
39
+ children: React.ReactNode;
40
+ }
41
+
42
+ const ChatUIControlProvider = (props: ChatUIControlProviderProps) => {
43
+ const [groupActive, setGroupActive] = useState(false);
44
+ const [privateActive, setPrivateActive] = useState(false);
45
+ const [selectedChatUserId, setSelectedChatUserId] = useState<UidType>(0);
46
+ const [message, setMessage] = useState('');
47
+ return (
48
+ <ChatUIControlContext.Provider
49
+ value={{
50
+ groupActive,
51
+ privateActive,
52
+ selectedChatUserId,
53
+ setGroupActive,
54
+ setPrivateActive,
55
+ setSelectedChatUserId,
56
+ message,
57
+ setMessage,
58
+ }}>
59
+ {props.children}
60
+ </ChatUIControlContext.Provider>
61
+ );
62
+ };
63
+
64
+ const useChatUIControl = createHook(ChatUIControlContext);
65
+
66
+ export {ChatUIControlProvider, useChatUIControl};
@@ -0,0 +1,54 @@
1
+ /*
2
+ ********************************************
3
+ Copyright © 2021 Agora Lab, Inc., all rights reserved.
4
+ AppBuilder and all associated components, source code, APIs, services, and documentation
5
+ (the “Materials”) are owned by Agora Lab, Inc. and its licensors. The Materials may not be
6
+ accessed, used, modified, or distributed for any purpose without a license from Agora Lab, Inc.
7
+ Use without a license or in violation of any license terms and conditions (including use for
8
+ any purpose competitive to Agora Lab, Inc.’s business) is strictly prohibited. For more
9
+ information visit https://appbuilder.agora.io.
10
+ *********************************************
11
+ */
12
+
13
+ import React, {useContext, useState} from 'react';
14
+ import Error from '../../subComponents/Error';
15
+ type ErrorType = {
16
+ name: string;
17
+ message: string;
18
+ };
19
+ type ErrorContextType = {
20
+ error: ErrorType | undefined;
21
+ setGlobalErrorMessage: (error: any) => void;
22
+ resetError: () => void;
23
+ };
24
+ const ErrorContext = React.createContext<ErrorContextType>({
25
+ error: {name: '', message: ''},
26
+ setGlobalErrorMessage: () => {},
27
+ resetError: () => {},
28
+ });
29
+
30
+ const ErrorProvider = (props: {children: React.ReactNode}) => {
31
+ const [error, setError] = useState<ErrorType>();
32
+ const setGlobalErrorMessage = (error: ErrorType) => {
33
+ setError(error);
34
+ };
35
+ const resetError = () => {
36
+ setError(undefined);
37
+ };
38
+ return (
39
+ <ErrorContext.Provider value={{error, setGlobalErrorMessage, resetError}}>
40
+ {props.children}
41
+ </ErrorContext.Provider>
42
+ );
43
+ };
44
+
45
+ const CommonError: React.FC = () => {
46
+ const {error} = useContext(ErrorContext);
47
+ return error && (error.name || error.message) ? (
48
+ <Error error={error} showBack={true} />
49
+ ) : (
50
+ <></>
51
+ );
52
+ };
53
+ export {ErrorContext, ErrorProvider};
54
+ export default CommonError;
@@ -0,0 +1,35 @@
1
+ /*
2
+ ********************************************
3
+ Copyright © 2021 Agora Lab, Inc., all rights reserved.
4
+ AppBuilder and all associated components, source code, APIs, services, and documentation
5
+ (the “Materials”) are owned by Agora Lab, Inc. and its licensors. The Materials may not be
6
+ accessed, used, modified, or distributed for any purpose without a license from Agora Lab, Inc.
7
+ Use without a license or in violation of any license terms and conditions (including use for
8
+ any purpose competitive to Agora Lab, Inc.’s business) is strictly prohibited. For more
9
+ information visit https://appbuilder.agora.io.
10
+ *********************************************
11
+ */
12
+
13
+ import React from 'react';
14
+ import {View, StyleSheet} from 'react-native';
15
+ import Logo from '../../subComponents/Logo';
16
+ import {hasBrandLogo} from '../../utils/common';
17
+
18
+ const CommonLogo: React.FC = () => {
19
+ return (
20
+ <View style={style.nav}>
21
+ {hasBrandLogo && <Logo />}
22
+ {/* <OpenInNativeButton /> */}
23
+ </View>
24
+ );
25
+ };
26
+ export default CommonLogo;
27
+ const style = StyleSheet.create({
28
+ nav: {
29
+ flex: 1,
30
+ width: '100%',
31
+ flexDirection: 'row',
32
+ alignItems: 'center',
33
+ justifyContent: 'center',
34
+ },
35
+ });
@@ -0,0 +1,8 @@
1
+ import Logo from './Logo'
2
+ import Error,{ErrorProvider,ErrorContext} from './Error'
3
+ export{
4
+ Logo,
5
+ ErrorContext,
6
+ ErrorProvider,
7
+ Error
8
+ }
@@ -0,0 +1,79 @@
1
+ import {UidType} from '../../../agora-rn-uikit';
2
+ import React, {createContext, useState, useContext} from 'react';
3
+ import {createHook} from 'fpe-implementation';
4
+ import LiveStreamContext, {
5
+ raiseHandListInterface,
6
+ } from '../../components/livestream';
7
+ import {ClientRole, useLocalUid} from '../../../agora-rn-uikit';
8
+ import {filterObject} from '../../utils';
9
+ import useUserList from '../../utils/useUserList';
10
+
11
+ export interface LiveStreamDataObjectInterface {
12
+ [key: number]: {
13
+ role: number;
14
+ raised: boolean;
15
+ ts: number;
16
+ };
17
+ }
18
+ export interface LiveStreamDataContextInterface {
19
+ hostUids: UidType[];
20
+ audienceUids: UidType[];
21
+ liveStreamData: raiseHandListInterface;
22
+ }
23
+ const LiveStreamDataContext = createContext<LiveStreamDataContextInterface>({
24
+ hostUids: [],
25
+ audienceUids: [],
26
+ liveStreamData: {},
27
+ });
28
+
29
+ interface ScreenShareProviderProps {
30
+ children: React.ReactNode;
31
+ }
32
+ const LiveStreamDataProvider = (props: ScreenShareProviderProps) => {
33
+ const localUid = useLocalUid();
34
+ const {renderList} = useUserList();
35
+ const {raiseHandList} = useContext(LiveStreamContext);
36
+ const [hostUids, setHostUids] = useState<UidType[]>([]);
37
+ const [audienceUids, setAudienceUids] = useState<UidType[]>([]);
38
+
39
+ React.useEffect(() => {
40
+ if (Object.keys(renderList).length !== 0) {
41
+ const hostList = filterObject(
42
+ renderList,
43
+ ([k, v]) =>
44
+ (v?.type === 'rtc' || v?.type === 'live') &&
45
+ (raiseHandList[k]
46
+ ? raiseHandList[k]?.role == ClientRole.Broadcaster
47
+ : true) &&
48
+ !v?.offline,
49
+ );
50
+
51
+ const audienceList = filterObject(
52
+ renderList,
53
+ ([k, v]) =>
54
+ (v?.type === 'rtc' || v?.type === 'live') &&
55
+ raiseHandList[k]?.role == ClientRole.Audience &&
56
+ !v.offline,
57
+ );
58
+ const hUids = Object.keys(hostList).map((uid) => parseInt(uid));
59
+ const aUids = Object.keys(audienceList).map((uid) => parseInt(uid));
60
+
61
+ setHostUids(hUids);
62
+ setAudienceUids(aUids);
63
+ }
64
+ }, [renderList, raiseHandList]);
65
+
66
+ return (
67
+ <LiveStreamDataContext.Provider
68
+ value={{
69
+ liveStreamData: raiseHandList,
70
+ hostUids,
71
+ audienceUids,
72
+ }}>
73
+ {props.children}
74
+ </LiveStreamDataContext.Provider>
75
+ );
76
+ };
77
+ const useLiveStreamDataContext = createHook(LiveStreamDataContext);
78
+
79
+ export {useLiveStreamDataContext, LiveStreamDataProvider};
@@ -0,0 +1,47 @@
1
+ import {UidType, PropsContext} from '../../../agora-rn-uikit';
2
+ import React, {
3
+ createContext,
4
+ Dispatch,
5
+ SetStateAction,
6
+ useContext,
7
+ useState,
8
+ } from 'react';
9
+ import {createHook} from 'fpe-implementation';
10
+
11
+ export interface ScreenShareObjectInterface {
12
+ [key: string | number]: {
13
+ name: string;
14
+ isActive: boolean;
15
+ };
16
+ }
17
+ export interface ScreenShareContextInterface {
18
+ screenShareData: ScreenShareObjectInterface;
19
+ setScreenShareData: Dispatch<SetStateAction<ScreenShareObjectInterface>>;
20
+ }
21
+ const ScreenShareContext = createContext<ScreenShareContextInterface>({
22
+ screenShareData: {},
23
+ setScreenShareData: () => {},
24
+ });
25
+
26
+ interface ScreenShareProviderProps {
27
+ children: React.ReactNode;
28
+ }
29
+ const ScreenShareProvider = (props: ScreenShareProviderProps) => {
30
+ const {rtcProps} = useContext(PropsContext);
31
+ const [screenShareData, setScreenShareData] =
32
+ useState<ScreenShareObjectInterface>({
33
+ [rtcProps?.screenShareUid]: {
34
+ name: '',
35
+ isActive: false,
36
+ },
37
+ });
38
+
39
+ return (
40
+ <ScreenShareContext.Provider value={{screenShareData, setScreenShareData}}>
41
+ {props.children}
42
+ </ScreenShareContext.Provider>
43
+ );
44
+ };
45
+ const useScreenContext = createHook(ScreenShareContext);
46
+
47
+ export {useScreenContext, ScreenShareProvider};
@@ -0,0 +1,59 @@
1
+ import {UidType} from '../../../agora-rn-uikit';
2
+ import React, {
3
+ createContext,
4
+ Dispatch,
5
+ SetStateAction,
6
+ useEffect,
7
+ useState,
8
+ } from 'react';
9
+ import {createHook} from 'fpe-implementation';
10
+ import {filterObject} from '../../utils/index';
11
+ import {useRtcContext} from 'fpe-api';
12
+
13
+ export interface WhiteboardObjectInterface {
14
+ [key: number]: {
15
+ active: boolean;
16
+ parentId: UidType;
17
+ type: 'whiteboard';
18
+ };
19
+ }
20
+ export interface WhiteboardContextInterface {
21
+ whiteboardData: WhiteboardObjectInterface;
22
+ setWhiteboardData: Dispatch<SetStateAction<WhiteboardObjectInterface>>;
23
+ }
24
+ const WhiteboardContext = createContext<WhiteboardContextInterface>({
25
+ whiteboardData: {},
26
+ setWhiteboardData: () => {},
27
+ });
28
+
29
+ interface WhiteboardProviderProps {
30
+ children: React.ReactNode;
31
+ }
32
+ const WhiteboardProvider = (props: WhiteboardProviderProps) => {
33
+ const [whiteboardData, setWhiteboardData] =
34
+ useState<WhiteboardObjectInterface>({});
35
+ const {dispatch} = useRtcContext();
36
+
37
+ useEffect(() => {
38
+ const activeData = filterObject(
39
+ whiteboardData,
40
+ ([k, v]) => v.active === true,
41
+ );
42
+ Object.keys(activeData).map((uid) => {
43
+ const uidAsNumber = parseInt(uid);
44
+ dispatch({
45
+ type: 'AddCustomContent',
46
+ value: [uidAsNumber, activeData[uidAsNumber]],
47
+ });
48
+ });
49
+ }, [whiteboardData]);
50
+
51
+ return (
52
+ <WhiteboardContext.Provider value={{whiteboardData, setWhiteboardData}}>
53
+ {props.children}
54
+ </WhiteboardContext.Provider>
55
+ );
56
+ };
57
+ const useScreenContext = createHook(WhiteboardContext);
58
+
59
+ export {useScreenContext, WhiteboardProvider};
@@ -0,0 +1,27 @@
1
+ /*
2
+ ********************************************
3
+ Copyright © 2021 Agora Lab, Inc., all rights reserved.
4
+ AppBuilder and all associated components, source code, APIs, services, and documentation
5
+ (the “Materials”) are owned by Agora Lab, Inc. and its licensors. The Materials may not be
6
+ accessed, used, modified, or distributed for any purpose without a license from Agora Lab, Inc.
7
+ Use without a license or in violation of any license terms and conditions (including use for
8
+ any purpose competitive to Agora Lab, Inc.’s business) is strictly prohibited. For more
9
+ information visit https://appbuilder.agora.io.
10
+ *********************************************
11
+ */
12
+ import {createContext} from 'react';
13
+
14
+ interface DimensionContextInterface {
15
+ getDimensionData: (
16
+ width?: number,
17
+ height?: number,
18
+ ) => {dim: [number, number, boolean]; isDesktop: boolean};
19
+ }
20
+
21
+ const DimensionContext = createContext<DimensionContextInterface>({
22
+ getDimensionData: () => {
23
+ return {dim: [0, 0, false], isDesktop: false};
24
+ },
25
+ });
26
+
27
+ export default DimensionContext;