@nutui/nutui-react-taro 1.5.2 → 1.5.3-beta.1

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 (232) hide show
  1. package/CHANGELOG.md +7 -1
  2. package/dist/esm/ActionSheet.js +14 -90
  3. package/dist/esm/Address.js +21 -620
  4. package/dist/esm/Animate.js +7 -53
  5. package/dist/esm/AnimatingNumbers.js +7 -125
  6. package/dist/esm/Audio.js +19 -264
  7. package/dist/esm/Avatar.js +11 -130
  8. package/dist/esm/{AvatarContext-15733596.js → AvatarContext-c96afdcc.js} +3 -1
  9. package/dist/esm/AvatarGroup.js +11 -41
  10. package/dist/esm/BackTop.js +10 -138
  11. package/dist/esm/Badge.js +9 -71
  12. package/dist/esm/Barrage.js +8 -97
  13. package/dist/esm/Button.js +9 -108
  14. package/dist/esm/Calendar.js +20 -128
  15. package/dist/esm/CalendarItem.js +12 -674
  16. package/dist/esm/Card.js +11 -61
  17. package/dist/esm/Cascader.js +16 -671
  18. package/dist/esm/Cell.js +9 -101
  19. package/dist/esm/CellGroup.js +5 -2
  20. package/dist/esm/Checkbox.js +7 -5
  21. package/dist/esm/CheckboxGroup.js +8 -111
  22. package/dist/esm/CircleProgress.js +8 -114
  23. package/dist/esm/Col.js +7 -57
  24. package/dist/esm/Collapse.js +7 -97
  25. package/dist/esm/CollapseItem.js +8 -146
  26. package/dist/esm/ConfigProvider.js +8 -187
  27. package/dist/esm/CountDown.js +9 -247
  28. package/dist/esm/DatePicker.js +25 -309
  29. package/dist/esm/Dialog.js +17 -296
  30. package/dist/esm/Divider.js +7 -34
  31. package/dist/esm/Drag.js +7 -118
  32. package/dist/esm/Elevator.js +8 -234
  33. package/dist/esm/Ellipsis.js +10 -176
  34. package/dist/esm/Empty.js +8 -79
  35. package/dist/esm/FixedNav.js +14 -103
  36. package/dist/esm/Form.js +10 -215
  37. package/dist/esm/FormItem.js +10 -3
  38. package/dist/esm/Grid.js +11 -81
  39. package/dist/esm/GridItem.js +13 -123
  40. package/dist/esm/Icon.js +5 -2
  41. package/dist/esm/Image.js +11 -169
  42. package/dist/esm/ImagePreview.js +19 -225
  43. package/dist/esm/Indicator.js +7 -50
  44. package/dist/esm/Infiniteloading.js +14 -215
  45. package/dist/esm/Input.js +12 -362
  46. package/dist/esm/InputNumber.js +9 -275
  47. package/dist/esm/Layout.js +5 -13
  48. package/dist/esm/Menu.js +10 -153
  49. package/dist/esm/MenuItem.js +15 -175
  50. package/dist/esm/NavBar.js +9 -114
  51. package/dist/esm/NoticeBar.js +10 -568
  52. package/dist/esm/Notify.js +8 -234
  53. package/dist/esm/NumberKeyboard.js +17 -247
  54. package/dist/esm/Overlay.js +6 -2
  55. package/dist/esm/Pagination.js +9 -168
  56. package/dist/esm/Picker.js +22 -494
  57. package/dist/esm/Popover.js +12 -223
  58. package/dist/esm/Popup.js +13 -193
  59. package/dist/esm/Price.js +6 -84
  60. package/dist/esm/Progress.js +9 -122
  61. package/dist/esm/PullToRefresh.js +13 -276
  62. package/dist/esm/Radio.js +8 -4
  63. package/dist/esm/RadioGroup.js +7 -120
  64. package/dist/esm/Range.js +15 -406
  65. package/dist/esm/Rate.js +9 -121
  66. package/dist/esm/Row.js +7 -49
  67. package/dist/esm/SearchBar.js +12 -235
  68. package/dist/esm/ShortPassword.js +17 -191
  69. package/dist/esm/SideNavBar.js +19 -57
  70. package/dist/esm/SideNavBarItem.js +5 -24
  71. package/dist/esm/Signature.js +13 -153
  72. package/dist/esm/Skeleton.js +12 -98
  73. package/dist/esm/Step.js +10 -87
  74. package/dist/esm/Steps.js +8 -38
  75. package/dist/esm/Sticky.js +11 -190
  76. package/dist/esm/SubSideNavBar.js +6 -78
  77. package/dist/esm/Swipe.js +10 -230
  78. package/dist/esm/Swiper.js +9 -490
  79. package/dist/esm/SwiperItem.js +8 -36
  80. package/dist/esm/Switch.js +6 -71
  81. package/dist/esm/TabPane.js +5 -2
  82. package/dist/esm/Tabbar.js +6 -68
  83. package/dist/esm/TabbarItem.js +9 -78
  84. package/dist/esm/Table.js +12 -140
  85. package/dist/esm/Tabs.js +8 -5
  86. package/dist/esm/Tag.js +10 -110
  87. package/dist/esm/TextArea.js +9 -148
  88. package/dist/esm/TimeDetail.js +9 -67
  89. package/dist/esm/TimePannel.js +9 -29
  90. package/dist/esm/TimeSelect.js +19 -171
  91. package/dist/esm/Toast.js +7 -268
  92. package/dist/esm/TrendArrow.js +7 -99
  93. package/dist/esm/Uploader.js +17 -566
  94. package/dist/esm/{UserContext-101ad4a4.js → UserContext-0aac9a82.js} +3 -1
  95. package/dist/esm/{UserContext-2629d479.js → UserContext-e402e1a6.js} +3 -1
  96. package/dist/esm/{UserContext-b33bcf21.js → UserContext-e8176108.js} +3 -1
  97. package/dist/esm/Video.js +7 -90
  98. package/dist/esm/VirtualList.js +9 -313
  99. package/dist/esm/WaterMark.js +11 -111
  100. package/dist/esm/actionsheet.taro-e6a51446.js +53 -0
  101. package/dist/esm/address.taro-3a9b6396.js +461 -0
  102. package/dist/esm/animate.taro-fb7986d6.js +40 -0
  103. package/dist/esm/animatingnumbers.taro-03e5d61d.js +104 -0
  104. package/dist/esm/audio.taro-87ec8bf2.js +161 -0
  105. package/dist/esm/avatar.taro-3676f38f.js +103 -0
  106. package/dist/esm/avatargroup-f3574510.js +34 -0
  107. package/dist/esm/backtop.taro-66394a36.js +48 -0
  108. package/dist/esm/badge.taro-a4e59c11.js +52 -0
  109. package/dist/esm/barrage.taro-0495a1b2.js +94 -0
  110. package/dist/esm/{bem-3b438e61.js → bem-350c1702.js} +3 -6
  111. package/dist/esm/button.taro-9244d065.js +100 -0
  112. package/dist/esm/calendar.taro-670842ea.js +65 -0
  113. package/dist/esm/calendaritem.taro-2a603571.js +787 -0
  114. package/dist/esm/can-use-dom-3eeb5af4.js +6 -0
  115. package/dist/esm/card.taro-e4c76dad.js +33 -0
  116. package/dist/esm/cascader.taro-a5553aa5.js +437 -0
  117. package/dist/esm/cell.taro-a10a74d3.js +64 -0
  118. package/dist/esm/cellgroup.taro-abe501bc.js +25 -0
  119. package/dist/esm/checkbox.taro-6120e3e3.js +171 -0
  120. package/dist/esm/circleprogress.taro-79854448.js +109 -0
  121. package/dist/esm/col.taro-53eed3cc.js +41 -0
  122. package/dist/esm/collapse.taro-1a9e4ba2.js +83 -0
  123. package/dist/esm/collapseitem-4d0bc55d.js +83 -0
  124. package/dist/esm/configprovider-67d19d3a.js +19 -0
  125. package/dist/esm/configprovider.taro-8d71eb49.js +42 -0
  126. package/dist/esm/countdown.taro-5b17c607.js +226 -0
  127. package/dist/esm/datepicker.taro-477ad357.js +275 -0
  128. package/dist/esm/dialog.taro-a3267d29.js +118 -0
  129. package/dist/esm/divider.taro-26d1d8b4.js +35 -0
  130. package/dist/esm/drag.taro-79bb8744.js +110 -0
  131. package/dist/esm/elevator.taro-6019669e.js +178 -0
  132. package/dist/esm/ellipsis.taro-f15f26da.js +241 -0
  133. package/dist/esm/empty.taro-04ae4389.js +62 -0
  134. package/dist/esm/fixednav.taro-1f05acaf.js +53 -0
  135. package/dist/esm/form.taro-0b399b30.js +178 -0
  136. package/dist/esm/formitem.taro-190a3326.js +89 -0
  137. package/dist/esm/get-scroll-parent-b4a07e65.js +25 -0
  138. package/dist/esm/grid.taro-3503b82c.js +61 -0
  139. package/dist/esm/{grid.context-2ee27d95.js → grid.taro.context-c2bbfb4f.js} +4 -2
  140. package/dist/esm/griditem.taro-cdb3f119.js +98 -0
  141. package/dist/esm/icon-296a1bec.js +63 -0
  142. package/dist/esm/icon.taro-296a1bec.js +63 -0
  143. package/dist/esm/image.taro-142cf512.js +64 -0
  144. package/dist/esm/imagepreview.taro-c50bb0a3.js +167 -0
  145. package/dist/esm/index-5bcb0ff8.js +7 -0
  146. package/dist/esm/indicator.taro-cba8b010.js +37 -0
  147. package/dist/esm/infiniteloading.taro-183bccbf.js +144 -0
  148. package/dist/esm/input.taro-97af6c96.js +240 -0
  149. package/dist/esm/inputnumber.taro-91f65d17.js +130 -0
  150. package/dist/esm/layout.taro-9046d093.js +11 -0
  151. package/dist/esm/menu.taro-7e4038a1.js +99 -0
  152. package/dist/esm/menuitem.taro-96cc4f15.js +130 -0
  153. package/dist/esm/navbar.taro-777c4705.js +79 -0
  154. package/dist/esm/noticebar.taro-4a23cdee.js +448 -0
  155. package/dist/esm/notify.taro-e17c6f82.js +75 -0
  156. package/dist/esm/numberkeyboard.taro-1bc24744.js +159 -0
  157. package/dist/esm/nutui-react.es.js +119 -94
  158. package/dist/esm/offsetContext-c2a746fa.js +5 -0
  159. package/dist/esm/overlay.taro-21e87fb1.js +69 -0
  160. package/dist/esm/pagination.taro-715a173b.js +124 -0
  161. package/dist/esm/picker.taro-0073eeaa.js +472 -0
  162. package/dist/esm/popover.taro-ad5e76ea.js +156 -0
  163. package/dist/esm/popup.taro-01676bff.js +137 -0
  164. package/dist/esm/price.taro-776ed16e.js +83 -0
  165. package/dist/esm/progress.taro-f0ce38e9.js +90 -0
  166. package/dist/esm/pulltorefresh.taro-a294f656.js +181 -0
  167. package/dist/esm/radio.taro-a6eff96c.js +168 -0
  168. package/dist/esm/range.taro-d8fc7656.js +332 -0
  169. package/dist/esm/rate.taro-6cdf03bd.js +75 -0
  170. package/dist/esm/row.taro-f64d4a13.js +46 -0
  171. package/dist/esm/searchbar.taro-0c25927b.js +152 -0
  172. package/dist/esm/shortpassword.taro-9ee034f7.js +111 -0
  173. package/dist/esm/sidenavbar.taro-c307b35e.js +35 -0
  174. package/dist/esm/sidenavbaritem.taro-5a7965d0.js +12 -0
  175. package/dist/esm/signature.taro-ec4e713b.js +143 -0
  176. package/dist/esm/skeleton.taro-76faf63f.js +62 -0
  177. package/dist/esm/step.taro-b7903e8c.js +59 -0
  178. package/dist/esm/steps.taro-c82d2252.js +30 -0
  179. package/dist/esm/sticky.taro-218bda37.js +138 -0
  180. package/dist/esm/subsidenavbar.taro-69cb9752.js +63 -0
  181. package/dist/esm/supports-passive-c85ef996.js +18 -0
  182. package/dist/esm/swipe.taro-ea35f07f.js +177 -0
  183. package/dist/esm/swiper.taro-7a94e211.js +451 -0
  184. package/dist/esm/swiperitem-c9e3d0d5.js +29 -0
  185. package/dist/esm/switch.taro-34ca8228.js +50 -0
  186. package/dist/esm/tabbar.taro-9acfc2fa.js +59 -0
  187. package/dist/esm/tabbaritem.taro-bf517487.js +58 -0
  188. package/dist/esm/table.taro-91fc0c01.js +93 -0
  189. package/dist/esm/tabpane.taro-4ca340ef.js +23 -0
  190. package/dist/esm/tabs.taro-6a7524a4.js +140 -0
  191. package/dist/esm/tag.taro-23ba0834.js +92 -0
  192. package/dist/esm/textarea.taro-442e7350.js +94 -0
  193. package/dist/esm/timedetail.taro-5b2f2269.js +44 -0
  194. package/dist/esm/timepannel.taro-d6e40180.js +22 -0
  195. package/dist/esm/timeselect.taro-a07036f4.js +133 -0
  196. package/dist/esm/toast.taro-d6c14811.js +109 -0
  197. package/dist/esm/trendarrow.taro-b8c5ccd9.js +73 -0
  198. package/dist/esm/typings-b9828dba.js +9 -0
  199. package/dist/esm/uploader.taro-587e6bf3.js +492 -0
  200. package/dist/esm/useClientRect-1f8ed1fe.js +18 -0
  201. package/dist/esm/useTouch-db24bb5c.js +69 -0
  202. package/dist/esm/video-f1be8a91.js +67 -0
  203. package/dist/esm/virtuallist.taro-f0b0270d.js +214 -0
  204. package/dist/esm/watermark.taro-9ce2ae37.js +114 -0
  205. package/dist/esm/zh-CN-c779e6c1.js +131 -0
  206. package/dist/locales/base.js +1 -1
  207. package/dist/locales/en-US.js +1 -1
  208. package/dist/locales/id-ID.js +1 -1
  209. package/dist/locales/zh-CN.js +1 -1
  210. package/dist/locales/zh-TW.js +1 -1
  211. package/dist/locales/zh-UG.js +1 -1
  212. package/dist/nutui.react.mjs +13028 -14863
  213. package/dist/nutui.react.umd.js +13027 -14864
  214. package/dist/style.mjs +1 -1
  215. package/dist/types/index.d.ts +176 -183
  216. package/package.json +1 -1
  217. package/dist/esm/cellgroup-fcc72767.js +0 -34
  218. package/dist/esm/checkbox-44e13cd0.js +0 -137
  219. package/dist/esm/date-c7aad4c0.js +0 -97
  220. package/dist/esm/formitem-8a73a5fb.js +0 -157
  221. package/dist/esm/get-scroll-parent-5f85dee8.js +0 -24
  222. package/dist/esm/icon-4ef1581c.js +0 -70
  223. package/dist/esm/index-030b7245.js +0 -11
  224. package/dist/esm/offsetContext-3ab00d40.js +0 -16
  225. package/dist/esm/overlay-de6c79d5.js +0 -83
  226. package/dist/esm/radio-9f141e6b.js +0 -118
  227. package/dist/esm/render-bbebb760.js +0 -79
  228. package/dist/esm/tabpane-01075e6c.js +0 -29
  229. package/dist/esm/tabs-e1b4e4b1.js +0 -181
  230. package/dist/esm/typings-f27b58f4.js +0 -8
  231. package/dist/esm/useClientRect-56bb675b.js +0 -39
  232. package/dist/esm/useTouch-cf73a407.js +0 -99
