@seakoi/native-ui 1.1.3 → 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 (376) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/dist/commonjs/components/base/carousel/carousel-indicator.js +56 -0
  3. package/dist/commonjs/components/base/carousel/carousel-slides.js +140 -0
  4. package/dist/commonjs/components/base/carousel/carousel.js +114 -122
  5. package/dist/commonjs/components/base/carousel/hooks/index.js +0 -14
  6. package/dist/commonjs/components/base/carousel/hooks/use-carousel-index.js +16 -13
  7. package/dist/commonjs/components/base/carousel/hooks/use-carousel-lifecycle.js +6 -2
  8. package/dist/commonjs/components/base/carousel/hooks/use-carousel-pan-responder.js +40 -12
  9. package/dist/commonjs/components/base/carousel/hooks/use-carousel-position.js +6 -2
  10. package/dist/commonjs/components/base/carousel/index.js +1 -15
  11. package/dist/commonjs/components/base/carousel/style/index.js +12 -0
  12. package/dist/commonjs/components/base/date-picker/date-picker.js +56 -44
  13. package/dist/commonjs/components/base/date-picker/date-range-picker.js +142 -50
  14. package/dist/commonjs/components/base/date-picker/style/index.js +15 -0
  15. package/dist/commonjs/components/base/date-picker-view/date-picker-view.js +19 -53
  16. package/dist/commonjs/components/base/date-picker-view/index.js +0 -22
  17. package/dist/commonjs/components/base/index.js +53 -9
  18. package/dist/commonjs/components/base/input/base-input.js +4 -2
  19. package/dist/commonjs/components/base/overflow/all-mode-overflow.js +49 -0
  20. package/dist/commonjs/components/base/overflow/fixed-count-overflow.js +70 -0
  21. package/dist/commonjs/components/base/overflow/index.js +16 -0
  22. package/dist/commonjs/components/base/overflow/overflow.js +72 -0
  23. package/dist/commonjs/components/base/overflow/responsive-overflow.js +280 -0
  24. package/dist/commonjs/components/base/overflow/style/index.js +39 -0
  25. package/dist/commonjs/components/base/overflow/types.js +5 -0
  26. package/dist/commonjs/components/base/picker/index.js +26 -4
  27. package/dist/commonjs/components/base/picker/picker-content.js +64 -0
  28. package/dist/commonjs/components/base/picker/picker-context.js +9 -0
  29. package/dist/commonjs/components/base/picker/picker-field.js +39 -0
  30. package/dist/commonjs/components/base/picker/picker.js +26 -95
  31. package/dist/commonjs/components/base/picker/style/index.js +8 -4
  32. package/dist/commonjs/components/base/picker-backup/base-picker-container.js +50 -0
  33. package/dist/commonjs/components/base/picker-backup/index.js +27 -0
  34. package/dist/commonjs/components/base/picker-backup/picker-backup.js +75 -0
  35. package/dist/commonjs/components/base/picker-backup/picker-copy.js +106 -0
  36. package/dist/commonjs/components/base/{picker → picker-backup}/picker-trigger.js +5 -5
  37. package/dist/commonjs/components/base/picker-backup/style/index.js +19 -0
  38. package/dist/commonjs/components/base/picker-backup/utils.js +53 -0
  39. package/dist/commonjs/components/base/picker-view/picker-view-column.js +15 -0
  40. package/dist/commonjs/components/base/picker-view/picker-view.js +4 -4
  41. package/dist/commonjs/components/base/portal/portal-host.js +5 -3
  42. package/dist/commonjs/components/base/select/hooks/use-select-actions.js +155 -0
  43. package/dist/commonjs/components/base/select/hooks/use-select-options.js +169 -0
  44. package/dist/commonjs/components/base/select/hooks/use-selector.js +104 -0
  45. package/dist/commonjs/components/base/select/index.js +16 -0
  46. package/dist/commonjs/components/base/select/select-multiple-content.js +182 -0
  47. package/dist/commonjs/components/base/select/select-popup.js +233 -0
  48. package/dist/commonjs/components/base/select/select-single-content.js +100 -0
  49. package/dist/commonjs/components/base/select/select-suffix.js +67 -0
  50. package/dist/commonjs/components/base/select/select.js +285 -0
  51. package/dist/commonjs/components/base/select/style/index.js +40 -0
  52. package/dist/commonjs/components/base/select/style/select-multiple-content-styles.js +46 -0
  53. package/dist/commonjs/components/base/select/style/select-popup-styles.js +67 -0
  54. package/dist/commonjs/components/base/select/style/select-single-content-styles.js +28 -0
  55. package/dist/commonjs/components/base/select/style/select-styles.js +46 -0
  56. package/dist/commonjs/components/base/select/style/select-suffix-styles.js +21 -0
  57. package/dist/commonjs/components/base/select/types.js +5 -0
  58. package/dist/commonjs/components/base/tabs/style/index.js +37 -0
  59. package/dist/commonjs/components/base/tabs/tabs.js +90 -45
  60. package/dist/commonjs/components/base/tag/index.js +20 -0
  61. package/dist/commonjs/components/base/tag/style/index.js +89 -0
  62. package/dist/commonjs/components/base/tag/tag-context.js +12 -0
  63. package/dist/commonjs/components/base/tag/tag-group.js +35 -0
  64. package/dist/commonjs/components/base/tag/tag.js +47 -0
  65. package/dist/commonjs/components/base/tag/types.js +5 -0
  66. package/dist/commonjs/native-provider/native-provider.js +5 -5
  67. package/dist/commonjs/shared/utils/index.js +11 -0
  68. package/dist/commonjs/shared/utils/object.js +39 -0
  69. package/dist/module/components/base/carousel/carousel-indicator.js +51 -0
  70. package/dist/module/components/base/carousel/carousel-slides.js +135 -0
  71. package/dist/module/components/base/carousel/carousel.js +116 -124
  72. package/dist/module/components/base/carousel/hooks/index.js +0 -2
  73. package/dist/module/components/base/carousel/hooks/use-carousel-index.js +15 -11
  74. package/dist/module/components/base/carousel/hooks/use-carousel-lifecycle.js +6 -2
  75. package/dist/module/components/base/carousel/hooks/use-carousel-pan-responder.js +40 -11
  76. package/dist/module/components/base/carousel/hooks/use-carousel-position.js +5 -1
  77. package/dist/module/components/base/carousel/index.js +1 -5
  78. package/dist/module/components/base/carousel/style/index.js +12 -0
  79. package/dist/module/components/base/date-picker/date-picker.js +60 -48
  80. package/dist/module/components/base/date-picker/date-range-picker.js +146 -54
  81. package/dist/module/components/base/date-picker/style/index.js +11 -0
  82. package/dist/module/components/base/date-picker-view/date-picker-view.js +23 -57
  83. package/dist/module/components/base/date-picker-view/index.js +1 -3
  84. package/dist/module/components/base/index.js +4 -0
  85. package/dist/module/components/base/input/base-input.js +4 -2
  86. package/dist/module/components/base/overflow/all-mode-overflow.js +43 -0
  87. package/dist/module/components/base/overflow/fixed-count-overflow.js +64 -0
  88. package/dist/module/components/base/overflow/index.js +3 -0
  89. package/dist/module/components/base/overflow/overflow.js +66 -0
  90. package/dist/module/components/base/overflow/responsive-overflow.js +274 -0
  91. package/dist/module/components/base/overflow/style/index.js +36 -0
  92. package/dist/module/components/base/overflow/types.js +3 -0
  93. package/dist/module/components/base/picker/index.js +9 -1
  94. package/dist/module/components/base/picker/picker-content.js +58 -0
  95. package/dist/module/components/base/picker/picker-context.js +4 -0
  96. package/dist/module/components/base/picker/picker-field.js +34 -0
  97. package/dist/module/components/base/picker/picker.js +29 -98
  98. package/dist/module/components/base/picker/style/index.js +7 -3
  99. package/dist/module/components/base/picker-backup/base-picker-container.js +44 -0
  100. package/dist/module/components/base/picker-backup/index.js +4 -0
  101. package/dist/module/components/base/picker-backup/picker-backup.js +69 -0
  102. package/dist/module/components/base/picker-backup/picker-copy.js +101 -0
  103. package/dist/module/components/base/{picker → picker-backup}/picker-trigger.js +2 -2
  104. package/dist/module/components/base/picker-backup/style/index.js +15 -0
  105. package/dist/module/components/base/picker-backup/utils.js +48 -0
  106. package/dist/module/components/base/picker-view/picker-view-column.js +15 -0
  107. package/dist/module/components/base/picker-view/picker-view.js +4 -4
  108. package/dist/module/components/base/portal/portal-host.js +4 -3
  109. package/dist/module/components/base/select/hooks/use-select-actions.js +151 -0
  110. package/dist/module/components/base/select/hooks/use-select-options.js +162 -0
  111. package/dist/module/components/base/select/hooks/use-selector.js +100 -0
  112. package/dist/module/components/base/select/index.js +3 -0
  113. package/dist/module/components/base/select/select-multiple-content.js +176 -0
  114. package/dist/module/components/base/select/select-popup.js +227 -0
  115. package/dist/module/components/base/select/select-single-content.js +94 -0
  116. package/dist/module/components/base/select/select-suffix.js +61 -0
  117. package/dist/module/components/base/select/select.js +279 -0
  118. package/dist/module/components/base/select/style/index.js +7 -0
  119. package/dist/module/components/base/select/style/select-multiple-content-styles.js +43 -0
  120. package/dist/module/components/base/select/style/select-popup-styles.js +64 -0
  121. package/dist/module/components/base/select/style/select-single-content-styles.js +25 -0
  122. package/dist/module/components/base/select/style/select-styles.js +43 -0
  123. package/dist/module/components/base/select/style/select-suffix-styles.js +18 -0
  124. package/dist/module/components/base/select/types.js +3 -0
  125. package/dist/module/components/base/tabs/style/index.js +33 -0
  126. package/dist/module/components/base/tabs/tabs.js +92 -47
  127. package/dist/module/components/base/tag/index.js +5 -0
  128. package/dist/module/components/base/tag/style/index.js +85 -0
  129. package/dist/module/components/base/tag/tag-context.js +8 -0
  130. package/dist/module/components/base/tag/tag-group.js +29 -0
  131. package/dist/module/components/base/tag/tag.js +41 -0
  132. package/dist/module/components/base/tag/types.js +3 -0
  133. package/dist/module/native-provider/native-provider.js +5 -5
  134. package/dist/module/shared/utils/index.js +2 -1
  135. package/dist/module/shared/utils/object.js +35 -0
  136. package/dist/typescript/components/base/carousel/carousel-indicator.d.ts +42 -0
  137. package/dist/typescript/components/base/carousel/carousel-indicator.d.ts.map +1 -0
  138. package/dist/typescript/components/base/carousel/carousel-slides.d.ts +49 -0
  139. package/dist/typescript/components/base/carousel/carousel-slides.d.ts.map +1 -0
  140. package/dist/typescript/components/base/carousel/carousel.d.ts +16 -11
  141. package/dist/typescript/components/base/carousel/carousel.d.ts.map +1 -1
  142. package/dist/typescript/components/base/carousel/hooks/index.d.ts +0 -2
  143. package/dist/typescript/components/base/carousel/hooks/index.d.ts.map +1 -1
  144. package/dist/typescript/components/base/carousel/hooks/use-carousel-index.d.ts.map +1 -1
  145. package/dist/typescript/components/base/carousel/hooks/use-carousel-lifecycle.d.ts.map +1 -1
  146. package/dist/typescript/components/base/carousel/hooks/use-carousel-pan-responder.d.ts.map +1 -1
  147. package/dist/typescript/components/base/carousel/hooks/use-carousel-position.d.ts.map +1 -1
  148. package/dist/typescript/components/base/carousel/index.d.ts +1 -4
  149. package/dist/typescript/components/base/carousel/index.d.ts.map +1 -1
  150. package/dist/typescript/components/base/carousel/style/index.d.ts +12 -0
  151. package/dist/typescript/components/base/carousel/style/index.d.ts.map +1 -1
  152. package/dist/typescript/components/base/carousel/types.d.ts +8 -17
  153. package/dist/typescript/components/base/carousel/types.d.ts.map +1 -1
  154. package/dist/typescript/components/base/date-picker/date-picker.d.ts +4 -2
  155. package/dist/typescript/components/base/date-picker/date-picker.d.ts.map +1 -1
  156. package/dist/typescript/components/base/date-picker/date-range-picker.d.ts +12 -3
  157. package/dist/typescript/components/base/date-picker/date-range-picker.d.ts.map +1 -1
  158. package/dist/typescript/components/base/date-picker/style/index.d.ts +9 -0
  159. package/dist/typescript/components/base/date-picker/style/index.d.ts.map +1 -0
  160. package/dist/typescript/components/base/date-picker-view/date-picker-view.d.ts +1 -6
  161. package/dist/typescript/components/base/date-picker-view/date-picker-view.d.ts.map +1 -1
  162. package/dist/typescript/components/base/date-picker-view/index.d.ts +0 -2
  163. package/dist/typescript/components/base/date-picker-view/index.d.ts.map +1 -1
  164. package/dist/typescript/components/base/date-picker-view/types.d.ts +1 -1
  165. package/dist/typescript/components/base/index.d.ts +4 -0
  166. package/dist/typescript/components/base/index.d.ts.map +1 -1
  167. package/dist/typescript/components/base/input/base-input.d.ts.map +1 -1
  168. package/dist/typescript/components/base/overflow/all-mode-overflow.d.ts +11 -0
  169. package/dist/typescript/components/base/overflow/all-mode-overflow.d.ts.map +1 -0
  170. package/dist/typescript/components/base/overflow/fixed-count-overflow.d.ts +11 -0
  171. package/dist/typescript/components/base/overflow/fixed-count-overflow.d.ts.map +1 -0
  172. package/dist/typescript/components/base/overflow/index.d.ts +3 -0
  173. package/dist/typescript/components/base/overflow/index.d.ts.map +1 -0
  174. package/dist/typescript/components/base/overflow/overflow.d.ts +13 -0
  175. package/dist/typescript/components/base/overflow/overflow.d.ts.map +1 -0
  176. package/dist/typescript/components/base/overflow/responsive-overflow.d.ts +12 -0
  177. package/dist/typescript/components/base/overflow/responsive-overflow.d.ts.map +1 -0
  178. package/dist/typescript/components/base/overflow/style/index.d.ts +31 -0
  179. package/dist/typescript/components/base/overflow/style/index.d.ts.map +1 -0
  180. package/dist/typescript/components/base/overflow/types.d.ts +77 -0
  181. package/dist/typescript/components/base/overflow/types.d.ts.map +1 -0
  182. package/dist/typescript/components/base/picker/index.d.ts +7 -1
  183. package/dist/typescript/components/base/picker/index.d.ts.map +1 -1
  184. package/dist/typescript/components/base/picker/picker-content.d.ts +27 -0
  185. package/dist/typescript/components/base/picker/picker-content.d.ts.map +1 -0
  186. package/dist/typescript/components/base/picker/picker-context.d.ts +18 -0
  187. package/dist/typescript/components/base/picker/picker-context.d.ts.map +1 -0
  188. package/dist/typescript/components/base/picker/picker-field.d.ts +10 -0
  189. package/dist/typescript/components/base/picker/picker-field.d.ts.map +1 -0
  190. package/dist/typescript/components/base/picker/picker.d.ts +22 -11
  191. package/dist/typescript/components/base/picker/picker.d.ts.map +1 -1
  192. package/dist/typescript/components/base/picker/style/index.d.ts +6 -2
  193. package/dist/typescript/components/base/picker/style/index.d.ts.map +1 -1
  194. package/dist/typescript/components/base/picker-backup/base-picker-container.d.ts +15 -0
  195. package/dist/typescript/components/base/picker-backup/base-picker-container.d.ts.map +1 -0
  196. package/dist/typescript/components/base/picker-backup/index.d.ts +3 -0
  197. package/dist/typescript/components/base/picker-backup/index.d.ts.map +1 -0
  198. package/dist/typescript/components/base/picker-backup/picker-backup.d.ts +26 -0
  199. package/dist/typescript/components/base/picker-backup/picker-backup.d.ts.map +1 -0
  200. package/dist/typescript/components/base/picker-backup/picker-copy.d.ts +13 -0
  201. package/dist/typescript/components/base/picker-backup/picker-copy.d.ts.map +1 -0
  202. package/dist/typescript/components/base/picker-backup/picker-trigger.d.ts.map +1 -0
  203. package/dist/typescript/components/base/picker-backup/style/index.d.ts +13 -0
  204. package/dist/typescript/components/base/picker-backup/style/index.d.ts.map +1 -0
  205. package/dist/typescript/components/base/picker-backup/utils.d.ts +8 -0
  206. package/dist/typescript/components/base/picker-backup/utils.d.ts.map +1 -0
  207. package/dist/typescript/components/base/picker-view/picker-view-column.d.ts.map +1 -1
  208. package/dist/typescript/components/base/picker-view/utils/picker.d.ts +3 -3
  209. package/dist/typescript/components/base/picker-view/utils/picker.d.ts.map +1 -1
  210. package/dist/typescript/components/base/portal/portal-host.d.ts +1 -0
  211. package/dist/typescript/components/base/portal/portal-host.d.ts.map +1 -1
  212. package/dist/typescript/components/base/portal/types.d.ts +2 -0
  213. package/dist/typescript/components/base/portal/types.d.ts.map +1 -1
  214. package/dist/typescript/components/base/select/hooks/use-select-actions.d.ts +144 -0
  215. package/dist/typescript/components/base/select/hooks/use-select-actions.d.ts.map +1 -0
  216. package/dist/typescript/components/base/select/hooks/use-select-options.d.ts +91 -0
  217. package/dist/typescript/components/base/select/hooks/use-select-options.d.ts.map +1 -0
  218. package/dist/typescript/components/base/select/hooks/use-selector.d.ts +90 -0
  219. package/dist/typescript/components/base/select/hooks/use-selector.d.ts.map +1 -0
  220. package/dist/typescript/components/base/select/index.d.ts +3 -0
  221. package/dist/typescript/components/base/select/index.d.ts.map +1 -0
  222. package/dist/typescript/components/base/select/select-multiple-content.d.ts +51 -0
  223. package/dist/typescript/components/base/select/select-multiple-content.d.ts.map +1 -0
  224. package/dist/typescript/components/base/select/select-popup.d.ts +107 -0
  225. package/dist/typescript/components/base/select/select-popup.d.ts.map +1 -0
  226. package/dist/typescript/components/base/select/select-single-content.d.ts +48 -0
  227. package/dist/typescript/components/base/select/select-single-content.d.ts.map +1 -0
  228. package/dist/typescript/components/base/select/select-suffix.d.ts +43 -0
  229. package/dist/typescript/components/base/select/select-suffix.d.ts.map +1 -0
  230. package/dist/typescript/components/base/select/select.d.ts +40 -0
  231. package/dist/typescript/components/base/select/select.d.ts.map +1 -0
  232. package/dist/typescript/components/base/select/style/index.d.ts +6 -0
  233. package/dist/typescript/components/base/select/style/index.d.ts.map +1 -0
  234. package/dist/typescript/components/base/select/style/select-multiple-content-styles.d.ts +40 -0
  235. package/dist/typescript/components/base/select/style/select-multiple-content-styles.d.ts.map +1 -0
  236. package/dist/typescript/components/base/select/style/select-popup-styles.d.ts +61 -0
  237. package/dist/typescript/components/base/select/style/select-popup-styles.d.ts.map +1 -0
  238. package/dist/typescript/components/base/select/style/select-single-content-styles.d.ts +22 -0
  239. package/dist/typescript/components/base/select/style/select-single-content-styles.d.ts.map +1 -0
  240. package/dist/typescript/components/base/select/style/select-styles.d.ts +40 -0
  241. package/dist/typescript/components/base/select/style/select-styles.d.ts.map +1 -0
  242. package/dist/typescript/components/base/select/style/select-suffix-styles.d.ts +15 -0
  243. package/dist/typescript/components/base/select/style/select-suffix-styles.d.ts.map +1 -0
  244. package/dist/typescript/components/base/select/types.d.ts +206 -0
  245. package/dist/typescript/components/base/select/types.d.ts.map +1 -0
  246. package/dist/typescript/components/base/tabs/style/index.d.ts +29 -0
  247. package/dist/typescript/components/base/tabs/style/index.d.ts.map +1 -0
  248. package/dist/typescript/components/base/tabs/tabs.d.ts +26 -5
  249. package/dist/typescript/components/base/tabs/tabs.d.ts.map +1 -1
  250. package/dist/typescript/components/base/tag/index.d.ts +5 -0
  251. package/dist/typescript/components/base/tag/index.d.ts.map +1 -0
  252. package/dist/typescript/components/base/tag/style/index.d.ts +61 -0
  253. package/dist/typescript/components/base/tag/style/index.d.ts.map +1 -0
  254. package/dist/typescript/components/base/tag/tag-context.d.ts +3 -0
  255. package/dist/typescript/components/base/tag/tag-context.d.ts.map +1 -0
  256. package/dist/typescript/components/base/tag/tag-group.d.ts +4 -0
  257. package/dist/typescript/components/base/tag/tag-group.d.ts.map +1 -0
  258. package/dist/typescript/components/base/tag/tag.d.ts +4 -0
  259. package/dist/typescript/components/base/tag/tag.d.ts.map +1 -0
  260. package/dist/typescript/components/base/tag/types.d.ts +48 -0
  261. package/dist/typescript/components/base/tag/types.d.ts.map +1 -0
  262. package/dist/typescript/native-provider/native-provider.d.ts +2 -0
  263. package/dist/typescript/native-provider/native-provider.d.ts.map +1 -1
  264. package/dist/typescript/shared/utils/index.d.ts +1 -0
  265. package/dist/typescript/shared/utils/index.d.ts.map +1 -1
  266. package/dist/typescript/shared/utils/object.d.ts +21 -0
  267. package/dist/typescript/shared/utils/object.d.ts.map +1 -0
  268. package/package.json +1 -1
  269. package/src/components/base/carousel/carousel-indicator.tsx +80 -0
  270. package/src/components/base/carousel/carousel-slides.tsx +177 -0
  271. package/src/components/base/carousel/carousel.tsx +108 -118
  272. package/src/components/base/carousel/hooks/index.ts +0 -2
  273. package/src/components/base/carousel/hooks/use-carousel-index.ts +13 -9
  274. package/src/components/base/carousel/hooks/use-carousel-lifecycle.ts +4 -3
  275. package/src/components/base/carousel/hooks/use-carousel-pan-responder.ts +40 -16
  276. package/src/components/base/carousel/hooks/use-carousel-position.ts +4 -1
  277. package/src/components/base/carousel/index.ts +1 -3
  278. package/src/components/base/carousel/style/index.ts +12 -0
  279. package/src/components/base/carousel/types.ts +8 -21
  280. package/src/components/base/date-picker/date-picker.tsx +64 -61
  281. package/src/components/base/date-picker/date-range-picker.tsx +178 -70
  282. package/src/components/base/date-picker/style/index.ts +10 -0
  283. package/src/components/base/date-picker-view/date-picker-view.tsx +21 -68
  284. package/src/components/base/date-picker-view/index.ts +0 -2
  285. package/src/components/base/date-picker-view/types.ts +1 -1
  286. package/src/components/base/index.ts +4 -0
  287. package/src/components/base/input/base-input.tsx +4 -2
  288. package/src/components/base/overflow/all-mode-overflow.tsx +49 -0
  289. package/src/components/base/overflow/fixed-count-overflow.tsx +71 -0
  290. package/src/components/base/overflow/index.ts +2 -0
  291. package/src/components/base/overflow/overflow.tsx +60 -0
  292. package/src/components/base/overflow/responsive-overflow.tsx +349 -0
  293. package/src/components/base/overflow/style/index.ts +32 -0
  294. package/src/components/base/overflow/types.ts +75 -0
  295. package/src/components/base/picker/index.ts +11 -1
  296. package/src/components/base/picker/picker-content.tsx +90 -0
  297. package/src/components/base/picker/picker-context.ts +19 -0
  298. package/src/components/base/picker/picker-field.tsx +56 -0
  299. package/src/components/base/picker/picker.tsx +49 -116
  300. package/src/components/base/picker/style/index.ts +4 -2
  301. package/src/components/base/picker-backup/base-picker-container.tsx +55 -0
  302. package/src/components/base/picker-backup/index.ts +2 -0
  303. package/src/components/base/picker-backup/picker-backup.tsx +110 -0
  304. package/src/components/base/picker-backup/picker-copy.tsx +125 -0
  305. package/src/components/base/{picker → picker-backup}/picker-trigger.tsx +2 -2
  306. package/src/components/base/picker-backup/style/index.ts +14 -0
  307. package/src/components/base/picker-backup/utils.ts +62 -0
  308. package/src/components/base/picker-view/picker-view-column.tsx +20 -0
  309. package/src/components/base/picker-view/picker-view.tsx +4 -4
  310. package/src/components/base/picker-view/utils/picker.ts +3 -5
  311. package/src/components/base/portal/portal-host.tsx +13 -3
  312. package/src/components/base/portal/types.ts +2 -0
  313. package/src/components/base/select/hooks/use-select-actions.ts +263 -0
  314. package/src/components/base/select/hooks/use-select-options.ts +250 -0
  315. package/src/components/base/select/hooks/use-selector.ts +155 -0
  316. package/src/components/base/select/index.ts +2 -0
  317. package/src/components/base/select/select-multiple-content.tsx +292 -0
  318. package/src/components/base/select/select-popup.tsx +384 -0
  319. package/src/components/base/select/select-single-content.tsx +127 -0
  320. package/src/components/base/select/select-suffix.tsx +100 -0
  321. package/src/components/base/select/select.tsx +302 -0
  322. package/src/components/base/select/style/index.ts +5 -0
  323. package/src/components/base/select/style/select-multiple-content-styles.ts +41 -0
  324. package/src/components/base/select/style/select-popup-styles.ts +62 -0
  325. package/src/components/base/select/style/select-single-content-styles.ts +23 -0
  326. package/src/components/base/select/style/select-styles.ts +41 -0
  327. package/src/components/base/select/style/select-suffix-styles.ts +16 -0
  328. package/src/components/base/select/types.ts +261 -0
  329. package/src/components/base/tabs/style/index.ts +32 -0
  330. package/src/components/base/tabs/tabs.tsx +146 -55
  331. package/src/components/base/tag/index.ts +5 -0
  332. package/src/components/base/tag/style/index.tsx +84 -0
  333. package/src/components/base/tag/tag-context.ts +9 -0
  334. package/src/components/base/tag/tag-group.tsx +31 -0
  335. package/src/components/base/tag/tag.tsx +50 -0
  336. package/src/components/base/tag/types.ts +71 -0
  337. package/src/native-provider/native-provider.tsx +4 -4
  338. package/src/shared/utils/index.ts +1 -0
  339. package/src/shared/utils/object.ts +37 -0
  340. package/dist/commonjs/components/base/carousel/carousel-item.js +0 -45
  341. package/dist/commonjs/components/base/carousel/constants.js +0 -25
  342. package/dist/commonjs/components/base/carousel/hooks/use-carousel-indicator.js +0 -63
  343. package/dist/commonjs/components/base/carousel/hooks/use-carousel-slides.js +0 -95
  344. package/dist/commonjs/components/base/carousel/utils.js +0 -63
  345. package/dist/commonjs/components/base/date-picker-view/date-range-picker-view.js +0 -145
  346. package/dist/commonjs/components/base/date-picker-view/date-time-picker.js +0 -39
  347. package/dist/module/components/base/carousel/carousel-item.js +0 -40
  348. package/dist/module/components/base/carousel/constants.js +0 -21
  349. package/dist/module/components/base/carousel/hooks/use-carousel-indicator.js +0 -58
  350. package/dist/module/components/base/carousel/hooks/use-carousel-slides.js +0 -90
  351. package/dist/module/components/base/carousel/utils.js +0 -55
  352. package/dist/module/components/base/date-picker-view/date-range-picker-view.js +0 -138
  353. package/dist/module/components/base/date-picker-view/date-time-picker.js +0 -34
  354. package/dist/typescript/components/base/carousel/carousel-item.d.ts +0 -26
  355. package/dist/typescript/components/base/carousel/carousel-item.d.ts.map +0 -1
  356. package/dist/typescript/components/base/carousel/constants.d.ts +0 -17
  357. package/dist/typescript/components/base/carousel/constants.d.ts.map +0 -1
  358. package/dist/typescript/components/base/carousel/hooks/use-carousel-indicator.d.ts +0 -37
  359. package/dist/typescript/components/base/carousel/hooks/use-carousel-indicator.d.ts.map +0 -1
  360. package/dist/typescript/components/base/carousel/hooks/use-carousel-slides.d.ts +0 -51
  361. package/dist/typescript/components/base/carousel/hooks/use-carousel-slides.d.ts.map +0 -1
  362. package/dist/typescript/components/base/carousel/utils.d.ts +0 -25
  363. package/dist/typescript/components/base/carousel/utils.d.ts.map +0 -1
  364. package/dist/typescript/components/base/date-picker-view/date-range-picker-view.d.ts +0 -26
  365. package/dist/typescript/components/base/date-picker-view/date-range-picker-view.d.ts.map +0 -1
  366. package/dist/typescript/components/base/date-picker-view/date-time-picker.d.ts +0 -3
  367. package/dist/typescript/components/base/date-picker-view/date-time-picker.d.ts.map +0 -1
  368. package/dist/typescript/components/base/picker/picker-trigger.d.ts.map +0 -1
  369. package/src/components/base/carousel/carousel-item.tsx +0 -35
  370. package/src/components/base/carousel/constants.ts +0 -19
  371. package/src/components/base/carousel/hooks/use-carousel-indicator.tsx +0 -84
  372. package/src/components/base/carousel/hooks/use-carousel-slides.tsx +0 -131
  373. package/src/components/base/carousel/utils.ts +0 -55
  374. package/src/components/base/date-picker-view/date-range-picker-view.tsx +0 -191
  375. package/src/components/base/date-picker-view/date-time-picker.tsx +0 -34
  376. /package/dist/typescript/components/base/{picker → picker-backup}/picker-trigger.d.ts +0 -0
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+
3
+ import { useMemoizedFn } from 'ahooks';
4
+ import React, { useCallback, useMemo, useRef, useState } from 'react';
5
+ import { Button } from "../button/index.js";
6
+ import { Picker } from "../picker/index.js";
7
+ import { PickerView } from "../picker-view/index.js";
8
+ import { findOptionsByValue } from "../picker-view/utils/picker.js";
9
+ import { normalizeColumns } from "./utils.js";
10
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
11
+ export const PickerBackup = ({
12
+ placeholder = '请选择',
13
+ headerTitle = '请选择',
14
+ formatter,
15
+ confirmText = '确定',
16
+ columns: rawColumns,
17
+ fieldNames,
18
+ ...restProps
19
+ }) => {
20
+ const [draftValue, setDraftValue] = useState();
21
+ const committedValueRef = useRef(restProps.value ?? []);
22
+ const handleOpen = useCallback(() => {
23
+ setDraftValue(committedValueRef.current);
24
+ }, []);
25
+
26
+ /** 标准化列数据:将自定义字段名映射为内部标准格式 */
27
+ const columns = useMemo(() => normalizeColumns(rawColumns, fieldNames), [rawColumns, fieldNames]);
28
+
29
+ /** 格式化显示文案 - 根据 value 从 columns 计算 */
30
+ const _renderValue = useMemoizedFn(value => {
31
+ if (!value?.length) return;
32
+ const options = findOptionsByValue(value, columns);
33
+ if (formatter) {
34
+ return formatter(value, options);
35
+ }
36
+ return options.map(opt => opt?.label).filter(Boolean).join(' / ');
37
+ });
38
+ return /*#__PURE__*/_jsxs(Picker, {
39
+ ...restProps,
40
+ children: [/*#__PURE__*/_jsx(Picker.Field, {
41
+ placeholder: placeholder,
42
+ renderValue: _renderValue
43
+ }), /*#__PURE__*/_jsx(Picker.Content, {
44
+ headerTitle: headerTitle,
45
+ onOpen: handleOpen,
46
+ children: ({
47
+ onChange,
48
+ value: contextValue
49
+ }) => {
50
+ // 同步 ref:始终保持最新的已提交值
51
+ committedValueRef.current = contextValue ?? [];
52
+ return /*#__PURE__*/_jsxs(_Fragment, {
53
+ children: [/*#__PURE__*/_jsx(PickerView, {
54
+ columns: columns,
55
+ itemHeight: restProps.itemHeight,
56
+ value: draftValue,
57
+ onChange: setDraftValue
58
+ }), /*#__PURE__*/_jsx(Button, {
59
+ text: confirmText,
60
+ size: "large",
61
+ onPress: () => {
62
+ onChange?.(draftValue);
63
+ }
64
+ })]
65
+ });
66
+ }
67
+ })]
68
+ });
69
+ };
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+
3
+ import { useControllableValue, useMemoizedFn } from 'ahooks';
4
+ import { useMemo, useRef, useState } from 'react';
5
+ import { Button } from "../button/index.js";
6
+ import { Flex } from "../flex/index.js";
7
+ import { Modal, ModalHeader } from "../modal/index.js";
8
+ import { PickerView } from "../picker-view/index.js";
9
+ import { findOptionsByValue, getDefaultValues } from "../picker-view/utils/picker.js";
10
+ import { Portal } from "../portal/index.js";
11
+ import { PickerTrigger } from "./picker-trigger.js";
12
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
13
+ export const Picker = ({
14
+ placeholder = '请选择',
15
+ disabled = false,
16
+ title = '请选择',
17
+ formatter,
18
+ children,
19
+ style,
20
+ confirmText = '确定',
21
+ ...restProps
22
+ }) => {
23
+ const [value, setValue] = useControllableValue(restProps, {
24
+ defaultValue: restProps.defaultValue
25
+ });
26
+ const [visible, setVisible] = useState(false);
27
+
28
+ // 内部状态用于管理滚动时的临时值
29
+ const [localValue, setLocalValue] = useState(restProps.value ?? restProps.defaultValue ?? []);
30
+
31
+ // 滑动时的临时 options(不用于 displayText)
32
+ const localOptionsRef = useRef([]);
33
+
34
+ /** 格式化显示文案 - 根据 value 从 columns 计算 */
35
+ const displayText = useMemo(() => {
36
+ if (!value?.length) return '';
37
+
38
+ // 从 columns 计算对应的 options
39
+ const options = findOptionsByValue(value, restProps.columns);
40
+ if (formatter) {
41
+ return formatter(value, options);
42
+ }
43
+ return options.map(opt => opt?.label).filter(Boolean).join(' / ');
44
+ }, [value, restProps.columns, formatter]);
45
+ const handleOpen = useMemoizedFn(() => {
46
+ // 打开时同步外部 value 到内部
47
+ // 如果 value 为空,使用 columns 的默认值(第一个选项)
48
+ const initialValue = value?.length ? value : getDefaultValues(restProps.columns);
49
+ setLocalValue(initialValue);
50
+ setVisible(true);
51
+ });
52
+ const handleClose = useMemoizedFn(() => {
53
+ setVisible(false);
54
+ });
55
+ const handleChange = useMemoizedFn((v, options) => {
56
+ setLocalValue(v);
57
+ localOptionsRef.current = options;
58
+ });
59
+ const handleConfirm = useMemoizedFn(() => {
60
+ setVisible(false);
61
+ setValue(localValue);
62
+ });
63
+ return /*#__PURE__*/_jsxs(_Fragment, {
64
+ children: [/*#__PURE__*/_jsx(PickerTrigger, {
65
+ displayText: displayText,
66
+ placeholder: placeholder,
67
+ disabled: disabled,
68
+ style: style,
69
+ onPress: handleOpen,
70
+ children: children
71
+ }), /*#__PURE__*/_jsx(Portal, {
72
+ children: /*#__PURE__*/_jsx(Modal, {
73
+ visible: visible,
74
+ position: "bottom",
75
+ safeAreaInsetBottom: true,
76
+ contentHeight: '50%',
77
+ children: /*#__PURE__*/_jsxs(Flex, {
78
+ vertical: true,
79
+ align: "stretch",
80
+ gap: 16,
81
+ style: {
82
+ flex: 1,
83
+ padding: 16
84
+ },
85
+ children: [/*#__PURE__*/_jsx(ModalHeader, {
86
+ title: title,
87
+ onClose: handleClose
88
+ }), /*#__PURE__*/_jsx(PickerView, {
89
+ ...restProps,
90
+ value: localValue,
91
+ onChange: handleChange
92
+ }), /*#__PURE__*/_jsx(Button, {
93
+ text: confirmText,
94
+ size: "large",
95
+ onPress: handleConfirm
96
+ })]
97
+ })
98
+ })
99
+ })]
100
+ });
101
+ };
@@ -4,8 +4,8 @@ import React, { cloneElement, isValidElement } from 'react';
4
4
  import { TouchableOpacity } from 'react-native';
