react-native-refresh-list2 1.0.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.
- package/LICENSE +20 -0
- package/README.md +67 -0
- package/lib/module/Loading/Loading.js +19 -0
- package/lib/module/Loading/Loading.js.map +1 -0
- package/lib/module/Loading/index.js +5 -0
- package/lib/module/Loading/index.js.map +1 -0
- package/lib/module/RefreshControl/BottomContainer.js +88 -0
- package/lib/module/RefreshControl/BottomContainer.js.map +1 -0
- package/lib/module/RefreshControl/NormalControl.js +94 -0
- package/lib/module/RefreshControl/NormalControl.js.map +1 -0
- package/lib/module/RefreshControl/RefreshContainer.js +53 -0
- package/lib/module/RefreshControl/RefreshContainer.js.map +1 -0
- package/lib/module/RefreshControl/RefreshContext.js +32 -0
- package/lib/module/RefreshControl/RefreshContext.js.map +1 -0
- package/lib/module/RefreshControl/RefreshFlatList.js +291 -0
- package/lib/module/RefreshControl/RefreshFlatList.js.map +1 -0
- package/lib/module/RefreshControl/RefreshScrollView.js +279 -0
- package/lib/module/RefreshControl/RefreshScrollView.js.map +1 -0
- package/lib/module/RefreshControl/index.js +7 -0
- package/lib/module/RefreshControl/index.js.map +1 -0
- package/lib/module/RefreshControl/type.js +39 -0
- package/lib/module/RefreshControl/type.js.map +1 -0
- package/lib/module/icon/CommentIcon.js +32 -0
- package/lib/module/icon/CommentIcon.js.map +1 -0
- package/lib/module/icon/Icon.js +25 -0
- package/lib/module/icon/Icon.js.map +1 -0
- package/lib/module/icon/MoreIcon.js +40 -0
- package/lib/module/icon/MoreIcon.js.map +1 -0
- package/lib/module/icon/Praise.js +23 -0
- package/lib/module/icon/Praise.js.map +1 -0
- package/lib/module/icon/SearchIcon.js +35 -0
- package/lib/module/icon/SearchIcon.js.map +1 -0
- package/lib/module/icon/index.js +5 -0
- package/lib/module/icon/index.js.map +1 -0
- package/lib/module/icon/library.js +20 -0
- package/lib/module/icon/library.js.map +1 -0
- package/lib/module/index.js +4 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/Loading/Loading.d.ts +9 -0
- package/lib/typescript/src/Loading/Loading.d.ts.map +1 -0
- package/lib/typescript/src/Loading/index.d.ts +3 -0
- package/lib/typescript/src/Loading/index.d.ts.map +1 -0
- package/lib/typescript/src/RefreshControl/BottomContainer.d.ts +17 -0
- package/lib/typescript/src/RefreshControl/BottomContainer.d.ts.map +1 -0
- package/lib/typescript/src/RefreshControl/NormalControl.d.ts +20 -0
- package/lib/typescript/src/RefreshControl/NormalControl.d.ts.map +1 -0
- package/lib/typescript/src/RefreshControl/RefreshContainer.d.ts +17 -0
- package/lib/typescript/src/RefreshControl/RefreshContainer.d.ts.map +1 -0
- package/lib/typescript/src/RefreshControl/RefreshContext.d.ts +9 -0
- package/lib/typescript/src/RefreshControl/RefreshContext.d.ts.map +1 -0
- package/lib/typescript/src/RefreshControl/RefreshFlatList.d.ts +20 -0
- package/lib/typescript/src/RefreshControl/RefreshFlatList.d.ts.map +1 -0
- package/lib/typescript/src/RefreshControl/RefreshScrollView.d.ts +20 -0
- package/lib/typescript/src/RefreshControl/RefreshScrollView.d.ts.map +1 -0
- package/lib/typescript/src/RefreshControl/index.d.ts +5 -0
- package/lib/typescript/src/RefreshControl/index.d.ts.map +1 -0
- package/lib/typescript/src/RefreshControl/type.d.ts +70 -0
- package/lib/typescript/src/RefreshControl/type.d.ts.map +1 -0
- package/lib/typescript/src/icon/CommentIcon.d.ts +3 -0
- package/lib/typescript/src/icon/CommentIcon.d.ts.map +1 -0
- package/lib/typescript/src/icon/Icon.d.ts +10 -0
- package/lib/typescript/src/icon/Icon.d.ts.map +1 -0
- package/lib/typescript/src/icon/MoreIcon.d.ts +3 -0
- package/lib/typescript/src/icon/MoreIcon.d.ts.map +1 -0
- package/lib/typescript/src/icon/Praise.d.ts +9 -0
- package/lib/typescript/src/icon/Praise.d.ts.map +1 -0
- package/lib/typescript/src/icon/SearchIcon.d.ts +9 -0
- package/lib/typescript/src/icon/SearchIcon.d.ts.map +1 -0
- package/lib/typescript/src/icon/index.d.ts +3 -0
- package/lib/typescript/src/icon/index.d.ts.map +1 -0
- package/lib/typescript/src/icon/library.d.ts +17 -0
- package/lib/typescript/src/icon/library.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +2 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/package.json +168 -0
- package/src/Loading/Loading.tsx +15 -0
- package/src/Loading/index.tsx +5 -0
- package/src/RefreshControl/BottomContainer.tsx +112 -0
- package/src/RefreshControl/NormalControl.tsx +118 -0
- package/src/RefreshControl/RefreshContainer.tsx +74 -0
- package/src/RefreshControl/RefreshContext.tsx +30 -0
- package/src/RefreshControl/RefreshFlatList.tsx +372 -0
- package/src/RefreshControl/RefreshScrollView.tsx +359 -0
- package/src/RefreshControl/index.tsx +5 -0
- package/src/RefreshControl/type.ts +74 -0
- package/src/icon/CommentIcon.tsx +29 -0
- package/src/icon/Icon.tsx +26 -0
- package/src/icon/MoreIcon.tsx +38 -0
- package/src/icon/Praise.tsx +21 -0
- package/src/icon/SearchIcon.tsx +36 -0
- package/src/icon/index.tsx +3 -0
- package/src/icon/library.ts +30 -0
- package/src/index.tsx +1 -0
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
// RefreshFlatList.tsx
|
|
4
|
+
|
|
5
|
+
import React, { useCallback, useEffect, useRef } from 'react';
|
|
6
|
+
import { Dimensions, Platform } from 'react-native';
|
|
7
|
+
import { Gesture, GestureDetector, GestureHandlerRootView } from 'react-native-gesture-handler';
|
|
8
|
+
import Animated, { runOnJS, interpolate, useAnimatedScrollHandler, withTiming, useAnimatedProps, useAnimatedStyle, useSharedValue, useDerivedValue, withSequence, withDelay, Easing, useAnimatedReaction } from 'react-native-reanimated';
|
|
9
|
+
import { RefreshContainerContext, RefreshStatus } from "./type.js";
|
|
10
|
+
import RefreshContainer from "./RefreshContainer.js";
|
|
11
|
+
// 假设您不需要单独的 BottomContainer 组件,而是将加载更多内容放在 ListFooterComponent 中
|
|
12
|
+
|
|
13
|
+
// ------------------- 常量定义 -------------------
|
|
14
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
15
|
+
const {
|
|
16
|
+
height
|
|
17
|
+
} = Dimensions.get('window');
|
|
18
|
+
const MAX_SCROLL_VELOCITY_Y = 20;
|
|
19
|
+
const MIN_SCROLL_VELOCITY_Y = 0.5;
|
|
20
|
+
const DEFAULT_TRIGGLE_HEIGHT = 100;
|
|
21
|
+
const RESET_TIMING_EASING = Easing.bezier(0.33, 1, 0.68, 1);
|
|
22
|
+
const MAX_BOUNCE_DISTANCE = 100;
|
|
23
|
+
|
|
24
|
+
// ------------------- Props 定义 -------------------
|
|
25
|
+
|
|
26
|
+
const RefreshFlatList = props => {
|
|
27
|
+
const {
|
|
28
|
+
refreshing,
|
|
29
|
+
onRefresh,
|
|
30
|
+
refreshComponent,
|
|
31
|
+
transitionY,
|
|
32
|
+
triggleHeight = DEFAULT_TRIGGLE_HEIGHT,
|
|
33
|
+
canOffset = true,
|
|
34
|
+
bounces = true,
|
|
35
|
+
onScroll: onScrollHandler,
|
|
36
|
+
data,
|
|
37
|
+
renderItem,
|
|
38
|
+
keyExtractor,
|
|
39
|
+
offsetY = 0,
|
|
40
|
+
scrollParentRef,
|
|
41
|
+
scrollViewParentTransitionY,
|
|
42
|
+
...restProps
|
|
43
|
+
} = props;
|
|
44
|
+
|
|
45
|
+
// ------------------- Shared Values 和 Refs -------------------
|
|
46
|
+
const panRef = useRef(null);
|
|
47
|
+
const internalScrollRef = useRef(null);
|
|
48
|
+
const scrollRef = scrollParentRef || internalScrollRef;
|
|
49
|
+
const internalScrollViewParentTransitionY = useSharedValue(0);
|
|
50
|
+
const scrollViewTransitionY = scrollViewParentTransitionY || internalScrollViewParentTransitionY;
|
|
51
|
+
const offset = useSharedValue(0);
|
|
52
|
+
const scrollBounse = useSharedValue(false);
|
|
53
|
+
const refreshStatus = useSharedValue(RefreshStatus.Idle);
|
|
54
|
+
const scrollViewTotalHeight = useSharedValue(0);
|
|
55
|
+
const scrollBeginTop = useSharedValue(0);
|
|
56
|
+
const internalRefreshTransitionY = useSharedValue(0);
|
|
57
|
+
const refreshTransitionY = transitionY ?? internalRefreshTransitionY;
|
|
58
|
+
|
|
59
|
+
// ------------------- Derived Values -------------------
|
|
60
|
+
const direction = useDerivedValue(() => {
|
|
61
|
+
return refreshTransitionY.value > 0 ? 1 : -1;
|
|
62
|
+
}, [refreshTransitionY]);
|
|
63
|
+
const canRefresh = useDerivedValue(() => {
|
|
64
|
+
const marginTop = scrollViewTransitionY.value;
|
|
65
|
+
// 核心:判断是否触顶 (下拉) 或触底 (上拉/加载更多)
|
|
66
|
+
return marginTop < 1;
|
|
67
|
+
});
|
|
68
|
+
useAnimatedReaction(() => refreshStatus.value, () => {});
|
|
69
|
+
|
|
70
|
+
// ------------------- Refreshing Side Effect -------------------
|
|
71
|
+
useEffect(() => {
|
|
72
|
+
console.log(refreshing);
|
|
73
|
+
if (refreshing) {
|
|
74
|
+
console.log(direction.value);
|
|
75
|
+
if (direction.value === 1) {
|
|
76
|
+
refreshStatus.value = RefreshStatus.Holding;
|
|
77
|
+
// 刷新中保持指示器在触发高度
|
|
78
|
+
refreshTransitionY.value = withTiming(triggleHeight * direction.value);
|
|
79
|
+
} else if (refreshStatus.value === RefreshStatus.Idle) {
|
|
80
|
+
// scrollRef.current.scrollToOffset({offset: 0, animated: false});
|
|
81
|
+
refreshStatus.value = RefreshStatus.Holding;
|
|
82
|
+
refreshTransitionY.value = withTiming(triggleHeight);
|
|
83
|
+
}
|
|
84
|
+
} else if (refreshStatus.value !== RefreshStatus.Idle) {
|
|
85
|
+
if (direction.value === 1) {
|
|
86
|
+
// 下拉刷新完成,收起指示器
|
|
87
|
+
refreshStatus.value = RefreshStatus.Done;
|
|
88
|
+
refreshTransitionY.value = withDelay(500, withTiming(0, {
|
|
89
|
+
easing: RESET_TIMING_EASING
|
|
90
|
+
}, () => {
|
|
91
|
+
refreshStatus.value = RefreshStatus.Idle;
|
|
92
|
+
}));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}, [refreshing, direction.value, refreshStatus, refreshTransitionY, triggleHeight]);
|
|
96
|
+
const handleOnRefresh = useCallback(() => {
|
|
97
|
+
if (refreshing) return;
|
|
98
|
+
onRefresh && onRefresh();
|
|
99
|
+
}, [refreshing, onRefresh]);
|
|
100
|
+
|
|
101
|
+
// ------------------- Scroll Handler -------------------
|
|
102
|
+
const onScroll = useAnimatedScrollHandler({
|
|
103
|
+
onBeginDrag: (event, context) => {
|
|
104
|
+
context.scrollBeginTime = new Date().valueOf();
|
|
105
|
+
context.scrollBeginY = event.contentOffset.y;
|
|
106
|
+
},
|
|
107
|
+
onScroll: (event, context) => {
|
|
108
|
+
onScrollHandler && runOnJS(onScrollHandler)({
|
|
109
|
+
nativeEvent: event
|
|
110
|
+
});
|
|
111
|
+
const {
|
|
112
|
+
scrollBeginY,
|
|
113
|
+
scrollBeginTime
|
|
114
|
+
} = context;
|
|
115
|
+
scrollViewTransitionY.value = event.contentOffset.y;
|
|
116
|
+
// 滚动边界反弹动画逻辑
|
|
117
|
+
const marginTop = scrollViewTransitionY.value;
|
|
118
|
+
if (marginTop === 0 && !scrollBounse.value) {
|
|
119
|
+
const bounceDirection = marginTop === 0 ? 1 : -1;
|
|
120
|
+
const endTime = new Date().valueOf();
|
|
121
|
+
const velocityY = Math.min(Math.abs((scrollViewTransitionY.value - scrollBeginY) / (endTime - scrollBeginTime)), MAX_SCROLL_VELOCITY_Y);
|
|
122
|
+
if (!bounces || velocityY < MIN_SCROLL_VELOCITY_Y) return;
|
|
123
|
+
const ratio = Math.PI / 2 / MAX_SCROLL_VELOCITY_Y * velocityY;
|
|
124
|
+
const bounceDistance = height / 4 * Math.sin(ratio);
|
|
125
|
+
const duration = 100 + 100 * Math.sin(ratio * 2);
|
|
126
|
+
scrollBounse.value = true;
|
|
127
|
+
refreshTransitionY.value = withSequence(withTiming(bounceDistance * bounceDirection, {
|
|
128
|
+
duration
|
|
129
|
+
}), withTiming(0, {
|
|
130
|
+
duration,
|
|
131
|
+
easing: RESET_TIMING_EASING
|
|
132
|
+
}, () => {
|
|
133
|
+
scrollBounse.value = false;
|
|
134
|
+
}));
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
// @ts-ignore
|
|
140
|
+
const nativeRef = useRef();
|
|
141
|
+
const nativeGesture = Gesture.Native().withRef(nativeRef);
|
|
142
|
+
const scrollToTopJS = useCallback(() => {
|
|
143
|
+
// 检查 ref 是否存在
|
|
144
|
+
if (scrollRef.current) {
|
|
145
|
+
// 使用 scrollToOffset 替代 scrollToTop,因为 FlatList/ScrollView 实例上
|
|
146
|
+
// 没有原生 scrollToTop 方法,但有 scrollToOffset
|
|
147
|
+
// 或者使用你之前提到的 scrollToOffset({offset: 0, animated: false})
|
|
148
|
+
scrollRef.current.scrollToOffset({
|
|
149
|
+
offset: 0,
|
|
150
|
+
animated: false // 禁用动画以确保即时归位
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
// 如果你的代码中 FlatList 是经过 Animated 包装的,可能需要调用其原生方法
|
|
154
|
+
// (scrollRef.current as any).getNode().scrollToOffset({ offset: 0, animated: false });
|
|
155
|
+
}
|
|
156
|
+
}, [scrollRef]);
|
|
157
|
+
|
|
158
|
+
// ------------------- Pan Gesture -------------------
|
|
159
|
+
const panGesture = Gesture.Pan().withRef(panRef).activeOffsetY(10).simultaneousWithExternalGesture(nativeRef)
|
|
160
|
+
// 移除 activeOffsetY 或设置为极小值,让优先级完全由 requireExternalGestureToFail 决定
|
|
161
|
+
// 关键:与原生滚动同时进行,以便在触顶时接管
|
|
162
|
+
.onBegin(() => {
|
|
163
|
+
offset.value = refreshTransitionY.value;
|
|
164
|
+
scrollBeginTop.value = scrollViewTransitionY.value;
|
|
165
|
+
}).onUpdate(({
|
|
166
|
+
translationY
|
|
167
|
+
}) => {
|
|
168
|
+
const shouldAllowModify = canRefresh.value || refreshStatus.value !== RefreshStatus.Idle && translationY - scrollBeginTop.value >= 0;
|
|
169
|
+
if (!shouldAllowModify) {
|
|
170
|
+
refreshTransitionY.value = 0;
|
|
171
|
+
// 如果不在触顶区域且未处于刷新状态,则不修改位移
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
if (Platform.OS !== 'ios') runOnJS(scrollToTopJS)();
|
|
175
|
+
let nextY = offset.value + interpolate(translationY - scrollBeginTop.value, [0, height], [0, height / 2]
|
|
176
|
+
// 确保超过 height 时不会失控,但这里通常不需要
|
|
177
|
+
);
|
|
178
|
+
refreshTransitionY.value = Math.min(nextY, MAX_BOUNCE_DISTANCE);
|
|
179
|
+
if (!refreshing) {
|
|
180
|
+
if (Math.abs(refreshTransitionY.value) >= triggleHeight) {
|
|
181
|
+
refreshStatus.value = RefreshStatus.Reached;
|
|
182
|
+
} else {
|
|
183
|
+
refreshStatus.value = RefreshStatus.Pulling;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}).onEnd(() => {
|
|
187
|
+
if (refreshing) {
|
|
188
|
+
if (refreshTransitionY.value >= triggleHeight * direction.value) {
|
|
189
|
+
refreshTransitionY.value = withTiming(triggleHeight * direction.value);
|
|
190
|
+
} else {
|
|
191
|
+
``;
|
|
192
|
+
refreshTransitionY.value = withTiming(0);
|
|
193
|
+
}
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
if (Math.abs(refreshTransitionY.value) >= triggleHeight) {
|
|
197
|
+
if (refreshTransitionY.value > 0) {
|
|
198
|
+
runOnJS(handleOnRefresh)();
|
|
199
|
+
}
|
|
200
|
+
} else {
|
|
201
|
+
refreshTransitionY.value = withTiming(0, {
|
|
202
|
+
easing: RESET_TIMING_EASING
|
|
203
|
+
}, () => {
|
|
204
|
+
refreshStatus.value = RefreshStatus.Idle;
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
// ------------------- Animated Styles and Props -------------------
|
|
210
|
+
const animatedStyle = useAnimatedStyle(() => {
|
|
211
|
+
// 🌟 核心修复:这个 style 将应用于外部 Animated.View,实现整个列表的平移
|
|
212
|
+
return {
|
|
213
|
+
transform: [{
|
|
214
|
+
translateY: canOffset ? refreshTransitionY.value : 0
|
|
215
|
+
}]
|
|
216
|
+
};
|
|
217
|
+
});
|
|
218
|
+
const animatedScrollEnabled = useDerivedValue(() => {
|
|
219
|
+
if (Platform.OS === 'ios') return true;
|
|
220
|
+
return refreshTransitionY.value <= 0;
|
|
221
|
+
}, [refreshTransitionY]);
|
|
222
|
+
const animatedProps = useAnimatedProps(() => {
|
|
223
|
+
const top = -refreshTransitionY.value;
|
|
224
|
+
return {
|
|
225
|
+
scrollEnabled: animatedScrollEnabled.value,
|
|
226
|
+
scrollIndicatorInsets: {
|
|
227
|
+
top: top - 1,
|
|
228
|
+
left: 0,
|
|
229
|
+
bottom: 0,
|
|
230
|
+
right: 0
|
|
231
|
+
}
|
|
232
|
+
};
|
|
233
|
+
});
|
|
234
|
+
const derivedTransitionY = useDerivedValue(() => {
|
|
235
|
+
return refreshTransitionY.value + offsetY;
|
|
236
|
+
}, [offsetY]); // 依赖 offsetY,如果 offsetY 变化,重新计算
|
|
237
|
+
|
|
238
|
+
// ------------------- JSX 渲染 -------------------
|
|
239
|
+
return /*#__PURE__*/_jsx(GestureHandlerRootView, {
|
|
240
|
+
style: {
|
|
241
|
+
flex: 1
|
|
242
|
+
},
|
|
243
|
+
children: /*#__PURE__*/_jsxs(RefreshContainerContext.Provider, {
|
|
244
|
+
value: {
|
|
245
|
+
transitionY: refreshTransitionY,
|
|
246
|
+
scrollBounse,
|
|
247
|
+
triggleHeight,
|
|
248
|
+
refreshing,
|
|
249
|
+
refreshStatus,
|
|
250
|
+
direction,
|
|
251
|
+
canRefresh
|
|
252
|
+
},
|
|
253
|
+
children: [/*#__PURE__*/_jsx(GestureDetector, {
|
|
254
|
+
gesture: panGesture,
|
|
255
|
+
children: /*#__PURE__*/_jsx(GestureDetector, {
|
|
256
|
+
gesture: nativeGesture,
|
|
257
|
+
children: /*#__PURE__*/_jsx(Animated.FlatList, {
|
|
258
|
+
ref: scrollRef,
|
|
259
|
+
bounces: false,
|
|
260
|
+
overScrollMode: 'never',
|
|
261
|
+
scrollEventThrottle: 16,
|
|
262
|
+
onScroll: onScroll,
|
|
263
|
+
animatedProps: animatedProps
|
|
264
|
+
// 移除 style={animatedStyle}
|
|
265
|
+
,
|
|
266
|
+
onContentSizeChange: (_, h) => {
|
|
267
|
+
scrollViewTotalHeight.value = h;
|
|
268
|
+
}
|
|
269
|
+
// FlatList 核心 Props
|
|
270
|
+
,
|
|
271
|
+
data: data,
|
|
272
|
+
renderItem: renderItem,
|
|
273
|
+
keyExtractor: keyExtractor,
|
|
274
|
+
...restProps,
|
|
275
|
+
style: [{
|
|
276
|
+
flex: 1
|
|
277
|
+
}, animatedStyle, restProps.style] // 合并样式
|
|
278
|
+
})
|
|
279
|
+
})
|
|
280
|
+
}), /*#__PURE__*/_jsx(RefreshContainer, {
|
|
281
|
+
offsetTop: offsetY,
|
|
282
|
+
refreshStatus: refreshStatus,
|
|
283
|
+
transitionY: derivedTransitionY,
|
|
284
|
+
triggleHeight: triggleHeight + offsetY,
|
|
285
|
+
children: refreshComponent && refreshComponent()
|
|
286
|
+
})]
|
|
287
|
+
})
|
|
288
|
+
});
|
|
289
|
+
};
|
|
290
|
+
export default RefreshFlatList;
|
|
291
|
+
//# sourceMappingURL=RefreshFlatList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","useCallback","useEffect","useRef","Dimensions","Platform","Gesture","GestureDetector","GestureHandlerRootView","Animated","runOnJS","interpolate","useAnimatedScrollHandler","withTiming","useAnimatedProps","useAnimatedStyle","useSharedValue","useDerivedValue","withSequence","withDelay","Easing","useAnimatedReaction","RefreshContainerContext","RefreshStatus","RefreshContainer","jsx","_jsx","jsxs","_jsxs","height","get","MAX_SCROLL_VELOCITY_Y","MIN_SCROLL_VELOCITY_Y","DEFAULT_TRIGGLE_HEIGHT","RESET_TIMING_EASING","bezier","MAX_BOUNCE_DISTANCE","RefreshFlatList","props","refreshing","onRefresh","refreshComponent","transitionY","triggleHeight","canOffset","bounces","onScroll","onScrollHandler","data","renderItem","keyExtractor","offsetY","scrollParentRef","scrollViewParentTransitionY","restProps","panRef","internalScrollRef","scrollRef","internalScrollViewParentTransitionY","scrollViewTransitionY","offset","scrollBounse","refreshStatus","Idle","scrollViewTotalHeight","scrollBeginTop","internalRefreshTransitionY","refreshTransitionY","direction","value","canRefresh","marginTop","console","log","Holding","Done","easing","handleOnRefresh","onBeginDrag","event","context","scrollBeginTime","Date","valueOf","scrollBeginY","contentOffset","y","nativeEvent","bounceDirection","endTime","velocityY","Math","min","abs","ratio","PI","bounceDistance","sin","duration","nativeRef","nativeGesture","Native","withRef","scrollToTopJS","current","scrollToOffset","animated","panGesture","Pan","activeOffsetY","simultaneousWithExternalGesture","onBegin","onUpdate","translationY","shouldAllowModify","OS","nextY","Reached","Pulling","onEnd","animatedStyle","transform","translateY","animatedScrollEnabled","animatedProps","top","scrollEnabled","scrollIndicatorInsets","left","bottom","right","derivedTransitionY","style","flex","children","Provider","gesture","FlatList","ref","overScrollMode","scrollEventThrottle","onContentSizeChange","_","h","offsetTop"],"sourceRoot":"..\\..\\..\\src","sources":["RefreshControl/RefreshFlatList.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
// RefreshFlatList.tsx
|
|
4
|
+
|
|
5
|
+
import React, { useCallback, useEffect, useRef } from 'react';
|
|
6
|
+
import { Dimensions, Platform } from 'react-native';
|
|
7
|
+
import { Gesture, GestureDetector, GestureHandlerRootView } from 'react-native-gesture-handler';
|
|
8
|
+
import Animated, { runOnJS, interpolate, useAnimatedScrollHandler, withTiming, useAnimatedProps, useAnimatedStyle, useSharedValue, useDerivedValue, withSequence, withDelay, Easing, useAnimatedReaction } from 'react-native-reanimated';
|
|
9
|
+
import { RefreshContainerContext, RefreshStatus } from "./type.js";
|
|
10
|
+
import RefreshContainer from "./RefreshContainer.js";
|
|
11
|
+
// 假设您不需要单独的 BottomContainer 组件,而是将加载更多内容放在 ListFooterComponent 中
|
|
12
|
+
|
|
13
|
+
// ------------------- 常量定义 -------------------
|
|
14
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
15
|
+
const {
|
|
16
|
+
height
|
|
17
|
+
} = Dimensions.get('window');
|
|
18
|
+
const MAX_SCROLL_VELOCITY_Y = 20;
|
|
19
|
+
const MIN_SCROLL_VELOCITY_Y = 0.5;
|
|
20
|
+
const DEFAULT_TRIGGLE_HEIGHT = 100;
|
|
21
|
+
const RESET_TIMING_EASING = Easing.bezier(0.33, 1, 0.68, 1);
|
|
22
|
+
const MAX_BOUNCE_DISTANCE = 100;
|
|
23
|
+
|
|
24
|
+
// ------------------- Props 定义 -------------------
|
|
25
|
+
|
|
26
|
+
const RefreshScrollList = props => {
|
|
27
|
+
const {
|
|
28
|
+
refreshing,
|
|
29
|
+
onRefresh,
|
|
30
|
+
refreshComponent,
|
|
31
|
+
triggleHeight = DEFAULT_TRIGGLE_HEIGHT,
|
|
32
|
+
canOffset = true,
|
|
33
|
+
bounces = true,
|
|
34
|
+
onScroll: onScrollHandler,
|
|
35
|
+
children,
|
|
36
|
+
offsetY = 0,
|
|
37
|
+
scrollViewParentTransitionY,
|
|
38
|
+
scrollParentRef,
|
|
39
|
+
...restProps
|
|
40
|
+
} = props;
|
|
41
|
+
|
|
42
|
+
// ------------------- Shared Values 和 Refs -------------------
|
|
43
|
+
const panRef = useRef(null);
|
|
44
|
+
const internalScrollRef = useRef(null);
|
|
45
|
+
const scrollRef = scrollParentRef || internalScrollRef;
|
|
46
|
+
|
|
47
|
+
// @ts-ignore
|
|
48
|
+
const nativeRef = useRef();
|
|
49
|
+
const nativeGesture = Gesture.Native().withRef(nativeRef);
|
|
50
|
+
const internalScrollViewParentTransitionY = useSharedValue(0);
|
|
51
|
+
const scrollViewTransitionY = scrollViewParentTransitionY || internalScrollViewParentTransitionY;
|
|
52
|
+
const refreshTransitionY = useSharedValue(0);
|
|
53
|
+
const offset = useSharedValue(0);
|
|
54
|
+
const scrollBounse = useSharedValue(false);
|
|
55
|
+
const refreshStatus = useSharedValue(RefreshStatus.Idle);
|
|
56
|
+
const scrollViewTotalHeight = useSharedValue(0);
|
|
57
|
+
const scrollBeginTop = useSharedValue(0);
|
|
58
|
+
|
|
59
|
+
// ------------------- Derived Values -------------------
|
|
60
|
+
const direction = useDerivedValue(() => {
|
|
61
|
+
return refreshTransitionY.value > 0 ? 1 : -1;
|
|
62
|
+
}, [refreshTransitionY]);
|
|
63
|
+
const canRefresh = useDerivedValue(() => {
|
|
64
|
+
const marginTop = scrollViewTransitionY.value;
|
|
65
|
+
// 核心:判断是否触顶 (下拉) 或触底 (上拉/加载更多)
|
|
66
|
+
return marginTop < 1;
|
|
67
|
+
});
|
|
68
|
+
useAnimatedReaction(() => refreshStatus.value, () => {});
|
|
69
|
+
|
|
70
|
+
// ------------------- Refreshing Side Effect -------------------
|
|
71
|
+
useEffect(() => {
|
|
72
|
+
if (refreshing) {
|
|
73
|
+
if (direction.value === 1) {
|
|
74
|
+
refreshStatus.value = RefreshStatus.Holding;
|
|
75
|
+
// 刷新中保持指示器在触发高度
|
|
76
|
+
refreshTransitionY.value = withTiming(triggleHeight * direction.value);
|
|
77
|
+
} else if (refreshStatus.value === RefreshStatus.Idle) {
|
|
78
|
+
// scrollRef.current?.scrollTo({
|
|
79
|
+
// y: 0,
|
|
80
|
+
// animated: false,
|
|
81
|
+
// });
|
|
82
|
+
refreshStatus.value = RefreshStatus.Holding;
|
|
83
|
+
refreshTransitionY.value = withTiming(triggleHeight);
|
|
84
|
+
}
|
|
85
|
+
} else if (refreshStatus.value !== RefreshStatus.Idle) {
|
|
86
|
+
if (direction.value === 1) {
|
|
87
|
+
// 下拉刷新完成,收起指示器
|
|
88
|
+
refreshStatus.value = RefreshStatus.Done;
|
|
89
|
+
refreshTransitionY.value = withDelay(500, withTiming(0, {
|
|
90
|
+
easing: RESET_TIMING_EASING
|
|
91
|
+
}, () => {
|
|
92
|
+
refreshStatus.value = RefreshStatus.Idle;
|
|
93
|
+
}));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}, [refreshing, direction.value, refreshStatus, refreshTransitionY, triggleHeight]);
|
|
97
|
+
const handleOnRefresh = useCallback(() => {
|
|
98
|
+
if (refreshing) return;
|
|
99
|
+
onRefresh && onRefresh();
|
|
100
|
+
}, [refreshing, onRefresh]);
|
|
101
|
+
|
|
102
|
+
// ------------------- Scroll Handler -------------------
|
|
103
|
+
const onScroll = useAnimatedScrollHandler({
|
|
104
|
+
onBeginDrag: (event, context) => {
|
|
105
|
+
context.scrollBeginTime = new Date().valueOf();
|
|
106
|
+
context.scrollBeginY = event.contentOffset.y;
|
|
107
|
+
},
|
|
108
|
+
onScroll: (event, context) => {
|
|
109
|
+
onScrollHandler && runOnJS(onScrollHandler)({
|
|
110
|
+
nativeEvent: event
|
|
111
|
+
});
|
|
112
|
+
const {
|
|
113
|
+
scrollBeginY,
|
|
114
|
+
scrollBeginTime
|
|
115
|
+
} = context;
|
|
116
|
+
scrollViewTransitionY.value = event.contentOffset.y;
|
|
117
|
+
// 滚动边界反弹动画逻辑
|
|
118
|
+
const marginTop = scrollViewTransitionY.value;
|
|
119
|
+
if (marginTop === 0 && !scrollBounse.value) {
|
|
120
|
+
const bounceDirection = marginTop === 0 ? 1 : -1;
|
|
121
|
+
const endTime = new Date().valueOf();
|
|
122
|
+
const velocityY = Math.min(Math.abs((scrollViewTransitionY.value - scrollBeginY) / (endTime - scrollBeginTime)), MAX_SCROLL_VELOCITY_Y);
|
|
123
|
+
if (!bounces || velocityY < MIN_SCROLL_VELOCITY_Y) return;
|
|
124
|
+
const ratio = Math.PI / 2 / MAX_SCROLL_VELOCITY_Y * velocityY;
|
|
125
|
+
const bounceDistance = height / 4 * Math.sin(ratio);
|
|
126
|
+
const duration = 100 + 100 * Math.sin(ratio * 2);
|
|
127
|
+
scrollBounse.value = true;
|
|
128
|
+
refreshTransitionY.value = withSequence(withTiming(bounceDistance * bounceDirection, {
|
|
129
|
+
duration
|
|
130
|
+
}), withTiming(0, {
|
|
131
|
+
duration,
|
|
132
|
+
easing: RESET_TIMING_EASING
|
|
133
|
+
}, () => {
|
|
134
|
+
scrollBounse.value = false;
|
|
135
|
+
}));
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
const scrollToTopJS = useCallback(() => {
|
|
140
|
+
// 检查 ref 是否存在
|
|
141
|
+
if (scrollRef.current) {
|
|
142
|
+
scrollRef.current.scrollTo({
|
|
143
|
+
y: 0,
|
|
144
|
+
animated: false
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}, [scrollRef]);
|
|
148
|
+
|
|
149
|
+
// ------------------- Pan Gesture -------------------
|
|
150
|
+
const panGesture = Gesture.Pan().withRef(panRef).activeOffsetY(10).simultaneousWithExternalGesture(nativeRef)
|
|
151
|
+
// 移除 activeOffsetY 或设置为极小值,让优先级完全由 requireExternalGestureToFail 决定
|
|
152
|
+
// 关键:与原生滚动同时进行,以便在触顶时接管
|
|
153
|
+
.onBegin(() => {
|
|
154
|
+
offset.value = refreshTransitionY.value;
|
|
155
|
+
scrollBeginTop.value = scrollViewTransitionY.value;
|
|
156
|
+
}).onUpdate(({
|
|
157
|
+
translationY
|
|
158
|
+
}) => {
|
|
159
|
+
const shouldAllowModify = canRefresh.value || refreshStatus.value !== RefreshStatus.Idle && translationY - scrollBeginTop.value >= 0;
|
|
160
|
+
if (!shouldAllowModify) {
|
|
161
|
+
refreshTransitionY.value = 0;
|
|
162
|
+
// 如果不在触顶区域且未处于刷新状态,则不修改位移
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
if (Platform.OS !== 'ios') runOnJS(scrollToTopJS)();
|
|
166
|
+
let nextY = offset.value + interpolate(translationY - scrollBeginTop.value, [0, height], [0, height / 2]
|
|
167
|
+
// 确保超过 height 时不会失控,但这里通常不需要
|
|
168
|
+
);
|
|
169
|
+
refreshTransitionY.value = Math.min(nextY, MAX_BOUNCE_DISTANCE);
|
|
170
|
+
if (!refreshing) {
|
|
171
|
+
if (Math.abs(refreshTransitionY.value) >= triggleHeight) {
|
|
172
|
+
refreshStatus.value = RefreshStatus.Reached;
|
|
173
|
+
} else {
|
|
174
|
+
refreshStatus.value = RefreshStatus.Pulling;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}).onEnd(() => {
|
|
178
|
+
if (refreshing) {
|
|
179
|
+
if (refreshTransitionY.value >= triggleHeight * direction.value) {
|
|
180
|
+
refreshTransitionY.value = withTiming(triggleHeight * direction.value);
|
|
181
|
+
} else {
|
|
182
|
+
``;
|
|
183
|
+
refreshTransitionY.value = withTiming(0);
|
|
184
|
+
}
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
if (Math.abs(refreshTransitionY.value) >= triggleHeight) {
|
|
188
|
+
if (refreshTransitionY.value > 0) {
|
|
189
|
+
runOnJS(handleOnRefresh)();
|
|
190
|
+
}
|
|
191
|
+
} else {
|
|
192
|
+
refreshTransitionY.value = withTiming(0, {
|
|
193
|
+
easing: RESET_TIMING_EASING
|
|
194
|
+
}, () => {
|
|
195
|
+
refreshStatus.value = RefreshStatus.Idle;
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
// ------------------- Animated Styles and Props -------------------
|
|
201
|
+
const animatedStyle = useAnimatedStyle(() => {
|
|
202
|
+
// 🌟 核心修复:这个 style 将应用于外部 Animated.View,实现整个列表的平移
|
|
203
|
+
return {
|
|
204
|
+
transform: [{
|
|
205
|
+
translateY: canOffset ? refreshTransitionY.value : 0
|
|
206
|
+
}]
|
|
207
|
+
};
|
|
208
|
+
});
|
|
209
|
+
const animatedScrollEnabled = useDerivedValue(() => {
|
|
210
|
+
if (Platform.OS === 'ios') return true;
|
|
211
|
+
return refreshTransitionY.value <= 0;
|
|
212
|
+
}, [refreshTransitionY]);
|
|
213
|
+
const animatedProps = useAnimatedProps(() => {
|
|
214
|
+
const top = -refreshTransitionY.value;
|
|
215
|
+
return {
|
|
216
|
+
scrollEnabled: animatedScrollEnabled.value,
|
|
217
|
+
scrollIndicatorInsets: {
|
|
218
|
+
top: top - 1,
|
|
219
|
+
left: 0,
|
|
220
|
+
bottom: 0,
|
|
221
|
+
right: 0
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
});
|
|
225
|
+
const derivedTransitionY = useDerivedValue(() => {
|
|
226
|
+
return refreshTransitionY.value + offsetY;
|
|
227
|
+
}, [offsetY]); // 依赖 offsetY,如果 offsetY 变化,重新计算
|
|
228
|
+
|
|
229
|
+
// ------------------- JSX 渲染 -------------------
|
|
230
|
+
return /*#__PURE__*/_jsx(GestureHandlerRootView, {
|
|
231
|
+
style: {
|
|
232
|
+
flex: 1
|
|
233
|
+
},
|
|
234
|
+
children: /*#__PURE__*/_jsxs(RefreshContainerContext.Provider, {
|
|
235
|
+
value: {
|
|
236
|
+
transitionY: refreshTransitionY,
|
|
237
|
+
scrollBounse,
|
|
238
|
+
triggleHeight,
|
|
239
|
+
refreshing,
|
|
240
|
+
refreshStatus,
|
|
241
|
+
direction,
|
|
242
|
+
canRefresh
|
|
243
|
+
},
|
|
244
|
+
children: [/*#__PURE__*/_jsx(GestureDetector, {
|
|
245
|
+
gesture: panGesture,
|
|
246
|
+
children: /*#__PURE__*/_jsx(GestureDetector, {
|
|
247
|
+
gesture: nativeGesture,
|
|
248
|
+
children: /*#__PURE__*/_jsx(Animated.ScrollView, {
|
|
249
|
+
ref: scrollRef,
|
|
250
|
+
bounces: false,
|
|
251
|
+
overScrollMode: 'never',
|
|
252
|
+
scrollEventThrottle: 16,
|
|
253
|
+
onScroll: onScroll,
|
|
254
|
+
animatedProps: animatedProps
|
|
255
|
+
// 移除 style={animatedStyle}
|
|
256
|
+
,
|
|
257
|
+
onContentSizeChange: (_, h) => {
|
|
258
|
+
scrollViewTotalHeight.value = h;
|
|
259
|
+
},
|
|
260
|
+
...restProps,
|
|
261
|
+
style: [{
|
|
262
|
+
flex: 1
|
|
263
|
+
}, animatedStyle] // 合并样式
|
|
264
|
+
,
|
|
265
|
+
children: children
|
|
266
|
+
})
|
|
267
|
+
})
|
|
268
|
+
}), /*#__PURE__*/_jsx(RefreshContainer, {
|
|
269
|
+
offsetTop: offsetY,
|
|
270
|
+
refreshStatus: refreshStatus,
|
|
271
|
+
transitionY: derivedTransitionY,
|
|
272
|
+
triggleHeight: triggleHeight + offsetY,
|
|
273
|
+
children: refreshComponent && refreshComponent()
|
|
274
|
+
})]
|
|
275
|
+
})
|
|
276
|
+
});
|
|
277
|
+
};
|
|
278
|
+
export default RefreshScrollList;
|
|
279
|
+
//# sourceMappingURL=RefreshScrollView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","useCallback","useEffect","useRef","Dimensions","Platform","Gesture","GestureDetector","GestureHandlerRootView","Animated","runOnJS","interpolate","useAnimatedScrollHandler","withTiming","useAnimatedProps","useAnimatedStyle","useSharedValue","useDerivedValue","withSequence","withDelay","Easing","useAnimatedReaction","RefreshContainerContext","RefreshStatus","RefreshContainer","jsx","_jsx","jsxs","_jsxs","height","get","MAX_SCROLL_VELOCITY_Y","MIN_SCROLL_VELOCITY_Y","DEFAULT_TRIGGLE_HEIGHT","RESET_TIMING_EASING","bezier","MAX_BOUNCE_DISTANCE","RefreshScrollList","props","refreshing","onRefresh","refreshComponent","triggleHeight","canOffset","bounces","onScroll","onScrollHandler","children","offsetY","scrollViewParentTransitionY","scrollParentRef","restProps","panRef","internalScrollRef","scrollRef","nativeRef","nativeGesture","Native","withRef","internalScrollViewParentTransitionY","scrollViewTransitionY","refreshTransitionY","offset","scrollBounse","refreshStatus","Idle","scrollViewTotalHeight","scrollBeginTop","direction","value","canRefresh","marginTop","Holding","Done","easing","handleOnRefresh","onBeginDrag","event","context","scrollBeginTime","Date","valueOf","scrollBeginY","contentOffset","y","nativeEvent","bounceDirection","endTime","velocityY","Math","min","abs","ratio","PI","bounceDistance","sin","duration","scrollToTopJS","current","scrollTo","animated","panGesture","Pan","activeOffsetY","simultaneousWithExternalGesture","onBegin","onUpdate","translationY","shouldAllowModify","OS","nextY","Reached","Pulling","onEnd","animatedStyle","transform","translateY","animatedScrollEnabled","animatedProps","top","scrollEnabled","scrollIndicatorInsets","left","bottom","right","derivedTransitionY","style","flex","Provider","transitionY","gesture","ScrollView","ref","overScrollMode","scrollEventThrottle","onContentSizeChange","_","h","offsetTop"],"sourceRoot":"..\\..\\..\\src","sources":["RefreshControl/RefreshScrollView.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import NormalControl from "./NormalControl.js";
|
|
4
|
+
import RefreshScrollView from "./RefreshScrollView.js";
|
|
5
|
+
import RefreshFlatList from "./RefreshFlatList.js";
|
|
6
|
+
export { RefreshScrollView, NormalControl, RefreshFlatList };
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["NormalControl","RefreshScrollView","RefreshFlatList"],"sourceRoot":"..\\..\\..\\src","sources":["RefreshControl/index.tsx"],"mappings":";;AAAA,OAAOA,aAAa,MAAM,oBAAiB;AAC3C,OAAOC,iBAAiB,MAAM,wBAAqB;AACnD,OAAOC,eAAe,MAAM,sBAAmB;AAE/C,SAASD,iBAAiB,EAAED,aAAa,EAAEE,eAAe","ignoreList":[]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { createContext, useContext } from 'react';
|
|
4
|
+
export const RefreshContainerContext = /*#__PURE__*/createContext({});
|
|
5
|
+
export const useRefreshScroll = () => useContext(RefreshContainerContext);
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Once Refresh LifeCycle:
|
|
9
|
+
* Idle -> Pulling -> Idle: Not reach triggleHeight, fail to refresh
|
|
10
|
+
* Idle -> Pulling -> Reached -> Holding -> Done -> Idle: A compelete refresh
|
|
11
|
+
*/
|
|
12
|
+
export let RefreshStatus = /*#__PURE__*/function (RefreshStatus) {
|
|
13
|
+
/**
|
|
14
|
+
* Refresh normal status
|
|
15
|
+
*/
|
|
16
|
+
RefreshStatus[RefreshStatus["Idle"] = 0] = "Idle";
|
|
17
|
+
/**
|
|
18
|
+
* Refresh is pulling down, and not reach triggleHeight
|
|
19
|
+
*/
|
|
20
|
+
RefreshStatus[RefreshStatus["Pulling"] = 1] = "Pulling";
|
|
21
|
+
/**
|
|
22
|
+
* Refresh is pulling down continue, and reached triggleHeight
|
|
23
|
+
*/
|
|
24
|
+
RefreshStatus[RefreshStatus["Reached"] = 2] = "Reached";
|
|
25
|
+
/**
|
|
26
|
+
* Refresh is Refreshing
|
|
27
|
+
*/
|
|
28
|
+
RefreshStatus[RefreshStatus["Holding"] = 3] = "Holding";
|
|
29
|
+
/**
|
|
30
|
+
* Refresh is done
|
|
31
|
+
*/
|
|
32
|
+
RefreshStatus[RefreshStatus["Done"] = 4] = "Done";
|
|
33
|
+
/**
|
|
34
|
+
* ScrollView Auto Load More
|
|
35
|
+
*/
|
|
36
|
+
RefreshStatus[RefreshStatus["AutoLoad"] = 5] = "AutoLoad";
|
|
37
|
+
return RefreshStatus;
|
|
38
|
+
}({});
|
|
39
|
+
//# sourceMappingURL=type.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createContext","useContext","RefreshContainerContext","useRefreshScroll","RefreshStatus"],"sourceRoot":"..\\..\\..\\src","sources":["RefreshControl/type.ts"],"mappings":";;AAAA,SAASA,aAAa,EAAEC,UAAU,QAAQ,OAAO;AAsCjD,OAAO,MAAMC,uBAAuB,gBAAGF,aAAa,CAClD,CAAC,CACH,CAAC;AACD,OAAO,MAAMG,gBAAgB,GAAGA,CAAA,KAAMF,UAAU,CAACC,uBAAuB,CAAC;;AAEzE;AACA;AACA;AACA;AACA;AACA,WAAYE,aAAa,0BAAbA,aAAa;EACvB;AACF;AACA;EAHYA,aAAa,CAAbA,aAAa;EAKvB;AACF;AACA;EAPYA,aAAa,CAAbA,aAAa;EASvB;AACF;AACA;EAXYA,aAAa,CAAbA,aAAa;EAavB;AACF;AACA;EAfYA,aAAa,CAAbA,aAAa;EAiBvB;AACF;AACA;EAnBYA,aAAa,CAAbA,aAAa;EAqBvB;AACF;AACA;EAvBYA,aAAa,CAAbA,aAAa;EAAA,OAAbA,aAAa;AAAA","ignoreList":[]}
|