@draftbit/core 44.1.14 → 44.2.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 (228) hide show
  1. package/lib/commonjs/components/DeprecatedButton.js +19 -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 +27 -266
  7. package/lib/commonjs/components/Picker/Picker.js.map +1 -1
  8. package/lib/commonjs/components/Picker/PickerComponent.android.js +110 -34
  9. package/lib/commonjs/components/Picker/PickerComponent.android.js.map +1 -1
  10. package/lib/commonjs/components/Picker/PickerComponent.ios.js +113 -44
  11. package/lib/commonjs/components/Picker/PickerComponent.ios.js.map +1 -1
  12. package/lib/commonjs/components/Picker/PickerComponent.web.js +111 -34
  13. package/lib/commonjs/components/Picker/PickerComponent.web.js.map +1 -1
  14. package/lib/commonjs/components/Picker/PickerTypes.js +6 -0
  15. package/lib/commonjs/components/Picker/PickerTypes.js.map +1 -0
  16. package/lib/commonjs/components/ResizeMode.js +3 -0
  17. package/lib/commonjs/mappings/Picker.js +1 -7
  18. package/lib/commonjs/mappings/Picker.js.map +1 -1
  19. package/lib/commonjs/mappings/RadioButtonGroup.js.map +1 -1
  20. package/lib/commonjs/mappings/RadioButtonRow.js.map +1 -1
  21. package/lib/commonjs/utilities.js +0 -19
  22. package/lib/commonjs/utilities.js.map +1 -1
  23. package/lib/module/components/Justification.js +1 -1
  24. package/lib/module/components/Picker/Picker.js +28 -260
  25. package/lib/module/components/Picker/Picker.js.map +1 -1
  26. package/lib/module/components/Picker/PickerComponent.android.js +103 -32
  27. package/lib/module/components/Picker/PickerComponent.android.js.map +1 -1
  28. package/lib/module/components/Picker/PickerComponent.ios.js +108 -42
  29. package/lib/module/components/Picker/PickerComponent.ios.js.map +1 -1
  30. package/lib/module/components/Picker/PickerComponent.web.js +104 -32
  31. package/lib/module/components/Picker/PickerComponent.web.js.map +1 -1
  32. package/lib/module/components/Picker/PickerTypes.js +2 -0
  33. package/lib/module/components/Picker/PickerTypes.js.map +1 -0
  34. package/lib/module/components/ResizeMode.js +1 -1
  35. package/lib/module/mappings/Picker.js +2 -8
  36. package/lib/module/mappings/Picker.js.map +1 -1
  37. package/lib/module/utilities.js +1 -12
  38. package/lib/module/utilities.js.map +1 -1
  39. package/lib/typescript/src/components/Picker/Picker.d.ts +4 -28
  40. package/lib/typescript/src/components/Picker/PickerComponent.android.d.ts +5 -12
  41. package/lib/typescript/src/components/Picker/PickerComponent.ios.d.ts +5 -11
  42. package/lib/typescript/src/components/Picker/PickerComponent.web.d.ts +5 -12
  43. package/lib/typescript/src/components/Picker/PickerTypes.d.ts +18 -0
  44. package/lib/typescript/src/mappings/Picker.d.ts +0 -21
  45. package/lib/typescript/src/utilities.d.ts +0 -7
  46. package/package.json +2 -2
  47. package/src/Provider.js +9 -0
  48. package/src/components/Accordion/AccordionGroup.js +44 -0
  49. package/src/components/Accordion/AccordionItem.js +32 -0
  50. package/src/components/Accordion/index.js +2 -0
  51. package/src/components/ActionSheet/ActionSheet.js +45 -0
  52. package/src/components/ActionSheet/ActionSheetCancel.js +6 -0
  53. package/src/components/ActionSheet/ActionSheetItem.js +30 -0
  54. package/src/components/ActionSheet/index.js +3 -0
  55. package/src/components/AnimatedCircularProgress.js +43 -0
  56. package/src/components/AspectRatio.js +18 -0
  57. package/src/components/AvatarEdit.js +30 -0
  58. package/src/components/Banner.js +109 -0
  59. package/src/components/Button.js +112 -0
  60. package/src/components/Card.js +57 -0
  61. package/src/components/CardBlock.js +54 -0
  62. package/src/components/CardContainer.js +69 -0
  63. package/src/components/CardContainerRating.js +79 -0
  64. package/src/components/CardContainerShortImage.js +33 -0
  65. package/src/components/CardInline.js +36 -0
  66. package/src/components/Carousel.js +66 -0
  67. package/src/components/Checkbox/Checkbox.js +63 -0
  68. package/src/components/Checkbox/CheckboxGroup.js +21 -0
  69. package/src/components/Checkbox/CheckboxGroupRow.js +77 -0
  70. package/src/components/Checkbox/CheckboxRow.js +78 -0
  71. package/src/components/Checkbox/context.js +14 -0
  72. package/src/components/Checkbox/index.js +3 -0
  73. package/src/components/CircleImage.js +8 -0
  74. package/src/components/CircularProgress.js +78 -0
  75. package/src/components/Config.js +63 -0
  76. package/src/components/Container.js +43 -0
  77. package/src/components/DatePicker/DatePicker.js +368 -0
  78. package/src/components/DatePicker/DatePickerComponent.js +13 -0
  79. package/src/components/DatePicker/DatePickerComponent.web.js +30 -0
  80. package/src/components/DatePicker/DatePickerComponentType.js +1 -0
  81. package/src/components/DeprecatedButton.js +95 -0
  82. package/src/components/DeprecatedCardWrapper.js +18 -0
  83. package/src/components/DeprecatedFAB.js +115 -0
  84. package/src/components/Divider.js +13 -0
  85. package/src/components/Elevation.js +20 -0
  86. package/src/components/FAB.js +46 -0
  87. package/src/components/FieldSearchBarFull.js +53 -0
  88. package/src/components/FormRow.js +19 -0
  89. package/src/components/Header.js +44 -0
  90. package/src/components/HeaderLarge.js +7 -0
  91. package/src/components/HeaderMedium.js +7 -0
  92. package/src/components/HeaderOverline.js +7 -0
  93. package/src/components/IconButton.js +35 -0
  94. package/src/components/Image.js +47 -0
  95. package/src/components/Justification.js +1 -0
  96. package/src/components/Layout.js +50 -0
  97. package/src/components/NumberInput.js +49 -0
  98. package/src/components/Picker/Picker.js +56 -0
  99. package/src/components/Picker/Picker.tsx +34 -434
  100. package/src/components/Picker/PickerComponent.android.js +68 -0
  101. package/src/components/Picker/PickerComponent.android.tsx +101 -44
  102. package/src/components/Picker/PickerComponent.ios.js +78 -0
  103. package/src/components/Picker/PickerComponent.ios.tsx +116 -63
  104. package/src/components/Picker/PickerComponent.web.js +69 -0
  105. package/src/components/Picker/PickerComponent.web.tsx +102 -44
  106. package/src/components/Picker/PickerTypes.js +1 -0
  107. package/src/components/Picker/PickerTypes.ts +18 -0
  108. package/src/components/Portal/Portal.js +35 -0
  109. package/src/components/Portal/PortalConsumer.js +28 -0
  110. package/src/components/Portal/PortalHost.js +105 -0
  111. package/src/components/Portal/PortalManager.js +29 -0
  112. package/src/components/ProgressBar.js +118 -0
  113. package/src/components/ProgressCircle.js +13 -0
  114. package/src/components/ProgressIndicator.js +27 -0
  115. package/src/components/RadioButton/RadioButton.js +17 -0
  116. package/src/components/RadioButton/RadioButtonFieldGroup.js +17 -0
  117. package/src/components/RadioButton/RadioButtonGroup.js +43 -0
  118. package/src/components/RadioButton/RadioButtonRow.js +76 -0
  119. package/src/components/RadioButton/context.js +14 -0
  120. package/src/components/RadioButton/index.js +4 -0
  121. package/src/components/ResizeMode.js +1 -0
  122. package/src/components/Row.js +48 -0
  123. package/src/components/RowBodyIcon.js +8 -0
  124. package/src/components/RowHeadlineImageCaption.js +12 -0
  125. package/src/components/RowHeadlineImageIcon.js +14 -0
  126. package/src/components/ScreenContainer.js +34 -0
  127. package/src/components/Slider.js +63 -0
  128. package/src/components/StarRating.js +50 -0
  129. package/src/components/StepIndicator.js +346 -0
  130. package/src/components/Stepper.js +39 -0
  131. package/src/components/Surface.js +32 -0
  132. package/src/components/Swiper/Swiper.js +29 -0
  133. package/src/components/Swiper/SwiperItem.js +9 -0
  134. package/src/components/Swiper/index.js +2 -0
  135. package/src/components/Switch.js +56 -0
  136. package/src/components/Text.js +28 -0
  137. package/src/components/TextField.js +420 -0
  138. package/src/components/ToggleButton.js +39 -0
  139. package/src/components/Touchable.js +12 -0
  140. package/src/components/Touchable.web.js +2 -0
  141. package/src/components/Typography.js +36 -0
  142. package/src/components/useAuthState.js +31 -0
  143. package/src/constants.js +10 -0
  144. package/src/hooks.js +12 -0
  145. package/src/index.js +52 -0
  146. package/src/interfaces/Icon.js +8 -0
  147. package/src/mappings/Accordion.js +41 -0
  148. package/src/mappings/AccordionItem.js +16 -0
  149. package/src/mappings/ActionSheet.js +13 -0
  150. package/src/mappings/ActionSheetCancel.js +19 -0
  151. package/src/mappings/ActionSheetItem.js +23 -0
  152. package/src/mappings/ActivityIndicator.js +53 -0
  153. package/src/mappings/AudioPlayer.js +20 -0
  154. package/src/mappings/AvatarEdit.js +37 -0
  155. package/src/mappings/Banner.js +32 -0
  156. package/src/mappings/BlurView.js +41 -0
  157. package/src/mappings/Button.js +56 -0
  158. package/src/mappings/Card.js +52 -0
  159. package/src/mappings/CardBlock.js +122 -0
  160. package/src/mappings/CardContainer.js +102 -0
  161. package/src/mappings/CardContainerRating.js +124 -0
  162. package/src/mappings/CardContainerShortImage.js +118 -0
  163. package/src/mappings/CardInline.js +51 -0
  164. package/src/mappings/Carousel.js +18 -0
  165. package/src/mappings/Checkbox.js +45 -0
  166. package/src/mappings/CheckboxGroup.js +25 -0
  167. package/src/mappings/CheckboxRow.js +56 -0
  168. package/src/mappings/CircleImage.js +24 -0
  169. package/src/mappings/Container.js +29 -0
  170. package/src/mappings/CustomCode.js +8 -0
  171. package/src/mappings/DatePicker.js +146 -0
  172. package/src/mappings/Divider.js +26 -0
  173. package/src/mappings/FAB.js +36 -0
  174. package/src/mappings/Fetch.js +12 -0
  175. package/src/mappings/FieldSearchBarFull.js +49 -0
  176. package/src/mappings/FlatList.js +19 -0
  177. package/src/mappings/HeaderLarge.js +28 -0
  178. package/src/mappings/HeaderMedium.js +54 -0
  179. package/src/mappings/HeaderOverline.js +54 -0
  180. package/src/mappings/Icon.js +25 -0
  181. package/src/mappings/IconButton.js +30 -0
  182. package/src/mappings/Image.js +15 -0
  183. package/src/mappings/ImageBackground.js +28 -0
  184. package/src/mappings/KeyboardAvoidingView.js +40 -0
  185. package/src/mappings/KeyboardAwareScrollView.js +49 -0
  186. package/src/mappings/Layout.js +195 -0
  187. package/src/mappings/LinearGradient.js +77 -0
  188. package/src/mappings/MapCallout.js +21 -0
  189. package/src/mappings/MapMarker.js +47 -0
  190. package/src/mappings/MapView.js +138 -0
  191. package/src/mappings/Modal.js +41 -0
  192. package/src/mappings/Picker.js +137 -0
  193. package/src/mappings/Picker.ts +0 -4
  194. package/src/mappings/ProgressBar.js +100 -0
  195. package/src/mappings/ProgressCircle.js +108 -0
  196. package/src/mappings/ProgressIndicator.js +180 -0
  197. package/src/mappings/RadioButton.js +50 -0
  198. package/src/mappings/RadioButtonGroup.js +16 -0
  199. package/src/mappings/RadioButtonRow.js +37 -0
  200. package/src/mappings/RowBodyIcon.js +75 -0
  201. package/src/mappings/RowHeadlineImageCaption.js +167 -0
  202. package/src/mappings/RowHeadlineImageIcon.js +99 -0
  203. package/src/mappings/SafeAreaView.js +33 -0
  204. package/src/mappings/ScrollView.js +30 -0
  205. package/src/mappings/Slider.js +59 -0
  206. package/src/mappings/StarRating.js +42 -0
  207. package/src/mappings/Stepper.js +28 -0
  208. package/src/mappings/Surface.js +13 -0
  209. package/src/mappings/Swiper.js +60 -0
  210. package/src/mappings/SwiperItem.js +8 -0
  211. package/src/mappings/Switch.js +75 -0
  212. package/src/mappings/Text.js +232 -0
  213. package/src/mappings/TextArea.js +52 -0
  214. package/src/mappings/TextField.js +158 -0
  215. package/src/mappings/TextInput.js +208 -0
  216. package/src/mappings/ToggleButton.js +45 -0
  217. package/src/mappings/Touchable.js +12 -0
  218. package/src/mappings/Video.js +74 -0
  219. package/src/mappings/View.js +206 -0
  220. package/src/mappings/WebView.js +18 -0
  221. package/src/styles/DarkTheme.js +26 -0
  222. package/src/styles/DefaultTheme.js +111 -0
  223. package/src/styles/fonts.js +62 -0
  224. package/src/styles/overlay.js +60 -0
  225. package/src/styles/shadow.js +51 -0
  226. package/src/theming.js +3 -0
  227. package/src/utilities.js +54 -0
  228. package/src/utilities.ts +1 -65