@@ -0,0 +1,472 @@
1
+ import React__default, { useState, useRef, useEffect, useImperativeHandle } from 'react';
2
+ import Taro from '@tarojs/taro';
3
+ import { View, PickerView, PickerViewColumn } from '@tarojs/components';
4
+ import { P as Popup } from './popup.taro-01676bff.js';
5
+ import { u as useTouch } from './useTouch-db24bb5c.js';
6
+ import { g as getRectByTaro } from './useClientRect-1f8ed1fe.js';
7
+ import { p as passiveSupported } from './supports-passive-c85ef996.js';
8
+ import { u as useConfig } from './configprovider.taro-8d71eb49.js';
9
+ import { c as cn } from './bem-350c1702.js';
10
+
11
+ const InternalPickerSlot = (props, ref) => {
12
+ const { keyIndex = 0, defaultValue, listData = [], threeDimensional = true, swipeDuration = 1000, itemShow = false, chooseItem, } = props;
13
+ const touch = useTouch();
14
+ const DEFAULT_DURATION = 200;
15
+ // 触发惯性滑动条件:
16
+ // 在手指离开屏幕时,如果和上一次 move 时的间隔小于 `MOMENTUM_TIME` 且 move
17
+ // 距离大于 `MOMENTUM_DISTANCE` 时,执行惯性滑动
18
+ const INERTIA_TIME = 300;
19
+ const INERTIA_DISTANCE = 15;
20
+ const [currIndex, setCurrIndex] = useState(1);
21
+ const lineSpacing = useRef(36);
22
+ const [touchTime, setTouchTime] = useState(0);
23
+ const [touchDeg, setTouchDeg] = useState('0deg');
24
+ const rotation = 20;
25
+ const moving = useRef(false);
26
+ let timer;
27
+ const listRef = useRef(null);
28
+ const rollerRef = useRef(null);
29
+ const pickerSlotRef = useRef(null);
30
+ const [startTime, setStartTime] = useState(0);
31
+ const [startY, setStartY] = useState(0);
32
+ const transformY = useRef(0);
33
+ const [scrollDistance, setScrollDistance] = useState(0);
34
+ const isHidden = (index) => {
35
+ if (index >= currIndex + 8 || index <= currIndex - 8) {
36
+ return true;
37
+ }
38
+ return false;
39
+ };
40
+ const setTransform = (translateY = 0, type, time = DEFAULT_DURATION, deg) => {
41
+ let nTime = time;
42
+ if (type !== 'end') {
43
+ nTime = 0;
44
+ }
45
+ setTouchTime(nTime);
46
+ setTouchDeg(deg);
47
+ setScrollDistance(translateY);
48
+ };
49
+ const setMove = (move, type, time) => {
50
+ let updateMove = move + transformY.current;
51
+ if (type === 'end') {
52
+ // 限定滚动距离
53
+ if (updateMove > 0) {
54
+ updateMove = 0;
55
+ }
56
+ if (updateMove < -(listData.length - 1) * lineSpacing.current) {
57
+ updateMove = -(listData.length - 1) * lineSpacing.current;
58
+ }
59
+ // 设置滚动距离为lineSpacing的倍数值
60
+ const endMove = Math.round(updateMove / lineSpacing.current) * lineSpacing.current;
61
+ const deg = `${(Math.abs(Math.round(endMove / lineSpacing.current)) + 1) * rotation}deg`;
62
+ setTransform(endMove, type, time, deg);
63
+ setCurrIndex(Math.abs(Math.round(endMove / lineSpacing.current)) + 1);
64
+ }
65
+ else {
66
+ let deg = 0;
67
+ const currentDeg = (-updateMove / lineSpacing.current + 1) * rotation;
68
+ // picker 滚动的最大角度
69
+ const maxDeg = (listData.length + 1) * rotation;
70
+ const minDeg = 0;
71
+ deg = Math.min(Math.max(currentDeg, minDeg), maxDeg);
72
+ if (minDeg < deg && deg < maxDeg) {
73
+ setTransform(updateMove, '', undefined, `${deg}deg`);
74
+ setCurrIndex(Math.abs(Math.round(updateMove / lineSpacing.current)) + 1);
75
+ }
76
+ }
77
+ };
78
+ const setChooseValue = (move) => {
79
+ chooseItem &&
80
+ chooseItem(listData?.[Math.round(-move / lineSpacing.current)], keyIndex);
81
+ };
82
+ // 开始滚动
83
+ const touchStart = (event) => {
84
+ touch.start(event);
85
+ setStartY(touch.deltaY);
86
+ setStartTime(Date.now());
87
+ transformY.current = scrollDistance;
88
+ };
89
+ const touchMove = (event) => {
90
+ touch.move(event);
91
+ if (touch.isVertical) {
92
+ moving.current = true;
93
+ preventDefault(event, true);
94
+ }
95
+ const move = touch.deltaY - startY;
96
+ setMove(move);
97
+ };
98
+ const touchEnd = (event) => {
99
+ if (!moving.current)
100
+ return;
101
+ const move = touch.deltaY - startY;
102
+ const moveTime = Date.now() - startTime;
103
+ // 区分是否为惯性滚动
104
+ if (moveTime <= INERTIA_TIME && Math.abs(move) > INERTIA_DISTANCE) {
105
+ // 惯性滚动
106
+ const distance = momentum(move, moveTime);
107
+ setMove(distance, 'end', +swipeDuration);
108
+ }
109
+ else {
110
+ setMove(move, 'end');
111
+ }
112
+ setTimeout(() => {
113
+ touch.reset();
114
+ }, 0);
115
+ };
116
+ // 惯性滚动 距离
117
+ const momentum = (distance, duration) => {
118
+ let nDistance = distance;
119
+ // 惯性滚动的速度
120
+ const speed = Math.abs(nDistance / duration);
121
+ // 惯性滚动的距离
122
+ nDistance = (speed / 0.003) * (nDistance < 0 ? -1 : 1);
123
+ return nDistance;
124
+ };
125
+ const modifyStatus = (type, val) => {
126
+ const value = val || defaultValue;
127
+ let index = -1;
128
+ if (value) {
129
+ listData.some((item, idx) => {
130
+ if (item.value === value) {
131
+ index = idx;
132
+ return true;
133
+ }
134
+ return false;
135
+ });
136
+ }
137
+ else {
138
+ listData.forEach((item, i) => {
139
+ if (item.value === defaultValue) {
140
+ index = i;
141
+ }
142
+ });
143
+ }
144
+ setCurrIndex(index === -1 ? 1 : index + 1);
145
+ const move = index === -1 ? 0 : index * lineSpacing.current;
146
+ type && setChooseValue(-move);
147
+ setMove(-move);
148
+ };
149
+ // 惯性滚动结束
150
+ const stopMomentum = () => {
151
+ moving.current = false;
152
+ setTouchTime(0);
153
+ setChooseValue(scrollDistance);
154
+ };
155
+ // 阻止默认事件
156
+ const preventDefault = (event, isStopPropagation) => {
157
+ /* istanbul ignore else */
158
+ if (!passiveSupported &&
159
+ (typeof event.cancelable !== 'boolean' || event.cancelable)) {
160
+ event.preventDefault();
161
+ }
162
+ if (isStopPropagation) {
163
+ event.stopPropagation();
164
+ }
165
+ };
166
+ const getReference = async () => {
167
+ const refe = await getRectByTaro(listRef?.current);
168
+ lineSpacing.current = refe.height ? refe.height : 36;
169
+ modifyStatus(true);
170
+ };
171
+ const touchRollerStyle = () => {
172
+ return {
173
+ transition: `transform ${touchTime}ms cubic-bezier(0.17, 0.89, 0.45, 1)`,
174
+ transform: `rotate3d(1, 0, 0, ${touchDeg})`,
175
+ };
176
+ };
177
+ const touchTileStyle = () => {
178
+ return {
179
+ transition: `transform ${touchTime}ms cubic-bezier(0.17, 0.89, 0.45, 1)`,
180
+ transform: `translate3d(0, ${scrollDistance}px, 0)`,
181
+ };
182
+ };
183
+ useEffect(() => {
184
+ setScrollDistance(0);
185
+ transformY.current = 0;
186
+ modifyStatus(false);
187
+ return () => {
188
+ clearTimeout(timer);
189
+ };
190
+ }, [listData]);
191
+ useEffect(() => {
192
+ if (itemShow) {
193
+ setTimeout(() => {
194
+ getReference();
195
+ }, 200);
196
+ }
197
+ }, [itemShow]);
198
+ useImperativeHandle(ref, () => ({
199
+ stopMomentum,
200
+ moving: moving.current,
201
+ }));
202
+ return (React__default.createElement("div", { className: "nut-picker-list", ref: pickerSlotRef, onTouchStart: touchStart, onTouchMove: touchMove, onTouchEnd: touchEnd },
203
+ React__default.createElement("div", { className: "nut-picker-roller", ref: rollerRef, style: threeDimensional ? touchRollerStyle() : touchTileStyle(), onTransitionEnd: stopMomentum },
204
+ threeDimensional &&
205
+ listData.map((item, index) => {
206
+ return (React__default.createElement("div", { className: `nut-picker-roller-item ${isHidden(index + 1) && 'nut-picker-roller-item-hidden'}`, style: {
207
+ transform: `rotate3d(1, 0, 0, ${-rotation * (index + 1)}deg) translate3d(0px, 0px, 104px)`,
208
+ height: `${lineSpacing.current}px`,
209
+ lineHeight: `${lineSpacing.current}px`,
210
+ }, key: item.value ? item.value : index },
211
+ React__default.createElement(React__default.Fragment, null, item.text ? item.text : item)));
212
+ }),
213
+ !threeDimensional &&
214
+ listData.map((item, index) => {
215
+ return (React__default.createElement("div", { className: "nut-picker-roller-item-title", key: item.value ? item.value : index, style: {
216
+ height: `${lineSpacing.current}px`,
217
+ lineHeight: `${lineSpacing.current}px`,
218
+ } },
219
+ React__default.createElement(React__default.Fragment, null, item.text ? item.text : item)));
220
+ })),
221
+ React__default.createElement("div", { className: "nut-picker-mask" }),
222
+ React__default.createElement("div", { className: "nut-picker-indicator", ref: listRef })));
223
+ };
224
+ const PickerSlot = React__default.forwardRef(InternalPickerSlot);
225
+
226
+ function useRefs() {
227
+ const refs = React__default.useRef([]);
228
+ const setRefs = React__default.useCallback((index) => (el) => {
229
+ if (el)
230
+ refs.current[index] = el;
231
+ }, []);
232
+ const reset = React__default.useCallback(() => {
233
+ refs.current = [];
234
+ }, []);
235
+ return [refs.current, setRefs, reset];
236
+ }
237
+
238
+ const InternalPicker = (props, ref) => {
239
+ const { locale } = useConfig();
240
+ const { isVisible, title, listData = [], defaultValueData, onConfirm, onClose, onCloseUpdate, onChange, className, style, threeDimensional, swipeDuration, ...rest } = props;
241
+ const [chooseValueData, setchooseValueData] = useState([]); // 选择的数据的 value 值, 每一条数据的 value 值
242
+ const [columnIndex, setcolumnIndex] = useState(0); // 选中列
243
+ const pickerRef = useRef(null);
244
+ const [refs, setRefs] = useRefs();
245
+ const [columnsList, setColumnsList] = useState([]); // 格式化后每一列的数据
246
+ const b = cn('picker');
247
+ const isConfirmEvent = useRef(false);
248
+ // 级联数据格式化
249
+ const formatCascade = (columns, values) => {
250
+ const formatted = [];
251
+ let cursor = {
252
+ text: '',
253
+ value: '',
254
+ children: columns,
255
+ };
256
+ let columnIndex = 0;
257
+ while (cursor && cursor.children) {
258
+ const options = cursor.children;
259
+ const value = values[columnIndex];
260
+ let index = options.findIndex((columnItem) => columnItem.value === value);
261
+ if (index === -1)
262
+ index = 0;
263
+ cursor = cursor.children[index];
264
+ columnIndex++;
265
+ formatted.push(options);
266
+ }
267
+ return formatted;
268
+ };
269
+ // 每一列的类型
270
+ const columnsType = () => {
271
+ const firstColumn = listData[0];
272
+ if (firstColumn) {
273
+ if (Array.isArray(firstColumn)) {
274
+ return 'multiple';
275
+ }
276
+ if ('children' in firstColumn) {
277
+ return 'cascade';
278
+ }
279
+ }
280
+ return 'single';
281
+ };
282
+ // 传入的数据格式化
283
+ const normalListData = () => {
284
+ const type = columnsType();
285
+ switch (type) {
286
+ case 'multiple':
287
+ return listData;
288
+ case 'cascade':
289
+ // 级联数据处理
290
+ return formatCascade(listData, chooseValueData);
291
+ default:
292
+ return [listData];
293
+ }
294
+ };
295
+ const init = () => {
296
+ // const data: (string | number)[] = []
297
+ const normalData = normalListData();
298
+ setColumnsList(normalData);
299
+ // normalData.length > 0 &&
300
+ // normalData.map((item) => {
301
+ // item[0] && data.push(item[0].value)
302
+ // return item
303
+ // })
304
+ // 为何要重置呢?
305
+ // if (!defaultValueData && chooseValueData.length === 0) {
306
+ // setchooseValueData([...data])
307
+ // }
308
+ };
309
+ // 列表格式修改
310
+ useEffect(() => {
311
+ init();
312
+ }, [listData]);
313
+ // 默认值修改
314
+ useEffect(() => {
315
+ if (defaultValueData &&
316
+ defaultValueData.length !== 0 &&
317
+ defaultValueData.toString() !== chooseValueData.toString() &&
318
+ !currentValue.length) {
319
+ const data = [...defaultValueData];
320
+ setchooseValueData(data);
321
+ setColumnsList(normalListData());
322
+ }
323
+ }, [defaultValueData]);
324
+ const selectedOptions = () => {
325
+ const optins = [];
326
+ columnsList.map((column, index) => {
327
+ let currOptions = [];
328
+ currOptions = column.filter((item) => item.value === chooseValueData[index]);
329
+ if (currOptions[0]) {
330
+ optins.push(currOptions[0]);
331
+ }
332
+ else {
333
+ column[0] && optins.push(column[0]);
334
+ }
335
+ return column;
336
+ });
337
+ return optins;
338
+ };
339
+ // 选中值进行修改
340
+ useEffect(() => {
341
+ Taro.getEnv() !== 'WEB' && setCurrentValue(defaultValuesConvert());
342
+ onChange && onChange(columnIndex, chooseValueData, selectedOptions());
343
+ if (isConfirmEvent.current) {
344
+ isConfirmEvent.current = false;
345
+ onConfirm && onConfirm(chooseValueData, selectedOptions());
346
+ }
347
+ }, [chooseValueData]);
348
+ const closeActionSheet = () => {
349
+ onClose && onClose(chooseValueData, selectedOptions());
350
+ onCloseUpdate &&
351
+ onCloseUpdate(chooseValueData, selectedOptions(), pickerRef);
352
+ };
353
+ // 选择每一列的数据
354
+ const chooseItem = (option, columnIndex) => {
355
+ if (option && Object.keys(option).length) {
356
+ // 是否移动后是否与之前有差异
357
+ if (chooseValueData[columnIndex] !== option.value) {
358
+ if (columnsType() === 'cascade') {
359
+ chooseValueData[columnIndex] = option.value ? option.value : '';
360
+ setchooseValueData([...chooseValueData]);
361
+ let index = columnIndex;
362
+ let cursor = option;
363
+ while (cursor && cursor.children && cursor.children[0]) {
364
+ chooseValueData[index + 1] = cursor.children[0].value;
365
+ setchooseValueData([...chooseValueData]);
366
+ index++;
367
+ cursor = cursor.children[0];
368
+ }
369
+ // 当前改变列的下一列 children 值为空
370
+ if (cursor && cursor.children) {
371
+ chooseValueData[index + 1] = '';
372
+ setchooseValueData([...chooseValueData]);
373
+ }
374
+ setColumnsList(normalListData());
375
+ }
376
+ else {
377
+ setchooseValueData((data) => {
378
+ const cdata = [...data];
379
+ cdata[columnIndex] = Object.prototype.hasOwnProperty.call(option, 'value')
380
+ ? option.value
381
+ : '';
382
+ return cdata;
383
+ });
384
+ }
385
+ setcolumnIndex(columnIndex);
386
+ }
387
+ }
388
+ };
389
+ // 点击确定
390
+ const confirm = () => {
391
+ let movings = false;
392
+ refs.forEach((_ref) => {
393
+ if (_ref.moving)
394
+ movings = true;
395
+ _ref.stopMomentum();
396
+ });
397
+ if (movings) {
398
+ isConfirmEvent.current = true;
399
+ }
400
+ else {
401
+ onConfirm && onConfirm(chooseValueData, selectedOptions());
402
+ }
403
+ onClose && onClose(chooseValueData, selectedOptions());
404
+ setTimeout(() => {
405
+ isConfirmEvent.current = false;
406
+ }, 0);
407
+ };
408
+ const renderToolbar = () => {
409
+ return (React__default.createElement("div", { className: b('control') },
410
+ React__default.createElement("span", { className: b('cancel-btn'), onClick: () => closeActionSheet() }, locale.cancel),
411
+ React__default.createElement("div", { className: b('title') }, title || ''),
412
+ React__default.createElement("span", { className: b('confirm-btn'), onClick: confirm }, locale.confirm)));
413
+ };
414
+ const [currentValue, setCurrentValue] = useState([]);
415
+ const [pickingStatus, setPickingStatus] = useState(false);
416
+ const defaultValuesConvert = () => {
417
+ const defaultIndexs = [];
418
+ if (chooseValueData.length > 0) {
419
+ chooseValueData.forEach((value, index) => {
420
+ for (let i = 0; i < columnsList[index].length; i++) {
421
+ if (columnsList[index][i].value === value) {
422
+ defaultIndexs.push(i);
423
+ break;
424
+ }
425
+ }
426
+ });
427
+ }
428
+ else if (columnsList && columnsList.length > 0) {
429
+ columnsList.forEach((item) => {
430
+ defaultIndexs.push(0);
431
+ item.length > 0 && chooseValueData.push(item[0].value);
432
+ });
433
+ }
434
+ return defaultIndexs;
435
+ };
436
+ const pickerStart = () => {
437
+ setPickingStatus(true);
438
+ };
439
+ const pickerEnd = () => {
440
+ setPickingStatus(false);
441
+ };
442
+ const pickerChange = (data) => {
443
+ const prevDefaultValue = currentValue;
444
+ let changeIndex = 0;
445
+ // 判断变化的是第几个
446
+ const list = data.detail.value;
447
+ for (let i = 0, len = list.length; i < len; i++) {
448
+ if (prevDefaultValue[i] !== list[i]) {
449
+ changeIndex = i;
450
+ break;
451
+ }
452
+ }
453
+ // 选择的是哪个 option
454
+ chooseItem(columnsList[changeIndex][data.detail.value[changeIndex]], changeIndex);
455
+ };
456
+ return (React__default.createElement(Popup, { visible: isVisible, position: "bottom", onClose: () => {
457
+ closeActionSheet();
458
+ } },
459
+ React__default.createElement(View, { className: `${b()} ${className || ''}`, style: style, ...rest, catchMove: true },
460
+ renderToolbar(),
461
+ React__default.createElement("div", { className: b('panel'), ref: pickerRef }, Taro.getEnv() === 'WEB' ? (columnsList?.map((item, index) => {
462
+ return (React__default.createElement(PickerSlot, { ref: setRefs(index), defaultValue: chooseValueData?.[index], listData: item, threeDimensional: threeDimensional, chooseItem: (value, index) => chooseItem(value, index), swipeDuration: swipeDuration, key: index, keyIndex: index, itemShow: isVisible }));
463
+ })) : (React__default.createElement(PickerView, { ref: pickerRef, value: currentValue, immediateChange: true, onPickStart: pickerStart, onChange: pickerChange, onPickEnd: pickerEnd, className: "picker-view-panel" }, columnsList?.map((column, index) => {
464
+ return (React__default.createElement(PickerViewColumn, { key: `col${index}` }, column.map((item, index) => {
465
+ return (React__default.createElement(View, { key: item.value || index, className: "nut-picker-roller-item-title" },
466
+ React__default.createElement(React__default.Fragment, null, item.text || item)));
467
+ })));
468
+ })))))));
469
+ };
470
+ const Picker = React__default.forwardRef(InternalPicker);
471
+
472
+ export { Picker as P };
@@ -0,0 +1,156 @@
1
+ import React__default, { useRef, useState, useEffect } from 'react';
2
+ import { I as Icon } from './icon.taro-296a1bec.js';
3
+ import { O as Overlay } from './overlay.taro-21e87fb1.js';
4
+ import { g as getRectByTaro } from './useClientRect-1f8ed1fe.js';
5
+ import { C as ComponentDefaults } from './typings-b9828dba.js';
6
+
7
+ /**
8
+ * 过滤ref
9
+ */
10
+ function fillRef(ref, node) {
11
+ if (typeof ref === 'function') {
12
+ ref(node);
13
+ }
14
+ else if (typeof ref === 'object' && ref && 'current' in ref) {
15
+ ref.current = node;
16
+ }
17
+ }
18
+ /**
19
+ * 将ref合并到一个ref函数中以支持ref传递
20
+ */
21
+ function composeRef(...refs) {
22
+ return (node) => {
23
+ refs.forEach((ref) => {
24
+ fillRef(ref, node);
25
+ });
26
+ };
27
+ }
28
+ class Trigger extends React__default.Component {
29
+ fireEvents(type, e) {
30
+ const childCallback = this.props.children.props[type];
31
+ if (childCallback) {
32
+ childCallback(e);
33
+ }
34
+ const callback = this.props[type];
35
+ if (callback) {
36
+ callback(e);
37
+ }
38
+ }
39
+ render() {
40
+ const { children, className = '' } = this.props;
41
+ const child = React__default.Children.only(children);
42
+ const newChildProps = {
43
+ key: 'trigger',
44
+ };
45
+ if (child && child.props && child.props.className) {
46
+ newChildProps.className = className;
47
+ }
48
+ const cloneProps = {
49
+ ...newChildProps,
50
+ };
51
+ cloneProps.ref = composeRef(this.props.forwardedRef, child.ref);
52
+ const trigger = React__default.cloneElement(child, cloneProps);
53
+ return trigger;
54
+ }
55
+ }
56
+
57
+ const defaultProps = {
58
+ ...ComponentDefaults,
59
+ list: [],
60
+ theme: 'light',
61
+ location: 'bottom',
62
+ visible: false,
63
+ offset: 20,
64
+ className: '',
65
+ onClick: (e) => { },
66
+ onChoose: (item, index) => { },
67
+ };
68
+ const Popover = (props) => {
69
+ const { children, list, theme, location, visible, offset, className, style, onClick, onChoose, iconClassPrefix, iconFontClassName, ...reset } = {
70
+ ...defaultProps,
71
+ ...props,
72
+ };
73
+ const goodItem = useRef(null);
74
+ setTimeout(async () => {
75
+ if (goodItem.current) {
76
+ const res = await getRectByTaro(goodItem.current);
77
+ setElWidth(res?.width);
78
+ setElHeight(res?.height);
79
+ }
80
+ });
81
+ const [classes, setClasses] = useState('');
82
+ const [elWidth, setElWidth] = useState(0);
83
+ const [elHeight, setElHeight] = useState(0);
84
+ const [popoverContent, setPopoverContent] = useState('');
85
+ const [popoverArrow, setPopoverArrow] = useState('');
86
+ useEffect(() => {
87
+ setClasses(classesSelf());
88
+ setPopoverContent(popoverContentSelf());
89
+ setPopoverArrow(popoverArrowSelf());
90
+ }, [list, theme]);
91
+ const getStyle = () => {
92
+ const offNumer = Number(offset) ? Number(offset) : 0;
93
+ const style = {};
94
+ if (location.includes('top')) {
95
+ style.bottom = `${elHeight + offNumer}px`;
96
+ }
97
+ else if (location.includes('right')) {
98
+ style.left = `${elWidth + offNumer}px`;
99
+ }
100
+ else if (location.includes('left')) {
101
+ style.right = `${elWidth + offNumer}px`;
102
+ }
103
+ else {
104
+ style.top = `${elHeight + offNumer}px`;
105
+ }
106
+ return style;
107
+ };
108
+ const classesSelf = () => {
109
+ const prefixCls = 'nut-popover';
110
+ return `${prefixCls} ${theme ? `${prefixCls}--${theme}` : ''}`;
111
+ };
112
+ const popoverContentSelf = () => {
113
+ const prefixCls = 'popover-content';
114
+ return `${prefixCls}-show ${prefixCls} ${location ? `${prefixCls}--${location}` : ''}`;
115
+ };
116
+ const filter = () => {
117
+ const ms = ['top', 'bottom', 'left', 'right'];
118
+ return ms.filter((m) => location.includes(m))[0];
119
+ };
120
+ const popoverArrowSelf = () => {
121
+ const prefixCls = 'popover-arrow';
122
+ return `${prefixCls} ${prefixCls}-${filter()} ${location ? `${prefixCls}--${location}` : ''}`;
123
+ };
124
+ const handleClick = (e) => {
125
+ if (props.onClick) {
126
+ props.onClick(e);
127
+ }
128
+ };
129
+ const handleChoose = (item, index) => {
130
+ if (!item.disabled) {
131
+ onChoose(item, index);
132
+ }
133
+ };
134
+ return (React__default.createElement(React__default.Fragment, null,
135
+ React__default.createElement("div", { className: `${classes} ${className}`, style: { ...style }, ...reset },
136
+ React__default.createElement(Trigger, { forwardedRef: goodItem },
137
+ React__default.createElement("div", { onClick: (e) => handleClick(e) },
138
+ Array.isArray(children) ? children[0] : children,
139
+ visible ? (React__default.createElement("div", { className: `${popoverContent}`, style: getStyle() },
140
+ React__default.createElement("div", { className: `${popoverArrow}` }),
141
+ Array.isArray(children) ? children[1] : '',
142
+ React__default.createElement("div", null,
143
+ ' ',
144
+ list.map((item, i) => {
145
+ return (React__default.createElement("div", { key: item.name, className: `popover-menu-item ${item.disabled ? 'disabled' : ''}`, onClick: () => {
146
+ handleChoose(item, i);
147
+ } },
148
+ item.icon ? (React__default.createElement(Icon, { classPrefix: iconClassPrefix, fontClassName: iconFontClassName, className: "popover-menu-item-img", name: item.icon })) : (''),
149
+ React__default.createElement("div", { className: "popover-menu-item-name" }, item.name)));
150
+ })))) : null))),
151
+ visible ? (React__default.createElement(Overlay, { visible: visible, onClick: (e) => handleClick(e), style: { background: 'transparent' } })) : ('')));
152
+ };
153
+ Popover.defaultProps = defaultProps;
154
+ Popover.displayName = 'NutPopover';
155
+
156
+ export { Popover as P };