@xhsreds/reds-rn-next 0.10.1-beta202511201716 → 0.10.1-fix-pull-refresh-animated202511211152

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 (72) hide show
  1. package/coverage/.tmp/coverage-10.json +1 -1
  2. package/coverage/.tmp/coverage-11.json +1 -1
  3. package/coverage/.tmp/coverage-12.json +1 -1
  4. package/coverage/.tmp/coverage-13.json +1 -1
  5. package/coverage/.tmp/coverage-14.json +1 -1
  6. package/coverage/.tmp/coverage-15.json +1 -1
  7. package/coverage/.tmp/coverage-17.json +1 -1
  8. package/coverage/.tmp/coverage-18.json +1 -1
  9. package/coverage/.tmp/coverage-19.json +1 -1
  10. package/coverage/.tmp/coverage-2.json +1 -1
  11. package/coverage/.tmp/coverage-21.json +1 -1
  12. package/coverage/.tmp/coverage-23.json +1 -1
  13. package/coverage/.tmp/coverage-24.json +1 -1
  14. package/coverage/.tmp/coverage-25.json +1 -1
  15. package/coverage/.tmp/coverage-27.json +1 -1
  16. package/coverage/.tmp/coverage-28.json +1 -1
  17. package/coverage/.tmp/coverage-29.json +1 -1
  18. package/coverage/.tmp/coverage-3.json +1 -1
  19. package/coverage/.tmp/coverage-30.json +1 -1
  20. package/coverage/.tmp/coverage-31.json +1 -1
  21. package/coverage/.tmp/coverage-32.json +1 -1
  22. package/coverage/.tmp/coverage-33.json +1 -1
  23. package/coverage/.tmp/coverage-34.json +1 -1
  24. package/coverage/.tmp/coverage-35.json +1 -1
  25. package/coverage/.tmp/coverage-36.json +1 -1
  26. package/coverage/.tmp/coverage-37.json +1 -1
  27. package/coverage/.tmp/coverage-38.json +1 -1
  28. package/coverage/.tmp/coverage-39.json +1 -1
  29. package/coverage/.tmp/coverage-40.json +1 -1
  30. package/coverage/.tmp/coverage-41.json +1 -1
  31. package/coverage/.tmp/coverage-42.json +1 -1
  32. package/coverage/.tmp/coverage-5.json +1 -1
  33. package/coverage/.tmp/coverage-6.json +1 -1
  34. package/coverage/.tmp/coverage-7.json +1 -1
  35. package/coverage/.tmp/coverage-9.json +1 -1
  36. package/lib/cjs/components/PullRefresh/PullRefresh.js +40 -10
  37. package/lib/cjs/components/PullRefresh/PullRefresh.js.map +1 -1
  38. package/lib/cjs/components/Radio/Radio.js +3 -3
  39. package/lib/cjs/components/Radio/Radio.js.map +1 -1
  40. package/lib/cjs/components/Radio/styles.js +7 -5
  41. package/lib/cjs/components/Radio/styles.js.map +1 -1
  42. package/lib/cjs/components/Sheets/AnimatedSheets.js +2 -2
  43. package/lib/cjs/components/Sheets/AnimatedSheets.js.map +1 -1
  44. package/lib/cjs/components/Slider/Slider.js +34 -74
  45. package/lib/cjs/components/Slider/Slider.js.map +1 -1
  46. package/lib/cjs/components/TextView/TextView.js +3 -6
  47. package/lib/cjs/components/TextView/TextView.js.map +1 -1
  48. package/lib/esm/components/PullRefresh/PullRefresh.js +40 -10
  49. package/lib/esm/components/PullRefresh/PullRefresh.js.map +1 -1
  50. package/lib/esm/components/Radio/Radio.js +3 -3
  51. package/lib/esm/components/Radio/Radio.js.map +1 -1
  52. package/lib/esm/components/Radio/styles.js +7 -5
  53. package/lib/esm/components/Radio/styles.js.map +1 -1
  54. package/lib/esm/components/Sheets/AnimatedSheets.js +2 -2
  55. package/lib/esm/components/Sheets/AnimatedSheets.js.map +1 -1
  56. package/lib/esm/components/Slider/Slider.js +36 -76
  57. package/lib/esm/components/Slider/Slider.js.map +1 -1
  58. package/lib/esm/components/TextView/TextView.js +3 -6
  59. package/lib/esm/components/TextView/TextView.js.map +1 -1
  60. package/lib/src/components/Slider/Slider.d.ts +1 -1
  61. package/lib/types/components/Slider/Slider.d.ts +1 -1
  62. package/package.json +2 -2
  63. package/src/components/PullRefresh/PullRefresh.tsx +69 -33
  64. package/src/components/Radio/Radio.tsx +3 -3
  65. package/src/components/Radio/styles.ts +5 -3
  66. package/src/components/Sheets/AnimatedSheets.tsx +112 -116
  67. package/src/components/Slider/Slider.tsx +37 -103
  68. package/src/components/Slider/demo/index.tsx +0 -18
  69. package/src/components/TextView/TextView.tsx +3 -6
  70. package/src/components/TextView/demo/index.tsx +1 -1
  71. package/src/i18n/@types/resources.d.ts +27 -27
  72. package/src/i18n/index.json +31 -31
