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
@@ -1,120 +1,229 @@
1
- import React, {useContext} from 'react';
1
+ import React, {useState} from 'react';
2
2
  import {
3
3
  View,
4
4
  Text,
5
- TouchableOpacity,
6
5
  ScrollView,
7
6
  useWindowDimensions,
8
7
  StyleSheet,
8
+ Pressable,
9
9
  } from 'react-native';
10
10
  import {RFValue} from 'react-native-responsive-fontsize';
11
11
  import TextWithTooltip from '../TextWithTooltip';
12
12
  import {useString} from '../../utils/useString';
13
- import {isIOS, isWebInternal} from '../../utils/common';
13
+ import {isIOS, isMobileUA, isWebInternal} from '../../utils/common';
14
14
  import {useChatNotification} from '../../components/chat-notification/useChatNotification';
15
15
  import {UidType, useLocalUid} from '../../../agora-rn-uikit';
16
+ import ImageIcon from '../../atoms/ImageIcon';
16
17
  import {useRender} from 'customization-api';
18
+ import UserAvatar from '../../atoms/UserAvatar';
19
+ import ThemeConfig from '../../theme';
20
+ import hexadecimalTransparency from '../../utils/hexadecimalTransparency';
21
+ import Spacer from '../../atoms/Spacer';
22
+
23
+ const ChatIcon = () => (
24
+ <View style={{alignSelf: 'center', marginRight: 20}}>
25
+ <ImageIcon
26
+ iconType="plain"
27
+ name="chat-nav"
28
+ tintColor={$config.SECONDARY_ACTION_COLOR}
29
+ />
30
+ </View>
31
+ );
17
32
 
18
33
  const ChatParticipants = (props: any) => {
19
34
  //commented for v1 release
20
35
  //const remoteUserDefaultLabel = useString('remoteUserDefaultLabel')();
21
36
  const remoteUserDefaultLabel = 'User';
22
37
  const {selectUser} = props;
23
- const {height, width} = useWindowDimensions();
24
- const {renderList} = useRender();
38
+ const {renderList, activeUids} = useRender();
25
39
  const localUid = useLocalUid();
26
40
  const {unreadIndividualMessageCount} = useChatNotification();
27
- const isChatUser = (userId: UidType, userInfo: any) => {
28
- return (
29
- userId !== localUid && //user can't chat with own user
30
- // @ts-ignore
31
- userId !== '1' && //user can't chat with pstn user
32
- userInfo?.type === 'rtc' &&
33
- !userInfo?.offline
34
- );
35
- };
36
-
41
+ const isMobile = isMobileUA();
37
42
  return (
38
43
  <ScrollView>
39
- {Object.entries(renderList).map(([uid, value]) => {
40
- const uidAsNumber = parseInt(uid);
41
- if (isChatUser(uidAsNumber, value)) {
44
+ {activeUids && activeUids.length === 1 ? (
45
+ <View style={style.defaultMessageContainer}>
46
+ <Text style={style.defaultMessageText}>
47
+ No one else has joined yet.
48
+ </Text>
49
+ </View>
50
+ ) : (
51
+ <></>
52
+ )}
53
+ {Object.keys(renderList)
54
+ .map((i) => parseInt(i))
55
+ .filter((i) => {
56
+ try {
57
+ if (isNaN(i)) {
58
+ return false;
59
+ } else {
60
+ const userId = i;
61
+ const userInfo = renderList[userId];
62
+ return (
63
+ userId !== localUid && //user can't chat with own user
64
+ // @ts-ignore
65
+ userId !== '1' && //user can't chat with pstn user
66
+ userInfo?.type === 'rtc' &&
67
+ !userInfo?.offline
68
+ );
69
+ }
70
+ } catch (error) {
71
+ return false;
72
+ }
73
+ })
74
+ .sort((a, b) => {
42
75
  return (
43
- <TouchableOpacity
44
- style={style.participantContainer}
45
- key={uid}
46
- onPress={() => {
47
- selectUser(uidAsNumber);
48
- }}>
49
- {unreadIndividualMessageCount &&
50
- unreadIndividualMessageCount[uidAsNumber] ? (
51
- <View style={style.chatNotificationPrivate}>
52
- <Text>{unreadIndividualMessageCount[uidAsNumber]}</Text>
53
- </View>
54
- ) : null}
55
- <View style={{flex: 1}}>
56
- <TextWithTooltip
57
- touchable={false}
58
- style={[
59
- style.participantText,
60
- {
61
- fontSize: RFValue(16, height > width ? height : width),
62
- },
63
- ]}
64
- value={
65
- renderList[uidAsNumber]
66
- ? renderList[uidAsNumber].name + ''
67
- : remoteUserDefaultLabel
68
- }
69
- />
70
- </View>
71
- <View>
72
- <Text
73
- style={{
74
- color: $config.PRIMARY_FONT_COLOR,
75
- fontSize: 18,
76
- }}>{`>`}</Text>
77
- </View>
78
- </TouchableOpacity>
76
+ renderList[b]?.lastMessageTimeStamp -
77
+ renderList[a]?.lastMessageTimeStamp
79
78
  );
80
- }
81
- })}
79
+ })
80
+ .map((uid) => {
81
+ const uidAsNumber = uid;
82
+ const name = renderList[uidAsNumber]
83
+ ? renderList[uidAsNumber].name + ''
84
+ : remoteUserDefaultLabel;
85
+ return (
86
+ <PlatformWrapper key={'chat-participant' + uid}>
87
+ {(isHovered: boolean) => {
88
+ return (
89
+ <Pressable
90
+ onPress={() => {
91
+ selectUser(uidAsNumber);
92
+ }}>
93
+ <View style={style.participantContainer}>
94
+ <View style={style.bgContainerStyle}>
95
+ <UserAvatar
96
+ name={name}
97
+ containerStyle={style.userAvatarContainer}
98
+ textStyle={style.userAvatarText}
99
+ />
100
+ </View>
101
+ <View style={style.participantTextContainer}>
102
+ <Text numberOfLines={1} style={[style.participantText]}>
103
+ {name}
104
+ </Text>
105
+ </View>
106
+ {unreadIndividualMessageCount &&
107
+ unreadIndividualMessageCount[uidAsNumber] &&
108
+ !isHovered ? (
109
+ <>
110
+ <View style={style.chatNotificationPrivate}>
111
+ <Text style={style.chatNotificationCountText}>
112
+ {unreadIndividualMessageCount[uidAsNumber]}
113
+ </Text>
114
+ </View>
115
+ <Spacer size={20} horizontal={true} />
116
+ </>
117
+ ) : isMobile || isHovered ? (
118
+ <ChatIcon />
119
+ ) : (
120
+ <></>
121
+ )}
122
+ </View>
123
+ </Pressable>
124
+ );
125
+ }}
126
+ </PlatformWrapper>
127
+ );
128
+ })}
82
129
  </ScrollView>
83
130
  );
84
131
  };
