agora-appbuilder-core 3.0.9 → 4.0.0-api.0

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 (305) 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/AgoraUIKit.tsx +6 -6
  5. package/template/agora-rn-uikit/src/Contexts/ContentContext.tsx +10 -0
  6. package/template/agora-rn-uikit/src/Contexts/DispatchContext.tsx +22 -0
  7. package/template/agora-rn-uikit/src/Contexts/LocalUserContext.tsx +10 -6
  8. package/template/agora-rn-uikit/src/Contexts/PropsContext.tsx +28 -8
  9. package/template/agora-rn-uikit/src/Contexts/RtcContext.tsx +7 -15
  10. package/template/agora-rn-uikit/src/Controls/BtnTemplate.tsx +30 -26
  11. package/template/agora-rn-uikit/src/Controls/Icons.ts +30 -83
  12. package/template/agora-rn-uikit/src/Controls/ImageIcon.tsx +6 -6
  13. package/template/agora-rn-uikit/src/Controls/Local/LocalAudioMute.tsx +4 -2
  14. package/template/agora-rn-uikit/src/Controls/Local/LocalVideoMute.tsx +4 -2
  15. package/template/agora-rn-uikit/src/Controls/Local/Recording.tsx +0 -2
  16. package/template/agora-rn-uikit/src/Controls/Local/SwitchCamera.tsx +6 -6
  17. package/template/agora-rn-uikit/src/Controls/LocalControls.tsx +5 -5
  18. package/template/agora-rn-uikit/src/Controls/Remote/RemoteAudioMute.tsx +4 -4
  19. package/template/agora-rn-uikit/src/Controls/Remote/RemoteVideoMute.tsx +4 -4
  20. package/template/agora-rn-uikit/src/Controls/RemoteControls.tsx +2 -2
  21. package/template/agora-rn-uikit/src/Reducer/LocalMuteAudio.ts +6 -6
  22. package/template/agora-rn-uikit/src/Reducer/LocalMuteVideo.ts +6 -6
  23. package/template/agora-rn-uikit/src/Reducer/LocalPermissionState.ts +23 -0
  24. package/template/agora-rn-uikit/src/Reducer/RemoteAudioStateChanged.ts +6 -6
  25. package/template/agora-rn-uikit/src/Reducer/RemoteVideoStateChanged.ts +7 -7
  26. package/template/agora-rn-uikit/src/Reducer/UpdateDualStreamMode.ts +7 -7
  27. package/template/agora-rn-uikit/src/Reducer/UserJoined.ts +10 -10
  28. package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteAudio.ts +6 -6
  29. package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteVideo.ts +6 -6
  30. package/template/agora-rn-uikit/src/Reducer/UserOffline.ts +5 -5
  31. package/template/agora-rn-uikit/src/Reducer/UserPin.ts +11 -0
  32. package/template/agora-rn-uikit/src/Reducer/index.ts +2 -0
  33. package/template/agora-rn-uikit/src/Rtc/Create.tsx +74 -7
  34. package/template/agora-rn-uikit/src/Rtc/Join.tsx +5 -4
  35. package/template/agora-rn-uikit/src/RtcConfigure.tsx +76 -49
  36. package/template/agora-rn-uikit/src/Views/MaxVideoView.native.tsx +17 -7
  37. package/template/agora-rn-uikit/src/Views/MaxVideoView.tsx +17 -11
  38. package/template/agora-rn-uikit/src/Views/MinVideoView.tsx +2 -2
  39. package/template/agora-rn-uikit/src/index.ts +17 -9
  40. package/template/android/app/build.gradle +1 -0
  41. package/template/android/app/src/main/AndroidManifest.xml +22 -15
  42. package/template/android/app/src/main/assets/fonts/SourceSansPro-Regular.ttf +0 -0
  43. package/template/android/app/src/main/assets/fonts/icomoon.ttf +0 -0
  44. package/template/android/app/src/main/java/com/helloworld/MainActivity.java +50 -0
  45. package/template/android/app/src/main/res/values/colors.xml +7 -0
  46. package/template/android/build.gradle +3 -3
  47. package/template/babel.config.js +1 -0
  48. package/template/bridge/rtc/webNg/RtcEngine.ts +110 -17
  49. package/template/customization-api/action-library.ts +10 -14
  50. package/template/customization-api/app-state.ts +4 -6
  51. package/template/customization-api/customEvents.ts +2 -2
  52. package/template/customization-api/customize.ts +1 -1
  53. package/template/customization-api/sub-components.ts +4 -12
  54. package/template/customization-api/typeDefinition.ts +15 -38
  55. package/template/customization-implementation/createHook.ts +24 -6
  56. package/template/customization-implementation/index.ts +1 -1
  57. package/template/customization-implementation/useCustomization.tsx +5 -7
  58. package/template/electron/index.html +27 -27
  59. package/template/electron/renderer/index.js +1 -0
  60. package/template/global.d.ts +26 -4
  61. package/template/index.rsdk.tsx +1 -0
  62. package/template/index.web.js +2 -1
  63. package/template/index.wsdk.tsx +9 -2
  64. package/template/ios/HelloWorld/Info.plist +14 -1
  65. package/template/ios/HelloWorld.xcodeproj/project.pbxproj +17 -0
  66. package/template/metro.config.js +1 -1
  67. package/template/package.json +18 -7
  68. package/template/react-native-toast-message/index.d.ts +43 -43
  69. package/template/react-native-toast-message/src/colors/index.js +3 -2
  70. package/template/react-native-toast-message/src/components/base/index.js +46 -59
  71. package/template/react-native-toast-message/src/components/base/styles.js +16 -32
  72. package/template/react-native-toast-message/src/components/checkbox.js +178 -0
  73. package/template/react-native-toast-message/src/components/error.js +3 -2
  74. package/template/react-native-toast-message/src/components/info.js +3 -2
  75. package/template/react-native-toast-message/src/components/success.js +3 -2
  76. package/template/react-native-toast-message/src/index.js +122 -31
  77. package/template/react-native-toast-message/src/index.sdk.tsx +125 -35
  78. package/template/react-native-toast-message/src/styles.js +3 -4
  79. package/template/react-native-toast-message/src/styles.sdk.ts +3 -4
  80. package/template/react-native.config.js +7 -0
  81. package/template/src/App.tsx +19 -14
  82. package/template/src/AppWrapper.tsx +74 -29
  83. package/template/src/SDKAppWrapper.tsx +60 -64
  84. package/template/src/app-state/useLocalUserInfo.ts +3 -3
  85. package/template/src/assets/font-styles.css +329 -0
  86. package/template/src/assets/fonts/SourceSansPro-Regular.ttf +0 -0
  87. package/template/src/assets/fonts/icomoon.ttf +0 -0
  88. package/template/src/assets/permission.png +0 -0
  89. package/template/src/assets/selection.json +1 -0
  90. package/template/src/atoms/ActionMenu.tsx +236 -0
  91. package/template/src/atoms/AnimatedActiveSpeaker.native.tsx +71 -0
  92. package/template/src/atoms/AnimatedActiveSpeaker.tsx +84 -0
  93. package/template/src/atoms/AnimatedRings.native.tsx +68 -0
  94. package/template/src/atoms/AnimatedRings.tsx +70 -0
  95. package/template/src/atoms/Card.tsx +61 -0
  96. package/template/src/atoms/CircularProgress.native.tsx +121 -0
  97. package/template/src/atoms/CircularProgress.tsx +102 -0
  98. package/template/src/atoms/CustomIcon.tsx +88 -0
  99. package/template/src/atoms/CustomSwitch.tsx +287 -0
  100. package/template/src/atoms/Dropdown.tsx +306 -0
  101. package/template/src/atoms/HorizontalRule.tsx +3 -1
  102. package/template/src/atoms/IconButton.tsx +162 -0
  103. package/template/src/atoms/ImageIcon.tsx +98 -0
  104. package/template/src/atoms/InfoBubble.tsx +291 -0
  105. package/template/src/atoms/Input.tsx +87 -0
  106. package/template/src/atoms/InviteInfo.tsx +166 -0
  107. package/template/src/atoms/LinkButton.tsx +28 -0
  108. package/template/src/atoms/OutlineButton.tsx +61 -0
  109. package/template/src/atoms/ParticipantsCount.tsx +74 -0
  110. package/template/src/atoms/Popup.tsx +147 -0
  111. package/template/src/atoms/PrimaryButton.tsx +51 -26
  112. package/template/src/atoms/RecordingInfo.tsx +52 -0
  113. package/template/src/atoms/SecondaryButton.tsx +8 -5
  114. package/template/src/atoms/Spacer.tsx +22 -0
  115. package/template/src/atoms/TertiaryButton.tsx +78 -0
  116. package/template/src/atoms/TextInput.tsx +12 -14
  117. package/template/src/atoms/Toggle.tsx +47 -0
  118. package/template/src/atoms/Toolbar.tsx +68 -0
  119. package/template/src/atoms/ToolbarItem.tsx +63 -0
  120. package/template/src/atoms/Tooltip.native.tsx +65 -0
  121. package/template/src/atoms/Tooltip.tsx +94 -0
  122. package/template/src/atoms/UserAvatar.tsx +60 -0
  123. package/template/src/components/Chat.tsx +164 -278
  124. package/template/src/components/ChatContext.ts +8 -1
  125. package/template/src/components/ColorConfigure.tsx +1 -1
  126. package/template/src/components/ColorContext.ts +1 -1
  127. package/template/src/components/CommonStyles.ts +44 -0
  128. package/template/src/components/Controls.tsx +331 -73
  129. package/template/src/components/{Controls.native.tsx → Controls1.native.tsx} +8 -6
  130. package/template/src/components/DeviceConfigure.tsx +511 -106
  131. package/template/src/components/DeviceContext.tsx +8 -4
  132. package/template/src/components/EventsConfigure.tsx +192 -10
  133. package/template/src/components/GraphQLProvider.tsx +1 -1
  134. package/template/src/components/GridVideo.tsx +60 -45
  135. package/template/src/components/HostControlView.tsx +114 -35
  136. package/template/src/components/Navbar.tsx +219 -437
  137. package/template/src/components/Navigation.tsx +15 -1
  138. package/template/src/components/NetworkQualityContext.tsx +22 -22
  139. package/template/src/components/ParticipantsView.tsx +178 -156
  140. package/template/src/components/PinnedVideo.tsx +206 -121
  141. package/template/src/components/Precall.native.tsx +358 -119
  142. package/template/src/components/Precall.tsx +272 -138
  143. package/template/src/components/RTMConfigure.tsx +66 -19
  144. package/template/src/components/Router.electron.ts +1 -0
  145. package/template/src/components/Router.native.ts +1 -0
  146. package/template/src/components/Router.sdk.ts +1 -0
  147. package/template/src/components/Router.ts +1 -0
  148. package/template/src/components/SdkApiContext.tsx +161 -0
  149. package/template/src/components/Settings.tsx +26 -95
  150. package/template/src/components/SettingsView.tsx +251 -56
  151. package/template/src/components/Share.tsx +305 -276
  152. package/template/src/components/StorageContext.tsx +30 -3
  153. package/template/src/components/ToastComponent.tsx +8 -0
  154. package/template/src/components/chat-messages/useChatMessages.tsx +97 -50
  155. package/template/src/components/chat-ui/useChatUIControls.tsx +76 -0
  156. package/template/src/components/common/Error.tsx +20 -6
  157. package/template/src/components/common/Logo.tsx +16 -15
  158. package/template/src/components/contexts/LiveStreamDataContext.tsx +16 -11
  159. package/template/src/components/contexts/VideoMeetingDataContext.tsx +41 -11
  160. package/template/src/components/contexts/WhiteboardContext.tsx +3 -3
  161. package/template/src/components/livestream/LiveStreamContext.tsx +284 -50
  162. package/template/src/components/livestream/Types.ts +39 -14
  163. package/template/src/components/livestream/index.ts +1 -0
  164. package/template/src/components/livestream/views/LiveStreamControls.tsx +9 -4
  165. package/template/src/components/participants/AllAudienceParticipants.tsx +102 -31
  166. package/template/src/components/participants/AllHostParticipants.tsx +106 -35
  167. package/template/src/components/participants/Participant.tsx +300 -0
  168. package/template/src/components/participants/ParticipantName.tsx +13 -7
  169. package/template/src/components/participants/ParticipantSectionTitle.tsx +35 -10
  170. package/template/src/components/participants/ScreenshareParticipants.tsx +144 -12
  171. package/template/src/components/participants/UserActionMenuOptions.tsx +396 -0
  172. package/template/src/components/popups/InvitePopup.tsx +115 -0
  173. package/template/src/components/popups/StopRecordingPopup.tsx +114 -0
  174. package/template/src/components/precall/LocalMute.tsx +84 -14
  175. package/template/src/components/precall/{LocalMute.native.tsx → LocalMute1.native.tsx} +21 -5
  176. package/template/src/components/precall/PermissionHelper.native.tsx +5 -0
  177. package/template/src/components/precall/PermissionHelper.tsx +126 -0
  178. package/template/src/components/precall/PreCallSettings.tsx +52 -0
  179. package/template/src/components/precall/VideoPreview.native.tsx +51 -6
  180. package/template/src/components/precall/VideoPreview.tsx +164 -8
  181. package/template/src/components/precall/joinCallBtn.native.tsx +2 -2
  182. package/template/src/components/precall/joinCallBtn.tsx +17 -4
  183. package/template/src/components/precall/meetingTitle.tsx +17 -14
  184. package/template/src/components/precall/selectDevice.tsx +1 -21
  185. package/template/src/components/precall/textInput.tsx +34 -6
  186. package/template/src/components/precall/usePreCall.tsx +39 -1
  187. package/template/src/components/{meeting-info/useMeetingInfo.tsx → room-info/useRoomInfo.tsx} +34 -10
  188. package/template/src/components/{meeting-info/useSetMeetingInfo.tsx → room-info/useSetRoomInfo.tsx} +12 -12
  189. package/template/src/components/styles.ts +42 -21
  190. package/template/src/components/useShareLink.tsx +19 -21
  191. package/template/src/components/useToast.tsx +41 -0
  192. package/template/src/components/useUserPreference.tsx +9 -6
  193. package/template/src/components/useVideoCall.tsx +84 -0
  194. package/template/src/language/default-labels/createScreenLabels.ts +3 -3
  195. package/template/src/language/default-labels/joinScreenLabels.ts +2 -2
  196. package/template/src/language/default-labels/precallScreenLabels.ts +3 -3
  197. package/template/src/language/default-labels/shareLinkScreenLabels.ts +5 -5
  198. package/template/src/language/default-labels/videoCallScreenLabels.ts +5 -5
  199. package/template/src/pages/Authenticate.tsx +5 -15
  200. package/template/src/pages/Create.tsx +304 -191
  201. package/template/src/pages/Endcall.tsx +148 -0
  202. package/template/src/pages/Join.tsx +96 -70
  203. package/template/src/pages/VideoCall.tsx +179 -69
  204. package/template/src/pages/video-call/ActionSheet.native.tsx +215 -0
  205. package/template/src/pages/video-call/ActionSheet.tsx +226 -0
  206. package/template/src/pages/video-call/ActionSheetContent.tsx +479 -0
  207. package/template/src/pages/video-call/ActionSheetHandle.tsx +38 -0
  208. package/template/src/pages/video-call/ActionSheetStyles.css +138 -0
  209. package/template/src/pages/video-call/DefaultLayouts.ts +6 -6
  210. package/template/src/pages/video-call/NameWithMicIcon.tsx +93 -49
  211. package/template/src/pages/video-call/RenderComponent.tsx +6 -30
  212. package/template/src/pages/video-call/SidePanelHeader.tsx +186 -0
  213. package/template/src/pages/video-call/VideoCallMobileView.tsx +138 -0
  214. package/template/src/pages/video-call/VideoCallScreen.native.tsx +37 -0
  215. package/template/src/pages/video-call/VideoCallScreen.tsx +109 -66
  216. package/template/src/pages/video-call/VideoComponent.tsx +20 -4
  217. package/template/src/pages/video-call/VideoRenderer.tsx +227 -61
  218. package/template/src/pages/video-call/index.ts +35 -7
  219. package/template/src/rtm/RTMEngine.ts +8 -0
  220. package/template/src/rtm-events/constants.ts +3 -1
  221. package/template/src/rtm-events-api/Events.ts +5 -4
  222. package/template/src/rtm-events-api/LocalEvents.ts +6 -0
  223. package/template/src/rtm-events-api/types.ts +5 -5
  224. package/template/src/subComponents/ChatBubble.tsx +125 -84
  225. package/template/src/subComponents/ChatContainer.tsx +280 -93
  226. package/template/src/subComponents/ChatInput.ios.tsx +175 -0
  227. package/template/src/subComponents/ChatInput.tsx +72 -115
  228. package/template/src/subComponents/Checkbox.native.tsx +16 -5
  229. package/template/src/subComponents/Checkbox.tsx +2 -2
  230. package/template/src/subComponents/CopyJoinInfo.tsx +36 -58
  231. package/template/src/subComponents/EndcallPopup.tsx +107 -0
  232. package/template/src/subComponents/FallbackLogo.tsx +122 -40
  233. package/template/src/subComponents/LanguageSelector.tsx +1 -1
  234. package/template/src/subComponents/LayoutIconButton.tsx +201 -0
  235. package/template/src/subComponents/LayoutIconDropdown.tsx +131 -134
  236. package/template/src/subComponents/{LayoutIconDropdown.native.tsx → LayoutIconDropdown1.native.tsx} +4 -18
  237. package/template/src/subComponents/LocalAudioMute.tsx +119 -27
  238. package/template/src/subComponents/LocalEndCall.tsx +73 -35
  239. package/template/src/subComponents/LocalSwitchCamera.tsx +19 -32
  240. package/template/src/subComponents/LocalVideoMute.tsx +117 -27
  241. package/template/src/subComponents/Logo.tsx +3 -4
  242. package/template/src/subComponents/LogoutButton.tsx +1 -1
  243. package/template/src/subComponents/NetworkQualityPill.tsx +66 -68
  244. package/template/src/subComponents/OpenInNativeButton.tsx +3 -3
  245. package/template/src/subComponents/Recording.tsx +28 -29
  246. package/template/src/subComponents/RemoteAudioMute.tsx +83 -29
  247. package/template/src/subComponents/RemoteEndCall.tsx +8 -5
  248. package/template/src/subComponents/RemoteMutePopup.tsx +193 -0
  249. package/template/src/subComponents/RemoteVideoMute.tsx +74 -21
  250. package/template/src/subComponents/RemoveMeetingPopup.tsx +109 -0
  251. package/template/src/subComponents/RemoveScreensharePopup.tsx +109 -0
  252. package/template/src/subComponents/ScreenShareNotice.tsx +83 -8
  253. package/template/src/subComponents/SelectDevice.tsx +404 -61
  254. package/template/src/subComponents/SelectDeviceSettings.backup.tsx +207 -0
  255. package/template/src/subComponents/SelectOAuth.tsx +9 -8
  256. package/template/src/subComponents/SidePanelButtons.ts +0 -3
  257. package/template/src/subComponents/SidePanelHeader.tsx +112 -0
  258. package/template/src/subComponents/ToastConfig.tsx +150 -10
  259. package/template/src/subComponents/chat/ChatParticipants.tsx +188 -79
  260. package/template/src/subComponents/livestream/CurrentLiveStreamRequestsView.tsx +97 -34
  261. package/template/src/subComponents/livestream/controls/LocalRaiseHand.tsx +29 -33
  262. package/template/src/subComponents/livestream/controls/RemoteLiveStreamApprovedRequestRecall.tsx +8 -8
  263. package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestApprove.tsx +24 -11
  264. package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestReject.tsx +17 -10
  265. package/template/src/subComponents/recording/useRecording.tsx +81 -29
  266. package/template/src/subComponents/screenshare/ScreenshareButton.tsx +52 -70
  267. package/template/src/subComponents/screenshare/ScreenshareConfigure.native.tsx +23 -12
  268. package/template/src/subComponents/screenshare/ScreenshareConfigure.tsx +44 -19
  269. package/template/src/theme/index.ts +46 -0
  270. package/template/src/utils/PlatformWrapper.tsx +21 -0
  271. package/template/src/utils/SdkEvents.ts +23 -14
  272. package/template/src/utils/SdkMethodEvents.ts +81 -0
  273. package/template/src/utils/common.tsx +155 -1
  274. package/template/src/utils/hexadecimalTransparency.ts +108 -0
  275. package/template/src/utils/index.tsx +19 -0
  276. package/template/src/utils/isMobileOrTablet.ts +7 -2
  277. package/template/src/utils/pendingStateUpdateHelper.ts +19 -0
  278. package/template/src/utils/useActiveSpeaker.ts +42 -0
  279. package/template/src/utils/{useCreateMeeting.ts → useCreateRoom.ts} +19 -14
  280. package/template/src/utils/{useButtonTemplate.tsx → useFocus.tsx} +19 -16
  281. package/template/src/utils/useGetMeetingPhrase.ts +10 -10
  282. package/template/src/utils/useIsAudioEnabled.ts +3 -3
  283. package/template/src/utils/useIsHandRaised.ts +13 -0
  284. package/template/src/utils/useIsPSTN.ts +3 -3
  285. package/template/src/utils/useIsVideoEnabled.ts +3 -3
  286. package/template/src/utils/{useJoinMeeting.ts → useJoinRoom.ts} +27 -21
  287. package/template/src/utils/useMutePSTN.ts +2 -2
  288. package/template/src/utils/useMuteToggleLocal.ts +58 -5
  289. package/template/src/utils/useRemoteEndCall.ts +4 -4
  290. package/template/src/utils/useRemoteEndScreenshare.ts +26 -0
  291. package/template/src/utils/useRemoteMute.ts +7 -7
  292. package/template/src/utils/useRemoteRequest.ts +84 -0
  293. package/template/src/utils/useSwitchCamera.native.tsx +25 -0
  294. package/template/src/utils/useSwitchCamera.tsx +19 -0
  295. package/template/src/utils/useToolbar.tsx +59 -0
  296. package/template/web/index.html +5 -0
  297. package/template/webpack.commons.js +13 -8
  298. package/template/webpack.rsdk.config.js +1 -2
  299. package/template/webpack.web.config.js +1 -0
  300. package/template/agora-rn-uikit/src/Contexts/RenderContext.tsx +0 -10
  301. package/template/src/assets/icons.ts +0 -102
  302. package/template/src/components/chat-ui/useChatUIControl.tsx +0 -69
  303. package/template/src/components/participants/MeParticipant.tsx +0 -38
  304. package/template/src/components/participants/RemoteParticipants.tsx +0 -71
  305. package/template/src/pages/video-call/CustomUserContextHolder.tsx +0 -20
