@xhsreds/reds-rn-next 0.9.1-test.1 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) 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-13.json +1 -1
  4. package/coverage/.tmp/coverage-14.json +1 -1
  5. package/coverage/.tmp/coverage-15.json +1 -1
  6. package/coverage/.tmp/coverage-16.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-20.json +1 -1
  12. package/coverage/.tmp/coverage-21.json +1 -1
  13. package/coverage/.tmp/coverage-22.json +1 -1
  14. package/coverage/.tmp/coverage-23.json +1 -1
  15. package/coverage/.tmp/coverage-26.json +1 -1
  16. package/coverage/.tmp/coverage-27.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-33.json +1 -1
  21. package/coverage/.tmp/coverage-34.json +1 -1
  22. package/coverage/.tmp/coverage-35.json +1 -1
  23. package/coverage/.tmp/coverage-36.json +1 -1
  24. package/coverage/.tmp/coverage-37.json +1 -1
  25. package/coverage/.tmp/coverage-38.json +1 -1
  26. package/coverage/.tmp/coverage-39.json +1 -1
  27. package/coverage/.tmp/coverage-40.json +1 -1
  28. package/coverage/.tmp/coverage-41.json +1 -1
  29. package/coverage/.tmp/coverage-6.json +1 -1
  30. package/coverage/.tmp/coverage-7.json +1 -1
  31. package/coverage/.tmp/coverage-8.json +1 -1
  32. package/lib/cjs/_chunks/CwkpVXDI.js.map +1 -1
  33. package/lib/cjs/_chunks/{CIr5S84J.js → DUU5wf2f.js} +4 -2
  34. package/lib/cjs/_chunks/DUU5wf2f.js.map +1 -0
  35. package/lib/cjs/components/Carousel/Carousel.js +9 -2
  36. package/lib/cjs/components/Carousel/Carousel.js.map +1 -1
  37. package/lib/cjs/components/Image/Image.js +29 -92
  38. package/lib/cjs/components/Image/Image.js.map +1 -1
  39. package/lib/cjs/components/Image/VisibilitySensor.js +1 -1
  40. package/lib/cjs/components/Image/VisibilitySensor.js.map +1 -1
  41. package/lib/cjs/components/Image/index.js +4 -3
  42. package/lib/cjs/components/Image/index.js.map +1 -1
  43. package/lib/cjs/components/Image/queryCacheBatcher.js +96 -0
  44. package/lib/cjs/components/Image/queryCacheBatcher.js.map +1 -0
  45. package/lib/cjs/components/Popover/Popover.js +4 -3
  46. package/lib/cjs/components/Popover/Popover.js.map +1 -1
  47. package/lib/cjs/components/PullRefresh/PullRefresh.js +104 -40
  48. package/lib/cjs/components/PullRefresh/PullRefresh.js.map +1 -1
  49. package/lib/cjs/components/PullRefresh/component.js +1 -1
  50. package/lib/cjs/components/PullRefresh/index.js +1 -1
  51. package/lib/cjs/components/PullRefresh/interface/index.js +1 -1
  52. package/lib/cjs/components/Radio/Radio.js +3 -2
  53. package/lib/cjs/components/Radio/Radio.js.map +1 -1
  54. package/lib/cjs/components/Radio/index.js +3 -2
  55. package/lib/cjs/components/Radio/index.js.map +1 -1
  56. package/lib/cjs/components/Sheets/styles.js +2 -2
  57. package/lib/cjs/components/Sheets/styles.js.map +1 -1
  58. package/lib/cjs/components/StatusBar/hook/getStatusHeight.js +14 -1
  59. package/lib/cjs/components/StatusBar/hook/getStatusHeight.js.map +1 -1
  60. package/lib/cjs/index.js +3 -2
  61. package/lib/cjs/index.js.map +1 -1
  62. package/lib/cjs/pvCount/pvData.js +1 -1
  63. package/lib/esm/_chunks/Da9cW8JG.js.map +1 -1
  64. package/lib/esm/_chunks/{CZtagXcj.js → gC9g4Fr_.js} +4 -2
  65. package/lib/esm/_chunks/gC9g4Fr_.js.map +1 -0
  66. package/lib/esm/components/Carousel/Carousel.js +9 -2
  67. package/lib/esm/components/Carousel/Carousel.js.map +1 -1
  68. package/lib/esm/components/Image/Image.js +31 -94
  69. package/lib/esm/components/Image/Image.js.map +1 -1
  70. package/lib/esm/components/Image/VisibilitySensor.js +1 -1
  71. package/lib/esm/components/Image/VisibilitySensor.js.map +1 -1
  72. package/lib/esm/components/Image/index.js +4 -3
  73. package/lib/esm/components/Image/index.js.map +1 -1
  74. package/lib/esm/components/Image/queryCacheBatcher.js +92 -0
  75. package/lib/esm/components/Image/queryCacheBatcher.js.map +1 -0
  76. package/lib/esm/components/Popover/Popover.js +4 -3
  77. package/lib/esm/components/Popover/Popover.js.map +1 -1
  78. package/lib/esm/components/PullRefresh/PullRefresh.js +105 -41
  79. package/lib/esm/components/PullRefresh/PullRefresh.js.map +1 -1
  80. package/lib/esm/components/PullRefresh/component.js +1 -1
  81. package/lib/esm/components/PullRefresh/index.js +1 -1
  82. package/lib/esm/components/PullRefresh/interface/index.js +1 -1
  83. package/lib/esm/components/Radio/Radio.js +3 -2
  84. package/lib/esm/components/Radio/Radio.js.map +1 -1
  85. package/lib/esm/components/Radio/index.js +3 -2
  86. package/lib/esm/components/Radio/index.js.map +1 -1
  87. package/lib/esm/components/Sheets/styles.js +2 -2
  88. package/lib/esm/components/Sheets/styles.js.map +1 -1
  89. package/lib/esm/components/StatusBar/hook/getStatusHeight.js +14 -2
  90. package/lib/esm/components/StatusBar/hook/getStatusHeight.js.map +1 -1
  91. package/lib/esm/index.js +3 -2
  92. package/lib/esm/index.js.map +1 -1
  93. package/lib/esm/pvCount/pvData.js +1 -1
  94. package/lib/src/components/Image/queryCacheBatcher.d.ts +5 -0
  95. package/lib/src/components/Popover/Popover.d.ts +1 -1
  96. package/lib/src/components/Popover/interface/index.d.ts +1 -0
  97. package/lib/src/components/PullRefresh/PullRefresh.d.ts +2 -0
  98. package/lib/src/components/PullRefresh/interface/index.d.ts +5 -0
  99. package/lib/src/components/StatusBar/hook/getStatusHeight.d.ts +1 -0
  100. package/lib/types/components/Image/queryCacheBatcher.d.ts +5 -0
  101. package/lib/types/components/Popover/Popover.d.ts +1 -1
  102. package/lib/types/components/Popover/interface/index.d.ts +1 -0
  103. package/lib/types/components/PullRefresh/PullRefresh.d.ts +2 -0
  104. package/lib/types/components/PullRefresh/interface/index.d.ts +5 -0
  105. package/lib/types/components/StatusBar/hook/getStatusHeight.d.ts +1 -0
  106. package/package.json +2 -2
  107. package/src/components/Carousel/Carousel.tsx +15 -3
  108. package/src/components/Carousel/demo/index.tsx +14 -2
  109. package/src/components/Image/Image.tsx +53 -115
  110. package/src/components/Image/VisibilitySensor.tsx +1 -2
  111. package/src/components/Image/queryCacheBatcher.ts +84 -0
  112. package/src/components/Popover/Popover.tsx +4 -3
  113. package/src/components/Popover/doc/index.mdx +22 -21
  114. package/src/components/Popover/interface/index.ts +1 -0
  115. package/src/components/PullRefresh/PullRefresh.tsx +146 -55
  116. package/src/components/PullRefresh/doc/index.mdx +19 -16
  117. package/src/components/PullRefresh/interface/index.ts +6 -0
  118. package/src/components/Sheets/styles.ts +2 -2
  119. package/src/components/StatusBar/hook/getStatusHeight.ts +20 -1
  120. package/src/i18n/@types/resources.d.ts +27 -27
  121. package/src/i18n/index.json +31 -31
  122. package/src/index.ts +0 -1
  123. package/CHANGELOG.md +0 -13
  124. package/lib/cjs/_chunks/CIr5S84J.js.map +0 -1
  125. 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 { View, StyleSheet, Animated, PanResponder, Easing, LayoutChangeEvent } from "react-native";
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
- props.onRequest && props.onRequest();
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
- if (props.isRefreshing === true && !isRefreshing) {
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 (props.isRefreshing === false && isRefreshing) {
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
- scrollEnabled: !(props.initRefresh && !hasInitRefreshed && isRefreshing),
261
- onScroll: (evt: any) => {
262
- setScrollY(evt.nativeEvent.contentOffset.y);
263
- // iOS下拉刷新Loading时,ScrollView向上滑动的时候,refreshControl部分同样上滑
264
- if (pullState === PullState.LOADING && evt.nativeEvent.contentOffset.y > 0) {
265
- const y = Math.max(0, pullAnimHeight - evt.nativeEvent.contentOffset.y);
266
- viewRef.current &&
267
- viewRef.current.setNativeProps({
268
- style: {
269
- transform: [{ translateY: y }],
270
- },
271
- });
272
- animatedViewRef.current &&
273
- animatedViewRef.current.setNativeProps({
274
- style: {
275
- transform: [{ translateY: y }],
276
- },
277
- });
278
- }
279
- if (child.props.onScroll && typeof child.props.onScroll === "function") {
280
- child.props.onScroll(evt);
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
- }, [pullState, props.children, props.initRefresh, hasInitRefreshed, isRefreshing, pullAnimHeight]);
286
-
287
- // 增加Animated.View控制ScrollView展示位置
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 style={[styles.container, props.style]} {...panResponder.panHandlers} testID="refresh-container">
306
- <Animated.View
307
- // @ts-ignore
308
- ref={animatedViewRef}
309
- onLayout={onLayout}
310
- style={[
311
- styles.freshItem,
312
- {
313
- top: top,
314
- height: props.pullAnimHeight,
315
- transform: [{ translateY: pan }],
316
- },
317
- props.controlStyle,
318
- ]}
319
- >
320
- {/* @ts-ignore */}
321
- <RefreshControl ref={refreshControlRef} {...props} movePercent={movePercent} />
322
- </Animated.View>
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 | 下拉刷新容器的内容 | 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 |
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
  };
@@ -49,11 +49,11 @@ const styles = StyleSheet.create({
49
49
  borderTopRightRadius: 12,
50
50
  },
51
51
  cancel: {
52
- fontSize: typography.B1LooseFontSize,
52
+ fontSize: typography.B2LooseSwitchFontSize,
53
53
  fontWeight: typography.B1LooseFontWeight,
54
54
  },
55
55
  confirm: {
56
- fontSize: typography.B1LooseFontSize,
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
 
@@ -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,4 +1,35 @@
1
1
  {
2
+ "en_us": {
3
+ "componentKey": {
4
+ "sureKey": "Confirm",
5
+ "satisfyKey": "Satisfy",
6
+ "confirmKey": "Confirm",
7
+ "uploadingKey": "Uploading",
8
+ "resetKey": "Reset",
9
+ "NoDataKey": "No data available at the moment",
10
+ "liveStreamingKey": "live",
11
+ "generallyKey": "Generally",
12
+ "uploadFailedKey": "Upload failed",
13
+ "submitKey": "Submit",
14
+ "requestSuccessfulKey": "Request successful",
15
+ "cancelKey": "Cancel",
16
+ "PullDownToRefreshKey": "Pull down to refresh",
17
+ "selectAllKey": "SelectAll",
18
+ "requestDataKey": "Request data",
19
+ "closeKey": "Close",
20
+ "veryBadKey": "Very bad",
21
+ "searchKey": "Search",
22
+ "expandKey": "Expand",
23
+ "IDCardPhotoKey": "ID card photo",
24
+ "finishKey": "Finish",
25
+ "surpriseKey": "Surprise",
26
+ "releaseRefreshKey": "Release refresh",
27
+ "nationalEmblemSideOfIDCardKey": "National emblem side of ID card",
28
+ "buttonKey": "Button",
29
+ "jumpKey": "Jump",
30
+ "disappointmentKey": "Disappointment"
31
+ }
32
+ },
2
33
  "zh_cn": {
3
34
  "componentKey": {
4
35
  "sureKey": "确定",
@@ -60,36 +91,5 @@
60
91
  "jumpKey": "跳轉",
61
92
  "disappointmentKey": "失望"
62
93
  }
63
- },
64
- "en_us": {
65
- "componentKey": {
66
- "sureKey": "Confirm",
67
- "satisfyKey": "Satisfy",
68
- "confirmKey": "Confirm",
69
- "uploadingKey": "Uploading",
70
- "resetKey": "Reset",
71
- "NoDataKey": "No data available at the moment",
72
- "liveStreamingKey": "live",
73
- "generallyKey": "Generally",
74
- "uploadFailedKey": "Upload failed",
75
- "submitKey": "Submit",
76
- "requestSuccessfulKey": "Request successful",
77
- "cancelKey": "Cancel",
78
- "PullDownToRefreshKey": "Pull down to refresh",
79
- "selectAllKey": "SelectAll",
80
- "requestDataKey": "Request data",
81
- "closeKey": "Close",
82
- "veryBadKey": "Very bad",
83
- "searchKey": "Search",
84
- "expandKey": "Expand",
85
- "IDCardPhotoKey": "ID card photo",
86
- "finishKey": "Finish",
87
- "surpriseKey": "Surprise",
88
- "releaseRefreshKey": "Release refresh",
89
- "nationalEmblemSideOfIDCardKey": "National emblem side of ID card",
90
- "buttonKey": "Button",
91
- "jumpKey": "Jump",
92
- "disappointmentKey": "Disappointment"
93
- }
94
94
  }
95
95
  }
package/src/index.ts CHANGED
@@ -1,4 +1,3 @@
1
- // "test111"
2
1
  export * from "./components/SegmentedControl";
3
2
  export * from "./components/LanguageProvider";
4
3
  export * from "./components/NoticeBar";
package/CHANGELOG.md DELETED
@@ -1,13 +0,0 @@
1
- # @xhs/reds-rn-next
2
-
3
- ## 0.9.1-test.1
4
-
5
- ### Patch Changes
6
-
7
- - 9b7e25eb: fix: 2
8
-
9
- ## 0.9.1-test.0
10
-
11
- ### Patch Changes
12
-
13
- - 06f29aba: fix: add
@@ -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;;;;;;;;;;"}