@draftbit/core 47.0.0-alpha.1 → 47.0.0-ba694d.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 (124) hide show
  1. package/lib/commonjs/components/Stepper.js +1 -0
  2. package/lib/commonjs/mappings/View.js.map +1 -1
  3. package/lib/commonjs/mappings/WebView.js.map +1 -1
  4. package/lib/module/components/Stepper.js +1 -0
  5. package/package.json +3 -3
  6. package/src/Provider.js +9 -0
  7. package/src/components/Accordion/AccordionGroup.js +44 -0
  8. package/src/components/Accordion/AccordionItem.js +32 -0
  9. package/src/components/Accordion/index.js +2 -0
  10. package/src/components/ActionSheet/ActionSheet.js +45 -0
  11. package/src/components/ActionSheet/ActionSheetCancel.js +6 -0
  12. package/src/components/ActionSheet/ActionSheetItem.js +30 -0
  13. package/src/components/ActionSheet/index.js +3 -0
  14. package/src/components/Banner.js +109 -0
  15. package/src/components/Button.js +114 -0
  16. package/src/components/Checkbox/Checkbox.js +63 -0
  17. package/src/components/Checkbox/CheckboxGroup.js +21 -0
  18. package/src/components/Checkbox/CheckboxGroupRow.js +77 -0
  19. package/src/components/Checkbox/CheckboxRow.js +78 -0
  20. package/src/components/Checkbox/context.js +14 -0
  21. package/src/components/Checkbox/index.js +3 -0
  22. package/src/components/Config.js +64 -0
  23. package/src/components/DatePicker/DatePicker.js +368 -0
  24. package/src/components/DatePicker/DatePickerComponent.js +13 -0
  25. package/src/components/DatePicker/DatePickerComponent.web.js +30 -0
  26. package/src/components/DatePicker/DatePickerComponentType.js +1 -0
  27. package/src/components/DeprecatedButton.js +95 -0
  28. package/src/components/Elevation.js +20 -0
  29. package/src/components/FormRow.js +19 -0
  30. package/src/components/IconButton.js +35 -0
  31. package/src/components/Layout.js +50 -0
  32. package/src/components/NumberInput.js +49 -0
  33. package/src/components/Picker/Picker.js +267 -0
  34. package/src/components/Picker/PickerComponent.android.js +69 -0
  35. package/src/components/Picker/PickerComponent.ios.js +79 -0
  36. package/src/components/Picker/PickerComponent.web.js +70 -0
  37. package/src/components/Picker/PickerTypes.js +1 -0
  38. package/src/components/Portal/Portal.js +35 -0
  39. package/src/components/Portal/PortalConsumer.js +27 -0
  40. package/src/components/Portal/PortalHost.js +107 -0
  41. package/src/components/Portal/PortalManager.js +32 -0
  42. package/src/components/RadioButton/RadioButton.js +17 -0
  43. package/src/components/RadioButton/RadioButtonFieldGroup.js +17 -0
  44. package/src/components/RadioButton/RadioButtonGroup.js +43 -0
  45. package/src/components/RadioButton/RadioButtonRow.js +76 -0
  46. package/src/components/RadioButton/context.js +14 -0
  47. package/src/components/RadioButton/index.js +4 -0
  48. package/src/components/SVG.js +13 -0
  49. package/src/components/ScreenContainer.js +34 -0
  50. package/src/components/Slider.js +63 -0
  51. package/src/components/StarRating.js +50 -0
  52. package/src/components/Stepper.js +39 -0
  53. package/src/components/Surface.js +32 -0
  54. package/src/components/Swiper/Swiper.js +29 -0
  55. package/src/components/Swiper/SwiperItem.js +9 -0
  56. package/src/components/Swiper/index.js +2 -0
  57. package/src/components/Switch.js +56 -0
  58. package/src/components/Text.js +33 -0
  59. package/src/components/TextField.js +428 -0
  60. package/src/components/Touchable.js +12 -0
  61. package/src/components/Touchable.web.js +2 -0
  62. package/src/constants.js +10 -0
  63. package/src/hooks.js +12 -0
  64. package/src/index.js +35 -0
  65. package/src/interfaces/Icon.js +8 -0
  66. package/src/mappings/Accordion.js +41 -0
  67. package/src/mappings/AccordionItem.js +16 -0
  68. package/src/mappings/ActionSheet.js +13 -0
  69. package/src/mappings/ActionSheetCancel.js +19 -0
  70. package/src/mappings/ActionSheetItem.js +23 -0
  71. package/src/mappings/ActivityIndicator.js +58 -0
  72. package/src/mappings/AudioPlayer.js +20 -0
  73. package/src/mappings/BlurView.js +42 -0
  74. package/src/mappings/Button.js +87 -0
  75. package/src/mappings/Checkbox.js +46 -0
  76. package/src/mappings/CheckboxGroup.js +26 -0
  77. package/src/mappings/CheckboxRow.js +61 -0
  78. package/src/mappings/CustomCode.js +8 -0
  79. package/src/mappings/DatePicker.js +157 -0
  80. package/src/mappings/Fetch.js +13 -0
  81. package/src/mappings/FlashList.js +33 -0
  82. package/src/mappings/FlatList.js +24 -0
  83. package/src/mappings/Icon.js +32 -0
  84. package/src/mappings/IconButton.js +35 -0
  85. package/src/mappings/Image.js +35 -0
  86. package/src/mappings/ImageBackground.js +29 -0
  87. package/src/mappings/KeyboardAvoidingView.js +41 -0
  88. package/src/mappings/KeyboardAwareScrollView.js +50 -0
  89. package/src/mappings/Layout.js +200 -0
  90. package/src/mappings/LinearGradient.js +77 -0
  91. package/src/mappings/MapCallout.js +21 -0
  92. package/src/mappings/MapMarker.js +47 -0
  93. package/src/mappings/MapView.js +139 -0
  94. package/src/mappings/Modal.js +42 -0
  95. package/src/mappings/NumberInput.js +254 -0
  96. package/src/mappings/Picker.js +148 -0
  97. package/src/mappings/RadioButton.js +51 -0
  98. package/src/mappings/RadioButtonGroup.js +17 -0
  99. package/src/mappings/RadioButtonRow.js +42 -0
  100. package/src/mappings/SVG.js +20 -0
  101. package/src/mappings/SafeAreaView.js +33 -0
  102. package/src/mappings/ScrollView.js +31 -0
  103. package/src/mappings/Slider.js +60 -0
  104. package/src/mappings/StarRating.js +43 -0
  105. package/src/mappings/Stepper.js +29 -0
  106. package/src/mappings/Surface.js +14 -0
  107. package/src/mappings/Swiper.js +60 -0
  108. package/src/mappings/SwiperItem.js +8 -0
  109. package/src/mappings/Switch.js +81 -0
  110. package/src/mappings/Text.js +251 -0
  111. package/src/mappings/TextArea.js +263 -0
  112. package/src/mappings/TextField.js +381 -0
  113. package/src/mappings/TextInput.js +391 -0
  114. package/src/mappings/Touchable.js +17 -0
  115. package/src/mappings/Video.js +81 -0
  116. package/src/mappings/View.js +207 -0
  117. package/src/mappings/WebView.js +88 -0
  118. package/src/styles/DarkTheme.js +26 -0
  119. package/src/styles/DefaultTheme.js +111 -0
  120. package/src/styles/fonts.js +62 -0
  121. package/src/styles/overlay.js +60 -0
  122. package/src/styles/shadow.js +51 -0
  123. package/src/theming.js +3 -0
  124. package/src/utilities.js +102 -0