85
132
 
133
+ const PlatformWrapper = ({children}) => {
134
+ const [isHovered, setIsHovered] = useState(false);
135
+ return isWebInternal() && !isMobileUA() ? (
136
+ <div
137
+ style={{
138
+ backgroundColor: isHovered
139
+ ? $config.CARD_LAYER_5_COLOR + hexadecimalTransparency['10%']
140
+ : 'transparent',
141
+ cursor: isHovered ? 'pointer' : 'auto',
142
+ }}
143
+ onMouseEnter={() => {
144
+ setIsHovered(true);
145
+ }}
146
+ onMouseLeave={() => {
147
+ setIsHovered(false);
148
+ }}>
149
+ {children(isHovered)}
150
+ </div>
151
+ ) : (
152
+ <>{children(false)}</>
153
+ );
154
+ };
155
+
86
156
  const style = StyleSheet.create({
157
+ defaultMessageContainer: {
158
+ backgroundColor: $config.CARD_LAYER_2_COLOR,
159
+ borderRadius: 8,
160
+ padding: 12,
161
+ marginTop: 20,
162
+ marginHorizontal: 20,
163
+ marginBottom: 0,
164
+ },
165
+ defaultMessageText: {
166
+ fontFamily: ThemeConfig.FontFamily.sansPro,
167
+ fontWeight: '400',
168
+ fontSize: 12,
169
+ color: $config.FONT_COLOR + hexadecimalTransparency['40%'],
170
+ },
171
+ bgContainerStyle: {
172
+ backgroundColor: $config.VIDEO_AUDIO_TILE_AVATAR_COLOR,
173
+ width: 36,
174
+ height: 36,
175
+ borderRadius: 18,
176
+ marginRight: 8,
177
+ marginLeft: 20,
178
+ marginVertical: 8,
179
+ },
180
+ userAvatarContainer: {
181
+ width: 36,
182
+ height: 36,
183
+ borderRadius: 18,
184
+ },
185
+ userAvatarText: {
186
+ fontSize: ThemeConfig.FontSize.tiny,
187
+ lineHeight: 12,
188
+ fontWeight: '400',
189
+ color: $config.CARD_LAYER_1_COLOR,
190
+ },
87
191
  participantContainer: {
88
192
  flexDirection: 'row',
89
- flex: 1,
90
- height: 20,
91
- marginTop: 10,
92
- backgroundColor: $config.SECONDARY_FONT_COLOR,
193
+ // flex: 1,
93
194
  overflow: 'hidden',
94
- marginHorizontal: 10,
195
+ justifyContent: 'space-between',
196
+ alignItems: 'center',
95
197
  },
96
- participantText: {
198
+ participantTextContainer: {
97
199
  flex: 1,
98
- fontWeight: isWebInternal() ? '500' : '700',
99
- flexDirection: 'row',
100
- color: $config.PRIMARY_FONT_COLOR,
200
+ alignSelf: 'center',
201
+ },
202
+ participantText: {
203
+ //flex: 1,
204
+ fontFamily: ThemeConfig.FontFamily.sansPro,
205
+ fontWeight: '400',
206
+ fontSize: 14,
207
+ lineHeight: 14,
208
+ color: $config.FONT_COLOR,
101
209
  textAlign: 'left',
102
210
  flexShrink: 1,
103
- marginRight: 30,
104
211
  },
105
212
  chatNotificationPrivate: {
106
- width: 20,
107
- height: 20,
108
- display: 'flex',
109
- alignItems: 'center',
110
- justifyContent: 'center',
111
- backgroundColor: $config.PRIMARY_COLOR,
112
- color: $config.SECONDARY_FONT_COLOR,
113
- fontFamily: isIOS() ? 'Helvetica' : 'sans-serif',
114
- borderRadius: 10,
115
- position: 'absolute',
116
- right: 20,
117
- top: 0,
213
+ backgroundColor: $config.SEMANTIC_NEUTRAL,
214
+ borderRadius: 8,
215
+ alignSelf: 'center',
216
+ },
217
+ chatNotificationCountText: {
218
+ fontFamily: ThemeConfig.FontFamily.sansPro,
219
+ fontWeight: '600',
220
+ fontSize: 12,
221
+ lineHeight: 12,
222
+ textAlign: 'center',
223
+ color: $config.FONT_COLOR,
224
+ paddingVertical: 2,
225
+ paddingLeft: 8,
226
+ paddingRight: 9,
118
227
  },
119
228
  });
120
229
 
@@ -1,14 +1,15 @@
1
1
  import React, {useContext, useEffect, useState} from 'react';
2
- import {View, Text} from 'react-native';
2
+ import {View, Text, StyleSheet} from 'react-native';
3
3
  import RemoteLiveStreamRequestApprove from './controls/RemoteLiveStreamRequestApprove';
4
4
  import RemoteLiveStreamRequestReject from './controls/RemoteLiveStreamRequestReject';
5
- import ParticipantName from '../../components/participants/ParticipantName';
6
5
  import LiveStreamContext, {RaiseHandValue} from '../../components/livestream';
7
6
  import {filterObject} from '../../utils/index';
8
7
  import ParticipantSectionTitle from '../../components/participants/ParticipantSectionTitle';
9
8
  import {useString} from '../../utils/useString';
10
9
  import {ClientRole} from '../../../agora-rn-uikit';
11
10
  import {useRender} from 'customization-api';
11
+ import UserAvatar from '../../atoms/UserAvatar';
12
+ import Spacer from '../../atoms/Spacer';
12
13
 
13
14
  const CurrentLiveStreamRequestsView = (props: any) => {
14
15
  //commented for v1 release
@@ -22,7 +23,6 @@ const CurrentLiveStreamRequestsView = (props: any) => {
22
23
  const remoteUserDefaultLabel = 'User';
23
24
  const noUserFoundLabel = 'User not found';
24
25
  const raisedHandsListTitleLabel = 'Streaming Request';
25
- const {p_style} = props;
26
26
  const {renderList} = useRender();
27
27
  const {raiseHandList, setLastCheckedRequestTimestamp} =
28
28
  useContext(LiveStreamContext);
@@ -45,40 +45,103 @@ const CurrentLiveStreamRequestsView = (props: any) => {
45
45
  setLastCheckedRequestTimestamp(new Date().getTime());
46
46
  };
47
47
  }, []);
48
-
48
+ const containerStyle = {
49
+ backgroundColor: $config.VIDEO_AUDIO_TILE_AVATAR_COLOR,
50
+ width: 36,
51
+ height: 36,
52
+ borderRadius: 18,
53
+ };
54
+ const textStyle = {
55
+ fontSize: 12,
56
+ fontWeight: '400',
57
+ color: $config.CARD_LAYER_1_COLOR,
58
+ };
59
+ const [showRequestSection, setShowRequestSection] = useState(true);
49
60
  return (
50
61
  <>
51
- <ParticipantSectionTitle
52
- title={raisedHandsListTitleLabel + ' '}
53
- count={Object.keys(activeLiveStreamRequests).length}
54
- />
55
- <View style={p_style.participantContainer}>
56
- {Object.keys(raiseHandList).length == 0 ||
57
- Object.keys(activeLiveStreamRequests).length == 0 ? (
58
- <Text style={p_style.infoText}>{noLiveStreamingRequestsLabel}</Text>
59
- ) : (
60
- Object.keys(activeLiveStreamRequests).map(
61
- (userUID: any, index: number) =>
62
- renderList[userUID] ? (
63
- <View style={p_style.participantRow} key={index}>
64
- <ParticipantName
65
- value={renderList[userUID]?.name || remoteUserDefaultLabel}
66
- />
67
- <View style={p_style.participantActionContainer}>
68
- <RemoteLiveStreamRequestApprove uid={userUID} />
69
- <RemoteLiveStreamRequestReject uid={userUID} />
62
+ {Object.keys(raiseHandList).length == 0 ||
63
+ Object.keys(activeLiveStreamRequests).length == 0 ? (
64
+ <></>
65
+ ) : (
66
+ <>
67
+ <ParticipantSectionTitle
68
+ title={raisedHandsListTitleLabel + ' '}
69
+ count={Object.keys(activeLiveStreamRequests).length}
70
+ isOpen={showRequestSection}
71
+ onPress={() => setShowRequestSection(!showRequestSection)}
72
+ />
73
+ {showRequestSection ? (
74
+ Object.keys(activeLiveStreamRequests).map(
75
+ (userUID: any, index: number) =>
76
+ renderList[userUID] ? (
77
+ <View style={styles.container}>
78
+ <View style={styles.userInfoContainer}>
79
+ <UserAvatar
80
+ name={renderList[userUID].name}
81
+ containerStyle={containerStyle}
82
+ textStyle={textStyle}
83
+ />
84
+ <View style={{alignSelf: 'center', flex: 1}}>
85
+ <Text
86
+ style={styles.participantNameText}
87
+ numberOfLines={1}>
88
+ {renderList[userUID].name}
89
+ </Text>
90
+ </View>
91
+ </View>
92
+ <View style={styles.btnContainer}>
93
+ <RemoteLiveStreamRequestReject
94
+ uid={userUID}
95
+ toastId={raiseHandList[userUID].ts}
96
+ />
97
+ <Spacer size={8} horizontal={true} />
98
+ <RemoteLiveStreamRequestApprove
99
+ uid={userUID}
100
+ toastId={raiseHandList[userUID].ts}
101
+ />
102
+ </View>
103
+ </View>
104
+ ) : (
105
+ <View style={{alignSelf: 'center'}} key={index}>
106
+ <Text>{noUserFoundLabel}</Text>
70
107
  </View>
71
- </View>
72
- ) : (
73
- <View style={p_style.participantRow} key={index}>
74
- <ParticipantName value={noUserFoundLabel} />
75
- </View>
76
- ),
77
- )
78
- )}
79
- </View>
108
+ ),
109
+ )
110
+ ) : (
111
+ <Spacer size={1} />
112
+ )}
113
+ </>
114
+ )}
80
115
  </>
81
116
  );
82
117
  };