@@ -15,17 +15,10 @@ import { RedsSlider, SliderDefaultProps } from "./interface/index";
15
15
  import styles from "./styles";
16
16
  import useMounted from "../../pvCount/useUnmountedProcess";
17
17
 
18
- const Slider = ({
19
- defaultValue,
20
- min = 0,
21
- max = 100,
22
- initalValue = 0,
23
- onValueChange,
24
- dotStyle = {},
25
- step = 1,
26
- }: RedsSlider) => {
18
+ const Slider = ({ defaultValue, min = 0, max = 100, initalValue = 0, onValueChange, dotStyle = {} }: RedsSlider) => {
27
19
  useMounted("Slider");
28
- const [sliderWidth, setSliderWidth] = useState(Dimensions.get("window").width);
20
+ const [panResponder, setPanResponder] = useState(PanResponder.create({}));
21
+ const [sliderWidth, setSliderWidth] = useState(Dimensions.get("window").width * 0.8);
29
22
  const [value, setValue] = useState(initalValue);
30
23
 
31
24
  if (max < min) {
@@ -35,109 +28,51 @@ const Slider = ({
35
28
  return;
36
29
  }
37
30
 
38
- // 添加一个函数来计算最接近的step值
39
- const getSteppedValue = useCallback(
40
- (rawValue: number) => {
41
- const steppedValue = Math.round((rawValue - min) / step) * step + min;
42
- return Math.max(min, Math.min(max, steppedValue));
43
- },
44
- [min, max, step],
45
- );
46
-
31
+ const thumbPosition = (value / (max - min)) * sliderWidth;
32
+ const step = 1;
47
33
  const animatedValue = useRef(new Animated.Value((initalValue * sliderWidth) / (max - min))).current;
48
-
49
- const animatedThumbValue = useRef(
50
- new Animated.Value(
51
- (initalValue * sliderWidth) / (max - min) > 0
52
- ? (initalValue * sliderWidth) / (max - min) - 8
53
- : (initalValue * sliderWidth) / (max - min),
54
- ),
55
- ).current;
56
-
57
34
  useEffect(() => {
58
35
  const handleOrientationChange = () => {
59
- setSliderWidth(Dimensions.get("window").width);
36
+ setSliderWidth(Dimensions.get("window").width * 0.8);
60
37
  };
61
38
 
62
39
  const subscription = Dimensions.addEventListener("change", handleOrientationChange);
40
+ createPanResponder();
63
41
  return () => {
64
42
  subscription.remove();
43
+ //Dimensions.removeEventListener("change", handleOrientationChange);
65
44
  };
66
45
  }, []);
67
46
 
68
47
  // 可以根据需要调整的滑块高度
69
- const hanleValueUpdate = useCallback(
70
- (gestureState: PanResponderGestureState) => {
71
- // 计算原始值
72
- const rawValue = Math.max(min, Math.min(max, (gestureState.dx / sliderWidth) * (max - min) + initalValue));
73
- // 根据step计算实际值
74
- const steppedValue = getSteppedValue(rawValue);
75
-
76
- setValue(steppedValue);
77
- animatedValue.setValue((steppedValue * sliderWidth) / (max - min));
78
- animatedThumbValue.setValue(
79
- (steppedValue * sliderWidth) / (max - min) > 0
80
- ? (steppedValue * sliderWidth) / (max - min) - 8
81
- : (steppedValue * sliderWidth) / (max - min),
82
- );
83
-
84
- if (onValueChange) {
85
- onValueChange(steppedValue);
86
- }
87
- },
88
- [min, max, sliderWidth, initalValue, step, getSteppedValue, onValueChange],
89
- );
90
-
91
- // 添加点击轨道跳转功能(可选)
92
- const handleTrackPress = useCallback(
93
- (event: GestureResponderEvent) => {
94
- const { locationX } = event.nativeEvent;
95
- const rawValue = (locationX / sliderWidth) * (max - min) + min;
96
- const steppedValue = getSteppedValue(rawValue);
97
-
98
- setValue(steppedValue);
99
-
100
- // 使用动画过渡到新位置
101
- Animated.timing(animatedValue, {
102
- toValue: (steppedValue * sliderWidth) / (max - min),
103
- duration: 200,
104
- useNativeDriver: false,
105
- }).start();
106
-
107
- Animated.timing(animatedThumbValue, {
108
- toValue:
109
- (steppedValue * sliderWidth) / (max - min) > 0
110
- ? (steppedValue * sliderWidth) / (max - min) - 8
111
- : (steppedValue * sliderWidth) / (max - min),
112
- duration: 200,
113
- useNativeDriver: false,
114
- }).start();
115
-
116
- if (onValueChange) {
117
- onValueChange(steppedValue);
118
- }
119
- },
120
- [sliderWidth, min, max, getSteppedValue, onValueChange, animatedValue, animatedThumbValue],
121
- );
48
+ const hanleValueUpdate = (gestureState: PanResponderGestureState) => {
49
+ const currentValue = Math.max(min, Math.min(max, (gestureState.dx / sliderWidth) * (max - min) + initalValue));
50
+
51
+ setValue(currentValue);
52
+ animatedValue.setValue((currentValue * sliderWidth) / (max - min));
53
+ if (onValueChange) {
54
+ onValueChange(currentValue);
55
+ }
56
+ };
122
57
 
123
58
  const handleLayout = (event: LayoutChangeEvent) => {
124
59
  setSliderWidth(event.nativeEvent.layout.width);
125
60
  };
126
61
 
127
- const panResponder = useMemo(
128
- () =>
62
+ const createPanResponder = () => {
63
+ setPanResponder(
129
64
  PanResponder.create({
130
65
  onStartShouldSetPanResponder: () => true,
131
66
  onMoveShouldSetPanResponder: () => true,
132
- onPanResponderGrant: () => true,
133
- onPanResponderRelease: () => true,
67
+ onPanResponderGrant: () => {},
68
+ onPanResponderRelease: () => {},
134
69
  onPanResponderTerminate: () => {},
135
70
  onPanResponderMove: (evt, gestureState) => {
136
71
  hanleValueUpdate(gestureState);
137
72
  },
138
73
  }),
139
- [hanleValueUpdate],
140
- );
74
+ );
75
+ };
141
76
 
142
77
  const styles = StyleSheet.create({
143
78
  sliderContainer: {
@@ -146,7 +81,7 @@ const Slider = ({
146
81
  justifyContent: "center",
147
82
  },
148
83
  trackContainer: {
149
- width: "100%",
84
+ width: "80%",
150
85
  height: 4,
151
86
  backgroundColor: "rgba(48, 48, 52, 0.20)",
152
87
  borderRadius: 2,
@@ -172,22 +107,21 @@ const Slider = ({
172
107
  },
173
108
  });
174
109
 
110
+ //<View style={[styles.track, { width: sliderWidth }]}>
111
+ //<View style={[styles.thumb, { left: thumbPosition }]} {...panResponder.panHandlers} />
112
+ //</View>
175
113
  return (
176
- <View style={styles.sliderContainer}>
177
- <View style={styles.trackContainer} onLayout={handleLayout}>
178
- {/* 添加可点击的轨道 */}
179
- <TouchableWithoutFeedback onPress={handleTrackPress}>
180
- <View style={{ position: "absolute", width: "100%", height: 4 }} />
181
- </TouchableWithoutFeedback>
182
-
183
- <Animated.View style={[styles.coloredTrack, { width: animatedValue }]} />
184
- <Animated.View
185
- style={[styles.thumbButton, { transform: [{ translateX: animatedThumbValue }] }, dotStyle]}
186
- {...panResponder.panHandlers}
187
- hitSlop={{ top: 20, bottom: 20, left: 20, right: 20 }}
188
- />
114
+ <TouchableWithoutFeedback onPress={(e) => {}}>
115
+ <View style={styles.sliderContainer} onLayout={handleLayout}>
116
+ <View style={styles.trackContainer}>
117
+ <Animated.View style={[styles.coloredTrack, { width: animatedValue }]} />
118
+ <Animated.View
119
+ style={[styles.thumbButton, { transform: [{ translateX: animatedValue }] }, dotStyle]}
120
+ {...panResponder.panHandlers}
121
+ />
122
+ </View>
189
123
  </View>
190
- </View>
124
+ </TouchableWithoutFeedback>
191
125
  );
192
126
  };
193
127
 
@@ -8,7 +8,6 @@ const styles = StyleSheet.create({
8
8
  justifyContent: "center",
9
9
  paddingTop: 100,
10
10
  paddingBottom: 100,
11
- paddingHorizontal: 50,
12
11
  },
13
12
  scrollView: {
14
13
  backgroundColor: "pink",
@@ -45,23 +44,6 @@ export default function App() {
45
44
  <Br />
46
45
  <Slider min={200} max={100}></Slider>
47
46
  <Br />
48
- <Desc>step使用示例</Desc>
49
- <Slider
50
- min={0}
51
- max={100}
52
- step={10} // 每次移动10个单位
53
- initalValue={0}
54
- onValueChange={(value: any) => console.log("Current value:", value)}
55
- />
56
- <Br />
57
- <Desc>step使用示例(或者更小的步长)</Desc>
58
- <Slider
59
- min={0}
60
- max={1}
61
- step={0.1} // 每次移动0.1个单位
62
- initalValue={0.5}
63
- onValueChange={(value: any) => console.log("Current value:", value)}
64
- />
65
47
  </View>
66
48
  );
67
49
  }
@@ -68,8 +68,7 @@ const TextField = forwardRef((props: RedsTextView, ref) => {
68
68
 
69
69
  const handleChangeText = useCallback(
70
70
  (value: string) => {
71
- const filteredValue = props.returnKeyType !== "next" ? value.replace(/\n/g, "") : value;
72
- updateValue(filteredValue);
71
+ updateValue(value);
73
72
  // Only apply cursor fix on iOS when text equals maxLength (indicating truncation)
74
73
  if (Platform.OS === "ios" && maxLength && value.length >= maxLength && inputRef.current) {
75
74
  // Use requestAnimationFrame instead of setTimeout
@@ -135,10 +134,8 @@ const TextField = forwardRef((props: RedsTextView, ref) => {
135
134
  }, [layout]);
136
135
 
137
136
  const handleKeyPress = ({ nativeEvent }: any) => {
138
- if (nativeEvent.key === "Enter") {
139
- if (props.returnKeyType !== "next") {
140
- Keyboard.dismiss();
141
- }
137
+ if (nativeEvent.key === "Enter" && props.returnKeyType !== "next") {
138
+ Keyboard.dismiss();
142
139
  }
143
140
  };
144
141
 
@@ -26,7 +26,7 @@ export default function App() {
26
26
  clearable
27
27
  actionLayout={"horizontal"}
28
28
  autofocus={true}
29
- returnKeyType={"done"}
29
+ returnKeyType={"search"}
30
30
  />
31
31
  <Desc>最大长度</Desc>
32
32
  <TextView modelValue={modelValue} maxLength={100} showCount placeholder="占位符" />
@@ -1,32 +1,32 @@
1
1
  interface Resources {
2
2
  componentKey: {
3
- sureKey: "確定";
4
- satisfyKey: "滿意";
5
- confirmKey: "確認";
6
- uploadingKey: "上傳中";
7
- resetKey: "重置";
8
- NoDataKey: "暫無數據";
9
- liveStreamingKey: "直播";
10
- generallyKey: "一般";
11
- uploadFailedKey: "上傳失敗";
12
- submitKey: "提交";
13
- requestSuccessfulKey: "請求成功";
14
- cancelKey: "取消";
15
- PullDownToRefreshKey: "下拉重繪";
16
- selectAllKey: "全選";
17
- requestDataKey: "請求數據中";
18
- closeKey: "收起";
19
- veryBadKey: "極差";
20
- searchKey: "蒐索";
21
- expandKey: "展開";
22
- IDCardPhotoKey: "身份證人像面";
23
- finishKey: "完成";
24
- surpriseKey: "驚喜";
25
- releaseRefreshKey: "鬆開重繪";
26
- nationalEmblemSideOfIDCardKey: "身份证国徽面";
27
- buttonKey: "按鈕";
28
- jumpKey: "跳轉";
29
- disappointmentKey: "失望";
3
+ sureKey: "Confirm";
4
+ satisfyKey: "Satisfy";
5
+ confirmKey: "Confirm";
6
+ uploadingKey: "Uploading";
7
+ resetKey: "Reset";
8
+ NoDataKey: "No data available at the moment";
9
+ liveStreamingKey: "live";
10
+ generallyKey: "Generally";
11
+ uploadFailedKey: "Upload failed";
12
+ submitKey: "Submit";
13
+ requestSuccessfulKey: "Request successful";
14
+ cancelKey: "Cancel";
15
+ PullDownToRefreshKey: "Pull down to refresh";
16
+ selectAllKey: "SelectAll";
17
+ requestDataKey: "Request data";
18
+ closeKey: "Close";
19
+ veryBadKey: "Very bad";
20
+ searchKey: "Search";
21
+ expandKey: "Expand";
22
+ IDCardPhotoKey: "ID card photo";
23
+ finishKey: "Finish";
24
+ surpriseKey: "Surprise";
25
+ releaseRefreshKey: "Release refresh";
26
+ nationalEmblemSideOfIDCardKey: "National emblem side of ID card";
27
+ buttonKey: "Button";
28
+ jumpKey: "Jump";
29
+ disappointmentKey: "Disappointment";
30
30
  };
31
31
  }
32
32
  export default Resources;
@@ -1,35 +1,4 @@
1
1
  {
2
- "zh_tw": {
3
- "componentKey": {
4
- "sureKey": "確定",
5
- "satisfyKey": "滿意",
6
- "confirmKey": "確認",
7
- "uploadingKey": "上傳中",
8
- "resetKey": "重置",
9
- "NoDataKey": "暫無數據",
10
- "liveStreamingKey": "直播",
11
- "generallyKey": "一般",
12
- "uploadFailedKey": "上傳失敗",
13
- "submitKey": "提交",
14
- "requestSuccessfulKey": "請求成功",
15
- "cancelKey": "取消",
16
- "PullDownToRefreshKey": "下拉重繪",
17
- "selectAllKey": "全選",
18
- "requestDataKey": "請求數據中",
19
- "closeKey": "收起",
20
- "veryBadKey": "極差",
21
- "searchKey": "蒐索",
22
- "expandKey": "展開",
23
- "IDCardPhotoKey": "身份證人像面",
24
- "finishKey": "完成",
25
- "surpriseKey": "驚喜",
26
- "releaseRefreshKey": "鬆開重繪",
27
- "nationalEmblemSideOfIDCardKey": "身份证国徽面",
28
- "buttonKey": "按鈕",
29
- "jumpKey": "跳轉",
30
- "disappointmentKey": "失望"
31
- }
32
- },
33
2
  "en_us": {
34
3
  "componentKey": {
35
4
  "sureKey": "Confirm",
@@ -91,5 +60,36 @@
91
60
  "jumpKey": "跳转",
92
61
  "disappointmentKey": "失望"
93
62
  }
63
+ },
64
+ "zh_tw": {
65
+ "componentKey": {
66
+ "sureKey": "確定",
67
+ "satisfyKey": "滿意",
68
+ "confirmKey": "確認",
69
+ "uploadingKey": "上傳中",
70
+ "resetKey": "重置",
71
+ "NoDataKey": "暫無數據",
72
+ "liveStreamingKey": "直播",
73
+ "generallyKey": "一般",
74
+ "uploadFailedKey": "上傳失敗",
75
+ "submitKey": "提交",
76
+ "requestSuccessfulKey": "請求成功",
77
+ "cancelKey": "取消",
78
+ "PullDownToRefreshKey": "下拉重繪",
79
+ "selectAllKey": "全選",
80
+ "requestDataKey": "請求數據中",
81
+ "closeKey": "收起",
82
+ "veryBadKey": "極差",
83
+ "searchKey": "蒐索",
84
+ "expandKey": "展開",
85
+ "IDCardPhotoKey": "身份證人像面",
86
+ "finishKey": "完成",
87
+ "surpriseKey": "驚喜",
88
+ "releaseRefreshKey": "鬆開重繪",
89
+ "nationalEmblemSideOfIDCardKey": "身份证国徽面",
90
+ "buttonKey": "按鈕",
91
+ "jumpKey": "跳轉",
92
+ "disappointmentKey": "失望"
93
+ }
94
94
  }
95
95
  }