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
@@ -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
+ });