agora-appbuilder-core 3.0.9 → 3.0.10

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 (248) hide show
  1. package/Readme.md +6 -0
  2. package/package.json +2 -2
  3. package/template/_package-lock.json +5871 -4728
  4. package/template/agora-rn-uikit/src/Contexts/LocalUserContext.tsx +4 -0
  5. package/template/agora-rn-uikit/src/Contexts/PropsContext.tsx +18 -0
  6. package/template/agora-rn-uikit/src/Contexts/RtcContext.tsx +2 -0
  7. package/template/agora-rn-uikit/src/Controls/BtnTemplate.tsx +30 -26
  8. package/template/agora-rn-uikit/src/Controls/Icons.ts +30 -83
  9. package/template/agora-rn-uikit/src/Controls/ImageIcon.tsx +6 -6
  10. package/template/agora-rn-uikit/src/Reducer/ActiveSpeakerDetected.ts +11 -0
  11. package/template/agora-rn-uikit/src/Reducer/LocalMuteAudio.ts +1 -0
  12. package/template/agora-rn-uikit/src/Reducer/LocalMuteVideo.ts +1 -0
  13. package/template/agora-rn-uikit/src/Reducer/LocalPermissionState.ts +24 -0
  14. package/template/agora-rn-uikit/src/Reducer/RemoteAudioStateChanged.ts +1 -0
  15. package/template/agora-rn-uikit/src/Reducer/RemoteVideoStateChanged.ts +1 -0
  16. package/template/agora-rn-uikit/src/Reducer/UpdateDualStreamMode.ts +1 -0
  17. package/template/agora-rn-uikit/src/Reducer/UserJoined.ts +2 -0
  18. package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteAudio.ts +1 -0
  19. package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteVideo.ts +1 -0
  20. package/template/agora-rn-uikit/src/Reducer/UserOffline.ts +1 -0
  21. package/template/agora-rn-uikit/src/Reducer/UserPin.ts +11 -0
  22. package/template/agora-rn-uikit/src/Reducer/index.ts +3 -0
  23. package/template/agora-rn-uikit/src/Rtc/Create.tsx +89 -1
  24. package/template/agora-rn-uikit/src/RtcConfigure.tsx +39 -2
  25. package/template/agora-rn-uikit/src/Views/MaxVideoView.native.tsx +15 -5
  26. package/template/agora-rn-uikit/src/Views/MaxVideoView.tsx +15 -9
  27. package/template/agora-rn-uikit/src/index.ts +3 -1
  28. package/template/android/app/build.gradle +1 -0
  29. package/template/android/app/src/main/AndroidManifest.xml +22 -15
  30. package/template/android/app/src/main/assets/fonts/SourceSansPro-Regular.ttf +0 -0
  31. package/template/android/app/src/main/assets/fonts/icomoon.ttf +0 -0
  32. package/template/android/app/src/main/java/com/helloworld/MainActivity.java +50 -0
  33. package/template/android/app/src/main/res/values/colors.xml +7 -0
  34. package/template/android/build.gradle +3 -3
  35. package/template/babel.config.js +1 -0
  36. package/template/bridge/rtc/webNg/RtcEngine.ts +110 -17
  37. package/template/customization-api/sub-components.ts +1 -1
  38. package/template/customization-api/typeDefinition.ts +2 -1
  39. package/template/electron/index.html +27 -27
  40. package/template/electron/renderer/index.js +1 -0
  41. package/template/global.d.ts +25 -4
  42. package/template/index.rsdk.tsx +1 -0
  43. package/template/index.web.js +2 -1
  44. package/template/index.wsdk.tsx +1 -1
  45. package/template/ios/HelloWorld/Info.plist +14 -1
  46. package/template/ios/HelloWorld.xcodeproj/project.pbxproj +17 -0
  47. package/template/metro.config.js +1 -1
  48. package/template/package.json +18 -7
  49. package/template/react-native-toast-message/index.d.ts +43 -43
  50. package/template/react-native-toast-message/src/colors/index.js +3 -2
  51. package/template/react-native-toast-message/src/components/base/index.js +46 -59
  52. package/template/react-native-toast-message/src/components/base/styles.js +16 -32
  53. package/template/react-native-toast-message/src/components/checkbox.js +178 -0
  54. package/template/react-native-toast-message/src/components/error.js +3 -2
  55. package/template/react-native-toast-message/src/components/info.js +3 -2
  56. package/template/react-native-toast-message/src/components/success.js +3 -2
  57. package/template/react-native-toast-message/src/index.js +122 -31
  58. package/template/react-native-toast-message/src/index.sdk.tsx +125 -35
  59. package/template/react-native-toast-message/src/styles.js +3 -4
  60. package/template/react-native-toast-message/src/styles.sdk.ts +3 -4
  61. package/template/react-native.config.js +7 -0
  62. package/template/src/App.tsx +6 -0
  63. package/template/src/AppWrapper.tsx +63 -28
  64. package/template/src/assets/font-styles.css +329 -0
  65. package/template/src/assets/fonts/SourceSansPro-Regular.ttf +0 -0
  66. package/template/src/assets/fonts/icomoon.ttf +0 -0
  67. package/template/src/assets/permission.png +0 -0
  68. package/template/src/assets/selection.json +1 -0
  69. package/template/src/atoms/ActionMenu.tsx +236 -0
  70. package/template/src/atoms/AnimatedActiveSpeaker.native.tsx +71 -0
  71. package/template/src/atoms/AnimatedActiveSpeaker.tsx +84 -0
  72. package/template/src/atoms/AnimatedRings.native.tsx +68 -0
  73. package/template/src/atoms/AnimatedRings.tsx +70 -0
  74. package/template/src/atoms/Card.tsx +61 -0
  75. package/template/src/atoms/CircularProgress.native.tsx +121 -0
  76. package/template/src/atoms/CircularProgress.tsx +102 -0
  77. package/template/src/atoms/CustomIcon.tsx +88 -0
  78. package/template/src/atoms/CustomSwitch.tsx +287 -0
  79. package/template/src/atoms/Dropdown.tsx +306 -0
  80. package/template/src/atoms/HorizontalRule.tsx +3 -1
  81. package/template/src/atoms/IconButton.tsx +162 -0
  82. package/template/src/atoms/ImageIcon.tsx +98 -0
  83. package/template/src/atoms/InfoBubble.tsx +291 -0
  84. package/template/src/atoms/Input.tsx +87 -0
  85. package/template/src/atoms/InviteInfo.tsx +166 -0
  86. package/template/src/atoms/LinkButton.tsx +28 -0
  87. package/template/src/atoms/OutlineButton.tsx +61 -0
  88. package/template/src/atoms/ParticipantsCount.tsx +73 -0
  89. package/template/src/atoms/Popup.tsx +147 -0
  90. package/template/src/atoms/PrimaryButton.tsx +51 -26
  91. package/template/src/atoms/RecordingInfo.tsx +49 -0
  92. package/template/src/atoms/SecondaryButton.tsx +8 -5
  93. package/template/src/atoms/Spacer.tsx +22 -0
  94. package/template/src/atoms/TertiaryButton.tsx +78 -0
  95. package/template/src/atoms/TextInput.tsx +12 -14
  96. package/template/src/atoms/Toggle.tsx +47 -0
  97. package/template/src/atoms/Tooltip.native.tsx +65 -0
  98. package/template/src/atoms/Tooltip.tsx +94 -0
  99. package/template/src/atoms/UserAvatar.tsx +60 -0
  100. package/template/src/components/Chat.tsx +86 -214
  101. package/template/src/components/ChatContext.ts +8 -1
  102. package/template/src/components/ColorConfigure.tsx +1 -1
  103. package/template/src/components/ColorContext.ts +1 -1
  104. package/template/src/components/CommonStyles.ts +44 -0
  105. package/template/src/components/Controls.tsx +342 -42
  106. package/template/src/components/{Controls.native.tsx → Controls1.native.tsx} +6 -4
  107. package/template/src/components/DeviceConfigure.tsx +461 -101
  108. package/template/src/components/DeviceContext.tsx +8 -4
  109. package/template/src/components/EventsConfigure.tsx +144 -7
  110. package/template/src/components/GraphQLProvider.tsx +1 -1
  111. package/template/src/components/GridVideo.tsx +59 -44
  112. package/template/src/components/HostControlView.tsx +114 -35
  113. package/template/src/components/Navbar.tsx +216 -398
  114. package/template/src/components/NetworkQualityContext.tsx +20 -20
  115. package/template/src/components/ParticipantsView.tsx +177 -154
  116. package/template/src/components/PinnedVideo.tsx +207 -120
  117. package/template/src/components/Precall.native.tsx +358 -119
  118. package/template/src/components/Precall.tsx +269 -135
  119. package/template/src/components/RTMConfigure.tsx +27 -4
  120. package/template/src/components/Router.electron.ts +1 -0
  121. package/template/src/components/Router.native.ts +1 -0
  122. package/template/src/components/Router.sdk.ts +1 -0
  123. package/template/src/components/Router.ts +1 -0
  124. package/template/src/components/Settings.tsx +26 -95
  125. package/template/src/components/SettingsView.tsx +251 -56
  126. package/template/src/components/Share.tsx +302 -273
  127. package/template/src/components/StorageContext.tsx +30 -3
  128. package/template/src/components/ToastComponent.tsx +8 -0
  129. package/template/src/components/chat-messages/useChatMessages.tsx +69 -23
  130. package/template/src/components/chat-ui/useChatUIControl.tsx +7 -0
  131. package/template/src/components/common/Error.tsx +20 -6
  132. package/template/src/components/common/Logo.tsx +16 -15
  133. package/template/src/components/contexts/LiveStreamDataContext.tsx +10 -5
  134. package/template/src/components/contexts/VideoMeetingDataContext.tsx +37 -7
  135. package/template/src/components/livestream/LiveStreamContext.tsx +270 -36
  136. package/template/src/components/livestream/Types.ts +39 -14
  137. package/template/src/components/livestream/index.ts +1 -0
  138. package/template/src/components/livestream/views/LiveStreamControls.tsx +12 -4
  139. package/template/src/components/participants/AllAudienceParticipants.tsx +101 -30
  140. package/template/src/components/participants/AllHostParticipants.tsx +103 -34
  141. package/template/src/components/participants/Participant.tsx +302 -0
  142. package/template/src/components/participants/ParticipantName.tsx +13 -7
  143. package/template/src/components/participants/ParticipantSectionTitle.tsx +35 -10
  144. package/template/src/components/participants/ScreenshareParticipants.tsx +144 -12
  145. package/template/src/components/participants/UserActionMenuOptions.tsx +398 -0
  146. package/template/src/components/popups/InvitePopup.tsx +115 -0
  147. package/template/src/components/popups/StopRecordingPopup.tsx +114 -0
  148. package/template/src/components/precall/LocalMute.tsx +84 -14
  149. package/template/src/components/precall/{LocalMute.native.tsx → LocalMute1.native.tsx} +21 -5
  150. package/template/src/components/precall/PermissionHelper.native.tsx +5 -0
  151. package/template/src/components/precall/PermissionHelper.tsx +126 -0
  152. package/template/src/components/precall/PreCallSettings.tsx +52 -0
  153. package/template/src/components/precall/VideoPreview.native.tsx +48 -3
  154. package/template/src/components/precall/VideoPreview.tsx +163 -7
  155. package/template/src/components/precall/joinCallBtn.tsx +15 -2
  156. package/template/src/components/precall/meetingTitle.tsx +15 -12
  157. package/template/src/components/precall/selectDevice.tsx +1 -21
  158. package/template/src/components/precall/textInput.tsx +32 -4
  159. package/template/src/components/precall/usePreCall.tsx +16 -0
  160. package/template/src/components/styles.ts +42 -21
  161. package/template/src/components/useShareLink.tsx +12 -14
  162. package/template/src/components/useToast.tsx +41 -0
  163. package/template/src/components/useVideoCall.tsx +65 -0
  164. package/template/src/language/default-labels/precallScreenLabels.ts +3 -3
  165. package/template/src/pages/Authenticate.tsx +5 -15
  166. package/template/src/pages/Create.tsx +293 -165
  167. package/template/src/pages/Endcall.tsx +148 -0
  168. package/template/src/pages/Join.tsx +93 -67
  169. package/template/src/pages/VideoCall.tsx +89 -64
  170. package/template/src/pages/video-call/ActionSheet.native.tsx +215 -0
  171. package/template/src/pages/video-call/ActionSheet.tsx +226 -0
  172. package/template/src/pages/video-call/ActionSheetContent.tsx +479 -0
  173. package/template/src/pages/video-call/ActionSheetHandle.tsx +38 -0
  174. package/template/src/pages/video-call/ActionSheetStyles.css +138 -0
  175. package/template/src/pages/video-call/DefaultLayouts.ts +4 -4
  176. package/template/src/pages/video-call/NameWithMicIcon.tsx +120 -44
  177. package/template/src/pages/video-call/RenderComponent.tsx +3 -2
  178. package/template/src/pages/video-call/SidePanelHeader.tsx +190 -0
  179. package/template/src/pages/video-call/VideoCallMobileView.tsx +139 -0
  180. package/template/src/pages/video-call/VideoCallScreen.native.tsx +37 -0
  181. package/template/src/pages/video-call/VideoCallScreen.tsx +45 -9
  182. package/template/src/pages/video-call/VideoComponent.tsx +18 -3
  183. package/template/src/pages/video-call/VideoRenderer.tsx +218 -60
  184. package/template/src/rtm-events/constants.ts +2 -0
  185. package/template/src/subComponents/ChatBubble.tsx +123 -83
  186. package/template/src/subComponents/ChatContainer.tsx +257 -84
  187. package/template/src/subComponents/ChatInput.ios.tsx +237 -0
  188. package/template/src/subComponents/ChatInput.tsx +61 -46
  189. package/template/src/subComponents/Checkbox.native.tsx +16 -5
  190. package/template/src/subComponents/Checkbox.tsx +2 -2
  191. package/template/src/subComponents/CopyJoinInfo.tsx +36 -58
  192. package/template/src/subComponents/EndcallPopup.tsx +107 -0
  193. package/template/src/subComponents/FallbackLogo.tsx +122 -40
  194. package/template/src/subComponents/LanguageSelector.tsx +1 -1
  195. package/template/src/subComponents/LayoutIconButton.tsx +201 -0
  196. package/template/src/subComponents/LayoutIconDropdown.tsx +131 -134
  197. package/template/src/subComponents/{LayoutIconDropdown.native.tsx → LayoutIconDropdown1.native.tsx} +4 -18
  198. package/template/src/subComponents/LocalAudioMute.tsx +119 -27
  199. package/template/src/subComponents/LocalEndCall.tsx +71 -33
  200. package/template/src/subComponents/LocalSwitchCamera.tsx +17 -30
  201. package/template/src/subComponents/LocalVideoMute.tsx +117 -27
  202. package/template/src/subComponents/Logo.tsx +3 -4
  203. package/template/src/subComponents/LogoutButton.tsx +1 -1
  204. package/template/src/subComponents/NetworkQualityPill.tsx +60 -63
  205. package/template/src/subComponents/OpenInNativeButton.tsx +3 -3
  206. package/template/src/subComponents/Recording.tsx +28 -29
  207. package/template/src/subComponents/RemoteAudioMute.tsx +83 -29
  208. package/template/src/subComponents/RemoteEndCall.tsx +8 -5
  209. package/template/src/subComponents/RemoteMutePopup.tsx +193 -0
  210. package/template/src/subComponents/RemoteVideoMute.tsx +74 -21
  211. package/template/src/subComponents/RemoveMeetingPopup.tsx +109 -0
  212. package/template/src/subComponents/RemoveScreensharePopup.tsx +109 -0
  213. package/template/src/subComponents/ScreenShareNotice.tsx +83 -8
  214. package/template/src/subComponents/SelectDevice.tsx +404 -61
  215. package/template/src/subComponents/SelectDeviceSettings.backup.tsx +207 -0
  216. package/template/src/subComponents/SelectOAuth.tsx +9 -8
  217. package/template/src/subComponents/SidePanelHeader.tsx +112 -0
  218. package/template/src/subComponents/ToastConfig.tsx +150 -10
  219. package/template/src/subComponents/chat/ChatParticipants.tsx +187 -78
  220. package/template/src/subComponents/livestream/CurrentLiveStreamRequestsView.tsx +95 -32
  221. package/template/src/subComponents/livestream/controls/LocalRaiseHand.tsx +29 -33
  222. package/template/src/subComponents/livestream/controls/RemoteLiveStreamApprovedRequestRecall.tsx +6 -6
  223. package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestApprove.tsx +24 -11
  224. package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestReject.tsx +17 -10
  225. package/template/src/subComponents/recording/useRecording.tsx +79 -27
  226. package/template/src/subComponents/screenshare/ScreenshareButton.tsx +52 -70
  227. package/template/src/subComponents/screenshare/ScreenshareConfigure.native.tsx +11 -2
  228. package/template/src/subComponents/screenshare/ScreenshareConfigure.tsx +26 -4
  229. package/template/src/theme/index.ts +46 -0
  230. package/template/src/utils/PlatformWrapper.tsx +21 -0
  231. package/template/src/utils/common.tsx +155 -1
  232. package/template/src/utils/hexadecimalTransparency.ts +108 -0
  233. package/template/src/utils/index.tsx +19 -0
  234. package/template/src/utils/isMobileOrTablet.ts +7 -2
  235. package/template/src/utils/pendingStateUpdateHelper.ts +19 -0
  236. package/template/src/utils/useButtonTemplate.tsx +1 -0
  237. package/template/src/utils/useFocus.tsx +46 -0
  238. package/template/src/utils/useIsActiveSpeaker.ts +27 -0
  239. package/template/src/utils/useIsHandRaised.ts +13 -0
  240. package/template/src/utils/useMuteToggleLocal.ts +54 -3
  241. package/template/src/utils/useRemoteEndScreenshare.ts +26 -0
  242. package/template/src/utils/useRemoteRequest.ts +84 -0
  243. package/template/web/index.html +5 -0
  244. package/template/webpack.commons.js +13 -8
  245. package/template/webpack.web.config.js +1 -0
  246. package/template/src/assets/icons.ts +0 -102
  247. package/template/src/components/participants/MeParticipant.tsx +0 -38
  248. package/template/src/components/participants/RemoteParticipants.tsx +0 -71
