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,68 +1,144 @@
1
- import React, {useContext} from 'react';
2
- import {View, StyleSheet, useWindowDimensions} from 'react-native';
1
+ import React, {useContext, useEffect} from 'react';
2
+ import {View, StyleSheet, useWindowDimensions, Text} from 'react-native';
3
3
  import {RFValue} from 'react-native-responsive-fontsize';
4
- import {ImageIcon, RenderInterface} from '../../../agora-rn-uikit';
4
+ import ThemeConfig from '../../theme';
5
+ import {RenderInterface} from '../../../agora-rn-uikit';
6
+ import ImageIcon from '../../atoms/ImageIcon';
5
7
  import TextWithTooltip from '../../subComponents/TextWithTooltip';
6
- import ColorContext from '../../components/ColorContext';
7
8
  import {useString} from '../../utils/useString';
9
+ import {useLayout, useRender} from 'customization-api';
10
+ import useIsActiveSpeaker from '../../utils/useIsActiveSpeaker';
11
+ import {isMobileUA, isWeb, isWebInternal, useIsSmall} from '../../utils/common';
12
+ import AnimatedActiveSpeaker from '../../atoms/AnimatedActiveSpeaker';
13
+ import {getGridLayoutName, getPinnedLayoutName} from './DefaultLayouts';
8
14
 
9
15
  interface NameWithMicIconProps {
10
16
  user: RenderInterface;
17
+ isMax: boolean;
18
+ videoTileWidth: number;
11
19
  }
12
20
 
13
21
  const NameWithMicIcon = (props: NameWithMicIconProps) => {
22
+ const {activeUids} = useRender();
23
+ const {currentLayout} = useLayout();
24
+ const reduceSpace =
25
+ isMobileUA() &&
26
+ activeUids.length > 4 &&
27
+ currentLayout === getGridLayoutName();
14
28
  const {user} = props;
15
- const {primaryColor} = useContext(ColorContext);
16
29
  const {height, width} = useWindowDimensions();
30
+ const isActiveSpeaker = useIsActiveSpeaker();
31
+ const isSpeaking = isActiveSpeaker(user.uid);
17
32
  //commented for v1 release
18
33
  //const remoteUserDefaultLabel = useString('remoteUserDefaultLabel')();
19
34
  const remoteUserDefaultLabel = 'User';
35
+ const isSmall = useIsSmall();
20
36
  return (
21
- <>
22
- <View style={[style.MicBackdrop]}>
23
- <ImageIcon
24
- name={user.audio ? 'mic' : 'micOff'}
25
- color={user.audio ? primaryColor : 'red'}
26
- style={style.MicIcon}
27
- />
28
- </View>
29
- <View style={{flex: 1}}>
30
- <TextWithTooltip
31
- value={user.name || remoteUserDefaultLabel}
32
- style={[
33
- style.name,
34
- {
35
- fontSize: RFValue(14, height > width ? height : width),
36
- },
37
- ]}
38
- />
39
- </View>
40
- </>
37
+ <View
38
+ style={[
39
+ style.container,
40
+ {
41
+ maxWidth:
42
+ props.videoTileWidth * 0.6 > 180 ? 180 : props.videoTileWidth * 0.6,
43
+ },
44
+ reduceSpace ? {left: 2, bottom: 2} : {},
45
+ reduceSpace && activeUids.length > 12 ? {padding: 2} : {},
46
+ ]}>
47
+ {/* {user.audio ? (
48
+ <AnimatedActiveSpeaker isSpeaking={isSpeaking} />
49
+ ) : ( */}
50
+ <ImageIcon
51
+ iconType="plain"
52
+ name={
53
+ user.audio && isSpeaking
54
+ ? 'active-speaker'
55
+ : user.audio
56
+ ? 'mic-on'
57
+ : 'mic-off'
58
+ }
59
+ tintColor={
60
+ user.audio
61
+ ? $config.PRIMARY_ACTION_BRAND_COLOR
62
+ : $config.SEMANTIC_ERROR
63
+ }
64
+ iconSize={20}
65
+ />
66
+ {/* )} */}
67
+ {/* <ImageIcon
68
+ name={
69
+ isSpeaking ? 'active-speaker' : user.audio ? 'mic-on' : 'mic-off'
70
+ }
71
+ tintColor={
72
+ isSpeaking
73
+ ? $config.PRIMARY_ACTION_BRAND_COLOR
74
+ : user.audio
75
+ ? $config.PRIMARY_ACTION_BRAND_COLOR
76
+ : $config.SEMANTIC_ERROR
77
+ }
78
+ iconSize={'small'}
79
+ /> */}
80
+ {(isMobileUA() || (!isMobileUA() && isSmall())) &&
81
+ currentLayout === getGridLayoutName() &&
82
+ activeUids.length > 6 ? (
83
+ // || (isMobileUA() &&
84
+ // currentLayout !== getPinnedLayoutName() &&
85
+ // !props?.isMax)
86
+ <></>
87
+ ) : (
88
+ <PlatformWrapper>
89
+ <Text
90
+ numberOfLines={1}
91
+ textBreakStrategy="simple"
92
+ ellipsizeMode="tail"
93
+ style={style.name}>
94
+ {user.name || remoteUserDefaultLabel}
95
+ </Text>
96
+ </PlatformWrapper>
97
+ )}
98
+ </View>
99
+ );
100
+ };
101
+ const PlatformWrapper = ({children}) => {
102
+ return isWeb() ? (
103
+ <div
104
+ style={{
105
+ userSelect: 'none',
106
+ MozUserSelect: 'none',
107
+ WebkitUserSelect: 'none',
108
+ msUserSelect: 'none',
109
+ alignSelf: 'center',
110
+ overflow: 'hidden',
111
+ textOverflow: 'ellipsis',
112
+ color: $config.VIDEO_AUDIO_TILE_TEXT_COLOR,
113
+ }}>
114
+ {children}
115
+ </div>
116
+ ) : (
117
+ <>{children}</>
41
118
  );
42
119
  };
