@xhsreds/reds-rn-next 0.10.1-beta202512111836 → 0.10.1-beta202512161121

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 (52) hide show
  1. package/coverage/.tmp/coverage-0.json +1 -1
  2. package/coverage/.tmp/coverage-1.json +1 -1
  3. package/coverage/.tmp/coverage-10.json +1 -1
  4. package/coverage/.tmp/coverage-11.json +1 -1
  5. package/coverage/.tmp/coverage-12.json +1 -1
  6. package/coverage/.tmp/coverage-13.json +1 -1
  7. package/coverage/.tmp/coverage-14.json +1 -1
  8. package/coverage/.tmp/coverage-15.json +1 -1
  9. package/coverage/.tmp/coverage-16.json +1 -1
  10. package/coverage/.tmp/coverage-17.json +1 -1
  11. package/coverage/.tmp/coverage-18.json +1 -1
  12. package/coverage/.tmp/coverage-19.json +1 -1
  13. package/coverage/.tmp/coverage-2.json +1 -1
  14. package/coverage/.tmp/coverage-20.json +1 -1
  15. package/coverage/.tmp/coverage-21.json +1 -1
  16. package/coverage/.tmp/coverage-22.json +1 -1
  17. package/coverage/.tmp/coverage-23.json +1 -1
  18. package/coverage/.tmp/coverage-24.json +1 -1
  19. package/coverage/.tmp/coverage-25.json +1 -1
  20. package/coverage/.tmp/coverage-26.json +1 -1
  21. package/coverage/.tmp/coverage-27.json +1 -1
  22. package/coverage/.tmp/coverage-28.json +1 -1
  23. package/coverage/.tmp/coverage-29.json +1 -1
  24. package/coverage/.tmp/coverage-3.json +1 -1
  25. package/coverage/.tmp/coverage-30.json +1 -1
  26. package/coverage/.tmp/coverage-33.json +1 -1
  27. package/coverage/.tmp/coverage-34.json +1 -1
  28. package/coverage/.tmp/coverage-35.json +1 -1
  29. package/coverage/.tmp/coverage-36.json +1 -1
  30. package/coverage/.tmp/coverage-37.json +1 -1
  31. package/coverage/.tmp/coverage-38.json +1 -1
  32. package/coverage/.tmp/coverage-4.json +1 -1
  33. package/coverage/.tmp/coverage-40.json +1 -1
  34. package/coverage/.tmp/coverage-41.json +1 -1
  35. package/coverage/.tmp/coverage-5.json +1 -1
  36. package/coverage/.tmp/coverage-6.json +1 -1
  37. package/coverage/.tmp/coverage-7.json +1 -1
  38. package/coverage/.tmp/coverage-8.json +1 -1
  39. package/coverage/.tmp/coverage-9.json +1 -1
  40. package/lib/cjs/components/Alert/styles.js +1 -1
  41. package/lib/cjs/components/Alert/styles.js.map +1 -1
  42. package/lib/cjs/components/PullRefresh/PullRefresh.js +76 -16
  43. package/lib/cjs/components/PullRefresh/PullRefresh.js.map +1 -1
  44. package/lib/esm/components/Alert/styles.js +1 -1
  45. package/lib/esm/components/Alert/styles.js.map +1 -1
  46. package/lib/esm/components/PullRefresh/PullRefresh.js +76 -16
  47. package/lib/esm/components/PullRefresh/PullRefresh.js.map +1 -1
  48. package/package.json +2 -2
  49. package/src/components/Alert/styles.ts +1 -1
  50. package/src/components/PullRefresh/PullRefresh.tsx +113 -39
  51. package/src/i18n/@types/resources.d.ts +27 -27
  52. package/src/i18n/index.json +31 -31
@@ -139,13 +139,21 @@ function PullRefresh(props) {
139
139
  });
140
140
  } else if (panValue > 0) {
141
141
  updatePullState(PullState.FINISH);
142
+ setMoveHeight(0);
143
+ setMovePercent(0);
142
144
  animatedTo(0, function () {
143
145
  setIsPulling(false);
144
146
  updatePullState(PullState.INIT);
147
+ pan.setValue(0);
148
+ pan.flattenOffset();
145
149
  });
146
150
  } else {
147
151
  updatePullState(PullState.INIT);
148
152
  setIsPulling(false);
153
+ setMoveHeight(0);
154
+ setMovePercent(0);
155
+ pan.setValue(0);
156
+ pan.flattenOffset();
149
157
  }
150
158
  };
