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,4 +1,3 @@
1
- // @ts-nocheck
2
1
  import React, {useContext, useState} from 'react';
3
2
  import {
4
3
  View,
@@ -12,10 +11,15 @@ import {
12
11
  } from 'react-native';
13
12
  import {useString} from '../utils/useString';
14
13
  import {networkIconsObject} from '../components/NetworkQualityContext';
15
- import {NetworkQualities} from 'src/language/default-labels/videoCallScreenLabels';
16
- import {isWebInternal} from '../utils/common';
14
+ //import {NetworkQualities} from 'src/language/default-labels/videoCallScreenLabels';
15
+ import {isMobileUA, isWebInternal} from '../utils/common';
17
16
  import NetworkQualityContext from '../components/NetworkQualityContext';
18
17
  import {RenderInterface, UidType} from '../../agora-rn-uikit';
18
+ import ThemeConfig from '../theme';
19
+ import ImageIcon from '../atoms/ImageIcon';
20
+ import hexadecimalTransparency from '../utils/hexadecimalTransparency';
21
+ import {useLayout, useRender} from 'customization-api';
22
+ import {getGridLayoutName} from '../pages/video-call/DefaultLayouts';
19
23
 
20
24
  /**
21
25
  *
@@ -29,31 +33,28 @@ import {RenderInterface, UidType} from '../../agora-rn-uikit';
29
33
  */
30
34
  interface NetworkQualityPillProps {
31
35
  user: RenderInterface;
32
- primaryColor: any;
33
- small?: boolean;
34
- rootStyle?: StyleProp<ViewStyle>;
35
36
  }
36
37
  const NetworkQualityPill = (props: NetworkQualityPillProps) => {
37
- const {user, primaryColor, small, rootStyle} = props;
38
+ const {user} = props;
38
39
  const [networkTextVisible, setNetworkTextVisible] = useState(false);
39
40
  //commented for v1 release
40
41
  //const getLabel = useString<NetworkQualities>('networkQualityLabel');
41
42
  const getLabel = (quality: string) => {
42
43
  switch (quality) {
43
44
  case 'unknown':
44
- return 'Unknown';
45
+ return 'Network Unsupported';
45
46
  case 'excellent':
46
- return 'Excellent';
47
+ return 'Excellent Network';
47
48
  case 'good':
48
- return 'Good';
49
+ return 'Good Network';
49
50
  case 'bad':
50
- return 'Bad';
51
+ return 'Bad Network';
51
52
  case 'veryBad':
52
- return 'Very Bad';
53
+ return 'Very Bad Network';
53
54
  case 'unpublished':
54
- return 'Unpublished';
55
+ return 'Network Unpublished';
55
56
  case 'loading':
56
- return 'Loading';
57
+ return 'Network Loading';
57
58
  default:
58
59
  return 'Loading';
59
60
  }
@@ -64,41 +65,48 @@ const NetworkQualityPill = (props: NetworkQualityPillProps) => {
64
65
  : user.audio || user.video
65
66
  ? 8
66
67
  : 7;
67
-
68
+ const {activeUids} = useRender();
69
+ const {currentLayout} = useLayout();
70
+ const reduceSpace =
71
+ isMobileUA() &&
72
+ activeUids.length > 4 &&
73
+ currentLayout === getGridLayoutName();
68
74
  return (
69
75
  <View
76
+ testID="videocall-networkpill"
70
77
  style={[
71
78
  style.networkPill,
79
+ style.rootStyle,
72
80
  {
73
- opacity: networkTextVisible ? 1 : 0.8,
81
+ backgroundColor: networkTextVisible
82
+ ? networkIconsObject[networkStat].tint +
83
+ hexadecimalTransparency['50%']
84
+ : $config.CARD_LAYER_5_COLOR + hexadecimalTransparency['10%'],
74
85
  },
75
- rootStyle,
86
+ reduceSpace ? {top: 2, right: 2} : {},
76
87
  ]}>
77
- <PlatformSpecificWrapper {...{networkTextVisible, setNetworkTextVisible}}>
78
- <View style={[style.networkIndicatorBackdrop]}>
79
- <Image
80
- source={{
81
- uri: networkIconsObject[networkStat].icon,
82
- }}
83
- style={[
84
- style.networkIcon,
85
- {
86
- tintColor:
87
- networkIconsObject[networkStat].tint === 'primary'
88
- ? primaryColor
89
- : networkIconsObject[networkStat].tint,
90
- },
91
- ]}
92
- resizeMode={'contain'}
88
+ <PlatformSpecificWrapper
89
+ {...{
90
+ networkTextVisible,
91
+ setNetworkTextVisible,
92
+ reduceSpace,
93
+ activeUids,
94
+ }}>
95
+ <View>
96
+ <ImageIcon
97
+ iconType="plain"
98
+ tintColor={
99
+ networkTextVisible
100
+ ? $config.PRIMARY_ACTION_TEXT_COLOR
101
+ : networkIconsObject[networkStat].tint +
102
+ hexadecimalTransparency['30%']
103
+ }
104
+ name={networkIconsObject[networkStat].icon}
105
+ iconSize={16}
93
106
  />
94
107
  </View>
95
108
  {networkTextVisible && (
96
- <Text
97
- textBreakStrategy={'simple'}
98
- style={[
99
- style.networkPillText,
100
- {fontSize: small ? 14 : 15, userSelect: 'none'},
101
- ]}>
109
+ <Text textBreakStrategy={'simple'} style={style.networkPillText}>
102
110
  {getLabel(networkIconsObject[networkStat].text)}
103
111
  </Text>
104
112
  )}
@@ -111,6 +119,8 @@ const PlatformSpecificWrapper = ({
111
119
  networkTextVisible,
112
120
  setNetworkTextVisible,
113
121
  children,
122
+ reduceSpace,
123
+ activeUids,
114
124
  }: any) => {
115
125
  return !isWebInternal() ? (
116
126
  <Pressable
@@ -119,6 +129,7 @@ const PlatformSpecificWrapper = ({
119
129
  display: 'flex',
120
130
  flexDirection: 'row',
121
131
  alignItems: 'center',
132
+ padding: reduceSpace && activeUids.length > 12 ? 2 : 8,
122
133
  }}
123
134
  onPress={() => {
124
135
  setNetworkTextVisible((visible: boolean) => !visible);
@@ -132,6 +143,7 @@ const PlatformSpecificWrapper = ({
132
143
  display: 'flex',
133
144
  flexDirection: 'row',
134
145
  alignItems: 'center',
146
+ padding: reduceSpace && activeUids.length > 12 ? 2 : 8,
135
147
  }}
136
148
  onClick={(e) => {
137
149
  e.preventDefault();
@@ -150,12 +162,13 @@ const PlatformSpecificWrapper = ({
150
162
 
151
163
  const style = StyleSheet.create({
152
164
  networkPill: {
153
- height: 30,
154
- backgroundColor: $config.SECONDARY_FONT_COLOR + 'bb',
155
165
  position: 'absolute',
156
166
  zIndex: 2,
157
- paddingHorizontal: 0,
158
- borderRadius: 15,
167
+ borderRadius: 50,
168
+ },
169
+ rootStyle: {
170
+ top: 8,
171
+ right: 8,
159
172
  },
160
173
  networkPillContent: {
161
174
  display: 'flex',
@@ -163,27 +176,11 @@ const style = StyleSheet.create({
163
176
  alignItems: 'center',
164
177
  },
165
178
  networkPillText: {
166
- color: $config.PRIMARY_FONT_COLOR,
167
- lineHeight: 30,
168
- fontSize: 15,
179
+ color: $config.VIDEO_AUDIO_TILE_TEXT_COLOR,
180
+ fontSize: ThemeConfig.FontSize.small,
181
+ fontFamily: ThemeConfig.FontFamily.sansPro,
169
182
  fontWeight: '600',
170
- marginLeft: 5,
171
- marginRight: 15,
172
- },
173
- networkIcon: {
174
- width: '80%',
175
- height: '80%',
176
- alignSelf: 'center',
177
- },
178
- networkIndicatorBackdrop: {
179
- width: 20,
180
- height: 20,
181
- borderRadius: 10,
182
- alignSelf: 'center',
183
- marginLeft: 5,
184
- marginRight: 5,
185
- backgroundColor: $config.SECONDARY_FONT_COLOR,
186
- justifyContent: 'center',
183
+ marginLeft: 8,
187
184
  },
188
185
  });
189
186
 
@@ -37,13 +37,13 @@ const OpenInNativeButton = () => {
37
37
 
38
38
  const style = StyleSheet.create({
39
39
  btn: {
40
- backgroundColor: $config.PRIMARY_COLOR,
40
+ backgroundColor: $config.PRIMARY_ACTION_BRAND_COLOR,
41
41
  // width: 110,
42
42
  flex: 1,
43
43
  paddingHorizontal: 10,
44
44
  height: 30,
45
45
  // borderWidth: 1,
46
- // borderColor: $config.PRIMARY_COLOR,
46
+ // borderColor: $config.PRIMARY_ACTION_BRAND_COLOR,
47
47
  borderRadius: 100,
48
48
  // marginTop: 5,
49
49
  // marginRight: 10,
@@ -53,7 +53,7 @@ const style = StyleSheet.create({
53
53
  lineHeight: 29,
54
54
  // fontWeight: '500',
55
55
  textAlign: 'center',
56
- color: $config.SECONDARY_FONT_COLOR,
56
+ color: $config.SECONDARY_ACTION_COLOR,
57
57
  },
58
58
  });
59
59
 
@@ -10,56 +10,55 @@
10
10
  *********************************************
11
11
  */
12
12
  import React from 'react';
13
- import {BtnTemplate, BtnTemplateInterface} from '../../agora-rn-uikit';
14
13
  import {useRecording} from './recording/useRecording';
15
- import {useString} from '../utils/useString';
16
- import {
17
- ButtonTemplateName,
18
- useButtonTemplate,
19
- } from '../utils/useButtonTemplate';
20
- import Styles from '../components/styles';
14
+ import IconButton, {IconButtonProps} from '../atoms/IconButton';
15
+ import {useVideoCall} from '../components/useVideoCall';
21
16
 
22
17
  export interface RecordingButtonProps {
23
- buttonTemplateName?: ButtonTemplateName;
24
- render?: (
25
- onPress: () => void,
26
- isRecordingActive: boolean,
27
- buttonTemplateName?: ButtonTemplateName,
28
- ) => JSX.Element;
18
+ showLabel?: boolean;
19
+ render?: (onPress: () => void, isRecordingActive: boolean) => JSX.Element;
20
+ isOnActionSheet?: boolean;
29
21
  }
30
22
 
31
23
  const Recording = (props: RecordingButtonProps) => {
32
- const {startRecording, stopRecording, isRecordingActive} = useRecording();
24
+ const {startRecording, inProgress, isRecordingActive} = useRecording();
33
25
  //commented for v1 release
34
26
  //const recordingButton = useString<boolean>('recordingButton');
35
27
  const recordingButton = (recording: boolean) =>
36
- recording ? 'Recording' : 'Record';
37
- const defaultTemplateValue = useButtonTemplate().buttonTemplateName;
38
- const {buttonTemplateName = defaultTemplateValue} = props;
28
+ recording ? 'Stop Rec' : 'Record';
29
+ const {showLabel = $config.ICON_TEXT, isOnActionSheet = false} = props;
30
+ const {setShowStopRecordingPopup} = useVideoCall();
39
31
  const onPress = () => {
40
32
  if (!isRecordingActive) {
41
33
  startRecording && startRecording();
42
34
  } else {
43
- stopRecording && stopRecording();
35
+ setShowStopRecordingPopup(true);
44
36
  }
45
37
  };
46
- let btnTemplateProps: BtnTemplateInterface = {
47
- name: isRecordingActive ? 'recordingActiveIcon' : 'recordingIcon',
38
+ let iconButtonProps: IconButtonProps = {
39
+ iconProps: {
40
+ name: isRecordingActive ? 'stop-recording' : 'recording',
41
+ tintColor: isRecordingActive
42
+ ? $config.SEMANTIC_ERROR
43
+ : $config.SECONDARY_ACTION_COLOR,
44
+ },
45
+ btnTextProps: {
46
+ text: showLabel ? recordingButton(isRecordingActive) : '',
47
+ textColor: $config.FONT_COLOR,
48
+ },
48
49
  onPress,
49
- color: isRecordingActive ? '#FD0845' : $config.PRIMARY_COLOR,
50
+ disabled: inProgress,
51
+ containerStyle: inProgress ? {opacity: 0.6} : {},
50
52
  };
51
53
 
52
- if (buttonTemplateName === ButtonTemplateName.topBar) {
53
- btnTemplateProps.style = Styles.fullWidthButton as Object;
54
- } else {
55
- btnTemplateProps.btnText = recordingButton(isRecordingActive);
56
- btnTemplateProps.style = Styles.localButton as Object;
57
- }
54
+ iconButtonProps.isOnActionSheet = isOnActionSheet;
58
55
 
59
56
  return props?.render ? (
60
- props.render(onPress, isRecordingActive, buttonTemplateName)
57
+ props.render(onPress, isRecordingActive)
61
58
  ) : (
62
- <BtnTemplate {...btnTemplateProps} />
59
+ <>
60
+ <IconButton {...iconButtonProps} />
61
+ </>
63
62
  );
64
63
  };
65
64
 
@@ -9,17 +9,23 @@
9
9
  information visit https://appbuilder.agora.io.
10
10
  *********************************************
11
11
  */
12
- import React from 'react';
13
- import {StyleSheet} from 'react-native';
14
- import {BtnTemplate, UidType} from '../../agora-rn-uikit';
12
+ import React, {useRef, useState} from 'react';
13
+ import {useWindowDimensions} from 'react-native';
14
+ import {UidType} from '../../agora-rn-uikit';
15
15
  import useIsPSTN from '../utils/useIsPSTN';
16
16
  import useMutePSTN from '../utils/useMutePSTN';
17
+ import Styles from '../components/styles';
17
18
  import useRemoteMute, {MUTE_REMOTE_TYPE} from '../utils/useRemoteMute';
18
-
19
+ import IconButton from '../atoms/IconButton';
20
+ import RemoteMutePopup from './RemoteMutePopup';
21
+ import {useRender} from 'customization-api';
22
+ import {calculatePosition} from '../utils/common';
23
+ import useRemoteRequest, {REQUEST_REMOTE_TYPE} from '../utils/useRemoteRequest';
19
24
  export interface RemoteAudioMuteProps {
20
25
  uid: UidType;
21
26
  audio: boolean;
22
27
  isHost: boolean;
28
+ userContainerRef: any;
23
29
  }
24
30
  /**
25
31
  * Component to mute / unmute remote audio.
@@ -27,36 +33,84 @@ export interface RemoteAudioMuteProps {
27
33
  * If the local user is not a host, it simply renders an image
28
34
  */
29
35
  const RemoteAudioMute = (props: RemoteAudioMuteProps) => {
30
- const {isHost = false} = props;
36
+ const btnRef = useRef(null);
37
+ const {isHost = false, userContainerRef} = props;
31
38
  const muteRemoteAudio = useRemoteMute();
32
-
39
+ const requestRemoteAudio = useRemoteRequest();
40
+ const [showModal, setShowModal] = useState(false);
41
+ const [pos, setPos] = useState({});
42
+ const {renderList} = useRender();
33
43
  const isPSTN = useIsPSTN();
34
44
  const mutePSTN = useMutePSTN();
45
+ const {width: globalWidth, height: globalHeight} = useWindowDimensions();
46
+ const onPress = () => {
47
+ if (isPSTN(props.uid)) {
48
+ try {
49
+ mutePSTN(props.uid);
50
+ } catch (error) {
51
+ console.error('An error occurred while muting the PSTN user.');
52
+ }
53
+ } else {
54
+ props?.audio
55
+ ? muteRemoteAudio(MUTE_REMOTE_TYPE.audio, props.uid)
56
+ : requestRemoteAudio(REQUEST_REMOTE_TYPE.audio, props.uid);
57
+ }
58
+ setShowModal(false);
59
+ };
35
60
  return (
36
- <BtnTemplate
37
- disabled={!isHost}
38
- onPress={() => {
39
- if (isPSTN(props.uid)) {
40
- try {
41
- mutePSTN(props.uid);
42
- } catch (error) {
43
- console.error('An error occurred while muting the PSTN user.');
44
- }
45
- } else {
46
- muteRemoteAudio(MUTE_REMOTE_TYPE.audio, props.uid);
47
- }
48
- }}
49
- style={style.buttonIconMic}
50
- name={props.audio ? 'mic' : 'micOff'}
51
- />
61
+ <>
62
+ <RemoteMutePopup
63
+ action={props?.audio ? 'mute' : 'request'}
64
+ type="audio"
65
+ actionMenuVisible={showModal}
66
+ setActionMenuVisible={setShowModal}
67
+ name={renderList[props.uid]?.name}
68
+ modalPosition={pos}
69
+ onMutePress={onPress}
70
+ />
71
+ <IconButton
72
+ setRef={(ref) => (btnRef.current = ref)}
73
+ disabled={!isHost}
74
+ onPress={() => {
75
+ btnRef?.current?.measure(
76
+ (
77
+ _fx: number,
78
+ _fy: number,
79
+ localWidth: number,
80
+ localHeight: number,
81
+ px: number,
82
+ py: number,
83
+ ) => {
84
+ const data = calculatePosition({
85
+ px,
86
+ py,
87
+ localHeight,
88
+ localWidth,
89
+ globalHeight,
90
+ globalWidth,
91
+ });
92
+ setPos(data);
93
+ setShowModal(true);
94
+ },
95
+ );
96
+ }}
97
+ hoverEffect={true}
98
+ hoverEffectStyle={{
99
+ backgroundColor: $config.ICON_BG_COLOR,
100
+ borderRadius: 20,
101
+ }}
102
+ iconProps={{
103
+ iconContainerStyle: {padding: 8},
104
+ iconSize: 20,
105
+ iconType: 'plain',
106
+ name: props.audio ? 'mic-on' : 'mic-off',
107
+ tintColor: props.audio
108
+ ? $config.PRIMARY_ACTION_BRAND_COLOR
109
+ : $config.SEMANTIC_NEUTRAL,
110
+ }}
111
+ />
112
+ </>
52
113
  );
53
114
  };
54
115
 
55
- const style = StyleSheet.create({
56
- buttonIconMic: {
57
- width: 25,
58
- height: 24,
59
- },
60
- });
61
-
62
116
  export default RemoteAudioMute;
@@ -11,7 +11,8 @@
11
11
  */
12
12
  import React from 'react';
13
13
  import {StyleSheet} from 'react-native';
14
- import {BtnTemplate, UidType} from '../../agora-rn-uikit';
14
+ import IconButton from '../atoms/IconButton';
15
+ import {UidType} from '../../agora-rn-uikit';
15
16
  import useRemoteEndCall from '../utils/useRemoteEndCall';
16
17
 
17
18
  export interface RemoteEndCallProps {
@@ -21,13 +22,15 @@ export interface RemoteEndCallProps {
21
22
  const RemoteEndCall = (props: RemoteEndCallProps) => {
22
23
  const endRemoteCall = useRemoteEndCall();
23
24
  return props.isHost && String(props.uid)[0] !== '1' ? (
24
- <BtnTemplate
25
+ <IconButton
25
26
  style={style.remoteButton}
27
+ iconProps={{
28
+ name: 'remove',
29
+ tintColor: '#FD0845',
30
+ }}
26
31
  onPress={() => {
27
32
  endRemoteCall(props.uid);
28
33
  }}
29
- color="#FD0845"
30
- name={'remoteEndCall'} // earlier was endCall, added remoteEndCall
31
34
  />
32
35
  ) : (
33
36
  <></>
@@ -46,7 +49,7 @@ const style = StyleSheet.create({
46
49
  borderRightWidth: 0,
47
50
  borderLeftWidth: 0,
48
51
  marginHorizontal: 0,
49
- backgroundColor: $config.SECONDARY_FONT_COLOR,
52
+ backgroundColor: $config.SECONDARY_ACTION_COLOR,
50
53
  },
51
54
  });
52
55
 
@@ -0,0 +1,193 @@
1
+ import {
2
+ Modal,
3
+ StyleSheet,
4
+ Text,
5
+ TouchableOpacity,
6
+ TouchableWithoutFeedback,
7
+ useWindowDimensions,
8
+ View,
9
+ } from 'react-native';
10
+ import React, {SetStateAction} from 'react';
11
+ import ThemeConfig from '../theme';
12
+ import Spacer from '../atoms/Spacer';
13
+ import PlatformWrapper from '../utils/PlatformWrapper';
14
+ import {isMobileOrTablet} from 'customization-api';
15
+ import hexadecimalTransparency from '../utils/hexadecimalTransparency';
16
+
17
+ export interface ActionMenuProps {
18
+ actionMenuVisible: boolean;
19
+ setActionMenuVisible: React.Dispatch<SetStateAction<boolean>>;
20
+ modalPosition?: {
21
+ top?: number;
22
+ right?: number;
23
+ left?: number;
24
+ bottom?: number;
25
+ };
26
+ name: string;
27
+ onMutePress: () => void;
28
+ type: 'video' | 'audio';
29
+ action?: 'mute' | 'request';
30
+ }
31
+
32
+ const RemoteMutePopup = (props: ActionMenuProps) => {
33
+ const {height} = useWindowDimensions();
34
+ const {
35
+ actionMenuVisible,
36
+ setActionMenuVisible,
37
+ modalPosition,
38
+ action = 'mute',
39
+ } = props;
40
+ let message = '';
41
+
42
+ if (props.name) {
43
+ //mute action
44
+ if (action === 'mute') {
45
+ message = `Mute ${props.name}'s ${props.type} for everyone on the call? Only ${props.name} can unmute themselves.`;
46
+ }
47
+ //request action
48
+ else {
49
+ if (props?.type === 'audio') {
50
+ message = `Request ${props.name} to turn on their microphone?`;
51
+ } else {
52
+ message = `Request ${props.name} to turn on their camera?`;
53
+ }
54
+ }
55
+ } else {
56
+ message = `Mute everyone's ${props.type} on the call?`;
57
+ }
58
+
59
+ return (
60
+ <View>
61
+ <Modal
62
+ testID="action-menu"
63
+ animationType="none"
64
+ transparent={true}
65
+ visible={actionMenuVisible}>
66
+ <TouchableWithoutFeedback
67
+ onPress={() => {
68
+ setActionMenuVisible(false);
69
+ }}>
70
+ <View
71
+ style={[
72
+ styles.backDrop,
73
+ isMobileOrTablet()
74
+ ? {
75
+ backgroundColor:
76
+ $config.HARD_CODED_BLACK_COLOR +
77
+ hexadecimalTransparency['50%'],
78
+ }
79
+ : {},
80
+ ]}
81
+ />
82
+ </TouchableWithoutFeedback>
83
+ <View
84
+ style={
85
+ isMobileOrTablet()
86
+ ? [styles.modalViewUA, {marginTop: height / 3}]
87
+ : [styles.modalView, modalPosition]
88
+ }>
89
+ <View style={styles.container}>
90
+ <Text style={styles.messageStyle}>{message}</Text>
91
+ <View style={styles.btnContainer}>
92
+ <PlatformWrapper>
93
+ {(isHovered: boolean) => {
94
+ return (
95
+ <TouchableOpacity
96
+ style={isHovered ? styles.onHoverBtnStyle : {}}
97
+ onPress={() => props.setActionMenuVisible(false)}>
98
+ <Text style={styles.btnText}>Cancel</Text>
99
+ </TouchableOpacity>
100
+ );
101
+ }}
102
+ </PlatformWrapper>
103
+ <Spacer size={8} horizontal={true} />
104
+ <PlatformWrapper>
105
+ {(isHovered: boolean) => {
106
+ return (
107
+ <TouchableOpacity
108
+ style={isHovered ? styles.onHoverBtnStyle : {}}
109
+ onPress={() => props.onMutePress()}>
110
+ <Text style={styles.btnText}>
111
+ {action === 'mute' ? 'Mute' : 'Request'}
112
+ </Text>
113
+ </TouchableOpacity>
114
+ );
115
+ }}
116
+ </PlatformWrapper>
117
+ </View>
118
+ </View>
119
+ </View>
120
+ </Modal>
121
+ </View>
122
+ );
123
+ };
124
+
125
+ export default RemoteMutePopup;
126
+
127
+ const styles = StyleSheet.create({
128
+ onHoverBtnStyle: {
129
+ backgroundColor: $config.CARD_LAYER_3_COLOR,
130
+ borderRadius: 8,
131
+ },
132
+ container: {
133
+ paddingHorizontal: 12,
134
+ paddingTop: 24,
135
+ paddingBottom: 14,
136
+ },
137
+ messageStyle: {
138
+ fontFamily: ThemeConfig.FontFamily.sansPro,
139
+ fontWeight: '400',
140
+ fontSize: ThemeConfig.FontSize.normal,
141
+ color: $config.FONT_COLOR,
142
+ paddingBottom: 18,
143
+ },
144
+ btnText: {
145
+ paddingHorizontal: 12,
146
+ paddingVertical: 10,
147
+ fontFamily: ThemeConfig.FontFamily.sansPro,
148
+ fontWeight: '400',
149
+ fontSize: ThemeConfig.FontSize.normal,
150
+ color: $config.PRIMARY_ACTION_BRAND_COLOR,
151
+ },
152
+ btnContainer: {
153
+ flexDirection: 'row',
154
+ justifyContent: 'flex-end',
155
+ },
156
+ modalView: {
157
+ position: 'absolute',
158
+ width: 290,
159
+ backgroundColor: $config.CARD_LAYER_4_COLOR,
160
+ borderRadius: 4,
161
+ shadowColor: $config.HARD_CODED_BLACK_COLOR,
162
+ shadowOffset: {
163
+ width: 0,
164
+ height: 4,
165
+ },
166
+ shadowOpacity: 0.1,
167
+ shadowRadius: 8,
168
+ zIndex: 1,
169
+ elevation: 1,
170
+ },
171
+ modalViewUA: {
172
+ alignSelf: 'center',
173
+ maxWidth: '80%',
174
+ backgroundColor: $config.CARD_LAYER_4_COLOR,
175
+ borderRadius: 4,
176
+ shadowColor: $config.HARD_CODED_BLACK_COLOR,
177
+ shadowOffset: {
178
+ width: 0,
179
+ height: 4,
180
+ },
181
+ shadowOpacity: 0.1,
182
+ shadowRadius: 8,
183
+ zIndex: 1,
184
+ elevation: 1,
185
+ },
186
+ backDrop: {
187
+ position: 'absolute',
188
+ top: 0,
189
+ bottom: 0,
190
+ left: 0,
191
+ right: 0,
192
+ },
193
+ });