@draftbit/core 50.1.0 → 50.1.1-1cea51.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@draftbit/core",
3
- "version": "50.1.0",
3
+ "version": "50.1.1-1cea51.2+1cea512",
4
4
  "description": "Core (non-native) Components",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "types": "lib/typescript/src/index.d.ts",
@@ -41,7 +41,7 @@
41
41
  "dependencies": {
42
42
  "@date-io/date-fns": "^1.3.13",
43
43
  "@draftbit/react-theme-provider": "^2.1.1",
44
- "@draftbit/types": "50.1.0",
44
+ "@draftbit/types": "^50.1.1-1cea51.2+1cea512",
45
45
  "@expo/vector-icons": "^14.0.0",
46
46
  "@gorhom/bottom-sheet": "5.0.0-alpha.7",
47
47
  "@material-ui/core": "^4.11.0",
@@ -66,6 +66,7 @@
66
66
  "react-native-modal-datetime-picker": "^13.0.0",
67
67
  "react-native-pager-view": "6.2.3",
68
68
  "react-native-reanimated": "~3.6.2",
69
+ "react-native-select-dropdown": "4.0.1",
69
70
  "react-native-shadow-2": "^7.0.7",
70
71
  "react-native-svg": "14.1.0",
71
72
  "react-native-swipe-list-view": "^3.2.9",
@@ -114,5 +115,5 @@
114
115
  ],
115
116
  "testEnvironment": "node"
116
117
  },
117
- "gitHead": "30996f93fbaac367cf545cecef4188a813d2ede2"
118
+ "gitHead": "1cea51282b60cf6e5b0f30a827036d0605259014"
118
119
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PickerCommon.js","sourceRoot":"","sources":["PickerCommon.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAmDlC,MAAM,UAAU,wBAAwB,CACtC,OAA6C;IAE7C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;QACxB,OAAO,EAAE,CAAC;KACX;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAE/B,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;QACtE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC9B,KAAK,EAAE,MAAyB;YAChC,KAAK,EAAE,MAAyB;SACjC,CAAC,CAAC,CAAC;KACL;IAED,IACE,QAAQ,CAAC,WAAW,CAAC;QACrB,WAAW,CAAC,KAAK,KAAK,SAAS;QAC/B,WAAW,CAAC,KAAK,KAAK,SAAS,EAC/B;QACA,OAAQ,OAA0B,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YAChD,OAAO;gBACL,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,KAAK,EAAE,MAAM,CAAC,KAAK;aACpB,CAAC;QACJ,CAAC,CAAC,CAAC;KACJ;IAED,MAAM,IAAI,KAAK,CACb,6IAA6I,CAC9I,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"PickerCommon.js","sourceRoot":"","sources":["PickerCommon.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAuDlC,MAAM,UAAU,wBAAwB,CACtC,OAA6C;IAE7C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;QACxB,OAAO,EAAE,CAAC;KACX;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAE/B,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;QACtE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC9B,KAAK,EAAE,MAAyB;YAChC,KAAK,EAAE,MAAyB;SACjC,CAAC,CAAC,CAAC;KACL;IAED,IACE,QAAQ,CAAC,WAAW,CAAC;QACrB,WAAW,CAAC,KAAK,KAAK,SAAS;QAC/B,WAAW,CAAC,KAAK,KAAK,SAAS,EAC/B;QACA,OAAQ,OAA0B,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YAChD,OAAO;gBACL,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,KAAK,EAAE,MAAM,CAAC,KAAK;aACpB,CAAC;QACJ,CAAC,CAAC,CAAC;KACJ;IAED,MAAM,IAAI,KAAK,CACb,6IAA6I,CAC9I,CAAC;AACJ,CAAC"}
@@ -40,6 +40,10 @@ export interface MultiSelectPickerProps {
40
40
  onValueChange: (value: (string | number)[]) => void;
41
41
  }
42
42
 