118
+ const styles = StyleSheet.create({
119
+ btnContainer: {
120
+ flex: 1,
121
+ flexDirection: 'row',
122
+ justifyContent: 'center',
123
+ alignItems: 'center',
124
+ },
125
+ container: {
126
+ flex: 1,
127
+ flexDirection: 'row',
128
+ paddingHorizontal: 20,
129
+ paddingVertical: 16,
130
+ justifyContent: 'space-between',
131
+ },
132
+ userInfoContainer: {
133
+ flex: 0.7,
134
+ flexDirection: 'row',
135
+ },
136
+ participantNameText: {
137
+ fontWeight: '400',
138
+ fontSize: 12,
139
+ fontFamily: 'Source Sans Pro',
140
+ flexDirection: 'row',
141
+ color: $config.FONT_COLOR,
142
+ textAlign: 'left',
143
+ marginHorizontal: 8,
144
+ },
145
+ });
83
146
 
84
147
  export default CurrentLiveStreamRequestsView;
@@ -10,46 +10,51 @@
10
10
  *********************************************
11
11
  */
12
12
  import React, {useContext} from 'react';
13
- import {StyleSheet} from 'react-native';
14
13
  import LiveStreamContext, {
15
14
  RaiseHandValue,
16
15
  } from '../../../components/livestream';