@@ -0,0 +1,20 @@
1
+ import * as React from "react";
2
+ import { Animated, StyleSheet, View, } from "react-native";
3
+ import shadow from "../styles/shadow";
4
+ import { withTheme } from "../theming";
5
+ /* directly copied from https://github.com/callstack/react-native-paper/blob/main/src/components/Surface.tsx#L62 */
6
+ const Elevation = ({ style, theme, children, ...rest }) => {
7
+ const { elevation = 4, borderRadius: radius } = StyleSheet.flatten(style) || {};
8
+ const { colors } = theme;
9
+ const borderRadius = radius;
10
+ return (React.createElement(Animated.View, { ...rest, style: [
11
+ {
12
+ borderRadius,
13
+ backgroundColor: colors.surface,
14
+ },
15
+ elevation ? shadow(elevation) : null,
16
+ style,
17
+ ] },
18
+ React.createElement(View, { style: { overflow: "hidden", borderRadius } }, children)));
19
+ };
20
+ export default withTheme(Elevation);
@@ -0,0 +1,19 @@
1
+ import * as React from "react";
2
+ import { Text, StyleSheet } from "react-native";
3
+ import { extractStyles } from "../utilities";
4
+ import Touchable from "./Touchable";
5
+ export default function FormRow({ disabled, direction, children, label, style, onPress, ...rest }) {
6
+ const { textStyles, viewStyles } = extractStyles(style);
7
+ return (React.createElement(Touchable, { disabled: disabled, onPress: onPress, style: [styles.row, { flexDirection: direction }, viewStyles], ...rest },
8
+ React.createElement(Text, { style: textStyles }, label),
9
+ children));
10
+ }
11
+ const styles = StyleSheet.create({
12
+ row: {
13
+ marginLeft: 8,
14
+ marginRight: 8,
15
+ flexDirection: "row",
16
+ justifyContent: "space-between",
17
+ alignItems: "center",
18
+ },
19
+ });
@@ -0,0 +1,35 @@
1
+ import * as React from "react";
2
+ import { View, StyleSheet, ActivityIndicator, Pressable, Platform, } from "react-native";
3
+ import { withTheme } from "../theming";
4
+ const IconButton = ({ Icon, icon, color: customColor, size = 32, disabled = false, loading = false, onPress, theme, style, ...props }) => {
5
+ const iconColor = customColor || theme.colors.primary;
6
+ return (React.createElement(Pressable, { onPress: onPress, disabled: disabled || loading, style: ({ pressed }) => {
7
+ return [
8
+ styles.container,
9
+ {
10
+ opacity: pressed || disabled ? 0.75 : 1,
11
+ width: size,
12
+ height: size,
13
+ alignItems: "center",
14
+ justifyContent: "center",
15
+ },
16
+ style,
17
+ ];
18
+ }, ...props },
19
+ React.createElement(View, null,
20
+ icon && !loading ? (React.createElement(Icon, { name: icon, size: size - 2, color: iconColor })) : null,
21
+ loading ? React.createElement(ActivityIndicator, { size: "small", color: iconColor }) : null)));
22
+ };
23
+ const styles = StyleSheet.create({
24
+ container: {
25
+ alignItems: "center",
26
+ justifyContent: "center",
27
+ ...Platform.select({
28
+ web: {
29
+ cursor: "pointer",
30
+ userSelect: "none",
31
+ },
32
+ }),
33
+ },
34
+ });
35
+ export default withTheme(IconButton);
@@ -0,0 +1,50 @@
1
+ import * as React from "react";
2
+ import { View } from "react-native";
3
+ export function Center({ width = 240, height = 200, children, bgColor, style, ...rest }) {
4
+ return (React.createElement(View, { style: [
5
+ {
6
+ justifyContent: "center",
7
+ alignItems: "center",
8
+ width,
9
+ height,
10
+ backgroundColor: bgColor,
11
+ },
12
+ style,
13
+ ], ...rest }, children));
14
+ }
15
+ export function Circle({ size = 50, bgColor, children, style, ...rest }) {
16
+ const borderRadius = 1000;
17
+ return (React.createElement(Center, { width: size, height: size, bgColor: bgColor, style: [
18
+ style,
19
+ { backgroundColor: bgColor, borderRadius, overflow: "hidden" },
20
+ ], ...rest }, children));
21
+ }
22
+ export function Square({ size = 50, bgColor, children, style, ...rest }) {
23
+ return (React.createElement(Center, { style: style, width: size, height: size, bgColor: bgColor, ...rest }, children));
24
+ }
25
+ export function Row({ justifyContent, alignItems, children, style, ...rest }) {
26
+ return (React.createElement(View, { style: [
27
+ style,
28
+ {
29
+ alignItems,
30
+ flexDirection: "row",
31
+ justifyContent: justifyContent,
32
+ },
33
+ ], ...rest }, children));
34
+ }
35
+ export function Spacer({ top = 8, right = 8, bottom = 8, left = 8, children, style, ...rest }) {
36
+ return (React.createElement(View, { style: [
37
+ style,
38
+ {
39
+ paddingRight: right,
40
+ paddingTop: top,
41
+ paddingLeft: left,
42
+ paddingBottom: bottom,
43
+ },
44
+ ], ...rest }, children));
45
+ }
46
+ export function Stack({ children, justifyContent = "flex-start", alignItems = "flex-start", style, ...rest }) {
47
+ return (
48
+ // style must go first since we don't want justifyContent, alignItems overridden
49
+ React.createElement(View, { style: [style, { justifyContent, alignItems }], ...rest }, children));
50
+ }
@@ -0,0 +1,49 @@
1
+ import React, { useEffect, useState } from "react";
2
+ import { TextInput } from "react-native";
3
+ import { isString, isNumber, isNaN } from "lodash";
4
+ const NumberInput = ({ onChangeText, value, defaultValue, ...props }) => {
5
+ const [currentStringNumberValue, setCurrentStringNumberValue] = useState("0");
6
+ const formatValueToStringNumber = (valueToFormat) => {
7
+ if (valueToFormat != null) {
8
+ if (isString(valueToFormat) && valueToFormat !== "") {
9
+ if (/^0[1-9]$/.test(valueToFormat)) {
10
+ return valueToFormat.slice(1);
11
+ }
12
+ else if (/^[+-]?([0-9]+\.?[0-9]*|\.[0-9]+)$/.test(valueToFormat)) {
13
+ return valueToFormat;
14
+ }
15
+ else {
16
+ return currentStringNumberValue;
17
+ }
18
+ }
19
+ else if (isNumber(valueToFormat) && !isNaN(valueToFormat)) {
20
+ return valueToFormat.toString();
21
+ }
22
+ }
23
+ return "0";
24
+ };
25
+ // set currentStringNumberValue as defaultValue prop if there is a differnce on first render only
26
+ useEffect(() => {
27
+ const defaultStringNumberValue = formatValueToStringNumber(defaultValue);
28
+ if (currentStringNumberValue !== defaultStringNumberValue) {
29
+ setCurrentStringNumberValue(defaultStringNumberValue);
30
+ }
31
+ // eslint-disable-next-line react-hooks/exhaustive-deps
32
+ }, []);
33
+ const handleChangeText = (newValue) => {
34
+ const newStringNumberValue = formatValueToStringNumber(newValue);
35
+ const number = parseFloat(newStringNumberValue);
36
+ setCurrentStringNumberValue(newStringNumberValue);
37
+ onChangeText === null || onChangeText === void 0 ? void 0 : onChangeText(number);
38
+ };
39
+ // run handleChangeText with value prop only when value prop changes (and first render to reset currentStringNumberValue)
40
+ useEffect(() => {
41
+ const nextStringNumberValue = formatValueToStringNumber(value);
42
+ if (currentStringNumberValue !== nextStringNumberValue) {
43
+ handleChangeText(nextStringNumberValue);
44
+ }
45
+ // eslint-disable-next-line react-hooks/exhaustive-deps
46
+ }, [value]);
47
+ return (React.createElement(TextInput, { keyboardType: "numeric", value: currentStringNumberValue, onChangeText: handleChangeText, ...props }));
48
+ };
49
+ export default NumberInput;
@@ -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
+ var _a, _b;
40
+ const androidPickerRef = React.useRef(undefined);
41
+ const [internalValue, setInternalValue] = React.useState(value || defaultValue);
42
+ const [pickerVisible, setPickerVisible] = React.useState(false);
43
+ const togglePickerVisible = () => {
44
+ setPickerVisible(!pickerVisible);
45
+ };
46
+ React.useEffect(() => {
47
+ if (value != null) {
48
+ setInternalValue(value);
49
+ }
50
+ }, [value]);
51
+ React.useEffect(() => {
52
+ if (defaultValue != null) {
53
+ setInternalValue(defaultValue);
54
+ }
55
+ }, [defaultValue]);
56
+ React.useEffect(() => {
57
+ var _a;
58
+ if (pickerVisible && androidPickerRef.current) {
59
+ (_a = androidPickerRef === null || androidPickerRef === void 0 ? void 0 : androidPickerRef.current) === null || _a === void 0 ? void 0 : _a.focus();
60
+ }
61
+ }, [pickerVisible, androidPickerRef]);
62
+ const normalizedOptions = normalizeOptions(options);
63
+ const pickerOptions = placeholder
64
+ ? [{ value: placeholder, label: placeholder }, ...normalizedOptions]
65
+ : normalizedOptions;
66
+ const { colors } = theme;
67
+ const { viewStyles, textStyles } = extractStyles(style);
68
+ const additionalBorderStyles = ["backgroundColor"];
69
+ const additionalMarginStyles = [
70
+ "bottom",
71
+ "height",
72
+ "left",
73
+ "maxHeight",
74
+ "maxWidth",
75
+ "minHeight",
76
+ "minWidth",
77
+ "overflow",
78
+ "position",
79
+ "right",
80
+ "top",
81
+ "width",
82
+ "zIndex",
83
+ ];
84
+ const { borderStyles: extractedBorderStyles, marginStyles: extractedMarginStyles, } = extractBorderAndMarginStyles(viewStyles, additionalBorderStyles, additionalMarginStyles);
85
+ const borderStyles = {
86
+ ...{
87
+ ...(type === "solid"
88
+ ? {
89
+ borderTopLeftRadius: 5,
90
+ borderTopRightRadius: 5,
91
+ borderBottomRightRadius: 5,
92
+ borderBottomLeftRadius: 5,
93
+ borderTopWidth: 1,
94
+ borderRightWidth: 1,
95
+ borderLeftWidth: 1,
96
+ }
97
+ : {}),
98
+ borderBottomWidth: 1,
99
+ borderColor: unstyledColor,
100
+ borderStyle: "solid",
101
+ },
102
+ ...extractedBorderStyles,
103
+ ...(error ? { borderColor: errorColor } : {}),
104
+ ...(disabled
105
+ ? { borderColor: "transparent", backgroundColor: disabledColor }
106
+ : {}),
107
+ };
108
+ const marginStyles = {
109
+ height: 60,
110
+ ...extractedMarginStyles,
111
+ };
112
+ const stylesWithoutBordersAndMargins = omit(viewStyles, [
113
+ ...borderStyleNames,
114
+ ...marginStyleNames,
115
+ ...additionalBorderStyles,
116
+ ...additionalMarginStyles,
117
+ ]);
118
+ const selectedLabel = internalValue &&
119
+ ((_b = (_a = pickerOptions.find((option) => option.value === internalValue)) === null || _a === void 0 ? void 0 : _a.label) !== null && _b !== void 0 ? _b : internalValue);
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 === null || textStyles === void 0 ? void 0 : 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 === null || onValueChange === void 0 ? void 0 : 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 !== null && selectedLabel !== void 0 ? selectedLabel : placeholder))),
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
+ const styles = StyleSheet.create({
198
+ marginsContainer: {
199
+ alignSelf: "stretch",
200
+ alignItems: "center",
201
+ width: "100%",
202
+ maxWidth: deviceWidth,
203
+ },
204
+ touchableContainer: {
205
+ flex: 1,
206
+ height: "100%",
207
+ width: "100%",
208
+ alignSelf: "stretch",
209
+ alignItems: "center",
210
+ },
211
+ outsetContainer: {
212
+ flex: 1,
213
+ height: "100%",
214
+ width: "100%",
215
+ flexDirection: "row",
216
+ alignItems: "center",
217
+ justifyContent: "space-between",
218
+ },
219
+ insetContainer: {
220
+ flex: 1,
221
+ height: "100%",
222
+ width: "100%",
223
+ flexDirection: "row",
224
+ alignItems: "center",
225
+ justifyContent: "space-between",
226
+ paddingLeft: 12,
227
+ paddingRight: 12,
228
+ },
229
+ primaryTextContainer: {
230
+ flex: 1,
231
+ },
232
+ iosPicker: {
233
+ position: "absolute",
234
+ bottom: 0,
235
+ left: 0,
236
+ right: 0,
237
+ flexDirection: "row",
238
+ justifyContent: "center",
239
+ width: "100%",
240
+ maxWidth: deviceWidth,
241
+ maxHeight: deviceHeight,
242
+ },
243
+ iosSafeArea: {
244
+ backgroundColor: "white",
245
+ flexDirection: "column",
246
+ width: "100%",
247
+ maxWidth: deviceWidth,
248
+ },
249
+ iosButton: {
250
+ alignSelf: "flex-end",
251
+ },
252
+ iosNativePicker: {
253
+ backgroundColor: "white",
254
+ },
255
+ nonIosPicker: {
256
+ opacity: 0,
257
+ position: "absolute",
258
+ top: 0,
259
+ left: 0,
260
+ right: 0,
261
+ bottom: 0,
262
+ width: "100%",
263
+ maxWidth: deviceWidth,
264
+ maxHeight: deviceHeight,
265
+ },
266
+ });
267
+ export default withTheme(Picker);
@@ -0,0 +1,69 @@
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
+ var _a, _b;
11
+ const { viewStyles: { borderRadius, // eslint-disable-line @typescript-eslint/no-unused-vars
12
+ borderWidth, // eslint-disable-line @typescript-eslint/no-unused-vars
13
+ borderTopWidth, // eslint-disable-line @typescript-eslint/no-unused-vars
14
+ borderRightWidth, // eslint-disable-line @typescript-eslint/no-unused-vars
15
+ borderBottomWidth, // eslint-disable-line @typescript-eslint/no-unused-vars
16
+ borderLeftWidth, // eslint-disable-line @typescript-eslint/no-unused-vars
17
+ borderColor, // eslint-disable-line @typescript-eslint/no-unused-vars
18
+ backgroundColor, // eslint-disable-line @typescript-eslint/no-unused-vars
19
+ padding, // eslint-disable-line @typescript-eslint/no-unused-vars
20
+ paddingTop, // eslint-disable-line @typescript-eslint/no-unused-vars
21
+ paddingRight, // eslint-disable-line @typescript-eslint/no-unused-vars
22
+ paddingBottom, // eslint-disable-line @typescript-eslint/no-unused-vars
23
+ paddingLeft, // eslint-disable-line @typescript-eslint/no-unused-vars
24
+ ...viewStyles }, } = extractStyles(style);
25
+ const textField = React.useRef(undefined);
26
+ const onValueChange = (itemValue, itemIndex) => {
27
+ toggleFocus();
28
+ onValueChangeOverride(itemValue, itemIndex);
29
+ };
30
+ const toggleFocus = () => {
31
+ if (!disabled) {
32
+ // @ts-ignore
33
+ textField.current.toggleFocus(); // cannot determine if method exists due to component being wrapped in a withTheme()
34
+ }
35
+ };
36
+ const stylesWithoutMargin = style &&
37
+ omit(StyleSheet.flatten(style), [
38
+ "margin",
39
+ "marginTop",
40
+ "marginRight",
41
+ "marginBottom",
42
+ "marginLeft",
43
+ ]);
44
+ const selectedLabel = selectedValue &&
45
+ ((_b = (_a = options.find((o) => o.value === selectedValue)) === null || _a === void 0 ? void 0 : _a.label) !== null && _b !== void 0 ? _b : selectedValue);
46
+ return (React.createElement(Touchable, { disabled: disabled, onPress: toggleFocus, style: [styles.container, viewStyles] },
47
+ React.createElement(View, null,
48
+ React.createElement(NativePicker, { enabled: !disabled, selectedValue: selectedValue, onValueChange: onValueChange, style: {
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,79 @@
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
+ var _a, _b;
14
+ const { viewStyles: { borderRadius, // eslint-disable-line @typescript-eslint/no-unused-vars
15
+ borderWidth, // eslint-disable-line @typescript-eslint/no-unused-vars
16
+ borderTopWidth, // eslint-disable-line @typescript-eslint/no-unused-vars
17
+ borderRightWidth, // eslint-disable-line @typescript-eslint/no-unused-vars
18
+ borderBottomWidth, // eslint-disable-line @typescript-eslint/no-unused-vars
19
+ borderLeftWidth, // eslint-disable-line @typescript-eslint/no-unused-vars
20
+ borderColor, // eslint-disable-line @typescript-eslint/no-unused-vars
21
+ backgroundColor, // eslint-disable-line @typescript-eslint/no-unused-vars
22
+ padding, // eslint-disable-line @typescript-eslint/no-unused-vars
23
+ paddingTop, // eslint-disable-line @typescript-eslint/no-unused-vars
24
+ paddingRight, // eslint-disable-line @typescript-eslint/no-unused-vars
25
+ paddingBottom, // eslint-disable-line @typescript-eslint/no-unused-vars
26
+ paddingLeft, // eslint-disable-line @typescript-eslint/no-unused-vars
27
+ ...viewStyles }, } = extractStyles(style);
28
+ const textField = React.useRef(undefined);
29
+ const [pickerVisible, setIsPickerVisible] = React.useState(false);
30
+ const toggleVisibility = () => {
31
+ setIsPickerVisible(!pickerVisible);
32
+ // @ts-ignore
33
+ textField.current.toggleFocus(); // cannot determine if method exists due to component being wrapped in a withTheme()
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
+ ((_b = (_a = options.find((o) => o.value === selectedValue)) === null || _a === void 0 ? void 0 : _a.label) !== null && _b !== void 0 ? _b : selectedValue);
45
+ return (React.createElement(View, { style: [styles.container, viewStyles] },
46
+ React.createElement(Touchable, { disabled: disabled, onPress: toggleVisibility },
47
+ React.createElement(TextField, { ...props, value: String(selectedLabel), placeholder: placeholder,
48
+ // @ts-ignore
49
+ ref: textField, disabled: disabled, pointerEvents: "none",
50
+ // @ts-expect-error
51
+ style: stylesWithoutMargin, Icon: Icon })),
52
+ pickerVisible && (React.createElement(Portal, null,
53
+ React.createElement(View, { style: [styles.picker, { backgroundColor: colors.divider }] },
54
+ React.createElement(SafeAreaView, { style: styles.pickerContainer },
55
+ React.createElement(Button, { Icon: Icon, type: "text", onPress: toggleVisibility, style: styles.closeButton }, "Close"),
56
+ 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 }))))))))));
57
+ };
58
+ const styles = StyleSheet.create({
59
+ container: {
60
+ alignSelf: "stretch",
61
+ },
62
+ picker: {
63
+ position: "absolute",
64
+ bottom: 0,
65
+ left: 0,
66
+ right: 0,
67
+ flexDirection: "row",
68
+ justifyContent: "center",
69
+ },
70
+ pickerContainer: {
71
+ backgroundColor: "white",
72
+ flexDirection: "column",
73
+ width: "100%",
74
+ },
75
+ closeButton: {
76
+ alignSelf: "flex-end",
77
+ },
78
+ });
79
+ export default withTheme(Picker);
@@ -0,0 +1,70 @@
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
+ var _a, _b;
11
+ const { viewStyles: { borderRadius, // eslint-disable-line @typescript-eslint/no-unused-vars
12
+ borderWidth, // eslint-disable-line @typescript-eslint/no-unused-vars
13
+ borderTopWidth, // eslint-disable-line @typescript-eslint/no-unused-vars
14
+ borderRightWidth, // eslint-disable-line @typescript-eslint/no-unused-vars
15
+ borderBottomWidth, // eslint-disable-line @typescript-eslint/no-unused-vars
16
+ borderLeftWidth, // eslint-disable-line @typescript-eslint/no-unused-vars
17
+ borderColor, // eslint-disable-line @typescript-eslint/no-unused-vars
18
+ backgroundColor, // eslint-disable-line @typescript-eslint/no-unused-vars
19
+ padding, // eslint-disable-line @typescript-eslint/no-unused-vars
20
+ paddingTop, // eslint-disable-line @typescript-eslint/no-unused-vars
21
+ paddingRight, // eslint-disable-line @typescript-eslint/no-unused-vars
22
+ paddingBottom, // eslint-disable-line @typescript-eslint/no-unused-vars
23
+ paddingLeft, // eslint-disable-line @typescript-eslint/no-unused-vars
24
+ ...viewStyles }, } = extractStyles(style);
25
+ const textField = React.useRef(undefined);
26
+ const onValueChange = (itemValue, itemIndex) => {
27
+ toggleFocus();
28
+ onValueChangeOverride(itemValue, itemIndex);
29
+ };
30
+ const toggleFocus = () => {
31
+ if (!disabled) {
32
+ // @ts-ignore
33
+ textField.current.toggleFocus(); // cannot determine if method exists due to component being wrapped in a withTheme()
34
+ }
35
+ };
36
+ const stylesWithoutMargin = style &&
37
+ omit(StyleSheet.flatten(style), [
38
+ "margin",
39
+ "marginTop",
40
+ "marginRight",
41
+ "marginBottom",
42
+ "marginLeft",
43
+ ]);
44
+ const selectedLabel = selectedValue &&
45
+ ((_b = (_a = options.find((o) => o.value === selectedValue)) === null || _a === void 0 ? void 0 : _a.label) !== null && _b !== void 0 ? _b : selectedValue);
46
+ return (React.createElement(Touchable, { disabled: disabled, onPress: toggleFocus, style: [styles.container, viewStyles] },
47
+ React.createElement(View, null,
48
+ React.createElement(NativePicker, { enabled: !disabled, selectedValue: selectedValue, onValueChange: onValueChange, style: {
49
+ flex: 1,
50
+ opacity: 0,
51
+ position: "absolute",
52
+ top: 0,
53
+ left: 0,
54
+ right: 0,
55
+ bottom: 0,
56
+ width: "100%",
57
+ } }, options.map((o) => (React.createElement(NativePicker.Item, { label: o.label, value: o.value, key: o.value })))),
58
+ React.createElement(View, { pointerEvents: "none" },
59
+ React.createElement(TextField, { ...props, value: selectedLabel, placeholder: placeholder,
60
+ // @ts-ignore
61
+ ref: textField, disabled: disabled,
62
+ // @ts-expect-error
63
+ style: stylesWithoutMargin })))));
64
+ };
65
+ const styles = StyleSheet.create({
66
+ container: {
67
+ alignSelf: "stretch",
68
+ },
69
+ });
70
+ export default withTheme(Picker);
@@ -0,0 +1 @@
1
+ export {};