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
@@ -9,26 +9,76 @@
9
9
  information visit https://appbuilder.agora.io.
10
10
  *********************************************
11
11
  */
12
- import React, {useContext, useEffect} from 'react';
12
+ import React, {useContext, useEffect, useRef} from 'react';
13
+ import {StyleSheet} from 'react-native';
14
+ import PrimaryButton from '../atoms/PrimaryButton';
13
15
  import {RtcContext} from '../../agora-rn-uikit';
14
16
  import events from '../rtm-events-api';
15
17
  import {controlMessageEnum} from '../components/ChatContext';
18
+ import Toast from '../../react-native-toast-message';
19
+ import TertiaryButton from '../atoms/TertiaryButton';
20
+ import {useRender} from 'customization-api';
21
+ import {useParams} from '../components/Router';
22
+ import StorageContext from './StorageContext';
23
+ import {isWebInternal, trimText} from '../utils/common';
16
24
 
17
25
  interface Props {
18
26
  children: React.ReactNode;
19
27
  }
20
28
 
21
29
  const EventsConfigure: React.FC<Props> = (props) => {
30
+ const {setStore} = useContext(StorageContext);
22
31
  const {RtcEngine, dispatch} = useContext(RtcContext);
32
+ const {renderList} = useRender();
33
+ const renderListRef = useRef({renderList});
34
+ const {phrase} = useParams<{phrase: string}>();
23
35
  useEffect(() => {
24
- events.on(controlMessageEnum.muteVideo, () => {
25
- RtcEngine.muteLocalVideoStream(true);
36
+ renderListRef.current.renderList = renderList;
37
+ }, [renderList]);
38
+ useEffect(() => {
39
+ //user joined event listener
40
+ // events.on(controlMessageEnum.newUserJoined, ({payload}) => {
41
+ // const data = JSON.parse(payload);
42
+ // if (data?.name) {
43
+ // Toast.show({
44
+ // text1: `${trimText(data.name)} has joined the call`,
45
+ // visibilityTime: 3000,
46
+ // type: 'info',
47
+ // primaryBtn: null,
48
+ // secondaryBtn: null,
49
+ // });
50
+ // }
51
+ // });
52
+ events.on(controlMessageEnum.muteVideo, async ({payload, sender}) => {
53
+ Toast.show({
54
+ type: 'info',
55
+ // text1: `${
56
+ // renderListRef.current.renderList[sender].name || 'The host'
57
+ // } muted you.`,
58
+ text1: 'The host has muted your video.',
59
+ visibilityTime: 3000,
60
+ primaryBtn: null,
61
+ secondaryBtn: null,
62
+ });
63
+ isWebInternal()
64
+ ? await RtcEngine.muteLocalVideoStream(true)
65
+ : await RtcEngine.enableLocalVideo(false);
26
66
  dispatch({
27
67
  type: 'LocalMuteVideo',
28
68
  value: [0],
29
69
  });
30
70
  });
31
- events.on(controlMessageEnum.muteAudio, () => {
71
+ events.on(controlMessageEnum.muteAudio, ({sender}) => {
72
+ Toast.show({
73
+ type: 'info',
74
+ // text1: `${
75
+ // renderListRef.current.renderList[sender].name || 'The host'
76
+ // } muted you.`,
77
+ text1: 'The host has muted your audio.',
78
+ visibilityTime: 3000,
79
+ primaryBtn: null,
80
+ secondaryBtn: null,
81
+ });
32
82
  RtcEngine.muteLocalAudioStream(true);
33
83
  dispatch({
34
84
  type: 'LocalMuteAudio',
@@ -36,12 +86,73 @@ const EventsConfigure: React.FC<Props> = (props) => {
36
86
  });
37
87
  });
38
88
  events.on(controlMessageEnum.kickUser, () => {
39
- dispatch({
40
- type: 'EndCall',
41
- value: [],
89
+ Toast.show({
90
+ type: 'info',
91
+ text1: 'The host has removed you from the meeting.',
92
+ visibilityTime: 5000,
93
+ primaryBtn: null,
94
+ secondaryBtn: null,
95
+ });
96
+ setTimeout(() => {
97
+ dispatch({
98
+ type: 'EndCall',
99
+ value: [],
100
+ });
101
+ }, 5000);
102
+ });
103
+ events.on(controlMessageEnum.requestAudio, () => {
104
+ Toast.show({
105
+ type: 'info',
106
+ text1: 'The host has requested you to speak',
107
+ visibilityTime: 3000,
108
+ primaryBtn: (
109
+ <PrimaryButton
110
+ containerStyle={style.primaryBtn}
111
+ textStyle={{fontWeight: '600', fontSize: 16, paddingLeft: 0}}
112
+ text="UNMUTE"
113
+ onPress={() => {
114
+ RtcEngine.muteLocalAudioStream(false);
115
+ dispatch({
116
+ type: 'LocalMuteAudio',
117
+ value: [1],
118
+ });
119
+ Toast.hide();
120
+ }}
121
+ />
122
+ ),
123
+ secondaryBtn: SecondaryBtn,
124
+ });
125
+ });
126
+ events.on(controlMessageEnum.requestVideo, () => {
127
+ Toast.show({
128
+ type: 'info',
129
+ text1: 'The host has asked you to start your video.',
130
+ visibilityTime: 3000,
131
+ primaryBtn: (
132
+ <PrimaryButton
133
+ containerStyle={style.primaryBtn}
134
+ textStyle={style.primaryBtnText}
135
+ text="UNMUTE"
136
+ onPress={async () => {
137
+ isWebInternal()
138
+ ? await RtcEngine.muteLocalVideoStream(false)
139
+ : await RtcEngine.enableLocalVideo(true);
140
+ dispatch({
141
+ type: 'LocalMuteVideo',
142
+ value: [1],
143
+ });
144
+ Toast.hide();
145
+ }}
146
+ />
147
+ ),
148
+ secondaryBtn: SecondaryBtn,
42
149
  });
43
150
  });
151
+
44
152
  return () => {
153
+ //events.off(controlMessageEnum.newUserJoined);
154
+ events.off(controlMessageEnum.requestAudio);
155
+ events.off(controlMessageEnum.requestVideo);
45
156
  events.off(controlMessageEnum.muteVideo);
46
157
  events.off(controlMessageEnum.muteAudio);
47
158
  events.off(controlMessageEnum.kickUser);
@@ -52,3 +163,29 @@ const EventsConfigure: React.FC<Props> = (props) => {
52
163
  };
53
164
 
54
165
  export default EventsConfigure;
166
+
167
+ const style = StyleSheet.create({
168
+ secondaryBtn: {marginLeft: 16, height: 40, paddingVertical: 5},
169
+ primaryBtn: {
170
+ maxWidth: 109,
171
+ minWidth: 109,
172
+ height: 40,
173
+ borderRadius: 4,
174
+ paddingVertical: 5,
175
+ paddingHorizontal: 12,
176
+ },
177
+ primaryBtnText: {
178
+ fontWeight: '600',
179
+ fontSize: 16,
180
+ paddingLeft: 0,
181
+ },
182
+ });
183
+ const SecondaryBtn = (
184
+ <TertiaryButton
185
+ containerStyle={style.secondaryBtn}
186
+ text="LATER"
187
+ onPress={() => {
188
+ Toast.hide();
189
+ }}
190
+ />
191
+ );
@@ -20,7 +20,7 @@ import {setContext} from '@apollo/client/link/context';
20
20
  // import useMount from './useMount';
21
21
  import React, {createContext, useContext, useRef} from 'react';
22
22
  import StorageContext from './StorageContext';
23
- import AsyncStorage from '@react-native-community/async-storage';
23
+ import AsyncStorage from '@react-native-async-storage/async-storage'; //'@react-native-community/async-storage';
24
24
 
25
25
  export const GraphQLContext = createContext<{
26
26
  client: ApolloClient<NormalizedCacheObject>;
@@ -9,12 +9,13 @@
9
9
  information visit https://appbuilder.agora.io.
10
10
  *********************************************
11
11
  */
12
- import {layoutComponent, useRtc} from 'customization-api';
13
- import React, {useMemo, useState} from 'react';
14
- import {View, StyleSheet, Dimensions, Pressable} from 'react-native';
15
- import {isWebInternal} from '../utils/common';
12
+ import {layoutComponent, useRender, useRtc} from 'customization-api';
13
+ import React, {useContext, useMemo, useState} from 'react';
14
+ import {View, StyleSheet, Pressable, Text} from 'react-native';
15
+ import {isWebInternal, useIsDesktop} from '../utils/common';
16
16
  import {useSetPinnedLayout} from '../pages/video-call/DefaultLayouts';
17
17
  import RenderComponent from '../pages/video-call/RenderComponent';
18
+ import {ClientRole, PropsContext} from '../../agora-rn-uikit';
18
19
  const layout = (len: number, isDesktop: boolean = true) => {
19
20
  const rows = Math.round(Math.sqrt(len));
20
21
  const cols = Math.ceil(len / rows);
@@ -35,34 +36,37 @@ const layout = (len: number, isDesktop: boolean = true) => {
35
36
 
36
37
  const GridVideo: layoutComponent = ({renderData}) => {
37
38
  const {dispatch} = useRtc();
38
- let onLayout = (e: any) => {
39
- setDim([
40
- e.nativeEvent.layout.width,
41
- e.nativeEvent.layout.height,
42
- e.nativeEvent.layout.width > e.nativeEvent.layout.height,
43
- ]);
44
- };
45
- const [dim, setDim] = useState<[number, number, boolean]>([
46
- Dimensions.get('window').width,
47
- Dimensions.get('window').height,
48
- Dimensions.get('window').width > Dimensions.get('window').height,
49
- ]);
50
- const isDesktop = dim[0] > dim[1] + 100;
39
+ const {rtcProps} = useContext(PropsContext);
40
+ const {activeUids} = useRender();
41
+ const isDesktop = useIsDesktop();
51
42
 
52
43
  let {matrix, dims} = useMemo(
53
- () => layout(renderData.length, isDesktop),
54
- [renderData.length, isDesktop],
44
+ () => layout(renderData.length, isDesktop()),
45
+ [renderData.length, isDesktop()],
55
46
  );
56
47
 
57
48
  const setPinnedLayout = useSetPinnedLayout();
49
+
50
+ //livestreaming audience will see this if no host joined the call
51
+ if (
52
+ $config.EVENT_MODE &&
53
+ rtcProps?.role === ClientRole.Audience &&
54
+ activeUids.length === 0
55
+ ) {
56
+ return (
57
+ <View style={style.infoTextContainer}>
58
+ <Text style={style.infoTextStyle}>Waiting for the host to join...</Text>
59
+ </View>
60
+ );
61
+ }
62
+
58
63
  return (
59
- <View
60
- style={[style.full, {paddingHorizontal: isDesktop ? 50 : 0}]}
61
- onLayout={onLayout}>
64
+ <View style={[style.full]}>
62
65
  {matrix.map((r, ridx) => (
63
66
  <View style={style.gridRow} key={ridx}>
64
67
  {r.map((c, cidx) => (
65
68
  <Pressable
69
+ disabled={renderData.length === 1}
66
70
  onPress={() => {
67
71
  if (!(ridx === 0 && cidx === 0)) {
68
72
  dispatch({
@@ -77,7 +81,25 @@ const GridVideo: layoutComponent = ({renderData}) => {
77
81
  marginHorizontal: 'auto',
78
82
  }}
79
83
  key={cidx}>
80
- <View style={style.gridVideoContainerInner}>
84
+ <View
85
+ style={[
86
+ style.gridVideoContainerInner,
87
+ //if only one item no margin required
88
+ r?.length > 1
89
+ ? //first item will have marginRight in the row
90
+ cidx === 0
91
+ ? {marginRight: 4}
92
+ : //last item will have marginLeft in the row
93
+ cidx === r?.length - 1
94
+ ? {marginLeft: 4}
95
+ : //middle item will have marginHorizontal
96
+ {marginHorizontal: 4}
97
+ : //if more than one row than add marginHorizontal
98
+ //for ex: 7 people in the call with 3 column layout. last person tile should be aligned propert
99
+ ridx > 1
100
+ ? {marginHorizontal: 4}
101
+ : {},
102
+ ]}>
81
103
  <RenderComponent uid={renderData[ridx * dims.c + cidx]} />
82
104
  </View>
83
105
  </Pressable>
@@ -91,39 +113,32 @@ const GridVideo: layoutComponent = ({renderData}) => {
91
113
  const style = StyleSheet.create({
92
114
  full: {
93
115
  flex: 1,
94
- // padding: 20,
95
116
  },
96
117
  gridRow: {
97
118
  flex: 1,
98
119
  flexDirection: 'row',
99
120
  width: '100%',
100
- paddingVertical: 10,
121
+ paddingVertical: 4,
101
122
  },
102
123
  gridVideoContainerInner: {
103
- // borderColor: '#fff',
104
- // borderWidth:2,
105
- // width: '100%',
106
- borderRadius: 15,
124
+ //borderRadius: 12,
107
125
  flex: 1,
108
126
  overflow: 'hidden',
109
- // margin: 1,
110
- marginHorizontal: 10,
111
127
  },
112
- MicBackdrop: {
113
- width: 20,
114
- height: 20,
115
- borderRadius: 10,
116
- alignSelf: 'center',
117
- marginHorizontal: 10,
118
- marginRight: 20,
119
- backgroundColor: $config.SECONDARY_FONT_COLOR,
120
- display: 'flex',
128
+ infoTextContainer: {
129
+ flex: 1,
130
+ backgroundColor: $config.VIDEO_AUDIO_TILE_COLOR,
121
131
  justifyContent: 'center',
132
+ marginHorizontal: 'auto',
133
+ marginVertical: 4,
122
134
  },
123
- MicIcon: {
124
- width: '80%',
125
- height: '80%',
126
- alignSelf: 'center',
135
+ infoTextStyle: {
136
+ fontFamily: 'Source Sans Pro',
137
+ fontWeight: '600',
138
+ fontSize: 32,
139
+ color: $config.VIDEO_AUDIO_TILE_AVATAR_COLOR,
140
+ textAlign: 'center',
141
+ padding: 12,
127
142
  },
128
143
  });
129
144
  export default GridVideo;
@@ -9,27 +9,76 @@
9
9
  information visit https://appbuilder.agora.io.
10
10
  *********************************************
11
11
  */
12
- import React from 'react';
13
- import {View, Text, StyleSheet} from 'react-native';
12
+ import React, {useRef, useState} from 'react';
13
+ import {View, StyleSheet, useWindowDimensions} from 'react-native';
14
14
  import SecondaryButton from '../atoms/SecondaryButton';
15
15
  import {useString} from '../utils/useString';
16
16
  import useRemoteMute, {MUTE_REMOTE_TYPE} from '../utils/useRemoteMute';
17
+ import TertiaryButton from '../atoms/TertiaryButton';
18
+ import Spacer from '../atoms/Spacer';
19
+ import RemoteMutePopup from '../subComponents/RemoteMutePopup';
20
+ import {calculatePosition} from '../utils/common';
17
21
 
18
22
  export interface MuteAllAudioButtonProps {
19
23
  render?: (onPress: () => void) => JSX.Element;
20
24
  }
21
25
 
22
26
  export const MuteAllAudioButton = (props: MuteAllAudioButtonProps) => {
27
+ const [showAudioMuteModal, setShowAudioMuteModal] = useState(false);
28
+ const audioBtnRef = useRef(null);
29
+ const [modalPosition, setModalPosition] = useState({});
23
30
  const muteRemoteAudio = useRemoteMute();
24
31
  //commented for v1 release
25
32
  //const muteAllAudioButton = useString('muteAllAudioButton')();
26
- const muteAllAudioButton = 'Mute all audios';
27
- const onPress = () => muteRemoteAudio(MUTE_REMOTE_TYPE.audio);
28
-
33
+ const muteAllAudioButton = 'Mute all';
34
+ const onPressAction = () => muteRemoteAudio(MUTE_REMOTE_TYPE.audio);
35
+ const {width: globalWidth, height: globalHeight} = useWindowDimensions();
36
+ const showAudioModal = () => {
37
+ audioBtnRef?.current?.measure(
38
+ (_fx, _fy, localWidth, localHeight, px, py) => {
39
+ const data = calculatePosition({
40
+ px,
41
+ py,
42
+ localHeight,
43
+ localWidth,
44
+ globalHeight,
45
+ globalWidth,
46
+ extra: {
47
+ bottom: 10,
48
+ left: localWidth / 2,
49
+ right: -(localWidth / 2),
50
+ },
51
+ popupWidth: 290,
52
+ });
53
+ setModalPosition(data);
54
+ setShowAudioMuteModal(true);
55
+ },
56
+ );
57
+ };
58
+ const onPress = () => {
59
+ showAudioModal();
60
+ };
29
61
  return props?.render ? (
30
62
  props.render(onPress)
31
63
  ) : (
32
- <SecondaryButton onPress={onPress} text={muteAllAudioButton} />
64
+ <>
65
+ <RemoteMutePopup
66
+ type="audio"
67
+ actionMenuVisible={showAudioMuteModal}
68
+ setActionMenuVisible={setShowAudioMuteModal}
69
+ name={null}
70
+ modalPosition={modalPosition}
71
+ onMutePress={() => {
72
+ onPressAction();
73
+ setShowAudioMuteModal(false);
74
+ }}
75
+ />
76
+ <TertiaryButton
77
+ setRef={(ref) => (audioBtnRef.current = ref)}
78
+ onPress={onPress}
79
+ text={muteAllAudioButton}
80
+ />
81
+ </>
33
82
  );
34
83
  };
35
84
 
@@ -37,53 +86,83 @@ export interface MuteAllVideoButtonProps {
37
86
  render?: (onPress: () => void) => JSX.Element;
38
87
  }
39
88
  export const MuteAllVideoButton = (props: MuteAllVideoButtonProps) => {
89
+ const [showVideoMuteModal, setShowVideoMuteModal] = useState(false);
90
+ const videoBtnRef = useRef(null);
91
+ const [modalPosition, setModalPosition] = useState({});
40
92
  const muteRemoteVideo = useRemoteMute();
41
-
93
+ const {width: globalWidth, height: globalHeight} = useWindowDimensions();
42
94
  //commented for v1 release
43
95
  //const muteAllVideoButton = useString('muteAllVideoButton')();
44
- const muteAllVideoButton = 'Mute all videos';
45
- const onPress = () => muteRemoteVideo(MUTE_REMOTE_TYPE.video);
46
-
96
+ const muteAllVideoButton = 'Turn off all cameras';
97
+ const onPressAction = () => muteRemoteVideo(MUTE_REMOTE_TYPE.video);
98
+ const showVideoModal = () => {
99
+ videoBtnRef?.current?.measure(
100
+ (_fx, _fy, localWidth, localHeight, px, py) => {
101
+ const data = calculatePosition({
102
+ px,
103
+ py,
104
+ localHeight,
105
+ localWidth,
106
+ globalHeight,
107
+ globalWidth,
108
+ extra: {
109
+ bottom: 10,
110
+ left: globalWidth < 720 ? 0 : localWidth / 2,
111
+ right: globalHeight < 720 ? 0 : -(localWidth / 2),
112
+ },
113
+ popupWidth: 290,
114
+ });
115
+ setModalPosition(data);
116
+ setShowVideoMuteModal(true);
117
+ },
118
+ );
119
+ };
120
+ const onPress = () => {
121
+ showVideoModal();
122
+ };
47
123
  return props?.render ? (
48
124
  props.render(onPress)
49
125
  ) : (
50
- <SecondaryButton onPress={onPress} text={muteAllVideoButton} />
126
+ <>
127
+ <RemoteMutePopup
128
+ type="video"
129
+ actionMenuVisible={showVideoMuteModal}
130
+ setActionMenuVisible={setShowVideoMuteModal}
131
+ name={null}
132
+ modalPosition={modalPosition}
133
+ onMutePress={() => {
134
+ onPressAction();
135
+ setShowVideoMuteModal(false);
136
+ }}
137
+ />
138
+ <TertiaryButton
139
+ setRef={(ref) => (videoBtnRef.current = ref)}
140
+ onPress={onPress}
141
+ text={muteAllVideoButton}
142
+ />
143
+ </>
51
144
  );
52
145
  };
53
146
 
54
147
  const HostControlView = () => {
55
148
  //commented for v1 release
56
149
  //const hostControlsLabel = useString('hostControlsLabel')();
57
- const hostControlsLabel = 'Host Controls';
150
+
58
151
  return (
59
- <>
60
- <Text style={style.heading}>{hostControlsLabel}</Text>
61
- <View>
62
- <View style={style.btnContainer}>
63
- <MuteAllAudioButton />
64
- </View>
65
- {!$config.AUDIO_ROOM && (
66
- <View style={style.btnContainer}>
67
- <MuteAllVideoButton />
68
- </View>
69
- )}
70
- </View>
71
- </>
152
+ <View style={style.container}>
153
+ {!$config.AUDIO_ROOM && <MuteAllVideoButton />}
154
+ <Spacer horizontal size={16} />
155
+ <MuteAllAudioButton />
156
+ </View>
72
157
  );
73
158
  };
74
159
 
75
160
  const style = StyleSheet.create({
76
- heading: {
77
- fontSize: 20,
78
- fontWeight: '700',
79
- color: $config.PRIMARY_FONT_COLOR,
80
- // marginBottom: 20,
81
- alignSelf: 'center',
82
- },
83
- btnContainer: {
84
- alignItems: 'center',
85
- marginVertical: 15,
161
+ container: {
162
+ flexDirection: 'row',
163
+ justifyContent: 'center',
86
164
  },
165
+ btn: {},
87
166
  });
88
167
 
89
168
  export default HostControlView;