43
120
 
44
121
  const style = StyleSheet.create({
122
+ container: {
123
+ backgroundColor: $config.VIDEO_AUDIO_TILE_OVERLAY_COLOR,
124
+ position: 'absolute',
125
+ alignItems: 'center',
126
+ padding: 8,
127
+ // height: 34,
128
+ left: 8,
129
+ bottom: 8,
130
+ borderRadius: 4,
131
+ flexDirection: 'row',
132
+ zIndex: 5,
133
+ },
45
134
  name: {
46
- color: $config.PRIMARY_FONT_COLOR,
47
- lineHeight: 25,
48
- fontWeight: '700',
135
+ color: $config.VIDEO_AUDIO_TILE_TEXT_COLOR,
136
+ fontSize: ThemeConfig.FontSize.small,
137
+ fontWeight: '600',
138
+ fontFamily: ThemeConfig.FontFamily.sansPro,
49
139
  flexShrink: 1,
50
- },
51
- MicBackdrop: {
52
- width: 20,
53
- height: 20,
54
- borderRadius: 15,
55
- marginHorizontal: 10,
56
- backgroundColor: $config.SECONDARY_FONT_COLOR,
57
- display: 'flex',
58
- alignSelf: 'center',
59
- justifyContent: 'center',
60
- },
61
- MicIcon: {
62
- width: '80%',
63
- height: '80%',
64
- alignSelf: 'center',
65
- resizeMode: 'contain',
140
+ marginLeft: 4,
141
+ marginRight: 2,
66
142
  },
67
143
  });
68
144
 
@@ -13,8 +13,9 @@ const DefaultRenderComponent: RenderComponentType = {
13
13
  };
14
14
  interface RenderComponentProps {
15
15
  uid: UidType;
16
+ isMax?: boolean;
16
17
  }
