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,8 +9,8 @@
9
9
  information visit https://appbuilder.agora.io.
10
10
  *********************************************
11
11
  */
12
- import React, {useState, useContext} from 'react';
13
- import {View, Dimensions, StyleSheet} from 'react-native';
12
+ import React, {useState, useContext, useEffect, useRef} from 'react';
13
+ import {View, StyleSheet, Text, useWindowDimensions} from 'react-native';
14
14
  import {PropsContext} from '../../agora-rn-uikit';
15
15
  import LocalAudioMute, {
16
16
  LocalAudioMuteProps,
@@ -25,83 +25,365 @@ import LocalSwitchCamera, {
25
25
  import ScreenshareButton, {
26
26
  ScreenshareButtonProps,
27
27
  } from '../subComponents/screenshare/ScreenshareButton';
28
- import {controlsHolder} from '../../theme.json';
29
28
  import isMobileOrTablet from '../utils/isMobileOrTablet';
30
29
  import {ClientRole} from '../../agora-rn-uikit';
31
30
  import LiveStreamControls, {
32
31
  LiveStreamControlsProps,
33
32
  } from './livestream/views/LiveStreamControls';
34
- import {isWebInternal} from '../utils/common';
33
+ import {
34
+ BREAKPOINTS,
35
+ calculatePosition,
36
+ isWebInternal,
37
+ useIsDesktop,
38
+ } from '../utils/common';
35
39
  import {useMeetingInfo} from './meeting-info/useMeetingInfo';
36
40
  import LocalEndcall, {LocalEndcallProps} from '../subComponents/LocalEndCall';
41
+ import Spacer from '../atoms/Spacer';
42
+ import LayoutIconButton from '../subComponents/LayoutIconButton';
43
+ import CopyJoinInfo from '../subComponents/CopyJoinInfo';
44
+ import hexadecimalTransparency from '../utils/hexadecimalTransparency';
45
+ import IconButton from '../atoms/IconButton';
46
+ import ActionMenu, {ActionMenuItem} from '../atoms/ActionMenu';
47
+ import useLayoutsData from '../pages/video-call/useLayoutsData';
48
+ import {
49
+ SidePanelType,
50
+ useChatUIControl,
51
+ useLayout,
52
+ useRecording,
53
+ useSidePanel,
54
+ } from 'customization-api';
55
+ import {useVideoCall} from './useVideoCall';
56
+ import {useScreenshare} from '../subComponents/screenshare/useScreenshare';
57
+ import LayoutIconDropdown from '../subComponents/LayoutIconDropdown';
37
58
 
38
- const Controls = () => {
59
+ const MoreButton = () => {
39
60
  const {rtcProps} = useContext(PropsContext);
61
+ const [actionMenuVisible, setActionMenuVisible] = React.useState(false);
62
+ const [isHovered, setIsHovered] = useState(false);
63
+ const [isHoveredOnModal, setIsHoveredOnModal] = useState(false);
64
+ const moreBtnRef = useRef(null);
65
+ const {width: globalWidth, height: globalHeight} = useWindowDimensions();
66
+ const layouts = useLayoutsData();
67
+ const {currentLayout, setLayout} = useLayout();
68
+ const layout = layouts.findIndex((item) => item.name === currentLayout);
69
+ const {setSidePanel, sidePanel} = useSidePanel();
70
+ const {
71
+ data: {isHost},
72
+ } = useMeetingInfo();
73
+ const {
74
+ showLayoutOption,
75
+ setShowInvitePopup,
76
+ setShowStopRecordingPopup,
77
+ setShowLayoutOption,
78
+ } = useVideoCall();
79
+ const {isScreenshareActive, startUserScreenshare, stopUserScreenShare} =
80
+ useScreenshare();
81
+ const {isRecordingActive, startRecording, inProgress} = useRecording();
82
+ const {setGroupActive} = useChatUIControl();
83
+ const actionMenuitems: ActionMenuItem[] = [];
84
+
85
+ if (globalWidth <= BREAKPOINTS.sm) {
86
+ actionMenuitems.push({
87
+ icon: 'participants',
88
+ iconColor: $config.SECONDARY_ACTION_COLOR,
89
+ textColor: $config.FONT_COLOR,
90
+ title: 'People',
91
+ callback: () => {
92
+ setActionMenuVisible(false);
93
+ setSidePanel(SidePanelType.Participants);
94
+ },
95
+ });
96
+ actionMenuitems.push({
97
+ icon: 'chat-nav',
98
+ iconColor: $config.SECONDARY_ACTION_COLOR,
99
+ textColor: $config.FONT_COLOR,
100
+ title: 'Chat',
101
+ callback: () => {
102
+ setActionMenuVisible(false);
103
+ setGroupActive(true);
104
+ setSidePanel(SidePanelType.Chat);
105
+ },
106
+ });
107
+
108
+ if ($config.SCREEN_SHARING) {
109
+ if (
110
+ !(
111
+ rtcProps.role == ClientRole.Audience &&
112
+ $config.EVENT_MODE &&
113
+ !$config.RAISE_HAND
114
+ )
115
+ ) {
116
+ actionMenuitems.push({
117
+ disabled:
118
+ rtcProps.role == ClientRole.Audience &&
119
+ $config.EVENT_MODE &&
120
+ $config.RAISE_HAND &&
121
+ !isHost,
122
+ icon: isScreenshareActive ? 'stop-screen-share' : 'screen-share',
123
+ iconColor: isScreenshareActive
124
+ ? $config.SEMANTIC_ERROR
125
+ : $config.SECONDARY_ACTION_COLOR,
126
+ textColor: isScreenshareActive
127
+ ? $config.SEMANTIC_ERROR
128
+ : $config.FONT_COLOR,
129
+ title: isScreenshareActive ? 'Stop Share' : 'Share',
130
+ callback: () => {
131
+ setActionMenuVisible(false);
132
+ isScreenshareActive
133
+ ? stopUserScreenShare()
134
+ : startUserScreenshare();
135
+ },
136
+ });
137
+ }
138
+ }
139
+ if (isHost && $config.CLOUD_RECORDING) {
140
+ actionMenuitems.push({
141
+ disabled: inProgress,
142
+ icon: isRecordingActive ? 'stop-recording' : 'recording',
143
+ iconColor: isRecordingActive
144
+ ? $config.SEMANTIC_ERROR
145
+ : $config.SECONDARY_ACTION_COLOR,
146
+ textColor: isRecordingActive
147
+ ? $config.SEMANTIC_ERROR
148
+ : $config.FONT_COLOR,
149
+ title: isRecordingActive ? 'Stop Recording' : 'Record',
150
+ callback: () => {
151
+ setActionMenuVisible(false);
152
+ if (!isRecordingActive) {
153
+ startRecording();
154
+ } else {
155
+ setShowStopRecordingPopup(true);
156
+ }
157
+ },
158
+ });
159
+ }
160
+ }
161
+
162
+ if (globalWidth <= BREAKPOINTS.md) {
163
+ actionMenuitems.push({
164
+ icon: layouts[layout]?.iconName,
165
+ iconColor: $config.SECONDARY_ACTION_COLOR,
166
+ textColor: $config.FONT_COLOR,
167
+ title: 'Layout',
168
+ callback: () => {
169
+ //setShowLayoutOption(true);
170
+ },
171
+ onHoverCallback: (isHovered) => {
172
+ setShowLayoutOption(isHovered);
173
+ },
174
+ onHoverContent: (
175
+ <LayoutIconDropdown
176
+ onHoverPlaceHolder="vertical"
177
+ setShowDropdown={() => {}}
178
+ showDropdown={true}
179
+ modalPosition={
180
+ globalWidth <= BREAKPOINTS.sm
181
+ ? {bottom: 65, left: -150}
182
+ : {bottom: 20, left: -150}
183
+ }
184
+ caretPosition={{bottom: 45, right: -10}}
185
+ />
186
+ ),
187
+ });
188
+ actionMenuitems.push({
189
+ icon: 'share',
190
+ iconColor: $config.SECONDARY_ACTION_COLOR,
191
+ textColor: $config.FONT_COLOR,
192
+ title: 'Invite',
193
+ callback: () => {
194
+ setActionMenuVisible(false);
195
+ setShowInvitePopup(true);
196
+ },
197
+ });
198
+ }
199
+
200
+ if (globalWidth <= BREAKPOINTS.sm) {
201
+ actionMenuitems.push({
202
+ icon: 'settings',
203
+ iconColor: $config.SECONDARY_ACTION_COLOR,
204
+ textColor: $config.FONT_COLOR,
205
+ title: 'Settings',
206
+ callback: () => {
207
+ setActionMenuVisible(false);
208
+ setSidePanel(SidePanelType.Settings);
209
+ },
210
+ });
211
+ }
212
+
213
+ useEffect(() => {
214
+ if (isHovered) {
215
+ setActionMenuVisible(true);
216
+ }
217
+ }, [isHovered]);
40
218
 
41
- let onLayout = (e: any) => {
42
- setDim([e.nativeEvent.layout.width, e.nativeEvent.layout.height]);
43
- };
44
- const [dim, setDim] = useState([
45
- Dimensions.get('window').width,
46
- Dimensions.get('window').height,
47
- Dimensions.get('window').width > Dimensions.get('window').height,
48
- ]);
49
- const isDesktop = dim[0] > 1224;
219
+ useEffect(() => {
220
+ //hide action menu when user change layout
221
+ setActionMenuVisible(false);
222
+ }, [currentLayout]);
223
+
224
+ return (
225
+ <>
226
+ <ActionMenu
227
+ containerStyle={{width: 180}}
228
+ hoverMode={true}
229
+ onHover={(isVisible) => setIsHoveredOnModal(isVisible)}
230
+ from={'control-bar'}
231
+ actionMenuVisible={(isHovered || isHoveredOnModal) && actionMenuVisible}
232
+ setActionMenuVisible={setActionMenuVisible}
233
+ modalPosition={{
234
+ bottom: 8,
235
+ left: 0,
236
+ }}
237
+ items={actionMenuitems}
238
+ />
239
+ <div
240
+ onMouseEnter={() => {
241
+ setIsHovered(true);
242
+ }}
243
+ onMouseLeave={() => {
244
+ setIsHovered(false);
245
+ }}>
246
+ {/** placeholder to hovering */}
247
+ <View
248
+ style={{
249
+ position: 'absolute',
250
+ top: -20,
251
+ zIndex: -1,
252
+ height: '50%',
253
+ width: '100%',
254
+ backgroundColor: 'transparent',
255
+ }}
256
+ />
257
+ <IconButton
258
+ setRef={(ref) => {
259
+ moreBtnRef.current = ref;
260
+ }}
261
+ onPress={() => {
262
+ //setActionMenuVisible(true);
263
+ }}
264
+ iconProps={{
265
+ name: 'more-menu',
266
+ tintColor: $config.SECONDARY_ACTION_COLOR,
267
+ }}
268
+ btnTextProps={{
269
+ text: $config.ICON_TEXT ? 'More' : '',
270
+ textColor: $config.FONT_COLOR,
271
+ }}
272
+ />
273
+ </div>
274
+ </>
275
+ );
276
+ };
277
+ const Controls = () => {
278
+ const {rtcProps} = useContext(PropsContext);
279
+ const isDesktop = useIsDesktop();
50
280
  const {
51
281
  data: {isHost},
52
282
  } = useMeetingInfo();
283
+ const {width} = useWindowDimensions();
284
+
53
285
  return (
54
286
  <View
287
+ testID="videocall-controls"
55
288
  style={[
56
- style.controlsHolder,
289
+ style.container,
57
290
  {
58
- paddingHorizontal: isDesktop ? '25%' : '1%',
59
- backgroundColor: $config.SECONDARY_FONT_COLOR + 80,
291
+ paddingHorizontal: isDesktop('toolbar') ? 32 : 16,
60
292
  },
61
- ]}
62
- onLayout={onLayout}>
63
- {$config.EVENT_MODE && rtcProps.role == ClientRole.Audience ? (
64
- <LiveStreamControls showControls={true} />
65
- ) : (
293
+ ]}>
294
+ {width >= BREAKPOINTS.md && (
295
+ <View style={style.leftContent}>
296
+ <View
297
+ testID="layout-btn"
298
+ style={{marginRight: 10}}
299
+ collapsable={false}>
300
+ {/**
301
+ * .measure returns undefined on Android unless collapsable=false or onLayout are specified
302
+ * so added collapsable property
303
+ * https://github.com/facebook/react-native/issues/29712
304
+ * */}
305
+ <LayoutIconButton />
306
+ </View>
307
+ <View testID="invite-btn" style={{marginHorizontal: 10}}>
308
+ <CopyJoinInfo />
309
+ </View>
310
+ </View>
311
+ )}
312
+ <View style={style.centerContent}>
313
+ {$config.EVENT_MODE && rtcProps.role == ClientRole.Audience ? (
314
+ <LiveStreamControls
315
+ showControls={true}
316
+ isDesktop={isDesktop('toolbar')}
317
+ />
318
+ ) : (
319
+ <></>
320
+ )}
66
321
  <>
67
322
  {/**
68
323
  * In event mode when raise hand feature is active
69
324
  * and audience is promoted to host, the audience can also
70
325
  * demote himself
71
326
  */}
72
- {$config.EVENT_MODE && (
327
+ {$config.EVENT_MODE ? (
73
328
  <LiveStreamControls
329
+ isDesktop={isDesktop('toolbar')}
74
330
  showControls={rtcProps?.role == ClientRole.Broadcaster && !isHost}
75
331
  />
332
+ ) : (
333
+ <></>
76
334
  )}
77
- <View style={{alignSelf: 'center'}}>
78
- <LocalAudioMute />
335
+ <View testID="localAudio-btn" style={{marginHorizontal: 10}}>
336
+ <LocalAudioMute showToolTip={true} />
79
337
  </View>
80
338
  {!$config.AUDIO_ROOM && (
81
- <View style={{alignSelf: 'center'}}>
82
- <LocalVideoMute />
339
+ <View
340
+ testID="localVideo-btn"
341
+ style={{
342
+ marginHorizontal: 10,
343
+ }}>
344
+ <LocalVideoMute showToolTip={true} />
83
345
  </View>
84
346
  )}
85
347
  {!$config.AUDIO_ROOM && isMobileOrTablet() && (
86
- <View style={{alignSelf: 'center'}}>
348
+ <View
349
+ testID="switchCamera-btn"
350
+ style={{
351
+ marginHorizontal: 10,
352
+ }}>
87
353
  <LocalSwitchCamera />
88
354
  </View>
89
355
  )}
90
- {$config.SCREEN_SHARING && !isMobileOrTablet() && (
91
- <View style={{alignSelf: 'center'}}>
92
- <ScreenshareButton />
93
- </View>
94
- )}
95
- {isHost && $config.CLOUD_RECORDING && (
96
- <View style={{alignSelf: 'center'}}>
356
+ {width > BREAKPOINTS.sm &&
357
+ $config.SCREEN_SHARING &&
358
+ !isMobileOrTablet() && (
359
+ <View
360
+ testID="screenShare-btn"
361
+ style={{
362
+ marginHorizontal: 10,
363
+ }}>
364
+ <ScreenshareButton />
365
+ </View>
366
+ )}
367
+ {width > BREAKPOINTS.sm && isHost && $config.CLOUD_RECORDING && (
368
+ <View
369
+ testID="recording-btn"
370
+ style={{
371
+ marginHorizontal: 10,
372
+ }}>
97
373
  <Recording />
98
374
  </View>
99
375
  )}
100
376
  </>
101
- )}
102
- <View style={{alignSelf: 'center'}}>
103
- <LocalEndcall />
377
+ {width < BREAKPOINTS.md && (
378
+ <View testID="more-btn" style={{marginHorizontal: 10}}>
379
+ <MoreButton />
380
+ </View>
381
+ )}
382
+ <View testID="endCall-btn" style={{marginHorizontal: 10}}>
383
+ <LocalEndcall />
384
+ </View>
104
385
  </View>
386
+ {width >= BREAKPOINTS.md && <View style={style.rightContent}></View>}
105
387
  </View>
106
388
  );
107
389
  };
@@ -127,10 +409,28 @@ export const ControlsComponentsArray: ControlsComponentsArrayProps = [
127
409
  ];
128
410
 
129
411
  const style = StyleSheet.create({
130
- // @ts-ignore
131
- controlsHolder: {
132
- flex: isWebInternal() ? 1.3 : 1.6,
133
- ...controlsHolder,
412
+ container: {
413
+ flexDirection: 'row',
414
+ justifyContent: 'space-between',
415
+ paddingTop: 10,
416
+ paddingBottom: 16,
417
+ backgroundColor: $config.TOOLBAR_COLOR,
418
+ },
419
+ leftContent: {
420
+ flex: 1,
421
+ flexDirection: 'row',
422
+ justifyContent: 'flex-start',
423
+ alignItems: 'center',
424
+ },
425
+ centerContent: {
426
+ zIndex: 2,
427
+ flex: 1,
428
+ flexDirection: 'row',
429
+ justifyContent: 'center',
430
+ alignItems: 'center',
431
+ },
432
+ rightContent: {
433
+ flex: 1,
134
434
  },
135
435
  });
136
436
 
@@ -30,6 +30,7 @@ import LocalEndcall, {LocalEndcallProps} from '../subComponents/LocalEndCall';
30
30
  import LocalSwitchCamera, {
31
31
  LocalSwitchCameraProps,
32
32
  } from '../subComponents/LocalSwitchCamera';
33
+ import hexadecimalTransparency from '../utils/hexadecimalTransparency';
33
34
 
34
35
  const Controls = () => {
35
36
  const {
@@ -100,7 +101,8 @@ const style = StyleSheet.create({
100
101
  bottomBar: {
101
102
  flex: 1,
102
103
  paddingHorizontal: '1%',
103
- backgroundColor: $config.SECONDARY_FONT_COLOR + '80',
104
+ backgroundColor:
105
+ $config.SECONDARY_ACTION_COLOR + hexadecimalTransparency['80%'],
104
106
  flexDirection: 'row',
105
107
  justifyContent: 'space-evenly',
106
108
  position: 'relative',
@@ -109,9 +111,9 @@ const style = StyleSheet.create({
109
111
  bottom: 0,
110
112
  },
111
113
  localButton: {
112
- backgroundColor: $config.SECONDARY_FONT_COLOR,
114
+ backgroundColor: $config.SECONDARY_ACTION_COLOR,
113
115
  borderRadius: 2,
114
- borderColor: $config.PRIMARY_COLOR,
116
+ borderColor: $config.PRIMARY_ACTION_BRAND_COLOR,
115
117
  width: 40,
116
118
  height: 40,
117
119
  display: 'flex',
@@ -122,7 +124,7 @@ const style = StyleSheet.create({
122
124
  buttonIcon: {
123
125
  width: 35,
124
126
  height: 35,
125
- tintColor: $config.PRIMARY_COLOR,
127
+ tintColor: $config.PRIMARY_ACTION_BRAND_COLOR,
126
128
  },
127
129
  });
128
130