@draftbit/core 46.0.2 → 46.1.2

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 (191) hide show
  1. package/lib/commonjs/components/DeprecatedButton.js +20 -4
  2. package/lib/commonjs/components/DeprecatedButton.js.map +1 -1
  3. package/lib/commonjs/components/DeprecatedCardWrapper.js +14 -2
  4. package/lib/commonjs/components/DeprecatedCardWrapper.js.map +1 -1
  5. package/lib/commonjs/components/Justification.js +3 -0
  6. package/lib/commonjs/components/Picker/Picker.js +5 -4
  7. package/lib/commonjs/components/Picker/Picker.js.map +1 -1
  8. package/lib/commonjs/components/ResizeMode.js +3 -0
  9. package/lib/commonjs/mappings/RadioButtonGroup.js.map +1 -1
  10. package/lib/commonjs/mappings/RadioButtonRow.js.map +1 -1
  11. package/lib/module/components/Justification.js +1 -1
  12. package/lib/module/components/Picker/Picker.js +5 -4
  13. package/lib/module/components/Picker/Picker.js.map +1 -1
  14. package/lib/module/components/ResizeMode.js +1 -1
  15. package/package.json +6 -5
  16. package/src/Provider.js +9 -0
  17. package/src/components/Accordion/AccordionGroup.js +44 -0
  18. package/src/components/Accordion/AccordionItem.js +32 -0
  19. package/src/components/Accordion/index.js +2 -0
  20. package/src/components/ActionSheet/ActionSheet.js +45 -0
  21. package/src/components/ActionSheet/ActionSheetCancel.js +6 -0
  22. package/src/components/ActionSheet/ActionSheetItem.js +30 -0
  23. package/src/components/ActionSheet/index.js +3 -0
  24. package/src/components/AnimatedCircularProgress.js +43 -0
  25. package/src/components/AspectRatio.js +18 -0
  26. package/src/components/AvatarEdit.js +30 -0
  27. package/src/components/Banner.js +109 -0
  28. package/src/components/Button.js +112 -0
  29. package/src/components/Card.js +57 -0
  30. package/src/components/CardBlock.js +54 -0
  31. package/src/components/CardContainer.js +69 -0
  32. package/src/components/CardContainerRating.js +79 -0
  33. package/src/components/CardContainerShortImage.js +33 -0
  34. package/src/components/CardInline.js +36 -0
  35. package/src/components/Carousel.js +66 -0
  36. package/src/components/Checkbox/Checkbox.js +63 -0
  37. package/src/components/Checkbox/CheckboxGroup.js +21 -0
  38. package/src/components/Checkbox/CheckboxGroupRow.js +77 -0
  39. package/src/components/Checkbox/CheckboxRow.js +78 -0
  40. package/src/components/Checkbox/context.js +14 -0
  41. package/src/components/Checkbox/index.js +3 -0
  42. package/src/components/CircleImage.js +8 -0
  43. package/src/components/CircularProgress.js +78 -0
  44. package/src/components/Config.js +63 -0
  45. package/src/components/Container.js +43 -0
  46. package/src/components/DatePicker/DatePicker.js +368 -0
  47. package/src/components/DatePicker/DatePickerComponent.js +13 -0
  48. package/src/components/DatePicker/DatePickerComponent.web.js +30 -0
  49. package/src/components/DatePicker/DatePickerComponentType.js +1 -0
  50. package/src/components/DeprecatedButton.js +95 -0
  51. package/src/components/DeprecatedCardWrapper.js +18 -0
  52. package/src/components/DeprecatedFAB.js +115 -0
  53. package/src/components/Divider.js +13 -0
  54. package/src/components/Elevation.js +20 -0
  55. package/src/components/FAB.js +46 -0
  56. package/src/components/FieldSearchBarFull.js +53 -0
  57. package/src/components/FormRow.js +19 -0
  58. package/src/components/Header.js +44 -0
  59. package/src/components/HeaderLarge.js +7 -0
  60. package/src/components/HeaderMedium.js +7 -0
  61. package/src/components/HeaderOverline.js +7 -0
  62. package/src/components/IconButton.js +35 -0
  63. package/src/components/Image.js +47 -0
  64. package/src/components/Justification.js +1 -0
  65. package/src/components/Layout.js +50 -0
  66. package/src/components/NumberInput.js +49 -0
  67. package/src/components/Picker/Picker.js +267 -0
  68. package/src/components/Picker/Picker.tsx +6 -8
  69. package/src/components/Picker/PickerComponent.android.js +68 -0
  70. package/src/components/Picker/PickerComponent.ios.js +78 -0
  71. package/src/components/Picker/PickerComponent.web.js +69 -0
  72. package/src/components/Picker/PickerTypes.js +1 -0
  73. package/src/components/Portal/Portal.js +35 -0
  74. package/src/components/Portal/PortalConsumer.js +28 -0
  75. package/src/components/Portal/PortalHost.js +105 -0
  76. package/src/components/Portal/PortalManager.js +29 -0
  77. package/src/components/ProgressBar.js +118 -0
  78. package/src/components/ProgressCircle.js +13 -0
  79. package/src/components/ProgressIndicator.js +27 -0
  80. package/src/components/RadioButton/RadioButton.js +17 -0
  81. package/src/components/RadioButton/RadioButtonFieldGroup.js +17 -0
  82. package/src/components/RadioButton/RadioButtonGroup.js +43 -0
  83. package/src/components/RadioButton/RadioButtonRow.js +76 -0
  84. package/src/components/RadioButton/context.js +14 -0
  85. package/src/components/RadioButton/index.js +4 -0
  86. package/src/components/ResizeMode.js +1 -0
  87. package/src/components/Row.js +48 -0
  88. package/src/components/RowBodyIcon.js +8 -0
  89. package/src/components/RowHeadlineImageCaption.js +12 -0
  90. package/src/components/RowHeadlineImageIcon.js +14 -0
  91. package/src/components/ScreenContainer.js +34 -0
  92. package/src/components/Slider.js +63 -0
  93. package/src/components/StarRating.js +50 -0
  94. package/src/components/StepIndicator.js +346 -0
  95. package/src/components/Stepper.js +39 -0
  96. package/src/components/Surface.js +32 -0
  97. package/src/components/Swiper/Swiper.js +29 -0
  98. package/src/components/Swiper/SwiperItem.js +9 -0
  99. package/src/components/Swiper/index.js +2 -0
  100. package/src/components/Switch.js +56 -0
  101. package/src/components/Text.js +28 -0
  102. package/src/components/TextField.js +420 -0
  103. package/src/components/ToggleButton.js +39 -0
  104. package/src/components/Touchable.js +12 -0
  105. package/src/components/Touchable.web.js +2 -0
  106. package/src/components/Typography.js +36 -0
  107. package/src/components/useAuthState.js +31 -0
  108. package/src/constants.js +10 -0
  109. package/src/hooks.js +12 -0
  110. package/src/index.js +52 -0
  111. package/src/interfaces/Icon.js +8 -0
  112. package/src/mappings/Accordion.js +41 -0
  113. package/src/mappings/AccordionItem.js +16 -0
  114. package/src/mappings/ActionSheet.js +13 -0
  115. package/src/mappings/ActionSheetCancel.js +19 -0
  116. package/src/mappings/ActionSheetItem.js +23 -0
  117. package/src/mappings/ActivityIndicator.js +53 -0
  118. package/src/mappings/AudioPlayer.js +20 -0
  119. package/src/mappings/AvatarEdit.js +37 -0
  120. package/src/mappings/Banner.js +32 -0
  121. package/src/mappings/BlurView.js +41 -0
  122. package/src/mappings/Button.js +56 -0
  123. package/src/mappings/Card.js +52 -0
  124. package/src/mappings/CardBlock.js +122 -0
  125. package/src/mappings/CardContainer.js +102 -0
  126. package/src/mappings/CardContainerRating.js +124 -0
  127. package/src/mappings/CardContainerShortImage.js +118 -0
  128. package/src/mappings/CardInline.js +51 -0
  129. package/src/mappings/Carousel.js +18 -0
  130. package/src/mappings/Checkbox.js +45 -0
  131. package/src/mappings/CheckboxGroup.js +25 -0
  132. package/src/mappings/CheckboxRow.js +56 -0
  133. package/src/mappings/CircleImage.js +24 -0
  134. package/src/mappings/Container.js +29 -0
  135. package/src/mappings/CustomCode.js +8 -0
  136. package/src/mappings/DatePicker.js +147 -0
  137. package/src/mappings/Divider.js +26 -0
  138. package/src/mappings/FAB.js +36 -0
  139. package/src/mappings/Fetch.js +12 -0
  140. package/src/mappings/FieldSearchBarFull.js +49 -0
  141. package/src/mappings/FlatList.js +19 -0
  142. package/src/mappings/HeaderLarge.js +28 -0
  143. package/src/mappings/HeaderMedium.js +54 -0
  144. package/src/mappings/HeaderOverline.js +54 -0
  145. package/src/mappings/Icon.js +25 -0
  146. package/src/mappings/IconButton.js +30 -0
  147. package/src/mappings/Image.js +15 -0
  148. package/src/mappings/ImageBackground.js +28 -0
  149. package/src/mappings/KeyboardAvoidingView.js +40 -0
  150. package/src/mappings/KeyboardAwareScrollView.js +49 -0
  151. package/src/mappings/Layout.js +195 -0
  152. package/src/mappings/LinearGradient.js +77 -0
  153. package/src/mappings/MapCallout.js +21 -0
  154. package/src/mappings/MapMarker.js +47 -0
  155. package/src/mappings/MapView.js +138 -0
  156. package/src/mappings/Modal.js +41 -0
  157. package/src/mappings/Picker.js +139 -0
  158. package/src/mappings/ProgressBar.js +100 -0
  159. package/src/mappings/ProgressCircle.js +108 -0
  160. package/src/mappings/ProgressIndicator.js +180 -0
  161. package/src/mappings/RadioButton.js +50 -0
  162. package/src/mappings/RadioButtonGroup.js +16 -0
  163. package/src/mappings/RadioButtonRow.js +37 -0
  164. package/src/mappings/RowBodyIcon.js +75 -0
  165. package/src/mappings/RowHeadlineImageCaption.js +167 -0
  166. package/src/mappings/RowHeadlineImageIcon.js +99 -0
  167. package/src/mappings/SafeAreaView.js +33 -0
  168. package/src/mappings/ScrollView.js +30 -0
  169. package/src/mappings/Slider.js +59 -0
  170. package/src/mappings/StarRating.js +42 -0
  171. package/src/mappings/Stepper.js +28 -0
  172. package/src/mappings/Surface.js +13 -0
  173. package/src/mappings/Swiper.js +60 -0
  174. package/src/mappings/SwiperItem.js +8 -0
  175. package/src/mappings/Switch.js +75 -0
  176. package/src/mappings/Text.js +232 -0
  177. package/src/mappings/TextArea.js +52 -0
  178. package/src/mappings/TextField.js +158 -0
  179. package/src/mappings/TextInput.js +208 -0
  180. package/src/mappings/ToggleButton.js +45 -0
  181. package/src/mappings/Touchable.js +12 -0
  182. package/src/mappings/Video.js +74 -0
  183. package/src/mappings/View.js +206 -0
  184. package/src/mappings/WebView.js +18 -0
  185. package/src/styles/DarkTheme.js +26 -0
  186. package/src/styles/DefaultTheme.js +111 -0
  187. package/src/styles/fonts.js +62 -0
  188. package/src/styles/overlay.js +60 -0
  189. package/src/styles/shadow.js +51 -0
  190. package/src/theming.js +3 -0
  191. package/src/utilities.js +102 -0