@@ -1,79 +1,31 @@
1
1
  import * as React from "react";
2
- import {
3
- View,
4
- StyleSheet,
5
- Text,
6
- // Platform,
7
- ViewStyle,
8
- StyleProp,
9
- Dimensions,
10
- } from "react-native";
11
- import { omit, pickBy, identity, isObject } from "lodash";
12
- // import { SafeAreaView } from "react-native-safe-area-context";
13
- // import { Picker as NativePicker } from "@react-native-picker/picker";
14
-
15
2
  import { withTheme } from "../../theming";
16
- // import Portal from "../Portal/Portal";
17
- // import Button from "../DeprecatedButton";
18
- import Touchable from "../Touchable";
19
- import type { Theme } from "../../styles/DefaultTheme";
20
- import type { IconSlot } from "../../interfaces/Icon";
21
- import {
22
- extractStyles,
23
- extractBorderAndMarginStyles,
24
- borderStyleNames,
25
- marginStyleNames,
26
- } from "../../utilities";
27
- // @ts-expect-error
28
- import { PickerComponent } from "./PickerComponent";
29
-
30
- export interface PickerOption {
31
- value: string;
32
- label: string;
33
- }
3
+ //@ts-ignore
4
+ import PickerComponent from "./PickerComponent"; //unable to find file due to using .android/.web/.ios
5
+ import { PickerComponentProps, PickerOption } from "./PickerTypes";
34
6
 