5
5
  import { useTheme } from "../../../native-provider/index.js";
6
6
  import { Flex } from "../flex/index.js";
7
+ import { usePickerFieldStyles } from "../picker/style/index.js";
7
8
  import { Text } from "../text/index.js";
8
- import { usePickerFieldStyles } from "./style/index.js";
9
9
 
10
10
  /** Picker 基础触发器 Props */
11
11
  import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
@@ -38,7 +38,7 @@ export const PickerTrigger = ({
38
38
  children: /*#__PURE__*/_jsx(Flex, {
39
39
  align: "center",
40
40
  gap: theme.spacing.sm,
41
- style: [styles.content, disabled && styles.disabled, style],
41
+ style: [disabled && styles.disabled, style],
42
42
  children: /*#__PURE__*/React.isValidElement(displayText) ? displayText : /*#__PURE__*/_jsx(Text, {
43
43
  size: 14,
44
44
  color: displayText ? theme.palette.fontGray1 : theme.palette.fontGray3,
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ import { createThemedStyles } from "../../../../native-provider/index.js";
4
+ export const usePickerFieldStyles = createThemedStyles(theme => ({
5
+ container: {
6
+ flex: 1,
7
+ alignSelf: 'stretch',
8
+ backgroundColor: theme.palette.white,
9
+ paddingVertical: 12,
10
+ paddingHorizontal: 12
11
+ },
12
+ disabled: {
13
+ backgroundColor: theme.palette.blueGray2
14
+ }
15
+ }));
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+
3
+ /** 默认字段名 */
4
+ const DEFAULT_FIELD_NAMES = {
5
+ label: 'label',
6
+ value: 'value',
7
+ children: 'children'
8
+ };
9
+
10
+ /**
11
+ * 将自定义字段名的数据标准化为内部使用的 { label, value, children } 格式
12
+ * 如果 fieldNames 与默认值相同,则直接返回原始数据(零开销)
13
+ */
14
+ export const normalizeColumns = (columns, fieldNames) => {
15
+ if (!fieldNames) return columns;
16
+ const merged = {
17
+ ...DEFAULT_FIELD_NAMES,
18
+ ...fieldNames
19
+ };
20
+
21
+ // 如果所有字段名都和默认值一样,无需转换
22
+ if (merged.label === 'label' && merged.value === 'value' && merged.children === 'children') {
23
+ return columns;
24
+ }
25
+ const normalizeOption = item => {
26
+ const normalized = {
27
+ ...item
28
+ };
29
+ if (merged.label !== 'label') {
30
+ normalized.label = item[merged.label];
31
+ }
32
+ if (merged.value !== 'value') {
33
+ normalized.value = item[merged.value];
34
+ }
35
+ if (merged.children !== 'children' && item[merged.children]) {
36
+ normalized.children = item[merged.children].map(normalizeOption);
37
+ } else if (item.children) {
38
+ normalized.children = item.children.map(normalizeOption);
39
+ }
40
+ return normalized;
41
+ };
42
+ return columns.map(column => {
43
+ if (Array.isArray(column)) {
44
+ return column.map(normalizeOption);
45
+ }
46
+ return normalizeOption(column);
47
+ });
48
+ };
@@ -48,6 +48,21 @@ export const PickerViewColumn = /*#__PURE__*/memo(({
48
48
  }
49
49
  });
50
50
  const selectedIndex = getSelectedIndex(options.findIndex(item => item.value === value));
51
+
52
+ /**
53
+ * 自初始化:当 value 为空或不在 options 中时,主动上报第一个可用选项
54
+ * 这从根本上解决了「不滚动就拿不到值」的问题
55
+ */
56
+ useEffect(() => {
57
+ if (options.length === 0) return;
58
+ const hasValidValue = value !== undefined && value !== null && options.some(item => item.value === value);
59
+ if (!hasValidValue) {
60
+ const defaultIndex = findUsableOptionIndex(options, true, 0, false);
61
+ if (defaultIndex >= 0) {
62
+ onChange?.(options[defaultIndex]);
63
+ }
64
+ }
65
+ }, [options, value, onChange]);
51
66
  useEffect(() => {
52
67
  if (selectedIndex >= 0 && selectedIndex < options.length) {
53
68
  flatListRef.current?.scrollToIndex({
@@ -47,8 +47,8 @@ export const PickerView = ({
47
47
  }, [dataType, columns, value]);
48
48
 
49
49
  // 保存 columnDefaultValues 到 ref,供 handleChange 使用
50
- const columnDefaultValuesRef = useRef(columnDefaultValues);
51
- columnDefaultValuesRef.current = columnDefaultValues;
50
+ // const columnDefaultValuesRef = useRef<PickerValue[]>(columnDefaultValues);
51
+ // columnDefaultValuesRef.current = columnDefaultValues;
52
52
 
53
53
  /** 获取容器实际高度 */
54
54
  const handleLayout = useCallback(event => {
@@ -72,7 +72,7 @@ export const PickerView = ({
72
72
  case 'multiple':
73
73
  {
74
74
  const newValues = [...value];
75
- columnDefaultValuesRef.current.forEach((item, i) => {
75
+ columnDefaultValues.forEach((item, i) => {
76
76
  if (isNil(newValues[i])) {
77
77
  newValues[i] = item;
78
78
  }
@@ -138,7 +138,7 @@ export const PickerView = ({
138
138
  }
139
139
  if (!isControlled && !isNoDefaultValue) {
140
140
  if (dataType === 'multiple') {
141
- return columnDefaultValuesRef.current[index];
141
+ return columnDefaultValues[index];
142
142
  }
143
143
 
144
144
  // 真的没有就默认第一个选项
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
 
3
- import { useCallback, useEffect, useMemo, useRef } from 'react';
3
+ import React, { useCallback, useEffect, useMemo, useRef } from 'react';
4
4
  import { DeviceEventEmitter, View } from 'react-native';
5
5
  import { NATIVE_UI_PORTAL_ADD_EVENT, NATIVE_UI_PORTAL_REMOVE_EVENT } from "../../../shared/constants/index.js";
6
6
  import { PortalContext, registerHost, unregisterHost } from "./portal-context.js";
@@ -9,7 +9,8 @@ import { usePortalHostStyles } from "./style/index.js";
9
9
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
10
10
  export const PortalHost = ({
11
11
  children,
12
- name
12
+ name,
13
+ style
13
14
  }) => {
14
15
  const portalHostStyles = usePortalHostStyles();
15
16
  const managerRef = useRef(null);
@@ -104,7 +105,7 @@ export const PortalHost = ({
104
105
  return /*#__PURE__*/_jsxs(PortalContext.Provider, {
105
106
  value: contextValue,
106
107
  children: [/*#__PURE__*/_jsx(View, {
107
- style: portalHostStyles.container,
108
+ style: [portalHostStyles.container, style],
108
109
  collapsable: false,
109
110
  children: children
110
111
  }), /*#__PURE__*/_jsx(PortalManager, {
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+
3
+ import { useMemoizedFn } from 'ahooks';
4
+
5
+ /**
6
+ * 选项操作 Hook 参数
7
+ *
8
+ * @template ValueType - 选项值的类型
9
+ */
10
+
11
+ /**
12
+ * 选项操作 Hook 返回值
13
+ */
14
+
15
+ /**
16
+ * 选项操作 Hook
17
+ *
18
+ * 封装 Select 组件中与选项操作相关的逻辑,包括:
19
+ * - 选项点击处理
20
+ * - 标签移除处理
21
+ * - 清除操作处理
22
+ * - 创建新选项处理
23
+ *
24
+ * @template ValueType - 选项值的类型
25
+ *
26
+ * @example
27
+ * const {
28
+ * handleOptionPress,
29
+ * handleTagClose,
30
+ * handleClear,
31
+ * handleCreateOption
32
+ * } = useSelectActions({
33
+ * value,
34
+ * mode,
35
+ * disabled,
36
+ * maxCount,
37
+ * autoClearSearchValue,
38
+ * setValue,
39
+ * clearSearch,
40
+ * closePopup,
41
+ * isOptionSelected,
42
+ * onSelect,
43
+ * onDeselect,
44
+ * onClear
45
+ * });
46
+ */
47
+ export const useSelectActions = params => {
48
+ const {
49
+ value,
50
+ mode,
51
+ disabled,
52
+ maxCount,
53
+ autoClearSearchValue,
54
+ setValue,
55
+ clearSearch,
56
+ closePopup,
57
+ isOptionSelected,
58
+ onActive,
59
+ onSelect,
60
+ onDeselect,
61
+ onClear,
62
+ onCreateOption
63
+ } = params;
64
+
65
+ // 处理选项点击
66
+ const handleOptionPress = useMemoizedFn(option => {
67
+ if (option.disabled) return;
68
+ onActive?.(option.value);
69
+
70
+ // 多选
71
+ if (mode) {
72
+ const values = Array.isArray(value) ? value : [];
73
+ const isSelected = isOptionSelected(option);
74
+ if (isSelected) {
75
+ // 取消选中
76
+ const newValues = values.filter(v => {
77
+ return v !== option.value;
78
+ });
79
+ setValue(newValues);
80
+ onDeselect?.(option.value);
81
+ } else {
82
+ // 选中
83
+ if (maxCount && values.length >= maxCount) {
84
+ return;
85
+ }
86
+ const newValues = [...values, option.value];
87
+ setValue(newValues);
88
+ onSelect?.(option.value, option);
89
+ }
90
+
91
+ // 清空搜索
92
+ if (autoClearSearchValue) {
93
+ clearSearch();
94
+ }
95
+ } else {
96
+ // 单选模式
97
+ setValue(option.value);
98
+ onSelect?.(option.value, option);
99
+ closePopup();
100
+ clearSearch();
101
+ }
102
+ });
103
+
104
+ // 处理标签移除
105
+ const handleTagClose = useMemoizedFn(option => {
106
+ if (disabled) return;
107
+ const values = Array.isArray(value) ? value : [];
108
+ const newValues = values.filter(v => {
109
+ return v !== option.value;
110
+ });
111
+ setValue(newValues);
112
+ onDeselect?.(option.value);
113
+ });
114
+
115
+ // 处理清除
116
+ const handleClear = useMemoizedFn(e => {
117
+ e.stopPropagation();
118
+ setValue(mode ? [] : undefined);
119
+ clearSearch();
120
+ onClear?.();
121
+ });
122
+
123
+ // 处理创建新选项(tags 模式)
124
+ const handleCreateOption = useMemoizedFn(searchValue => {
125
+ if (mode !== 'tags' || !searchValue.trim()) return;
126
+ const newOption = onCreateOption?.(searchValue.trim());
127
+ if (newOption) {
128
+ handleOptionPress(newOption);
129
+ } else {
130
+ // 默认创建逻辑
131
+ const defaultOption = {
132
+ label: searchValue.trim(),
133
+ value: searchValue.trim()
134
+ };
135
+ handleOptionPress(defaultOption);
136
+ }
137
+ clearSearch();
138
+ });
139
+ return {
140
+ handleOptionPress,
141
+ handleTagClose,
142
+ handleClear,
143
+ handleCreateOption
144
+ };
145
+ };
146
+
147
+ /**
148
+ * 搜索配置
149
+ *
150
+ * @template OptionType - 选项类型
151
+ */
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+
3
+ import { useMemoizedFn } from 'ahooks';
4
+ import { useMemo } from 'react';
5
+ /**
6
+ * 判断选项是否为分组
7
+ *
8
+ * @template ValueType - 选项值的类型
9
+ */
10
+ export const isSelectOptionGroup = item => {
11
+ return 'options' in item;
12
+ };
13
+ export function isSelectFlattenedGroupOption(v) {
14
+ return !!v.isGroup;
15
+ }
16
+ function isOptionType(v) {
17
+ return !v.isGroup;
18
+ }
19
+
20
+ /**
21
+ * Select 选项处理 Hook 参数
22
+ *
23
+ * @template ValueType - 选项值的类型
24
+ * @template OptionType - 选项类型
25
+ * @template M - 选择模式
26
+ * @template RealValueType - 实际值类型
27
+ */
28
+
29
+ /**
30
+ * Select 选项处理 Hook 返回值
31
+ *
32
+ * @template ValueType - 选项值的类型
33
+ * @template OptionType - 选项类型
34
+ */
35
+
36
+ /**
37
+ * Select 选项处理 Hook
38
+ *
39
+ * 封装 Select 组件中与选项相关的逻辑,包括:
40
+ * - 扁平化选项列表
41
+ * - 过滤选项
42
+ * - 获取选中的选项
43
+ * - 判断选项是否被选中
44
+ *
45
+ * @example
46
+ * const {
47
+ * allOptions,
48
+ * filteredOptions,
49
+ * selectedOptions,
50
+ * isOptionSelected
51
+ * } = useSelectOptions({
52
+ * options,
53
+ * value,
54
+ * mode,
55
+ * searchValue,
56
+ * filterOption: true,
57
+ * optionFilterProp: 'label'
58
+ * });
59
+ */
60
+ export const useSelectOptions = params => {
61
+ const {
62
+ options,
63
+ value,
64
+ mode,
65
+ searchValue,
66
+ filterOption,
67
+ filterSort,
68
+ optionFilterProp
69
+ } = params;
70
+
71
+ // 扁平化选项列表
72
+ const flattenedOptions = useMemo(() => {
73
+ const result = [];
74
+ options.forEach(item => {
75
+ if (isSelectOptionGroup(item)) {
76
+ result.push({
77
+ label: item.label,
78
+ key: item.key,
79
+ isGroup: true,
80
+ groupKey: item.key
81
+ });
82
+ item.options.forEach(opt => {
83
+ result.push({
84
+ ...opt,
85
+ groupKey: item.key
86
+ });
87
+ });
88
+ } else {
89
+ result.push(item);
90
+ }
91
+ });
92
+ return result;
93
+ }, [options]);
94
+
95
+ // 获取所有可选项(不包含分组标题)
96
+ const allOptions = useMemo(() => {
97
+ return flattenedOptions.filter(item => !item.isGroup);
98
+ }, [flattenedOptions]);
99
+
100
+ // 过滤选项
101
+ const filteredOptions = useMemo(() => {
102
+ if (!searchValue || !filterOption) {
103
+ return flattenedOptions;
104
+ }
105
+ const filterFn = typeof filterOption === 'function' ? filterOption : (input, option) => {
106
+ const props = Array.isArray(optionFilterProp) ? optionFilterProp : [optionFilterProp || 'label'];
107
+ return props.some(prop => {
108
+ const value = option[prop];
109
+ if (typeof value === 'string') {
110
+ return value.toLowerCase().includes(input.toLowerCase());
111
+ }
112
+ return false;
113
+ });
114
+ };
115
+ const filtered = flattenedOptions.filter(item => {
116
+ if (isSelectFlattenedGroupOption(item)) return true;
117
+ return filterFn(searchValue, item);
118
+ });
119
+
120
+ // 排序
121
+ if (filterSort) {
122
+ const sortableItems = filtered.filter(item => isOptionType(item));
123
+ sortableItems.sort((a, b) => filterSort(a, b, {
124
+ searchValue
125
+ }));
126
+ return sortableItems;
127
+ }
128
+ return filtered;
129
+ }, [flattenedOptions, searchValue, filterOption, filterSort, optionFilterProp]);
130
+
131
+ // 获取选中的选项
132
+ const selectedOptions = useMemo(() => {
133
+ if (!value) return [];
134
+ if (mode) {
135
+ const values = Array.isArray(value) ? value : [];
136
+ return values.map(v => {
137
+ return allOptions.find(opt => opt.value === v);
138
+ }).filter(Boolean);
139
+ } else {
140
+ const option = allOptions.find(opt => opt.value === value);
141
+ return option ? [option] : [];
142
+ }
143
+ }, [value, allOptions, mode]);
144
+
145
+ // 判断选项是否被选中
146
+ const isOptionSelected = useMemoizedFn(option => {
147
+ if (!value) return false;
148
+ if (mode) {
149
+ const values = Array.isArray(value) ? value : [];
150
+ return values.some(v => v === option.value);
151
+ } else {
152
+ return value === option.value;
153
+ }
154
+ });
155
+ return {
156
+ flattenedOptions,
157
+ allOptions,
158
+ filteredOptions,
159
+ selectedOptions,
160
+ isOptionSelected
161
+ };
162
+ };