@draftbit/core 47.0.0-alpha.0 → 47.0.0-df8093.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 (138) hide show
  1. package/lib/commonjs/components/Banner.js +168 -0
  2. package/lib/commonjs/components/Banner.js.map +1 -0
  3. package/lib/commonjs/components/Stepper.js +1 -0
  4. package/lib/commonjs/index.js +14 -0
  5. package/lib/commonjs/index.js.map +1 -1
  6. package/lib/commonjs/mappings/View.js.map +1 -1
  7. package/lib/commonjs/mappings/WebView.js.map +1 -1
  8. package/lib/module/components/Banner.js +158 -0
  9. package/lib/module/components/Banner.js.map +1 -0
  10. package/lib/module/components/Stepper.js +1 -0
  11. package/lib/module/index.js +2 -0
  12. package/lib/module/index.js.map +1 -1
  13. package/lib/typescript/src/components/Banner.d.ts +23 -0
  14. package/lib/typescript/src/components/Banner.d.ts.map +1 -0
  15. package/lib/typescript/src/index.d.ts +2 -0
  16. package/lib/typescript/src/index.d.ts.map +1 -1
  17. package/package.json +3 -3
  18. package/src/Provider.js +9 -0
  19. package/src/components/Accordion/AccordionGroup.js +44 -0
  20. package/src/components/Accordion/AccordionItem.js +32 -0
  21. package/src/components/Accordion/index.js +2 -0
  22. package/src/components/ActionSheet/ActionSheet.js +45 -0
  23. package/src/components/ActionSheet/ActionSheetCancel.js +6 -0
  24. package/src/components/ActionSheet/ActionSheetItem.js +30 -0
  25. package/src/components/ActionSheet/index.js +3 -0
  26. package/src/components/Banner.js +109 -0
  27. package/src/components/Banner.tsx +204 -0
  28. package/src/components/Button.js +114 -0
  29. package/src/components/Checkbox/Checkbox.js +63 -0
  30. package/src/components/Checkbox/CheckboxGroup.js +21 -0
  31. package/src/components/Checkbox/CheckboxGroupRow.js +77 -0
  32. package/src/components/Checkbox/CheckboxRow.js +78 -0
  33. package/src/components/Checkbox/context.js +14 -0
  34. package/src/components/Checkbox/index.js +3 -0
  35. package/src/components/Config.js +64 -0
  36. package/src/components/DatePicker/DatePicker.js +368 -0
  37. package/src/components/DatePicker/DatePickerComponent.js +13 -0
  38. package/src/components/DatePicker/DatePickerComponent.web.js +30 -0
  39. package/src/components/DatePicker/DatePickerComponentType.js +1 -0
  40. package/src/components/DeprecatedButton.js +95 -0
  41. package/src/components/Elevation.js +20 -0
  42. package/src/components/FormRow.js +19 -0
  43. package/src/components/IconButton.js +35 -0
  44. package/src/components/Layout.js +50 -0
  45. package/src/components/NumberInput.js +49 -0
  46. package/src/components/Picker/Picker.js +267 -0
  47. package/src/components/Picker/PickerComponent.android.js +69 -0
  48. package/src/components/Picker/PickerComponent.ios.js +79 -0
  49. package/src/components/Picker/PickerComponent.web.js +70 -0
  50. package/src/components/Picker/PickerTypes.js +1 -0
  51. package/src/components/Portal/Portal.js +35 -0
  52. package/src/components/Portal/PortalConsumer.js +27 -0
  53. package/src/components/Portal/PortalHost.js +107 -0
  54. package/src/components/Portal/PortalManager.js +32 -0
  55. package/src/components/RadioButton/RadioButton.js +17 -0
  56. package/src/components/RadioButton/RadioButtonFieldGroup.js +17 -0
  57. package/src/components/RadioButton/RadioButtonGroup.js +43 -0
  58. package/src/components/RadioButton/RadioButtonRow.js +76 -0
  59. package/src/components/RadioButton/context.js +14 -0
  60. package/src/components/RadioButton/index.js +4 -0
  61. package/src/components/SVG.js +13 -0
  62. package/src/components/ScreenContainer.js +34 -0
  63. package/src/components/Slider.js +63 -0
  64. package/src/components/StarRating.js +50 -0
  65. package/src/components/Stepper.js +39 -0
  66. package/src/components/Surface.js +32 -0
  67. package/src/components/Swiper/Swiper.js +29 -0
  68. package/src/components/Swiper/SwiperItem.js +9 -0
  69. package/src/components/Swiper/index.js +2 -0
  70. package/src/components/Switch.js +56 -0
  71. package/src/components/Text.js +33 -0
  72. package/src/components/TextField.js +428 -0
  73. package/src/components/Touchable.js +12 -0
  74. package/src/components/Touchable.web.js +2 -0
  75. package/src/constants.js +10 -0
  76. package/src/hooks.js +12 -0
  77. package/src/index.js +35 -0
  78. package/src/index.tsx +2 -0
  79. package/src/interfaces/Icon.js +8 -0
  80. package/src/mappings/Accordion.js +41 -0
  81. package/src/mappings/AccordionItem.js +16 -0
  82. package/src/mappings/ActionSheet.js +13 -0
  83. package/src/mappings/ActionSheetCancel.js +19 -0
  84. package/src/mappings/ActionSheetItem.js +23 -0
  85. package/src/mappings/ActivityIndicator.js +58 -0
  86. package/src/mappings/AudioPlayer.js +20 -0
  87. package/src/mappings/BlurView.js +42 -0
  88. package/src/mappings/Button.js +87 -0
  89. package/src/mappings/Checkbox.js +46 -0
  90. package/src/mappings/CheckboxGroup.js +26 -0
  91. package/src/mappings/CheckboxRow.js +61 -0
  92. package/src/mappings/CustomCode.js +8 -0
  93. package/src/mappings/DatePicker.js +157 -0
  94. package/src/mappings/Fetch.js +13 -0
  95. package/src/mappings/FlashList.js +33 -0
  96. package/src/mappings/FlatList.js +24 -0
  97. package/src/mappings/Icon.js +32 -0
  98. package/src/mappings/IconButton.js +35 -0
  99. package/src/mappings/Image.js +35 -0
  100. package/src/mappings/ImageBackground.js +29 -0
  101. package/src/mappings/KeyboardAvoidingView.js +41 -0
  102. package/src/mappings/KeyboardAwareScrollView.js +50 -0
  103. package/src/mappings/Layout.js +200 -0
  104. package/src/mappings/LinearGradient.js +77 -0
  105. package/src/mappings/MapCallout.js +21 -0
  106. package/src/mappings/MapMarker.js +47 -0
  107. package/src/mappings/MapView.js +139 -0
  108. package/src/mappings/Modal.js +42 -0
  109. package/src/mappings/NumberInput.js +254 -0
  110. package/src/mappings/Picker.js +148 -0
  111. package/src/mappings/RadioButton.js +51 -0
  112. package/src/mappings/RadioButtonGroup.js +17 -0
  113. package/src/mappings/RadioButtonRow.js +42 -0
  114. package/src/mappings/SVG.js +20 -0
  115. package/src/mappings/SafeAreaView.js +33 -0
  116. package/src/mappings/ScrollView.js +31 -0
  117. package/src/mappings/Slider.js +60 -0
  118. package/src/mappings/StarRating.js +43 -0
  119. package/src/mappings/Stepper.js +29 -0
  120. package/src/mappings/Surface.js +14 -0
  121. package/src/mappings/Swiper.js +60 -0
  122. package/src/mappings/SwiperItem.js +8 -0
  123. package/src/mappings/Switch.js +81 -0
  124. package/src/mappings/Text.js +251 -0
  125. package/src/mappings/TextArea.js +263 -0
  126. package/src/mappings/TextField.js +381 -0
  127. package/src/mappings/TextInput.js +391 -0
  128. package/src/mappings/Touchable.js +17 -0
  129. package/src/mappings/Video.js +81 -0
  130. package/src/mappings/View.js +207 -0
  131. package/src/mappings/WebView.js +88 -0
  132. package/src/styles/DarkTheme.js +26 -0
  133. package/src/styles/DefaultTheme.js +111 -0
  134. package/src/styles/fonts.js +62 -0
  135. package/src/styles/overlay.js +60 -0
  136. package/src/styles/shadow.js +51 -0
  137. package/src/theming.js +3 -0
  138. package/src/utilities.js +102 -0