@@ -10,11 +10,23 @@
10
10
  *********************************************
11
11
  */
12
12
  import React, {createContext, ReactChildren, useEffect, useState} from 'react';
13
- import AsyncStorage from '@react-native-community/async-storage';
13
+ import AsyncStorage from '@react-native-async-storage/async-storage'; // '@react-native-community/async-storage';
14
14
  import useMount from './useMount';
15
15
 
16
+ type rememberedDevicesListEntries = Record<
17
+ string,
18
+ 'switch-on-connect' | 'ignore-on-connect'
19
+ >;
20
+
16
21
  export interface StoreInterface {
17
- [key: string]: string | null;
22
+ token: string;
23
+ displayName: string;
24
+ selectedLanguageCode: string;
25
+ rememberedDevicesList: Record<
26
+ MediaDeviceInfo['kind'],
27
+ rememberedDevicesListEntries
28
+ >;
29
+ activeDeviceId: Record<MediaDeviceInfo['kind'], string>;
18
30
  }
19
31
 
20
32
  export interface StorageContextInterface {
@@ -26,6 +38,16 @@ export const initStoreValue: StoreInterface = {
26
38
  token: null,
27
39
  displayName: '',
28
40
  selectedLanguageCode: '',
41
+ rememberedDevicesList: {
42
+ audioinput: {},
43
+ audiooutput: {},
44
+ videoinput: {},
45
+ },
46
+ activeDeviceId: {
47
+ audioinput: '',
48
+ audiooutput: '',
49
+ videoinput: '',
50
+ },
29
51
  };
30
52
 
31
53
  const initStorageContextValue = {
@@ -54,7 +76,12 @@ export const StorageProvider = (props: {children: React.ReactNode}) => {
54
76
  await AsyncStorage.setItem('store', JSON.stringify(initStoreValue));
55
77
  setReady(true);
56
78
  } else {
57
- setStore(JSON.parse(storeString));
79
+ const storeFromStorage = JSON.parse(storeString);
80
+ Object.keys(initStoreValue).forEach((key) => {
81
+ if (!storeFromStorage[key])
82
+ storeFromStorage[key] = initStoreValue[key];
83
+ });
84
+ setStore(storeFromStorage);
58
85
  setReady(true);
59
86
  }
60
87
  console.log('store hydrated', storeString);
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import Toast from '../../react-native-toast-message';
3
+ import ToastConfig from '../subComponents/ToastConfig';
4
+
5
+ const ToastComponent = () => {
6
+ return <Toast ref={(ref) => Toast.setRef(ref)} config={ToastConfig} />;
7
+ };
8
+ export default ToastComponent;
@@ -11,9 +11,9 @@
11
11
  */
12
12
  import {createHook} from 'customization-implementation';
13
13
  import React, {useState, useEffect, useRef} from 'react';
14
- import {useRender} from 'customization-api';
14
+ import {useRender, useRtc} from 'customization-api';
15
15
  import {SidePanelType} from '../../subComponents/SidePanelEnum';
16
- import {useLocalUid, UidType} from '../../../agora-rn-uikit';
16
+ import {useLocalUid, UidType, RenderInterface} from '../../../agora-rn-uikit';
17
17
  import events, {EventPersistLevel} from '../../rtm-events-api';
18
18
  import {EventNames} from '../../rtm-events';
19
19
  import {useChatUIControl} from '../chat-ui/useChatUIControl';
@@ -22,6 +22,7 @@ import Toast from '../../../react-native-toast-message';
22
22
  import {timeNow} from '../../rtm/utils';
23
23
  import {useSidePanel} from '../../utils/useSidePanel';
24
24
  import getUniqueID from '../../utils/getUniqueID';
25
+ import {trimText} from '../../utils/common';
25
26
 
26
27
  enum ChatMessageActionEnum {
27
28
  Create = 'Create_Chat_Message',
@@ -49,6 +50,7 @@ interface ChatMessagesInterface {
49
50
  sendChatMessage: (msg: string, toUid?: UidType) => void;
50
51
  editChatMessage: (msgId: string, msg: string, toUid?: UidType) => void;
51
52
  deleteChatMessage: (msgId: string, toUid?: UidType) => void;
53
+ openPrivateChat: (toUid: UidType) => void;
52
54
  }
53
55
 
54
56
  const ChatMessagesContext = React.createContext<ChatMessagesInterface>({
@@ -57,9 +59,11 @@ const ChatMessagesContext = React.createContext<ChatMessagesInterface>({
57
59
  sendChatMessage: () => {},
58
60
  editChatMessage: () => {},
59
61
  deleteChatMessage: () => {},
62
+ openPrivateChat: () => {},
60
63
  });
61
64
 
62
65
  const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
66
+ const {dispatch} = useRtc();
63
67
  const {renderList} = useRender();
64
68
  const localUid = useLocalUid();
65
69
  const {setSidePanel} = useSidePanel();
@@ -88,7 +92,8 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
88
92
 
89
93
  //commented for v1 release
90
94
  //const fromText = useString('messageSenderNotificationLabel');
91
- const fromText = (name: string) => `From : ${name}`;
95
+ const fromText = (name: string) => `${name} commented in the public chat`;
96
+ const privateMessageLabel = 'You’ve received a private message';
92
97
  useEffect(() => {
93
98
  renderListRef.current.renderList = renderList;
94
99
  }, [renderList]);
@@ -101,42 +106,74 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
101
106
  individualActiveRef.current = selectedChatUserId;
102
107
  }, [selectedChatUserId]);
103
108
 
109
+ const openPrivateChat = (uidAsNumber) => {
110
+ //move this logic into ChatContainer
111
+ // setUnreadPrivateMessageCount(
112
+ // unreadPrivateMessageCount -
113
+ // (unreadIndividualMessageCount[uidAsNumber] || 0),
114
+ // );
115
+ // setUnreadIndividualMessageCount((prevState) => {
116
+ // return {
117
+ // ...prevState,
118
+ // [uidAsNumber]: 0,
119
+ // };
120
+ // });
121
+ setGroupActive(false);
122
+ setSelectedChatUserId(uidAsNumber);
123
+ setPrivateActive(true);
124
+ setSidePanel(SidePanelType.Chat);
125
+ };
126
+
127
+ const updateRenderListState = (
128
+ uid: number,
129
+ data: Partial<RenderInterface>,
130
+ ) => {
131
+ dispatch({type: 'UpdateRenderList', value: [uid, data]});
132
+ };
133
+
104
134
  React.useEffect(() => {
105
135
  const showMessageNotification = (
106
136
  msg: string,
107
137
  uid: string,
108
138
  isPrivateMessage: boolean = false,
109
139
  ) => {
140
+ //don't show group message notification if group chat is open
141
+ if (!isPrivateMessage && groupActiveRef.current) {
142
+ return;
143
+ }
110
144
  const uidAsNumber = parseInt(uid);
145
+ //don't show private message notification if private chat is open
146
+ if (isPrivateMessage && uidAsNumber === individualActiveRef.current) {
147
+ return;
148
+ }
111
149
  Toast.show({
112
- type: 'success',
113
- text1: msg.length > 30 ? msg.slice(0, 30) + '...' : msg,
114
- text2: renderListRef.current.renderList[uidAsNumber]?.name
115
- ? fromText(renderListRef.current.renderList[uidAsNumber]?.name)
150
+ primaryBtn: null,
151
+ secondaryBtn: null,
152
+ type: 'info',
153
+ text1: isPrivateMessage
154
+ ? privateMessageLabel
155
+ : renderListRef.current.renderList[uidAsNumber]?.name
156
+ ? fromText(
157
+ trimText(renderListRef.current.renderList[uidAsNumber]?.name),
158
+ )
116
159
  : '',
117
- visibilityTime: 1000,
160
+ text2: isPrivateMessage
161
+ ? ''
162
+ : msg.length > 30
163
+ ? msg.slice(0, 30) + '...'
164
+ : msg,
165
+ visibilityTime: 3000,
118
166
  onPress: () => {
119
167
  if (isPrivateMessage) {
120
- setUnreadPrivateMessageCount(
121
- unreadPrivateMessageCount -
122
- (unreadIndividualMessageCount[uidAsNumber] || 0),
123
- );
124
- setUnreadIndividualMessageCount((prevState) => {
125
- return {
126
- ...prevState,
127
- [uidAsNumber]: 0,
128
- };
129
- });
130
- setGroupActive(false);
131
- setSelectedChatUserId(uidAsNumber);
132
- setPrivateActive(true);
168
+ openPrivateChat(uidAsNumber);
133
169
  } else {
134
- setUnreadGroupMessageCount(0);
170
+ //move this logic into ChatContainer
171
+ // setUnreadGroupMessageCount(0);
135
172
  setPrivateActive(false);
136
173
  setSelectedChatUserId(0);
137
174
  setGroupActive(true);
175
+ setSidePanel(SidePanelType.Chat);
138
176
  }
139
- setSidePanel(SidePanelType.Chat);
140
177
  },
141
178
  });
142
179
  };
@@ -211,6 +248,14 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
211
248
  const messageData = payload.value;
212
249
  switch (messageAction) {
213
250
  case ChatMessageActionEnum.Create:
251
+ //To order chat participant based on recent message
252
+ try {
253
+ updateRenderListState(data.sender, {
254
+ lastMessageTimeStamp: new Date().getTime(),
255
+ });
256
+ } catch (error) {
257
+ console.log("ERROR : couldn't update the last message timestamp");
258
+ }
214
259
  showMessageNotification(messageData.msg, `${data.sender}`, true);
215
260
  addMessageToPrivateStore(
216
261
  data.sender,
@@ -514,6 +559,7 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
514
559
  sendChatMessage,
515
560
  editChatMessage,
516
561
  deleteChatMessage,
562
+ openPrivateChat,
517
563
  }}>
518
564
  {props.children}
519
565
  </ChatMessagesContext.Provider>
@@ -17,9 +17,11 @@ export interface ChatUIControlInterface {
17
17
  groupActive: boolean;
18
18
  privateActive: boolean;
19
19
  selectedChatUserId: UidType;
20
+ inputActive?: boolean;
20
21
  setGroupActive: React.Dispatch<SetStateAction<boolean>>;
21
22
  setPrivateActive: React.Dispatch<SetStateAction<boolean>>;
22
23
  setSelectedChatUserId: React.Dispatch<SetStateAction<UidType>>;
24
+ setInputActive: React.Dispatch<SetStateAction<boolean>>;
23
25
  message: string;
24
26
  setMessage: React.Dispatch<SetStateAction<string>>;
25
27
  }
@@ -33,6 +35,8 @@ const ChatUIControlContext = React.createContext<ChatUIControlInterface>({
33
35
  setPrivateActive: () => {},
34
36
  setSelectedChatUserId: () => {},
35
37
  setMessage: () => {},
38
+ inputActive: false,
39
+ setInputActive: () => {},
36
40
  });
37
41
 
38
42
  interface ChatUIControlProviderProps {
@@ -42,6 +46,7 @@ interface ChatUIControlProviderProps {
42
46
  const ChatUIControlProvider = (props: ChatUIControlProviderProps) => {
43
47
  const [groupActive, setGroupActive] = useState(false);
44
48
  const [privateActive, setPrivateActive] = useState(false);
49
+ const [inputActive, setInputActive] = useState(false);
45
50
  const [selectedChatUserId, setSelectedChatUserId] = useState<UidType>(0);
46
51
  const [message, setMessage] = useState('');
47
52
  return (
@@ -55,6 +60,8 @@ const ChatUIControlProvider = (props: ChatUIControlProviderProps) => {
55
60
  setSelectedChatUserId,
56
61
  message,
57
62
  setMessage,
63
+ inputActive,
64
+ setInputActive,
58
65
  }}>
59
66
  {props.children}
60
67
  </ChatUIControlContext.Provider>
@@ -10,7 +10,8 @@
10
10
  *********************************************
11
11
  */
12
12
 
13
- import React, {useContext, useState} from 'react';
13
+ import React, {useContext, useEffect, useState} from 'react';
14
+ import Toast from '../../../react-native-toast-message';
14
15
  import Error from '../../subComponents/Error';
15
16
  type ErrorType = {
16
17
  name: string;
@@ -44,11 +45,24 @@ const ErrorProvider = (props: {children: React.ReactNode}) => {
44
45
 
45
46
  const CommonError: React.FC = () => {
46
47
  const {error} = useContext(ErrorContext);
47
- return error && (error.name || error.message) ? (
48
- <Error error={error} showBack={true} />
49
- ) : (
50
- <></>
51
- );
48
+ useEffect(() => {
49
+ if (error?.name || error?.message) {
50
+ Toast.show({
51
+ type: 'error',
52
+ text1: error.name,
53
+ text2: error.message,
54
+ visibilityTime: 1000 * 10,
55
+ primaryBtn: null,
56
+ secondaryBtn: null,
57
+ });
58
+ }
59
+ }, [error]);
60
+ return <></>;
61
+ // return error && (error.name || error.message) ? (
62
+ // <Error error={error} showBack={true} />
63
+ // ) : (
64
+ // <></>
65
+ // );
52
66
  };
53
67
  export {ErrorContext, ErrorProvider};
54
68
  export default CommonError;
@@ -11,26 +11,27 @@
11
11
  */
12
12
 
13
13
  import React from 'react';
14
- import {View, StyleSheet} from 'react-native';
15
- import Logo from '../../subComponents/Logo';
14
+ import {StyleSheet, Image} from 'react-native';
16
15
  import {useHasBrandLogo} from '../../utils/common';
17
-
18
- const CommonLogo: React.FC = () => {
16
+ const Logo: React.FC = () => {
19
17
  const hasBrandLogo = useHasBrandLogo();
18
+ const hasLogo = hasBrandLogo();
19
+ if (!hasLogo) {
20
+ return null;
21
+ }
22
+
20
23
  return (
21
- <View style={style.nav}>
22
- {hasBrandLogo() && <Logo />}
23
- {/* <OpenInNativeButton /> */}
24
- </View>
24
+ <Image
25
+ source={{uri: $config.LOGO}}
26
+ style={style.logo}
27
+ resizeMode="contain"
28
+ />
25
29
  );
26
30
  };
27
- export default CommonLogo;
31
+ export default Logo;
28
32
  const style = StyleSheet.create({
29
- nav: {
30
- flex: 1,
31
- width: '100%',
32
- flexDirection: 'row',
33
- alignItems: 'center',
34
- justifyContent: 'center',
33
+ logo: {
34
+ width: 54,
35
+ height: 19,
35
36
  },
36
37
  });
@@ -1,5 +1,11 @@
1
1
  import {UidType} from '../../../agora-rn-uikit';
2
- import React, {createContext, useState, useContext} from 'react';
2
+ import React, {
3
+ createContext,
4
+ useState,
5
+ useContext,
6
+ useReducer,
7
+ useEffect,
8
+ } from 'react';
3
9
  import {createHook} from 'customization-implementation';
4
10
  import LiveStreamContext, {
5
11
  raiseHandListInterface,
@@ -40,9 +46,8 @@ const LiveStreamDataProvider = (props: ScreenShareProviderProps) => {
40
46
  const hostList = filterObject(
41
47
  renderList,
42
48
  ([k, v]) =>
43
- (v?.type === 'rtc' ||
44
- v?.type === 'live' ||
45
- (v?.type === 'screenshare' && v?.video == 1)) &&
49
+ (v?.type === 'rtc' || v?.type === 'live') && //||
50
+ //(v?.type === 'screenshare' && v?.video == 1)
46
51
  (raiseHandList[k]
47
52
  ? raiseHandList[k]?.role == ClientRole.Broadcaster
48
53
  : true) &&
@@ -67,7 +72,7 @@ const LiveStreamDataProvider = (props: ScreenShareProviderProps) => {
67
72
  <LiveStreamDataContext.Provider
68
73
  value={{
69
74
  liveStreamData: raiseHandList,
70
- hostUids,
75
+ hostUids: hostUids,
71
76
  audienceUids,
72
77
  }}>
73
78
  {props.children}
@@ -1,10 +1,18 @@
1
- import React, {createContext, useState, useEffect, useContext} from 'react';
1
+ import React, {
2
+ createContext,
3
+ useState,
4
+ useEffect,
5
+ useContext,
6
+ useReducer,
7
+ useRef,
8
+ } from 'react';
2
9
  import {createHook} from 'customization-implementation';
3
10
  import {UidType, useLocalUid} from '../../../agora-rn-uikit';
4
11
  import {useMeetingInfo} from '../meeting-info/useMeetingInfo';
5
12
  import events, {EventPersistLevel} from '../../rtm-events-api';
6
13
  import {EventNames} from '../../rtm-events';
7
14
  import ChatContext from '../ChatContext';
15
+ import {useRender} from 'customization-api';
8
16
 
9
17
  export interface VideoMeetingDataInterface {
10
18
  hostUids: UidType[];
@@ -22,10 +30,22 @@ const VideoMeetingDataProvider = (props: VideoMeetingDataProviderProps) => {
22
30
  const {
23
31
  data: {isHost},
24
32
  } = useMeetingInfo();
33
+ const {activeUids} = useRender();
25
34
  const {hasUserJoinedRTM} = useContext(ChatContext);
26
35
  const localUid = useLocalUid();
27
36
  const [hostUids, setHostUids] = useState<UidType[]>([]);
28
37
  const [attendeeUids, setAttendeeUids] = useState<UidType[]>([]);
38
+ const [, forceUpdate] = useReducer((x) => x + 1, 0);
39
+ const hostUidsRef = useRef({hostUids});
40
+ const attendeeUidsRef = useRef({attendeeUids});
41
+
42
+ useEffect(() => {
43
+ hostUidsRef.current.hostUids = hostUids;
44
+ }, [hostUids]);
45
+
46
+ useEffect(() => {
47
+ attendeeUidsRef.current.attendeeUids = attendeeUids;
48
+ }, [attendeeUids]);
29
49
 
30
50
  useEffect(() => {
31
51
  //set local uid
@@ -36,8 +56,8 @@ const VideoMeetingDataProvider = (props: VideoMeetingDataProviderProps) => {
36
56
  events.on(EventNames.VIDEO_MEETING_HOST, (data) => {
37
57
  const payload = JSON.parse(data?.payload);
38
58
  const hostUid = payload?.uid;
39
- if (hostUid && hostUids.indexOf(hostUid) === -1) {
40
- setHostUids((prevState) => [...prevState, hostUid]);
59
+ if (hostUid && hostUidsRef?.current?.hostUids.indexOf(hostUid) === -1) {
60
+ setHostUids([...hostUidsRef?.current?.hostUids, hostUid]);
41
61
  }
42
62
  });
43
63
 
@@ -45,8 +65,14 @@ const VideoMeetingDataProvider = (props: VideoMeetingDataProviderProps) => {
45
65
  events.on(EventNames.VIDEO_MEETING_ATTENDEE, (data) => {
46
66
  const payload = JSON.parse(data?.payload);
47
67
  const attendeeUid = payload?.uid;
48
- if (attendeeUid && attendeeUids.indexOf(attendeeUid) === -1) {
49
- setAttendeeUids((prevState) => [...prevState, attendeeUid]);
68
+ if (
69
+ attendeeUid &&
70
+ attendeeUidsRef?.current?.attendeeUids?.indexOf(attendeeUid) === -1
71
+ ) {
72
+ setAttendeeUids([
73
+ ...attendeeUidsRef?.current?.attendeeUids,
74
+ attendeeUid,
75
+ ]);
50
76
  }
51
77
  });
52
78
 
@@ -70,11 +96,15 @@ const VideoMeetingDataProvider = (props: VideoMeetingDataProviderProps) => {
70
96
  }
71
97
  }, [isHost, hasUserJoinedRTM]);
72
98
 
99
+ useEffect(() => {
100
+ forceUpdate();
101
+ }, [activeUids]);
102
+
73
103
  return (
74
104
  <VideoMeetingData.Provider
75
105
  value={{
76
- hostUids,
77
- attendeeUids,
106
+ hostUids: hostUids.filter((i) => activeUids.indexOf(i) !== -1),
107
+ attendeeUids: attendeeUids.filter((i) => activeUids.indexOf(i) !== -1),
78
108
  }}>
79
109
  {props.children}
80
110
  </VideoMeetingData.Provider>