@@ -0,0 +1,306 @@
1
+ import React, {
2
+ FC,
3
+ ReactElement,
4
+ useEffect,
5
+ useRef,
6
+ useState,
7
+ useMemo,
8
+ } from 'react';
9
+ import {
10
+ FlatList,
11
+ StyleSheet,
12
+ Text,
13
+ TouchableOpacity,
14
+ Modal,
15
+ View,
16
+ Image,
17
+ } from 'react-native';
18
+ import {isWebInternal} from '../utils/common';
19
+ import ThemeConfig from '../theme';
20
+ import ImageIcon from './ImageIcon';
21
+ import {IconsInterface} from './CustomIcon';
22
+ import hexadecimalTransparency from '../utils/hexadecimalTransparency';
23
+
24
+ interface Props {
25
+ label: string;
26
+ icon?: keyof IconsInterface;
27
+ data: Array<{label: string; value: string}>;
28
+ onSelect: (item: {label: string; value: string}) => void;
29
+ enabled: boolean;
30
+ selectedValue: string;
31
+ }
32
+
33
+ const Dropdown: FC<Props> = ({
34
+ label,
35
+ data,
36
+ onSelect,
37
+ enabled,
38
+ selectedValue,
39
+ icon,
40
+ }) => {
41
+ const DropdownButton = useRef();
42
+ const [visible, setVisible] = useState(false);
43
+ const [dropdownPos, setDropdownPos] = useState({top: 0, left: 0, width: 0});
44
+ const [isHovered, setIsHovered] = React.useState(false);
45
+ const selected = useMemo(() => {
46
+ return data.find((dataItem) => dataItem.value === selectedValue);
47
+ }, [selectedValue, data]);
48
+
49
+ useEffect(() => {
50
+ if (isWebInternal()) {
51
+ window.addEventListener('resize', () => {
52
+ setVisible(false);
53
+ });
54
+ }
55
+ }, []);
56
+
57
+ const toggleDropdown = (): void => {
58
+ visible ? setVisible(false) : openDropdown();
59
+ };
60
+
61
+ const updateDropdownPosition = () => {
62
+ //@ts-ignore
63
+ DropdownButton?.current?.measure((_fx, _fy, _w, h, _px, py) => {
64
+ setDropdownPos({
65
+ top: py + h,
66
+ left: _px,
67
+ width: _w,
68
+ });
69
+ });
70
+ };
71
+
72
+ const openDropdown = (): void => {
73
+ updateDropdownPosition();
74
+ setVisible(true);
75
+ };
76
+
77
+ const onItemPress = (item): void => {
78
+ // // Dropdown should rely on the provided
79
+ // setSelected(item);
80
+ onSelect(item);
81
+ setVisible(false);
82
+ };
83
+
84
+ const renderItem = ({item}): ReactElement<any, any> => (
85
+ <PlatformWrapper onPress={() => onItemPress(item)}>
86
+ <View style={styles.itemContainer}>
87
+ <View style={styles.itemTextContainer}>
88
+ <Text
89
+ numberOfLines={1}
90
+ style={[
91
+ styles.itemText,
92
+ selected && item?.value === selected?.value
93
+ ? styles.itemTextSelected
94
+ : {},
95
+ ]}>
96
+ {item.label}
97
+ </Text>
98
+ </View>
99
+ {selected && item?.value === selected?.value ? (
100
+ <View style={styles.itemTextSelectedContainer}>
101
+ <ImageIcon
102
+ iconType="plain"
103
+ name={'tick'}
104
+ iconSize={12}
105
+ tintColor={'#099DFD'}
106
+ />
107
+ </View>
108
+ ) : (
109
+ <></>
110
+ )}
111
+ </View>
112
+ </PlatformWrapper>
113
+ );
114
+
115
+ const renderDropdown = (): ReactElement<any, any> => {
116
+ return (
117
+ <Modal visible={visible} transparent animationType="none">
118
+ <TouchableOpacity
119
+ style={styles.overlay}
120
+ onPress={() => setVisible(false)}>
121
+ <View
122
+ style={[
123
+ styles.dropdown,
124
+ {
125
+ top: dropdownPos.top,
126
+ left: dropdownPos.left,
127
+ width: dropdownPos.width,
128
+ },
129
+ ]}>
130
+ <FlatList
131
+ showsVerticalScrollIndicator={false}
132
+ data={data}
133
+ renderItem={renderItem}
134
+ keyExtractor={(item, index) => index.toString()}
135
+ />
136
+ </View>
137
+ </TouchableOpacity>
138
+ </Modal>
139
+ );
140
+ };
141
+
142
+ const noData = !data || !data.length;
143
+
144
+ return (
145
+ <TouchableOpacity
146
+ disabled={!enabled || !data || !data.length}
147
+ ref={DropdownButton}
148
+ style={[
149
+ styles.dropdownOptionContainer,
150
+ !enabled || !data || !data.length
151
+ ? {opacity: ThemeConfig.EmphasisOpacity.disabled}
152
+ : {},
153
+ visible
154
+ ? {
155
+ borderBottomLeftRadius: 0,
156
+ borderBottomRightRadius: 0,
157
+ //borderBottomWidth: 0,
158
+ borderBottomColor: 'transparent',
159
+ }
160
+ : {},
161
+ ]}
162
+ onPress={toggleDropdown}>
163
+ {enabled && !noData ? renderDropdown() : <></>}
164
+ <View
165
+ style={{flex: 1, justifyContent: 'flex-start', flexDirection: 'row'}}>
166
+ {icon ? (
167
+ <View style={styles.dropdownIconContainer}>
168
+ <ImageIcon
169
+ iconType="plain"
170
+ name={icon}
171
+ iconSize={20}
172
+ tintColor={$config.SEMANTIC_NEUTRAL}
173
+ />
174
+ </View>
175
+ ) : (
176
+ <></>
177
+ )}
178
+ <View style={[styles.dropdownOptionTextContainer]}>
179
+ <Text numberOfLines={1} style={styles.dropdownOptionText}>
180
+ {(selected && selected.label) || label}
181
+ </Text>
182
+ </View>
183
+ </View>
184
+ <View style={styles.dropdownIconContainer}>
185
+ <ImageIcon
186
+ iconType="plain"
187
+ name={visible ? 'arrow-up' : 'arrow-down'}
188
+ tintColor={$config.SECONDARY_ACTION_COLOR}
189
+ />
190
+ </View>
191
+ </TouchableOpacity>
192
+ );
193
+ };
194
+
195
+ const PlatformWrapper = ({children, onPress}) => {
196
+ const [isHovered, setIsHovered] = React.useState(false);
197
+ return isWebInternal() ? (
198
+ <div
199
+ style={{
200
+ backgroundColor: isHovered
201
+ ? $config.CARD_LAYER_5_COLOR + hexadecimalTransparency['20%']
202
+ : 'transparent',
203
+ cursor: isHovered ? 'pointer' : 'auto',
204
+ }}
205
+ onMouseEnter={() => {
206
+ setIsHovered(true);
207
+ }}
208
+ onMouseLeave={() => {
209
+ setIsHovered(false);
210
+ }}
211
+ onClick={(e) => {
212
+ e.preventDefault();
213
+ onPress && onPress();
214
+ }}>
215
+ {children}
216
+ </div>
217
+ ) : (
218
+ <TouchableOpacity onPress={onPress}>{children}</TouchableOpacity>
219
+ );
220
+ };
221
+
222
+ const styles = StyleSheet.create({
223
+ dropdownOptionContainer: {
224
+ flex: 1,
225
+ flexDirection: 'row',
226
+ minHeight: 60,
227
+ backgroundColor: $config.INPUT_FIELD_BACKGROUND_COLOR,
228
+ borderTopWidth: 1,
229
+ borderBottomWidth: 1,
230
+ borderRightWidth: 1,
231
+ borderLeftWidth: 1,
232
+ borderColor: $config.INPUT_FIELD_BORDER_COLOR,
233
+ borderRadius: ThemeConfig.BorderRadius.medium,
234
+ paddingLeft: 20,
235
+ paddingRight: 20,
236
+ justifyContent: 'space-between',
237
+ },
238
+ dropdownOptionTextContainer: {
239
+ alignSelf: 'center',
240
+ flex: 1,
241
+ },
242
+ dropdownOptionText: {
243
+ textAlign: 'left',
244
+ fontFamily: ThemeConfig.FontFamily.sansPro,
245
+ fontWeight: '400',
246
+ fontSize: ThemeConfig.FontSize.normal,
247
+ color: $config.FONT_COLOR,
248
+ paddingLeft: 8,
249
+ paddingVertical: 20,
250
+ },
251
+ dropdownIconContainer: {
252
+ alignSelf: 'center',
253
+ },
254
+ dropdown: {
255
+ position: 'absolute',
256
+ backgroundColor: $config.INPUT_FIELD_BACKGROUND_COLOR,
257
+ borderBottomColor: $config.INPUT_FIELD_BORDER_COLOR,
258
+ borderLeftColor: $config.INPUT_FIELD_BORDER_COLOR,
259
+ borderRightColor: $config.INPUT_FIELD_BORDER_COLOR,
260
+ borderTopColor: $config.PRIMARY_ACTION_BRAND_COLOR,
261
+ borderBottomLeftRadius: ThemeConfig.BorderRadius.medium,
262
+ borderBottomRightRadius: ThemeConfig.BorderRadius.medium,
263
+ borderBottomWidth: 1,
264
+ borderLeftWidth: 1,
265
+ borderRightWidth: 1,
266
+ borderTopWidth: 2,
267
+ shadowColor: $config.HARD_CODED_BLACK_COLOR,
268
+ shadowOffset: {width: 0, height: 4},
269
+ shadowOpacity: 0.1,
270
+ shadowRadius: 4,
271
+ elevation: 5,
272
+ overflow: 'hidden',
273
+ },
274
+ overlay: {
275
+ width: '100%',
276
+ height: '100%',
277
+ },
278
+ itemContainer: {
279
+ minHeight: 40,
280
+ flex: 1,
281
+ flexDirection: 'row',
282
+ },
283
+ itemTextContainer: {
284
+ flex: 0.8,
285
+ justifyContent: 'center',
286
+ alignSelf: 'center',
287
+ },
288
+ itemText: {
289
+ fontFamily: ThemeConfig.FontFamily.sansPro,
290
+ fontWeight: '400',
291
+ fontSize: ThemeConfig.FontSize.normal,
292
+ color: $config.SECONDARY_ACTION_COLOR,
293
+ paddingVertical: 12,
294
+ paddingHorizontal: 15,
295
+ },
296
+ itemTextSelected: {
297
+ color: $config.PRIMARY_ACTION_BRAND_COLOR,
298
+ },
299
+ itemTextSelectedContainer: {
300
+ flex: 0.2,
301
+ justifyContent: 'center',
302
+ alignItems: 'center',
303
+ },
304
+ });
305
+
306
+ export default Dropdown;
@@ -11,6 +11,7 @@
11
11
  */
