@seakoi/native-ui 1.2.0 → 1.3.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 (178) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/dist/commonjs/components/base/index.js +33 -11
  3. package/dist/commonjs/components/base/input/base-input.js +4 -2
  4. package/dist/commonjs/components/base/overflow/all-mode-overflow.js +49 -0
  5. package/dist/commonjs/components/base/overflow/fixed-count-overflow.js +70 -0
  6. package/dist/commonjs/components/base/overflow/index.js +16 -0
  7. package/dist/commonjs/components/base/overflow/overflow.js +72 -0
  8. package/dist/commonjs/components/base/overflow/responsive-overflow.js +280 -0
  9. package/dist/commonjs/components/base/overflow/style/index.js +39 -0
  10. package/dist/commonjs/components/base/overflow/types.js +5 -0
  11. package/dist/commonjs/components/base/picker/picker-content.js +16 -12
  12. package/dist/commonjs/components/base/picker/picker-field.js +9 -7
  13. package/dist/commonjs/components/base/picker/picker.js +6 -1
  14. package/dist/commonjs/components/base/picker/style/index.js +7 -1
  15. package/dist/commonjs/components/base/portal/portal-host.js +5 -3
  16. package/dist/commonjs/components/base/select/hooks/use-select-actions.js +155 -0
  17. package/dist/commonjs/components/base/select/hooks/use-select-options.js +169 -0
  18. package/dist/commonjs/components/base/select/hooks/use-selector.js +104 -0
  19. package/dist/commonjs/components/base/select/index.js +16 -0
  20. package/dist/commonjs/components/base/select/select-multiple-content.js +182 -0
  21. package/dist/commonjs/components/base/select/select-popup.js +233 -0
  22. package/dist/commonjs/components/base/select/select-single-content.js +100 -0
  23. package/dist/commonjs/components/base/select/select-suffix.js +67 -0
  24. package/dist/commonjs/components/base/select/select.js +285 -0
  25. package/dist/commonjs/components/base/select/style/index.js +40 -0
  26. package/dist/commonjs/components/base/select/style/select-multiple-content-styles.js +46 -0
  27. package/dist/commonjs/components/base/select/style/select-popup-styles.js +67 -0
  28. package/dist/commonjs/components/base/select/style/select-single-content-styles.js +28 -0
  29. package/dist/commonjs/components/base/select/style/select-styles.js +46 -0
  30. package/dist/commonjs/components/base/select/style/select-suffix-styles.js +21 -0
  31. package/dist/commonjs/components/base/select/types.js +5 -0
  32. package/dist/commonjs/components/base/tabs/style/index.js +37 -0
  33. package/dist/commonjs/components/base/tabs/tabs.js +90 -45
  34. package/dist/commonjs/native-provider/native-provider.js +5 -5
  35. package/dist/commonjs/shared/utils/index.js +11 -0
  36. package/dist/commonjs/shared/utils/object.js +39 -0
  37. package/dist/module/components/base/index.js +2 -0
  38. package/dist/module/components/base/input/base-input.js +4 -2
  39. package/dist/module/components/base/overflow/all-mode-overflow.js +43 -0
  40. package/dist/module/components/base/overflow/fixed-count-overflow.js +64 -0
  41. package/dist/module/components/base/overflow/index.js +3 -0
  42. package/dist/module/components/base/overflow/overflow.js +66 -0
  43. package/dist/module/components/base/overflow/responsive-overflow.js +274 -0
  44. package/dist/module/components/base/overflow/style/index.js +36 -0
  45. package/dist/module/components/base/overflow/types.js +3 -0
  46. package/dist/module/components/base/picker/picker-content.js +16 -12
  47. package/dist/module/components/base/picker/picker-field.js +9 -7
  48. package/dist/module/components/base/picker/picker.js +6 -1
  49. package/dist/module/components/base/picker/style/index.js +6 -0
  50. package/dist/module/components/base/portal/portal-host.js +4 -3
  51. package/dist/module/components/base/select/hooks/use-select-actions.js +151 -0
  52. package/dist/module/components/base/select/hooks/use-select-options.js +162 -0
  53. package/dist/module/components/base/select/hooks/use-selector.js +100 -0
  54. package/dist/module/components/base/select/index.js +3 -0
  55. package/dist/module/components/base/select/select-multiple-content.js +176 -0
  56. package/dist/module/components/base/select/select-popup.js +227 -0
  57. package/dist/module/components/base/select/select-single-content.js +94 -0
  58. package/dist/module/components/base/select/select-suffix.js +61 -0
  59. package/dist/module/components/base/select/select.js +279 -0
  60. package/dist/module/components/base/select/style/index.js +7 -0
  61. package/dist/module/components/base/select/style/select-multiple-content-styles.js +43 -0
  62. package/dist/module/components/base/select/style/select-popup-styles.js +64 -0
  63. package/dist/module/components/base/select/style/select-single-content-styles.js +25 -0
  64. package/dist/module/components/base/select/style/select-styles.js +43 -0
  65. package/dist/module/components/base/select/style/select-suffix-styles.js +18 -0
  66. package/dist/module/components/base/select/types.js +3 -0
  67. package/dist/module/components/base/tabs/style/index.js +33 -0
  68. package/dist/module/components/base/tabs/tabs.js +92 -47
  69. package/dist/module/native-provider/native-provider.js +5 -5
  70. package/dist/module/shared/utils/index.js +2 -1
  71. package/dist/module/shared/utils/object.js +35 -0
  72. package/dist/typescript/components/base/index.d.ts +2 -0
  73. package/dist/typescript/components/base/index.d.ts.map +1 -1
  74. package/dist/typescript/components/base/input/base-input.d.ts.map +1 -1
  75. package/dist/typescript/components/base/overflow/all-mode-overflow.d.ts +11 -0
  76. package/dist/typescript/components/base/overflow/all-mode-overflow.d.ts.map +1 -0
  77. package/dist/typescript/components/base/overflow/fixed-count-overflow.d.ts +11 -0
  78. package/dist/typescript/components/base/overflow/fixed-count-overflow.d.ts.map +1 -0
  79. package/dist/typescript/components/base/overflow/index.d.ts +3 -0
  80. package/dist/typescript/components/base/overflow/index.d.ts.map +1 -0
  81. package/dist/typescript/components/base/overflow/overflow.d.ts +13 -0
  82. package/dist/typescript/components/base/overflow/overflow.d.ts.map +1 -0
  83. package/dist/typescript/components/base/overflow/responsive-overflow.d.ts +12 -0
  84. package/dist/typescript/components/base/overflow/responsive-overflow.d.ts.map +1 -0
  85. package/dist/typescript/components/base/overflow/style/index.d.ts +31 -0
  86. package/dist/typescript/components/base/overflow/style/index.d.ts.map +1 -0
  87. package/dist/typescript/components/base/overflow/types.d.ts +77 -0
  88. package/dist/typescript/components/base/overflow/types.d.ts.map +1 -0
  89. package/dist/typescript/components/base/picker/picker-content.d.ts +12 -0
  90. package/dist/typescript/components/base/picker/picker-content.d.ts.map +1 -1
  91. package/dist/typescript/components/base/picker/picker-field.d.ts.map +1 -1
  92. package/dist/typescript/components/base/picker/picker.d.ts +9 -0
  93. package/dist/typescript/components/base/picker/picker.d.ts.map +1 -1
  94. package/dist/typescript/components/base/picker/style/index.d.ts +6 -0
  95. package/dist/typescript/components/base/picker/style/index.d.ts.map +1 -1
  96. package/dist/typescript/components/base/portal/portal-host.d.ts +1 -0
  97. package/dist/typescript/components/base/portal/portal-host.d.ts.map +1 -1
  98. package/dist/typescript/components/base/portal/types.d.ts +2 -0
  99. package/dist/typescript/components/base/portal/types.d.ts.map +1 -1
  100. package/dist/typescript/components/base/select/hooks/use-select-actions.d.ts +144 -0
  101. package/dist/typescript/components/base/select/hooks/use-select-actions.d.ts.map +1 -0
  102. package/dist/typescript/components/base/select/hooks/use-select-options.d.ts +91 -0
  103. package/dist/typescript/components/base/select/hooks/use-select-options.d.ts.map +1 -0
  104. package/dist/typescript/components/base/select/hooks/use-selector.d.ts +90 -0
  105. package/dist/typescript/components/base/select/hooks/use-selector.d.ts.map +1 -0
  106. package/dist/typescript/components/base/select/index.d.ts +3 -0
  107. package/dist/typescript/components/base/select/index.d.ts.map +1 -0
  108. package/dist/typescript/components/base/select/select-multiple-content.d.ts +51 -0
  109. package/dist/typescript/components/base/select/select-multiple-content.d.ts.map +1 -0
  110. package/dist/typescript/components/base/select/select-popup.d.ts +107 -0
  111. package/dist/typescript/components/base/select/select-popup.d.ts.map +1 -0
  112. package/dist/typescript/components/base/select/select-single-content.d.ts +48 -0
  113. package/dist/typescript/components/base/select/select-single-content.d.ts.map +1 -0
  114. package/dist/typescript/components/base/select/select-suffix.d.ts +43 -0
  115. package/dist/typescript/components/base/select/select-suffix.d.ts.map +1 -0
  116. package/dist/typescript/components/base/select/select.d.ts +40 -0
  117. package/dist/typescript/components/base/select/select.d.ts.map +1 -0
  118. package/dist/typescript/components/base/select/style/index.d.ts +6 -0
  119. package/dist/typescript/components/base/select/style/index.d.ts.map +1 -0
  120. package/dist/typescript/components/base/select/style/select-multiple-content-styles.d.ts +40 -0
  121. package/dist/typescript/components/base/select/style/select-multiple-content-styles.d.ts.map +1 -0
  122. package/dist/typescript/components/base/select/style/select-popup-styles.d.ts +61 -0
  123. package/dist/typescript/components/base/select/style/select-popup-styles.d.ts.map +1 -0
  124. package/dist/typescript/components/base/select/style/select-single-content-styles.d.ts +22 -0
  125. package/dist/typescript/components/base/select/style/select-single-content-styles.d.ts.map +1 -0
  126. package/dist/typescript/components/base/select/style/select-styles.d.ts +40 -0
  127. package/dist/typescript/components/base/select/style/select-styles.d.ts.map +1 -0
  128. package/dist/typescript/components/base/select/style/select-suffix-styles.d.ts +15 -0
  129. package/dist/typescript/components/base/select/style/select-suffix-styles.d.ts.map +1 -0
  130. package/dist/typescript/components/base/select/types.d.ts +206 -0
  131. package/dist/typescript/components/base/select/types.d.ts.map +1 -0
  132. package/dist/typescript/components/base/tabs/style/index.d.ts +29 -0
  133. package/dist/typescript/components/base/tabs/style/index.d.ts.map +1 -0
  134. package/dist/typescript/components/base/tabs/tabs.d.ts +26 -5
  135. package/dist/typescript/components/base/tabs/tabs.d.ts.map +1 -1
  136. package/dist/typescript/native-provider/native-provider.d.ts +2 -0
  137. package/dist/typescript/native-provider/native-provider.d.ts.map +1 -1
  138. package/dist/typescript/shared/utils/index.d.ts +1 -0
  139. package/dist/typescript/shared/utils/index.d.ts.map +1 -1
  140. package/dist/typescript/shared/utils/object.d.ts +21 -0
  141. package/dist/typescript/shared/utils/object.d.ts.map +1 -0
  142. package/package.json +1 -1
  143. package/src/components/base/index.ts +2 -0
  144. package/src/components/base/input/base-input.tsx +4 -2
  145. package/src/components/base/overflow/all-mode-overflow.tsx +49 -0
  146. package/src/components/base/overflow/fixed-count-overflow.tsx +71 -0
  147. package/src/components/base/overflow/index.ts +2 -0
  148. package/src/components/base/overflow/overflow.tsx +60 -0
  149. package/src/components/base/overflow/responsive-overflow.tsx +349 -0
  150. package/src/components/base/overflow/style/index.ts +32 -0
  151. package/src/components/base/overflow/types.ts +75 -0
  152. package/src/components/base/picker/picker-content.tsx +24 -9
  153. package/src/components/base/picker/picker-field.tsx +19 -13
  154. package/src/components/base/picker/picker.tsx +10 -1
  155. package/src/components/base/picker/style/index.ts +4 -0
  156. package/src/components/base/portal/portal-host.tsx +13 -3
  157. package/src/components/base/portal/types.ts +2 -0
  158. package/src/components/base/select/hooks/use-select-actions.ts +263 -0
  159. package/src/components/base/select/hooks/use-select-options.ts +250 -0
  160. package/src/components/base/select/hooks/use-selector.ts +155 -0
  161. package/src/components/base/select/index.ts +2 -0
  162. package/src/components/base/select/select-multiple-content.tsx +292 -0
  163. package/src/components/base/select/select-popup.tsx +384 -0
  164. package/src/components/base/select/select-single-content.tsx +127 -0
  165. package/src/components/base/select/select-suffix.tsx +100 -0
  166. package/src/components/base/select/select.tsx +302 -0
  167. package/src/components/base/select/style/index.ts +5 -0
  168. package/src/components/base/select/style/select-multiple-content-styles.ts +41 -0
  169. package/src/components/base/select/style/select-popup-styles.ts +62 -0
  170. package/src/components/base/select/style/select-single-content-styles.ts +23 -0
  171. package/src/components/base/select/style/select-styles.ts +41 -0
  172. package/src/components/base/select/style/select-suffix-styles.ts +16 -0
  173. package/src/components/base/select/types.ts +261 -0
  174. package/src/components/base/tabs/style/index.ts +32 -0
  175. package/src/components/base/tabs/tabs.tsx +146 -55
  176. package/src/native-provider/native-provider.tsx +4 -4
  177. package/src/shared/utils/index.ts +1 -0
  178. package/src/shared/utils/object.ts +37 -0
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useOverflowStyles = void 0;
7
+ var _index = require("../../../../native-provider/index.js");
8
+ /**
9
+ * 创建样式
10
+ */
11
+ const useOverflowStyles = exports.useOverflowStyles = (0, _index.createThemedStyles)((theme, {
12
+ maxCount
13
+ }) => ({
14
+ container: {
15
+ flexDirection: 'row',
16
+ flexWrap: maxCount === 'responsive' ? 'nowrap' : 'wrap',
17
+ overflow: 'hidden',
18
+ width: '100%'
19
+ },
20
+ item: {
21
+ flexShrink: 0,
22
+ paddingHorizontal: theme.spacing.xxs / 2,
23
+ paddingVertical: theme.spacing.xxs / 4
24
+ },
25
+ rest: {
26
+ backgroundColor: theme.palette.gray1,
27
+ borderRadius: theme.roundness.sm,
28
+ paddingHorizontal: theme.spacing.xs,
29
+ height: '100%',
30
+ display: 'flex',
31
+ alignItems: 'center',
32
+ color: theme.palette.fontGray3
33
+ },
34
+ hidden: {
35
+ opacity: 0,
36
+ pointerEvents: 'none',
37
+ position: 'absolute'
38
+ }
39
+ }));
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
@@ -7,9 +7,16 @@ exports.PickerContent = void 0;
7
7
  var _react = _interopRequireWildcard(require("react"));