@@ -0,0 +1,267 @@
1
+ import * as React from "react";
2
+ import { View, StyleSheet, Text, Platform, Dimensions, } from "react-native";
3
+ import { omit, pickBy, identity, isObject } from "lodash";
4
+ import { SafeAreaView } from "react-native-safe-area-context";
5
+ import { Picker as NativePicker } from "@react-native-picker/picker";
6
+ import { withTheme } from "../../theming";
7
+ import Portal from "../Portal/Portal";
8
+ import Button from "../DeprecatedButton";
9
+ import Touchable from "../Touchable";
10
+ import { extractStyles, extractBorderAndMarginStyles, borderStyleNames, marginStyleNames, } from "../../utilities";
11
+ function normalizeOptions(options) {
12
+ if (options.length === 0) {
13
+ return [];
14
+ }
15
+ if (typeof options[0] === ("string" || "number")) {
16
+ return options.map((option) => ({
17
+ label: String(option),
18
+ value: String(option),
19
+ }));
20
+ }
21
+ if (isObject(options[0]) &&
22
+ options[0].value !== null &&
23
+ options[0].label !== null) {
24
+ return options.map((option) => {
25
+ return {
26
+ label: String(option.label),
27
+ value: String(option.value),
28
+ };
29
+ });
30
+ }
31
+ throw new Error('Picker options must be either an array of strings or array of { "label": string; "value": string; } objects.');
32
+ }
33
+ const { width: deviceWidth, height: deviceHeight } = Dimensions.get("screen");
34
+ const isIos = Platform.OS === "ios";
35
+ const unstyledColor = "rgba(165, 173, 183, 1)";
36
+ const disabledColor = "rgb(240, 240, 240)";
37
+ const errorColor = "rgba(255, 69, 100, 1)";
38
+ const Picker = ({ error, options = [], onValueChange, defaultValue, Icon, style, placeholder, value, disabled = false, theme, assistiveText, label, iconColor = unstyledColor, iconSize = 24, leftIconMode = "inset", leftIconName, placeholderTextColor = unstyledColor, rightIconName, type = "solid", }) => {
39
+ const androidPickerRef = React.useRef(undefined);
40
+ const [internalValue, setInternalValue] = React.useState(value || defaultValue);
41
+ const [pickerVisible, setPickerVisible] = React.useState(false);
42
+ const togglePickerVisible = () => {
43
+ setPickerVisible(!pickerVisible);
44
+ };
45
+ React.useEffect(() => {
46
+ if (value != null) {
47
+ setInternalValue(value);
48
+ }
49
+ }, [value]);
50
+ React.useEffect(() => {
51
+ if (defaultValue != null) {
52
+ setInternalValue(defaultValue);
53
+ }
54
+ }, [defaultValue]);
55
+ React.useEffect(() => {
56
+ if (pickerVisible && androidPickerRef.current) {
57
+ androidPickerRef?.current?.focus();
58
+ }
59
+ }, [pickerVisible, androidPickerRef]);
60
+ const normalizedOptions = normalizeOptions(options);
61
+ const pickerOptions = placeholder
62
+ ? [{ value: placeholder, label: placeholder }, ...normalizedOptions]
63
+ : normalizedOptions;
64
+ const { colors } = theme;
65
+ const { viewStyles, textStyles } = extractStyles(style);
66
+ const additionalBorderStyles = ["backgroundColor"];
67
+ const additionalMarginStyles = [
68
+ "bottom",
69
+ "height",
70
+ "left",
71
+ "maxHeight",
72
+ "maxWidth",
73
+ "minHeight",
74
+ "minWidth",
75
+ "overflow",
76
+ "position",
77
+ "right",
78
+ "top",
79
+ "width",
80
+ "zIndex",
81
+ ];
82
+ const { borderStyles: extractedBorderStyles, marginStyles: extractedMarginStyles, } = extractBorderAndMarginStyles(viewStyles, additionalBorderStyles, additionalMarginStyles);
83
+ const borderStyles = {
84
+ ...{
85
+ ...(type === "solid"
86
+ ? {
87
+ borderTopLeftRadius: 5,
88
+ borderTopRightRadius: 5,
89
+ borderBottomRightRadius: 5,
90
+ borderBottomLeftRadius: 5,
91
+ borderTopWidth: 1,
92
+ borderRightWidth: 1,
93
+ borderLeftWidth: 1,
94
+ }
95
+ : {}),
96
+ borderBottomWidth: 1,
97
+ borderColor: unstyledColor,
98
+ borderStyle: "solid",
99
+ },
100
+ ...extractedBorderStyles,
101
+ ...(error ? { borderColor: errorColor } : {}),
102
+ ...(disabled
103
+ ? { borderColor: "transparent", backgroundColor: disabledColor }
104
+ : {}),
105
+ };
106
+ const marginStyles = {
107
+ height: 60,
108
+ ...extractedMarginStyles,
109
+ };
110
+ const stylesWithoutBordersAndMargins = omit(viewStyles, [
111
+ ...borderStyleNames,
112
+ ...marginStyleNames,
113
+ ...additionalBorderStyles,
114
+ ...additionalMarginStyles,
115
+ ]);
116
+ const optionExists = internalValue
117
+ ? pickerOptions.find((option) => option.value === internalValue)
118
+ : { label: null };
119
+ const selectedLabel = optionExists && optionExists.label ? optionExists.label : placeholder;
120
+ const labelText = label ? (React.createElement(Text, { style: {
121
+ textAlign: textStyles.textAlign,
122
+ color: unstyledColor,
123
+ fontSize: 12,
124
+ paddingBottom: 4,
125
+ } }, label)) : null;
126
+ const leftIconOutset = leftIconMode === "outset";
127
+ const leftIcon = leftIconName ? (React.createElement(Icon, { name: leftIconName, color: disabled ? unstyledColor : iconColor, size: iconSize, style: {
128
+ marginRight: 4,
129
+ marginLeft: 4,
130
+ } })) : null;
131
+ const rightIcon = rightIconName ? (React.createElement(Icon, { name: rightIconName, color: disabled ? unstyledColor : iconColor, size: iconSize, style: {
132
+ marginRight: -10,
133
+ marginLeft: 8,
134
+ } })) : null;
135
+ const textAlign = textStyles?.textAlign;
136
+ const calculateLeftPadding = () => {
137
+ if (leftIconOutset) {
138
+ if (textAlign === "center") {
139
+ return iconSize - Math.abs(8 - iconSize);
140
+ }
141
+ return iconSize + 8;
142
+ }
143
+ return 0;
144
+ };
145
+ const assistiveTextLabel = assistiveText ? (React.createElement(Text, { style: {
146
+ textAlign,
147
+ width: "100%",
148
+ paddingLeft: calculateLeftPadding(),
149
+ color: unstyledColor,
150
+ fontSize: 12,
151
+ paddingTop: 4,
152
+ } }, assistiveText)) : null;
153
+ const primaryTextStyle = {
154
+ color: unstyledColor,
155
+ fontSize: 14,
156
+ ...pickBy(textStyles, identity),
157
+ ...(placeholder === internalValue ? { color: placeholderTextColor } : {}),
158
+ ...(disabled ? { color: unstyledColor } : {}),
159
+ };
160
+ const handleValueChange = (newValue, itemIndex) => {
161
+ if (!placeholder || itemIndex > 0) {
162
+ onValueChange?.(newValue, itemIndex);
163
+ }
164
+ setInternalValue(newValue);
165
+ };
166
+ return (
167
+ /* marginsContainer */
168
+ React.createElement(View, { style: [styles.marginsContainer, marginStyles] },
169
+ React.createElement(Touchable, { disabled: disabled, onPress: togglePickerVisible, style: styles.touchableContainer },
170
+ React.createElement(View, { pointerEvents: "none", style: [
171
+ styles.outsetContainer,
172
+ stylesWithoutBordersAndMargins,
173
+ !leftIconOutset ? borderStyles : {},
174
+ ] },
175
+ leftIcon,
176
+ React.createElement(View, { style: [
177
+ styles.insetContainer,
178
+ leftIconOutset ? borderStyles : {},
179
+ ] },
180
+ React.createElement(View, { style: styles.primaryTextContainer },
181
+ labelText,
182
+ React.createElement(Text, { style: primaryTextStyle }, String(selectedLabel))),
183
+ rightIcon)),
184
+ assistiveTextLabel),
185
+ isIos && pickerVisible ? (React.createElement(Portal, null,
186
+ React.createElement(View, { style: [
187
+ styles.iosPicker,
188
+ {
189
+ backgroundColor: colors.divider,
190
+ },
191
+ ] },
192
+ React.createElement(SafeAreaView, { style: styles.iosSafeArea },
193
+ React.createElement(Button, { Icon: Icon, type: "text", onPress: togglePickerVisible, style: styles.iosButton }, "Close"),
194
+ React.createElement(NativePicker, { style: styles.iosNativePicker, selectedValue: internalValue, onValueChange: handleValueChange }, pickerOptions.map((option) => (React.createElement(NativePicker.Item, { label: option.label, value: option.value, key: option.value })))))))) : null,
195
+ !isIos && pickerVisible ? (React.createElement(NativePicker, { enabled: pickerVisible, selectedValue: internalValue, onValueChange: handleValueChange, style: styles.nonIosPicker, ref: androidPickerRef, onBlur: () => setPickerVisible(false) }, pickerOptions.map((option) => (React.createElement(NativePicker.Item, { label: option.label, value: option.value, key: option.value }))))) : null));
196
+ };
197
+ export default withTheme(Picker);
198
+ const styles = StyleSheet.create({
199
+ marginsContainer: {
200
+ alignSelf: "stretch",
201
+ alignItems: "center",
202
+ width: "100%",
203
+ maxWidth: deviceWidth,
204
+ },
205
+ touchableContainer: {
206
+ flex: 1,
207
+ height: "100%",
208
+ width: "100%",
209
+ alignSelf: "stretch",
210
+ alignItems: "center",
211
+ },
212
+ outsetContainer: {
213
+ flex: 1,
214
+ height: "100%",
215
+ width: "100%",
216
+ flexDirection: "row",
217
+ alignItems: "center",
218
+ justifyContent: "space-between",
219
+ },
220
+ insetContainer: {
221
+ flex: 1,
222
+ height: "100%",
223
+ width: "100%",
224
+ flexDirection: "row",
225
+ alignItems: "center",
226
+ justifyContent: "space-between",
227
+ paddingLeft: 12,
228
+ paddingRight: 12,
229
+ },
230
+ primaryTextContainer: {
231
+ flex: 1,
232
+ },
233
+ iosPicker: {
234
+ position: "absolute",
235
+ bottom: 0,
236
+ left: 0,
237
+ right: 0,
238
+ flexDirection: "row",
239
+ justifyContent: "center",
240
+ width: "100%",
241
+ maxWidth: deviceWidth,
242
+ maxHeight: deviceHeight,
243
+ },
244
+ iosSafeArea: {
245
+ backgroundColor: "white",
246
+ flexDirection: "column",
247
+ width: "100%",
248
+ maxWidth: deviceWidth,
249
+ },
250
+ iosButton: {
251
+ alignSelf: "flex-end",
252
+ },
253
+ iosNativePicker: {
254
+ backgroundColor: "white",
255
+ },
256
+ nonIosPicker: {
257
+ opacity: 0,
258
+ position: "absolute",
259
+ top: 0,
260
+ left: 0,
261
+ right: 0,
262
+ bottom: 0,
263
+ width: "100%",
264
+ maxWidth: deviceWidth,
265
+ maxHeight: deviceHeight,
266
+ },
267
+ });
@@ -212,12 +212,12 @@ const Picker: React.FC<PickerProps> = ({
212
212
  ...additionalMarginStyles,
213
213
  ]);
