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
@@ -9,25 +9,31 @@
9
9
  information visit https://appbuilder.agora.io.
10
10
  *********************************************
11
11
  */
12
- import React, {useState, useContext, useEffect} from 'react';
12
+ import React, {useState, useContext} from 'react';
13
13
  import {
14
14
  View,
15
- Platform,
16
15
  Text,
17
16
  StyleSheet,
18
17
  TouchableOpacity,
19
18
  Dimensions,
20
- useWindowDimensions,
21
19
  } from 'react-native';
22
- import {RFValue} from 'react-native-responsive-fontsize';
23
20
  import ChatContainer from '../subComponents/ChatContainer';
24
21
  import ChatInput from '../subComponents/ChatInput';
25
22
  import ChatParticipants from '../subComponents/chat/ChatParticipants';
26
23
  import ColorContext from './ColorContext';
27
- import chatContext from './ChatContext';
24
+ import {useChatNotification} from './chat-notification/useChatNotification';
25
+ import {useString} from '../utils/useString';
26
+ import {isIOS, isValidReactComponent, isWeb} from '../utils/common';
27
+ import {useChatUIControl} from './chat-ui/useChatUIControl';
28
+ import {useFpe} from 'fpe-api';
29
+ import {UidType} from '../../agora-rn-uikit';
28
30
 
