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,63 +9,155 @@
9
9
  information visit https://appbuilder.agora.io.
10
10
  *********************************************
11
11
  */
12
- import React from 'react';
12
+ import React, {useContext} from 'react';
13
13
  import {
14
- BtnTemplate,
15
14
  ToggleState,
16
- BtnTemplateInterface,
15
+ PermissionState,
16
+ ImageIcon as UIKitImageIcon,
17
+ ClientRole,
18
+ PropsContext,
19
+ useLocalUid,
17
20
  } from '../../agora-rn-uikit';
18
21
  import useMuteToggleLocal, {MUTE_LOCAL_TYPE} from '../utils/useMuteToggleLocal';
19
22
  import Styles from '../components/styles';
20
- import {
21
- ButtonTemplateName,
22
- useButtonTemplate,
23
- } from '../utils/useButtonTemplate';
24
23
  import {useString} from '../utils/useString';
25
- import {useLocalUserInfo} from 'customization-api';
24
+ import {useLocalUserInfo, useMeetingInfo} from 'customization-api';
25
+ import IconButton, {IconButtonProps} from '../atoms/IconButton';
26
+ import ThemeConfig from '../theme';
27
+ import {ImageIconProps} from '../atoms/ImageIcon';
28
+ import useIsHandRaised from '../utils/useIsHandRaised';
26
29
  /**
27
30
  * A component to mute / unmute the local audio
28
31
  */
29
32
  export interface LocalAudioMuteProps {
30
- buttonTemplateName?: ButtonTemplateName;
31
- render?: (
32
- onPress: () => void,
33
+ plainIconHoverEffect?: boolean;
34
+ showToolTip?: boolean;
35
+ showLabel?: boolean;
36
+ iconProps?: (
33
37
  isAudioEnabled: boolean,
34
- buttonTemplateName?: ButtonTemplateName,
35
- ) => JSX.Element;
38
+ isPermissionDenied: boolean,
39
+ ) => Partial<ImageIconProps>;
40
+ render?: (onPress: () => void, isAudioEnabled: boolean) => JSX.Element;
41
+ disabled?: boolean;
42
+ isOnActionSheet?: boolean;
43
+ showWarningIcon?: boolean;
44
+ isMobileView?: boolean;
36
45
  }
37
46
 