151
159
  var updatePullState = function updatePullState(state) {
@@ -203,7 +211,16 @@ function PullRefresh(props) {
203
211
  if (props.initRefresh && !hasInitRefreshed) {
204
212
  return false;
205
213
  }
206
- return isPulling ? false : scrollY <= 0 && gestureState.vy > 0 && gestureState.vy > Math.abs(gestureState.vx);
214
+ if (isRefreshing || pullState === PullState.LOADING || pullState === PullState.HOLDING) {
215
+ return false;
216
+ }
217
+ if (isPulling) {
218
+ return false;
219
+ }
220
+ if (gestureState.vy < 0) {
221
+ return false;
222
+ }
223
+ return scrollY <= 0 && gestureState.vy > 0 && gestureState.vy > Math.abs(gestureState.vx);
207
224
  };
208
225
  var panResponder = useMemo(function () {
209
226
  if (Platform.OS !== "ios" && props.nativeAndroidPullRefresh) {
@@ -220,12 +237,17 @@ function PullRefresh(props) {
220
237
  });
221
238
  }
222
239
  return PanResponder.create({
223
- onStartShouldSetPanResponder: canMove,
224
- onStartShouldSetPanResponderCapture: canMove,
240
+ onStartShouldSetPanResponder: function onStartShouldSetPanResponder() {
241
+ return false;
242
+ },
243
+ onStartShouldSetPanResponderCapture: function onStartShouldSetPanResponderCapture() {
244
+ return false;
245
+ },
225
246
  onMoveShouldSetPanResponder: canMove,
226
247
  onMoveShouldSetPanResponderCapture: canMove,
227
248
  onPanResponderGrant: function onPanResponderGrant() {
228
249
  animation && animation.stop();
250
+ pan.flattenOffset();
229
251
  pan.setOffset(pan._value);
230
252
  updatePullState(PullState.PULLING);
231
253
  pullTimeout && clearTimeout(pullTimeout);
@@ -245,14 +267,17 @@ function PullRefresh(props) {
245
267
  },
246
268
  onPanResponderRelease: onRelease,
247
269
  onPanResponderTerminationRequest: function onPanResponderTerminationRequest() {
248
- return false;
270
+ if (isPulling || pullState === PullState.PULLING) {
271
+ return false;
272
+ }
273
+ return true;
249
274
  },
250
275
  onPanResponderTerminate: onRelease,
251
276
  onShouldBlockNativeResponder: function onShouldBlockNativeResponder() {
252
- return true;
277
+ return isPulling || pullState === PullState.PULLING;
253
278
  }
254
279
  });
255
- }, [isPulling, scrollY, props.initRefresh, hasInitRefreshed, pullAnimHeight, props.nativeAndroidPullRefresh]);
280
+ }, [isPulling, scrollY, props.initRefresh, hasInitRefreshed, pullAnimHeight, props.nativeAndroidPullRefresh, isRefreshing, pullState]);
256
281
  useEffect(function () {
257
282
  if (Platform.OS !== "ios" && props.nativeAndroidPullRefresh) return;
258
283
  if (pullState === PullState.PULLING && !props.initRefresh) {
@@ -271,9 +296,14 @@ function PullRefresh(props) {
271
296
  setPullTimeout(
272
297
  //@ts-ignore
273
298
  setTimeout(function () {
299
+ pan.flattenOffset();
300
+ setMoveHeight(0);
301
+ setMovePercent(0);
274
302
  animatedTo(0, function () {
275
303
  setIsPulling(false);
276
304
  updatePullState(PullState.INIT);
305
+ pan.setValue(0);
306
+ pan.flattenOffset();
277
307
  });
278
308
  updatePullState(PullState.FINISH);
279
309
  }, (_props$msHoldingTime2 = props === null || props === void 0 ? void 0 : props.msHoldingTime) !== null && _props$msHoldingTime2 !== void 0 ? _props$msHoldingTime2 : 1e3));
@@ -288,11 +318,10 @@ function PullRefresh(props) {
288
318
  };
289
319
  var scrollContent = useMemo(function () {
290
320
  return React.Children.map(props.children, function (child) {
291
- var _props$androidRefresh, _props$androidRefresh2;
292
- return /*#__PURE__*/React.cloneElement(child, _objectSpread2({
293
- // 设置滚动响应频率
294
- scrollEventThrottle: 1
295
- }, Platform.OS === "android" && props.nativeAndroidPullRefresh ? {
321
+ var _originalOnScroll$_an, _props$androidRefresh, _props$androidRefresh2;
322
+ var originalOnScroll = child.props.onScroll;
323
+ var hasNativeDriver = originalOnScroll && (originalOnScroll["__isNative"] === true || (originalOnScroll === null || originalOnScroll === void 0 || (_originalOnScroll$_an = originalOnScroll._animation) === null || _originalOnScroll$_an === void 0 ? void 0 : _originalOnScroll$_an.useNativeDriver) === true);
324
+ var injectedProps = Platform.OS === "android" && props.nativeAndroidPullRefresh ? {
296
325
  refreshControl: /* @__PURE__ */React.createElement(RefreshControl, _objectSpread2(_objectSpread2({}, props.androidRefreshProps || {}), {}, {
297
326
  colors: (_props$androidRefresh = (_props$androidRefresh2 = props.androidRefreshProps) === null || _props$androidRefresh2 === void 0 ? void 0 : _props$androidRefresh2.colors) !== null && _props$androidRefresh !== void 0 ? _props$androidRefresh : props.androidColors,
298
327
  refreshing: !!props.isRefreshing || internalRefreshing,
@@ -313,9 +342,37 @@ function PullRefresh(props) {
313
342
  }
314
343
  })),
315
344
  onScroll: function onScroll(evt) {
316
- if (child.props.onScroll && typeof child.props.onScroll === "function") {
317
- child.props.onScroll(evt);
345
+ if (originalOnScroll && typeof originalOnScroll === "function") {
346
+ originalOnScroll(evt);
347
+ }
348
+ }
349
+ } : hasNativeDriver ? {
350
+ // When the child uses native-driver Animated.event, keep it intact to avoid crashes
351
+ onScroll: originalOnScroll,
352
+ onMomentumScrollEnd: function onMomentumScrollEnd(evt) {
353
+ setScrollY(evt.nativeEvent.contentOffset.y);
354
+ child.props.onMomentumScrollEnd && child.props.onMomentumScrollEnd(evt);
355
+ },
356
+ onScrollEndDrag: function onScrollEndDrag(evt) {
357
+ setScrollY(evt.nativeEvent.contentOffset.y);
358
+ if (pullState === PullState.LOADING && evt.nativeEvent.contentOffset.y > 0) {
359
+ var y = Math.max(0, pullAnimHeight - evt.nativeEvent.contentOffset.y);
360
+ viewRef.current && viewRef.current.setNativeProps({
361
+ style: {
362
+ transform: [{
363
+ translateY: y
364
+ }]
365
+ }
366
+ });
367
+ animatedViewRef.current && animatedViewRef.current.setNativeProps({
368
+ style: {
369
+ transform: [{
370
+ translateY: y
371
+ }]
372
+ }
373
+ });
318
374
  }
375
+ child.props.onScrollEndDrag && child.props.onScrollEndDrag(evt);
319
376
  }
320
377
  } : {
321
378
  onScroll: function onScroll(evt) {
@@ -337,11 +394,14 @@ function PullRefresh(props) {
337
394
  }
338
395
  });
339
396
  }
340
- if (child.props.onScroll && typeof child.props.onScroll === "function") {
341
- child.props.onScroll(evt);
397
+ if (originalOnScroll && typeof originalOnScroll === "function") {
398
+ originalOnScroll(evt);
342
399
  }
343
400
  }
344
- }));
401
+ };
402
+ return /*#__PURE__*/React.cloneElement(child, _objectSpread2({
403
+ scrollEventThrottle: 1
404
+ }, injectedProps));
345
405
  });
346
406
  }, [pullState, props.children, pullAnimHeight, internalRefreshing, props.isRefreshing, props.nativeAndroidPullRefresh]);
347
407
  var content = useMemo(function () {
@@ -1 +1 @@
1
- {"version":3,"file":"PullRefresh.js","sources":["../../../../src/components/PullRefresh/PullRefresh.tsx"],"sourcesContent":["import React, { useState, useRef, useMemo, useEffect } from \"react\";\nimport {\n View,\n StyleSheet,\n Animated,\n PanResponder,\n Easing,\n LayoutChangeEvent,\n Platform,\n RefreshControl as RNRefreshControl,\n} from \"react-native\";\nimport { RedsPullRefresh, PullRefreshDefaultProps, PullState } from \"./interface/index\";\nimport RefreshControl from \"./component\";\n// alias to avoid confusion when reading diff\nconst CustomRefreshControl = RefreshControl;\nimport useMounted from \"../../pvCount/useUnmountedProcess\";\nexport default function PullRefresh(props: RedsPullRefresh) {\n useMounted(\"PullRefresh\");\n // RefreshControl组件高度\n const [pullAnimHeight, setPullAnimHeight] = useState(0);\n\n // 触发刷新的最小下拉距离\n const [minPullDistance, setMinPullDistance] = useState(0);\n\n // 手势\n const [pan] = useState(new Animated.Value(0));\n\n // 滚动距离\n const [scrollY, setScrollY] = useState<number>(0);\n\n // 是否在下拉中\n const [isPulling, setIsPulling] = useState<boolean>(false);\n\n // 是否在刷新中\n const [isRefreshing, setIsRefreshing] = useState<boolean>(false);\n\n // 内部刷新状态(用于默认启用,特别是 Android 或未提供回调时)\n const [internalRefreshing, setInternalRefreshing] = useState<boolean>(false);\n // Android 自动结束计时器\n const androidAutoEndRef = useRef<any>();\n\n // 组合动画\n const [animation, setAnimation] = useState<Animated.CompositeAnimation>();\n\n // 拉取状态\n const [pullState, setPullState] = useState<PullState>(PullState.INIT);\n\n // 移动高度\n const [moveHeight, setMoveHeight] = useState<number>(0);\n\n // 移动百分比\n const [movePercent, setMovePercent] = useState<number>(0);\n\n // 下拉时间间隔\n const [pullTimeout, setPullTimeout] = useState();\n\n // 下拉图标\n const refreshControlRef = useRef();\n\n // view ref\n const viewRef = useRef<View>();\n\n // 动画ref\n const animatedViewRef = useRef<View>();\n\n // 下拉组件的初始top值\n const [top, setTop] = useState<number>(-1000);\n\n // 标记是否已经执行过初始刷新\n const [hasInitRefreshed, setHasInitRefreshed] = useState<boolean>(false);\n\n // 执行初始刷新的方法\n const performInitRefresh = () => {\n if ((pullAnimHeight > 0 && !hasInitRefreshed && props.initRefresh) || props.refresh) {\n // 设置初始状态为拉取状态\n updatePullState(PullState.LOADING);\n\n // 执行下拉动画\n animatedTo(pullAnimHeight, () => {\n setHasInitRefreshed(true);\n setIsRefreshing(true);\n setIsPulling(true);\n // 触发刷新回调\n props.onRequest && props.onRequest();\n });\n }\n };\n\n // 监听 initRefresh 属性和相关依赖变化\n useEffect(() => {\n if ((props.initRefresh && pullAnimHeight > 0 && !hasInitRefreshed && !isRefreshing) || props.refresh) {\n performInitRefresh();\n }\n }, [props.initRefresh, pullAnimHeight, hasInitRefreshed, isRefreshing, props.refresh]);\n // 卸载清理:超时计时器\n useEffect(() => {\n return () => {\n // @ts-ignore\n if (pullTimeout) clearTimeout(pullTimeout);\n if (androidAutoEndRef.current) clearTimeout(androidAutoEndRef.current);\n };\n }, [pullTimeout]);\n\n // 释放手指\n const onRelease = () => {\n // 重置偏移位置\n pan.flattenOffset();\n // @ts-ignore\n const panValue = pan._value;\n // 拉动距离大于设定下拉高度\n if (panValue >= pullAnimHeight) {\n animatedTo(pullAnimHeight, () => {\n updatePullState(PullState.LOADING);\n // 如果有回调则调用,否则走默认内部流程(iOS 默认也支持)\n if (props.onRequest) {\n props.onRequest();\n } else {\n setInternalRefreshing(true);\n // 启动一个自动结束计时器,避免没有外部状态时卡住\n if (androidAutoEndRef.current) clearTimeout(androidAutoEndRef.current);\n androidAutoEndRef.current = setTimeout(() => {\n setInternalRefreshing(false);\n }, props?.msHoldingTime ?? 1000);\n }\n });\n // 有拉动距离但是不够设定的下拉高度\n } else if (panValue > 0) {\n updatePullState(PullState.FINISH);\n animatedTo(0, () => {\n setIsPulling(false);\n updatePullState(PullState.INIT);\n });\n // 否则就是初始状态\n } else {\n updatePullState(PullState.INIT);\n setIsPulling(false);\n }\n };\n\n // 更新refreshControl状态\n const updatePullState = (state: PullState) => {\n if (pullState === state) {\n return;\n }\n setPullState(state);\n renderRefreshControl(state);\n };\n\n // 下拉动画\n const animatedTo = (toValue: number, cb?: () => void) => {\n let animation: any;\n if (toValue === 0) {\n // 使用弹簧动画实现回弹效果\n animation = Animated.spring(pan, {\n toValue: toValue,\n // 回弹参数配置\n friction: 8, // 控制回弹幅度(值越小幅度越大)\n tension: 60, // 控制回弹速度(值越大速度越快)\n velocity: 1, // 初始速度,增强回弹效果\n useNativeDriver: false,\n });\n } else {\n // 针对初始加载优化动画参数\n const duration =\n !hasInitRefreshed && props.initRefresh\n ? 1000 // 初始加载时使用固定时长\n : Math.abs(((pan as any)._value - toValue) * 1.4);\n animation = Animated.timing(pan, {\n toValue: toValue,\n easing: Easing.bezier(0.1, 0.57, 0.1, 1),\n duration: duration,\n useNativeDriver: false,\n });\n }\n setAnimation(animation);\n animation.start(({ finished }: { finished: boolean }) => {\n if (finished) {\n cb && cb();\n setAnimation(undefined);\n }\n });\n };\n\n // 传递给RefreshControl组件参数用来判断状态\n const renderRefreshControl = (state?: PullState) => {\n const refreshControlProps = {\n pullAnimHeight,\n minPullDistance,\n pullState: state || pullState,\n moveHeight,\n movePercent,\n };\n if (refreshControlRef.current) {\n // @ts-ignore\n refreshControlRef.current.setRefreshControlParams(refreshControlProps);\n }\n };\n\n // 是否能移动手指 - 初始加载时禁用手势\n const canMove = (evt: any, gestureState: any) => {\n // 如果正在初始刷新,禁用手势\n if (props.initRefresh && !hasInitRefreshed) {\n return false;\n }\n return isPulling ? false : scrollY <= 0 && gestureState.vy > 0 && gestureState.vy > Math.abs(gestureState.vx);\n };\n\n // 手势对象\n const panResponder = useMemo(() => {\n if (Platform.OS !== \"ios\" && props.nativeAndroidPullRefresh) {\n // Android 原生下拉时不启用自定义手势\n return PanResponder.create({\n onStartShouldSetPanResponder: () => false,\n onMoveShouldSetPanResponder: () => false,\n onPanResponderTerminationRequest: () => true,\n });\n }\n return PanResponder.create({\n onStartShouldSetPanResponder: canMove,\n onStartShouldSetPanResponderCapture: canMove,\n onMoveShouldSetPanResponder: canMove,\n onMoveShouldSetPanResponderCapture: canMove,\n onPanResponderGrant: () => {\n animation && animation.stop();\n // @ts-ignore\n pan.setOffset(pan._value);\n updatePullState(PullState.PULLING);\n pullTimeout && clearTimeout(pullTimeout);\n },\n onPanResponderMove: (evt, gestureState) => {\n setIsPulling(true);\n // @ts-ignore\n const offset = pan._offset;\n let value = Math.max(offset + gestureState.dy, 0);\n if (value > 0) {\n // 弹簧劲度系数\n pan.setValue(gestureState.dy / 2.2);\n } else {\n pan.setValue(-offset);\n }\n setMoveHeight(value);\n setMovePercent((value / pullAnimHeight) * 100);\n renderRefreshControl();\n },\n onPanResponderRelease: onRelease,\n onPanResponderTerminationRequest() {\n return false;\n },\n onPanResponderTerminate: onRelease,\n onShouldBlockNativeResponder() {\n return true;\n },\n });\n }, [isPulling, scrollY, props.initRefresh, hasInitRefreshed, pullAnimHeight, props.nativeAndroidPullRefresh]);\n\n // 根据外层传递参数变化进行更新执行(自定义实现启用时)\n useEffect(() => {\n if (Platform.OS !== \"ios\" && props.nativeAndroidPullRefresh) return;\n if (pullState === PullState.PULLING && !props.initRefresh) {\n return;\n }\n // 加载中\n const effectiveRefreshing = !!props.isRefreshing || internalRefreshing;\n if (effectiveRefreshing === true && !isRefreshing) {\n animatedTo(pullAnimHeight);\n setIsRefreshing(true);\n updatePullState(PullState.LOADING);\n }\n\n // 外层加载结束 需要重置位置\n if (effectiveRefreshing === false && isRefreshing) {\n setIsPulling(false);\n updatePullState(PullState.HOLDING);\n setPullTimeout(\n //@ts-ignore\n setTimeout(() => {\n animatedTo(0, () => {\n setIsPulling(false);\n updatePullState(PullState.INIT);\n });\n updatePullState(PullState.FINISH);\n }, props?.msHoldingTime ?? 1000),\n );\n\n setIsRefreshing(false);\n }\n }, [isRefreshing, props.msHoldingTime, props.isRefreshing, pullState, internalRefreshing]);\n\n // RefreshControl组件初始化计算\n const onLayout = (evt: LayoutChangeEvent) => {\n const height = props.pullAnimHeight || evt.nativeEvent.layout.height;\n setPullAnimHeight(height);\n setMinPullDistance(props.minPullDistance || height);\n setTop(-height);\n };\n\n // 重写ScrollView的onScroll事件(自定义:用于手势门控/头部位置; Android 原生:注入 RefreshControl)\n const scrollContent = useMemo(() => {\n return React.Children.map(props.children, (child: any) =>\n React.cloneElement(child, {\n // 设置滚动响应频率\n scrollEventThrottle: 1,\n ...(Platform.OS === \"android\" && props.nativeAndroidPullRefresh\n ? {\n refreshControl: (\n <RNRefreshControl\n {...(props.androidRefreshProps || {})}\n colors={((props.androidRefreshProps as any)?.colors ?? props.androidColors) as any}\n refreshing={!!props.isRefreshing || internalRefreshing}\n onRefresh={() => {\n if (!!props.isRefreshing || internalRefreshing) return;\n try {\n props.onRequest && props.onRequest();\n } finally {\n // 默认启用:无回调或未受控时自动结束\n if (!props.onRequest) {\n setInternalRefreshing(true);\n }\n // 无论是否有回调,都启动一个兜底自动结束(避免卡住)\n if (androidAutoEndRef.current) clearTimeout(androidAutoEndRef.current);\n androidAutoEndRef.current = setTimeout(() => {\n setInternalRefreshing(false);\n }, props?.msHoldingTime ?? 1000);\n }\n }}\n />\n ),\n onScroll: (evt: any) => {\n if (child.props.onScroll && typeof child.props.onScroll === \"function\") {\n child.props.onScroll(evt);\n }\n },\n }\n : {\n onScroll: (evt: any) => {\n setScrollY(evt.nativeEvent.contentOffset.y);\n // iOS下拉刷新Loading时,ScrollView向上滑动的时候,refreshControl部分同样上滑\n if (pullState === PullState.LOADING && evt.nativeEvent.contentOffset.y > 0) {\n const y = Math.max(0, pullAnimHeight - evt.nativeEvent.contentOffset.y);\n viewRef.current &&\n viewRef.current.setNativeProps({\n style: {\n transform: [{ translateY: y }],\n },\n });\n animatedViewRef.current &&\n animatedViewRef.current.setNativeProps({\n style: {\n transform: [{ translateY: y }],\n },\n });\n }\n if (child.props.onScroll && typeof child.props.onScroll === \"function\") {\n child.props.onScroll(evt);\n }\n },\n }),\n }),\n );\n }, [\n pullState,\n props.children,\n pullAnimHeight,\n internalRefreshing,\n props.isRefreshing,\n props.nativeAndroidPullRefresh,\n ]);\n\n // 增加Animated.View控制ScrollView展示位置(自定义)\n const content = useMemo(() => {\n if (Platform.OS === \"android\" && props.nativeAndroidPullRefresh) {\n // Android 直接返回内容(由 RN RefreshControl 控制)\n return <>{scrollContent}</>;\n }\n return (\n <Animated.View\n // @ts-ignore\n ref={viewRef}\n style={{\n transform: [{ translateY: pan }],\n flex: 1,\n }}\n >\n {scrollContent}\n </Animated.View>\n );\n }, [pan, scrollContent, props.nativeAndroidPullRefresh]);\n\n return (\n <View\n style={[styles.container, props.style]}\n {...(Platform.OS === \"ios\" || !props.nativeAndroidPullRefresh ? panResponder.panHandlers : {})}\n testID=\"refresh-container\"\n >\n {Platform.OS === \"ios\" || !props.nativeAndroidPullRefresh ? (\n <Animated.View\n // @ts-ignore\n ref={animatedViewRef}\n onLayout={onLayout}\n style={[\n styles.freshItem,\n {\n top: top,\n height: props.pullAnimHeight,\n transform: [{ translateY: pan }],\n },\n props.controlStyle,\n ]}\n >\n {/* @ts-ignore */}\n <CustomRefreshControl ref={refreshControlRef} {...props} movePercent={movePercent} />\n </Animated.View>\n ) : null}\n {content}\n </View>\n );\n}\nPullRefresh.defaultProps = PullRefreshDefaultProps;\n\nconst styles = StyleSheet.create({\n container: {\n overflow: \"hidden\",\n position: \"relative\",\n flex: 1,\n },\n freshItem: {\n position: \"absolute\",\n width: \"100%\",\n justifyContent: \"center\",\n alignItems: \"center\",\n zIndex: 1,\n },\n});\n"],"names":["CustomRefreshControl","RefreshControl","PullRefresh","props","useMounted","_useState","useState","_useState2","_slicedToArray","pullAnimHeight","setPullAnimHeight","_useState3","_useState4","minPullDistance","setMinPullDistance","_useState5","Animated","Value","_useState6","pan","_useState7","_useState8","scrollY","setScrollY","_useState9","_useState0","isPulling","setIsPulling","_useState1","_useState10","isRefreshing","setIsRefreshing","_useState11","_useState12","internalRefreshing","setInternalRefreshing","androidAutoEndRef","useRef","_useState13","_useState14","animation","setAnimation","_useState15","PullState","INIT","_useState16","pullState","setPullState","_useState17","_useState18","moveHeight","setMoveHeight","_useState19","_useState20","movePercent","setMovePercent","_useState21","_useState22","pullTimeout","setPullTimeout","refreshControlRef","viewRef","animatedViewRef","_useState23","_useState24","top","setTop","_useState25","_useState26","hasInitRefreshed","setHasInitRefreshed","performInitRefresh","initRefresh","refresh","updatePullState","LOADING","animatedTo","onRequest","useEffect","current","clearTimeout","onRelease","flattenOffset","panValue","_value","_props$msHoldingTime","setTimeout","msHoldingTime","FINISH","state","renderRefreshControl","toValue","cb","spring","friction","tension","velocity","useNativeDriver","duration","Math","abs","timing","easing","Easing","bezier","start","_ref","finished","refreshControlProps","setRefreshControlParams","canMove","evt","gestureState","vy","vx","panResponder","useMemo","Platform","OS","nativeAndroidPullRefresh","PanResponder","create","onStartShouldSetPanResponder","onMoveShouldSetPanResponder","onPanResponderTerminationRequest","onStartShouldSetPanResponderCapture","onMoveShouldSetPanResponderCapture","onPanResponderGrant","stop","setOffset","PULLING","onPanResponderMove","offset","_offset","value","max","dy","setValue","onPanResponderRelease","onPanResponderTerminate","onShouldBlockNativeResponder","effectiveRefreshing","_props$msHoldingTime2","HOLDING","onLayout","height","nativeEvent","layout","scrollContent","React","Children","map","children","child","_props$androidRefresh","_props$androidRefresh2","cloneElement","_objectSpread","scrollEventThrottle","refreshControl","createElement","RNRefreshControl","androidRefreshProps","colors","androidColors","refreshing","onRefresh","_props$msHoldingTime3","onScroll","contentOffset","y","setNativeProps","style","transform","translateY","content","View","ref","flex","styles","container","panHandlers","testID","freshItem","controlStyle","defaultProps","PullRefreshDefaultProps","StyleSheet","overflow","position","width","justifyContent","alignItems","zIndex"],"mappings":"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"}
1
+ {"version":3,"file":"PullRefresh.js","sources":["../../../../src/components/PullRefresh/PullRefresh.tsx"],"sourcesContent":["import React, { useState, useRef, useMemo, useEffect } from \"react\";\nimport {\n View,\n StyleSheet,\n Animated,\n PanResponder,\n Easing,\n LayoutChangeEvent,\n Platform,\n RefreshControl as RNRefreshControl,\n} from \"react-native\";\nimport { RedsPullRefresh, PullRefreshDefaultProps, PullState } from \"./interface/index\";\nimport RefreshControl from \"./component\";\n// alias to avoid confusion when reading diff\nconst CustomRefreshControl = RefreshControl;\nimport useMounted from \"../../pvCount/useUnmountedProcess\";\nexport default function PullRefresh(props: RedsPullRefresh) {\n useMounted(\"PullRefresh\");\n // RefreshControl组件高度\n const [pullAnimHeight, setPullAnimHeight] = useState(0);\n\n // 触发刷新的最小下拉距离\n const [minPullDistance, setMinPullDistance] = useState(0);\n\n // 手势\n const [pan] = useState(new Animated.Value(0));\n\n // 滚动距离\n const [scrollY, setScrollY] = useState<number>(0);\n\n // 是否在下拉中\n const [isPulling, setIsPulling] = useState<boolean>(false);\n\n // 是否在刷新中\n const [isRefreshing, setIsRefreshing] = useState<boolean>(false);\n\n // 内部刷新状态(用于默认启用,特别是 Android 或未提供回调时)\n const [internalRefreshing, setInternalRefreshing] = useState<boolean>(false);\n // Android 自动结束计时器\n const androidAutoEndRef = useRef<any>();\n\n // 组合动画\n const [animation, setAnimation] = useState<Animated.CompositeAnimation>();\n\n // 拉取状态\n const [pullState, setPullState] = useState<PullState>(PullState.INIT);\n\n // 移动高度\n const [moveHeight, setMoveHeight] = useState<number>(0);\n\n // 移动百分比\n const [movePercent, setMovePercent] = useState<number>(0);\n\n // 下拉时间间隔\n const [pullTimeout, setPullTimeout] = useState();\n\n // 下拉图标\n const refreshControlRef = useRef();\n\n // view ref\n const viewRef = useRef<View>();\n\n // 动画ref\n const animatedViewRef = useRef<View>();\n\n // 下拉组件的初始top值\n const [top, setTop] = useState<number>(-1000);\n\n // 标记是否已经执行过初始刷新\n const [hasInitRefreshed, setHasInitRefreshed] = useState<boolean>(false);\n\n // 执行初始刷新的方法\n const performInitRefresh = () => {\n if ((pullAnimHeight > 0 && !hasInitRefreshed && props.initRefresh) || props.refresh) {\n // 设置初始状态为拉取状态\n updatePullState(PullState.LOADING);\n\n // 执行下拉动画\n animatedTo(pullAnimHeight, () => {\n setHasInitRefreshed(true);\n setIsRefreshing(true);\n setIsPulling(true);\n // 触发刷新回调\n props.onRequest && props.onRequest();\n });\n }\n };\n\n // 监听 initRefresh 属性和相关依赖变化\n useEffect(() => {\n if ((props.initRefresh && pullAnimHeight > 0 && !hasInitRefreshed && !isRefreshing) || props.refresh) {\n performInitRefresh();\n }\n }, [props.initRefresh, pullAnimHeight, hasInitRefreshed, isRefreshing, props.refresh]);\n // 卸载清理:超时计时器\n useEffect(() => {\n return () => {\n // @ts-ignore\n if (pullTimeout) clearTimeout(pullTimeout);\n if (androidAutoEndRef.current) clearTimeout(androidAutoEndRef.current);\n };\n }, [pullTimeout]);\n\n // 释放手指\n const onRelease = () => {\n // 重置偏移位置\n pan.flattenOffset();\n // @ts-ignore\n const panValue = pan._value;\n // 拉动距离大于设定下拉高度\n if (panValue >= pullAnimHeight) {\n animatedTo(pullAnimHeight, () => {\n updatePullState(PullState.LOADING);\n // 如果有回调则调用,否则走默认内部流程(iOS 默认也支持)\n if (props.onRequest) {\n props.onRequest();\n } else {\n setInternalRefreshing(true);\n // 启动一个自动结束计时器,避免没有外部状态时卡住\n if (androidAutoEndRef.current) clearTimeout(androidAutoEndRef.current);\n androidAutoEndRef.current = setTimeout(() => {\n setInternalRefreshing(false);\n }, props?.msHoldingTime ?? 1000);\n }\n });\n // 有拉动距离但是不够设定的下拉高度\n } else if (panValue > 0) {\n updatePullState(PullState.FINISH);\n setMoveHeight(0);\n setMovePercent(0);\n animatedTo(0, () => {\n setIsPulling(false);\n updatePullState(PullState.INIT);\n pan.setValue(0);\n pan.flattenOffset();\n });\n // 否则就是初始状态\n } else {\n updatePullState(PullState.INIT);\n setIsPulling(false);\n setMoveHeight(0);\n setMovePercent(0);\n pan.setValue(0);\n pan.flattenOffset();\n }\n };\n\n // 更新refreshControl状态\n const updatePullState = (state: PullState) => {\n if (pullState === state) {\n return;\n }\n setPullState(state);\n renderRefreshControl(state);\n };\n\n // 下拉动画\n const animatedTo = (toValue: number, cb?: () => void) => {\n let animation: any;\n if (toValue === 0) {\n // 使用弹簧动画实现回弹效果\n animation = Animated.spring(pan, {\n toValue: toValue,\n // 回弹参数配置\n friction: 8, // 控制回弹幅度(值越小幅度越大)\n tension: 60, // 控制回弹速度(值越大速度越快)\n velocity: 1, // 初始速度,增强回弹效果\n useNativeDriver: false,\n });\n } else {\n // 针对初始加载优化动画参数\n const duration =\n !hasInitRefreshed && props.initRefresh\n ? 1000 // 初始加载时使用固定时长\n : Math.abs(((pan as any)._value - toValue) * 1.4);\n animation = Animated.timing(pan, {\n toValue: toValue,\n easing: Easing.bezier(0.1, 0.57, 0.1, 1),\n duration: duration,\n useNativeDriver: false,\n });\n }\n setAnimation(animation);\n animation.start(({ finished }: { finished: boolean }) => {\n if (finished) {\n cb && cb();\n setAnimation(undefined);\n }\n });\n };\n\n // 传递给RefreshControl组件参数用来判断状态\n const renderRefreshControl = (state?: PullState) => {\n const refreshControlProps = {\n pullAnimHeight,\n minPullDistance,\n pullState: state || pullState,\n moveHeight,\n movePercent,\n };\n if (refreshControlRef.current) {\n // @ts-ignore\n refreshControlRef.current.setRefreshControlParams(refreshControlProps);\n }\n };\n\n // 是否能移动手指 - 初始加载时禁用手势\n const canMove = (evt: any, gestureState: any) => {\n // 如果正在初始刷新,禁用手势\n if (props.initRefresh && !hasInitRefreshed) {\n return false;\n }\n // Block during refresh states\n if (isRefreshing || pullState === PullState.LOADING || pullState === PullState.HOLDING) {\n return false;\n }\n // Block if already pulling\n if (isPulling) {\n return false;\n }\n // Explicitly reject upward swipes\n if (gestureState.vy < 0) {\n return false;\n }\n return scrollY <= 0 && gestureState.vy > 0 && gestureState.vy > Math.abs(gestureState.vx);\n };\n\n // 手势对象\n const panResponder = useMemo(() => {\n if (Platform.OS !== \"ios\" && props.nativeAndroidPullRefresh) {\n // Android 原生下拉时不启用自定义手势\n return PanResponder.create({\n onStartShouldSetPanResponder: () => false,\n onMoveShouldSetPanResponder: () => false,\n onPanResponderTerminationRequest: () => true,\n });\n }\n return PanResponder.create({\n onStartShouldSetPanResponder: () => false,\n onStartShouldSetPanResponderCapture: () => false,\n onMoveShouldSetPanResponder: canMove,\n onMoveShouldSetPanResponderCapture: canMove,\n onPanResponderGrant: () => {\n animation && animation.stop();\n pan.flattenOffset();\n // @ts-ignore\n pan.setOffset(pan._value);\n updatePullState(PullState.PULLING);\n pullTimeout && clearTimeout(pullTimeout);\n },\n onPanResponderMove: (evt, gestureState) => {\n setIsPulling(true);\n // @ts-ignore\n const offset = pan._offset;\n let value = Math.max(offset + gestureState.dy, 0);\n if (value > 0) {\n // 弹簧劲度系数\n pan.setValue(gestureState.dy / 2.2);\n } else {\n pan.setValue(-offset);\n }\n setMoveHeight(value);\n setMovePercent((value / pullAnimHeight) * 100);\n renderRefreshControl();\n },\n onPanResponderRelease: onRelease,\n onPanResponderTerminationRequest() {\n if (isPulling || pullState === PullState.PULLING) {\n return false;\n }\n return true;\n },\n onPanResponderTerminate: onRelease,\n onShouldBlockNativeResponder() {\n return isPulling || pullState === PullState.PULLING;\n },\n });\n }, [\n isPulling,\n scrollY,\n props.initRefresh,\n hasInitRefreshed,\n pullAnimHeight,\n props.nativeAndroidPullRefresh,\n isRefreshing,\n pullState,\n ]);\n\n // 根据外层传递参数变化进行更新执行(自定义实现启用时)\n useEffect(() => {\n if (Platform.OS !== \"ios\" && props.nativeAndroidPullRefresh) return;\n if (pullState === PullState.PULLING && !props.initRefresh) {\n return;\n }\n // 加载中\n const effectiveRefreshing = !!props.isRefreshing || internalRefreshing;\n if (effectiveRefreshing === true && !isRefreshing) {\n animatedTo(pullAnimHeight);\n setIsRefreshing(true);\n updatePullState(PullState.LOADING);\n }\n\n // 外层加载结束 需要重置位置\n if (effectiveRefreshing === false && isRefreshing) {\n setIsPulling(false);\n updatePullState(PullState.HOLDING);\n setPullTimeout(\n //@ts-ignore\n setTimeout(() => {\n pan.flattenOffset();\n setMoveHeight(0);\n setMovePercent(0);\n animatedTo(0, () => {\n setIsPulling(false);\n updatePullState(PullState.INIT);\n pan.setValue(0);\n pan.flattenOffset();\n });\n updatePullState(PullState.FINISH);\n }, props?.msHoldingTime ?? 1000),\n );\n\n setIsRefreshing(false);\n }\n }, [isRefreshing, props.msHoldingTime, props.isRefreshing, pullState, internalRefreshing]);\n\n // RefreshControl组件初始化计算\n const onLayout = (evt: LayoutChangeEvent) => {\n const height = props.pullAnimHeight || evt.nativeEvent.layout.height;\n setPullAnimHeight(height);\n setMinPullDistance(props.minPullDistance || height);\n setTop(-height);\n };\n\n // 重写ScrollView的onScroll事件(自定义:用于手势门控/头部位置; Android 原生:注入 RefreshControl)\n const scrollContent = useMemo(() => {\n return React.Children.map(props.children, (child: any) => {\n const originalOnScroll = child.props.onScroll;\n const hasNativeDriver =\n originalOnScroll &&\n (originalOnScroll[\"__isNative\"] === true || (originalOnScroll as any)?._animation?.useNativeDriver === true);\n\n const injectedProps =\n Platform.OS === \"android\" && props.nativeAndroidPullRefresh\n ? {\n refreshControl: (\n <RNRefreshControl\n {...(props.androidRefreshProps || {})}\n colors={((props.androidRefreshProps as any)?.colors ?? props.androidColors) as any}\n refreshing={!!props.isRefreshing || internalRefreshing}\n onRefresh={() => {\n if (!!props.isRefreshing || internalRefreshing) return;\n try {\n props.onRequest && props.onRequest();\n } finally {\n // 默认启用:无回调或未受控时自动结束\n if (!props.onRequest) {\n setInternalRefreshing(true);\n }\n // 无论是否有回调,都启动一个兜底自动结束(避免卡住)\n if (androidAutoEndRef.current) clearTimeout(androidAutoEndRef.current);\n androidAutoEndRef.current = setTimeout(() => {\n setInternalRefreshing(false);\n }, props?.msHoldingTime ?? 1000);\n }\n }}\n />\n ),\n onScroll: (evt: any) => {\n if (originalOnScroll && typeof originalOnScroll === \"function\") {\n originalOnScroll(evt);\n }\n },\n }\n : hasNativeDriver\n ? {\n // When the child uses native-driver Animated.event, keep it intact to avoid crashes\n onScroll: originalOnScroll,\n onMomentumScrollEnd: (evt: any) => {\n setScrollY(evt.nativeEvent.contentOffset.y);\n child.props.onMomentumScrollEnd && child.props.onMomentumScrollEnd(evt);\n },\n onScrollEndDrag: (evt: any) => {\n setScrollY(evt.nativeEvent.contentOffset.y);\n // Keep header position in loading state\n if (pullState === PullState.LOADING && evt.nativeEvent.contentOffset.y > 0) {\n const y = Math.max(0, pullAnimHeight - evt.nativeEvent.contentOffset.y);\n viewRef.current &&\n viewRef.current.setNativeProps({\n style: {\n transform: [{ translateY: y }],\n },\n });\n animatedViewRef.current &&\n animatedViewRef.current.setNativeProps({\n style: {\n transform: [{ translateY: y }],\n },\n });\n }\n child.props.onScrollEndDrag && child.props.onScrollEndDrag(evt);\n },\n }\n : {\n onScroll: (evt: any) => {\n setScrollY(evt.nativeEvent.contentOffset.y);\n // iOS下拉刷新Loading时,ScrollView向上滑动的时候,refreshControl部分同样上滑\n if (pullState === PullState.LOADING && evt.nativeEvent.contentOffset.y > 0) {\n const y = Math.max(0, pullAnimHeight - evt.nativeEvent.contentOffset.y);\n viewRef.current &&\n viewRef.current.setNativeProps({\n style: {\n transform: [{ translateY: y }],\n },\n });\n animatedViewRef.current &&\n animatedViewRef.current.setNativeProps({\n style: {\n transform: [{ translateY: y }],\n },\n });\n }\n if (originalOnScroll && typeof originalOnScroll === \"function\") {\n originalOnScroll(evt);\n }\n },\n };\n\n return React.cloneElement(child, {\n scrollEventThrottle: 1,\n ...injectedProps,\n });\n });\n }, [\n pullState,\n props.children,\n pullAnimHeight,\n internalRefreshing,\n props.isRefreshing,\n props.nativeAndroidPullRefresh,\n ]);\n\n // 增加Animated.View控制ScrollView展示位置(自定义)\n const content = useMemo(() => {\n if (Platform.OS === \"android\" && props.nativeAndroidPullRefresh) {\n // Android 直接返回内容(由 RN RefreshControl 控制)\n return <>{scrollContent}</>;\n }\n return (\n <Animated.View\n // @ts-ignore\n ref={viewRef}\n style={{\n transform: [{ translateY: pan }],\n flex: 1,\n }}\n >\n {scrollContent}\n </Animated.View>\n );\n }, [pan, scrollContent, props.nativeAndroidPullRefresh]);\n\n return (\n <View\n style={[styles.container, props.style]}\n {...(Platform.OS === \"ios\" || !props.nativeAndroidPullRefresh ? panResponder.panHandlers : {})}\n testID=\"refresh-container\"\n >\n {Platform.OS === \"ios\" || !props.nativeAndroidPullRefresh ? (\n <Animated.View\n // @ts-ignore\n ref={animatedViewRef}\n onLayout={onLayout}\n style={[\n styles.freshItem,\n {\n top: top,\n height: props.pullAnimHeight,\n transform: [{ translateY: pan }],\n },\n props.controlStyle,\n ]}\n >\n {/* @ts-ignore */}\n <CustomRefreshControl ref={refreshControlRef} {...props} movePercent={movePercent} />\n </Animated.View>\n ) : null}\n {content}\n </View>\n );\n}\nPullRefresh.defaultProps = PullRefreshDefaultProps;\n\nconst styles = StyleSheet.create({\n container: {\n overflow: \"hidden\",\n position: \"relative\",\n flex: 1,\n },\n freshItem: {\n position: \"absolute\",\n width: \"100%\",\n justifyContent: \"center\",\n alignItems: \"center\",\n zIndex: 1,\n },\n});\n"],"names":["CustomRefreshControl","RefreshControl","PullRefresh","props","useMounted","_useState","useState","_useState2","_slicedToArray","pullAnimHeight","setPullAnimHeight","_useState3","_useState4","minPullDistance","setMinPullDistance","_useState5","Animated","Value","_useState6","pan","_useState7","_useState8","scrollY","setScrollY","_useState9","_useState0","isPulling","setIsPulling","_useState1","_useState10","isRefreshing","setIsRefreshing","_useState11","_useState12","internalRefreshing","setInternalRefreshing","androidAutoEndRef","useRef","_useState13","_useState14","animation","setAnimation","_useState15","PullState","INIT","_useState16","pullState","setPullState","_useState17","_useState18","moveHeight","setMoveHeight","_useState19","_useState20","movePercent","setMovePercent","_useState21","_useState22","pullTimeout","setPullTimeout","refreshControlRef","viewRef","animatedViewRef","_useState23","_useState24","top","setTop","_useState25","_useState26","hasInitRefreshed","setHasInitRefreshed","performInitRefresh","initRefresh","refresh","updatePullState","LOADING","animatedTo","onRequest","useEffect","current","clearTimeout","onRelease","flattenOffset","panValue","_value","_props$msHoldingTime","setTimeout","msHoldingTime","FINISH","setValue","state","renderRefreshControl","toValue","cb","spring","friction","tension","velocity","useNativeDriver","duration","Math","abs","timing","easing","Easing","bezier","start","_ref","finished","refreshControlProps","setRefreshControlParams","canMove","evt","gestureState","HOLDING","vy","vx","panResponder","useMemo","Platform","OS","nativeAndroidPullRefresh","PanResponder","create","onStartShouldSetPanResponder","onMoveShouldSetPanResponder","onPanResponderTerminationRequest","onStartShouldSetPanResponderCapture","onMoveShouldSetPanResponderCapture","onPanResponderGrant","stop","setOffset","PULLING","onPanResponderMove","offset","_offset","value","max","dy","onPanResponderRelease","onPanResponderTerminate","onShouldBlockNativeResponder","effectiveRefreshing","_props$msHoldingTime2","onLayout","height","nativeEvent","layout","scrollContent","React","Children","map","children","child","_originalOnScroll$_an","_props$androidRefresh","_props$androidRefresh2","originalOnScroll","onScroll","hasNativeDriver","_animation","injectedProps","refreshControl","createElement","RNRefreshControl","_objectSpread","androidRefreshProps","colors","androidColors","refreshing","onRefresh","_props$msHoldingTime3","onMomentumScrollEnd","contentOffset","y","onScrollEndDrag","setNativeProps","style","transform","translateY","cloneElement","scrollEventThrottle","content","View","ref","flex","styles","container","panHandlers","testID","freshItem","controlStyle","defaultProps","PullRefreshDefaultProps","StyleSheet","overflow","position","width","justifyContent","alignItems","zIndex"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xhsreds/reds-rn-next",
3
- "version": "0.10.1-beta202512111836",
3
+ "version": "0.10.1-beta202512161121",
4
4
  "author": "贾斌(呀哈) <jiabin@xiaohongshu.com>",
5
5
  "license": "ISC",
6
6
  "dependencies": {
@@ -27,7 +27,7 @@
27
27
  "react-native-svg": "13.14.0",
28
28
  "@xhs/react-native-harmony": "*",
29
29
  "@xhs/reds-components": "*",
30
- "@xhsreds/reds-token-next": "0.10.1-beta202512111836"
30
+ "@xhsreds/reds-token-next": "0.10.1-beta202512161121"
31
31
  },
32
32
  "peerDependenciesMeta": {
33
33
  "ozone-schema-web": {
@@ -141,7 +141,7 @@ export const style = (props: RedsAlert) => {
141
141
  },
142
142
  cancelText: {
143
143
  color: themeColor.Description,
144
- fontSize: 12,
144
+ fontSize: 16,
145
145
  },
146
146
  horizontalLine: {
147
147
  width: "100%",
@@ -126,14 +126,22 @@ export default function PullRefresh(props: RedsPullRefresh) {
126
126
  // 有拉动距离但是不够设定的下拉高度
127
127
  } else if (panValue > 0) {
128
128
  updatePullState(PullState.FINISH);
129
+ setMoveHeight(0);
130
+ setMovePercent(0);
129
131
  animatedTo(0, () => {
130
132
  setIsPulling(false);
131
133
  updatePullState(PullState.INIT);
134
+ pan.setValue(0);
135
+ pan.flattenOffset();
132
136
  });
133
137
  // 否则就是初始状态
134
138
  } else {
135
139
  updatePullState(PullState.INIT);
136
140
  setIsPulling(false);
141
+ setMoveHeight(0);
142
+ setMovePercent(0);
143
+ pan.setValue(0);
144
+ pan.flattenOffset();
137
145
  }
138
146
  };
139
147
 
@@ -202,7 +210,19 @@ export default function PullRefresh(props: RedsPullRefresh) {
202
210
  if (props.initRefresh && !hasInitRefreshed) {
203
211
  return false;
204
212
  }
205
- return isPulling ? false : scrollY <= 0 && gestureState.vy > 0 && gestureState.vy > Math.abs(gestureState.vx);
213
+ // Block during refresh states
214
+ if (isRefreshing || pullState === PullState.LOADING || pullState === PullState.HOLDING) {
215
+ return false;
216
+ }
217
+ // Block if already pulling
218
+ if (isPulling) {
219
+ return false;
220
+ }
221
+ // Explicitly reject upward swipes
222
+ if (gestureState.vy < 0) {
223
+ return false;
224
+ }
225
+ return scrollY <= 0 && gestureState.vy > 0 && gestureState.vy > Math.abs(gestureState.vx);
206
226
  };
207
227
 
208
228
  // 手势对象
@@ -216,12 +236,13 @@ export default function PullRefresh(props: RedsPullRefresh) {
216
236
  });
217
237
  }
218
238
  return PanResponder.create({
219
- onStartShouldSetPanResponder: canMove,
220
- onStartShouldSetPanResponderCapture: canMove,
239
+ onStartShouldSetPanResponder: () => false,
240
+ onStartShouldSetPanResponderCapture: () => false,
221
241
  onMoveShouldSetPanResponder: canMove,
222
242
  onMoveShouldSetPanResponderCapture: canMove,
223
243
  onPanResponderGrant: () => {
224
244
  animation && animation.stop();
245
+ pan.flattenOffset();
225
246
  // @ts-ignore
226
247
  pan.setOffset(pan._value);
227
248
  updatePullState(PullState.PULLING);
@@ -244,14 +265,26 @@ export default function PullRefresh(props: RedsPullRefresh) {
244
265
  },
245
266
  onPanResponderRelease: onRelease,
246
267
  onPanResponderTerminationRequest() {
247
- return false;
268
+ if (isPulling || pullState === PullState.PULLING) {
269
+ return false;
270
+ }
271
+ return true;
248
272
  },
249
273
  onPanResponderTerminate: onRelease,
250
274
  onShouldBlockNativeResponder() {
251
- return true;
275
+ return isPulling || pullState === PullState.PULLING;
252
276
  },
253
277
  });
254
- }, [isPulling, scrollY, props.initRefresh, hasInitRefreshed, pullAnimHeight, props.nativeAndroidPullRefresh]);
278
+ }, [
279
+ isPulling,
280
+ scrollY,
281
+ props.initRefresh,
282
+ hasInitRefreshed,
283
+ pullAnimHeight,
284
+ props.nativeAndroidPullRefresh,
285
+ isRefreshing,
286
+ pullState,
287
+ ]);
255
288
 
256
289
  // 根据外层传递参数变化进行更新执行(自定义实现启用时)
257
290
  useEffect(() => {
@@ -274,9 +307,14 @@ export default function PullRefresh(props: RedsPullRefresh) {
274
307
  setPullTimeout(
275
308
  //@ts-ignore
276
309
  setTimeout(() => {
310
+ pan.flattenOffset();
311
+ setMoveHeight(0);
312
+ setMovePercent(0);
277
313
  animatedTo(0, () => {
278
314
  setIsPulling(false);
279
315
  updatePullState(PullState.INIT);
316
+ pan.setValue(0);
317
+ pan.flattenOffset();
280
318
  });
281
319
  updatePullState(PullState.FINISH);
282
320
  }, props?.msHoldingTime ?? 1000),
@@ -296,11 +334,14 @@ export default function PullRefresh(props: RedsPullRefresh) {
296
334
 
297
335
  // 重写ScrollView的onScroll事件(自定义:用于手势门控/头部位置; Android 原生:注入 RefreshControl)
298
336
  const scrollContent = useMemo(() => {
299
- return React.Children.map(props.children, (child: any) =>
300
- React.cloneElement(child, {
301
- // 设置滚动响应频率
302
- scrollEventThrottle: 1,
303
- ...(Platform.OS === "android" && props.nativeAndroidPullRefresh
337
+ return React.Children.map(props.children, (child: any) => {
338
+ const originalOnScroll = child.props.onScroll;
339
+ const hasNativeDriver =
340
+ originalOnScroll &&
341
+ (originalOnScroll["__isNative"] === true || (originalOnScroll as any)?._animation?.useNativeDriver === true);
342
+
343
+ const injectedProps =
344
+ Platform.OS === "android" && props.nativeAndroidPullRefresh
304
345
  ? {
305
346
  refreshControl: (
306
347
  <RNRefreshControl
@@ -326,37 +367,70 @@ export default function PullRefresh(props: RedsPullRefresh) {
326
367
  />
327
368
  ),
328
369
  onScroll: (evt: any) => {
329
- if (child.props.onScroll && typeof child.props.onScroll === "function") {
330
- child.props.onScroll(evt);
370
+ if (originalOnScroll && typeof originalOnScroll === "function") {
371
+ originalOnScroll(evt);
331
372
  }
332
373
  },
333
374
  }
334
- : {
335
- onScroll: (evt: any) => {
336
- setScrollY(evt.nativeEvent.contentOffset.y);
337
- // iOS下拉刷新Loading时,ScrollView向上滑动的时候,refreshControl部分同样上滑
338
- if (pullState === PullState.LOADING && evt.nativeEvent.contentOffset.y > 0) {
339
- const y = Math.max(0, pullAnimHeight - evt.nativeEvent.contentOffset.y);
340
- viewRef.current &&
341
- viewRef.current.setNativeProps({
342
- style: {
343
- transform: [{ translateY: y }],
344
- },
345
- });
346
- animatedViewRef.current &&
347
- animatedViewRef.current.setNativeProps({
348
- style: {
349
- transform: [{ translateY: y }],
350
- },
351
- });
352
- }
353
- if (child.props.onScroll && typeof child.props.onScroll === "function") {
354
- child.props.onScroll(evt);
355
- }
356
- },
357
- }),
358
- }),
359
- );
375
+ : hasNativeDriver
376
+ ? {
377
+ // When the child uses native-driver Animated.event, keep it intact to avoid crashes
378
+ onScroll: originalOnScroll,
379
+ onMomentumScrollEnd: (evt: any) => {
380
+ setScrollY(evt.nativeEvent.contentOffset.y);
381
+ child.props.onMomentumScrollEnd && child.props.onMomentumScrollEnd(evt);
382
+ },
383
+ onScrollEndDrag: (evt: any) => {
384
+ setScrollY(evt.nativeEvent.contentOffset.y);
385
+ // Keep header position in loading state
386
+ if (pullState === PullState.LOADING && evt.nativeEvent.contentOffset.y > 0) {
387
+ const y = Math.max(0, pullAnimHeight - evt.nativeEvent.contentOffset.y);
388
+ viewRef.current &&
389
+ viewRef.current.setNativeProps({
390
+ style: {
391
+ transform: [{ translateY: y }],
392
+ },
393
+ });
394
+ animatedViewRef.current &&
395
+ animatedViewRef.current.setNativeProps({
396
+ style: {
397
+ transform: [{ translateY: y }],
398
+ },
399
+ });
400
+ }
401
+ child.props.onScrollEndDrag && child.props.onScrollEndDrag(evt);
402
+ },
403
+ }
404
+ : {
405
+ onScroll: (evt: any) => {
406
+ setScrollY(evt.nativeEvent.contentOffset.y);
407
+ // iOS下拉刷新Loading时,ScrollView向上滑动的时候,refreshControl部分同样上滑
408
+ if (pullState === PullState.LOADING && evt.nativeEvent.contentOffset.y > 0) {
409
+ const y = Math.max(0, pullAnimHeight - evt.nativeEvent.contentOffset.y);
410
+ viewRef.current &&
411
+ viewRef.current.setNativeProps({
412
+ style: {
413
+ transform: [{ translateY: y }],
414
+ },
415
+ });
416
+ animatedViewRef.current &&
417
+ animatedViewRef.current.setNativeProps({
418
+ style: {
419
+ transform: [{ translateY: y }],
420
+ },
421
+ });
422
+ }
423
+ if (originalOnScroll && typeof originalOnScroll === "function") {
424
+ originalOnScroll(evt);
425
+ }
426
+ },
427
+ };
428
+
429
+ return React.cloneElement(child, {
430
+ scrollEventThrottle: 1,
431
+ ...injectedProps,
432
+ });
433
+ });
360
434
  }, [
361
435
  pullState,
362
436
  props.children,