43
+ export interface ModalPickerProps {
44
+ dropdownOverlayColor?: string;
45
+ }
46
+
43
47
  export interface CommonDropDownPickerProps extends CommonPickerProps {
44
48
  selectedIconName?: string;
45
49
  selectedIconColor?: string;
@@ -1,6 +1,7 @@
1
1
  import React from "react";
2
2
  import NativePicker from "./NativePicker";
3
3
  import DropDownPicker from "./dropdown/DropDownPicker";
4
+ import ModalPicker from "./modal/ModalPicker";
4
5
  import { withTheme } from "../../theming";
5
6
  const SinglePicker = ({ mode = "native", ...rest }) => {
6
7
  switch (mode) {
@@ -10,6 +11,9 @@ const SinglePicker = ({ mode = "native", ...rest }) => {
10
11
  case "dropdown":
11
12
  //@ts-ignore
12
13
  return React.createElement(DropDownPicker, { ...rest });
14
+ case "modal":
15
+ //@ts-ignore Ignore theme type issues
16
+ return React.createElement(ModalPicker, { ...rest });
13
17
  }
14
18
  };
15
19
  export const Picker = withTheme(SinglePicker);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,cAAc,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAM1C,MAAM,YAAY,GAAmD,CAAC,EACpE,IAAI,GAAG,QAAQ,EACf,GAAG,IAAI,EACR,EAAE,EAAE;IACH,QAAQ,IAAI,EAAE;QACZ,KAAK,QAAQ;YACX,qCAAqC;YACrC,OAAO,oBAAC,YAAY,OAAK,IAAI,GAAI,CAAC;QACpC,KAAK,UAAU;YACb,YAAY;YACZ,OAAO,oBAAC,cAAc,OAAK,IAAI,GAAI,CAAC;KACvC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC;AAC9C,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,cAAc,MAAM,2BAA2B,CAAC;AACvD,OAAO,WAAW,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAS1C,MAAM,YAAY,GAAmD,CAAC,EACpE,IAAI,GAAG,QAAQ,EACf,GAAG,IAAI,EACR,EAAE,EAAE;IACH,QAAQ,IAAI,EAAE;QACZ,KAAK,QAAQ;YACX,qCAAqC;YACrC,OAAO,oBAAC,YAAY,OAAK,IAAI,GAAI,CAAC;QACpC,KAAK,UAAU;YACb,YAAY;YACZ,OAAO,oBAAC,cAAc,OAAK,IAAI,GAAI,CAAC;QACtC,KAAK,OAAO;YACV,qCAAqC;YACrC,OAAO,oBAAC,WAAW,OAAK,IAAI,GAAI,CAAC;KACpC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC;AAC9C,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,uBAAuB,CAAC"}
@@ -1,11 +1,19 @@
1
1
  import React from "react";
2
- import { CommonDropDownPickerProps, SinglePickerProps } from "./PickerCommon";
2
+ import {
3
+ CommonDropDownPickerProps,
4
+ ModalPickerProps,
5
+ SinglePickerProps,
6
+ } from "./PickerCommon";
3
7
  import NativePicker from "./NativePicker";
4
8
  import DropDownPicker from "./dropdown/DropDownPicker";
9
+ import ModalPicker from "./modal/ModalPicker";
5
10
  import { withTheme } from "../../theming";
6
11
 
7
- interface PickerProps extends CommonDropDownPickerProps, SinglePickerProps {
8
- mode?: "native" | "dropdown";
12
+ interface PickerProps
13
+ extends CommonDropDownPickerProps,
14
+ SinglePickerProps,
15
+ ModalPickerProps {
16
+ mode?: "native" | "dropdown" | "modal";
9
17
  }
10
18
 
11
19
  const SinglePicker: React.FC<React.PropsWithChildren<PickerProps>> = ({
@@ -19,6 +27,9 @@ const SinglePicker: React.FC<React.PropsWithChildren<PickerProps>> = ({
19
27
  case "dropdown":
20
28
  //@ts-ignore
21
29
  return <DropDownPicker {...rest} />;
30
+ case "modal":
31
+ //@ts-ignore Ignore theme type issues
32
+ return <ModalPicker {...rest} />;
22
33
  }
23
34
  };
24
35
 
@@ -0,0 +1,88 @@
1
+ import * as React from "react";
2
+ import { View, Text, Keyboard } from "react-native";
3
+ import { extractStyles, flattenReactFragments, useDeepCompareMemo, } from "../../../utilities";
4
+ import { normalizeToPickerOptions, } from "../PickerCommon";
5
+ import PickerInputContainer from "../PickerInputContainer";
6
+ import ModalPickerComponent from "react-native-select-dropdown";
7
+ import { withTheme } from "../../../theming";
8
+ import PickerItem from "../dropdown/PickerItem";
9
+ import { useOnUpdate } from "../../../hooks";
10
+ const ModalPicker = ({ theme, options: optionsProp = [], onValueChange, Icon, placeholder, value, autoDismissKeyboard = true, selectedIconName = "Feather/check", selectedIconColor = theme.colors.strong, selectedIconSize = 20, dropDownBackgroundColor = theme.colors.background, dropDownBorderColor = theme.colors.divider, dropDownTextColor = theme.colors.strong, dropDownBorderWidth = 1, dropDownBorderRadius = 8, children: childrenProp, disabled, dropdownOverlayColor, ...rest }) => {
11
+ const dropdownRef = React.useRef();
12
+ const [pickerVisible, setPickerVisible] = React.useState(false);
13
+ const [internalValue, setInternalValue] = React.useState(value);
14
+ const isMultiSelect = Array.isArray(value);
15
+ const pickerItemProps = React.useMemo(() => {
16
+ const children = flattenReactFragments(React.Children.toArray(childrenProp));
17
+ // Only the props of the first PickerItem are used, any others are ignored
18
+ const firstPickerItem = children.find((child) => child.type === PickerItem);
19
+ return (firstPickerItem === null || firstPickerItem === void 0 ? void 0 : firstPickerItem.props) || {};
20
+ }, [childrenProp]);
21
+ const { viewStyles: pickerItemViewStyles, textStyles: pickerItemTextStyles } = extractStyles(pickerItemProps.style);
22
+ const options = useDeepCompareMemo(() => normalizeToPickerOptions(optionsProp).map((option) => ({
23
+ label: option.label.toString(),
24
+ value: option.value,
25
+ })), [optionsProp]);
26
+ useOnUpdate(() => {
27
+ onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange((isMultiSelect ? internalValue !== null && internalValue !== void 0 ? internalValue : [] : internalValue !== null && internalValue !== void 0 ? internalValue : "") // cannot determine if multiselect or not on compile time
28
+ );
29
+ // onValueChange excluded to prevent running on every re-render when using an anoymous function, which is the common case
30
+ }, [internalValue]);
31
+ React.useEffect(() => {
32
+ if (pickerVisible && autoDismissKeyboard) {
33
+ Keyboard.dismiss();
34
+ }
35
+ }, [pickerVisible, autoDismissKeyboard]);
36
+ React.useEffect(() => {
37
+ if (disabled) {
38
+ setPickerVisible(false);
39
+ }
40
+ }, [disabled]);
41
+ const defaultValue = options.find((item) => item.value === value);
42
+ return (React.createElement(PickerInputContainer, { testID: "dropdown-picker", Icon: Icon, placeholder: placeholder, selectedValue: value, options: options, onPress: () => {
43
+ setPickerVisible(!pickerVisible);
44
+ // @ts-ignore
45
+ dropdownRef.current.openDropdown();
46
+ }, zIndex: pickerVisible ? 100 : undefined, disabled: disabled, ...rest },
47
+ React.createElement(ModalPickerComponent
48
+ // @ts-ignore
49
+ , {
50
+ // @ts-ignore
51
+ ref: dropdownRef, data: options, defaultValue: defaultValue, onSelect: (selectedItem, index) => {
52
+ console.log(selectedItem, index);
53
+ setInternalValue(selectedItem.value);
54
+ }, renderButton: () => {
55
+ return React.createElement(View, null);
56
+ }, renderItem: (item, _index, isSelected) => {
57
+ const selectedBackgroundColor = isSelected
58
+ ? pickerItemProps.selectedBackgroundColor
59
+ : pickerItemViewStyles.backgroundColor;
60
+ const selectedTextColor = isSelected
61
+ ? pickerItemProps.selectedTextColor || dropDownTextColor
62
+ : dropDownTextColor;
63
+ const selectedTextSize = isSelected
64
+ ? pickerItemProps.selectedTextSize || 14
65
+ : 14;
66
+ const iconColor = isSelected ? selectedIconColor : "transparent";
67
+ return (React.createElement(View, { style: {
68
+ padding: 10,
69
+ flexDirection: "row",
70
+ alignItems: "center",
71
+ backgroundColor: selectedBackgroundColor,
72
+ } },
73
+ React.createElement(Text, { style: {
74
+ color: selectedTextColor,
75
+ fontSize: selectedTextSize,
76
+ flex: 1,
77
+ ...pickerItemTextStyles,
78
+ } }, item.label),
79
+ React.createElement(Icon, { name: selectedIconName, size: selectedIconSize, color: iconColor })));
80
+ }, showsVerticalScrollIndicator: false, dropdownOverlayColor: dropdownOverlayColor, dropdownStyle: {
81
+ borderColor: dropDownBorderColor,
82
+ borderWidth: dropDownBorderWidth,
83
+ borderRadius: dropDownBorderRadius,
84
+ backgroundColor: dropDownBackgroundColor,
85
+ }, disableAutoScroll: true })));
86
+ };
87
+ export default withTheme(ModalPicker);
88
+ //# sourceMappingURL=ModalPicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModalPicker.js","sourceRoot":"","sources":["ModalPicker.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,179 @@
1
+ import * as React from "react";
2
+ import { View, Text, Keyboard } from "react-native";
3
+ import {
4
+ extractStyles,
5
+ flattenReactFragments,
6
+ useDeepCompareMemo,
7
+ } from "../../../utilities";
8
+ import {
9
+ CommonDropDownPickerProps,
10
+ ModalPickerProps,
11
+ SinglePickerProps,
12
+ normalizeToPickerOptions,
13
+ } from "../PickerCommon";
14
+ import PickerInputContainer from "../PickerInputContainer";
15
+ import ModalPickerComponent from "react-native-select-dropdown";
16
+ import { withTheme } from "../../../theming";
17
+ import PickerItem, { PickerItemProps } from "../dropdown/PickerItem";
18
+ import { useOnUpdate } from "../../../hooks";
19
+
20
+ const ModalPicker: React.FC<
21
+ React.PropsWithChildren<
22
+ CommonDropDownPickerProps & SinglePickerProps & ModalPickerProps
23
+ >
24
+ > = ({
25
+ theme,
26
+ options: optionsProp = [],
27
+ onValueChange,
28
+ Icon,
29
+ placeholder,
30
+ value,
31
+ autoDismissKeyboard = true,
32
+ selectedIconName = "Feather/check",
33
+ selectedIconColor = theme.colors.strong,
34
+ selectedIconSize = 20,
35
+ dropDownBackgroundColor = theme.colors.background,
36
+ dropDownBorderColor = theme.colors.divider,
37
+ dropDownTextColor = theme.colors.strong,
38
+ dropDownBorderWidth = 1,
39
+ dropDownBorderRadius = 8,
40
+ children: childrenProp,
41
+ disabled,
42
+ dropdownOverlayColor,
43
+ ...rest
44
+ }) => {
45
+ const dropdownRef = React.useRef();
46
+
47
+ const [pickerVisible, setPickerVisible] = React.useState(false);
48
+ const [internalValue, setInternalValue] = React.useState<
49
+ string | number | (string | number)[] | undefined
50
+ >(value);
51
+
52
+ const isMultiSelect = Array.isArray(value);
53
+
54
+ const pickerItemProps: PickerItemProps = React.useMemo(() => {
55
+ const children = flattenReactFragments(
56
+ React.Children.toArray(childrenProp) as React.ReactElement[]
57
+ );
58
+
59
+ // Only the props of the first PickerItem are used, any others are ignored
60
+ const firstPickerItem = children.find((child) => child.type === PickerItem);
61
+
62
+ return firstPickerItem?.props || {};
63
+ }, [childrenProp]);
64
+
65
+ const { viewStyles: pickerItemViewStyles, textStyles: pickerItemTextStyles } =
66
+ extractStyles(pickerItemProps.style);
67
+
68
+ const options = useDeepCompareMemo(
69
+ () =>
70
+ normalizeToPickerOptions(optionsProp).map((option) => ({
71
+ label: option.label.toString(),
72
+ value: option.value,
73
+ })),
74
+ [optionsProp]
75
+ );
76
+
77
+ useOnUpdate(() => {
78
+ onValueChange?.(
79
+ (isMultiSelect ? internalValue ?? [] : internalValue ?? "") as any // cannot determine if multiselect or not on compile time
80
+ );
81
+ // onValueChange excluded to prevent running on every re-render when using an anoymous function, which is the common case
82
+ }, [internalValue]);
83
+
84
+ React.useEffect(() => {
85
+ if (pickerVisible && autoDismissKeyboard) {
86
+ Keyboard.dismiss();
87
+ }
88
+ }, [pickerVisible, autoDismissKeyboard]);
89
+
90
+ React.useEffect(() => {
91
+ if (disabled) {
92
+ setPickerVisible(false);
93
+ }
94
+ }, [disabled]);
95
+
96
+ const defaultValue = options.find((item) => item.value === value);
97
+
98
+ return (
99
+ <PickerInputContainer
100
+ testID="dropdown-picker"
101
+ Icon={Icon}
102
+ placeholder={placeholder}
103
+ selectedValue={value}
104
+ options={options}
105
+ onPress={() => {
106
+ setPickerVisible(!pickerVisible);
107
+ // @ts-ignore
108
+ dropdownRef.current.openDropdown();
109
+ }}
110
+ zIndex={pickerVisible ? 100 : undefined} // Guarantees drop down is rendered above all sibling components
111
+ disabled={disabled}
112
+ {...rest}
113
+ >
114
+ <ModalPickerComponent
115
+ // @ts-ignore
116
+ ref={dropdownRef}
117
+ data={options}
118
+ defaultValue={defaultValue}
119
+ onSelect={(selectedItem, index) => {
120
+ console.log(selectedItem, index);
121
+ setInternalValue(selectedItem.value);
122
+ }}
123
+ renderButton={() => {
124
+ return <View />;
125
+ }}
126
+ renderItem={(item, _index, isSelected) => {
127
+ const selectedBackgroundColor = isSelected
128
+ ? pickerItemProps.selectedBackgroundColor
129
+ : pickerItemViewStyles.backgroundColor;
130
+ const selectedTextColor = isSelected
131
+ ? pickerItemProps.selectedTextColor || dropDownTextColor
132
+ : dropDownTextColor;
133
+ const selectedTextSize = isSelected
134
+ ? pickerItemProps.selectedTextSize || 14
135
+ : 14;
136
+ const iconColor = isSelected ? selectedIconColor : "transparent";
137
+
138
+ return (
139
+ <View
140
+ style={{
141
+ padding: 10,
142
+ flexDirection: "row",
143
+ alignItems: "center",
144
+ backgroundColor: selectedBackgroundColor,
145
+ }}
146
+ >
147
+ <Text
148
+ style={{
149
+ color: selectedTextColor,
150
+ fontSize: selectedTextSize,
151
+ flex: 1,
152
+ ...pickerItemTextStyles,
153
+ }}
154
+ >
155
+ {item.label}
156
+ </Text>
157
+ <Icon
158
+ name={selectedIconName}
159
+ size={selectedIconSize}
160
+ color={iconColor}
161
+ />
162
+ </View>
163
+ );
164
+ }}
165
+ showsVerticalScrollIndicator={false}
166
+ dropdownOverlayColor={dropdownOverlayColor}
167
+ dropdownStyle={{
168
+ borderColor: dropDownBorderColor,
169
+ borderWidth: dropDownBorderWidth,
170
+ borderRadius: dropDownBorderRadius,
171
+ backgroundColor: dropDownBackgroundColor,
172
+ }}
173
+ disableAutoScroll={true}
174
+ />
175
+ </PickerInputContainer>
176
+ );
177
+ };
178
+
179
+ export default withTheme(ModalPicker);