38
47
  function LocalAudioMute(props: LocalAudioMuteProps) {
48
+ const {rtcProps} = useContext(PropsContext);
49
+ const {
50
+ data: {isHost},
51
+ } = useMeetingInfo();
39
52
  const local = useLocalUserInfo();
53
+ const isHandRaised = useIsHandRaised();
40
54
  const localMute = useMuteToggleLocal();
55
+ const {
56
+ showToolTip = false,
57
+ showLabel = $config.ICON_TEXT,
58
+ disabled = false,
59
+ isOnActionSheet = false,
60
+ showWarningIcon = true,
61
+ isMobileView = false,
62
+ } = props;
41
63
  //commented for v1 release
42
64
  //const audioLabel = useString('toggleAudioButton')();
43
- const audioLabel = 'Audio';
44
-
45
- const defaultTemplateValue = useButtonTemplate().buttonTemplateName;
46
- const {buttonTemplateName = defaultTemplateValue} = props;
47
65
 
48
66
  const onPress = () => {
49
67
  localMute(MUTE_LOCAL_TYPE.audio);
50
68
  };
51
69
  const isAudioEnabled = local.audio === ToggleState.enabled;
52
70
 
53
- let btnTemplateProps: BtnTemplateInterface = {
54
- onPress: onPress,
55
- name: isAudioEnabled ? 'mic' : 'micOff',
71
+ const permissionDenied =
72
+ local.permissionStatus === PermissionState.REJECTED ||
73
+ local.permissionStatus === PermissionState.GRANTED_FOR_CAM_ONLY;
74
+
75
+ const audioLabel = permissionDenied
76
+ ? 'Mic'
77
+ : isAudioEnabled
78
+ ? 'Mic On'
79
+ : 'Mic Off';
80
+
81
+ let iconProps: IconButtonProps['iconProps'] = {
82
+ showWarningIcon: permissionDenied && showWarningIcon ? true : false,
83
+ name: isAudioEnabled ? 'mic-on' : 'mic-off',
84
+
85
+ iconBackgroundColor: isAudioEnabled
86
+ ? $config.PRIMARY_ACTION_BRAND_COLOR
87
+ : '',
88
+ tintColor: isAudioEnabled
89
+ ? $config.PRIMARY_ACTION_TEXT_COLOR
90
+ : disabled
91
+ ? $config.SEMANTIC_NEUTRAL
92
+ : permissionDenied
93
+ ? $config.SEMANTIC_NEUTRAL
94
+ : $config.SEMANTIC_ERROR,
95
+ ...(props?.iconProps
96
+ ? props.iconProps(isAudioEnabled, permissionDenied)
97
+ : {}),
98
+ };
99
+
100
+ let iconButtonProps: IconButtonProps = {
101
+ hoverEffect: !permissionDenied
102
+ ? props?.plainIconHoverEffect
103
+ ? true
104
+ : false
105
+ : false,
106
+ hoverEffectStyle: props?.plainIconHoverEffect
107
+ ? {backgroundColor: $config.ICON_BG_COLOR, borderRadius: 20}
108
+ : {},
109
+ onPress,
110
+ iconProps,
111
+ btnTextProps: {
112
+ text: showLabel ? audioLabel : '',
113
+ textColor: $config.FONT_COLOR,
114
+ },
115
+ disabled: permissionDenied || disabled ? true : false,
56
116
  };
57
117
 
58
- if (buttonTemplateName === ButtonTemplateName.topBar) {
59
- btnTemplateProps.style = Styles.fullWidthButton as Object;
60
- } else {
61
- btnTemplateProps.style = Styles.localButton as Object;
62
- btnTemplateProps.btnText = audioLabel;
118
+ iconButtonProps.isOnActionSheet = isOnActionSheet;
119
+
120
+ if (!isMobileView) {
121
+ iconButtonProps.toolTipMessage = showToolTip
122
+ ? permissionDenied
123
+ ? 'Give Permissions'
124
+ : isAudioEnabled
125
+ ? 'Disable Mic'
126
+ : 'Enable Mic'
127
+ : '';
128
+ }
129
+
130
+ if (
131
+ rtcProps.role == ClientRole.Audience &&
132
+ $config.EVENT_MODE &&
133
+ !$config.RAISE_HAND
134
+ ) {
135
+ return null;
136
+ }
137
+
138
+ if (
139
+ rtcProps.role == ClientRole.Audience &&
140
+ $config.EVENT_MODE &&
141
+ $config.RAISE_HAND &&
142
+ !isHost
143
+ ) {
144
+ iconButtonProps.iconProps = {
145
+ ...iconButtonProps.iconProps,
146
+ name: 'mic-off',
147
+ tintColor: $config.SEMANTIC_NEUTRAL,
148
+ };
149
+ iconButtonProps.toolTipMessage = showToolTip
150
+ ? isHandRaised(local.uid)
151
+ ? 'Waiting for host to appove the request'
152
+ : 'Raise Hand in order to turn mic on'
153
+ : '';
154
+ iconButtonProps.disabled = true;
63
155
  }
64
156
 
65
157
  return props?.render ? (
66
- props.render(onPress, isAudioEnabled, buttonTemplateName)
158
+ props.render(onPress, isAudioEnabled)
67
159
  ) : (
68
- <BtnTemplate {...btnTemplateProps} />
160
+ <IconButton {...iconButtonProps} />
69
161
  );
70
162
  }
71
163
 
@@ -1,49 +1,87 @@
1
- import React, {useContext} from 'react';
2
- import {
3
- ButtonTemplateName,
4
- useButtonTemplate,
5
- } from '../utils/useButtonTemplate';
6
- import {BtnTemplate, BtnTemplateInterface} from '../../agora-rn-uikit';
7
- import Styles from '../components/styles';
8
- import {useString} from '../utils/useString';
1
+ import React, {useContext, useState} from 'react';
9
2
  import {useRtc} from 'customization-api';
10
-
3
+ import EndcallPopup from './EndcallPopup';
4
+ import StorageContext from '../components/StorageContext';
5
+ import {Prompt, useParams} from '../components/Router';
6
+ import IconButton, {IconButtonProps} from '../atoms/IconButton';
7
+ import ReactNativeForegroundService from '@supersami/rn-foreground-service';
8
+ import {Platform} from 'react-native';
11
9
  export interface LocalEndcallProps {
12
- buttonTemplateName?: ButtonTemplateName;
13
- render?: (
14
- onPress: () => void,
15
- buttonTemplateName?: ButtonTemplateName,
16
- ) => JSX.Element;
10
+ showLabel?: boolean;
11
+ isOnActionSheet?: boolean;
12
+ render?: (onPress: () => void) => JSX.Element;
17
13
  }
18
14
 
15
+ /* For android only, bg audio */
16
+ const stopForegroundService = () => {
17
+ if (Platform.OS === 'android') {
18
+ ReactNativeForegroundService.stop();
19
+ console.log('stopping foreground service');
20
+ }
21
+ };
22
+
19
23
  const LocalEndcall = (props: LocalEndcallProps) => {
20
24
  const {dispatch} = useRtc();
25
+ const {showLabel = $config.ICON_TEXT, isOnActionSheet = false} = props;
21
26
  //commented for v1 release
22
27
  //const endCallLabel = useString('endCallButton')();
23
- const endCallLabel = 'Hang Up';
24
- const defaultTemplateValue = useButtonTemplate().buttonTemplateName;
25
- const {buttonTemplateName = defaultTemplateValue} = props;
26
- const onPress = () =>
27
- dispatch({
28
- type: 'EndCall',
29
- value: [],
28
+ const endCallLabel = 'Leave';
29
+ const {setStore} = useContext(StorageContext);
30
+ const [endcallVisible, setEndcallVisible] = useState(false);
31
+ const {phrase} = useParams<{phrase: string}>();
32
+ const onPress = () => {
33
+ setEndcallVisible(true);
34
+ };
35
+
36
+ const endCall = async () => {
37
+ setTimeout(() => {
38
+ dispatch({
39
+ type: 'EndCall',
40
+ value: [],
41
+ });
30
42
  });
31
- let btnTemplateProps: BtnTemplateInterface = {
32
- name: 'callEnd',
33
- color: '#FD0845',
34
- onPress: onPress,
43
+ // stopping foreground servie on end call
44
+ stopForegroundService();
45
+ };
46
+
47
+ let iconButtonProps: IconButtonProps = {
48
+ iconProps: {
49
+ name: 'end-call',
50
+ tintColor: $config.PRIMARY_ACTION_TEXT_COLOR,
51
+ iconBackgroundColor: $config.SEMANTIC_ERROR,
52
+ iconContainerStyle: !isOnActionSheet && {
53
+ width: 72,
54
+ height: 52,
55
+ },
56
+ },
57
+ onPress,
58
+ btnTextProps: {
59
+ text: showLabel ? endCallLabel : '',
60
+ textColor: $config.FONT_COLOR,
61
+ },
35
62
  };
36
63
 
37
- if (buttonTemplateName === ButtonTemplateName.topBar) {
38
- btnTemplateProps.style = Styles.fullWidthButton as Object;
39
- } else {
40
- btnTemplateProps.btnText = endCallLabel;
41
- btnTemplateProps.style = Styles.endCall as Object;
42
- }
43
64
  return props?.render ? (
44
- props.render(onPress, buttonTemplateName)
65
+ props.render(onPress)
45
66
  ) : (
46
- <BtnTemplate {...btnTemplateProps} />
67
+ <>
68
+ <Prompt
69
+ when={true}
70
+ message={(location, action) => {
71
+ if (action === 'POP') {
72
+ onPress();
73
+ return false;
74
+ }
75
+ return true;
76
+ }}
77
+ />
78
+ <EndcallPopup
79
+ endCall={endCall}
80
+ setModalVisible={setEndcallVisible}
81
+ modalVisible={endcallVisible}
82
+ />
83
+ <IconButton {...iconButtonProps} />
84
+ </>
47
85
  );
48
86
  };
49
87
  export default LocalEndcall;
@@ -1,59 +1,46 @@
1
1
  import React, {useContext} from 'react';
2
- import {
3
- ButtonTemplateName,
4
- useButtonTemplate,
5
- } from '../utils/useButtonTemplate';
6
2
  import {useString} from '../utils/useString';
7
- import {
8
- BtnTemplate,
9
- PropsContext,
10
- ToggleState,
11
- BtnTemplateInterface,
12
- } from '../../agora-rn-uikit';
3
+ import {PropsContext, ToggleState} from '../../agora-rn-uikit';
13
4
  import Styles from '../components/styles';
14
5
  import {useLocalUserInfo, useRtc} from 'customization-api';
6
+ import IconButton, {IconButtonProps} from '../atoms/IconButton';
15
7
 
16
8
  export interface LocalSwitchCameraProps {
17
- buttonTemplateName?: ButtonTemplateName;
18
- render?: (
19
- onPress: () => void,
20
- isVideoEnabled: boolean,
21
- buttonTemplateName?: ButtonTemplateName,
22
- ) => JSX.Element;
9
+ showLabel?: boolean;
10
+ render?: (onPress: () => void, isVideoEnabled: boolean) => JSX.Element;
11
+ disabled?: boolean;
23
12
  }
24
13
 
25
14
  function LocalSwitchCamera(props: LocalSwitchCameraProps) {
26
15
  const {callbacks} = useContext(PropsContext);
27
16
  const {RtcEngine} = useRtc();
28
17
  const local = useLocalUserInfo();
18
+ const {showLabel = $config.ICON_TEXT, disabled = false} = props;
29
19
  //commented for v1 release
30
20
  //const switchCameraButtonText = useString('switchCameraButton')();
31
21
  const switchCameraButtonText = 'Switch';
32
22
 
33
- const defaultTemplateValue = useButtonTemplate().buttonTemplateName;
34
- const {buttonTemplateName = defaultTemplateValue} = props;
35
23
  const onPress = () => {
36
24
  RtcEngine.switchCamera();
37
25
  callbacks?.SwitchCamera && callbacks.SwitchCamera();
38
26
  };
39
27
  const isVideoEnabled = local.video === ToggleState.enabled;
40
- let btnTemplateProps: BtnTemplateInterface = {
41
- name: 'switchCamera',
42
- disabled: isVideoEnabled ? false : true,
28
+ let iconButtonProps: IconButtonProps = {
29
+ iconProps: {
30
+ name: 'switch-camera',
31
+ tintColor:
32
+ isVideoEnabled || !disabled
33
+ ? $config.SECONDARY_ACTION_COLOR
34
+ : $config.SEMANTIC_NEUTRAL,
35
+ },
36
+ disabled: !isVideoEnabled || disabled ? true : false,
43
37
  onPress: onPress,
44
38
  };
45
39
 
46
- if (buttonTemplateName === ButtonTemplateName.topBar) {
47
- btnTemplateProps.style = Styles.fullWidthButton as Object;
48
- } else {
49
- btnTemplateProps.style = Styles.localButton as Object;
50
- btnTemplateProps.btnText = switchCameraButtonText;
51
- }
52
-
53
40
  return props?.render ? (
54
- props.render(onPress, isVideoEnabled, buttonTemplateName)
41
+ props.render(onPress, isVideoEnabled)
55
42
  ) : (
56
- <BtnTemplate {...btnTemplateProps} />
43
+ <IconButton {...iconButtonProps} />
57
44
  );
58
45
  }
59
46
 
@@ -9,61 +9,151 @@
9
9
  information visit https://appbuilder.agora.io.
10
10
  *********************************************
11
11
  */
12
- import React from 'react';
12
+ import React, {useContext} from 'react';
13
13
  import {
14
- BtnTemplate,
15
14
  ToggleState,
16
- BtnTemplateInterface,
15
+ PermissionState,
16
+ ImageIcon as UIKitImageIcon,
17
+ ClientRole,
18
+ PropsContext,
17
19
  } from '../../agora-rn-uikit';
18
20
  import useMuteToggleLocal, {MUTE_LOCAL_TYPE} from '../utils/useMuteToggleLocal';
19
21
  import Styles from '../components/styles';
20
- import {
21
- ButtonTemplateName,
22
- useButtonTemplate,
23
- } from '../utils/useButtonTemplate';
24
22
  import {useString} from '../utils/useString';
25
- import {useLocalUserInfo} from 'customization-api';
26
-
23
+ import {useLocalUserInfo, useMeetingInfo} from 'customization-api';
24
+ import IconButton, {IconButtonProps} from '../atoms/IconButton';
25
+ import ThemeConfig from '../theme';
26
+ import {ImageIconProps} from '../atoms/ImageIcon';
27
+ import useIsHandRaised from '../utils/useIsHandRaised';
27
28
  /**
28
29
  * A component to mute / unmute the local video
29
30
  */
30
31
  export interface LocalVideoMuteProps {
31
- buttonTemplateName?: ButtonTemplateName;
32
- render?: (
33
- onPress: () => void,
32
+ plainIconHoverEffect?: boolean;
33
+ showToolTip?: boolean;
34
+ showLabel?: boolean;
35
+ render?: (onPress: () => void, isVideoEnabled: boolean) => JSX.Element;
36
+ disabled?: boolean;
37
+ isOnActionSheet?: boolean;
38
+ iconProps?: (
34
39
  isVideoEnabled: boolean,
35
- buttonTemplateName?: ButtonTemplateName,
36
- ) => JSX.Element;
40
+ isPermissionDenied: boolean,
41
+ ) => Partial<ImageIconProps>;
42
+ showWarningIcon?: boolean;
43
+ isMobileView?: boolean;
37
44
  }
38
45
 
39
46
  function LocalVideoMute(props: LocalVideoMuteProps) {
47
+ const {rtcProps} = useContext(PropsContext);
48
+ const {
49
+ data: {isHost},
50
+ } = useMeetingInfo();
40
51
  const local = useLocalUserInfo();
52
+ const isHandRaised = useIsHandRaised();
41
53
  const localMute = useMuteToggleLocal();
54
+ const {
55
+ showToolTip = false,
56
+ showLabel = $config.ICON_TEXT,
57
+ disabled = false,
58
+ isOnActionSheet = false,
59
+ showWarningIcon = true,
60
+ isMobileView = false,
61
+ } = props;
42
62
  //commented for v1 release
43
63
  //const videoLabel = useString('toggleVideoButton')();
44
- const videoLabel = 'Video';
45
- const defaultTemplateValue = useButtonTemplate().buttonTemplateName;
46
- const {buttonTemplateName = defaultTemplateValue} = props;
64
+
47
65
  const onPress = () => {
48
66
  localMute(MUTE_LOCAL_TYPE.video);
49
67
  };
50
68
  const isVideoEnabled = local.video === ToggleState.enabled;
51
- let btnTemplateProps: BtnTemplateInterface = {
52
- onPress: onPress,
53
- name: isVideoEnabled ? 'videocam' : 'videocamOff',
69
+
70
+ const permissionDenied =
71
+ local.permissionStatus === PermissionState.REJECTED ||
72
+ local.permissionStatus === PermissionState.GRANTED_FOR_MIC_ONLY;
73
+
74
+ const videoLabel = permissionDenied
75
+ ? 'Video'
76
+ : isVideoEnabled
77
+ ? 'Video On'
78
+ : 'Video Off';
79
+
80
+ let iconProps: IconButtonProps['iconProps'] = {
81
+ showWarningIcon: permissionDenied && showWarningIcon ? true : false,
82
+ name: isVideoEnabled ? 'video-on' : 'video-off',
83
+ iconBackgroundColor: isVideoEnabled
84
+ ? $config.PRIMARY_ACTION_BRAND_COLOR
85
+ : '',
86
+ tintColor: isVideoEnabled
87
+ ? $config.PRIMARY_ACTION_TEXT_COLOR
88
+ : disabled
89
+ ? $config.SEMANTIC_NEUTRAL
90
+ : permissionDenied
91
+ ? $config.SEMANTIC_NEUTRAL
92
+ : $config.SEMANTIC_ERROR,
93
+ ...(props?.iconProps
94
+ ? props.iconProps(isVideoEnabled, permissionDenied)
95
+ : {}),
54
96
  };
55
97
 
56
- if (buttonTemplateName === ButtonTemplateName.topBar) {
57
- btnTemplateProps.style = Styles.fullWidthButton as Object;
58
- } else {
59
- btnTemplateProps.style = Styles.localButton as Object;
60
- btnTemplateProps.btnText = videoLabel;
98
+ let iconButtonProps: IconButtonProps = {
99
+ hoverEffect: !permissionDenied
100
+ ? props?.plainIconHoverEffect
101
+ ? true
102
+ : false
103
+ : false,
104
+ hoverEffectStyle: props?.plainIconHoverEffect
105
+ ? {backgroundColor: $config.ICON_BG_COLOR, borderRadius: 20}
106
+ : {},
107
+ onPress,
108
+ iconProps,
109
+ btnTextProps: {
110
+ text: showLabel ? videoLabel : '',
111
+ textColor: $config.FONT_COLOR,
112
+ },
113
+ disabled: permissionDenied || disabled ? true : false,
114
+ };
115
+
116
+ iconButtonProps.isOnActionSheet = isOnActionSheet;
117
+ if (!isMobileView) {
118
+ iconButtonProps.toolTipMessage = showToolTip
119
+ ? permissionDenied
120
+ ? 'Give Permissions'
121
+ : isVideoEnabled
122
+ ? 'Disable Camera'
123
+ : 'Enable Camera'
124
+ : '';
61
125
  }
62
126
 
127
+ if (
128
+ rtcProps.role == ClientRole.Audience &&
129
+ $config.EVENT_MODE &&
130
+ !$config.RAISE_HAND
131
+ ) {
132
+ return null;
133
+ }
134
+
135
+ if (
136
+ rtcProps.role == ClientRole.Audience &&
137
+ $config.EVENT_MODE &&
138
+ $config.RAISE_HAND &&
139
+ !isHost
140
+ ) {
141
+ iconButtonProps.iconProps = {
142
+ ...iconButtonProps.iconProps,
143
+ name: 'video-off',
144
+ tintColor: $config.SEMANTIC_NEUTRAL,
145
+ };
146
+ iconButtonProps.toolTipMessage = showToolTip
147
+ ? isHandRaised(local.uid)
148
+ ? 'Waiting for host to appove the request'
149
+ : 'Raise Hand in order to turn video on'
150
+ : '';
151
+ iconButtonProps.disabled = true;
152
+ }
63
153
  return props?.render ? (
64
- props.render(onPress, isVideoEnabled, buttonTemplateName)
154
+ props.render(onPress, isVideoEnabled)
65
155
  ) : (
66
- <BtnTemplate {...btnTemplateProps} />
156
+ <IconButton {...iconButtonProps} />
67
157
  );
68
158
  }
69
159
 
@@ -20,7 +20,7 @@ export default function Logo() {
20
20
  const history = useHistory();
21
21
 
22
22
  return (
23
- <TouchableOpacity onPress={() => history.replace('/')} style={styles.marginAuto}>
23
+ <TouchableOpacity onPress={() => history.replace('/')}>
24
24
  <Image
25
25
  source={{uri: $config.LOGO}}
26
26
  style={styles.logo}
@@ -32,8 +32,8 @@ export default function Logo() {
32
32
 
33
33
  const styles = StyleSheet.create({
34
34
  logo: {
35
- width: '100%',
36
- height: '100%',
35
+ minWidth: 60,
36
+ minHeight: 30,
37
37
  },
38
38
  marginAuto: {
39
39
  width: '30%',
@@ -41,6 +41,5 @@ const styles = StyleSheet.create({
41
41
  minWidth: 60,
42
42
  minHeight: 30,
43
43
  // height: 'auto',
44
- marginHorizontal: 'auto',
45
44
  },
46
45
  });
@@ -87,7 +87,7 @@ const style = StyleSheet.create({
87
87
  fontWeight: '500',
88
88
  textAlign: 'center',
89
89
  textAlignVertical: 'center',
90
- color: $config.PRIMARY_FONT_COLOR,
90
+ color: $config.FONT_COLOR,
91
91
  textDecorationLine: 'underline',
92
92
  },
93
93
  });