214
214
 
215
+ const optionExists = internalValue
216
+ ? pickerOptions.find((option) => option.value === internalValue)
217
+ : { label: null };
218
+
215
219
  const selectedLabel =
216
- internalValue &&
217
- ((pickerOptions as unknown as PickerOption[]).find(
218
- (option) => option.value === internalValue
219
- )?.label ??
220
- internalValue);
220
+ optionExists && optionExists.label ? optionExists.label : placeholder;
221
221
 
222
222
  const labelText = label ? (
223
223
  <Text
@@ -333,9 +333,7 @@ const Picker: React.FC<PickerProps> = ({
333
333
  <View style={styles.primaryTextContainer}>
334
334
  {labelText}
335
335
 
336
- <Text style={primaryTextStyle}>
337
- {String(selectedLabel ?? placeholder)}
338
- </Text>
336
+ <Text style={primaryTextStyle}>{String(selectedLabel)}</Text>
339
337
  </View>
340
338
 
341
339
  {rightIcon}
@@ -0,0 +1,68 @@
1
+ import * as React from "react";
2
+ import { View, StyleSheet } from "react-native";
3
+ import omit from "lodash.omit";
4
+ import { withTheme } from "../../theming";
5
+ import { Picker as NativePicker } from "@react-native-picker/picker";
6
+ import { extractStyles } from "../../utilities";
7
+ import TextField from "../TextField";
8
+ import Touchable from "../Touchable";
9
+ const Picker = ({ style, options, placeholder, selectedValue, disabled = false, onValueChange: onValueChangeOverride = () => { }, ...props }) => {
10
+ const { viewStyles: { borderRadius, // eslint-disable-line @typescript-eslint/no-unused-vars
11
+ borderWidth, // eslint-disable-line @typescript-eslint/no-unused-vars
12
+ borderTopWidth, // eslint-disable-line @typescript-eslint/no-unused-vars
13
+ borderRightWidth, // eslint-disable-line @typescript-eslint/no-unused-vars
14
+ borderBottomWidth, // eslint-disable-line @typescript-eslint/no-unused-vars
15
+ borderLeftWidth, // eslint-disable-line @typescript-eslint/no-unused-vars
16
+ borderColor, // eslint-disable-line @typescript-eslint/no-unused-vars
17
+ backgroundColor, // eslint-disable-line @typescript-eslint/no-unused-vars
18
+ padding, // eslint-disable-line @typescript-eslint/no-unused-vars
19
+ paddingTop, // eslint-disable-line @typescript-eslint/no-unused-vars
20
+ paddingRight, // eslint-disable-line @typescript-eslint/no-unused-vars
21
+ paddingBottom, // eslint-disable-line @typescript-eslint/no-unused-vars
22
+ paddingLeft, // eslint-disable-line @typescript-eslint/no-unused-vars
23
+ ...viewStyles }, } = extractStyles(style);
24
+ const textField = React.useRef(undefined);
25
+ const onValueChange = (itemValue, itemIndex) => {
26
+ toggleFocus();
27
+ onValueChangeOverride(itemValue, itemIndex);
28
+ };
29
+ const toggleFocus = () => {
30
+ if (!disabled) {
31
+ // @ts-ignore
32
+ textField.current.toggleFocus(); // cannot determine if method exists due to component being wrapped in a withTheme()
33
+ }
34
+ };
35
+ const stylesWithoutMargin = style &&
36
+ omit(StyleSheet.flatten(style), [
37
+ "margin",
38
+ "marginTop",
39
+ "marginRight",
40
+ "marginBottom",
41
+ "marginLeft",
42
+ ]);
43
+ const selectedLabel = selectedValue &&
44
+ (options.find((o) => o.value === selectedValue)?.label ?? selectedValue);
45
+ return (React.createElement(Touchable, { disabled: disabled, onPress: toggleFocus, style: [styles.container, viewStyles] },
46
+ React.createElement(View, null,
47
+ React.createElement(NativePicker, { enabled: !disabled, selectedValue: selectedValue, onValueChange: onValueChange, style: {
48
+ opacity: 0,
49
+ position: "absolute",
50
+ top: 0,
51
+ left: 0,
52
+ right: 0,
53
+ bottom: 0,
54
+ width: "100%",
55
+ } }, options.map((o) => (React.createElement(NativePicker.Item, { label: o.label, value: o.value, key: o.value })))),
56
+ React.createElement(View, { pointerEvents: "none" },
57
+ React.createElement(TextField, { ...props, value: selectedLabel, placeholder: placeholder,
58
+ // @ts-ignore
59
+ ref: textField, disabled: disabled,
60
+ // @ts-expect-error
61
+ style: stylesWithoutMargin })))));
62
+ };
63
+ const styles = StyleSheet.create({
64
+ container: {
65
+ alignSelf: "stretch",
66
+ },
67
+ });
68
+ export default withTheme(Picker);
@@ -0,0 +1,78 @@
1
+ import * as React from "react";
2
+ import { View, StyleSheet } from "react-native";
3
+ import { SafeAreaView } from "react-native-safe-area-context";
4
+ import omit from "lodash.omit";
5
+ import { Picker as NativePicker } from "@react-native-picker/picker";
6
+ import { withTheme } from "../../theming";
7
+ import Portal from "../Portal/Portal";
8
+ import Button from "../DeprecatedButton";
9
+ import TextField from "../TextField";
10
+ import Touchable from "../Touchable";
11
+ import { extractStyles } from "../../utilities";
12
+ const Picker = ({ Icon, style, options, placeholder, selectedValue, disabled = false, onValueChange = () => { }, theme: { colors }, ...props }) => {
13
+ const { viewStyles: { borderRadius, // eslint-disable-line @typescript-eslint/no-unused-vars
14
+ borderWidth, // eslint-disable-line @typescript-eslint/no-unused-vars
15
+ borderTopWidth, // eslint-disable-line @typescript-eslint/no-unused-vars
16
+ borderRightWidth, // eslint-disable-line @typescript-eslint/no-unused-vars
17
+ borderBottomWidth, // eslint-disable-line @typescript-eslint/no-unused-vars
18
+ borderLeftWidth, // eslint-disable-line @typescript-eslint/no-unused-vars
19
+ borderColor, // eslint-disable-line @typescript-eslint/no-unused-vars
20
+ backgroundColor, // eslint-disable-line @typescript-eslint/no-unused-vars
21
+ padding, // eslint-disable-line @typescript-eslint/no-unused-vars
22
+ paddingTop, // eslint-disable-line @typescript-eslint/no-unused-vars
23
+ paddingRight, // eslint-disable-line @typescript-eslint/no-unused-vars
24
+ paddingBottom, // eslint-disable-line @typescript-eslint/no-unused-vars
25
+ paddingLeft, // eslint-disable-line @typescript-eslint/no-unused-vars
26
+ ...viewStyles }, } = extractStyles(style);
27
+ const textField = React.useRef(undefined);
28
+ const [pickerVisible, setIsPickerVisible] = React.useState(false);
29
+ const toggleVisibility = () => {
30
+ setIsPickerVisible(!pickerVisible);
31
+ // @ts-ignore
32
+ textField.current.toggleFocus(); // cannot determine if method exists due to component being wrapped in a withTheme()
33
+ };
34
+ const stylesWithoutMargin = style &&
35
+ omit(StyleSheet.flatten(style), [
36
+ "margin",
37
+ "marginTop",
38
+ "marginRight",
39
+ "marginBottom",
40
+ "marginLeft",
41
+ ]);
42
+ const selectedLabel = selectedValue &&
43
+ (options.find((o) => o.value === selectedValue)?.label ?? selectedValue);
44
+ return (React.createElement(View, { style: [styles.container, viewStyles] },
45
+ React.createElement(Touchable, { disabled: disabled, onPress: toggleVisibility },
46
+ React.createElement(TextField, { ...props, value: String(selectedLabel), placeholder: placeholder,
47
+ // @ts-ignore
48
+ ref: textField, disabled: disabled, pointerEvents: "none",
49
+ // @ts-expect-error
50
+ style: stylesWithoutMargin, Icon: Icon })),
51
+ pickerVisible && (React.createElement(Portal, null,
52
+ React.createElement(View, { style: [styles.picker, { backgroundColor: colors.divider }] },
53
+ React.createElement(SafeAreaView, { style: styles.pickerContainer },
54
+ React.createElement(Button, { Icon: Icon, type: "text", onPress: toggleVisibility, style: styles.closeButton }, "Close"),
55
+ React.createElement(NativePicker, { style: { backgroundColor: "white" }, selectedValue: selectedValue, onValueChange: onValueChange }, options.map((o) => (React.createElement(NativePicker.Item, { label: o.label, value: o.value, key: o.value }))))))))));
56
+ };
57
+ const styles = StyleSheet.create({
58
+ container: {
59
+ alignSelf: "stretch",
60
+ },
61
+ picker: {
62
+ position: "absolute",
63
+ bottom: 0,
64
+ left: 0,
65
+ right: 0,
66
+ flexDirection: "row",
67
+ justifyContent: "center",
68
+ },
69
+ pickerContainer: {
70
+ backgroundColor: "white",
71
+ flexDirection: "column",
72
+ width: "100%",
73
+ },
74
+ closeButton: {
75
+ alignSelf: "flex-end",
76
+ },
77
+ });
78
+ export default withTheme(Picker);
@@ -0,0 +1,69 @@
1
+ import * as React from "react";
2
+ import { View, StyleSheet } from "react-native";
3
+ import { Picker as NativePicker } from "@react-native-picker/picker";
4
+ import omit from "lodash.omit";
5
+ import { withTheme } from "../../theming";
6
+ import { extractStyles } from "../../utilities";
7
+ import TextField from "../TextField";
8
+ import Touchable from "../Touchable";
9
+ const Picker = ({ style, options, placeholder, selectedValue, disabled = false, onValueChange: onValueChangeOverride = () => { }, ...props }) => {
10
+ const { viewStyles: { borderRadius, // eslint-disable-line @typescript-eslint/no-unused-vars
11
+ borderWidth, // eslint-disable-line @typescript-eslint/no-unused-vars
12
+ borderTopWidth, // eslint-disable-line @typescript-eslint/no-unused-vars
13
+ borderRightWidth, // eslint-disable-line @typescript-eslint/no-unused-vars
14
+ borderBottomWidth, // eslint-disable-line @typescript-eslint/no-unused-vars
15
+ borderLeftWidth, // eslint-disable-line @typescript-eslint/no-unused-vars
16
+ borderColor, // eslint-disable-line @typescript-eslint/no-unused-vars
17
+ backgroundColor, // eslint-disable-line @typescript-eslint/no-unused-vars
18
+ padding, // eslint-disable-line @typescript-eslint/no-unused-vars
19
+ paddingTop, // eslint-disable-line @typescript-eslint/no-unused-vars
20
+ paddingRight, // eslint-disable-line @typescript-eslint/no-unused-vars
21
+ paddingBottom, // eslint-disable-line @typescript-eslint/no-unused-vars
22
+ paddingLeft, // eslint-disable-line @typescript-eslint/no-unused-vars
23
+ ...viewStyles }, } = extractStyles(style);
24
+ const textField = React.useRef(undefined);
25
+ const onValueChange = (itemValue, itemIndex) => {
26
+ toggleFocus();
27
+ onValueChangeOverride(itemValue, itemIndex);
28
+ };
29
+ const toggleFocus = () => {
30
+ if (!disabled) {
31
+ // @ts-ignore
32
+ textField.current.toggleFocus(); // cannot determine if method exists due to component being wrapped in a withTheme()
33
+ }
34
+ };
35
+ const stylesWithoutMargin = style &&
36
+ omit(StyleSheet.flatten(style), [
37
+ "margin",
38
+ "marginTop",
39
+ "marginRight",
40
+ "marginBottom",
41
+ "marginLeft",
42
+ ]);
43
+ const selectedLabel = selectedValue &&
44
+ (options.find((o) => o.value === selectedValue)?.label ?? selectedValue);
45
+ return (React.createElement(Touchable, { disabled: disabled, onPress: toggleFocus, style: [styles.container, viewStyles] },
46
+ React.createElement(View, null,
47
+ React.createElement(NativePicker, { enabled: !disabled, selectedValue: selectedValue, onValueChange: onValueChange, style: {
48
+ flex: 1,
49
+ opacity: 0,
50
+ position: "absolute",
51
+ top: 0,
52
+ left: 0,
53
+ right: 0,
54
+ bottom: 0,
55
+ width: "100%",
56
+ } }, options.map((o) => (React.createElement(NativePicker.Item, { label: o.label, value: o.value, key: o.value })))),
57
+ React.createElement(View, { pointerEvents: "none" },
58
+ React.createElement(TextField, { ...props, value: selectedLabel, placeholder: placeholder,
59
+ // @ts-ignore
60
+ ref: textField, disabled: disabled,
61
+ // @ts-expect-error
62
+ style: stylesWithoutMargin })))));
63
+ };
64
+ const styles = StyleSheet.create({
65
+ container: {
66
+ alignSelf: "stretch",
67
+ },
68
+ });
69
+ export default withTheme(Picker);
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,35 @@
1
+ import * as React from "react";
2
+ import PortalConsumer from "./PortalConsumer";
3
+ import PortalHost, { PortalContext } from "./PortalHost";
4
+ import { ThemeProvider, withTheme } from "../../theming";
5
+ /**
6
+ * Portal allows to render a component at a different place in the parent tree.
7
+ * You can use it to render content which should appear above other elements, similar to `Modal`.
8
+ * It requires a [`Portal.Host`](portal-host.html) component to be rendered somewhere in the parent tree.
9
+ *
10
+ * ## Usage
11
+ * ```js
12
+ * import * as React from 'react';
13
+ * import { Portal, Text } from 'react-native-paper';
14
+ *
15
+ * export default class MyComponent extends React.Component {
16
+ * render() {
17
+ * return (
18
+ * <Portal>
19
+ * <Text>This is rendered at a different place</Text>
20
+ * </Portal>
21
+ * );
22
+ * }
23
+ * }
24
+ * ```
25
+ */
26
+ class Portal extends React.Component {
27
+ // @component ./PortalHost.tsx
28
+ static Host = PortalHost;
29
+ render() {
30
+ const { children, theme } = this.props;
31
+ return (React.createElement(PortalContext.Consumer, null, (manager) => (React.createElement(PortalConsumer, { manager: manager },
32
+ React.createElement(ThemeProvider, { theme: theme }, children)))));
33
+ }
34
+ }
35
+ export default withTheme(Portal);
@@ -0,0 +1,28 @@
1
+ import * as React from "react";
2
+ export default class PortalConsumer extends React.Component {
3
+ async componentDidMount() {
4
+ this.checkManager();
5
+ // Delay updating to prevent React from going to infinite loop
6
+ await Promise.resolve();
7
+ this.key = this.props.manager.mount(this.props.children);
8
+ }
9
+ componentDidUpdate() {
10
+ this.checkManager();
11
+ this.props.manager.update(this.key, this.props.children);
12
+ }
13
+ componentWillUnmount() {
14
+ this.checkManager();
15
+ this.props.manager.unmount(this.key);
16
+ }
17
+ key;
18
+ checkManager() {
19
+ if (!this.props.manager) {
20
+ throw new Error("Looks like you forgot to wrap your root component with `Provider` component from `react-native-paper`.\n\n" +
21
+ "Please read our getting-started guide and make sure you've followed all the required steps.\n\n" +
22
+ "https://callstack.github.io/react-native-paper/getting-started.html");
23
+ }
24
+ }
25
+ render() {
26
+ return null;
27
+ }
28
+ }