12
12
  import React from 'react';
13
13
  import {StyleSheet, View, ViewProps} from 'react-native';
14
+ import hexadecimalTransparency from '../utils/hexadecimalTransparency';
14
15
 
15
16
  export default function HorizontalRule(props: ViewProps) {
16
17
  return <View style={[styles.ruler, props?.style]} />;
@@ -18,7 +19,8 @@ export default function HorizontalRule(props: ViewProps) {
18
19
 
19
20
  const styles = StyleSheet.create({
20
21
  ruler: {
21
- borderBottomColor: $config.PRIMARY_COLOR + '80',
22
+ borderBottomColor:
23
+ $config.PRIMARY_ACTION_BRAND_COLOR + hexadecimalTransparency['80%'],
22
24
  borderBottomWidth: 1,
23
25
  margin: '2%',
24
26
  width: '100%',
@@ -0,0 +1,162 @@
1
+ import React from 'react';
2
+ import {
3
+ ViewStyle,
4
+ TextStyle,
5
+ Text,
6
+ StyleSheet,
7
+ Pressable,
8
+ PressableProps,
9
+ TouchableOpacity,
10
+ } from 'react-native';
11
+ import ImageIcon, {ImageIconProps} from './ImageIcon';
12
+ import {isMobileUA, isWebInternal} from '../utils/common';
13
+ import ToolTip from './Tooltip';
14
+ import ThemeConfig from '../theme';
15
+
16
+ export interface BtnTextProps {
17
+ textStyle?: TextStyle;
18
+ textColor?: string;
19
+ text?: string;
20
+ }
21
+
22
+ export interface IconButtonProps {
23
+ setRef?: (ref: any) => void;
24
+ onPress?: PressableProps['onPress'];
25
+ disabled?: boolean;
26
+ containerStyle?: ViewStyle;
27
+ btnTextProps?: BtnTextProps;
28
+ iconProps: ImageIconProps;
29
+ toolTipMessage?: string;
30
+ isToolTipVisible?: boolean;
31
+ setToolTipVisible?: React.Dispatch<React.SetStateAction<boolean>>;
32
+ isOnActionSheet?: boolean;
33
+ hoverEffect?: boolean;
34
+ hoverEffectStyle?: ViewStyle;
35
+ placement?: 'top' | 'bottom' | 'left' | 'right' | 'center';
36
+ isClickable?: boolean;
37
+ }
38
+
39
+ const IconButton = (props: IconButtonProps) => {
40
+ return (
41
+ <ButtonWrapper {...props}>
42
+ <ImageIcon {...props.iconProps} isHovered={props?.isToolTipVisible} />
43
+ {props?.btnTextProps?.text ? (
44
+ <Text
45
+ numberOfLines={1}
46
+ ellipsizeMode="tail"
47
+ style={[
48
+ styles.btnTextStyle,
49
+ props?.btnTextProps?.textColor
50
+ ? {color: props.btnTextProps.textColor}
51
+ : {},
52
+ props?.btnTextProps.textStyle,
53
+ ]}>
54
+ {props.btnTextProps.text}
55
+ </Text>
56
+ ) : (
57
+ <></>
58
+ )}
59
+ </ButtonWrapper>
60
+ );
61
+ };
62
+
63
+ const ButtonWrapper = ({children, ...props}) => {
64
+ const isMobileView = isMobileUA();
65
+ return isMobileView ? (
66
+ <TouchableOpacity
67
+ ref={(ref) => props?.setRef && props.setRef(ref)}
68
+ style={
69
+ !props.isOnActionSheet && [
70
+ styles.containerStyle,
71
+ props?.containerStyle,
72
+ props?.hoverEffect && props?.isToolTipVisible
73
+ ? props?.hoverEffectStyle
74
+ : {},
75
+ ]
76
+ }
77
+ onPress={props.onPress}
78
+ disabled={props.disabled}>
79
+ {children}
80
+ </TouchableOpacity>
81
+ ) : (
82
+ <Pressable
83
+ ref={(ref) => props?.setRef && props.setRef(ref)}
84
+ style={
85
+ !props.isOnActionSheet && [
86
+ styles.containerStyle,
87
+ props?.containerStyle,
88
+ props?.hoverEffect && props?.isToolTipVisible
89
+ ? props?.hoverEffectStyle
90
+ : {},
91
+ ]
92
+ }
93
+ onPress={props.onPress}
94
+ disabled={props.disabled}>
95
+ {children}
96
+ </Pressable>
97
+ );
98
+ };
99
+
100
+ const PlatformWrapper = ({children, ...props}) => {
101
+ return isWebInternal() ? (
102
+ <div
103
+ onMouseEnter={() => {
104
+ props?.setIsHovered(true);
105
+ }}
106
+ onMouseLeave={() => {
107
+ props?.setIsHovered(false);
108
+ }}>
109
+ {children}
110
+ </div>
111
+ ) : (
112
+ children
113
+ );
114
+ };
115
+
116
+ const IconButtonWithToolTip = (props: IconButtonProps) => {
117
+ const [isHovered, setIsHovered] = React.useState(false);
118
+ const {placement = 'top', isClickable = false} = props;
119
+ if (props?.toolTipMessage) {
120
+ return (
121
+ <ToolTip
122
+ isClickable={isClickable}
123
+ toolTipMessage={props.toolTipMessage}
124
+ placement={placement}
125
+ renderContent={(isToolTipVisible, setToolTipVisible) => {
126
+ return (
127
+ <IconButton
128
+ {...props}
129
+ isToolTipVisible={isToolTipVisible}
130
+ setToolTipVisible={setToolTipVisible}
131
+ />
132
+ );
133
+ }}></ToolTip>
134
+ );
135
+ }
136
+ return (
137
+ <PlatformWrapper isHovered={isHovered} setIsHovered={setIsHovered}>
138
+ <IconButton
139
+ {...props}
140
+ isToolTipVisible={isHovered}
141
+ setToolTipVisible={setIsHovered}
142
+ />
143
+ </PlatformWrapper>
144
+ );
145
+ };
146
+
147
+ export default IconButtonWithToolTip;
148
+
149
+ const styles = StyleSheet.create({
150
+ containerStyle: {
151
+ flex: 1,
152
+ flexDirection: 'column',
153
+ alignItems: 'center',
154
+ },
155
+ btnTextStyle: {
156
+ fontFamily: ThemeConfig.FontFamily.sansPro,
157
+ fontSize: ThemeConfig.FontSize.tiny,
158
+ fontWeight: '400',
159
+ textAlign: 'center',
160
+ marginTop: 4,
161
+ },
162
+ });
@@ -0,0 +1,98 @@
1
+ /*
2
+ ********************************************
3
+ Copyright © 2021 Agora Lab, Inc., all rights reserved.
4
+ AppBuilder and all associated components, source code, APIs, services, and documentation
5
+ (the “Materials”) are owned by Agora Lab, Inc. and its licensors. The Materials may not be
6
+ accessed, used, modified, or distributed for any purpose without a license from Agora Lab, Inc.
7
+ Use without a license or in violation of any license terms and conditions (including use for
8
+ any purpose competitive to Agora Lab, Inc.’s business) is strictly prohibited. For more
9
+ information visit https://appbuilder.agora.io.
10
+ *********************************************
11
+ */
12
+ import React from 'react';
13
+ import {ViewStyle, View, StyleSheet} from 'react-native';
14
+ import CustomIcon, {IconsInterface} from '../atoms/CustomIcon';
15
+ import {ImageIcon as UIKitImageIcon} from '../../agora-rn-uikit';
16
+ import hexadecimalTransparency from '../utils/hexadecimalTransparency';
17
+
18
+ export interface ImageIconProps {
19
+ tintColor?: string;
20
+ name: keyof IconsInterface;
21
+ iconSize?: number;
22
+ iconContainerStyle?: ViewStyle;
23
+ iconBackgroundColor?: string;
24
+ base64?: boolean;
25
+ base64TintColor?: string;
26
+ iconType?: 'round' | 'plain';
27
+ isHovered?: boolean;
28
+ // hoverEffect?: boolean;
29
+ // hoverEffectStyle?: ViewStyle;
30
+ showWarningIcon?: boolean;
31
+ }
32
+
33
+ const ImageIcon = (props: ImageIconProps) => {
34
+ const {
35
+ name,
36
+ iconSize = 26,
37
+ tintColor,
38
+ base64 = false,
39
+ base64TintColor = '',
40
+ iconType = 'round',
41
+ } = props;
42
+ return (
43
+ <View
44
+ style={[
45
+ styles.iconContainerStyle,
46
+ iconType === 'round'
47
+ ? props?.iconBackgroundColor
48
+ ? {backgroundColor: props.iconBackgroundColor}
49
+ : {}
50
+ : {backgroundColor: 'transparent', borderRadius: 0},
51
+ ]}>
52
+ <View
53
+ style={[
54
+ {alignItems: 'center'},
55
+ iconType === 'round'
56
+ ? {padding: 13, borderRadius: 50}
57
+ : {padding: 0, borderRadius: 0},
58
+ iconType === 'round' && props?.isHovered
59
+ ? {
60
+ backgroundColor:
61
+ $config.CARD_LAYER_5_COLOR + hexadecimalTransparency['20%'],
62
+ }
63
+ : {},
64
+ props?.iconContainerStyle,
65
+ ]}>
66
+ {props?.showWarningIcon ? (
67
+ <View style={{position: 'absolute', top: -2.5, right: -2}}>
68
+ <CustomIcon
69
+ name="alert"
70
+ color={$config.SEMANTIC_WARNING}
71
+ size={24}
72
+ />
73
+ </View>
74
+ ) : (
75
+ <></>
76
+ )}
77
+ {base64 ? (
78
+ <UIKitImageIcon
79
+ tintColor={base64TintColor}
80
+ name={name}
81
+ style={{width: iconSize, height: iconSize}}
82
+ />
83
+ ) : (
84
+ <CustomIcon name={name} color={tintColor} size={iconSize} />
85
+ )}
86
+ </View>
87
+ </View>
88
+ );
89
+ };
90
+
91
+ export default ImageIcon;
92
+
93
+ const styles = StyleSheet.create({
94
+ iconContainerStyle: {
95
+ borderRadius: 50,
96
+ backgroundColor: $config.ICON_BG_COLOR,
97
+ },
98
+ });