@xhsreds/reds-rn-next 0.9.1-test.1 → 0.10.1-beta202511041913
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.
- package/coverage/.tmp/coverage-0.json +1 -1
- package/coverage/.tmp/coverage-1.json +1 -1
- package/coverage/.tmp/coverage-10.json +1 -1
- package/coverage/.tmp/coverage-11.json +1 -1
- package/coverage/.tmp/coverage-12.json +1 -1
- package/coverage/.tmp/coverage-13.json +1 -1
- package/coverage/.tmp/coverage-14.json +1 -1
- package/coverage/.tmp/coverage-15.json +1 -1
- package/coverage/.tmp/coverage-16.json +1 -1
- package/coverage/.tmp/coverage-17.json +1 -1
- package/coverage/.tmp/coverage-18.json +1 -1
- package/coverage/.tmp/coverage-19.json +1 -1
- package/coverage/.tmp/coverage-2.json +1 -1
- package/coverage/.tmp/coverage-20.json +1 -1
- package/coverage/.tmp/coverage-21.json +1 -1
- package/coverage/.tmp/coverage-22.json +1 -1
- package/coverage/.tmp/coverage-23.json +1 -1
- package/coverage/.tmp/coverage-24.json +1 -1
- package/coverage/.tmp/coverage-25.json +1 -1
- package/coverage/.tmp/coverage-26.json +1 -1
- package/coverage/.tmp/coverage-27.json +1 -1
- package/coverage/.tmp/coverage-33.json +1 -1
- package/coverage/.tmp/coverage-35.json +1 -1
- package/coverage/.tmp/coverage-37.json +1 -1
- package/coverage/.tmp/coverage-38.json +1 -1
- package/coverage/.tmp/coverage-39.json +1 -1
- package/coverage/.tmp/coverage-4.json +1 -1
- package/coverage/.tmp/coverage-41.json +1 -1
- package/coverage/.tmp/coverage-5.json +1 -1
- package/coverage/.tmp/coverage-6.json +1 -1
- package/coverage/.tmp/coverage-7.json +1 -1
- package/coverage/.tmp/coverage-8.json +1 -1
- package/coverage/.tmp/coverage-9.json +1 -1
- package/lib/cjs/_chunks/CwkpVXDI.js.map +1 -1
- package/lib/cjs/_chunks/{CIr5S84J.js → DUU5wf2f.js} +4 -2
- package/lib/cjs/_chunks/DUU5wf2f.js.map +1 -0
- package/lib/cjs/components/Carousel/Carousel.js +9 -2
- package/lib/cjs/components/Carousel/Carousel.js.map +1 -1
- package/lib/cjs/components/Image/Image.js +29 -92
- package/lib/cjs/components/Image/Image.js.map +1 -1
- package/lib/cjs/components/Image/VisibilitySensor.js +1 -1
- package/lib/cjs/components/Image/VisibilitySensor.js.map +1 -1
- package/lib/cjs/components/Image/index.js +4 -3
- package/lib/cjs/components/Image/index.js.map +1 -1
- package/lib/cjs/components/Image/queryCacheBatcher.js +96 -0
- package/lib/cjs/components/Image/queryCacheBatcher.js.map +1 -0
- package/lib/cjs/components/Popover/Popover.js +4 -3
- package/lib/cjs/components/Popover/Popover.js.map +1 -1
- package/lib/cjs/components/PullRefresh/PullRefresh.js +104 -40
- package/lib/cjs/components/PullRefresh/PullRefresh.js.map +1 -1
- package/lib/cjs/components/PullRefresh/component.js +1 -1
- package/lib/cjs/components/PullRefresh/index.js +1 -1
- package/lib/cjs/components/PullRefresh/interface/index.js +1 -1
- package/lib/cjs/components/Radio/Radio.js +6 -5
- package/lib/cjs/components/Radio/Radio.js.map +1 -1
- package/lib/cjs/components/Radio/index.js +3 -2
- package/lib/cjs/components/Radio/index.js.map +1 -1
- package/lib/cjs/components/Radio/styles.js +4 -4
- package/lib/cjs/components/Radio/styles.js.map +1 -1
- package/lib/cjs/components/Sheets/styles.js +2 -2
- package/lib/cjs/components/Sheets/styles.js.map +1 -1
- package/lib/cjs/components/StatusBar/hook/getStatusHeight.js +14 -1
- package/lib/cjs/components/StatusBar/hook/getStatusHeight.js.map +1 -1
- package/lib/cjs/index.js +3 -2
- package/lib/cjs/index.js.map +1 -1
- package/lib/cjs/pvCount/pvData.js +1 -1
- package/lib/esm/_chunks/Da9cW8JG.js.map +1 -1
- package/lib/esm/_chunks/{CZtagXcj.js → gC9g4Fr_.js} +4 -2
- package/lib/esm/_chunks/gC9g4Fr_.js.map +1 -0
- package/lib/esm/components/Carousel/Carousel.js +9 -2
- package/lib/esm/components/Carousel/Carousel.js.map +1 -1
- package/lib/esm/components/Image/Image.js +31 -94
- package/lib/esm/components/Image/Image.js.map +1 -1
- package/lib/esm/components/Image/VisibilitySensor.js +1 -1
- package/lib/esm/components/Image/VisibilitySensor.js.map +1 -1
- package/lib/esm/components/Image/index.js +4 -3
- package/lib/esm/components/Image/index.js.map +1 -1
- package/lib/esm/components/Image/queryCacheBatcher.js +92 -0
- package/lib/esm/components/Image/queryCacheBatcher.js.map +1 -0
- package/lib/esm/components/Popover/Popover.js +4 -3
- package/lib/esm/components/Popover/Popover.js.map +1 -1
- package/lib/esm/components/PullRefresh/PullRefresh.js +105 -41
- package/lib/esm/components/PullRefresh/PullRefresh.js.map +1 -1
- package/lib/esm/components/PullRefresh/component.js +1 -1
- package/lib/esm/components/PullRefresh/index.js +1 -1
- package/lib/esm/components/PullRefresh/interface/index.js +1 -1
- package/lib/esm/components/Radio/Radio.js +6 -5
- package/lib/esm/components/Radio/Radio.js.map +1 -1
- package/lib/esm/components/Radio/index.js +3 -2
- package/lib/esm/components/Radio/index.js.map +1 -1
- package/lib/esm/components/Radio/styles.js +4 -4
- package/lib/esm/components/Radio/styles.js.map +1 -1
- package/lib/esm/components/Sheets/styles.js +2 -2
- package/lib/esm/components/Sheets/styles.js.map +1 -1
- package/lib/esm/components/StatusBar/hook/getStatusHeight.js +14 -2
- package/lib/esm/components/StatusBar/hook/getStatusHeight.js.map +1 -1
- package/lib/esm/index.js +3 -2
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/pvCount/pvData.js +1 -1
- package/lib/src/components/Image/queryCacheBatcher.d.ts +5 -0
- package/lib/src/components/Popover/Popover.d.ts +1 -1
- package/lib/src/components/Popover/interface/index.d.ts +1 -0
- package/lib/src/components/PullRefresh/PullRefresh.d.ts +2 -0
- package/lib/src/components/PullRefresh/interface/index.d.ts +5 -0
- package/lib/src/components/StatusBar/hook/getStatusHeight.d.ts +1 -0
- package/lib/types/components/Image/queryCacheBatcher.d.ts +5 -0
- package/lib/types/components/Popover/Popover.d.ts +1 -1
- package/lib/types/components/Popover/interface/index.d.ts +1 -0
- package/lib/types/components/PullRefresh/PullRefresh.d.ts +2 -0
- package/lib/types/components/PullRefresh/interface/index.d.ts +5 -0
- package/lib/types/components/StatusBar/hook/getStatusHeight.d.ts +1 -0
- package/package.json +2 -2
- package/src/components/Carousel/Carousel.tsx +15 -3
- package/src/components/Carousel/demo/index.tsx +14 -2
- package/src/components/Image/Image.tsx +53 -115
- package/src/components/Image/VisibilitySensor.tsx +1 -2
- package/src/components/Image/queryCacheBatcher.ts +84 -0
- package/src/components/Popover/Popover.tsx +4 -3
- package/src/components/Popover/doc/index.mdx +22 -21
- package/src/components/Popover/interface/index.ts +1 -0
- package/src/components/PullRefresh/PullRefresh.tsx +146 -55
- package/src/components/PullRefresh/doc/index.mdx +19 -16
- package/src/components/PullRefresh/interface/index.ts +6 -0
- package/src/components/Radio/Radio.tsx +3 -3
- package/src/components/Radio/styles.ts +3 -3
- package/src/components/Sheets/styles.ts +2 -2
- package/src/components/StatusBar/hook/getStatusHeight.ts +20 -1
- package/src/index.ts +0 -1
- package/CHANGELOG.md +0 -13
- package/lib/cjs/_chunks/CIr5S84J.js.map +0 -1
- package/lib/esm/_chunks/CZtagXcj.js.map +0 -1
|
@@ -1,7 +1,18 @@
|
|
|
1
1
|
import React, { useState, useRef, useMemo, useEffect } from "react";
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
View,
|
|
4
|
+
StyleSheet,
|
|
5
|
+
Animated,
|
|
6
|
+
PanResponder,
|
|
7
|
+
Easing,
|
|
8
|
+
LayoutChangeEvent,
|
|
9
|
+
Platform,
|
|
10
|
+
RefreshControl as RNRefreshControl,
|
|
11
|
+
} from "react-native";
|
|
3
12
|
import { RedsPullRefresh, PullRefreshDefaultProps, PullState } from "./interface/index";
|
|
4
13
|
import RefreshControl from "./component";
|
|
14
|
+
// alias to avoid confusion when reading diff
|
|
15
|
+
const CustomRefreshControl = RefreshControl;
|
|
5
16
|
import useMounted from "../../pvCount/useUnmountedProcess";
|
|
6
17
|
export default function PullRefresh(props: RedsPullRefresh) {
|
|
7
18
|
useMounted("PullRefresh");
|
|
@@ -23,6 +34,11 @@ export default function PullRefresh(props: RedsPullRefresh) {
|
|
|
23
34
|
// 是否在刷新中
|
|
24
35
|
const [isRefreshing, setIsRefreshing] = useState<boolean>(false);
|
|
25
36
|
|
|
37
|
+
// 内部刷新状态(用于默认启用,特别是 Android 或未提供回调时)
|
|
38
|
+
const [internalRefreshing, setInternalRefreshing] = useState<boolean>(false);
|
|
39
|
+
// Android 自动结束计时器
|
|
40
|
+
const androidAutoEndRef = useRef<any>();
|
|
41
|
+
|
|
26
42
|
// 组合动画
|
|
27
43
|
const [animation, setAnimation] = useState<Animated.CompositeAnimation>();
|
|
28
44
|
|
|
@@ -76,6 +92,14 @@ export default function PullRefresh(props: RedsPullRefresh) {
|
|
|
76
92
|
performInitRefresh();
|
|
77
93
|
}
|
|
78
94
|
}, [props.initRefresh, pullAnimHeight, hasInitRefreshed, isRefreshing, props.refresh]);
|
|
95
|
+
// 卸载清理:超时计时器
|
|
96
|
+
useEffect(() => {
|
|
97
|
+
return () => {
|
|
98
|
+
// @ts-ignore
|
|
99
|
+
if (pullTimeout) clearTimeout(pullTimeout);
|
|
100
|
+
if (androidAutoEndRef.current) clearTimeout(androidAutoEndRef.current);
|
|
101
|
+
};
|
|
102
|
+
}, [pullTimeout]);
|
|
79
103
|
|
|
80
104
|
// 释放手指
|
|
81
105
|
const onRelease = () => {
|
|
@@ -87,7 +111,17 @@ export default function PullRefresh(props: RedsPullRefresh) {
|
|
|
87
111
|
if (panValue >= pullAnimHeight) {
|
|
88
112
|
animatedTo(pullAnimHeight, () => {
|
|
89
113
|
updatePullState(PullState.LOADING);
|
|
90
|
-
|
|
114
|
+
// 如果有回调则调用,否则走默认内部流程(iOS 默认也支持)
|
|
115
|
+
if (props.onRequest) {
|
|
116
|
+
props.onRequest();
|
|
117
|
+
} else {
|
|
118
|
+
setInternalRefreshing(true);
|
|
119
|
+
// 启动一个自动结束计时器,避免没有外部状态时卡住
|
|
120
|
+
if (androidAutoEndRef.current) clearTimeout(androidAutoEndRef.current);
|
|
121
|
+
androidAutoEndRef.current = setTimeout(() => {
|
|
122
|
+
setInternalRefreshing(false);
|
|
123
|
+
}, props?.msHoldingTime ?? 1000);
|
|
124
|
+
}
|
|
91
125
|
});
|
|
92
126
|
// 有拉动距离但是不够设定的下拉高度
|
|
93
127
|
} else if (panValue > 0) {
|
|
@@ -173,6 +207,14 @@ export default function PullRefresh(props: RedsPullRefresh) {
|
|
|
173
207
|
|
|
174
208
|
// 手势对象
|
|
175
209
|
const panResponder = useMemo(() => {
|
|
210
|
+
if (Platform.OS !== "ios" && props.nativeAndroidPullRefresh) {
|
|
211
|
+
// Android 原生下拉时不启用自定义手势
|
|
212
|
+
return PanResponder.create({
|
|
213
|
+
onStartShouldSetPanResponder: () => false,
|
|
214
|
+
onMoveShouldSetPanResponder: () => false,
|
|
215
|
+
onPanResponderTerminationRequest: () => true,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
176
218
|
return PanResponder.create({
|
|
177
219
|
onStartShouldSetPanResponder: canMove,
|
|
178
220
|
onStartShouldSetPanResponderCapture: canMove,
|
|
@@ -209,22 +251,24 @@ export default function PullRefresh(props: RedsPullRefresh) {
|
|
|
209
251
|
return true;
|
|
210
252
|
},
|
|
211
253
|
});
|
|
212
|
-
}, [isPulling, scrollY, props.initRefresh, hasInitRefreshed, pullAnimHeight]);
|
|
254
|
+
}, [isPulling, scrollY, props.initRefresh, hasInitRefreshed, pullAnimHeight, props.nativeAndroidPullRefresh]);
|
|
213
255
|
|
|
214
|
-
//
|
|
256
|
+
// 根据外层传递参数变化进行更新执行(自定义实现启用时)
|
|
215
257
|
useEffect(() => {
|
|
258
|
+
if (Platform.OS !== "ios" && props.nativeAndroidPullRefresh) return;
|
|
216
259
|
if (pullState === PullState.PULLING && !props.initRefresh) {
|
|
217
260
|
return;
|
|
218
261
|
}
|
|
219
262
|
// 加载中
|
|
220
|
-
|
|
263
|
+
const effectiveRefreshing = !!props.isRefreshing || internalRefreshing;
|
|
264
|
+
if (effectiveRefreshing === true && !isRefreshing) {
|
|
221
265
|
animatedTo(pullAnimHeight);
|
|
222
266
|
setIsRefreshing(true);
|
|
223
267
|
updatePullState(PullState.LOADING);
|
|
224
268
|
}
|
|
225
269
|
|
|
226
270
|
// 外层加载结束 需要重置位置
|
|
227
|
-
if (
|
|
271
|
+
if (effectiveRefreshing === false && isRefreshing) {
|
|
228
272
|
setIsPulling(false);
|
|
229
273
|
updatePullState(PullState.HOLDING);
|
|
230
274
|
setPullTimeout(
|
|
@@ -240,7 +284,7 @@ export default function PullRefresh(props: RedsPullRefresh) {
|
|
|
240
284
|
|
|
241
285
|
setIsRefreshing(false);
|
|
242
286
|
}
|
|
243
|
-
}, [isRefreshing, props.msHoldingTime, props.isRefreshing, pullState]);
|
|
287
|
+
}, [isRefreshing, props.msHoldingTime, props.isRefreshing, pullState, internalRefreshing]);
|
|
244
288
|
|
|
245
289
|
// RefreshControl组件初始化计算
|
|
246
290
|
const onLayout = (evt: LayoutChangeEvent) => {
|
|
@@ -250,43 +294,84 @@ export default function PullRefresh(props: RedsPullRefresh) {
|
|
|
250
294
|
setTop(-height);
|
|
251
295
|
};
|
|
252
296
|
|
|
253
|
-
// 重写ScrollView的onScroll
|
|
297
|
+
// 重写ScrollView的onScroll事件(自定义:用于手势门控/头部位置; Android 原生:注入 RefreshControl)
|
|
254
298
|
const scrollContent = useMemo(() => {
|
|
255
299
|
return React.Children.map(props.children, (child: any) =>
|
|
256
300
|
React.cloneElement(child, {
|
|
257
301
|
// 设置滚动响应频率
|
|
258
302
|
scrollEventThrottle: 1,
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
303
|
+
...(Platform.OS === "android" && props.nativeAndroidPullRefresh
|
|
304
|
+
? {
|
|
305
|
+
refreshControl: (
|
|
306
|
+
<RNRefreshControl
|
|
307
|
+
{...(props.androidRefreshProps || {})}
|
|
308
|
+
colors={((props.androidRefreshProps as any)?.colors ?? props.androidColors) as any}
|
|
309
|
+
refreshing={!!props.isRefreshing || internalRefreshing}
|
|
310
|
+
onRefresh={() => {
|
|
311
|
+
if (!!props.isRefreshing || internalRefreshing) return;
|
|
312
|
+
try {
|
|
313
|
+
props.onRequest && props.onRequest();
|
|
314
|
+
} finally {
|
|
315
|
+
// 默认启用:无回调或未受控时自动结束
|
|
316
|
+
if (!props.onRequest) {
|
|
317
|
+
setInternalRefreshing(true);
|
|
318
|
+
}
|
|
319
|
+
// 无论是否有回调,都启动一个兜底自动结束(避免卡住)
|
|
320
|
+
if (androidAutoEndRef.current) clearTimeout(androidAutoEndRef.current);
|
|
321
|
+
androidAutoEndRef.current = setTimeout(() => {
|
|
322
|
+
setInternalRefreshing(false);
|
|
323
|
+
}, props?.msHoldingTime ?? 1000);
|
|
324
|
+
}
|
|
325
|
+
}}
|
|
326
|
+
/>
|
|
327
|
+
),
|
|
328
|
+
onScroll: (evt: any) => {
|
|
329
|
+
if (child.props.onScroll && typeof child.props.onScroll === "function") {
|
|
330
|
+
child.props.onScroll(evt);
|
|
331
|
+
}
|
|
332
|
+
},
|
|
333
|
+
}
|
|
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
|
+
}),
|
|
283
358
|
}),
|
|
284
359
|
);
|
|
285
|
-
}, [
|
|
286
|
-
|
|
287
|
-
|
|
360
|
+
}, [
|
|
361
|
+
pullState,
|
|
362
|
+
props.children,
|
|
363
|
+
pullAnimHeight,
|
|
364
|
+
internalRefreshing,
|
|
365
|
+
props.isRefreshing,
|
|
366
|
+
props.nativeAndroidPullRefresh,
|
|
367
|
+
]);
|
|
368
|
+
|
|
369
|
+
// 增加Animated.View控制ScrollView展示位置(自定义)
|
|
288
370
|
const content = useMemo(() => {
|
|
289
|
-
|
|
371
|
+
if (Platform.OS === "android" && props.nativeAndroidPullRefresh) {
|
|
372
|
+
// Android 直接返回内容(由 RN RefreshControl 控制)
|
|
373
|
+
return <>{scrollContent}</>;
|
|
374
|
+
}
|
|
290
375
|
return (
|
|
291
376
|
<Animated.View
|
|
292
377
|
// @ts-ignore
|
|
@@ -299,27 +384,33 @@ export default function PullRefresh(props: RedsPullRefresh) {
|
|
|
299
384
|
{scrollContent}
|
|
300
385
|
</Animated.View>
|
|
301
386
|
);
|
|
302
|
-
}, [pan, scrollContent]);
|
|
387
|
+
}, [pan, scrollContent, props.nativeAndroidPullRefresh]);
|
|
303
388
|
|
|
304
389
|
return (
|
|
305
|
-
<View
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
390
|
+
<View
|
|
391
|
+
style={[styles.container, props.style]}
|
|
392
|
+
{...(Platform.OS === "ios" || !props.nativeAndroidPullRefresh ? panResponder.panHandlers : {})}
|
|
393
|
+
testID="refresh-container"
|
|
394
|
+
>
|
|
395
|
+
{Platform.OS === "ios" || !props.nativeAndroidPullRefresh ? (
|
|
396
|
+
<Animated.View
|
|
397
|
+
// @ts-ignore
|
|
398
|
+
ref={animatedViewRef}
|
|
399
|
+
onLayout={onLayout}
|
|
400
|
+
style={[
|
|
401
|
+
styles.freshItem,
|
|
402
|
+
{
|
|
403
|
+
top: top,
|
|
404
|
+
height: props.pullAnimHeight,
|
|
405
|
+
transform: [{ translateY: pan }],
|
|
406
|
+
},
|
|
407
|
+
props.controlStyle,
|
|
408
|
+
]}
|
|
409
|
+
>
|
|
410
|
+
{/* @ts-ignore */}
|
|
411
|
+
<CustomRefreshControl ref={refreshControlRef} {...props} movePercent={movePercent} />
|
|
412
|
+
</Animated.View>
|
|
413
|
+
) : null}
|
|
323
414
|
{content}
|
|
324
415
|
</View>
|
|
325
416
|
);
|
|
@@ -10,22 +10,25 @@ import BaseDemo from "!!raw-loader!../demo/index.tsx";
|
|
|
10
10
|
|
|
11
11
|
### Props
|
|
12
12
|
|
|
13
|
-
| 属性
|
|
14
|
-
|
|
|
15
|
-
| children
|
|
16
|
-
| pullAnimHeight
|
|
17
|
-
| minPullDistance
|
|
18
|
-
| msHoldingTime
|
|
19
|
-
| isRefreshing
|
|
20
|
-
| pullDownToRefreshText
|
|
21
|
-
| releaseRefreshText
|
|
22
|
-
| requestDataText
|
|
23
|
-
| requestSuccessfulText
|
|
24
|
-
| style
|
|
25
|
-
| controlStyle
|
|
26
|
-
| showText
|
|
27
|
-
| initRefresh
|
|
28
|
-
| refresh
|
|
13
|
+
| 属性 | 描述 | 类型 | 默认值 |
|
|
14
|
+
| ------------------------ | ------------------------------------------------------------------------------------------------------- | --------------- | --------- |
|
|
15
|
+
| children | 下拉刷新容器的内容 | React.ReactNode | undefined |
|
|
16
|
+
| pullAnimHeight | 下拉刷新组件高度 | number | 0 |
|
|
17
|
+
| minPullDistance | 触发下拉刷新的最小距离 | number | 20 |
|
|
18
|
+
| msHoldingTime | 下拉完成后的停留时间 | number | 1000 |
|
|
19
|
+
| isRefreshing | 是否是加载数据中 | boolean | false |
|
|
20
|
+
| pullDownToRefreshText | 下拉刷新文案 | string | |
|
|
21
|
+
| releaseRefreshText | 松开刷新文案 | string | |
|
|
22
|
+
| requestDataText | 请求数据中文案 | string | |
|
|
23
|
+
| requestSuccessfulText | 请求成功文案 | string | |
|
|
24
|
+
| style | 容器样式 | ViewStyle | |
|
|
25
|
+
| controlStyle | refreshControl样式 | ViewStyle | |
|
|
26
|
+
| showText | 是否展示文字 | boolean | true |
|
|
27
|
+
| initRefresh | 是否初始刷新 | boolean | false |
|
|
28
|
+
| refresh | 手动点击按钮控制刷新 | boolean | false |
|
|
29
|
+
| nativeAndroidPullRefresh | Android 使用原生 RefreshControl(仅 Android 生效) | boolean | false |
|
|
30
|
+
| androidRefreshProps | Android 原生 RefreshControl 配置(仅在开启原生下拉时生效),等同于 React Native RefreshControl 的 props | Object | `{}` |
|
|
31
|
+
| androidColors | Android 原生 RefreshControl 颜色(等同于 androidRefreshProps.colors) | string[] | |
|
|
29
32
|
|
|
30
33
|
### Events
|
|
31
34
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { RefreshControlProps } from "react-native";
|
|
1
2
|
import { ViewStyle } from "react-native";
|
|
2
3
|
export interface RedsPullRefresh {
|
|
3
4
|
children: React.ReactNode;
|
|
@@ -15,6 +16,9 @@ export interface RedsPullRefresh {
|
|
|
15
16
|
showText?: boolean;
|
|
16
17
|
initRefresh?: boolean;
|
|
17
18
|
refresh?: boolean;
|
|
19
|
+
nativeAndroidPullRefresh?: boolean;
|
|
20
|
+
androidRefreshProps?: Object;
|
|
21
|
+
androidColors?: string[];
|
|
18
22
|
}
|
|
19
23
|
|
|
20
24
|
export enum PullState {
|
|
@@ -35,4 +39,6 @@ export const PullRefreshDefaultProps = {
|
|
|
35
39
|
showText: true,
|
|
36
40
|
initRefresh: false,
|
|
37
41
|
refresh: false,
|
|
42
|
+
nativeAndroidPullRefresh: false,
|
|
43
|
+
androidRefreshProps: {},
|
|
38
44
|
};
|
|
@@ -64,9 +64,9 @@ const Radio = (props: RedsRadio) => {
|
|
|
64
64
|
const labelStyle = getLabelStyle(disabled || parent?.disabled, size, parent?.direction);
|
|
65
65
|
|
|
66
66
|
const iconSizeMap: Record<"small" | "medium" | "large", number> = {
|
|
67
|
-
small:
|
|
68
|
-
medium:
|
|
69
|
-
large:
|
|
67
|
+
small: 12,
|
|
68
|
+
medium: 16,
|
|
69
|
+
large: 20,
|
|
70
70
|
};
|
|
71
71
|
|
|
72
72
|
const rightStyle = getRightIconStyle(size);
|
|
@@ -2,9 +2,9 @@ import { StyleSheet, ViewStyle, TextStyle, DimensionValue } from "react-native";
|
|
|
2
2
|
import { useThemeColor } from "../ConfigProvider";
|
|
3
3
|
import { typography } from "@xhs/reds-token-next";
|
|
4
4
|
const iconSizeMap: Record<"small" | "medium" | "large" | string, number> = {
|
|
5
|
-
small:
|
|
6
|
-
medium:
|
|
7
|
-
large:
|
|
5
|
+
small: 12,
|
|
6
|
+
medium: 16,
|
|
7
|
+
large: 20,
|
|
8
8
|
};
|
|
9
9
|
const fontSizeMap: Record<"small" | "medium" | "large", number> = {
|
|
10
10
|
small: 12,
|
|
@@ -49,11 +49,11 @@ const styles = StyleSheet.create({
|
|
|
49
49
|
borderTopRightRadius: 12,
|
|
50
50
|
},
|
|
51
51
|
cancel: {
|
|
52
|
-
fontSize: typography.
|
|
52
|
+
fontSize: typography.B2LooseSwitchFontSize,
|
|
53
53
|
fontWeight: typography.B1LooseFontWeight,
|
|
54
54
|
},
|
|
55
55
|
confirm: {
|
|
56
|
-
fontSize: typography.
|
|
56
|
+
fontSize: typography.B2LooseSwitchFontSize,
|
|
57
57
|
fontWeight: typography.T3FontWeight,
|
|
58
58
|
},
|
|
59
59
|
label: {
|
|
@@ -29,6 +29,13 @@ const IPADPRO11_HEIGHT = 1194;
|
|
|
29
29
|
const IPADPRO129_HEIGHT = 1024;
|
|
30
30
|
const IPADPRO129_WIDTH = 1366;
|
|
31
31
|
|
|
32
|
+
const IPHONE17AIR_WIDTH = 420;
|
|
33
|
+
const IPHONE17AIR_HEIGHT = 912;
|
|
34
|
+
const IPHONE17_WIDTH = 402;
|
|
35
|
+
const IPHONE17_HEIGHT = 874;
|
|
36
|
+
const IPHONE17PROMAX_WIDTH = 440;
|
|
37
|
+
const IPHONE17PROMAX_HEIGHT = 956;
|
|
38
|
+
|
|
32
39
|
export const getResolvedDimensions = () => {
|
|
33
40
|
const { width, height } = Dimensions.get("window");
|
|
34
41
|
if (width === 0 && height === 0) return Dimensions.get("screen");
|
|
@@ -77,6 +84,14 @@ export const isIPhoneX = (() => {
|
|
|
77
84
|
);
|
|
78
85
|
})();
|
|
79
86
|
|
|
87
|
+
export const isIPhone17 = (() => {
|
|
88
|
+
return (
|
|
89
|
+
(D_HEIGHT === IPHONE17_HEIGHT && D_WIDTH === IPHONE17_WIDTH) ||
|
|
90
|
+
(D_HEIGHT === IPHONE17PROMAX_HEIGHT && D_WIDTH === IPHONE17PROMAX_WIDTH) ||
|
|
91
|
+
(D_HEIGHT === IPHONE17AIR_HEIGHT && D_WIDTH === IPHONE17AIR_WIDTH)
|
|
92
|
+
);
|
|
93
|
+
})();
|
|
94
|
+
|
|
80
95
|
export const isNewIPadPro = (() => {
|
|
81
96
|
if (Platform.OS !== "ios") return false;
|
|
82
97
|
|
|
@@ -138,6 +153,10 @@ export const statusBarHeight = (isLandscape: boolean, immersive: boolean = false
|
|
|
138
153
|
return isLandscape ? 0 : 44;
|
|
139
154
|
}
|
|
140
155
|
|
|
156
|
+
if (isIPhone17) {
|
|
157
|
+
return isLandscape ? 0 : 34;
|
|
158
|
+
}
|
|
159
|
+
|
|
141
160
|
if (isNewIPadPro) {
|
|
142
161
|
return 24;
|
|
143
162
|
}
|
|
@@ -154,7 +173,7 @@ export const statusBarHeight = (isLandscape: boolean, immersive: boolean = false
|
|
|
154
173
|
};
|
|
155
174
|
|
|
156
175
|
export const safeAreaBottomInset = () => {
|
|
157
|
-
if (isIPhoneX || isIPhone14Pro || isIPhone16Pro || isIPhoneAir) {
|
|
176
|
+
if (isIPhoneX || isIPhone14Pro || isIPhone16Pro || isIPhoneAir || isIPhone17) {
|
|
158
177
|
return 34;
|
|
159
178
|
}
|
|
160
179
|
|
package/src/index.ts
CHANGED
package/CHANGELOG.md
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CIr5S84J.js","sources":["../../../src/components/PullRefresh/interface/index.ts"],"sourcesContent":["import { ViewStyle } from \"react-native\";\nexport interface RedsPullRefresh {\n children: React.ReactNode;\n pullAnimHeight?: number;\n minPullDistance?: number;\n msHoldingTime?: number;\n isRefreshing: boolean;\n pullDownToRefreshText?: string;\n releaseRefreshText?: string;\n requestDataText?: string;\n requestSuccessfulText?: string;\n style?: ViewStyle;\n controlStyle?: ViewStyle;\n onRequest?: () => void;\n showText?: boolean;\n initRefresh?: boolean;\n refresh?: boolean;\n}\n\nexport enum PullState {\n INIT, // 初始化\n FINISH, // 结束\n PULLING, // 下拉中\n LOADING, // 请求数据中\n HOLDING, // 请求完数据的停留状态\n}\n\nexport interface RedsPullRefreshEvent {}\nexport const PullRefreshDefaultProps = {\n children: undefined,\n pullAnimHeight: 0,\n minPullDistance: 20,\n msHoldingTime: 1000,\n isRefreshing: false,\n showText: true,\n initRefresh: false,\n refresh: false,\n};\n"],"names":["PullState","PullState2","PullRefreshDefaultProps","children","pullAnimHeight","minPullDistance","msHoldingTime","isRefreshing","showText","initRefresh","refresh"],"mappings":";;IAmBYA,SAAA,4BAAAA,UAAL,EAAA;EACLA,UAAA,CAAAC,UAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAA,CAAA;EACAD,UAAA,CAAAC,UAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAA,CAAA;EACAD,UAAA,CAAAC,UAAA,CAAA,SAAA,CAAA,GAAA,CAAA,CAAA,GAAA,SAAA,CAAA;EACAD,UAAA,CAAAC,UAAA,CAAA,SAAA,CAAA,GAAA,CAAA,CAAA,GAAA,SAAA,CAAA;EACAD,UAAA,CAAAC,UAAA,CAAA,SAAA,CAAA,GAAA,CAAA,CAAA,GAAA,SAAA,CAAA;AALUD,EAAAA,OAAAA,UAAAA,CAAAA;AAAA,CAAA,CAAAA,SAAA,IAAA,EAAA,EAAA;AASL,IAAME,uBAA0B,GAAA;EACrCC,QAAU,EAAA,KAAA,CAAA;AACVC,EAAAA,cAAgB,EAAA,CAAA;AAChBC,EAAAA,eAAiB,EAAA,EAAA;AACjBC,EAAAA,aAAe,EAAA,GAAA;AACfC,EAAAA,YAAc,EAAA,KAAA;AACdC,EAAAA,QAAU,EAAA,IAAA;AACVC,EAAAA,WAAa,EAAA,KAAA;AACbC,EAAAA,OAAS,EAAA,KAAA;AACX;;;;;;;;;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CZtagXcj.js","sources":["../../../src/components/PullRefresh/interface/index.ts"],"sourcesContent":["import { ViewStyle } from \"react-native\";\nexport interface RedsPullRefresh {\n children: React.ReactNode;\n pullAnimHeight?: number;\n minPullDistance?: number;\n msHoldingTime?: number;\n isRefreshing: boolean;\n pullDownToRefreshText?: string;\n releaseRefreshText?: string;\n requestDataText?: string;\n requestSuccessfulText?: string;\n style?: ViewStyle;\n controlStyle?: ViewStyle;\n onRequest?: () => void;\n showText?: boolean;\n initRefresh?: boolean;\n refresh?: boolean;\n}\n\nexport enum PullState {\n INIT, // 初始化\n FINISH, // 结束\n PULLING, // 下拉中\n LOADING, // 请求数据中\n HOLDING, // 请求完数据的停留状态\n}\n\nexport interface RedsPullRefreshEvent {}\nexport const PullRefreshDefaultProps = {\n children: undefined,\n pullAnimHeight: 0,\n minPullDistance: 20,\n msHoldingTime: 1000,\n isRefreshing: false,\n showText: true,\n initRefresh: false,\n refresh: false,\n};\n"],"names":["PullState","PullState2","PullRefreshDefaultProps","children","pullAnimHeight","minPullDistance","msHoldingTime","isRefreshing","showText","initRefresh","refresh"],"mappings":"IAmBYA,SAAA,4BAAAA,UAAL,EAAA;EACLA,UAAA,CAAAC,UAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAA,CAAA;EACAD,UAAA,CAAAC,UAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAA,CAAA;EACAD,UAAA,CAAAC,UAAA,CAAA,SAAA,CAAA,GAAA,CAAA,CAAA,GAAA,SAAA,CAAA;EACAD,UAAA,CAAAC,UAAA,CAAA,SAAA,CAAA,GAAA,CAAA,CAAA,GAAA,SAAA,CAAA;EACAD,UAAA,CAAAC,UAAA,CAAA,SAAA,CAAA,GAAA,CAAA,CAAA,GAAA,SAAA,CAAA;AALUD,EAAAA,OAAAA,UAAAA,CAAAA;AAAA,CAAA,CAAAA,SAAA,IAAA,EAAA,EAAA;AASL,IAAME,uBAA0B,GAAA;EACrCC,QAAU,EAAA,KAAA,CAAA;AACVC,EAAAA,cAAgB,EAAA,CAAA;AAChBC,EAAAA,eAAiB,EAAA,EAAA;AACjBC,EAAAA,aAAe,EAAA,GAAA;AACfC,EAAAA,YAAc,EAAA,KAAA;AACdC,EAAAA,QAAU,EAAA,IAAA;AACVC,EAAAA,WAAa,EAAA,KAAA;AACbC,EAAAA,OAAS,EAAA,KAAA;AACX;;;;;;;;;;"}
|