17
- import {PropsContext} from '../../../../agora-rn-uikit';
18
- import {BtnTemplate} from '../../../../agora-rn-uikit';
19
- import icons from '../../../assets/icons';
20
16
  import {useString} from '../../../utils/useString';
17
+ import Styles from '../../../components/styles';
21
18
  import ChatContext from '../../../components/ChatContext';
19
+ import IconButton from '../../../atoms/IconButton';
20
+ import ThemeConfig from '../../../theme';
21
+ import {ClientRole, PropsContext} from '../../../../agora-rn-uikit';
22
+ import {useRender} from 'customization-api';
23
+ import {isMobileUA} from '../../../utils/common';
22
24
 
23
- const LocalRaiseHand = () => {
24
- const {styleProps} = useContext(PropsContext);
25
+ interface LocalRaiseHandProps {
26
+ showLabel?: boolean;
27
+ }
28
+ const LocalRaiseHand = (props: LocalRaiseHandProps) => {
25
29
  const {audienceSendsRequest, audienceRecallsRequest, raiseHandList} =
26
30
  useContext(LiveStreamContext);
31
+ const {rtcProps} = useContext(PropsContext);
27
32
  const {localUid} = useContext(ChatContext);
28
- const {localBtnStyles} = styleProps || {};
29
- const {theme} = styleProps || {};
30
- const {muteLocalAudio} = localBtnStyles || {};
33
+ const {activeUids} = useRender();
34
+ const {showLabel = $config.ICON_TEXT} = props;
31
35
  //commented for v1 release
32
36
  //const handStatusText = useString<boolean>('raiseHandButton');
33
37
  const handStatusText = (toggle: boolean) =>
34
38
  toggle ? 'Lower hand' : 'Raise Hand';
39
+ const isHandRasied = raiseHandList[localUid]?.raised === RaiseHandValue.TRUE;
35
40
  return (
36
- <BtnTemplate
37
- icon={icons['raiseHandIcon']}
38
- btnText={handStatusText(
39
- raiseHandList[localUid]?.raised === RaiseHandValue.TRUE,
40
- )}
41
- color={
42
- raiseHandList[localUid]?.raised === RaiseHandValue.TRUE
43
- ? '#FD0845'
44
- : theme
45
- }
46
- style={{
47
- ...style.localBtn,
48
- ...(localBtnStyles as object),
49
- ...(muteLocalAudio as object),
41
+ <IconButton
42
+ iconProps={{
43
+ name: isHandRasied ? 'lower-hand' : 'raise-hand',
44
+ tintColor: isHandRasied
45
+ ? $config.PRIMARY_ACTION_TEXT_COLOR
46
+ : $config.SECONDARY_ACTION_COLOR,
47
+ iconBackgroundColor: isHandRasied
48
+ ? $config.PRIMARY_ACTION_BRAND_COLOR
49
+ : '',
50
+ base64: isMobileUA() ? true : false,
51
+ }}
52
+ btnTextProps={{
53
+ text: showLabel ? handStatusText(isHandRasied) : '',
54
+ textColor: $config.FONT_COLOR,
50
55
  }}
51
56
  onPress={() => {
52
- if (raiseHandList[localUid]?.raised === RaiseHandValue.TRUE) {
57
+ if (isHandRasied) {
53
58
  audienceRecallsRequest();
54
59
  } else {
55
60
  audienceSendsRequest();
@@ -59,13 +64,4 @@ const LocalRaiseHand = () => {
59
64
  );
60
65
  };
61
66
 
62
- const style = StyleSheet.create({
63
- localBtn: {
64
- borderRadius: 23,
65
- borderWidth: 4 * StyleSheet.hairlineWidth,
66
- borderColor: '#007aff',
67
- backgroundColor: '#007aff',
68
- },
69
- });
70
-
71
67
  export default LocalRaiseHand;
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
- import {BtnTemplate, UidType} from '../../../../agora-rn-uikit';
2
+ import IconButton from '../../../atoms/IconButton';
3
+ import {UidType} from '../../../../agora-rn-uikit';
3
4
  import {LiveStreamControlMessageEnum} from '../../../components/livestream';
4
- import icons from '../../../assets/icons';
5
5
  import events, {EventPersistLevel} from '../../../rtm-events-api';
6
6
 
7
7
  export interface RemoteLiveStreamApprovedRequestRecallProps {
@@ -11,8 +11,7 @@ const RemoteLiveStreamApprovedRequestRecall = (
11
11
  props: RemoteLiveStreamApprovedRequestRecallProps,
12
12
  ) => {
13
13
  return (
14
- <BtnTemplate
15
- style={{width: 24, height: 22}}
14
+ <IconButton
16
15
  onPress={() => {
17
16
  events.send(
18
17
  LiveStreamControlMessageEnum.raiseHandRequestRejected,
@@ -21,8 +20,9 @@ const RemoteLiveStreamApprovedRequestRecall = (
21
20
  props.uid,
22
21
  );
23
22
  }}
24
- color="#FD0845"
25
- icon={icons['demoteIcon']}
23
+ // color="#FD0845"
24
+ //todo hari
25
+ //icon={Icons['demoteIcon']}
26
26
  />
27
27
  );
28
28
  };
@@ -1,30 +1,43 @@
1
1
  import React, {useContext} from 'react';
2
2
  import {View} from 'react-native';
3
- import {BtnTemplate, PropsContext, UidType} from '../../../../agora-rn-uikit';
3
+ import {PropsContext, UidType} from '../../../../agora-rn-uikit';
4
4
  import LiveStreamContext from '../../../components/livestream';
5
- import icons from '../../../assets/icons';
5
+ import PrimaryButton from '../../../atoms/PrimaryButton';
6
+ import ThemeConfig from '../../../theme';
7
+ import Toast from '../../../../react-native-toast-message';
6
8
 
7
9
  export interface RemoteLiveStreamControlProps {
8
10
  uid: UidType;
11
+ toastId: number;
9
12
  }
10
13
 
11
14
  const RemoteLiveStreamRequestApprove = (
12
15
  props: RemoteLiveStreamControlProps,
13
16
  ) => {
14
- const {uid} = props;
17
+ const {uid, toastId} = props;
15
18
  const {hostApprovesRequestOfUID} = useContext(LiveStreamContext);
16
- const {styleProps} = useContext(PropsContext);
17
- const {remoteBtnStyles} = styleProps || {};
18
-
19
- const {liveStreamHostControlBtns} = remoteBtnStyles || {};
20
19
 
21
20
  return (
22
- <View style={{...(liveStreamHostControlBtns as object), marginRight: 15}}>
23
- <BtnTemplate
21
+ <View style={{flex: 1}}>
22
+ <PrimaryButton
23
+ containerStyle={{
24
+ minWidth: 'auto',
25
+ borderRadius: ThemeConfig.BorderRadius.small,
26
+ height: 38,
27
+ paddingHorizontal: 8,
28
+ paddingVertical: 8,
29
+ }}
30
+ textStyle={{
31
+ fontWeight: '600',
32
+ fontSize: 12,
33
+ }}
24
34
  disabled={!uid}
25
- icon={icons['checkCircleIcon']}
26
- style={{...(liveStreamHostControlBtns as object)}}
35
+ text={'Accept'}
27
36
  onPress={() => {
37
+ //Hiding the toast if its get approved in the participant panel
38
+ if (Toast.getToastId() === toastId) {
39
+ Toast.hide();
40
+ }
28
41
  hostApprovesRequestOfUID(uid);
29
42
  }}
30
43
  />