react-native-reanimated-carousel 4.0.0-alpha.0 → 4.0.0-alpha.1
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/README.md +21 -160
- package/lib/commonjs/components/Carousel.js +231 -0
- package/lib/commonjs/components/Carousel.js.map +1 -0
- package/lib/commonjs/components/LazyView.js +22 -0
- package/lib/commonjs/components/LazyView.js.map +1 -0
- package/lib/commonjs/components/ScrollViewGesture.js +297 -0
- package/lib/commonjs/components/ScrollViewGesture.js.map +1 -0
- package/lib/commonjs/constants/index.js +21 -1
- package/lib/commonjs/constants/index.js.map +1 -1
- package/lib/commonjs/hooks/useAutoPlay.js +56 -1
- package/lib/commonjs/hooks/useAutoPlay.js.map +1 -1
- package/lib/commonjs/hooks/useCarouselController.js +244 -1
- package/lib/commonjs/hooks/useCarouselController.js.map +1 -1
- package/lib/commonjs/hooks/useCheckMounted.js +23 -1
- package/lib/commonjs/hooks/useCheckMounted.js.map +1 -1
- package/lib/commonjs/hooks/useCommonVariables.js +76 -1
- package/lib/commonjs/hooks/useCommonVariables.js.map +1 -1
- package/lib/commonjs/hooks/useInitProps.js +78 -1
- package/lib/commonjs/hooks/useInitProps.js.map +1 -1
- package/lib/commonjs/hooks/useLayoutConfig.js +39 -1
- package/lib/commonjs/hooks/useLayoutConfig.js.map +1 -1
- package/lib/commonjs/hooks/useOffsetX.js +48 -1
- package/lib/commonjs/hooks/useOffsetX.js.map +1 -1
- package/lib/commonjs/hooks/useOnProgressChange.js +38 -1
- package/lib/commonjs/hooks/useOnProgressChange.js.map +1 -1
- package/lib/commonjs/hooks/usePropsErrorBoundary.js +36 -1
- package/lib/commonjs/hooks/usePropsErrorBoundary.js.map +1 -1
- package/lib/commonjs/hooks/useUpdateGestureConfig.js +20 -0
- package/lib/commonjs/hooks/useUpdateGestureConfig.js.map +1 -0
- package/lib/commonjs/hooks/useVisibleRanges.js +42 -1
- package/lib/commonjs/hooks/useVisibleRanges.js.map +1 -1
- package/lib/commonjs/index.js +13 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/layouts/BaseLayout.js +110 -1
- package/lib/commonjs/layouts/BaseLayout.js.map +1 -1
- package/lib/commonjs/layouts/ParallaxLayout.js +83 -1
- package/lib/commonjs/layouts/ParallaxLayout.js.map +1 -1
- package/lib/commonjs/layouts/index.js +20 -1
- package/lib/commonjs/layouts/index.js.map +1 -1
- package/lib/commonjs/layouts/normal.js +27 -1
- package/lib/commonjs/layouts/normal.js.map +1 -1
- package/lib/commonjs/layouts/parallax.js +38 -1
- package/lib/commonjs/layouts/parallax.js.map +1 -1
- package/lib/commonjs/layouts/stack.js +215 -1
- package/lib/commonjs/layouts/stack.js.map +1 -1
- package/lib/commonjs/store/index.js +14 -1
- package/lib/commonjs/store/index.js.map +1 -1
- package/lib/commonjs/types.js +5 -1
- package/lib/commonjs/utils/computeNewIndexWhenDataChanges.js +52 -0
- package/lib/commonjs/utils/computeNewIndexWhenDataChanges.js.map +1 -0
- package/lib/commonjs/utils/computed-with-auto-fill-data.js +124 -0
- package/lib/commonjs/utils/computed-with-auto-fill-data.js.map +1 -0
- package/lib/commonjs/utils/deal-with-animation.js +21 -0
- package/lib/commonjs/utils/deal-with-animation.js.map +1 -0
- package/lib/commonjs/utils/handleroffset-direction.js +16 -0
- package/lib/commonjs/utils/handleroffset-direction.js.map +1 -0
- package/lib/commonjs/utils/index.test.js +74 -0
- package/lib/commonjs/utils/index.test.js.map +1 -0
- package/lib/commonjs/utils/log.js +22 -1
- package/lib/commonjs/utils/log.js.map +1 -1
- package/lib/module/{Carousel.js → components/Carousel.js} +11 -12
- package/lib/module/components/Carousel.js.map +1 -0
- package/lib/module/{ScrollViewGesture.js → components/ScrollViewGesture.js} +14 -6
- package/lib/module/components/ScrollViewGesture.js.map +1 -0
- package/lib/module/hooks/useCarouselController.js +3 -3
- package/lib/module/hooks/useCarouselController.js.map +1 -1
- package/lib/module/hooks/useCommonVariables.js +2 -2
- package/lib/module/hooks/useCommonVariables.js.map +1 -1
- package/lib/module/hooks/useInitProps.js +1 -3
- package/lib/module/hooks/useInitProps.js.map +1 -1
- package/lib/module/hooks/useOnProgressChange.js +1 -1
- package/lib/module/hooks/useOnProgressChange.js.map +1 -1
- package/lib/module/hooks/useUpdateGestureConfig.js +10 -0
- package/lib/module/hooks/useUpdateGestureConfig.js.map +1 -0
- package/lib/module/index.js +1 -2
- package/lib/module/index.js.map +1 -1
- package/lib/module/layouts/BaseLayout.js +1 -1
- package/lib/module/layouts/BaseLayout.js.map +1 -1
- package/lib/module/layouts/ParallaxLayout.js +1 -1
- package/lib/module/layouts/ParallaxLayout.js.map +1 -1
- package/lib/module/utils/{computedWithAutoFillData.js → computed-with-auto-fill-data.js} +1 -1
- package/lib/module/utils/computed-with-auto-fill-data.js.map +1 -0
- package/lib/module/utils/{dealWithAnimation.js → deal-with-animation.js} +1 -1
- package/lib/module/utils/deal-with-animation.js.map +1 -0
- package/lib/module/utils/{handlerOffsetDirection.js → handleroffset-direction.js} +1 -1
- package/lib/module/utils/handleroffset-direction.js.map +1 -0
- package/lib/typescript/{Carousel.d.ts → components/Carousel.d.ts} +1 -1
- package/lib/typescript/hooks/useUpdateGestureConfig.d.ts +4 -0
- package/lib/typescript/index.d.ts +2 -2
- package/lib/typescript/types.d.ts +103 -103
- package/package.json +18 -16
- package/src/{Carousel.tsx → components/Carousel.tsx} +13 -13
- package/src/{ScrollViewGesture.tsx → components/ScrollViewGesture.tsx} +30 -15
- package/src/hooks/useCarouselController.tsx +3 -3
- package/src/hooks/useCommonVariables.ts +2 -2
- package/src/hooks/useInitProps.ts +1 -3
- package/src/hooks/useOnProgressChange.ts +1 -1
- package/src/hooks/useUpdateGestureConfig.ts +13 -0
- package/src/index.tsx +2 -2
- package/src/layouts/BaseLayout.tsx +1 -1
- package/src/layouts/ParallaxLayout.tsx +1 -1
- package/src/types.ts +122 -124
- package/README.zh-CN.md +0 -202
- package/lib/commonjs/Carousel.js +0 -2
- package/lib/commonjs/Carousel.js.map +0 -1
- package/lib/commonjs/LazyView.js +0 -2
- package/lib/commonjs/LazyView.js.map +0 -1
- package/lib/commonjs/ScrollViewGesture.js +0 -2
- package/lib/commonjs/ScrollViewGesture.js.map +0 -1
- package/lib/commonjs/hooks/computeNewIndexWhenDataChanges.js +0 -2
- package/lib/commonjs/hooks/computeNewIndexWhenDataChanges.js.map +0 -1
- package/lib/commonjs/hooks/index.test.js +0 -2
- package/lib/commonjs/hooks/index.test.js.map +0 -1
- package/lib/commonjs/utils/computedWithAutoFillData.js +0 -2
- package/lib/commonjs/utils/computedWithAutoFillData.js.map +0 -1
- package/lib/commonjs/utils/dealWithAnimation.js +0 -2
- package/lib/commonjs/utils/dealWithAnimation.js.map +0 -1
- package/lib/commonjs/utils/handlerOffsetDirection.js +0 -2
- package/lib/commonjs/utils/handlerOffsetDirection.js.map +0 -1
- package/lib/module/Carousel.js.map +0 -1
- package/lib/module/ScrollViewGesture.js.map +0 -1
- package/lib/module/utils/computedWithAutoFillData.js.map +0 -1
- package/lib/module/utils/dealWithAnimation.js.map +0 -1
- package/lib/module/utils/handlerOffsetDirection.js.map +0 -1
- /package/lib/module/{LazyView.js → components/LazyView.js} +0 -0
- /package/lib/module/{LazyView.js.map → components/LazyView.js.map} +0 -0
- /package/lib/module/{hooks → utils}/computeNewIndexWhenDataChanges.js +0 -0
- /package/lib/module/{hooks → utils}/computeNewIndexWhenDataChanges.js.map +0 -0
- /package/lib/module/{hooks → utils}/index.test.js +0 -0
- /package/lib/module/{hooks → utils}/index.test.js.map +0 -0
- /package/lib/typescript/{LazyView.d.ts → components/LazyView.d.ts} +0 -0
- /package/lib/typescript/{ScrollViewGesture.d.ts → components/ScrollViewGesture.d.ts} +0 -0
- /package/lib/typescript/{hooks → utils}/computeNewIndexWhenDataChanges.d.ts +0 -0
- /package/lib/typescript/utils/{computedWithAutoFillData.d.ts → computed-with-auto-fill-data.d.ts} +0 -0
- /package/lib/typescript/utils/{dealWithAnimation.d.ts → deal-with-animation.d.ts} +0 -0
- /package/lib/typescript/utils/{handlerOffsetDirection.d.ts → handleroffset-direction.d.ts} +0 -0
- /package/lib/typescript/{hooks → utils}/index.test.d.ts +0 -0
- /package/src/{LazyView.tsx → components/LazyView.tsx} +0 -0
- /package/src/{hooks → utils}/computeNewIndexWhenDataChanges.ts +0 -0
- /package/src/utils/{computedWithAutoFillData.ts → computed-with-auto-fill-data.ts} +0 -0
- /package/src/utils/{dealWithAnimation.ts → deal-with-animation.ts} +0 -0
- /package/src/utils/{handlerOffsetDirection.ts → handleroffset-direction.ts} +0 -0
- /package/src/{hooks → utils}/index.test.ts +0 -0
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ScrollViewGesture = void 0;
|
|
7
|
+
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
|
|
10
|
+
var _reactNativeGestureHandler = require("react-native-gesture-handler");
|
|
11
|
+
|
|
12
|
+
var _reactNativeReanimated = _interopRequireWildcard(require("react-native-reanimated"));
|
|
13
|
+
|
|
14
|
+
var _constants = require("../constants");
|
|
15
|
+
|
|
16
|
+
var _useUpdateGestureConfig = require("../hooks/useUpdateGestureConfig");
|
|
17
|
+
|
|
18
|
+
var _store = require("../store");
|
|
19
|
+
|
|
20
|
+
var _dealWithAnimation = require("../utils/deal-with-animation");
|
|
21
|
+
|
|
22
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
23
|
+
|
|
24
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
25
|
+
|
|
26
|
+
const IScrollViewGesture = props => {
|
|
27
|
+
const {
|
|
28
|
+
props: {
|
|
29
|
+
onConfigurePanGesture,
|
|
30
|
+
vertical,
|
|
31
|
+
pagingEnabled,
|
|
32
|
+
snapEnabled,
|
|
33
|
+
loop: infinite,
|
|
34
|
+
scrollAnimationDuration,
|
|
35
|
+
withAnimation,
|
|
36
|
+
enabled,
|
|
37
|
+
dataLength,
|
|
38
|
+
overscrollEnabled,
|
|
39
|
+
maxScrollDistancePerSwipe
|
|
40
|
+
}
|
|
41
|
+
} = _react.default.useContext(_store.CTX);
|
|
42
|
+
|
|
43
|
+
const {
|
|
44
|
+
size,
|
|
45
|
+
translation,
|
|
46
|
+
testID,
|
|
47
|
+
style = {},
|
|
48
|
+
onScrollBegin,
|
|
49
|
+
onScrollEnd,
|
|
50
|
+
onTouchBegin,
|
|
51
|
+
onTouchEnd
|
|
52
|
+
} = props;
|
|
53
|
+
const maxPage = dataLength;
|
|
54
|
+
const isHorizontal = (0, _reactNativeReanimated.useDerivedValue)(() => !vertical, [vertical]);
|
|
55
|
+
const max = (0, _reactNativeReanimated.useSharedValue)(0);
|
|
56
|
+
const panOffset = (0, _reactNativeReanimated.useSharedValue)(0);
|
|
57
|
+
const touching = (0, _reactNativeReanimated.useSharedValue)(false);
|
|
58
|
+
const validStart = (0, _reactNativeReanimated.useSharedValue)(false);
|
|
59
|
+
const scrollEndTranslation = (0, _reactNativeReanimated.useSharedValue)(0);
|
|
60
|
+
const scrollEndVelocity = (0, _reactNativeReanimated.useSharedValue)(0);
|
|
61
|
+
const containerRef = (0, _reactNativeReanimated.useAnimatedRef)();
|
|
62
|
+
const maxScrollDistancePerSwipeIsSet = typeof maxScrollDistancePerSwipe === "number"; // Get the limit of the scroll.
|
|
63
|
+
|
|
64
|
+
const getLimit = _react.default.useCallback(() => {
|
|
65
|
+
"worklet";
|
|
66
|
+
|
|
67
|
+
if (!infinite && !overscrollEnabled) {
|
|
68
|
+
const {
|
|
69
|
+
width: containerWidth = 0
|
|
70
|
+
} = (0, _reactNativeReanimated.measure)(containerRef); // If the item's total width is less than the container's width, then there is no need to scroll.
|
|
71
|
+
|
|
72
|
+
if (dataLength * size < containerWidth) return 0; // Disable the "overscroll" effect
|
|
73
|
+
|
|
74
|
+
return dataLength * size - containerWidth;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return dataLength * size;
|
|
78
|
+
}, [infinite, size, dataLength, overscrollEnabled]);
|
|
79
|
+
|
|
80
|
+
const withSpring = _react.default.useCallback((toValue, onFinished) => {
|
|
81
|
+
"worklet";
|
|
82
|
+
|
|
83
|
+
const defaultWithAnimation = {
|
|
84
|
+
type: "timing",
|
|
85
|
+
config: {
|
|
86
|
+
duration: scrollAnimationDuration + 100,
|
|
87
|
+
easing: _constants.Easing.easeOutQuart
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
return (0, _dealWithAnimation.dealWithAnimation)(withAnimation !== null && withAnimation !== void 0 ? withAnimation : defaultWithAnimation)(toValue, isFinished => {
|
|
91
|
+
"worklet";
|
|
92
|
+
|
|
93
|
+
if (isFinished) onFinished && (0, _reactNativeReanimated.runOnJS)(onFinished)();
|
|
94
|
+
});
|
|
95
|
+
}, [scrollAnimationDuration, withAnimation]);
|
|
96
|
+
|
|
97
|
+
const endWithSpring = _react.default.useCallback(onFinished => {
|
|
98
|
+
"worklet";
|
|
99
|
+
|
|
100
|
+
const origin = translation.value;
|
|
101
|
+
const velocity = scrollEndVelocity.value; // Default to scroll in the direction of the slide (with deceleration)
|
|
102
|
+
|
|
103
|
+
let finalTranslation = (0, _reactNativeReanimated.withDecay)({
|
|
104
|
+
velocity,
|
|
105
|
+
deceleration: 0.999
|
|
106
|
+
}); // If the distance of the swipe exceeds the max scroll distance, keep the view at the current position
|
|
107
|
+
|
|
108
|
+
if (maxScrollDistancePerSwipeIsSet && Math.abs(scrollEndTranslation.value) > maxScrollDistancePerSwipe) {
|
|
109
|
+
finalTranslation = origin;
|
|
110
|
+
} else {
|
|
111
|
+
/**
|
|
112
|
+
* The page size is the same as the item size.
|
|
113
|
+
* If direction is vertical, the page size is the height of the item.
|
|
114
|
+
* If direction is horizontal, the page size is the width of the item.
|
|
115
|
+
*
|
|
116
|
+
* `page size` equals to `size` variable.
|
|
117
|
+
* */
|
|
118
|
+
if (pagingEnabled) {
|
|
119
|
+
// distance with direction
|
|
120
|
+
const offset = -(scrollEndTranslation.value >= 0 ? 1 : -1); // 1 or -1
|
|
121
|
+
|
|
122
|
+
const computed = offset < 0 ? Math.ceil : Math.floor;
|
|
123
|
+
const page = computed(-translation.value / size);
|
|
124
|
+
|
|
125
|
+
if (infinite) {
|
|
126
|
+
const finalPage = page + offset;
|
|
127
|
+
finalTranslation = withSpring(withProcessTranslation(-finalPage * size), onFinished);
|
|
128
|
+
} else {
|
|
129
|
+
const finalPage = Math.min(maxPage - 1, Math.max(0, page + offset));
|
|
130
|
+
finalTranslation = withSpring(withProcessTranslation(-finalPage * size), onFinished);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (!pagingEnabled && snapEnabled) {
|
|
135
|
+
// scroll to the nearest item
|
|
136
|
+
const nextPage = Math.round((origin + velocity * 0.4) / size) * size;
|
|
137
|
+
finalTranslation = withSpring(withProcessTranslation(nextPage), onFinished);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
translation.value = finalTranslation;
|
|
142
|
+
|
|
143
|
+
function withProcessTranslation(translation) {
|
|
144
|
+
if (!infinite && !overscrollEnabled) {
|
|
145
|
+
const limit = getLimit();
|
|
146
|
+
const sign = Math.sign(translation);
|
|
147
|
+
return sign * Math.max(0, Math.min(limit, Math.abs(translation)));
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return translation;
|
|
151
|
+
}
|
|
152
|
+
}, [withSpring, size, maxPage, infinite, snapEnabled, translation, pagingEnabled, scrollEndVelocity.value, maxScrollDistancePerSwipe, scrollEndTranslation.value, maxScrollDistancePerSwipeIsSet]);
|
|
153
|
+
|
|
154
|
+
const onFinish = _react.default.useCallback(isFinished => {
|
|
155
|
+
"worklet";
|
|
156
|
+
|
|
157
|
+
if (isFinished) {
|
|
158
|
+
touching.value = false;
|
|
159
|
+
onScrollEnd && (0, _reactNativeReanimated.runOnJS)(onScrollEnd)();
|
|
160
|
+
}
|
|
161
|
+
}, [onScrollEnd, touching]);
|
|
162
|
+
|
|
163
|
+
const activeDecay = _react.default.useCallback(() => {
|
|
164
|
+
"worklet";
|
|
165
|
+
|
|
166
|
+
touching.value = true;
|
|
167
|
+
translation.value = (0, _reactNativeReanimated.withDecay)({
|
|
168
|
+
velocity: scrollEndVelocity.value
|
|
169
|
+
}, isFinished => onFinish(isFinished));
|
|
170
|
+
}, [onFinish, scrollEndVelocity.value, touching, translation]);
|
|
171
|
+
|
|
172
|
+
const resetBoundary = _react.default.useCallback(() => {
|
|
173
|
+
"worklet";
|
|
174
|
+
|
|
175
|
+
if (touching.value) return;
|
|
176
|
+
|
|
177
|
+
if (translation.value > 0) {
|
|
178
|
+
if (scrollEndTranslation.value < 0) {
|
|
179
|
+
activeDecay();
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
if (!infinite) {
|
|
184
|
+
translation.value = withSpring(0);
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if (translation.value < -((maxPage - 1) * size)) {
|
|
190
|
+
if (scrollEndTranslation.value > 0) {
|
|
191
|
+
activeDecay();
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (!infinite) translation.value = withSpring(-((maxPage - 1) * size));
|
|
196
|
+
}
|
|
197
|
+
}, [touching.value, translation, maxPage, size, scrollEndTranslation.value, infinite, activeDecay, withSpring]);
|
|
198
|
+
|
|
199
|
+
(0, _reactNativeReanimated.useAnimatedReaction)(() => translation.value, () => {
|
|
200
|
+
if (!pagingEnabled) resetBoundary();
|
|
201
|
+
}, [pagingEnabled, resetBoundary]);
|
|
202
|
+
|
|
203
|
+
function withProcessTranslation(translation) {
|
|
204
|
+
"worklet";
|
|
205
|
+
|
|
206
|
+
if (!infinite && !overscrollEnabled) {
|
|
207
|
+
const limit = getLimit();
|
|
208
|
+
const sign = Math.sign(translation);
|
|
209
|
+
return sign * Math.max(0, Math.min(limit, Math.abs(translation)));
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
return translation;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
const onGestureBegin = (0, _react.useCallback)(() => {
|
|
216
|
+
"worklet";
|
|
217
|
+
|
|
218
|
+
touching.value = true;
|
|
219
|
+
validStart.value = true;
|
|
220
|
+
onScrollBegin && (0, _reactNativeReanimated.runOnJS)(onScrollBegin)();
|
|
221
|
+
max.value = (maxPage - 1) * size;
|
|
222
|
+
if (!infinite && !overscrollEnabled) max.value = getLimit();
|
|
223
|
+
panOffset.value = translation.value;
|
|
224
|
+
}, [max, size, maxPage, infinite, touching, panOffset, validStart, translation, overscrollEnabled, getLimit, onScrollBegin]);
|
|
225
|
+
const onGestureUpdate = (0, _react.useCallback)(e => {
|
|
226
|
+
"worklet";
|
|
227
|
+
|
|
228
|
+
if (validStart.value) {
|
|
229
|
+
validStart.value = false;
|
|
230
|
+
(0, _reactNativeReanimated.cancelAnimation)(translation);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
touching.value = true;
|
|
234
|
+
const {
|
|
235
|
+
translationX,
|
|
236
|
+
translationY
|
|
237
|
+
} = e;
|
|
238
|
+
const panTranslation = isHorizontal.value ? translationX : translationY;
|
|
239
|
+
|
|
240
|
+
if (!infinite) {
|
|
241
|
+
if (translation.value > 0 || translation.value < -max.value) {
|
|
242
|
+
const boundary = translation.value > 0 ? 0 : -max.value;
|
|
243
|
+
const fixed = boundary - panOffset.value;
|
|
244
|
+
const dynamic = panTranslation - fixed;
|
|
245
|
+
translation.value = boundary + dynamic * 0.5;
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
const translationValue = panOffset.value + panTranslation;
|
|
251
|
+
translation.value = translationValue;
|
|
252
|
+
}, [isHorizontal, max, panOffset, infinite, overscrollEnabled, translation, validStart, touching]);
|
|
253
|
+
const onGestureFinish = (0, _react.useCallback)(e => {
|
|
254
|
+
"worklet";
|
|
255
|
+
|
|
256
|
+
const {
|
|
257
|
+
velocityX,
|
|
258
|
+
velocityY,
|
|
259
|
+
translationX,
|
|
260
|
+
translationY
|
|
261
|
+
} = e;
|
|
262
|
+
scrollEndVelocity.value = isHorizontal.value ? velocityX : velocityY;
|
|
263
|
+
scrollEndTranslation.value = isHorizontal.value ? translationX : translationY;
|
|
264
|
+
const totalTranslation = scrollEndVelocity.value + scrollEndTranslation.value;
|
|
265
|
+
|
|
266
|
+
if (maxScrollDistancePerSwipeIsSet && Math.abs(totalTranslation) > maxScrollDistancePerSwipe) {
|
|
267
|
+
const nextPage = Math.round((panOffset.value + maxScrollDistancePerSwipe * Math.sign(totalTranslation)) / size) * size;
|
|
268
|
+
translation.value = withSpring(withProcessTranslation(nextPage), onScrollEnd);
|
|
269
|
+
} else {
|
|
270
|
+
endWithSpring(onScrollEnd);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
if (!infinite) touching.value = false;
|
|
274
|
+
}, [size, infinite, touching, panOffset, translation, isHorizontal, scrollEndVelocity, scrollEndTranslation, maxScrollDistancePerSwipeIsSet, maxScrollDistancePerSwipe, endWithSpring, withSpring, onScrollEnd]);
|
|
275
|
+
const gesture = (0, _react.useMemo)(() => {
|
|
276
|
+
const gesture = _reactNativeGestureHandler.Gesture.Pan().onBegin(onGestureBegin).onUpdate(onGestureUpdate).onEnd(onGestureFinish);
|
|
277
|
+
|
|
278
|
+
if (onConfigurePanGesture) onConfigurePanGesture(gesture);
|
|
279
|
+
return gesture;
|
|
280
|
+
}, [onGestureBegin, onGestureUpdate, onGestureFinish, onConfigurePanGesture]);
|
|
281
|
+
(0, _useUpdateGestureConfig.useUpdateGestureConfig)(gesture, {
|
|
282
|
+
enabled
|
|
283
|
+
});
|
|
284
|
+
return /*#__PURE__*/_react.default.createElement(_reactNativeGestureHandler.GestureDetector, {
|
|
285
|
+
gesture: gesture
|
|
286
|
+
}, /*#__PURE__*/_react.default.createElement(_reactNativeReanimated.default.View, {
|
|
287
|
+
ref: containerRef,
|
|
288
|
+
testID: testID,
|
|
289
|
+
style: style,
|
|
290
|
+
onTouchStart: onTouchBegin,
|
|
291
|
+
onTouchEnd: onTouchEnd
|
|
292
|
+
}, props.children));
|
|
293
|
+
};
|
|
294
|
+
|
|
295
|
+
const ScrollViewGesture = IScrollViewGesture;
|
|
296
|
+
exports.ScrollViewGesture = ScrollViewGesture;
|
|
297
|
+
//# sourceMappingURL=ScrollViewGesture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["ScrollViewGesture.tsx"],"names":["IScrollViewGesture","props","onConfigurePanGesture","vertical","pagingEnabled","snapEnabled","loop","infinite","scrollAnimationDuration","withAnimation","enabled","dataLength","overscrollEnabled","maxScrollDistancePerSwipe","React","useContext","CTX","size","translation","testID","style","onScrollBegin","onScrollEnd","onTouchBegin","onTouchEnd","maxPage","isHorizontal","max","panOffset","touching","validStart","scrollEndTranslation","scrollEndVelocity","containerRef","maxScrollDistancePerSwipeIsSet","getLimit","useCallback","width","containerWidth","withSpring","toValue","onFinished","defaultWithAnimation","type","config","duration","easing","Easing","easeOutQuart","isFinished","endWithSpring","origin","value","velocity","finalTranslation","deceleration","Math","abs","offset","computed","ceil","floor","page","finalPage","withProcessTranslation","min","nextPage","round","limit","sign","onFinish","activeDecay","resetBoundary","onGestureBegin","onGestureUpdate","e","translationX","translationY","panTranslation","boundary","fixed","dynamic","translationValue","onGestureFinish","velocityX","velocityY","totalTranslation","gesture","Gesture","Pan","onBegin","onUpdate","onEnd","children","ScrollViewGesture"],"mappings":"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","sourcesContent":["import type { PropsWithChildren } from \"react\";\nimport React, { useCallback, useMemo } from \"react\";\nimport type { StyleProp, ViewStyle } from \"react-native\";\nimport type { GestureStateChangeEvent, PanGestureHandlerEventPayload } from \"react-native-gesture-handler\";\nimport {\n Gesture,\n GestureDetector,\n} from \"react-native-gesture-handler\";\nimport Animated, {\n cancelAnimation,\n measure,\n runOnJS,\n useAnimatedReaction,\n useAnimatedRef,\n useDerivedValue,\n useSharedValue,\n withDecay,\n} from \"react-native-reanimated\";\n\nimport { Easing } from \"../constants\";\nimport { useUpdateGestureConfig } from \"../hooks/useUpdateGestureConfig\";\nimport { CTX } from \"../store\";\nimport type { WithTimingAnimation } from \"../types\";\nimport { dealWithAnimation } from \"../utils/deal-with-animation\";\n\ninterface Props {\n size: number\n infinite?: boolean\n testID?: string\n style?: StyleProp<ViewStyle>\n onScrollBegin?: () => void\n onScrollEnd?: () => void\n onTouchBegin?: () => void\n onTouchEnd?: () => void\n translation: Animated.SharedValue<number>\n}\n\nconst IScrollViewGesture: React.FC<PropsWithChildren<Props>> = (props) => {\n const {\n props: {\n onConfigurePanGesture,\n vertical,\n pagingEnabled,\n snapEnabled,\n loop: infinite,\n scrollAnimationDuration,\n withAnimation,\n enabled,\n dataLength,\n overscrollEnabled,\n maxScrollDistancePerSwipe,\n },\n } = React.useContext(CTX);\n\n const {\n size,\n translation,\n testID,\n style = {},\n onScrollBegin,\n onScrollEnd,\n onTouchBegin,\n onTouchEnd,\n } = props;\n\n const maxPage = dataLength;\n const isHorizontal = useDerivedValue(() => !vertical, [vertical]);\n const max = useSharedValue(0);\n const panOffset = useSharedValue(0);\n const touching = useSharedValue(false);\n const validStart = useSharedValue(false);\n const scrollEndTranslation = useSharedValue(0);\n const scrollEndVelocity = useSharedValue(0);\n const containerRef = useAnimatedRef<Animated.View>();\n const maxScrollDistancePerSwipeIsSet = typeof maxScrollDistancePerSwipe === \"number\";\n\n // Get the limit of the scroll.\n const getLimit = React.useCallback(() => {\n \"worklet\";\n\n if (!infinite && !overscrollEnabled) {\n const { width: containerWidth = 0 } = measure(containerRef);\n\n // If the item's total width is less than the container's width, then there is no need to scroll.\n if (dataLength * size < containerWidth)\n return 0;\n\n // Disable the \"overscroll\" effect\n return dataLength * size - containerWidth;\n }\n\n return dataLength * size;\n }, [infinite, size, dataLength, overscrollEnabled]);\n\n const withSpring = React.useCallback(\n (toValue: number, onFinished?: () => void) => {\n \"worklet\";\n const defaultWithAnimation: WithTimingAnimation = {\n type: \"timing\",\n config: {\n duration: scrollAnimationDuration + 100,\n easing: Easing.easeOutQuart,\n },\n };\n\n return dealWithAnimation(withAnimation ?? defaultWithAnimation)(\n toValue,\n (isFinished: boolean) => {\n \"worklet\";\n if (isFinished)\n onFinished && runOnJS(onFinished)();\n },\n );\n },\n [scrollAnimationDuration, withAnimation],\n );\n\n const endWithSpring = React.useCallback(\n (onFinished?: () => void) => {\n \"worklet\";\n const origin = translation.value;\n const velocity = scrollEndVelocity.value;\n // Default to scroll in the direction of the slide (with deceleration)\n let finalTranslation: number = withDecay({ velocity, deceleration: 0.999 });\n\n // If the distance of the swipe exceeds the max scroll distance, keep the view at the current position\n if (maxScrollDistancePerSwipeIsSet && Math.abs(scrollEndTranslation.value) > maxScrollDistancePerSwipe) {\n finalTranslation = origin;\n }\n else {\n /**\n * The page size is the same as the item size.\n * If direction is vertical, the page size is the height of the item.\n * If direction is horizontal, the page size is the width of the item.\n *\n * `page size` equals to `size` variable.\n * */\n if (pagingEnabled) {\n // distance with direction\n const offset = -(scrollEndTranslation.value >= 0 ? 1 : -1); // 1 or -1\n const computed = offset < 0 ? Math.ceil : Math.floor;\n const page = computed(-translation.value / size);\n\n if (infinite) {\n const finalPage = page + offset;\n finalTranslation = withSpring(withProcessTranslation(-finalPage * size), onFinished);\n }\n else {\n const finalPage = Math.min(maxPage - 1, Math.max(0, page + offset));\n finalTranslation = withSpring(withProcessTranslation(-finalPage * size), onFinished);\n }\n }\n\n if (!pagingEnabled && snapEnabled) {\n // scroll to the nearest item\n const nextPage = Math.round((origin + velocity * 0.4) / size) * size;\n finalTranslation = withSpring(withProcessTranslation(nextPage), onFinished);\n }\n }\n\n translation.value = finalTranslation;\n\n function withProcessTranslation(translation: number) {\n if (!infinite && !overscrollEnabled) {\n const limit = getLimit();\n const sign = Math.sign(translation);\n return sign * Math.max(0, Math.min(limit, Math.abs(translation)));\n }\n\n return translation;\n }\n },\n [\n withSpring,\n size,\n maxPage,\n infinite,\n snapEnabled,\n translation,\n pagingEnabled,\n scrollEndVelocity.value,\n maxScrollDistancePerSwipe,\n scrollEndTranslation.value,\n maxScrollDistancePerSwipeIsSet,\n ],\n );\n\n const onFinish = React.useCallback(\n (isFinished: boolean) => {\n \"worklet\";\n if (isFinished) {\n touching.value = false;\n onScrollEnd && runOnJS(onScrollEnd)();\n }\n },\n [onScrollEnd, touching],\n );\n\n const activeDecay = React.useCallback(() => {\n \"worklet\";\n touching.value = true;\n translation.value = withDecay(\n { velocity: scrollEndVelocity.value },\n isFinished => onFinish(isFinished as boolean),\n );\n }, [onFinish, scrollEndVelocity.value, touching, translation]);\n\n const resetBoundary = React.useCallback(() => {\n \"worklet\";\n if (touching.value)\n return;\n\n if (translation.value > 0) {\n if (scrollEndTranslation.value < 0) {\n activeDecay();\n return;\n }\n if (!infinite) {\n translation.value = withSpring(0);\n return;\n }\n }\n\n if (translation.value < -((maxPage - 1) * size)) {\n if (scrollEndTranslation.value > 0) {\n activeDecay();\n return;\n }\n if (!infinite)\n translation.value = withSpring(-((maxPage - 1) * size));\n }\n }, [\n touching.value,\n translation,\n maxPage,\n size,\n scrollEndTranslation.value,\n infinite,\n activeDecay,\n withSpring,\n ]);\n\n useAnimatedReaction(\n () => translation.value,\n () => {\n if (!pagingEnabled)\n resetBoundary();\n },\n [pagingEnabled, resetBoundary],\n );\n\n function withProcessTranslation(translation: number) {\n \"worklet\";\n\n if (!infinite && !overscrollEnabled) {\n const limit = getLimit();\n const sign = Math.sign(translation);\n return sign * Math.max(0, Math.min(limit, Math.abs(translation)));\n }\n\n return translation;\n }\n\n const onGestureBegin = useCallback(() => {\n \"worklet\";\n\n touching.value = true;\n validStart.value = true;\n onScrollBegin && runOnJS(onScrollBegin)();\n\n max.value = (maxPage - 1) * size;\n if (!infinite && !overscrollEnabled)\n max.value = getLimit();\n\n panOffset.value = translation.value;\n }, [\n max,\n size,\n maxPage,\n infinite,\n touching,\n panOffset,\n validStart,\n translation,\n overscrollEnabled,\n getLimit,\n onScrollBegin,\n ]);\n\n const onGestureUpdate = useCallback((e: PanGestureHandlerEventPayload) => {\n \"worklet\";\n\n if (validStart.value) {\n validStart.value = false;\n cancelAnimation(translation);\n }\n touching.value = true;\n const { translationX, translationY } = e;\n const panTranslation = isHorizontal.value\n ? translationX\n : translationY;\n if (!infinite) {\n if ((translation.value > 0 || translation.value < -max.value)) {\n const boundary = translation.value > 0 ? 0 : -max.value;\n const fixed = boundary - panOffset.value;\n const dynamic = panTranslation - fixed;\n translation.value = boundary + dynamic * 0.5;\n return;\n }\n }\n\n const translationValue = panOffset.value + panTranslation;\n translation.value = translationValue;\n }, [\n isHorizontal,\n max,\n panOffset,\n infinite,\n overscrollEnabled,\n translation,\n validStart,\n touching,\n ]);\n\n const onGestureFinish = useCallback((e: GestureStateChangeEvent<PanGestureHandlerEventPayload>) => {\n \"worklet\";\n\n const { velocityX, velocityY, translationX, translationY } = e;\n scrollEndVelocity.value = isHorizontal.value\n ? velocityX\n : velocityY;\n scrollEndTranslation.value = isHorizontal.value\n ? translationX\n : translationY;\n\n const totalTranslation = scrollEndVelocity.value + scrollEndTranslation.value;\n\n if (maxScrollDistancePerSwipeIsSet && Math.abs(totalTranslation) > maxScrollDistancePerSwipe) {\n const nextPage = Math.round((panOffset.value + maxScrollDistancePerSwipe * Math.sign(totalTranslation)) / size) * size;\n translation.value = withSpring(withProcessTranslation(nextPage), onScrollEnd);\n }\n else {\n endWithSpring(onScrollEnd);\n }\n\n if (!infinite)\n touching.value = false;\n }, [\n size,\n infinite,\n touching,\n panOffset,\n translation,\n isHorizontal,\n scrollEndVelocity,\n scrollEndTranslation,\n maxScrollDistancePerSwipeIsSet,\n maxScrollDistancePerSwipe,\n endWithSpring,\n withSpring,\n onScrollEnd,\n ]);\n\n const gesture = useMemo(() => {\n const gesture = Gesture.Pan()\n .onBegin(onGestureBegin)\n .onUpdate(onGestureUpdate)\n .onEnd(onGestureFinish);\n\n if (onConfigurePanGesture)\n onConfigurePanGesture(gesture);\n\n return gesture;\n },\n [\n onGestureBegin,\n onGestureUpdate,\n onGestureFinish,\n onConfigurePanGesture,\n ]);\n\n useUpdateGestureConfig(gesture, { enabled });\n\n return (\n <GestureDetector gesture={gesture}>\n <Animated.View\n ref={containerRef}\n testID={testID}\n style={style}\n onTouchStart={onTouchBegin}\n onTouchEnd={onTouchEnd}\n >\n {props.children}\n </Animated.View>\n </GestureDetector>\n );\n};\n\nexport const ScrollViewGesture = IScrollViewGesture;\n"]}
|
|
@@ -1,2 +1,22 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.Easing = exports.DATA_LENGTH = void 0;
|
|
7
|
+
|
|
8
|
+
var _reactNativeReanimated = require("react-native-reanimated");
|
|
9
|
+
|
|
10
|
+
let DATA_LENGTH;
|
|
11
|
+
exports.DATA_LENGTH = DATA_LENGTH;
|
|
12
|
+
|
|
13
|
+
(function (DATA_LENGTH) {
|
|
14
|
+
DATA_LENGTH[DATA_LENGTH["SINGLE_ITEM"] = 1] = "SINGLE_ITEM";
|
|
15
|
+
DATA_LENGTH[DATA_LENGTH["DOUBLE_ITEM"] = 2] = "DOUBLE_ITEM";
|
|
16
|
+
})(DATA_LENGTH || (exports.DATA_LENGTH = DATA_LENGTH = {}));
|
|
17
|
+
|
|
18
|
+
const Easing = {
|
|
19
|
+
easeOutQuart: _reactNativeReanimated.Easing.bezier(0.25, 1, 0.5, 1)
|
|
20
|
+
};
|
|
21
|
+
exports.Easing = Easing;
|
|
2
22
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["index.ts"],"names":["DATA_LENGTH","Easing","easeOutQuart","_Easing","bezier"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["index.ts"],"names":["DATA_LENGTH","Easing","easeOutQuart","_Easing","bezier"],"mappings":";;;;;;;AACA;;IAEYA,W;;;WAAAA,W;AAAAA,EAAAA,W,CAAAA,W;AAAAA,EAAAA,W,CAAAA,W;GAAAA,W,2BAAAA,W;;AAKL,MAAMC,MAAM,GAAG;AACpBC,EAAAA,YAAY,EAAEC,8BAAQC,MAAR,CACZ,IADY,EAEZ,CAFY,EAGZ,GAHY,EAIZ,CAJY;AADM,CAAf","sourcesContent":["import type Animated from \"react-native-reanimated\";\nimport { Easing as _Easing } from \"react-native-reanimated\";\n\nexport enum DATA_LENGTH {\n SINGLE_ITEM = 1,\n DOUBLE_ITEM = 2,\n}\n\nexport const Easing = {\n easeOutQuart: _Easing.bezier(\n 0.25,\n 1,\n 0.5,\n 1,\n ) as unknown as Animated.EasingFunction,\n};\n"]}
|
|
@@ -1,2 +1,57 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useAutoPlay = useAutoPlay;
|
|
7
|
+
|
|
8
|
+
var React = _interopRequireWildcard(require("react"));
|
|
9
|
+
|
|
10
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
11
|
+
|
|
12
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
13
|
+
|
|
14
|
+
function useAutoPlay(opts) {
|
|
15
|
+
const {
|
|
16
|
+
autoPlay = false,
|
|
17
|
+
autoPlayReverse = false,
|
|
18
|
+
autoPlayInterval,
|
|
19
|
+
carouselController
|
|
20
|
+
} = opts;
|
|
21
|
+
const {
|
|
22
|
+
prev,
|
|
23
|
+
next
|
|
24
|
+
} = carouselController;
|
|
25
|
+
const timer = React.useRef();
|
|
26
|
+
const stopped = React.useRef(!autoPlay);
|
|
27
|
+
const play = React.useCallback(() => {
|
|
28
|
+
if (stopped.current) return;
|
|
29
|
+
timer.current && clearTimeout(timer.current);
|
|
30
|
+
timer.current = setTimeout(() => {
|
|
31
|
+
autoPlayReverse ? prev({
|
|
32
|
+
onFinished: play
|
|
33
|
+
}) : next({
|
|
34
|
+
onFinished: play
|
|
35
|
+
});
|
|
36
|
+
}, autoPlayInterval);
|
|
37
|
+
}, [autoPlayReverse, autoPlayInterval, prev, next]);
|
|
38
|
+
const pause = React.useCallback(() => {
|
|
39
|
+
if (!autoPlay) return;
|
|
40
|
+
timer.current && clearTimeout(timer.current);
|
|
41
|
+
stopped.current = true;
|
|
42
|
+
}, [autoPlay]);
|
|
43
|
+
const start = React.useCallback(() => {
|
|
44
|
+
if (!autoPlay) return;
|
|
45
|
+
stopped.current = false;
|
|
46
|
+
play();
|
|
47
|
+
}, [play, autoPlay]);
|
|
48
|
+
React.useEffect(() => {
|
|
49
|
+
if (autoPlay) start();else pause();
|
|
50
|
+
return pause;
|
|
51
|
+
}, [pause, start, autoPlay]);
|
|
52
|
+
return {
|
|
53
|
+
pause,
|
|
54
|
+
start
|
|
55
|
+
};
|
|
56
|
+
}
|
|
2
57
|
//# sourceMappingURL=useAutoPlay.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useAutoPlay.ts"],"names":["useAutoPlay","opts","autoPlay","autoPlayReverse","autoPlayInterval","carouselController","prev","next","timer","React","useRef","stopped","play","useCallback","current","clearTimeout","setTimeout","onFinished","pause","start","useEffect"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["useAutoPlay.ts"],"names":["useAutoPlay","opts","autoPlay","autoPlayReverse","autoPlayInterval","carouselController","prev","next","timer","React","useRef","stopped","play","useCallback","current","clearTimeout","setTimeout","onFinished","pause","start","useEffect"],"mappings":";;;;;;;AAAA;;;;;;AAIO,SAASA,WAAT,CAAqBC,IAArB,EAKJ;AACD,QAAM;AACJC,IAAAA,QAAQ,GAAG,KADP;AAEJC,IAAAA,eAAe,GAAG,KAFd;AAGJC,IAAAA,gBAHI;AAIJC,IAAAA;AAJI,MAKFJ,IALJ;AAOA,QAAM;AAAEK,IAAAA,IAAF;AAAQC,IAAAA;AAAR,MAAiBF,kBAAvB;AACA,QAAMG,KAAK,GAAGC,KAAK,CAACC,MAAN,EAAd;AACA,QAAMC,OAAO,GAAGF,KAAK,CAACC,MAAN,CAAsB,CAACR,QAAvB,CAAhB;AAEA,QAAMU,IAAI,GAAGH,KAAK,CAACI,WAAN,CAAkB,MAAM;AACnC,QAAIF,OAAO,CAACG,OAAZ,EACE;AAEFN,IAAAA,KAAK,CAACM,OAAN,IAAiBC,YAAY,CAACP,KAAK,CAACM,OAAP,CAA7B;AACAN,IAAAA,KAAK,CAACM,OAAN,GAAgBE,UAAU,CAAC,MAAM;AAC/Bb,MAAAA,eAAe,GACXG,IAAI,CAAC;AAAEW,QAAAA,UAAU,EAAEL;AAAd,OAAD,CADO,GAEXL,IAAI,CAAC;AAAEU,QAAAA,UAAU,EAAEL;AAAd,OAAD,CAFR;AAGD,KAJyB,EAIvBR,gBAJuB,CAA1B;AAKD,GAVY,EAUV,CAACD,eAAD,EAAkBC,gBAAlB,EAAoCE,IAApC,EAA0CC,IAA1C,CAVU,CAAb;AAYA,QAAMW,KAAK,GAAGT,KAAK,CAACI,WAAN,CAAkB,MAAM;AACpC,QAAI,CAACX,QAAL,EACE;AAEFM,IAAAA,KAAK,CAACM,OAAN,IAAiBC,YAAY,CAACP,KAAK,CAACM,OAAP,CAA7B;AACAH,IAAAA,OAAO,CAACG,OAAR,GAAkB,IAAlB;AACD,GANa,EAMX,CAACZ,QAAD,CANW,CAAd;AAQA,QAAMiB,KAAK,GAAGV,KAAK,CAACI,WAAN,CAAkB,MAAM;AACpC,QAAI,CAACX,QAAL,EACE;AAEFS,IAAAA,OAAO,CAACG,OAAR,GAAkB,KAAlB;AACAF,IAAAA,IAAI;AACL,GANa,EAMX,CAACA,IAAD,EAAOV,QAAP,CANW,CAAd;AAQAO,EAAAA,KAAK,CAACW,SAAN,CAAgB,MAAM;AACpB,QAAIlB,QAAJ,EACEiB,KAAK,GADP,KAGED,KAAK;AAEP,WAAOA,KAAP;AACD,GAPD,EAOG,CAACA,KAAD,EAAQC,KAAR,EAAejB,QAAf,CAPH;AASA,SAAO;AACLgB,IAAAA,KADK;AAELC,IAAAA;AAFK,GAAP;AAID","sourcesContent":["import * as React from \"react\";\n\nimport type { ICarouselController } from \"./useCarouselController\";\n\nexport function useAutoPlay(opts: {\n autoPlay?: boolean\n autoPlayInterval?: number\n autoPlayReverse?: boolean\n carouselController: ICarouselController\n}) {\n const {\n autoPlay = false,\n autoPlayReverse = false,\n autoPlayInterval,\n carouselController,\n } = opts;\n\n const { prev, next } = carouselController;\n const timer = React.useRef<ReturnType<typeof setTimeout>>();\n const stopped = React.useRef<boolean>(!autoPlay);\n\n const play = React.useCallback(() => {\n if (stopped.current)\n return;\n\n timer.current && clearTimeout(timer.current);\n timer.current = setTimeout(() => {\n autoPlayReverse\n ? prev({ onFinished: play })\n : next({ onFinished: play });\n }, autoPlayInterval);\n }, [autoPlayReverse, autoPlayInterval, prev, next]);\n\n const pause = React.useCallback(() => {\n if (!autoPlay)\n return;\n\n timer.current && clearTimeout(timer.current);\n stopped.current = true;\n }, [autoPlay]);\n\n const start = React.useCallback(() => {\n if (!autoPlay)\n return;\n\n stopped.current = false;\n play();\n }, [play, autoPlay]);\n\n React.useEffect(() => {\n if (autoPlay)\n start();\n else\n pause();\n\n return pause;\n }, [pause, start, autoPlay]);\n\n return {\n pause,\n start,\n };\n}\n"]}
|