17
- const RenderComponent = ({uid}: RenderComponentProps) => {
18
+ const RenderComponent = ({uid, isMax = false}: RenderComponentProps) => {
18
19
  const {renderList} = useRender();
19
20
  const FpeRenderComponent = useCustomization((config) =>
20
21
  typeof config?.components?.videoCall === 'object' &&
@@ -43,7 +44,7 @@ const RenderComponent = ({uid}: RenderComponentProps) => {
43
44
 
44
45
  const RenderComp = getRenderComponent(renderList[uid]?.type);
45
46
 
46
- return <RenderComp user={renderList[uid]} />;
47
+ return <RenderComp user={renderList[uid]} isMax={isMax} />;
47
48
  };
48
49
 
49
50
  export default RenderComponent;
@@ -0,0 +1,190 @@
1
+ import {StyleSheet, Text, TouchableOpacity, View} from 'react-native';
2
+ import React, {useContext} from 'react';
3
+ import SidePanelHeader, {
4
+ SidePanelStyles,
5
+ } from '../../subComponents/SidePanelHeader';
6
+ import hexadecimalTransparency from '../../utils/hexadecimalTransparency';
7
+ import ThemeConfig from '../../theme';
8
+ import {useChatNotification} from '../../components/chat-notification/useChatNotification';
9
+ import {useSidePanel} from '../../utils/useSidePanel';
10
+ import {SidePanelType} from '../../subComponents/SidePanelEnum';
11
+ import {useChatUIControl} from '../../components/chat-ui/useChatUIControl';
12
+ import {numFormatter} from '../../utils';
13
+ import ChatContext from '../../components/ChatContext';
14
+
15
+ export const SettingsHeader = (props) => {
16
+ const {setSidePanel} = useSidePanel();
17
+ const settingsLabel = 'Settings';
18
+ return (
19
+ <SidePanelHeader
20
+ centerComponent={
21
+ <Text style={SidePanelStyles.heading}>{settingsLabel}</Text>
22
+ }
23
+ trailingIconName="close"
24
+ trailingIconOnPress={() => {
25
+ props.handleClose && props.handleClose();
26
+ setSidePanel(SidePanelType.None);
27
+ }}
28
+ />
29
+ );
30
+ };
31
+
32
+ export const PeopleHeader = () => {
33
+ const {onlineUsersCount} = useContext(ChatContext);
34
+ const participantsLabel = `People (${numFormatter(onlineUsersCount)})`;
35
+ const {setSidePanel} = useSidePanel();
36
+ return (
37
+ <SidePanelHeader
38
+ centerComponent={
39
+ <Text style={SidePanelStyles.heading}>{participantsLabel}</Text>
40
+ }
41
+ trailingIconName="close"
42
+ trailingIconOnPress={() => {
43
+ setSidePanel(SidePanelType.None);
44
+ }}
45
+ />
46
+ );
47
+ };
48
+
49
+ export const ChatHeader = () => {
50
+ const {
51
+ unreadGroupMessageCount,
52
+ setUnreadGroupMessageCount,
53
+ unreadPrivateMessageCount,
54
+ setUnreadPrivateMessageCount,
55
+ setUnreadIndividualMessageCount,
56
+ unreadIndividualMessageCount,
57
+ } = useChatNotification();
58
+
59
+ const {setSidePanel} = useSidePanel();
60
+ const groupChatLabel = 'Group';
61
+ const privateChatLabel = 'Private';
62
+
63
+ const {
64
+ groupActive,
65
+ setGroupActive,
66
+ privateActive,
67
+ setPrivateActive,
68
+ setSelectedChatUserId: setSelectedUser,
69
+ } = useChatUIControl();
70
+
71
+ const selectGroup = () => {
72
+ setPrivateActive(false);
73
+ setGroupActive(true);
74
+ //move this logic into ChatContainer
75
+ //setUnreadGroupMessageCount(0);
76
+ setSelectedUser(0);
77
+ };
78
+ const selectPrivate = () => {
79
+ setGroupActive(false);
80
+ setSelectedUser(0);
81
+ setPrivateActive(false);
82
+ };
83
+
84
+ return (
85
+ <SidePanelHeader
86
+ isChat={true}
87
+ leadingIconName={privateActive ? 'back-btn' : null}
88
+ leadingIconOnPress={
89
+ privateActive
90
+ ? () => {
91
+ setSelectedUser(0);
92
+ setPrivateActive(false);
93
+ }
94
+ : () => {}
95
+ }
96
+ centerComponent={
97
+ <View style={styles.buttonHolder}>
98
+ <TouchableOpacity
99
+ onPress={selectGroup}
100
+ style={
101
+ groupActive ? styles.activeContainer : styles.nonActiveContainer
102
+ }>
103
+ {unreadGroupMessageCount !== 0 ? (
104
+ <View style={styles.chatNotification} />
105
+ ) : null}
106
+ <Text
107
+ style={groupActive ? styles.activeText : styles.nonActiveText}>
108
+ {groupChatLabel}
109
+ </Text>
110
+ </TouchableOpacity>
111
+ <TouchableOpacity
112
+ onPress={selectPrivate}
113
+ style={
114
+ !groupActive
115
+ ? [styles.activeContainer]
116
+ : [styles.nonActiveContainer]
117
+ }>
118
+ {unreadPrivateMessageCount !== 0 ? (
119
+ <View style={styles.chatNotification} />
120
+ ) : null}
121
+ <Text
122
+ style={!groupActive ? styles.activeText : styles.nonActiveText}>
123
+ {privateChatLabel}
124
+ </Text>
125
+ </TouchableOpacity>
126
+ </View>
127
+ }
128
+ trailingIconName="close"
129
+ trailingIconOnPress={() => {
130
+ setSidePanel(SidePanelType.None);
131
+ }}
132
+ />
133
+ );
134
+ };
135
+
136
+ const styles = StyleSheet.create({
137
+ buttonHolder: {
138
+ backgroundColor:
139
+ $config.HARD_CODED_BLACK_COLOR + hexadecimalTransparency['30%'],
140
+ borderRadius: 12,
141
+ flexDirection: 'row',
142
+ },
143
+ chatViewNative: {
144
+ zIndex: 5,
145
+ width: '100%',
146
+ height: '100%',
147
+ right: 0,
148
+ bottom: 0,
149
+ },
150
+ chatInputContainer: {
151
+ width: '100%',
152
+ flexDirection: 'row',
153
+ alignItems: 'center',
154
+ justifyContent: 'center',
155
+ },
156
+ activeContainer: {
157
+ margin: 2,
158
+ backgroundColor: $config.PRIMARY_ACTION_BRAND_COLOR,
159
+ borderRadius: 11,
160
+ alignSelf: 'center',
161
+ },
162
+ nonActiveContainer: {
163
+ alignSelf: 'center',
164
+ },
165
+ activeText: {
166
+ paddingHorizontal: 24,
167
+ paddingVertical: 10,
168
+ fontFamily: ThemeConfig.FontFamily.sansPro,
169
+ fontWeight: '600',
170
+ fontSize: 12,
171
+ color: $config.PRIMARY_ACTION_TEXT_COLOR,
172
+ },
173
+ nonActiveText: {
174
+ paddingHorizontal: 24,
175
+ paddingVertical: 10,
176
+ fontFamily: ThemeConfig.FontFamily.sansPro,
177
+ fontWeight: '600',
178
+ fontSize: 12,
179
+ color: $config.FONT_COLOR,
180
+ },
181
+ chatNotification: {
182
+ width: 8,
183
+ height: 8,
184
+ backgroundColor: $config.SEMANTIC_ERROR,
185
+ borderRadius: 30,
186
+ position: 'absolute',
187
+ right: 8,
188
+ top: 4,
189
+ },
190
+ });
@@ -0,0 +1,139 @@
1
+ import {StyleSheet, Text, View, AppState} from 'react-native';
2
+ import React, {useRef, useContext, useState, useEffect} from 'react';
3
+ import VideoComponent from './VideoComponent';
4
+ import ActionSheet from './ActionSheet';
5
+ import ThemeConfig from '../../theme';
6
+ import Spacer from '../../atoms/Spacer';
7
+ import {useMeetingInfo} from '../../components/meeting-info/useMeetingInfo';
8
+
9
+ import {useRecording} from '../../subComponents/recording/useRecording';
10
+ import hexadecimalTransparency from '../../utils/hexadecimalTransparency';
11
+ import ParticipantsCount from '../../atoms/ParticipantsCount';
12
+ import RecordingInfo from '../../atoms/RecordingInfo';
13
+ import {isAndroid, isWebInternal, trimText} from '../../utils/common';
14
+ import {RtcContext, ToggleState, useLocalUid} from '../../../agora-rn-uikit';
15
+ import {useLocalUserInfo, useRender} from 'customization-api';
16
+
17
+ const VideoCallMobileView = () => {
18
+ const {
19
+ data: {meetingTitle},
20
+ } = useMeetingInfo();
21
+ const {isRecordingActive} = useRecording();
22
+ const recordingLabel = 'Recording';
23
+
24
+ const appState = useRef(AppState.currentState);
25
+ const [appStateVisible, setAppStateVisible] = useState(appState.current);
26
+ const {RtcEngine, dispatch} = useContext(RtcContext);
27
+ const local = useLocalUserInfo();
28
+
29
+ const isCamON = useRef(local.video);
30
+
31
+ // moved below logic to useMuteToggleLocal
32
+ // useEffect(() => {
33
+ // if ($config.AUDIO_ROOM) return;
34
+ // const subscription = AppState.addEventListener(
35
+ // 'change',
36
+ // async (nextAppState) => {
37
+ // if (nextAppState === 'background') {
38
+ // // check if cam was on before app goes to background
39
+ // isCamON.current = isAndroid()
40
+ // ? local.video === ToggleState.enabled
41
+ // : RtcEngine?.isVideoEnabled;
42
+
43
+ // if (isCamON.current || 1) {
44
+ // isWebInternal()
45
+ // ? await RtcEngine.muteLocalVideoStream(true)
46
+ // : await RtcEngine.enableLocalVideo(false);
47
+
48
+ // // dispatch({
49
+ // // type: 'LocalMuteVideo',
50
+ // // value: [0],
51
+ // // });
52
+ // }
53
+ // }
54
+ // if (nextAppState === 'active') {
55
+ // // enable cam only if cam was on before app goes to background
56
+ // console.log('active state 111111 ==>', isCamON.current);
57
+ // if (local.video) {
58
+ // isWebInternal()
59
+ // ? await RtcEngine.muteLocalVideoStream(false)
60
+ // : await RtcEngine.enableLocalVideo(true);
61
+ // dispatch({
62
+ // type: 'LocalMuteVideo',
63
+ // value: [1],
64
+ // });
65
+ // }
66
+ // }
67
+ // appState.current = nextAppState;
68
+ // },
69
+ // );
70
+
71
+ // return () => {
72
+ // subscription?.remove();
73
+ // };
74
+ // }, []);
75
+
76
+ return (
77
+ <View style={styles.container}>
78
+ <View style={styles.titleBar}>
79
+ <Text style={styles.title}>{trimText(meetingTitle)}</Text>
80
+ <Spacer size={8} horizontal={false} />
81
+ <View style={styles.countView}>
82
+ <View
83
+ style={{
84
+ width: 45,
85
+ height: 35,
86
+ justifyContent: 'center',
87
+ alignItems: 'center',
88
+ alignSelf: 'center',
89
+ zIndex: isWebInternal() ? 3 : 0,
90
+
91
+ //flex: 1,
92
+ }}>
93
+ <ParticipantsCount />
94
+ </View>
95
+ {isRecordingActive ? (
96
+ <RecordingInfo recordingLabel={recordingLabel} />
97
+ ) : (
98
+ <></>
99
+ )}
100
+ </View>
101
+ </View>
102
+ <Spacer size={16} />
103
+ <View style={styles.videoView}>
104
+ <VideoComponent />
105
+ </View>
106
+ <ActionSheet />
107
+ </View>
108
+ );
109
+ };
110
+
111
+ export default VideoCallMobileView;
112
+
113
+ const styles = StyleSheet.create({
114
+ container: {
115
+ paddingHorizontal: 16,
116
+ paddingVertical: 20,
117
+ flex: 1,
118
+ },
119
+ title: {
120
+ fontSize: ThemeConfig.FontSize.normal,
121
+ lineHeight: ThemeConfig.FontSize.normal,
122
+ color: $config.FONT_COLOR,
123
+ fontWeight: '600',
124
+ fontFamily: ThemeConfig.FontFamily.sansPro,
125
+ paddingVertical: 2,
126
+ },
127
+ videoView: {
128
+ flex: 0.85,
129
+ zIndex: 0,
130
+ elevation: 0,
131
+ },
132
+ titleBar: {
133
+ flexDirection: 'column',
134
+ alignItems: 'flex-start',
135
+ },
136
+ countView: {
137
+ flexDirection: 'row',
138
+ },
139
+ });
@@ -0,0 +1,37 @@
1
+ import React from 'react';
2
+ import {GestureHandlerRootView} from 'react-native-gesture-handler';
3
+ import VideoCallMobileView from './VideoCallMobileView';
4
+ import ReactNativeForegroundService from '@supersami/rn-foreground-service';
5
+ import {AppRegistry, Platform} from 'react-native';
6
+
7
+ const VideoCallleScreen = () => {
8
+ React.useEffect(() => {
9
+ if (Platform.OS === 'android') {
10
+ ReactNativeForegroundService.register();
11
+ AppRegistry.registerComponent($config.APP_NAME, () => VideoCallleScreen);
12
+ ReactNativeForegroundService.add_task(
13
+ () => {
14
+ //console.log('App is active!')
15
+ },
16
+ {
17
+ delay: 1000,
18
+ onLoop: true,
19
+ taskId: 'taskid',
20
+ onError: (e) => console.log(`Error logging:`, e),
21
+ },
22
+ );
23
+ ReactNativeForegroundService.start({
24
+ id: 145,
25
+ title: $config.APP_NAME,
26
+ message: 'Call is active',
27
+ });
28
+ }
29
+ }, []);
30
+ return (
31
+ <GestureHandlerRootView style={{flex: 1}}>
32
+ <VideoCallMobileView />
33
+ </GestureHandlerRootView>
34
+ );
35
+ };
36
+
37
+ export default VideoCallleScreen;
@@ -1,13 +1,24 @@
1
- import React, {useContext, useEffect} from 'react';
2
- import {View, StyleSheet} from 'react-native';
1
+ import React, {useContext, useEffect, useState} from 'react';
2
+ import {
3
+ View,
4
+ StyleSheet,
5
+ useWindowDimensions,
6
+ Text,
7
+ Platform,
8
+ } from 'react-native';
3
9
  import {useCustomization} from 'customization-implementation';
4
10
  import Navbar from '../../components/Navbar';
5
11
  import ParticipantsView from '../../components/ParticipantsView';
6
12
  import SettingsView from '../../components/SettingsView';
7
13
  import Controls from '../../components/Controls';
8
- import Chat from '../../components/Chat';
14
+ import Chat, {ChatProps} from '../../components/Chat';
9
15
  import {SidePanelType} from '../../subComponents/SidePanelEnum';
10
- import {isValidReactComponent, isWebInternal} from '../../utils/common';
16
+ import {
17
+ isMobileUA,
18
+ isValidReactComponent,
19
+ isWebInternal,
20
+ useIsDesktop,
21
+ } from '../../utils/common';
11
22
  import {useSidePanel} from '../../utils/useSidePanel';
12
23
  import VideoComponent from './VideoComponent';
13
24
  import {videoView} from '../../../theme.json';
@@ -17,10 +28,13 @@ import {
17
28
  } from '../../utils/useButtonTemplate';
18
29
  import SDKEvents from '../../utils/SdkEvents';
19
30
  import {useMeetingInfo} from '../../components/meeting-info/useMeetingInfo';
20
- import {useRtc} from 'customization-api';
31
+ import {controlMessageEnum, useRtc, useUserName} from 'customization-api';
32
+ import events, {EventPersistLevel} from '../../rtm-events-api';
33
+ import VideoCallMobileView from './VideoCallMobileView';
21
34
 
22
35
  const VideoCallScreen = () => {
23
36
  const {sidePanel} = useSidePanel();
37
+ const [name] = useUserName();
24
38
  const rtc = useRtc();
25
39
  const {
26
40
  data: {meetingTitle, isHost},
@@ -37,7 +51,7 @@ const VideoCallScreen = () => {
37
51
  } = useCustomization((data) => {
38
52
  let components: {
39
53
  VideocallComponent?: React.ComponentType;
40
- ChatComponent: React.ComponentType;
54
+ ChatComponent: React.ComponentType<ChatProps>;
41
55
  BottombarComponent: React.ComponentType;
42
56
  ParticipantsComponent: React.ComponentType;
43
57
  SettingsComponent: React.ComponentType;
@@ -129,6 +143,14 @@ const VideoCallScreen = () => {
129
143
  });
130
144
 
131
145
  useEffect(() => {
146
+ // setTimeout(() => {
147
+ // events.send(
148
+ // controlMessageEnum.newUserJoined,
149
+ // JSON.stringify({name}),
150
+ // EventPersistLevel.LEVEL1,
151
+ // );
152
+ // }, 1000);
153
+
132
154
  /**
133
155
  * OLD: Commenting this code as getDevices API is web only
134
156
  * The below code fails on native app
@@ -136,6 +158,7 @@ const VideoCallScreen = () => {
136
158
  */
137
159
  if (isWebInternal()) {
138
160
  new Promise((res) =>
161
+ //@ts-ignore
139
162
  rtc.RtcEngine.getDevices(function (devices: MediaDeviceInfo[]) {
140
163
  res(devices);
141
164
  }),
@@ -146,9 +169,16 @@ const VideoCallScreen = () => {
146
169
  }
147
170
  }, []);
148
171
 
172
+ const isDesktop = useIsDesktop();
173
+
149
174
  return VideocallComponent ? (
150
175
  <VideocallComponent />
176
+ ) : // ) : !isDesktop ? (
177
+ isMobileUA() ? (
178
+ // Mobile View
179
+ <VideoCallMobileView />
151
180
  ) : (
181
+ // Desktop View
152
182
  <>
153
183
  <VideocallBeforeView />
154
184
  <View style={style.full}>
@@ -156,7 +186,11 @@ const VideoCallScreen = () => {
156
186
  value={{buttonTemplateName: ButtonTemplateName.topBar}}>
157
187
  <TopbarComponent />
158
188
  </ButtonTemplateProvider>
159
- <View style={[style.videoView, {backgroundColor: '#ffffff00'}]}>
189
+ <View
190
+ style={[
191
+ style.videoView,
192
+ {paddingHorizontal: isDesktop() ? 32 : 10, paddingVertical: 10},
193
+ ]}>
160
194
  <VideoComponent />
161
195
  {sidePanel === SidePanelType.Participants ? (
162
196
  <ParticipantsComponent />
@@ -195,6 +229,8 @@ const style = StyleSheet.create({
195
229
  flexDirection: 'column',
196
230
  overflow: 'hidden',
197
231
  },
198
- //@ts-ignore
199
- videoView: videoView,
232
+ videoView: {
233
+ flex: 12,
234
+ flexDirection: 'row',
235
+ },
200
236
  });