29
- const Chat = (props: any) => {
30
- const {height, width} = useWindowDimensions();
31
+ const Chat = () => {
32
+ // commented for v1 release
33
+ // const groupChatLabel = useString('groupChatLabel')();
34
+ // const privateChatLabel = useString('privateChatLabel')();
35
+ const groupChatLabel = 'Group';
36
+ const privateChatLabel = 'Private';
31
37
  const [dim, setDim] = useState([
32
38
  Dimensions.get('window').width,
33
39
  Dimensions.get('window').height,
@@ -35,154 +41,180 @@ const Chat = (props: any) => {
35
41
  ]);
36
42
  const isSmall = dim[0] < 700;
37
43
 
38
- const {userList} = useContext(chatContext);
39
-
40
44
  const {
41
- setChatDisplayed,
42
- pendingPrivateNotification,
43
- pendingPublicNotification,
44
- lastCheckedPrivateState,
45
- privateMessageCountMap,
46
- setPrivateMessageLastSeen,
47
- setPrivateChatDisplayed,
48
- } = props;
49
- const {primaryColor} = useContext(ColorContext);
50
- const [groupActive, setGroupActive] = useState(true);
51
- const [privateActive, setPrivateActive] = useState(false);
52
- const [selectedUserID, setSelectedUser] = useState('');
53
-
54
- //Initally private state should be false
55
- useEffect(() => {
56
- setPrivateChatDisplayed(false);
57
- }, []);
45
+ groupActive,
46
+ setGroupActive,
47
+ privateActive,
48
+ setPrivateActive,
49
+ setSelectedChatUserId: setSelectedUser,
50
+ } = useChatUIControl();
51
+ const {
52
+ unreadGroupMessageCount,
53
+ setUnreadGroupMessageCount,
54
+ unreadPrivateMessageCount,
55
+ setUnreadPrivateMessageCount,
56
+ setUnreadIndividualMessageCount,
57
+ unreadIndividualMessageCount,
58
+ } = useChatNotification();
58
59
 
59
- useEffect(() => {
60
- if (privateActive && selectedUserID) {
61
- setPrivateMessageLastSeen({
62
- userId: selectedUserID,
63
- lastSeenCount: privateMessageCountMap[selectedUserID],
64
- });
65
- }
66
- }, [pendingPrivateNotification]);
60
+ const {primaryColor} = useContext(ColorContext);
67
61
 
68
62
  const selectGroup = () => {
69
63
  setPrivateActive(false);
70
64
  setGroupActive(true);
71
- setPrivateChatDisplayed(false);
65
+ setUnreadGroupMessageCount(0);
66
+ setSelectedUser(0);
72
67
  };
73
68
  const selectPrivate = () => {
74
69
  setGroupActive(false);
75
- setPrivateChatDisplayed(true);
70
+ setSelectedUser(0);
71
+ setPrivateActive(false);
76
72
  };
77
- const selectUser = (userUID: any) => {
73
+ const selectUser = (userUID: UidType) => {
78
74
  setSelectedUser(userUID);
79
75
  setPrivateActive(true);
76
+ setUnreadIndividualMessageCount((prevState) => {
77
+ return {
78
+ ...prevState,
79
+ [userUID]: 0,
80
+ };
81
+ });
82
+ setUnreadPrivateMessageCount(
83
+ unreadPrivateMessageCount - (unreadIndividualMessageCount[userUID] || 0),
84
+ );
80
85
  };
81
86
 
87
+ const {ChatAfterView, ChatBeforeView} = useFpe((data) => {
88
+ let components: {
89
+ ChatAfterView: React.ComponentType;
90
+ ChatBeforeView: React.ComponentType;
91
+ } = {
92
+ ChatAfterView: React.Fragment,
93
+ ChatBeforeView: React.Fragment,
94
+ };
95
+ if (
96
+ data?.components?.videoCall &&
97
+ typeof data?.components?.videoCall === 'object'
98
+ ) {
99
+ // commented for v1 release
100
+ // if (
101
+ // data?.components?.videoCall?.chat &&
102
+ // typeof data?.components?.videoCall?.chat === 'object'
103
+ // ) {
104
+ // if (
105
+ // data?.components?.videoCall?.chat?.after &&
106
+ // isValidReactComponent(data?.components?.videoCall?.chat?.after)
107
+ // ) {
108
+ // components.ChatAfterView = data?.components?.videoCall?.chat?.after;
109
+ // }
110
+ // if (
111
+ // data?.components?.videoCall?.chat?.before &&
112
+ // isValidReactComponent(data?.components?.videoCall?.chat?.before)
113
+ // ) {
114
+ // components.ChatBeforeView = data?.components?.videoCall?.chat?.before;
115
+ // }
116
+ // }
117
+ }
118
+ return components;
119
+ });
120
+
82
121
  return (
83
- <View
84
- style={
85
- Platform.OS === 'web'
86
- ? !isSmall
87
- ? style.chatView
122
+ <>
123
+ <View
124
+ style={
125
+ isWeb
126
+ ? !isSmall
127
+ ? style.chatView
128
+ : style.chatViewNative
88
129
  : style.chatViewNative
89
- : style.chatViewNative
90
- }>
91
- <View style={style.chatNav}>
92
- <TouchableOpacity
93
- onPress={selectGroup}
94
- style={
95
- groupActive
96
- ? [style.groupActive, {borderColor: primaryColor}]
97
- : [
98
- style.group,
99
- {
100
- borderColor: primaryColor,
101
- borderTopColor: primaryColor + '80',
102
- },
103
- ]
104
- }>
105
- {pendingPublicNotification !== 0 ? (
106
- <View style={style.chatNotification}>
107
- <Text>{pendingPublicNotification}</Text>
108
- </View>
109
- ) : null}
110
- <Text style={groupActive ? style.groupTextActive : style.groupText}>
111
- Group
112
- </Text>
113
- </TouchableOpacity>
114
- <TouchableOpacity
115
- onPress={selectPrivate}
116
- style={
117
- !groupActive
118
- ? [style.privateActive, {borderColor: primaryColor}]
119
- : [
120
- style.private,
121
- {
122
- borderColor: primaryColor,
123
- borderTopColor: primaryColor + '80',
124
- },
125
- ]
126
- }>
127
- {pendingPrivateNotification !== 0 ? (
128
- <View style={style.chatNotification}>
129
- <Text>{pendingPrivateNotification}</Text>
130
- </View>
131
- ) : null}
132
- <Text style={!groupActive ? style.groupTextActive : style.groupText}>
133
- Private
134
- </Text>
135
- </TouchableOpacity>
136
- </View>
137
- {groupActive ? (
138
- <>
139
- <ChatContainer privateActive={privateActive} />
140
- <View style={[style.chatInputLineSeparator, {marginBottom: 0}]} />
141
- <View>
142
- <View style={style.chatInputContainer}>
143
- <View style={[style.chatInputLineSeparator, {opacity: 0.3}]} />
144
- <ChatInput privateActive={privateActive} />
130
+ }>
131
+ {/**
132
+ * In Native device we are setting absolute view. so placed ChatBeforeView and ChatAfterView inside the main view
133
+ */}
134
+ <ChatBeforeView />
135
+ <View style={style.chatNav}>
136
+ <TouchableOpacity
137
+ onPress={selectGroup}
138
+ style={
139
+ groupActive
140
+ ? [style.groupActive, {borderColor: primaryColor}]
141
+ : [
142
+ style.group,
143
+ {
144
+ borderColor: primaryColor,
145
+ borderTopColor: primaryColor + '80',
146
+ },
147
+ ]
148
+ }>
149
+ {unreadGroupMessageCount !== 0 ? (
150
+ <View style={style.chatNotification}>
151
+ <Text>{unreadGroupMessageCount}</Text>
152
+ </View>
153
+ ) : null}
154
+ <Text style={groupActive ? style.groupTextActive : style.groupText}>
155
+ {groupChatLabel}
156
+ </Text>
157
+ </TouchableOpacity>
158
+ <TouchableOpacity
159
+ onPress={selectPrivate}
160
+ style={
161
+ !groupActive
162
+ ? [style.privateActive, {borderColor: primaryColor}]
163
+ : [
164
+ style.private,
165
+ {
166
+ borderColor: primaryColor,
167
+ borderTopColor: primaryColor + '80',
168
+ },
169
+ ]
170
+ }>
171
+ {unreadPrivateMessageCount !== 0 ? (
172
+ <View style={style.chatNotification}>
173
+ <Text>{unreadPrivateMessageCount}</Text>
174
+ </View>
175
+ ) : null}
176
+ <Text
177
+ style={!groupActive ? style.groupTextActive : style.groupText}>
178
+ {privateChatLabel}
179
+ </Text>
180
+ </TouchableOpacity>
181
+ </View>
182
+ {groupActive ? (
183
+ <>
184
+ <ChatContainer privateActive={privateActive} />
185
+ <View style={[style.chatInputLineSeparator, {marginBottom: 0}]} />
186
+ <View>
187
+ <View style={style.chatInputContainer}>
188
+ <View style={[style.chatInputLineSeparator, {opacity: 0.3}]} />
189
+ <ChatInput />
190
+ </View>
145
191
  </View>
146
- </View>
147
- </>
148
- ) : (
149
- <>
150
- {!privateActive ? (
151
- <ChatParticipants
152
- selectUser={selectUser}
153
- setPrivateMessageLastSeen={setPrivateMessageLastSeen}
154
- privateMessageCountMap={privateMessageCountMap}
155
- lastCheckedPrivateState={lastCheckedPrivateState}
156
- />
157
- ) : (
158
- <>
159
- <ChatContainer
160
- privateActive={privateActive}
161
- setPrivateActive={setPrivateActive}
162
- selectedUserID={selectedUserID}
163
- selectedUsername={
164
- userList[selectedUserID]
165
- ? userList[selectedUserID]?.name + ' '
166
- : 'User '
167
- }
168
- />
169
- <View style={[style.chatInputLineSeparator, {marginBottom: 0}]} />
170
- <View>
171
- <View style={style.chatInputContainer}>
172
- <View
173
- style={[style.chatInputLineSeparator, {opacity: 0.3}]}
174
- />
175
- <ChatInput
176
- privateActive={privateActive}
177
- selectedUserID={selectedUserID}
178
- />
192
+ </>
193
+ ) : (
194
+ <>
195
+ {!privateActive ? (
196
+ <ChatParticipants selectUser={selectUser} />
197
+ ) : (
198
+ <>
199
+ <ChatContainer selectPrivate={selectPrivate} />
200
+ <View
201
+ style={[style.chatInputLineSeparator, {marginBottom: 0}]}
202
+ />
203
+ <View>
204
+ <View style={style.chatInputContainer}>
205
+ <View
206
+ style={[style.chatInputLineSeparator, {opacity: 0.3}]}
207
+ />
208
+ <ChatInput />
209
+ </View>
179
210
  </View>
180
- </View>
181
- </>
182
- )}
183
- </>
184
- )}
185
- </View>
211
+ </>
212
+ )}
213
+ </>
214
+ )}
215
+ <ChatAfterView />
216
+ </View>
217
+ </>
186
218
  );
187
219
  };
188
220
 
@@ -299,7 +331,7 @@ const style = StyleSheet.create({
299
331
  justifyContent: 'center',
300
332
  backgroundColor: $config.PRIMARY_COLOR,
301
333
  color: $config.SECONDARY_FONT_COLOR,
302
- fontFamily: Platform.OS === 'ios' ? 'Helvetica' : 'sans-serif',
334
+ fontFamily: isIOS ? 'Helvetica' : 'sans-serif',
303
335
  borderRadius: 10,
304
336
  position: 'absolute',
305
337
  left: 25,
@@ -313,7 +345,7 @@ const style = StyleSheet.create({
313
345
  justifyContent: 'center',
314
346
  backgroundColor: $config.PRIMARY_COLOR,
315
347
  color: $config.SECONDARY_FONT_COLOR,
316
- fontFamily: Platform.OS === 'ios' ? 'Helvetica' : 'sans-serif',
348
+ fontFamily: isIOS ? 'Helvetica' : 'sans-serif',
317
349
  borderRadius: 10,
318
350
  position: 'absolute',
319
351
  right: 20,
@@ -9,20 +9,20 @@
9
9
  information visit https://appbuilder.agora.io.
10
10
  *********************************************
11
11
  */
12
- import RtmEngine, {RtmAttribute} from 'agora-react-native-rtm';
13
- import {createContext} from 'react';
14
- import {rtmEventsInterface} from './RTMEvents';
12
+ import RtmEngine from 'agora-react-native-rtm';
13
+ import {UidType} from '../../agora-rn-uikit';
14
+ import {createContext, SetStateAction} from 'react';
15
15
 
16
- export interface channelMessage {
16
+ export interface ChatBubbleProps {
17
17
  isLocal: boolean;
18
- msg: string;
19
- ts: string;
20
- uid: string;
18
+ message: string;
19
+ timestamp: string;
20
+ uid: UidType;
21
21
  }
22
22
 
23
23
  export interface messageStoreInterface {
24
24
  ts: string;
25
- uid: string;
25
+ uid: UidType;
26
26
  msg: string;
27
27
  }
28
28
 
@@ -49,23 +49,17 @@ export enum attrRequestTypes {
49
49
  none = 'NONE',
50
50
  }
51
51
 
52
- interface chatContext {
53
- messageStore: messageStoreInterface | any;
54
- privateMessageStore: any;
52
+ export interface chatContext {
53
+ hasUserJoinedRTM: boolean;
55
54
  sendMessage: (msg: string) => void;
56
- sendMessageToUid: (msg: string, uid: number) => void;
55
+ sendMessageToUid: (msg: string, uid: number | string) => void;
57
56
  sendControlMessage: (msg: string) => void;
58
57
  sendControlMessageToUid: (msg: string, uid: number) => void;
59
- addOrUpdateLocalUserAttributes: (attributes: RtmAttribute[]) => void;
60
- broadcastUserAttributes: (
61
- attributes: RtmAttribute[],
62
- ctrlMsg: controlMessageEnum,
63
- ) => void;
64
58
  engine: RtmEngine;
65
- localUid: string;
66
- userList: any;
59
+ localUid: UidType;
67
60
  onlineUsersCount: number;
68
- events: rtmEventsInterface;
61
+ displayName: string;
62
+ setDisplayName: React.Dispatch<SetStateAction<string>>;
69
63
  }
70
64
 
71
65
  export enum controlMessageEnum {
@@ -76,8 +70,6 @@ export enum controlMessageEnum {
76
70
  kickUser = '5',
77
71
  cloudRecordingActive = '6',
78
72
  cloudRecordingUnactive = '7',
79
- clientRoleChanged = 'CLIENT_ROLE_CHANGED',
80
- // TODO move to livestream provider
81
73
  }
82
74
 
83
75
  const ChatContext = createContext(null as unknown as chatContext);
@@ -12,7 +12,7 @@
12
12
  import React from 'react';
13
13
  import ColorContext from './ColorContext';
14
14
 
15
- const ColorConfigure: React.FC = (props: any) => {
15
+ const ColorConfigure = (props: {children: React.ReactNode}) => {
16
16
  const primaryColor = $config.PRIMARY_COLOR;
17
17
  console.log(primaryColor);
18
18
  return (
@@ -20,7 +20,7 @@ const ColorConfigure: React.FC = (props: any) => {
20
20
  value={{
21
21
  primaryColor: primaryColor,
22
22
  }}>
23
- {true ? props.children : <></>}
23
+ {props.children}
24
24
  </ColorContext.Provider>
25
25
  );
26
26
  };
@@ -10,76 +10,86 @@
10
10
  *********************************************
11
11
  */
12
12
  import React, {useContext} from 'react';
13
- import {
14
- View,
15
- TouchableOpacity,
16
- Image,
17
- Platform,
18
- StyleSheet,
19
- Text,
20
- } from 'react-native';
21
- import {LocalUserContext} from '../../agora-rn-uikit';
22
- import {
23
- LocalAudioMute,
24
- LocalVideoMute,
25
- SwitchCamera,
26
- Endcall,
27
- PropsContext,
28
- ClientRole,
29
- } from '../../agora-rn-uikit';
30
- import Recording from '../subComponents/Recording';
31
- import LiveStreamControls from './livestream/views/LiveStreamControls';
13
+ import {View, StyleSheet} from 'react-native';
14
+ import {PropsContext, ClientRole} from '../../agora-rn-uikit';
15
+ import LocalAudioMute, {
16
+ LocalAudioMuteProps,
17
+ } from '../subComponents/LocalAudioMute';
18
+ import LocalVideoMute, {
19
+ LocalVideoMuteProps,
20
+ } from '../subComponents/LocalVideoMute';
21
+ import Recording, {RecordingButtonProps} from '../subComponents/Recording';
22
+ import LiveStreamControls, {
23
+ LiveStreamControlsProps,
24
+ } from './livestream/views/LiveStreamControls';
25
+ import {useMeetingInfo} from './meeting-info/useMeetingInfo';
26
+ import ScreenshareButton, {
27
+ ScreenshareButtonProps,
28
+ } from '../subComponents/screenshare/ScreenshareButton';
29
+ import LocalEndcall, {LocalEndcallProps} from '../subComponents/LocalEndCall';
30
+ import LocalSwitchCamera, {
31
+ LocalSwitchCameraProps,
32
+ } from '../subComponents/LocalSwitchCamera';
32
33
 
33
- const Controls = (props: any) => {
34
- const {setRecordingActive, recordingActive, isHost} = props;
34
+ const Controls = () => {
35
+ const {isHost} = useMeetingInfo();
35
36
  const {rtcProps} = useContext(PropsContext);
36
37
 
37
38
  return (
38
- <LocalUserContext>
39
- <View style={style.bottomBar}>
40
- {$config.EVENT_MODE && rtcProps.role == ClientRole.Audience ? (
41
- <LiveStreamControls showControls={true} />
42
- ) : (
43
- <>
44
- {/**
45
- * In event mode when raise hand feature is active
46
- * and audience is promoted to host, the audience can also
47
- * demote himself
48
- */}
49
- {$config.EVENT_MODE && (
50
- <LiveStreamControls
51
- showControls={
52
- rtcProps?.role == ClientRole.Broadcaster && !isHost
53
- }
54
- />
55
- )}
56
- <View style={{alignSelf: 'center'}}>
57
- <LocalAudioMute />
58
- </View>
59
- <View style={{alignSelf: 'center'}}>
60
- <LocalVideoMute />
61
- </View>
62
- {isHost && $config.CLOUD_RECORDING && (
63
- <View style={{alignSelf: 'baseline'}}>
64
- <Recording
65
- recordingActive={recordingActive}
66
- setRecordingActive={setRecordingActive}
67
- />
68
- </View>
69
- )}
70
- <View style={{alignSelf: 'center'}}>
71
- <SwitchCamera />
39
+ <View style={style.bottomBar}>
40
+ {$config.EVENT_MODE && rtcProps.role == ClientRole.Audience ? (
41
+ <LiveStreamControls showControls={true} />
42
+ ) : (
43
+ <>
44
+ {/**
45
+ * In event mode when raise hand feature is active
46
+ * and audience is promoted to host, the audience can also
47
+ * demote himself
48
+ */}
49
+ {$config.EVENT_MODE && (
50
+ <LiveStreamControls
51
+ showControls={rtcProps?.role == ClientRole.Broadcaster && !isHost}
52
+ />
53
+ )}
54
+ <View style={{alignSelf: 'center'}}>
55
+ <LocalAudioMute />
56
+ </View>
57
+ <View style={{alignSelf: 'center'}}>
58
+ <LocalVideoMute />
59
+ </View>
60
+ {isHost && $config.CLOUD_RECORDING && (
61
+ <View style={{alignSelf: 'baseline'}}>
62
+ <Recording />
72
63
  </View>
73
- </>
74
- )}
75
- <View style={{alignSelf: 'center'}}>
76
- <Endcall />
77
- </View>
64
+ )}
65
+ <View style={{alignSelf: 'center'}}>
66
+ <LocalSwitchCamera />
67
+ </View>
68
+ </>
69
+ )}
70
+ <View style={{alignSelf: 'center'}}>
71
+ <LocalEndcall />
78
72
  </View>
79
- </LocalUserContext>
73
+ </View>
80
74
  );
81
75
  };
82
-
76
+ export const ControlsComponentsArray: [
77
+ (props: LocalAudioMuteProps) => JSX.Element,
78
+ (props: LocalVideoMuteProps) => JSX.Element,
79
+ (props: LocalSwitchCameraProps) => JSX.Element,
80
+ (props: ScreenshareButtonProps) => JSX.Element,
81
+ (props: RecordingButtonProps) => JSX.Element,
82
+ (props: LocalEndcallProps) => JSX.Element,
83
+ (props: LiveStreamControlsProps) => JSX.Element,
84
+ ] = [
85
+ LocalAudioMute,
86
+ LocalVideoMute,
87
+ LocalSwitchCamera,
88
+ ScreenshareButton,
89
+ Recording,
90
+ LocalEndcall,
91
+ LiveStreamControls,
92
+ ];
83
93
  const style = StyleSheet.create({
84
94
  bottomBar: {
85
95
  flex: 1,