@@ -0,0 +1,77 @@
1
+ import * as React from "react";
2
+ import { StyleSheet, View, Platform, } from "react-native";
3
+ import Checkbox from "./Checkbox";
4
+ import Text from "../Text";
5
+ import { useCheckboxGroupContext } from "./context";
6
+ import { Direction as GroupDirection } from "./context";
7
+ import Touchable from "../Touchable";
8
+ import { extractStyles } from "../../utilities";
9
+ export var Direction;
10
+ (function (Direction) {
11
+ Direction["Row"] = "row";
12
+ Direction["RowReverse"] = "row-reverse";
13
+ })(Direction || (Direction = {}));
14
+ const getCheckboxAlignment = (parentDirection, direction) => {
15
+ if (parentDirection === GroupDirection.Horizontal) {
16
+ return direction === Direction.Row ? "flex-start" : "flex-end";
17
+ }
18
+ else if (direction === Direction.RowReverse) {
19
+ return "flex-start";
20
+ }
21
+ else {
22
+ return "flex-end";
23
+ }
24
+ };
25
+ const renderLabel = (value, labelStyle, textStyle) => {
26
+ if (typeof value === "string") {
27
+ return React.createElement(Text, { style: [labelStyle, textStyle] }, value);
28
+ }
29
+ else {
30
+ return React.createElement(React.Fragment, null, value);
31
+ }
32
+ };
33
+ const CheckboxGroupRow = ({ Icon, label = "Label", status, value, onPress, labelContainerStyle, labelStyle, checkboxStyle, direction = Direction.Row, disabled, style, color, uncheckedColor, ...rest }) => {
34
+ const { values: selectedValues, onValueChange, direction: parentDirection, } = useCheckboxGroupContext();
35
+ const values = Array.isArray(selectedValues) ? selectedValues : [];
36
+ const isChecked = status || values.includes(value);
37
+ const handlePress = () => {
38
+ if (!disabled) {
39
+ onPress === null || onPress === void 0 ? void 0 : onPress(!isChecked);
40
+ onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(value, !isChecked);
41
+ }
42
+ };
43
+ const { textStyles, viewStyles } = extractStyles(style);
44
+ return (React.createElement(Touchable, { onPress: handlePress, style: [styles.mainParent, { flexDirection: direction }, viewStyles], disabled: disabled, ...rest },
45
+ React.createElement(View, { style: [
46
+ styles.label,
47
+ {
48
+ alignItems: direction === Direction.Row ? "flex-start" : "flex-end",
49
+ },
50
+ labelContainerStyle,
51
+ ] }, renderLabel(label, labelStyle, textStyles)),
52
+ React.createElement(View, { style: {
53
+ flex: 1,
54
+ alignItems: getCheckboxAlignment(parentDirection, direction),
55
+ } },
56
+ React.createElement(Checkbox, { Icon: Icon, status: isChecked, onPress: handlePress, style: checkboxStyle, disabled: disabled, color: color, uncheckedColor: uncheckedColor }))));
57
+ };
58
+ const styles = StyleSheet.create({
59
+ mainParent: {
60
+ alignItems: "center",
61
+ justifyContent: "space-around",
62
+ paddingStart: 20,
63
+ minHeight: 50,
64
+ paddingEnd: 20,
65
+ display: "flex",
66
+ ...Platform.select({
67
+ web: {
68
+ cursor: "pointer",
69
+ userSelect: "none",
70
+ },
71
+ }),
72
+ },
73
+ label: {
74
+ flex: 3,
75
+ },
76
+ });
77
+ export default CheckboxGroupRow;
@@ -0,0 +1,78 @@
1
+ import * as React from "react";
2
+ import { StyleSheet, View, Platform, } from "react-native";
3
+ import { isString } from "lodash";
4
+ import { extractStyles } from "../../utilities";
5
+ import { usePrevious } from "../../hooks";
6
+ import Text from "../Text";
7
+ import Touchable from "../Touchable";
8
+ import Checkbox from "./Checkbox";
9
+ export var Direction;
10
+ (function (Direction) {
11
+ Direction["Row"] = "row";
12
+ Direction["RowReverse"] = "row-reverse";
13
+ })(Direction || (Direction = {}));
14
+ const renderLabel = (value, labelStyle, textStyle) => {
15
+ if (isString(value)) {
16
+ return React.createElement(Text, { style: [textStyle, labelStyle] }, value);
17
+ }
18
+ else {
19
+ return React.createElement(React.Fragment, null, value);
20
+ }
21
+ };
22
+ const CheckboxRow = ({ label = "Label", labelStyle, labelContainerStyle, checkboxStyle, direction = Direction.Row, Icon, status, disabled = false, onPress, onCheck, onUncheck, color, uncheckedColor, defaultValue, checkedIcon, uncheckedIcon, size, style, ...rest }) => {
23
+ const [internalValue, setInternalValue] = React.useState(status || defaultValue || false);
24
+ React.useEffect(() => {
25
+ if (status != null) {
26
+ setInternalValue(status);
27
+ }
28
+ }, [status]);
29
+ // This special logic is to handle weird APIs like Airtable that return
30
+ // true or undefined for a boolean
31
+ const previousDefaultValue = usePrevious(defaultValue);
32
+ React.useEffect(() => {
33
+ if (defaultValue !== previousDefaultValue) {
34
+ setInternalValue(Boolean(defaultValue));
35
+ }
36
+ }, [defaultValue, previousDefaultValue]);
37
+ const handlePress = () => {
38
+ const newValue = !internalValue;
39
+ setInternalValue(newValue);
40
+ onPress === null || onPress === void 0 ? void 0 : onPress(newValue);
41
+ if (newValue) {
42
+ onCheck === null || onCheck === void 0 ? void 0 : onCheck();
43
+ }
44
+ if (!newValue) {
45
+ onUncheck === null || onUncheck === void 0 ? void 0 : onUncheck();
46
+ }
47
+ };
48
+ const { textStyles, viewStyles } = extractStyles(style);
49
+ return (React.createElement(Touchable, { onPress: handlePress, style: [viewStyles, styles.mainParent, { flexDirection: direction }], disabled: disabled, ...rest },
50
+ React.createElement(View, { style: [
51
+ styles.label,
52
+ {
53
+ alignItems: direction === Direction.Row ? "flex-start" : "flex-end",
54
+ },
55
+ labelContainerStyle,
56
+ ] }, renderLabel(label, textStyles, labelStyle)),
57
+ React.createElement(Checkbox, { Icon: Icon, status: internalValue, style: checkboxStyle, disabled: disabled, onPress: handlePress, color: color, uncheckedColor: uncheckedColor, checkedIcon: checkedIcon, uncheckedIcon: uncheckedIcon, size: size })));
58
+ };
59
+ const styles = StyleSheet.create({
60
+ mainParent: {
61
+ alignItems: "center",
62
+ justifyContent: "space-around",
63
+ paddingStart: 20,
64
+ minHeight: 50,
65
+ paddingEnd: 20,
66
+ display: "flex",
67
+ ...Platform.select({
68
+ web: {
69
+ cursor: "pointer",
70
+ userSelect: "none",
71
+ },
72
+ }),
73
+ },
74
+ label: {
75
+ flex: 3,
76
+ },
77
+ });
78
+ export default CheckboxRow;
@@ -0,0 +1,14 @@
1
+ import { createContext, useContext } from "react";
2
+ export var Direction;
3
+ (function (Direction) {
4
+ Direction["Horizontal"] = "horizontal";
5
+ Direction["Vertical"] = "vertical";
6
+ })(Direction || (Direction = {}));
7
+ export const checkboxGroupContext = createContext({
8
+ onValueChange: () => { },
9
+ values: [],
10
+ direction: undefined,
11
+ });
12
+ export function useCheckboxGroupContext() {
13
+ return useContext(checkboxGroupContext);
14
+ }
@@ -0,0 +1,3 @@
1
+ export { default as Checkbox } from "./Checkbox";
2
+ export { default as CheckboxGroup } from "./CheckboxGroup";
3
+ export { default as CheckboxRow } from "./CheckboxRow";
@@ -0,0 +1,64 @@
1
+ import { Dimensions, Platform } from "react-native";
2
+ const getWindowDimensions = () => {
3
+ const { width, height } = Dimensions.get("window");
4
+ return {
5
+ windowWidth: width,
6
+ windowHeight: height,
7
+ };
8
+ };
9
+ const { windowWidth, windowHeight } = getWindowDimensions();
10
+ const getFilters = (options) => {
11
+ const { width, height } = options;
12
+ const filters = ["c_scale", "q_auto", "dpr_auto"];
13
+ if (width)
14
+ filters.push(`w_${width}`);
15
+ if (height)
16
+ filters.push(`h_${height}`);
17
+ return filters.join(",");
18
+ };
19
+ const buildImageUrl = (options, name) => {
20
+ const filters = getFilters(options);
21
+ return [
22
+ "https://res.cloudinary.com/altos/image/upload",
23
+ filters,
24
+ `${name}.png`,
25
+ ].join("/");
26
+ };
27
+ const getExtension = () => {
28
+ return Platform.OS === "web" ? ".svg" : ".png";
29
+ };
30
+ export default {
31
+ windowWidth,
32
+ windowHeight,
33
+ avatarImageUrl: buildImageUrl({
34
+ width: 60,
35
+ height: 60,
36
+ }, "Avatar"),
37
+ avatarImageSize: 60,
38
+ cardImageSize: 200,
39
+ cardImageUrl: "https://static.draftbit.com/images/placeholder-image" + getExtension(),
40
+ cardIconSize: 16,
41
+ cardIconBackgroundOpacity: 0.24,
42
+ cardIconElevation: 1,
43
+ placeholderImageURL: "https://static.draftbit.com/images/placeholder-image" + getExtension(),
44
+ getPlaceholderImageUrl: (size) => buildImageUrl({ width: size.width, height: size.height }, "image-placeholder_1"),
45
+ placeholderSvgURL: "https://static.draftbit.com/images/placeholder-image.svg",
46
+ squareImageUrl: buildImageUrl({ width: 100, height: 100 }, "Avatar"),
47
+ FABSize: 40,
48
+ FABBorderRadius: 20,
49
+ FABFixedHeight: 64,
50
+ cardContainerShortImageAspectRatio: 1,
51
+ rowSingleLineImageSize: 24,
52
+ rowMultiLineImageSize: 48,
53
+ rowSingleLineIconSize: 24,
54
+ rowMultiLineIconSize: 16,
55
+ headerIconSize: 24,
56
+ buttonIconSize: 24,
57
+ swiperInactiveDotSize: 6,
58
+ swiperActiveDotSize: 10,
59
+ fieldSearchBarFullIconSize: 24,
60
+ stepperButtonSize: 40,
61
+ radioButtonSize: 24,
62
+ topSafeAreaViewHeight: 0,
63
+ // topSafeAreaViewHeight: Platform.OS === "android" ? Constants.statusBarHeight : 0
64
+ };
@@ -0,0 +1,368 @@
1
+ import * as React from "react";
2
+ import { View, Animated, Text, StyleSheet, I18nManager, TextInput as NativeTextInput, } from "react-native";
3
+ import { useSafeAreaInsets } from "react-native-safe-area-context";
4
+ import dateFormat from "dateformat";
5
+ import { withTheme } from "../../theming";
6
+ import Portal from "../Portal/Portal";
7
+ import Touchable from "../Touchable";
8
+ import DateTimePicker from "./DatePickerComponent";
9
+ const AnimatedText = Animated.createAnimatedComponent(Text);
10
+ const FOCUS_ANIMATION_DURATION = 150;
11
+ const BLUR_ANIMATION_DURATION = 180;
12
+ const ICON_SIZE = 24;
13
+ const MONTHS = [
14
+ "January",
15
+ "February",
16
+ "March",
17
+ "April",
18
+ "May",
19
+ "June",
20
+ "July",
21
+ "August",
22
+ "September",
23
+ "October",
24
+ "November",
25
+ "December",
26
+ ];
27
+ const DatePicker = ({ Icon, style, theme: { colors, typography, roundness, disabledOpacity }, date, onDateChange = () => { }, defaultValue, disabled = false, mode = "date", format, type = "underline", leftIconName, rightIconName, leftIconMode = "inset", label, placeholder, ...props }) => {
28
+ const [value, setValue] = React.useState(date || defaultValue);
29
+ React.useEffect(() => {
30
+ if (defaultValue != null) {
31
+ setValue(defaultValue);
32
+ }
33
+ }, [defaultValue]);
34
+ const [pickerVisible, setPickerVisible] = React.useState(false);
35
+ const [labeled] = React.useState(new Animated.Value(date ? 0 : 1));
36
+ const [placeholder1, setPlaceholder1] = React.useState("");
37
+ const [focused, setFocused] = React.useState(false);
38
+ const [labelLayout, setLabelLayout] = React.useState({ measured: false, width: 0 });
39
+ const getValidDate = () => {
40
+ if (!value) {
41
+ return new Date();
42
+ }
43
+ return typeof (value === null || value === void 0 ? void 0 : value.getMonth) === "function" ? value : new Date();
44
+ };
45
+ const formatDate = () => {
46
+ if (!value)
47
+ return "";
48
+ let newDate = getValidDate();
49
+ if (format)
50
+ return dateFormat(newDate, format);
51
+ if (mode === "time") {
52
+ return `${newDate.toLocaleTimeString()}`;
53
+ }
54
+ if (mode === "datetime") {
55
+ return `${newDate.toLocaleString()}`;
56
+ }
57
+ return `${MONTHS[newDate.getMonth()]} ${newDate.getDate()}, ${newDate.getFullYear()}`;
58
+ };
59
+ const toggleVisibility = async () => {
60
+ setPickerVisible(!pickerVisible);
61
+ focused ? _handleBlur() : _handleFocus();
62
+ };
63
+ const insets = useSafeAreaInsets();
64
+ // const _restoreLabel = () =>
65
+ // Animated.timing(labeled, {
66
+ // toValue: 1,
67
+ // duration: FOCUS_ANIMATION_DURATION,
68
+ // useNativeDriver: true,
69
+ // }).start();
70
+ // const _minmizeLabel = () =>
71
+ // Animated.timing(labeled, {
72
+ // toValue: 0,
73
+ // duration: BLUR_ANIMATION_DURATION,
74
+ // useNativeDriver: true,
75
+ // }).start();
76
+ // const _showPlaceholder = () =>
77
+ // setTimeout(() => setPlaceholder1(placeholder || ""), 50);
78
+ const _hidePlaceholder = () => {
79
+ setPlaceholder1("");
80
+ };
81
+ React.useEffect(() => {
82
+ setValue(date);
83
+ }, [date]);
84
+ React.useEffect(() => {
85
+ if (value || focused || placeholder1) {
86
+ // _minmizeLabel();
87
+ Animated.timing(labeled, {
88
+ toValue: 0,
89
+ duration: BLUR_ANIMATION_DURATION,
90
+ useNativeDriver: true,
91
+ }).start();
92
+ }
93
+ else {
94
+ // _restoreLabel();
95
+ Animated.timing(labeled, {
96
+ toValue: 1,
97
+ duration: FOCUS_ANIMATION_DURATION,
98
+ useNativeDriver: true,
99
+ }).start();
100
+ }
101
+ }, [value, focused, placeholder1, labeled]);
102
+ React.useEffect(() => {
103
+ const _showPlaceholder = () => setTimeout(() => setPlaceholder1(placeholder || ""), 50);
104
+ if (focused || !label) {
105
+ _showPlaceholder();
106
+ }
107
+ else {
108
+ _hidePlaceholder();
109
+ }
110
+ return () => {
111
+ clearTimeout(_showPlaceholder());
112
+ };
113
+ }, [focused, label, placeholder]);
114
+ const _handleFocus = () => {
115
+ if (disabled) {
116
+ return;
117
+ }
118
+ setFocused(true);
119
+ };
120
+ const _handleBlur = () => {
121
+ if (disabled) {
122
+ return;
123
+ }
124
+ setFocused(false);
125
+ };
126
+ const MINIMIZED_LABEL_Y_OFFSET = -(typography.caption.lineHeight + 4);
127
+ const OUTLINE_MINIMIZED_LABEL_Y_OFFSET = -(16 * 0.5 + 4);
128
+ const MAXIMIZED_LABEL_FONT_SIZE = typography.subtitle1.fontSize;
129
+ const MINIMIZED_LABEL_FONT_SIZE = typography.caption.fontSize;
130
+ const hasActiveOutline = focused;
131
+ let inputTextColor, activeColor, underlineColor, borderColor, placeholderColor, containerStyle, backgroundColor, inputStyle;
132
+ inputTextColor = colors.strong;
133
+ if (disabled) {
134
+ activeColor = colors.light;
135
+ placeholderColor = colors.light;
136
+ borderColor = "transparent";
137
+ underlineColor = "transparent";
138
+ backgroundColor = colors.divider;
139
+ }
140
+ else {
141
+ activeColor = colors.primary;
142
+ placeholderColor = borderColor = colors.light;
143
+ underlineColor = colors.light;
144
+ backgroundColor = colors.background;
145
+ }
146
+ const { lineHeight, ...subtitle1 } = typography.subtitle1;
147
+ inputStyle = {
148
+ paddingVertical: 0,
149
+ color: inputTextColor,
150
+ paddingLeft: leftIconName && leftIconMode === "inset"
151
+ ? ICON_SIZE + (type === "solid" ? 16 : 12)
152
+ : 0,
153
+ paddingRight: rightIconName ? ICON_SIZE + 16 + 4 : 12,
154
+ ...subtitle1,
155
+ height: lineHeight,
156
+ };
157
+ if (type === "underline") {
158
+ containerStyle = {
159
+ borderTopLeftRadius: roundness,
160
+ borderTopRightRadius: roundness,
161
+ paddingBottom: 12,
162
+ marginTop: 16,
163
+ };
164
+ }
165
+ else {
166
+ containerStyle = {
167
+ borderRadius: roundness,
168
+ borderColor: hasActiveOutline ? activeColor : borderColor,
169
+ borderWidth: 1,
170
+ paddingTop: labeled ? 16 * 1.5 : 16,
171
+ paddingBottom: labeled ? 16 * 0.5 : 16,
172
+ opacity: disabled ? disabledOpacity : 1,
173
+ backgroundColor,
174
+ };
175
+ inputStyle.paddingHorizontal = 12;
176
+ }
177
+ if (leftIconName && leftIconMode === "outset") {
178
+ containerStyle.marginLeft = ICON_SIZE + 8;
179
+ }
180
+ let leftIconColor;
181
+ if (focused) {
182
+ leftIconColor = colors.primary;
183
+ }
184
+ else {
185
+ leftIconColor = colors.light;
186
+ }
187
+ const leftIconProps = {
188
+ size: 24,
189
+ color: leftIconColor,
190
+ name: leftIconName || "",
191
+ };
192
+ const leftIconStyle = {
193
+ position: "absolute",
194
+ marginTop: type === "solid"
195
+ ? leftIconMode === "inset"
196
+ ? MINIMIZED_LABEL_FONT_SIZE + 4
197
+ : 16
198
+ : leftIconMode === "outset"
199
+ ? 16
200
+ : 0,
201
+ };
202
+ const labelStyle = {
203
+ ...typography.subtitle1,
204
+ top: type === "solid" ? 16 : 0,
205
+ left: leftIconName && leftIconMode === "inset"
206
+ ? ICON_SIZE + (type === "solid" ? 16 : 12)
207
+ : 0,
208
+ transform: [
209
+ {
210
+ // Move label to top
211
+ translateY: labeled.interpolate({
212
+ inputRange: [0, 1],
213
+ outputRange: [
214
+ type === "solid"
215
+ ? OUTLINE_MINIMIZED_LABEL_Y_OFFSET
216
+ : MINIMIZED_LABEL_Y_OFFSET,
217
+ 0,
218
+ ],
219
+ }),
220
+ },
221
+ {
222
+ // Make label smaller
223
+ scale: labeled.interpolate({
224
+ inputRange: [0, 1],
225
+ outputRange: [
226
+ MINIMIZED_LABEL_FONT_SIZE / MAXIMIZED_LABEL_FONT_SIZE,
227
+ 1,
228
+ ],
229
+ }),
230
+ },
231
+ {
232
+ // Offset label scale since RN doesn't support transform origin
233
+ translateX: labeled.interpolate({
234
+ inputRange: [0, 1],
235
+ outputRange: [
236
+ -(1 - MINIMIZED_LABEL_FONT_SIZE / MAXIMIZED_LABEL_FONT_SIZE) *
237
+ (labelLayout.width / 2),
238
+ 0,
239
+ ],
240
+ }),
241
+ },
242
+ ],
243
+ };
244
+ const inputStyles = [
245
+ styles.input,
246
+ inputStyle,
247
+ type === "solid" ? { marginHorizontal: 12 } : {},
248
+ ];
249
+ // const render = (props) => <NativeTextInput {...props} />;
250
+ return (React.createElement(View, { style: [styles.container, style] },
251
+ React.createElement(Touchable, { disabled: disabled, onPress: toggleVisibility },
252
+ React.createElement(View, { pointerEvents: "none" },
253
+ React.createElement(View, { style: [styles.container, style] },
254
+ leftIconName && leftIconMode === "outset" ? (React.createElement(Icon, { ...leftIconProps, style: leftIconStyle })) : null,
255
+ React.createElement(View, { style: [containerStyle, style ? { height: style.height } : {}] },
256
+ type === "underline" ? (
257
+ // When type === 'flat', render an underline
258
+ React.createElement(Animated.View, { style: [
259
+ styles.underline,
260
+ {
261
+ backgroundColor: focused ? activeColor : underlineColor,
262
+ // Underlines is thinner when input is not focused
263
+ transform: [{ scaleY: focused ? 1 : 0.5 }],
264
+ },
265
+ ] })) : null,
266
+ label ? (
267
+ // Position colored placeholder and gray placeholder on top of each other and crossfade them
268
+ // This gives the effect of animating the color, but allows us to use native driver
269
+ React.createElement(View, { pointerEvents: "none", style: [
270
+ StyleSheet.absoluteFill,
271
+ {
272
+ opacity:
273
+ // Hide the label in minimized state until we measure its width
274
+ date || focused ? (labelLayout.measured ? 1 : 0) : 1,
275
+ },
276
+ ] },
277
+ React.createElement(AnimatedText, { onLayout: (e) => setLabelLayout({
278
+ width: e.nativeEvent.layout.width,
279
+ measured: true,
280
+ }), style: [
281
+ styles.placeholder,
282
+ type === "solid" ? { paddingHorizontal: 12 } : {},
283
+ labelStyle,
284
+ {
285
+ color: colors.light,
286
+ opacity: labeled.interpolate({
287
+ inputRange: [0, 1],
288
+ outputRange: [hasActiveOutline ? 1 : 0, 0],
289
+ }),
290
+ },
291
+ ], numberOfLines: 1 }, label),
292
+ React.createElement(AnimatedText, { style: [
293
+ styles.placeholder,
294
+ type === "solid" ? { paddingHorizontal: 12 } : {},
295
+ labelStyle,
296
+ {
297
+ color: placeholderColor,
298
+ opacity: hasActiveOutline ? labeled : 1,
299
+ },
300
+ ], numberOfLines: 1 }, label))) : null,
301
+ leftIconName && leftIconMode === "inset" ? (React.createElement(Icon, { ...leftIconProps, style: {
302
+ ...leftIconStyle,
303
+ marginLeft: type === "solid" ? 16 : 0,
304
+ } })) : null,
305
+ React.createElement(NativeTextInput, { value: formatDate(), placeholder: label ? placeholder1 : placeholder, editable: !disabled, placeholderTextColor: placeholderColor, selectionColor: activeColor, onFocus: _handleFocus, onBlur: _handleBlur, underlineColorAndroid: "transparent", style: inputStyles, ...props })),
306
+ rightIconName ? (React.createElement(Icon, { name: rightIconName, size: ICON_SIZE, color: colors.light, style: {
307
+ position: "absolute",
308
+ right: 16,
309
+ marginTop: type === "solid" ? MINIMIZED_LABEL_FONT_SIZE + 4 : 16,
310
+ } })) : null))),
311
+ pickerVisible && (React.createElement(Portal, null,
312
+ React.createElement(View, { style: [
313
+ styles.picker,
314
+ {
315
+ backgroundColor: colors.divider,
316
+ },
317
+ ] },
318
+ React.createElement(View, { style: [
319
+ styles.pickerContainer,
320
+ {
321
+ paddingTop: insets.top,
322
+ paddingBottom: insets.bottom,
323
+ paddingLeft: insets.left,
324
+ paddingRight: insets.right,
325
+ },
326
+ ] },
327
+ React.createElement(DateTimePicker, { value: getValidDate(), mode: mode, isVisible: pickerVisible, toggleVisibility: toggleVisibility, onChange: (_event, data) => {
328
+ toggleVisibility();
329
+ setValue(data);
330
+ onDateChange(data);
331
+ } })))))));
332
+ };
333
+ const styles = StyleSheet.create({
334
+ container: {
335
+ alignSelf: "stretch",
336
+ },
337
+ picker: {
338
+ position: "absolute",
339
+ bottom: 0,
340
+ left: 0,
341
+ right: 0,
342
+ flexDirection: "row",
343
+ justifyContent: "center",
344
+ },
345
+ underline: {
346
+ position: "absolute",
347
+ left: 0,
348
+ right: 0,
349
+ bottom: 0,
350
+ height: 2,
351
+ },
352
+ input: {
353
+ flexGrow: 1,
354
+ justifyContent: "center",
355
+ textAlignVertical: "center",
356
+ margin: 0,
357
+ textAlign: I18nManager.isRTL ? "right" : "left",
358
+ },
359
+ placeholder: {
360
+ position: "absolute",
361
+ left: 0,
362
+ },
363
+ pickerContainer: { flexDirection: "column", width: "100%", zIndex: 100 },
364
+ closeButton: {
365
+ alignSelf: "flex-end",
366
+ },
367
+ });
368
+ export default withTheme(DatePicker);
@@ -0,0 +1,13 @@
1
+ import React from "react";
2
+ import { Platform } from "react-native";
3
+ import DateTimePicker from "@react-native-community/datetimepicker";
4
+ import DateTimePickerModal from "react-native-modal-datetime-picker";
5
+ const DatePickerComponent = ({ value, onChange, mode, toggleVisibility, }) => {
6
+ return Platform.OS === "ios" || Platform.OS === "android" ? (React.createElement(DateTimePickerModal, { date: value, mode: mode, isVisible: true, display: Platform.OS === "ios" ? "spinner" : "default", onCancel: () => {
7
+ console.log("Picker cancelled before selecting anything.");
8
+ toggleVisibility();
9
+ }, onConfirm: (data) => {
10
+ onChange(null, data);
11
+ } })) : (React.createElement(DateTimePicker, { value: value, mode: mode, onChange: onChange, display: "default" }));
12
+ };
13
+ export default DatePickerComponent;
@@ -0,0 +1,30 @@
1
+ import React from "react";
2
+ import DateFnsUtils from "@date-io/date-fns";
3
+ import { MuiPickersUtilsProvider, DatePicker, TimePicker, DateTimePicker, } from "@material-ui/pickers";
4
+ import { createMuiTheme, ThemeProvider } from "@material-ui/core/styles";
5
+ import { withTheme } from "../../theming";
6
+ import Theme from "../../styles/DefaultTheme";
7
+ const DatePickerComponent = ({ value, onChange, mode, toggleVisibility, isVisible, theme, }) => {
8
+ const internalTheme = createMuiTheme({
9
+ palette: {
10
+ primary: {
11
+ main: theme.colors.primary || Theme.colors.primary,
12
+ },
13
+ secondary: {
14
+ main: theme.colors.secondary || Theme.colors.secondary,
15
+ },
16
+ },
17
+ });
18
+ const Picker = mode === "date"
19
+ ? DatePicker
20
+ : mode === "time"
21
+ ? TimePicker
22
+ : DateTimePicker;
23
+ return (React.createElement(MuiPickersUtilsProvider, { utils: DateFnsUtils },
24
+ React.createElement(ThemeProvider, { theme: internalTheme },
25
+ React.createElement(Picker, { value: value, open: isVisible, onChange: (d) => {
26
+ toggleVisibility();
27
+ onChange(null, d);
28
+ }, onClose: () => toggleVisibility(), variant: "dialog", TextFieldComponent: () => null }))));
29
+ };
30
+ export default withTheme(DatePickerComponent);