35
- export type PickerProps = {
36
- error?: any;
7
+ type Props = PickerComponentProps & {
37
8
  placeholder?: string;
38
- disabled?: boolean;
39
- style?: StyleProp<ViewStyle> & { height?: number };
40
9
  value?: string;
41
10
  options: PickerOption[] | string[];
42
- onValueChange: (value: string, index: number) => void;
43
- defaultValue?: string;
44
- assistiveText?: string;
45
- label?: string;
46
- iconColor?: string;
47
- iconSize?: number;
48
- leftIconMode?: "inset" | "outset";
49
- leftIconName?: string;
50
- placeholderTextColor?: string;
51
- rightIconName?: string;
52
- type?: "solid" | "underline";
53
- theme: Theme;
54
- Icon: IconSlot["Icon"];
55
11
  };
56
12
 
57
- function normalizeOptions(options: PickerProps["options"]): PickerOption[] {
13
+ function normalizeOptions(options: Props["options"]): PickerOption[] {
58
14
  if (options.length === 0) {
59
15
  return [];
60
16
  }
61
17
 
62
- if (typeof options[0] === ("string" || "number")) {
18
+ if (typeof options[0] === "string") {
63
19
  return (options as string[]).map((option) => ({
64
- label: String(option),
20
+ label: option,
65
21
  value: String(option),
66
22
  }));
67
23
  }
68
24
 
69
- if (
70
- isObject(options[0]) &&
71
- options[0].value !== null &&
72
- options[0].label !== null
73
- ) {
74
- return (options as PickerOption[]).map((option) => {
25
+ if (options[0].label && options[0].value) {
26
+ return options.map((option) => {
75
27
  return {
76
- label: String(option.label),
28
+ label: option.label,
77
29
  value: String(option.value),
78
30
  };
79
31
  });
@@ -84,45 +36,18 @@ function normalizeOptions(options: PickerProps["options"]): PickerOption[] {
84
36
  );
85
37
  }
86
38
 
87
- const { width: deviceWidth, height: deviceHeight } = Dimensions.get("screen");
88
- // const isIos = Platform.OS === "ios";
89
- const unstyledColor = "rgba(165, 173, 183, 1)";
90
- const disabledColor = "rgb(240, 240, 240)";
91
- const errorColor = "rgba(255, 69, 100, 1)";
92
-
93
- const Picker: React.FC<PickerProps> = ({
94
- error,
39
+ const Picker: React.FC<Props> = ({
95
40
  options = [],
96
- onValueChange,
97
- defaultValue,
98
- Icon,
99
- style,
100
41
  placeholder,
42
+ onValueChange: onValueChangeOverride,
101
43
  value,
102
- disabled = false,
103
- // theme,
104
- assistiveText,
105
- label,
106
- iconColor = unstyledColor,
107
- iconSize = 24,
108
- leftIconMode = "inset",
109
- leftIconName,
110
- placeholderTextColor = unstyledColor,
111
- rightIconName,
112
- type = "solid",
44
+ defaultValue,
45
+ ...props
113
46
  }) => {
114
- const androidPickerRef = React.useRef<any | undefined>(undefined);
115
-
116
47
  const [internalValue, setInternalValue] = React.useState<string | undefined>(
117
48
  value || defaultValue
118
49
  );
119
50
 
120
- const [pickerVisible, setPickerVisible] = React.useState(false);
121
-
122
- const togglePickerVisible = () => {
123
- setPickerVisible(!pickerVisible);
124
- };
125
-
126
51
  React.useEffect(() => {
127
52
  if (value != null) {
128
53
  setInternalValue(value);
@@ -135,11 +60,16 @@ const Picker: React.FC<PickerProps> = ({
135
60
  }
136
61
  }, [defaultValue]);
137
62
 
138
- React.useEffect(() => {
139
- if (pickerVisible && androidPickerRef.current) {
140
- androidPickerRef?.current?.focus();
141
- }
142
- }, [pickerVisible, androidPickerRef]);
63
+ const onValueChange = React.useCallback(
64
+ (itemValue: string, itemIndex: number) => {
65
+ if (placeholder && itemIndex === 0) {
66
+ return;
67
+ }
68
+ onValueChangeOverride &&
69
+ onValueChangeOverride(String(itemValue), itemIndex);
70
+ },
71
+ [placeholder, onValueChangeOverride]
72
+ );
143
73
 
144
74
  const normalizedOptions = normalizeOptions(options);
145
75
 
@@ -147,352 +77,22 @@ const Picker: React.FC<PickerProps> = ({
147
77
  ? [{ value: placeholder, label: placeholder }, ...normalizedOptions]
148
78
  : normalizedOptions;
149
79
 
150
- // const { colors } = theme;
151
-
152
- const { viewStyles, textStyles } = extractStyles(style);
153
-
154
- const additionalBorderStyles = ["backgroundColor"];
155
-
156
- const additionalMarginStyles = [
157
- "bottom",
158
- "height",
159
- "left",
160
- "maxHeight",
161
- "maxWidth",
162
- "minHeight",
163
- "minWidth",
164
- "overflow",
165
- "position",
166
- "right",
167
- "top",
168
- "width",
169
- "zIndex",
170
- ];
171
-
172
- const {
173
- borderStyles: extractedBorderStyles,
174
- marginStyles: extractedMarginStyles,
175
- } = extractBorderAndMarginStyles(
176
- viewStyles,
177
- additionalBorderStyles,
178
- additionalMarginStyles
179
- );
180
-
181
- const borderStyles = {
182
- ...{
183
- ...(type === "solid"
184
- ? {
185
- borderTopLeftRadius: 5,
186
- borderTopRightRadius: 5,
187
- borderBottomRightRadius: 5,
188
- borderBottomLeftRadius: 5,
189
- borderTopWidth: 1,
190
- borderRightWidth: 1,
191
- borderLeftWidth: 1,
192
- }
193
- : {}),
194
- borderBottomWidth: 1,
195
- borderColor: unstyledColor,
196
- borderStyle: "solid",
197
- },
198
- ...extractedBorderStyles,
199
- ...(error ? { borderColor: errorColor } : {}),
200
- ...(disabled
201
- ? { borderColor: "transparent", backgroundColor: disabledColor }
202
- : {}),
203
- };
204
-
205
- const marginStyles = {
206
- height: 60,
207
- ...extractedMarginStyles,
208
- };
209
-
210
- const stylesWithoutBordersAndMargins = omit(viewStyles, [
211
- ...borderStyleNames,
212
- ...marginStyleNames,
213
- ...additionalBorderStyles,
214
- ...additionalMarginStyles,
215
- ]);
216
-
217
- const selectedLabel =
218
- internalValue &&
219
- ((pickerOptions as unknown as PickerOption[]).find(
220
- (option) => option.value === internalValue
221
- )?.label ??
222
- internalValue);
223
-
224
- const labelText = label ? (
225
- <Text
226
- style={{
227
- textAlign: textStyles.textAlign,
228
- color: unstyledColor,
229
- fontSize: 12,
230
- paddingBottom: 4,
231
- }}
232
- >
233
- {label}
234
- </Text>
235
- ) : null;
236
-
237
- const leftIconOutset = leftIconMode === "outset";
238
-
239
- const leftIcon = leftIconName ? (
240
- <Icon
241
- name={leftIconName}
242
- color={disabled ? unstyledColor : iconColor}
243
- size={iconSize}
244
- style={{
245
- marginRight: 4,
246
- marginLeft: 4,
247
- }}
248
- />
249
- ) : null;
250
-
251
- const rightIcon = rightIconName ? (
252
- <Icon
253
- name={rightIconName}
254
- color={disabled ? unstyledColor : iconColor}
255
- size={iconSize}
256
- style={{
257
- marginRight: -10,
258
- marginLeft: 8,
259
- }}
260
- />
261
- ) : null;
262
-
263
- const textAlign = textStyles?.textAlign;
264
-
265
- const calculateLeftPadding = () => {
266
- if (leftIconOutset) {
267
- if (textAlign === "center") {
268
- return iconSize - Math.abs(8 - iconSize);
269
- }
270
-
271
- return iconSize + 8;
272
- }
273
-
274
- return 0;
275
- };
276
-
277
- const assistiveTextLabel = assistiveText ? (
278
- <Text
279
- style={{
280
- textAlign,
281
- width: "100%",
282
- paddingLeft: calculateLeftPadding(),
283
- color: unstyledColor,
284
- fontSize: 12,
285
- paddingTop: 4,
286
- }}
287
- >
288
- {assistiveText}
289
- </Text>
290
- ) : null;
291
-
292
- const primaryTextStyle = {
293
- color: unstyledColor,
294
- fontSize: 14,
295
- ...pickBy(textStyles, identity),
296
- ...(placeholder === internalValue ? { color: placeholderTextColor } : {}),
297
- ...(disabled ? { color: unstyledColor } : {}),
298
- };
299
-
300
80
  const handleValueChange = (newValue: string, itemIndex: number) => {
301
- if (!placeholder || itemIndex > 0) {
302
- onValueChange?.(newValue, itemIndex);
303
- }
304
81
  setInternalValue(newValue);
82
+ if (onValueChange) {
83
+ onValueChange(newValue, itemIndex);
84
+ }
305
85
  };
306
86
 
307
87
  return (
308
- /* marginsContainer */
309
- <View style={[styles.marginsContainer, marginStyles]}>
310
- {/* touchableContainer */}
311
- <Touchable
312
- disabled={disabled}
313
- onPress={togglePickerVisible}
314
- style={styles.touchableContainer}
315
- >
316
- {/* outsetContainer */}
317
- <View
318
- pointerEvents="none"
319
- style={[
320
- styles.outsetContainer,
321
- stylesWithoutBordersAndMargins,
322
- !leftIconOutset ? (borderStyles as PickerProps["style"]) : {},
323
- ]}
324
- >
325
- {leftIcon}
326
-
327
- {/* insetContainer */}
328
- <View
329
- style={[
330
- styles.insetContainer,
331
- leftIconOutset ? (borderStyles as PickerProps["style"]) : {},
332
- ]}
333
- >
334
- {/* primaryTextContainer */}
335
- <View style={styles.primaryTextContainer}>
336
- {labelText}
337
-
338
- <Text style={primaryTextStyle}>
339
- {String(selectedLabel ?? placeholder)}
340
- </Text>
341
- </View>
342
-
343
- {rightIcon}
344
- </View>
345
- </View>
346
- {assistiveTextLabel}
347
- </Touchable>
348
-
349
- <View>
350
- {pickerVisible ? (
351
- <PickerComponent
352
- {...{
353
- Icon,
354
- androidPickerRef,
355
- togglePickerVisible,
356
- pickerOptions,
357
- internalValue,
358
- handleValueChange,
359
- }}
360
- />
361
- ) : null}
362
- </View>
363
-
364
- {/* iosPicker */}
365
- {/* isIos && pickerVisible ? (
366
- <Portal>
367
- <View
368
- style={[
369
- styles.iosPicker,
370
- {
371
- backgroundColor: colors.divider,
372
- },
373
- ]}
374
- >
375
- <SafeAreaView style={styles.iosSafeArea}>
376
- <Button
377
- Icon={Icon}
378
- type="text"
379
- onPress={togglePickerVisible}
380
- style={styles.iosButton}
381
- >
382
- {"Close"}
383
- </Button>
384
-
385
- <NativePicker
386
- style={styles.iosNativePicker}
387
- selectedValue={internalValue}
388
- onValueChange={handleValueChange}
389
- >
390
- {(pickerOptions as unknown as PickerOption[]).map((option) => (
391
- <NativePicker.Item
392
- label={option.label}
393
- value={option.value}
394
- key={option.value}
395
- />
396
- ))}
397
- </NativePicker>
398
- </SafeAreaView>
399
- </View>
400
- </Portal>
401
- ) : null */}
402
-
403
- {/* nonIosPicker */}
404
- {/* !isIos && pickerVisible ? (
405
- <NativePicker
406
- enabled={pickerVisible}
407
- selectedValue={internalValue}
408
- onValueChange={handleValueChange}
409
- style={styles.nonIosPicker}
410
- ref={androidPickerRef}
411
- onBlur={() => setPickerVisible(false)}
412
- >
413
- {(pickerOptions as unknown as PickerOption[]).map((option) => (
414
- <NativePicker.Item
415
- label={option.label}
416
- value={option.value}
417
- key={option.value}
418
- />
419
- ))}
420
- </NativePicker>
421
- ) : null */}
422
- </View>
88
+ <PickerComponent
89
+ {...props}
90
+ selectedValue={String(internalValue)}
91
+ placeholder={placeholder}
92
+ options={pickerOptions}
93
+ onValueChange={handleValueChange}
94
+ />
423
95
  );
424
96
  };
425
97
 
426
98
  export default withTheme(Picker);
427
-
428
- const styles = StyleSheet.create({
429
- marginsContainer: {
430
- alignSelf: "stretch",
431
- alignItems: "center",
432
- width: "100%",
433
- maxWidth: deviceWidth,
434
- },
435
- touchableContainer: {
436
- flex: 1,
437
- height: "100%",
438
- width: "100%",
439
- alignSelf: "stretch",
440
- alignItems: "center",
441
- backgroundColor: "pink", // TODO
442
- },
443
- outsetContainer: {
444
- flex: 1,
445
- height: "100%",
446
- width: "100%",
447
- flexDirection: "row",
448
- alignItems: "center",
449
- justifyContent: "space-between",
450
- },
451
- insetContainer: {
452
- flex: 1,
453
- height: "100%",
454
- width: "100%",
455
- flexDirection: "row",
456
- alignItems: "center",
457
- justifyContent: "space-between",
458
- paddingLeft: 12,
459
- paddingRight: 12,
460
- },
461
- primaryTextContainer: {
462
- flex: 1,
463
- },
464
- iosPicker: {
465
- position: "absolute",
466
- bottom: 0,
467
- left: 0,
468
- right: 0,
469
- flexDirection: "row",
470
- justifyContent: "center",
471
- width: "100%",
472
- maxWidth: deviceWidth,
473
- maxHeight: deviceHeight,
474
- },
475
- iosSafeArea: {
476
- backgroundColor: "white",
477
- flexDirection: "column",
478
- width: "100%",
479
- maxWidth: deviceWidth,
480
- },
481
- iosButton: {
482
- alignSelf: "flex-end",
483
- },
484
- iosNativePicker: {
485
- backgroundColor: "white",
486
- },
487
- nonIosPicker: {
488
- opacity: 0,
489
- position: "absolute",
490
- top: 0,
491
- left: 0,
492
- right: 0,
493
- bottom: 0,
494
- width: "100%",
495
- maxWidth: deviceWidth,
496
- maxHeight: deviceHeight,
497
- },
498
- });
@@ -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);