8
8
  var _index = require("./../index.js");
9
9
  var _pickerContext = require("./picker-context.js");
10
+ var _index2 = require("./style/index.js");
10
11
  var _jsxRuntime = require("react/jsx-runtime");
11
12
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
13
+ /**
14
+ * Picker 内容组件的属性接口
15
+ * 继承自 Modal 组件,排除 visible 和 children 属性
16
+ */
17
+
12
18
  const PickerContent = ({
19
+ style,
13
20
  children,
14
21
  headerTitle,
15
22
  headerStyle,
@@ -17,20 +24,20 @@ const PickerContent = ({
17
24
  ...modalProps
18
25
  }) => {
19
26
  const context = (0, _react.useContext)(_pickerContext.PickerContext);
27
+ const styles = (0, _index2.usePickerContentStyles)();
20
28
  let childNode = null;
29
+ const injectToChildrenProps = {
30
+ value: context?.value,
31
+ onChange: context?.onChange
32
+ };
21
33
  if (/*#__PURE__*/_react.default.isValidElement(children)) {
22
- childNode = /*#__PURE__*/_react.default.cloneElement(children, {
23
- value: context?.value,
24
- onChange: context?.onChange
25
- });
34
+ childNode = /*#__PURE__*/_react.default.cloneElement(children, injectToChildrenProps);
26
35
  } else if (typeof children === 'function') {
27
- childNode = children({
28
- value: context?.value,
29
- onChange: context?.onChange
30
- });
36
+ childNode = children(injectToChildrenProps);
31
37
  }
32
38
  (0, _react.useEffect)(() => {
33
39
  context?.setDisabled?.(!!childNode?.props?.disabled);
40
+ // eslint-disable-next-line react-hooks/exhaustive-deps
34
41
  }, [childNode?.props?.disabled, context?.setDisabled]);
35
42
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_index.Portal, {
36
43
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_index.Modal, {
@@ -43,10 +50,7 @@ const PickerContent = ({
43
50
  vertical: true,
44
51
  align: "stretch",
45
52
  gap: 16,
46
- style: {
47
- flex: 1,
48
- padding: 16
49
- },
53
+ style: [styles.container, style],
50
54
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_index.ModalHeader, {
51
55
  title: headerTitle,
52
56
  style: headerStyle,
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.PickerField = PickerField;
7
7
  var _ahooks = require("ahooks");
8
+ var _lodashEs = require("lodash-es");
8
9
  var _react = _interopRequireWildcard(require("react"));
9
10
  var _reactNative = require("react-native");
10
11
  var _index = require("./../index.js");
@@ -16,19 +17,20 @@ var _jsxRuntime = require("react/jsx-runtime");
16
17
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
17
18
  function PickerField(props) {
18
19
  const theme = (0, _index2.useTheme)();
20
+ const styles = (0, _index4.usePickerFieldStyles)();
19
21
  const context = (0, _react.useContext)(_pickerContext.PickerContext);
20
22
  const renderValueRef = (0, _ahooks.useLatest)(props.renderValue);
21
- const styles = (0, _index4.usePickerFieldStyles)();
22
-
23
- // const hasValue = !!context?.value || typeof context?.value === 'number';
24
-
25
- const displayValue = (0, _react.useMemo)(() => renderValueRef.current?.(context?.value), [context?.value, renderValueRef]);
26
- const textColor = displayValue ? theme.palette.fontGray1 : theme.palette.fontGray3;
23
+ const value = context?.value;
24
+ const hasControllableValue = !(0, _lodashEs.isNil)(value) && (!Array.isArray(value) || value.length > 0);
25
+ const displayValue = (0, _react.useMemo)(() => {
26
+ return typeof renderValueRef.current !== 'function' ? value : renderValueRef.current?.(value);
27
+ }, [value, renderValueRef]);
28
+ const textColor = hasControllableValue ? theme.palette.fontGray1 : theme.palette.fontGray3;
27
29
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
28
30
  style: [styles.container, context?.disabled && styles.disabled],
29
31
  onPress: context?.toggleVisible,
30
32
  disabled: !!context?.disabled,
31
- children: (0, _index3.safetyRenderChildren)(displayValue ?? props.placeholder, displayText => /*#__PURE__*/(0, _jsxRuntime.jsx)(_index.Text, {
33
+ children: (0, _index3.safetyRenderChildren)(hasControllableValue ? displayValue : props.placeholder, displayText => /*#__PURE__*/(0, _jsxRuntime.jsx)(_index.Text, {
32
34
  size: 14,
33
35
  color: textColor,
34
36
  children: displayText
@@ -8,6 +8,11 @@ var _ahooks = require("ahooks");
8
8
  var _react = require("react");
9
9
  var _pickerContext = require("./picker-context.js");
10
10
  var _jsxRuntime = require("react/jsx-runtime");
11
+ /**
12
+ * Picker 组件的基础属性接口
13
+ * @template T 选择器值的类型
14
+ */
15
+
11
16
  const Picker = props => {
12
17
  const [visible, {
13
18
  toggle: toggleVisible
@@ -27,7 +32,7 @@ const Picker = props => {
27
32
  setDisabled,
28
33
  toggleVisible,
29
34
  onChange: _onChange
30
- }), [value, visible, disabled, toggleVisible, setDisabled, setValue]);
35
+ }), [value, visible, disabled, toggleVisible, _onChange]);
31
36
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_pickerContext.PickerContext.Provider, {
32
37
  value: contextValue,
33
38
  children: props.children
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.usePickerFieldStyles = void 0;
6
+ exports.usePickerFieldStyles = exports.usePickerContentStyles = void 0;
7
7
  var _index = require("../../../../native-provider/index.js");
8
8
  const usePickerFieldStyles = exports.usePickerFieldStyles = (0, _index.createThemedStyles)(theme => ({
9
9
  container: {
@@ -16,4 +16,10 @@ const usePickerFieldStyles = exports.usePickerFieldStyles = (0, _index.createThe
16
16
  disabled: {
17
17
  backgroundColor: theme.palette.blueGray2
18
18
  }
19
+ }));
20
+ const usePickerContentStyles = exports.usePickerContentStyles = (0, _index.createThemedStyles)(() => ({
21
+ container: {
22
+ flex: 1,
23
+ padding: 16
24
+ }
19
25
  }));
@@ -4,16 +4,18 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.PortalHost = void 0;
7
- var _react = require("react");
7
+ var _react = _interopRequireWildcard(require("react"));
8
8
  var _reactNative = require("react-native");
9
9
  var _index = require("../../../shared/constants/index.js");
10
10
  var _portalContext = require("./portal-context.js");
11
11
  var _portalManager = require("./portal-manager.js");
12
12
  var _index2 = require("./style/index.js");
13
13
  var _jsxRuntime = require("react/jsx-runtime");
14
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
14
15
  const PortalHost = ({
15
16
  children,
16
- name
17
+ name,
18
+ style
17
19
  }) => {
18
20
  const portalHostStyles = (0, _index2.usePortalHostStyles)();
19
21
  const managerRef = (0, _react.useRef)(null);
@@ -108,7 +110,7 @@ const PortalHost = ({
108
110
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_portalContext.PortalContext.Provider, {
109
111
  value: contextValue,
110
112
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
111
- style: portalHostStyles.container,
113
+ style: [portalHostStyles.container, style],
112
114
  collapsable: false,
113
115
  children: children
114
116
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_portalManager.PortalManager, {
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useSelectActions = void 0;
7
+ var _ahooks = require("ahooks");
8
+ /**
9
+ * 选项操作 Hook 参数
10
+ *
11
+ * @template ValueType - 选项值的类型
12
+ */
13
+
14
+ /**
15
+ * 选项操作 Hook 返回值
16
+ */
17
+
18
+ /**
19
+ * 选项操作 Hook
20
+ *
21
+ * 封装 Select 组件中与选项操作相关的逻辑,包括:
22
+ * - 选项点击处理
23
+ * - 标签移除处理
24
+ * - 清除操作处理
25
+ * - 创建新选项处理
26
+ *
27
+ * @template ValueType - 选项值的类型
28
+ *
29
+ * @example
30
+ * const {
31
+ * handleOptionPress,
32
+ * handleTagClose,
33
+ * handleClear,
34
+ * handleCreateOption
35
+ * } = useSelectActions({
36
+ * value,
37
+ * mode,
38
+ * disabled,
39
+ * maxCount,
40
+ * autoClearSearchValue,
41
+ * setValue,
42
+ * clearSearch,
43
+ * closePopup,
44
+ * isOptionSelected,
45
+ * onSelect,
46
+ * onDeselect,
47
+ * onClear
48
+ * });
49
+ */
50
+ const useSelectActions = params => {
51
+ const {
52
+ value,
53
+ mode,
54
+ disabled,
55
+ maxCount,
56
+ autoClearSearchValue,
57
+ setValue,
58
+ clearSearch,
59
+ closePopup,
60
+ isOptionSelected,
61
+ onActive,
62
+ onSelect,
63
+ onDeselect,
64
+ onClear,
65
+ onCreateOption
66
+ } = params;
67
+
68
+ // 处理选项点击
69
+ const handleOptionPress = (0, _ahooks.useMemoizedFn)(option => {
70
+ if (option.disabled) return;
71
+ onActive?.(option.value);
72
+
73
+ // 多选
74
+ if (mode) {
75
+ const values = Array.isArray(value) ? value : [];
76
+ const isSelected = isOptionSelected(option);
77
+ if (isSelected) {
78
+ // 取消选中
79
+ const newValues = values.filter(v => {
80
+ return v !== option.value;
81
+ });
82
+ setValue(newValues);
83
+ onDeselect?.(option.value);
84
+ } else {
85
+ // 选中
86
+ if (maxCount && values.length >= maxCount) {
87
+ return;
88
+ }
89
+ const newValues = [...values, option.value];
90
+ setValue(newValues);
91
+ onSelect?.(option.value, option);
92
+ }
93
+
94
+ // 清空搜索
95
+ if (autoClearSearchValue) {
96
+ clearSearch();
97
+ }
98
+ } else {
99
+ // 单选模式
100
+ setValue(option.value);
101
+ onSelect?.(option.value, option);
102
+ closePopup();
103
+ clearSearch();
104
+ }
105
+ });
106
+
107
+ // 处理标签移除
108
+ const handleTagClose = (0, _ahooks.useMemoizedFn)(option => {
109
+ if (disabled) return;
110
+ const values = Array.isArray(value) ? value : [];
111
+ const newValues = values.filter(v => {
112
+ return v !== option.value;
113
+ });
114
+ setValue(newValues);
115
+ onDeselect?.(option.value);
116
+ });
117
+
118
+ // 处理清除
119
+ const handleClear = (0, _ahooks.useMemoizedFn)(e => {
120
+ e.stopPropagation();
121
+ setValue(mode ? [] : undefined);
122
+ clearSearch();
123
+ onClear?.();
124
+ });
125
+
126
+ // 处理创建新选项(tags 模式)
127
+ const handleCreateOption = (0, _ahooks.useMemoizedFn)(searchValue => {
128
+ if (mode !== 'tags' || !searchValue.trim()) return;
129
+ const newOption = onCreateOption?.(searchValue.trim());
130
+ if (newOption) {
131
+ handleOptionPress(newOption);
132
+ } else {
133
+ // 默认创建逻辑
134
+ const defaultOption = {
135
+ label: searchValue.trim(),
136
+ value: searchValue.trim()
137
+ };
138
+ handleOptionPress(defaultOption);
139
+ }
140
+ clearSearch();
141
+ });
142
+ return {
143
+ handleOptionPress,
144
+ handleTagClose,
145
+ handleClear,
146
+ handleCreateOption
147
+ };
148
+ };
149
+
150
+ /**
151
+ * 搜索配置
152
+ *
153
+ * @template OptionType - 选项类型
154
+ */
155
+ exports.useSelectActions = useSelectActions;
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.isSelectFlattenedGroupOption = isSelectFlattenedGroupOption;
7
+ exports.useSelectOptions = exports.isSelectOptionGroup = void 0;
8
+ var _ahooks = require("ahooks");
9
+ var _react = require("react");
10
+ /**
11
+ * 判断选项是否为分组
12
+ *
13
+ * @template ValueType - 选项值的类型
14
+ */
15
+ const isSelectOptionGroup = item => {
16
+ return 'options' in item;
17
+ };
18
+ exports.isSelectOptionGroup = isSelectOptionGroup;
19
+ function isSelectFlattenedGroupOption(v) {
20
+ return !!v.isGroup;
21
+ }
22
+ function isOptionType(v) {
23
+ return !v.isGroup;
24
+ }
25
+
26
+ /**
27
+ * Select 选项处理 Hook 参数
28
+ *
29
+ * @template ValueType - 选项值的类型
30
+ * @template OptionType - 选项类型
31
+ * @template M - 选择模式
32
+ * @template RealValueType - 实际值类型
33
+ */
34
+
35
+ /**
36
+ * Select 选项处理 Hook 返回值
37
+ *
38
+ * @template ValueType - 选项值的类型
39
+ * @template OptionType - 选项类型
40
+ */
41
+
42
+ /**
43
+ * Select 选项处理 Hook
44
+ *
45
+ * 封装 Select 组件中与选项相关的逻辑,包括:
46
+ * - 扁平化选项列表
47
+ * - 过滤选项
48
+ * - 获取选中的选项
49
+ * - 判断选项是否被选中
50
+ *
51
+ * @example
52
+ * const {
53
+ * allOptions,
54
+ * filteredOptions,
55
+ * selectedOptions,
56
+ * isOptionSelected
57
+ * } = useSelectOptions({
58
+ * options,
59
+ * value,
60
+ * mode,
61
+ * searchValue,
62
+ * filterOption: true,
63
+ * optionFilterProp: 'label'
64
+ * });
65
+ */
66
+ const useSelectOptions = params => {
67
+ const {
68
+ options,
69
+ value,
70
+ mode,
71
+ searchValue,
72
+ filterOption,
73
+ filterSort,
74
+ optionFilterProp
75
+ } = params;
76
+
77
+ // 扁平化选项列表
78
+ const flattenedOptions = (0, _react.useMemo)(() => {
79
+ const result = [];
80
+ options.forEach(item => {
81
+ if (isSelectOptionGroup(item)) {
82
+ result.push({
83
+ label: item.label,
84
+ key: item.key,
85
+ isGroup: true,
86
+ groupKey: item.key
87
+ });
88
+ item.options.forEach(opt => {
89
+ result.push({
90
+ ...opt,
91
+ groupKey: item.key
92
+ });
93
+ });
94
+ } else {
95
+ result.push(item);
96
+ }
97
+ });
98
+ return result;
99
+ }, [options]);
100
+
101
+ // 获取所有可选项(不包含分组标题)
102
+ const allOptions = (0, _react.useMemo)(() => {
103
+ return flattenedOptions.filter(item => !item.isGroup);
104
+ }, [flattenedOptions]);
105
+
106
+ // 过滤选项
107
+ const filteredOptions = (0, _react.useMemo)(() => {
108
+ if (!searchValue || !filterOption) {
109
+ return flattenedOptions;
110
+ }
111
+ const filterFn = typeof filterOption === 'function' ? filterOption : (input, option) => {
112
+ const props = Array.isArray(optionFilterProp) ? optionFilterProp : [optionFilterProp || 'label'];
113
+ return props.some(prop => {
114
+ const value = option[prop];
115
+ if (typeof value === 'string') {
116
+ return value.toLowerCase().includes(input.toLowerCase());
117
+ }
118
+ return false;
119
+ });
120
+ };
121
+ const filtered = flattenedOptions.filter(item => {
122
+ if (isSelectFlattenedGroupOption(item)) return true;
123
+ return filterFn(searchValue, item);
124
+ });
125
+
126
+ // 排序
127
+ if (filterSort) {
128
+ const sortableItems = filtered.filter(item => isOptionType(item));
129
+ sortableItems.sort((a, b) => filterSort(a, b, {
130
+ searchValue
131
+ }));
132
+ return sortableItems;
133
+ }
134
+ return filtered;
135
+ }, [flattenedOptions, searchValue, filterOption, filterSort, optionFilterProp]);
136
+
137
+ // 获取选中的选项
138
+ const selectedOptions = (0, _react.useMemo)(() => {
139
+ if (!value) return [];
140
+ if (mode) {
141
+ const values = Array.isArray(value) ? value : [];
142
+ return values.map(v => {
143
+ return allOptions.find(opt => opt.value === v);
144
+ }).filter(Boolean);
145
+ } else {
146
+ const option = allOptions.find(opt => opt.value === value);
147
+ return option ? [option] : [];
148
+ }
149
+ }, [value, allOptions, mode]);
150
+
151
+ // 判断选项是否被选中
152
+ const isOptionSelected = (0, _ahooks.useMemoizedFn)(option => {
153
+ if (!value) return false;
154
+ if (mode) {
155
+ const values = Array.isArray(value) ? value : [];
156
+ return values.some(v => v === option.value);
157
+ } else {
158
+ return value === option.value;
159
+ }
160
+ });
161
+ return {
162
+ flattenedOptions,
163
+ allOptions,
164
+ filteredOptions,
165
+ selectedOptions,
166
+ isOptionSelected
167
+ };
168
+ };
169
+ exports.useSelectOptions = useSelectOptions;
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useSelector = void 0;
7
+ var _ahooks = require("ahooks");
8
+ var _react = require("react");
9
+ /**
10
+ * 选择器 Hook 参数
11
+ */
12
+
13
+ /**
14
+ * 选择器 Hook 返回值
15
+ */
16
+
17
+ /**
18
+ * 选择器 Hook
19
+ *
20
+ * 封装 Select 组件中与选择器相关的逻辑,包括:
21
+ * - 选择器 ref 管理
22
+ * - 打开/关闭状态管理
23
+ * - 选择器位置获取
24
+ * - 焦点状态管理
25
+ * - 选择器点击处理
26
+ *
27
+ * @example
28
+ * const {
29
+ * selectorRef,
30
+ * open,
31
+ * selectorLayout,
32
+ * isFocused,
33
+ * handleSelectorPress,
34
+ * handleSelectorLayout
35
+ * } = useSelector({
36
+ * defaultOpen: false,
37
+ * disabled: false,
38
+ * onOpenChange
39
+ * });
40
+ */
41
+ const useSelector = params => {
42
+ const selectorRef = (0, _react.useRef)(null);
43
+ const [open, setOpen] = (0, _ahooks.useControllableValue)(params, {
44
+ valuePropName: 'open',
45
+ defaultValuePropName: 'defaultOpen',
46
+ trigger: 'onOpenChange'
47
+ });
48
+ const [selectorLayout, setSelectorLayout] = (0, _react.useState)(null);
49
+ const [isFocused, setIsFocused] = (0, _react.useState)(false);
50
+
51
+ // 更新选择器位置
52
+ const updateSelectorLayout = (0, _ahooks.useMemoizedFn)(() => {
53
+ if (!selectorRef.current?.measure) return;
54
+ selectorRef.current.measure((_x, _y, width, height, pageX, pageY) => {
55
+ setSelectorLayout({
56
+ x: pageX,
57
+ y: pageY,
58
+ width,
59
+ height
60
+ });
61
+ });
62
+ });
63
+
64
+ // 处理选择器点击
65
+ const handleSelectorPress = (0, _ahooks.useMemoizedFn)(() => {
66
+ if (params.disabled) return;
67
+ if (!open) {
68
+ // 打开下拉框时,先获取位置再打开
69
+ updateSelectorLayout();
70
+ setOpen(true);
71
+ setIsFocused(true);
72
+ } else {
73
+ // 关闭下拉框
74
+ setOpen(false);
75
+ setIsFocused(false);
76
+ }
77
+ });
78
+
79
+ // 处理选择器布局变化
80
+ const handleSelectorLayout = (0, _ahooks.useMemoizedFn)(() => {
81
+ // 当选择器布局变化时,如果下拉框是打开的,更新位置
82
+ if (open) {
83
+ updateSelectorLayout();
84
+ }
85
+ });
86
+
87
+ // 关闭下拉框
88
+ const closePopup = (0, _ahooks.useMemoizedFn)(() => {
89
+ setOpen(false);
90
+ setIsFocused(false);
91
+ });
92
+ return {
93
+ selectorRef,
94
+ open,
95
+ selectorLayout,
96
+ isFocused,
97
+ setOpen,
98
+ updateSelectorLayout,
99
+ handleSelectorPress,
100
+ handleSelectorLayout,
101
+ closePopup
102
+ };
103
+ };
104
+ exports.useSelector = useSelector;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ var _select = require("./select.js");
7
+ Object.keys(_select).forEach(function (key) {
8
+ if (key === "default" || key === "__esModule") return;
9
+ if (key in exports && exports[key] === _select[key]) return;
10
+ Object.defineProperty(exports, key, {
11
+ enumerable: true,
12
+ get: function () {
13
+ return _select[key];
14
+ }
15
+ });
16
+ });