react-native-reanimated-carousel 2.1.2 → 2.2.4
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 +10 -7
- package/README.zh-CN.md +11 -5
- package/lib/commonjs/Carousel.js +29 -21
- package/lib/commonjs/Carousel.js.map +1 -1
- package/lib/commonjs/ScrollViewGesture.js +29 -21
- package/lib/commonjs/ScrollViewGesture.js.map +1 -1
- package/lib/commonjs/hooks/useAutoPlay.js +27 -13
- package/lib/commonjs/hooks/useAutoPlay.js.map +1 -1
- package/lib/commonjs/hooks/useCarouselController.js +84 -24
- package/lib/commonjs/hooks/useCarouselController.js.map +1 -1
- package/lib/commonjs/hooks/useInitProps.js +13 -9
- package/lib/commonjs/hooks/useInitProps.js.map +1 -1
- package/lib/commonjs/hooks/useOnProgressChange.js +5 -5
- package/lib/commonjs/hooks/useOnProgressChange.js.map +1 -1
- package/lib/commonjs/layouts/stack.js.map +1 -1
- package/lib/module/Carousel.js +26 -21
- package/lib/module/Carousel.js.map +1 -1
- package/lib/module/ScrollViewGesture.js +27 -21
- package/lib/module/ScrollViewGesture.js.map +1 -1
- package/lib/module/hooks/useAutoPlay.js +27 -13
- package/lib/module/hooks/useAutoPlay.js.map +1 -1
- package/lib/module/hooks/useCarouselController.js +82 -24
- package/lib/module/hooks/useCarouselController.js.map +1 -1
- package/lib/module/hooks/useInitProps.js +13 -9
- package/lib/module/hooks/useInitProps.js.map +1 -1
- package/lib/module/hooks/useOnProgressChange.js +5 -5
- package/lib/module/hooks/useOnProgressChange.js.map +1 -1
- package/lib/module/layouts/stack.js.map +1 -1
- package/lib/typescript/Carousel.d.ts +3 -4
- package/lib/typescript/ScrollViewGesture.d.ts +3 -1
- package/lib/typescript/hooks/useAutoPlay.d.ts +1 -1
- package/lib/typescript/hooks/useCarouselController.d.ts +5 -3
- package/lib/typescript/hooks/useInitProps.d.ts +4 -5
- package/lib/typescript/hooks/useOnProgressChange.d.ts +2 -1
- package/lib/typescript/layouts/stack.d.ts +1 -1
- package/lib/typescript/types.d.ts +22 -4
- package/package.json +5 -2
- package/src/Carousel.tsx +203 -185
- package/src/ScrollViewGesture.tsx +52 -25
- package/src/hooks/useAutoPlay.ts +25 -22
- package/src/hooks/useCarouselController.tsx +101 -42
- package/src/hooks/useInitProps.ts +30 -15
- package/src/hooks/useOnProgressChange.ts +7 -6
- package/src/layouts/stack.ts +1 -1
- package/src/types.ts +23 -4
- package/CHANGELOG.md +0 -361
- package/lib/commonjs/hooks/useIndexController.js +0 -65
- package/lib/commonjs/hooks/useIndexController.js.map +0 -1
- package/lib/module/hooks/useIndexController.js +0 -52
- package/lib/module/hooks/useIndexController.js.map +0 -1
- package/lib/typescript/hooks/useIndexController.d.ts +0 -18
- package/src/.DS_Store +0 -0
- package/src/hooks/useIndexController.ts +0 -78
package/README.md
CHANGED
|
@@ -2,9 +2,9 @@ English | [简体中文](./README.zh-CN.md)
|
|
|
2
2
|
|
|
3
3
|
# react-native-reanimated-carousel
|
|
4
4
|
|
|
5
|
-
<img src="assets/banner.png" width="100%"/>
|
|
5
|
+
<img src="assets/home-banner.png" width="100%"/>
|
|
6
6
|
|
|
7
|
-

|
|
7
|
+

|
|
8
8
|
[](https://www.npmjs.com/package/react-native-reanimated-carousel)
|
|
9
9
|
[](https://www.npmjs.com/package/react-native-reanimated-carousel)
|
|
10
10
|
[](https://www.npmjs.com/package/react-native-reanimated-carousel)
|
|
@@ -17,9 +17,11 @@ English | [简体中文](./README.zh-CN.md)
|
|
|
17
17
|
- **It completely solves this** [[problem]](https://github.com/meliorence/react-native-snap-carousel/issues/632) **for `react-native-snap-carousel`!**
|
|
18
18
|
- **Simple**、**Infinitely scrolling very smooth**、**Fully implemented using Reanimated 2!**
|
|
19
19
|
|
|
20
|
-
>
|
|
20
|
+
> V2 has been released! Join it! [[v1 docs]](https://github.com/dohooo/react-native-reanimated-carousel/tree/v1.x.x)
|
|
21
21
|
|
|
22
|
-
>
|
|
22
|
+
> Support to Web [[demo]](https://dohooo.github.io/react-native-reanimated-carousel/)
|
|
23
|
+
|
|
24
|
+
> Click on the image to see the code snippets. [[Try it]](https://snack.expo.dev/@zhaodonghao586/simple-carousel) 🍺
|
|
23
25
|
|
|
24
26
|
<p align="center">
|
|
25
27
|
<a href="./example/src/normal/index.tsx">
|
|
@@ -140,15 +142,16 @@ import Carousel from 'react-native-reanimated-carousel';
|
|
|
140
142
|
</details>
|
|
141
143
|
|
|
142
144
|
## Example
|
|
143
|
-
|
|
145
|
+
> `:pretty` use pretty images
|
|
144
146
|
```shell
|
|
145
147
|
yarn ios
|
|
146
|
-
# use pretty images
|
|
147
148
|
yarn ios:pretty
|
|
148
149
|
|
|
149
150
|
yarn android
|
|
150
|
-
# use pretty images
|
|
151
151
|
yarn android:pretty
|
|
152
|
+
|
|
153
|
+
yarn web
|
|
154
|
+
yarn web:pretty
|
|
152
155
|
```
|
|
153
156
|
|
|
154
157
|
## License
|
package/README.zh-CN.md
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
# react-native-reanimated-carousel
|
|
4
4
|
|
|
5
|
-
<img src="assets/banner-zh.
|
|
5
|
+
<img src="assets/home-banner-zh.png" width="100%"/>
|
|
6
6
|
|
|
7
|
-

|
|
7
|
+

|
|
8
8
|
[](https://www.npmjs.com/package/react-native-reanimated-carousel)
|
|
9
9
|
[](https://www.npmjs.com/package/react-native-reanimated-carousel)
|
|
10
10
|
[](https://www.npmjs.com/package/react-native-reanimated-carousel)
|
|
@@ -19,7 +19,9 @@
|
|
|
19
19
|
|
|
20
20
|
> v2 已经发布,希望大家喜欢!~ [[v1 文档]](https://github.com/dohooo/react-native-reanimated-carousel/tree/v1.x.x)
|
|
21
21
|
|
|
22
|
-
>
|
|
22
|
+
> 支持Web端 [[示例]](https://dohooo.github.io/react-native-reanimated-carousel/)
|
|
23
|
+
|
|
24
|
+
> 点击图片,查看代码 [[试一下]](https://snack.expo.dev/@zhaodonghao586/simple-carousel) 🍺
|
|
23
25
|
|
|
24
26
|
<p align="center">
|
|
25
27
|
<a href="./example/src/normal/index.tsx">
|
|
@@ -138,16 +140,20 @@ import Carousel from 'react-native-reanimated-carousel';
|
|
|
138
140
|
<img src="assets/normal-fast.gif" width="50%"/>
|
|
139
141
|
</p>
|
|
140
142
|
</details>
|
|
143
|
+
|
|
141
144
|
## 示例
|
|
142
145
|
|
|
146
|
+
> `:pretty` 使用更好看的图片
|
|
147
|
+
|
|
143
148
|
```shell
|
|
144
149
|
yarn ios
|
|
145
|
-
# 使用更好看的图片
|
|
146
150
|
yarn ios:pretty
|
|
147
151
|
|
|
148
152
|
yarn android
|
|
149
|
-
# 使用更好看的图片
|
|
150
153
|
yarn android:pretty
|
|
154
|
+
|
|
155
|
+
yarn web
|
|
156
|
+
yarn web:pretty
|
|
151
157
|
```
|
|
152
158
|
|
|
153
159
|
## 许可
|
package/lib/commonjs/Carousel.js
CHANGED
|
@@ -41,10 +41,11 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
|
|
|
41
41
|
|
|
42
42
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
const Carousel = /*#__PURE__*/_react.default.forwardRef((_props, ref) => {
|
|
45
45
|
const props = (0, _useInitProps.useInitProps)(_props);
|
|
46
46
|
const {
|
|
47
47
|
data,
|
|
48
|
+
rawData,
|
|
48
49
|
loop,
|
|
49
50
|
mode,
|
|
50
51
|
style,
|
|
@@ -55,6 +56,7 @@ function Carousel(_props, ref) {
|
|
|
55
56
|
windowSize,
|
|
56
57
|
autoPlayReverse,
|
|
57
58
|
autoPlayInterval,
|
|
59
|
+
scrollAnimationDuration,
|
|
58
60
|
renderItem,
|
|
59
61
|
onScrollEnd,
|
|
60
62
|
onSnapToItem,
|
|
@@ -81,7 +83,7 @@ function Carousel(_props, ref) {
|
|
|
81
83
|
(0, _useOnProgressChange.useOnProgressChange)({
|
|
82
84
|
size,
|
|
83
85
|
offsetX,
|
|
84
|
-
|
|
86
|
+
rawData,
|
|
85
87
|
onProgressChange
|
|
86
88
|
});
|
|
87
89
|
const carouselController = (0, _useCarouselController.useCarouselController)({
|
|
@@ -93,8 +95,8 @@ function Carousel(_props, ref) {
|
|
|
93
95
|
originalLength: data.length,
|
|
94
96
|
onScrollEnd: () => (0, _reactNativeReanimated.runOnJS)(_onScrollEnd)(),
|
|
95
97
|
onScrollBegin: () => !!onScrollBegin && (0, _reactNativeReanimated.runOnJS)(onScrollBegin)(),
|
|
96
|
-
onChange: i => onSnapToItem && (0, _reactNativeReanimated.runOnJS)(onSnapToItem)(i),
|
|
97
|
-
duration:
|
|
98
|
+
onChange: i => !!onSnapToItem && (0, _reactNativeReanimated.runOnJS)(onSnapToItem)(i),
|
|
99
|
+
duration: scrollAnimationDuration
|
|
98
100
|
});
|
|
99
101
|
const {
|
|
100
102
|
next,
|
|
@@ -105,7 +107,7 @@ function Carousel(_props, ref) {
|
|
|
105
107
|
getCurrentIndex
|
|
106
108
|
} = carouselController;
|
|
107
109
|
const {
|
|
108
|
-
|
|
110
|
+
start,
|
|
109
111
|
pause
|
|
110
112
|
} = (0, _useAutoPlay.useAutoPlay)({
|
|
111
113
|
autoPlay,
|
|
@@ -114,21 +116,25 @@ function Carousel(_props, ref) {
|
|
|
114
116
|
carouselController
|
|
115
117
|
});
|
|
116
118
|
|
|
117
|
-
const scrollViewGestureOnScrollBegin = _react.default.useCallback(() => {
|
|
118
|
-
pause();
|
|
119
|
-
onScrollBegin === null || onScrollBegin === void 0 ? void 0 : onScrollBegin();
|
|
120
|
-
}, [onScrollBegin, pause]);
|
|
121
|
-
|
|
122
119
|
const _onScrollEnd = _react.default.useCallback(() => {
|
|
123
120
|
computedIndex();
|
|
124
121
|
onScrollEnd === null || onScrollEnd === void 0 ? void 0 : onScrollEnd(sharedPreIndex.current, sharedIndex.current);
|
|
125
122
|
}, [sharedPreIndex, sharedIndex, computedIndex, onScrollEnd]);
|
|
126
123
|
|
|
124
|
+
const scrollViewGestureOnScrollBegin = _react.default.useCallback(() => {
|
|
125
|
+
pause();
|
|
126
|
+
onScrollBegin === null || onScrollBegin === void 0 ? void 0 : onScrollBegin();
|
|
127
|
+
}, [onScrollBegin, pause]);
|
|
128
|
+
|
|
127
129
|
const scrollViewGestureOnScrollEnd = _react.default.useCallback(() => {
|
|
128
|
-
|
|
130
|
+
start();
|
|
129
131
|
|
|
130
132
|
_onScrollEnd();
|
|
131
|
-
}, [_onScrollEnd,
|
|
133
|
+
}, [_onScrollEnd, start]);
|
|
134
|
+
|
|
135
|
+
const scrollViewGestureOnTouchBegin = _react.default.useCallback(pause, [pause]);
|
|
136
|
+
|
|
137
|
+
const scrollViewGestureOnTouchEnd = _react.default.useCallback(start, [start]);
|
|
132
138
|
|
|
133
139
|
const goToIndex = _react.default.useCallback((i, animated) => {
|
|
134
140
|
carouselController.to(i, animated);
|
|
@@ -138,8 +144,9 @@ function Carousel(_props, ref) {
|
|
|
138
144
|
next,
|
|
139
145
|
prev,
|
|
140
146
|
getCurrentIndex,
|
|
141
|
-
goToIndex
|
|
142
|
-
|
|
147
|
+
goToIndex,
|
|
148
|
+
scrollTo: carouselController.scrollTo
|
|
149
|
+
}), [getCurrentIndex, goToIndex, next, prev, carouselController.scrollTo]);
|
|
143
150
|
|
|
144
151
|
const visibleRanges = (0, _useVisibleRanges.useVisibleRanges)({
|
|
145
152
|
total: data.length,
|
|
@@ -154,11 +161,11 @@ function Carousel(_props, ref) {
|
|
|
154
161
|
const renderLayout = _react.default.useCallback((item, i) => {
|
|
155
162
|
let realIndex = i;
|
|
156
163
|
|
|
157
|
-
if (
|
|
164
|
+
if (rawData.length === _constants.DATA_LENGTH.SINGLE_ITEM) {
|
|
158
165
|
realIndex = i % 1;
|
|
159
166
|
}
|
|
160
167
|
|
|
161
|
-
if (
|
|
168
|
+
if (rawData.length === _constants.DATA_LENGTH.DOUBLE_ITEM) {
|
|
162
169
|
realIndex = i % 2;
|
|
163
170
|
}
|
|
164
171
|
|
|
@@ -175,7 +182,7 @@ function Carousel(_props, ref) {
|
|
|
175
182
|
index: realIndex,
|
|
176
183
|
animationValue
|
|
177
184
|
}));
|
|
178
|
-
}, [
|
|
185
|
+
}, [rawData, offsetX, visibleRanges, renderItem, layoutConfig, customAnimation]);
|
|
179
186
|
|
|
180
187
|
return /*#__PURE__*/_react.default.createElement(_store.CTX.Provider, {
|
|
181
188
|
value: {
|
|
@@ -191,7 +198,9 @@ function Carousel(_props, ref) {
|
|
|
191
198
|
size: size,
|
|
192
199
|
translation: handlerOffsetX,
|
|
193
200
|
onScrollBegin: scrollViewGestureOnScrollBegin,
|
|
194
|
-
onScrollEnd: scrollViewGestureOnScrollEnd
|
|
201
|
+
onScrollEnd: scrollViewGestureOnScrollEnd,
|
|
202
|
+
onTouchBegin: scrollViewGestureOnTouchBegin,
|
|
203
|
+
onTouchEnd: scrollViewGestureOnTouchEnd
|
|
195
204
|
}, /*#__PURE__*/_react.default.createElement(_reactNativeReanimated.default.View, {
|
|
196
205
|
key: mode,
|
|
197
206
|
style: [styles.container, {
|
|
@@ -199,10 +208,9 @@ function Carousel(_props, ref) {
|
|
|
199
208
|
height: height || '100%'
|
|
200
209
|
}, style, vertical ? styles.itemsVertical : styles.itemsHorizontal]
|
|
201
210
|
}, data.map(renderLayout)))));
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
var _default = /*#__PURE__*/_react.default.forwardRef(Carousel);
|
|
211
|
+
});
|
|
205
212
|
|
|
213
|
+
var _default = Carousel;
|
|
206
214
|
exports.default = _default;
|
|
207
215
|
|
|
208
216
|
const styles = _reactNative.StyleSheet.create({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["Carousel.tsx"],"names":["Carousel","_props","ref","props","data","loop","mode","style","width","height","vertical","autoPlay","windowSize","autoPlayReverse","autoPlayInterval","renderItem","onScrollEnd","onSnapToItem","onScrollBegin","onProgressChange","customAnimation","commonVariables","size","handlerOffsetX","offsetX","totalSize","length","x","value","isNaN","carouselController","disable","originalLength","_onScrollEnd","onChange","i","duration","next","prev","sharedPreIndex","sharedIndex","computedIndex","getCurrentIndex","run","pause","scrollViewGestureOnScrollBegin","React","useCallback","current","scrollViewGestureOnScrollEnd","goToIndex","animated","to","useImperativeHandle","visibleRanges","total","viewSize","translation","layoutConfig","renderLayout","item","realIndex","DATA_LENGTH","SINGLE_ITEM","DOUBLE_ITEM","animationValue","index","common","styles","container","itemsVertical","itemsHorizontal","map","forwardRef","StyleSheet","create","overflow","flexDirection"],"mappings":"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","sourcesContent":["import React, { PropsWithChildren } from 'react';\nimport Animated, { runOnJS, useDerivedValue } from 'react-native-reanimated';\nimport { useCarouselController } from './hooks/useCarouselController';\nimport { useAutoPlay } from './hooks/useAutoPlay';\nimport { usePropsErrorBoundary } from './hooks/usePropsErrorBoundary';\nimport { ScrollViewGesture } from './ScrollViewGesture';\nimport { useVisibleRanges } from './hooks/useVisibleRanges';\nimport type { ICarouselInstance, TCarouselProps } from './types';\nimport { StyleSheet, View } from 'react-native';\nimport { DATA_LENGTH } from './constants';\nimport { BaseLayout } from './layouts/BaseLayout';\nimport { useLayoutConfig } from './hooks/useLayoutConfig';\nimport { useInitProps } from './hooks/useInitProps';\nimport { CTX } from './store';\nimport { useCommonVariables } from './hooks/useCommonVariables';\nimport { useOnProgressChange } from './hooks/useOnProgressChange';\n\nfunction Carousel<T>(\n _props: PropsWithChildren<TCarouselProps<T>>,\n ref: React.Ref<ICarouselInstance>\n) {\n const props = useInitProps(_props);\n\n const {\n data,\n loop,\n mode,\n style,\n width,\n height,\n vertical,\n autoPlay,\n windowSize,\n autoPlayReverse,\n autoPlayInterval,\n renderItem,\n onScrollEnd,\n onSnapToItem,\n onScrollBegin,\n onProgressChange,\n customAnimation,\n } = props;\n\n const commonVariables = useCommonVariables(props);\n const { size, handlerOffsetX } = commonVariables;\n\n const offsetX = useDerivedValue(() => {\n const totalSize = size * data.length;\n const x = handlerOffsetX.value % totalSize;\n\n if (!loop) {\n return handlerOffsetX.value;\n }\n return isNaN(x) ? 0 : x;\n }, [loop, size, data]);\n\n usePropsErrorBoundary(props);\n useOnProgressChange({ size, offsetX, data, onProgressChange });\n\n const carouselController = useCarouselController({\n loop,\n size,\n handlerOffsetX,\n length: data.length,\n disable: !data.length,\n originalLength: data.length,\n onScrollEnd: () => runOnJS(_onScrollEnd)(),\n onScrollBegin: () => !!onScrollBegin && runOnJS(onScrollBegin)(),\n onChange: (i) => onSnapToItem && runOnJS(onSnapToItem)(i),\n duration: autoPlayInterval,\n });\n\n const {\n next,\n prev,\n sharedPreIndex,\n sharedIndex,\n computedIndex,\n getCurrentIndex,\n } = carouselController;\n\n const { run, pause } = useAutoPlay({\n autoPlay,\n autoPlayInterval,\n autoPlayReverse,\n carouselController,\n });\n\n const scrollViewGestureOnScrollBegin = React.useCallback(() => {\n pause();\n onScrollBegin?.();\n }, [onScrollBegin, pause]);\n\n const _onScrollEnd = React.useCallback(() => {\n computedIndex();\n onScrollEnd?.(sharedPreIndex.current, sharedIndex.current);\n }, [sharedPreIndex, sharedIndex, computedIndex, onScrollEnd]);\n\n const scrollViewGestureOnScrollEnd = React.useCallback(() => {\n run();\n _onScrollEnd();\n }, [_onScrollEnd, run]);\n\n const goToIndex = React.useCallback(\n (i: number, animated?: boolean) => {\n carouselController.to(i, animated);\n },\n [carouselController]\n );\n\n React.useImperativeHandle(\n ref,\n () => ({\n next,\n prev,\n getCurrentIndex,\n goToIndex,\n }),\n [getCurrentIndex, goToIndex, next, prev]\n );\n\n const visibleRanges = useVisibleRanges({\n total: data.length,\n viewSize: size,\n translation: handlerOffsetX,\n windowSize,\n });\n\n const layoutConfig = useLayoutConfig<T>({ ...props, size });\n\n const renderLayout = React.useCallback(\n (item: T, i: number) => {\n let realIndex = i;\n if (data.length === DATA_LENGTH.SINGLE_ITEM) {\n realIndex = i % 1;\n }\n\n if (data.length === DATA_LENGTH.DOUBLE_ITEM) {\n realIndex = i % 2;\n }\n\n return (\n <BaseLayout\n key={i}\n index={i}\n handlerOffsetX={offsetX}\n visibleRanges={visibleRanges}\n animationStyle={customAnimation || layoutConfig}\n >\n {({ animationValue }) =>\n renderItem({\n item,\n index: realIndex,\n animationValue,\n })\n }\n </BaseLayout>\n );\n },\n [\n data,\n offsetX,\n visibleRanges,\n renderItem,\n layoutConfig,\n customAnimation,\n ]\n );\n\n return (\n <CTX.Provider value={{ props, common: commonVariables }}>\n <View\n style={[\n styles.container,\n { width: width || '100%', height: height || '100%' },\n style,\n ]}\n >\n <ScrollViewGesture\n size={size}\n translation={handlerOffsetX}\n onScrollBegin={scrollViewGestureOnScrollBegin}\n onScrollEnd={scrollViewGestureOnScrollEnd}\n >\n <Animated.View\n key={mode}\n style={[\n styles.container,\n {\n width: width || '100%',\n height: height || '100%',\n },\n style,\n vertical\n ? styles.itemsVertical\n : styles.itemsHorizontal,\n ]}\n >\n {data.map(renderLayout)}\n </Animated.View>\n </ScrollViewGesture>\n </View>\n </CTX.Provider>\n );\n}\n\nexport default React.forwardRef(Carousel) as typeof Carousel;\n\nconst styles = StyleSheet.create({\n container: {\n overflow: 'hidden',\n },\n itemsHorizontal: {\n flexDirection: 'row',\n },\n itemsVertical: {\n flexDirection: 'column',\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["Carousel.tsx"],"names":["Carousel","React","forwardRef","_props","ref","props","data","rawData","loop","mode","style","width","height","vertical","autoPlay","windowSize","autoPlayReverse","autoPlayInterval","scrollAnimationDuration","renderItem","onScrollEnd","onSnapToItem","onScrollBegin","onProgressChange","customAnimation","commonVariables","size","handlerOffsetX","offsetX","totalSize","length","x","value","isNaN","carouselController","disable","originalLength","_onScrollEnd","onChange","i","duration","next","prev","sharedPreIndex","sharedIndex","computedIndex","getCurrentIndex","start","pause","useCallback","current","scrollViewGestureOnScrollBegin","scrollViewGestureOnScrollEnd","scrollViewGestureOnTouchBegin","scrollViewGestureOnTouchEnd","goToIndex","animated","to","useImperativeHandle","scrollTo","visibleRanges","total","viewSize","translation","layoutConfig","renderLayout","item","realIndex","DATA_LENGTH","SINGLE_ITEM","DOUBLE_ITEM","animationValue","index","common","styles","container","itemsVertical","itemsHorizontal","map","StyleSheet","create","overflow","flexDirection"],"mappings":"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","sourcesContent":["import React from 'react';\nimport Animated, { runOnJS, useDerivedValue } from 'react-native-reanimated';\n\nimport { useCarouselController } from './hooks/useCarouselController';\nimport { useAutoPlay } from './hooks/useAutoPlay';\nimport { usePropsErrorBoundary } from './hooks/usePropsErrorBoundary';\nimport { ScrollViewGesture } from './ScrollViewGesture';\nimport { useVisibleRanges } from './hooks/useVisibleRanges';\n\nimport type { ICarouselInstance, TCarouselProps } from './types';\nimport { StyleSheet, View } from 'react-native';\nimport { DATA_LENGTH } from './constants';\nimport { BaseLayout } from './layouts/BaseLayout';\nimport { useLayoutConfig } from './hooks/useLayoutConfig';\nimport { useInitProps } from './hooks/useInitProps';\nimport { CTX } from './store';\nimport { useCommonVariables } from './hooks/useCommonVariables';\nimport { useOnProgressChange } from './hooks/useOnProgressChange';\n\nconst Carousel = React.forwardRef<ICarouselInstance, TCarouselProps<any>>(\n (_props, ref) => {\n const props = useInitProps(_props);\n\n const {\n data,\n rawData,\n loop,\n mode,\n style,\n width,\n height,\n vertical,\n autoPlay,\n windowSize,\n autoPlayReverse,\n autoPlayInterval,\n scrollAnimationDuration,\n renderItem,\n onScrollEnd,\n onSnapToItem,\n onScrollBegin,\n onProgressChange,\n customAnimation,\n } = props;\n\n const commonVariables = useCommonVariables(props);\n const { size, handlerOffsetX } = commonVariables;\n\n const offsetX = useDerivedValue(() => {\n const totalSize = size * data.length;\n const x = handlerOffsetX.value % totalSize;\n\n if (!loop) {\n return handlerOffsetX.value;\n }\n return isNaN(x) ? 0 : x;\n }, [loop, size, data]);\n\n usePropsErrorBoundary(props);\n useOnProgressChange({ size, offsetX, rawData, onProgressChange });\n\n const carouselController = useCarouselController({\n loop,\n size,\n handlerOffsetX,\n length: data.length,\n disable: !data.length,\n originalLength: data.length,\n onScrollEnd: () => runOnJS(_onScrollEnd)(),\n onScrollBegin: () => !!onScrollBegin && runOnJS(onScrollBegin)(),\n onChange: (i) => !!onSnapToItem && runOnJS(onSnapToItem)(i),\n duration: scrollAnimationDuration,\n });\n\n const {\n next,\n prev,\n sharedPreIndex,\n sharedIndex,\n computedIndex,\n getCurrentIndex,\n } = carouselController;\n\n const { start, pause } = useAutoPlay({\n autoPlay,\n autoPlayInterval,\n autoPlayReverse,\n carouselController,\n });\n\n const _onScrollEnd = React.useCallback(() => {\n computedIndex();\n onScrollEnd?.(sharedPreIndex.current, sharedIndex.current);\n }, [sharedPreIndex, sharedIndex, computedIndex, onScrollEnd]);\n\n const scrollViewGestureOnScrollBegin = React.useCallback(() => {\n pause();\n onScrollBegin?.();\n }, [onScrollBegin, pause]);\n\n const scrollViewGestureOnScrollEnd = React.useCallback(() => {\n start();\n _onScrollEnd();\n }, [_onScrollEnd, start]);\n\n const scrollViewGestureOnTouchBegin = React.useCallback(pause, [pause]);\n\n const scrollViewGestureOnTouchEnd = React.useCallback(start, [start]);\n\n const goToIndex = React.useCallback(\n (i: number, animated?: boolean) => {\n carouselController.to(i, animated);\n },\n [carouselController]\n );\n\n React.useImperativeHandle(\n ref,\n () => ({\n next,\n prev,\n getCurrentIndex,\n goToIndex,\n scrollTo: carouselController.scrollTo,\n }),\n [\n getCurrentIndex,\n goToIndex,\n next,\n prev,\n carouselController.scrollTo,\n ]\n );\n\n const visibleRanges = useVisibleRanges({\n total: data.length,\n viewSize: size,\n translation: handlerOffsetX,\n windowSize,\n });\n\n const layoutConfig = useLayoutConfig({ ...props, size });\n\n const renderLayout = React.useCallback(\n (item: any, i: number) => {\n let realIndex = i;\n if (rawData.length === DATA_LENGTH.SINGLE_ITEM) {\n realIndex = i % 1;\n }\n\n if (rawData.length === DATA_LENGTH.DOUBLE_ITEM) {\n realIndex = i % 2;\n }\n\n return (\n <BaseLayout\n key={i}\n index={i}\n handlerOffsetX={offsetX}\n visibleRanges={visibleRanges}\n animationStyle={customAnimation || layoutConfig}\n >\n {({ animationValue }) =>\n renderItem({\n item,\n index: realIndex,\n animationValue,\n })\n }\n </BaseLayout>\n );\n },\n [\n rawData,\n offsetX,\n visibleRanges,\n renderItem,\n layoutConfig,\n customAnimation,\n ]\n );\n\n return (\n <CTX.Provider value={{ props, common: commonVariables }}>\n <View\n style={[\n styles.container,\n { width: width || '100%', height: height || '100%' },\n style,\n ]}\n >\n <ScrollViewGesture\n size={size}\n translation={handlerOffsetX}\n onScrollBegin={scrollViewGestureOnScrollBegin}\n onScrollEnd={scrollViewGestureOnScrollEnd}\n onTouchBegin={scrollViewGestureOnTouchBegin}\n onTouchEnd={scrollViewGestureOnTouchEnd}\n >\n <Animated.View\n key={mode}\n style={[\n styles.container,\n {\n width: width || '100%',\n height: height || '100%',\n },\n style,\n vertical\n ? styles.itemsVertical\n : styles.itemsHorizontal,\n ]}\n >\n {data.map(renderLayout)}\n </Animated.View>\n </ScrollViewGesture>\n </View>\n </CTX.Provider>\n );\n }\n);\n\nexport default Carousel as <T extends any>(\n props: React.PropsWithChildren<TCarouselProps<T>>\n) => React.ReactElement;\n\nconst styles = StyleSheet.create({\n container: {\n overflow: 'hidden',\n },\n itemsHorizontal: {\n flexDirection: 'row',\n },\n itemsVertical: {\n flexDirection: 'column',\n },\n});\n"]}
|
|
@@ -35,15 +35,17 @@ const IScrollViewGesture = props => {
|
|
|
35
35
|
enableSnap,
|
|
36
36
|
panGestureHandlerProps,
|
|
37
37
|
loop: infinite,
|
|
38
|
-
|
|
38
|
+
scrollAnimationDuration
|
|
39
39
|
}
|
|
40
40
|
} = _react.default.useContext(_store.CTX);
|
|
41
41
|
|
|
42
42
|
const {
|
|
43
43
|
translation,
|
|
44
|
+
size,
|
|
44
45
|
onScrollBegin,
|
|
45
46
|
onScrollEnd,
|
|
46
|
-
|
|
47
|
+
onTouchBegin,
|
|
48
|
+
onTouchEnd
|
|
47
49
|
} = props;
|
|
48
50
|
const maxPage = data.length;
|
|
49
51
|
const isHorizontal = (0, _reactNativeReanimated.useDerivedValue)(() => !vertical, [vertical]);
|
|
@@ -55,14 +57,14 @@ const IScrollViewGesture = props => {
|
|
|
55
57
|
'worklet';
|
|
56
58
|
|
|
57
59
|
return (0, _reactNativeReanimated.withTiming)(toValue, {
|
|
58
|
-
duration:
|
|
60
|
+
duration: scrollAnimationDuration,
|
|
59
61
|
easing: _constants.Easing.easeOutQuart
|
|
60
62
|
}, isFinished => {
|
|
61
63
|
if (isFinished) {
|
|
62
64
|
onFinished === null || onFinished === void 0 ? void 0 : onFinished();
|
|
63
65
|
}
|
|
64
66
|
});
|
|
65
|
-
}, [
|
|
67
|
+
}, [scrollAnimationDuration]);
|
|
66
68
|
|
|
67
69
|
const endWithSpring = _react.default.useCallback(onFinished => {
|
|
68
70
|
'worklet';
|
|
@@ -95,22 +97,26 @@ const IScrollViewGesture = props => {
|
|
|
95
97
|
translation.value = _withSpring(-finalPage * size, onFinished);
|
|
96
98
|
}, [infinite, _withSpring, translation, scrollEndVelocity, size, maxPage, pagingEnabled, enableSnap]);
|
|
97
99
|
|
|
98
|
-
const
|
|
100
|
+
const onFinish = _react.default.useCallback(isFinished => {
|
|
99
101
|
'worklet';
|
|
100
102
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
};
|
|
103
|
+
if (isFinished) {
|
|
104
|
+
touching.value = false;
|
|
105
|
+
onScrollEnd && (0, _reactNativeReanimated.runOnJS)(onScrollEnd)();
|
|
106
|
+
}
|
|
107
|
+
}, [onScrollEnd, touching]);
|
|
107
108
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
109
|
+
const activeDecay = _react.default.useCallback(() => {
|
|
110
|
+
'worklet';
|
|
111
|
+
|
|
112
|
+
touching.value = true;
|
|
113
|
+
translation.value = (0, _reactNativeReanimated.withDecay)({
|
|
114
|
+
velocity: scrollEndVelocity.value
|
|
115
|
+
}, onFinish);
|
|
116
|
+
}, [onFinish, scrollEndVelocity.value, touching, translation]);
|
|
117
|
+
|
|
118
|
+
const resetBoundary = _react.default.useCallback(() => {
|
|
119
|
+
'worklet';
|
|
114
120
|
|
|
115
121
|
if (touching.value) {
|
|
116
122
|
return;
|
|
@@ -139,13 +145,13 @@ const IScrollViewGesture = props => {
|
|
|
139
145
|
return;
|
|
140
146
|
}
|
|
141
147
|
}
|
|
142
|
-
}, [
|
|
148
|
+
}, [touching.value, translation, maxPage, size, scrollEndTranslation.value, infinite, activeDecay, _withSpring]);
|
|
143
149
|
|
|
144
150
|
(0, _reactNativeReanimated.useAnimatedReaction)(() => translation.value, () => {
|
|
145
151
|
if (!pagingEnabled) {
|
|
146
152
|
resetBoundary();
|
|
147
153
|
}
|
|
148
|
-
}, [pagingEnabled]);
|
|
154
|
+
}, [pagingEnabled, resetBoundary]);
|
|
149
155
|
const panGestureEventHandler = (0, _reactNativeReanimated.useAnimatedGestureHandler)({
|
|
150
156
|
onStart: (_, ctx) => {
|
|
151
157
|
touching.value = true;
|
|
@@ -187,14 +193,16 @@ const IScrollViewGesture = props => {
|
|
|
187
193
|
touching.value = false;
|
|
188
194
|
}
|
|
189
195
|
}
|
|
190
|
-
}, [pagingEnabled, isHorizontal.value, infinite, maxPage, size, enableSnap]);
|
|
196
|
+
}, [pagingEnabled, isHorizontal.value, infinite, maxPage, size, enableSnap, onScrollBegin, onScrollEnd]);
|
|
191
197
|
|
|
192
198
|
const directionStyle = _react.default.useMemo(() => {
|
|
193
199
|
return vertical ? styles.contentHorizontal : styles.contentVertical;
|
|
194
200
|
}, [vertical]);
|
|
195
201
|
|
|
196
202
|
return /*#__PURE__*/_react.default.createElement(_reactNativeReanimated.default.View, {
|
|
197
|
-
style: [styles.container, directionStyle, style]
|
|
203
|
+
style: [styles.container, directionStyle, style],
|
|
204
|
+
onTouchStart: onTouchBegin,
|
|
205
|
+
onTouchEnd: onTouchEnd
|
|
198
206
|
}, /*#__PURE__*/_react.default.createElement(_reactNativeGestureHandler.PanGestureHandler, _extends({}, panGestureHandlerProps, {
|
|
199
207
|
onGestureEvent: panGestureEventHandler
|
|
200
208
|
}), props.children));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["ScrollViewGesture.tsx"],"names":["IScrollViewGesture","props","vertical","style","data","pagingEnabled","enableSnap","panGestureHandlerProps","loop","infinite","autoPlayInterval","React","useContext","CTX","translation","onScrollBegin","onScrollEnd","size","maxPage","length","isHorizontal","touching","scrollEndTranslation","scrollEndVelocity","_withSpring","useCallback","toValue","onFinished","duration","easing","Easing","easeOutQuart","isFinished","endWithSpring","origin","value","velocity","nextPage","Math","round","deceleration","page","velocityPage","finalPage","min","max","resetBoundary","onFinish","activeDecay","panGestureEventHandler","onStart","_","ctx","panOffset","onActive","e","translationX","translationY","panTranslation","boundary","fixed","dynamic","onEnd","velocityX","velocityY","directionStyle","useMemo","styles","contentHorizontal","contentVertical","container","children","ScrollViewGesture","StyleSheet","create","flex","overflow","flexDirection"],"mappings":"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","sourcesContent":["import React from 'react';\nimport { StyleProp, StyleSheet, ViewStyle } from 'react-native';\nimport {\n PanGestureHandler,\n PanGestureHandlerGestureEvent,\n} from 'react-native-gesture-handler';\nimport Animated, {\n cancelAnimation,\n runOnJS,\n useAnimatedGestureHandler,\n useAnimatedReaction,\n useDerivedValue,\n useSharedValue,\n withDecay,\n withTiming,\n} from 'react-native-reanimated';\nimport { Easing } from './constants';\nimport { CTX } from './store';\n\ntype GestureContext = {\n panOffset: number;\n max: number;\n};\n\ninterface Props {\n size: number;\n infinite?: boolean;\n onScrollEnd?: () => void;\n onScrollBegin?: () => void;\n style?: StyleProp<ViewStyle>;\n translation: Animated.SharedValue<number>;\n}\n\nconst IScrollViewGesture: React.FC<Props> = (props) => {\n const {\n props: {\n vertical,\n style,\n data,\n pagingEnabled,\n enableSnap,\n panGestureHandlerProps,\n loop: infinite,\n autoPlayInterval,\n },\n } = React.useContext(CTX);\n\n const { translation, onScrollBegin, onScrollEnd, size } = props;\n\n const maxPage = data.length;\n const isHorizontal = useDerivedValue(() => !vertical, [vertical]);\n const touching = useSharedValue(false);\n const scrollEndTranslation = useSharedValue(0);\n const scrollEndVelocity = useSharedValue(0);\n\n const _withSpring = React.useCallback(\n (toValue: number, onFinished?: () => void) => {\n 'worklet';\n return withTiming(\n toValue,\n {\n duration: autoPlayInterval,\n easing: Easing.easeOutQuart,\n },\n (isFinished) => {\n if (isFinished) {\n onFinished?.();\n }\n }\n );\n },\n [autoPlayInterval]\n );\n\n const endWithSpring = React.useCallback(\n (onFinished?: () => void) => {\n 'worklet';\n const origin = translation.value;\n const velocity = scrollEndVelocity.value;\n if (!pagingEnabled) {\n if (enableSnap) {\n const nextPage =\n Math.round((origin + velocity * 0.4) / size) * size;\n translation.value = _withSpring(nextPage, onFinished);\n return;\n }\n translation.value = withDecay({\n velocity,\n deceleration: 0.999,\n });\n return;\n }\n const page = Math.round(-translation.value / size);\n const velocityPage = Math.round(\n -(translation.value + scrollEndVelocity.value) / size\n );\n let finalPage = Math.min(\n page + 1,\n Math.max(page - 1, velocityPage)\n );\n if (!infinite) {\n finalPage = Math.min(maxPage - 1, Math.max(0, finalPage));\n }\n\n translation.value = _withSpring(-finalPage * size, onFinished);\n },\n [\n infinite,\n _withSpring,\n translation,\n scrollEndVelocity,\n size,\n maxPage,\n pagingEnabled,\n enableSnap,\n ]\n );\n\n const resetBoundary = React.useCallback(() => {\n 'worklet';\n const onFinish = (isFinished: boolean) => {\n if (isFinished) {\n touching.value = false;\n onScrollEnd && runOnJS(onScrollEnd)();\n }\n };\n const activeDecay = () => {\n touching.value = true;\n translation.value = withDecay(\n { velocity: scrollEndVelocity.value },\n onFinish\n );\n };\n\n if (touching.value) {\n return;\n }\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 return;\n }\n }\n }, [\n infinite,\n touching,\n _withSpring,\n translation,\n scrollEndTranslation,\n scrollEndVelocity,\n onScrollEnd,\n maxPage,\n size,\n ]);\n\n useAnimatedReaction(\n () => translation.value,\n () => {\n if (!pagingEnabled) {\n resetBoundary();\n }\n },\n [pagingEnabled]\n );\n\n const panGestureEventHandler = useAnimatedGestureHandler<\n PanGestureHandlerGestureEvent,\n GestureContext\n >(\n {\n onStart: (_, ctx) => {\n touching.value = true;\n cancelAnimation(translation);\n onScrollBegin && runOnJS(onScrollBegin)();\n ctx.max = (maxPage - 1) * size;\n ctx.panOffset = translation.value;\n },\n onActive: (e, ctx) => {\n touching.value = true;\n const { translationX, translationY } = e;\n let panTranslation = isHorizontal.value\n ? translationX\n : translationY;\n\n if (\n !infinite &&\n (translation.value > 0 || translation.value < -ctx.max)\n ) {\n const boundary = translation.value > 0 ? 0 : -ctx.max;\n const fixed = boundary - ctx.panOffset;\n const dynamic = panTranslation - fixed;\n translation.value = boundary + dynamic * 0.5;\n return;\n }\n\n translation.value = ctx.panOffset + panTranslation;\n },\n onEnd: (e) => {\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 endWithSpring(() => onScrollEnd && runOnJS(onScrollEnd)());\n\n if (!infinite) {\n touching.value = false;\n }\n },\n },\n [pagingEnabled, isHorizontal.value, infinite, maxPage, size, enableSnap]\n );\n\n const directionStyle = React.useMemo(() => {\n return vertical ? styles.contentHorizontal : styles.contentVertical;\n }, [vertical]);\n\n return (\n <Animated.View style={[styles.container, directionStyle, style]}>\n <PanGestureHandler\n {...panGestureHandlerProps}\n onGestureEvent={panGestureEventHandler}\n >\n {props.children}\n </PanGestureHandler>\n </Animated.View>\n );\n};\n\nexport const ScrollViewGesture = IScrollViewGesture;\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n overflow: 'hidden',\n },\n contentVertical: {\n flexDirection: 'column',\n },\n contentHorizontal: {\n flexDirection: 'row',\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["ScrollViewGesture.tsx"],"names":["IScrollViewGesture","props","vertical","style","data","pagingEnabled","enableSnap","panGestureHandlerProps","loop","infinite","scrollAnimationDuration","React","useContext","CTX","translation","size","onScrollBegin","onScrollEnd","onTouchBegin","onTouchEnd","maxPage","length","isHorizontal","touching","scrollEndTranslation","scrollEndVelocity","_withSpring","useCallback","toValue","onFinished","duration","easing","Easing","easeOutQuart","isFinished","endWithSpring","origin","value","velocity","nextPage","Math","round","deceleration","page","velocityPage","finalPage","min","max","onFinish","activeDecay","resetBoundary","panGestureEventHandler","onStart","_","ctx","panOffset","onActive","e","translationX","translationY","panTranslation","boundary","fixed","dynamic","onEnd","velocityX","velocityY","directionStyle","useMemo","styles","contentHorizontal","contentVertical","container","children","ScrollViewGesture","StyleSheet","create","flex","overflow","flexDirection"],"mappings":"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","sourcesContent":["import React from 'react';\nimport { StyleProp, StyleSheet, ViewStyle } from 'react-native';\nimport {\n PanGestureHandler,\n PanGestureHandlerGestureEvent,\n} from 'react-native-gesture-handler';\nimport Animated, {\n cancelAnimation,\n runOnJS,\n useAnimatedGestureHandler,\n useAnimatedReaction,\n useDerivedValue,\n useSharedValue,\n withDecay,\n withTiming,\n} from 'react-native-reanimated';\nimport { Easing } from './constants';\nimport { CTX } from './store';\n\ntype GestureContext = {\n panOffset: number;\n max: number;\n};\n\ninterface Props {\n size: number;\n infinite?: boolean;\n onScrollBegin?: () => void;\n onScrollEnd?: () => void;\n onTouchBegin?: () => void;\n onTouchEnd?: () => void;\n style?: StyleProp<ViewStyle>;\n translation: Animated.SharedValue<number>;\n}\n\nconst IScrollViewGesture: React.FC<Props> = (props) => {\n const {\n props: {\n vertical,\n style,\n data,\n pagingEnabled,\n enableSnap,\n panGestureHandlerProps,\n loop: infinite,\n scrollAnimationDuration,\n },\n } = React.useContext(CTX);\n\n const {\n translation,\n size,\n onScrollBegin,\n onScrollEnd,\n onTouchBegin,\n onTouchEnd,\n } = props;\n\n const maxPage = data.length;\n const isHorizontal = useDerivedValue(() => !vertical, [vertical]);\n const touching = useSharedValue(false);\n const scrollEndTranslation = useSharedValue(0);\n const scrollEndVelocity = useSharedValue(0);\n\n const _withSpring = React.useCallback(\n (toValue: number, onFinished?: () => void) => {\n 'worklet';\n return withTiming(\n toValue,\n {\n duration: scrollAnimationDuration,\n easing: Easing.easeOutQuart,\n },\n (isFinished) => {\n if (isFinished) {\n onFinished?.();\n }\n }\n );\n },\n [scrollAnimationDuration]\n );\n\n const endWithSpring = React.useCallback(\n (onFinished?: () => void) => {\n 'worklet';\n const origin = translation.value;\n const velocity = scrollEndVelocity.value;\n if (!pagingEnabled) {\n if (enableSnap) {\n const nextPage =\n Math.round((origin + velocity * 0.4) / size) * size;\n translation.value = _withSpring(nextPage, onFinished);\n return;\n }\n translation.value = withDecay({\n velocity,\n deceleration: 0.999,\n });\n return;\n }\n const page = Math.round(-translation.value / size);\n const velocityPage = Math.round(\n -(translation.value + scrollEndVelocity.value) / size\n );\n let finalPage = Math.min(\n page + 1,\n Math.max(page - 1, velocityPage)\n );\n if (!infinite) {\n finalPage = Math.min(maxPage - 1, Math.max(0, finalPage));\n }\n\n translation.value = _withSpring(-finalPage * size, onFinished);\n },\n [\n infinite,\n _withSpring,\n translation,\n scrollEndVelocity,\n size,\n maxPage,\n pagingEnabled,\n enableSnap,\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 onFinish\n );\n }, [onFinish, scrollEndVelocity.value, touching, translation]);\n\n const resetBoundary = React.useCallback(() => {\n 'worklet';\n if (touching.value) {\n return;\n }\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 return;\n }\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 },\n [pagingEnabled, resetBoundary]\n );\n\n const panGestureEventHandler = useAnimatedGestureHandler<\n PanGestureHandlerGestureEvent,\n GestureContext\n >(\n {\n onStart: (_, ctx) => {\n touching.value = true;\n cancelAnimation(translation);\n onScrollBegin && runOnJS(onScrollBegin)();\n ctx.max = (maxPage - 1) * size;\n ctx.panOffset = translation.value;\n },\n onActive: (e, ctx) => {\n touching.value = true;\n const { translationX, translationY } = e;\n let panTranslation = isHorizontal.value\n ? translationX\n : translationY;\n\n if (\n !infinite &&\n (translation.value > 0 || translation.value < -ctx.max)\n ) {\n const boundary = translation.value > 0 ? 0 : -ctx.max;\n const fixed = boundary - ctx.panOffset;\n const dynamic = panTranslation - fixed;\n translation.value = boundary + dynamic * 0.5;\n return;\n }\n\n translation.value = ctx.panOffset + panTranslation;\n },\n onEnd: (e) => {\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 endWithSpring(() => onScrollEnd && runOnJS(onScrollEnd)());\n\n if (!infinite) {\n touching.value = false;\n }\n },\n },\n [\n pagingEnabled,\n isHorizontal.value,\n infinite,\n maxPage,\n size,\n enableSnap,\n onScrollBegin,\n onScrollEnd,\n ]\n );\n\n const directionStyle = React.useMemo(() => {\n return vertical ? styles.contentHorizontal : styles.contentVertical;\n }, [vertical]);\n\n return (\n <Animated.View\n style={[styles.container, directionStyle, style]}\n onTouchStart={onTouchBegin}\n onTouchEnd={onTouchEnd}\n >\n <PanGestureHandler\n {...panGestureHandlerProps}\n onGestureEvent={panGestureEventHandler}\n >\n {props.children}\n </PanGestureHandler>\n </Animated.View>\n );\n};\n\nexport const ScrollViewGesture = IScrollViewGesture;\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n overflow: 'hidden',\n },\n contentVertical: {\n flexDirection: 'column',\n },\n contentHorizontal: {\n flexDirection: 'row',\n },\n});\n"]}
|
|
@@ -19,34 +19,48 @@ function useAutoPlay(opts) {
|
|
|
19
19
|
carouselController
|
|
20
20
|
} = opts;
|
|
21
21
|
const timer = React.useRef();
|
|
22
|
+
const stopped = React.useRef(!autoPlay);
|
|
23
|
+
const play = React.useCallback(() => {
|
|
24
|
+
if (stopped.current) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
timer.current = setTimeout(() => {
|
|
29
|
+
autoPlayReverse ? carouselController.prev({
|
|
30
|
+
onFinished: play
|
|
31
|
+
}) : carouselController.next({
|
|
32
|
+
onFinished: play
|
|
33
|
+
});
|
|
34
|
+
}, autoPlayInterval);
|
|
35
|
+
}, [autoPlayReverse, autoPlayInterval, carouselController]);
|
|
22
36
|
const pause = React.useCallback(() => {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const run = React.useCallback(() => {
|
|
26
|
-
if (timer.current) {
|
|
27
|
-
pause();
|
|
37
|
+
if (!autoPlay) {
|
|
38
|
+
return;
|
|
28
39
|
}
|
|
29
40
|
|
|
41
|
+
timer.current && clearInterval(timer.current);
|
|
42
|
+
stopped.current = true;
|
|
43
|
+
}, [autoPlay]);
|
|
44
|
+
const start = React.useCallback(() => {
|
|
30
45
|
if (!autoPlay) {
|
|
31
46
|
return;
|
|
32
47
|
}
|
|
33
48
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}, [pause, autoPlay, autoPlayReverse, autoPlayInterval, carouselController]);
|
|
49
|
+
stopped.current = false;
|
|
50
|
+
play();
|
|
51
|
+
}, [play, autoPlay]);
|
|
38
52
|
React.useEffect(() => {
|
|
39
53
|
if (autoPlay) {
|
|
40
|
-
|
|
54
|
+
start();
|
|
41
55
|
} else {
|
|
42
56
|
pause();
|
|
43
57
|
}
|
|
44
58
|
|
|
45
59
|
return pause;
|
|
46
|
-
}, [
|
|
60
|
+
}, [pause, start, autoPlay]);
|
|
47
61
|
return {
|
|
48
|
-
|
|
49
|
-
|
|
62
|
+
pause,
|
|
63
|
+
start
|
|
50
64
|
};
|
|
51
65
|
}
|
|
52
66
|
//# sourceMappingURL=useAutoPlay.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useAutoPlay.ts"],"names":["useAutoPlay","opts","autoPlay","autoPlayReverse","autoPlayInterval","carouselController","timer","React","useRef","
|
|
1
|
+
{"version":3,"sources":["useAutoPlay.ts"],"names":["useAutoPlay","opts","autoPlay","autoPlayReverse","autoPlayInterval","carouselController","timer","React","useRef","stopped","play","useCallback","current","setTimeout","prev","onFinished","next","pause","clearInterval","start","useEffect"],"mappings":";;;;;;;AAAA;;;;;;AAGO,SAASA,WAAT,CAAqBC,IAArB,EAKJ;AACC,QAAM;AACFC,IAAAA,QAAQ,GAAG,KADT;AAEFC,IAAAA,eAAe,GAAG,KAFhB;AAGFC,IAAAA,gBAHE;AAIFC,IAAAA;AAJE,MAKFJ,IALJ;AAOA,QAAMK,KAAK,GAAGC,KAAK,CAACC,MAAN,EAAd;AACA,QAAMC,OAAO,GAAGF,KAAK,CAACC,MAAN,CAAsB,CAACN,QAAvB,CAAhB;AAEA,QAAMQ,IAAI,GAAGH,KAAK,CAACI,WAAN,CAAkB,MAAM;AACjC,QAAIF,OAAO,CAACG,OAAZ,EAAqB;AACjB;AACH;;AAEDN,IAAAA,KAAK,CAACM,OAAN,GAAgBC,UAAU,CAAC,MAAM;AAC7BV,MAAAA,eAAe,GACTE,kBAAkB,CAACS,IAAnB,CAAwB;AAAEC,QAAAA,UAAU,EAAEL;AAAd,OAAxB,CADS,GAETL,kBAAkB,CAACW,IAAnB,CAAwB;AAAED,QAAAA,UAAU,EAAEL;AAAd,OAAxB,CAFN;AAGH,KAJyB,EAIvBN,gBAJuB,CAA1B;AAKH,GAVY,EAUV,CAACD,eAAD,EAAkBC,gBAAlB,EAAoCC,kBAApC,CAVU,CAAb;AAYA,QAAMY,KAAK,GAAGV,KAAK,CAACI,WAAN,CAAkB,MAAM;AAClC,QAAI,CAACT,QAAL,EAAe;AACX;AACH;;AACDI,IAAAA,KAAK,CAACM,OAAN,IAAiBM,aAAa,CAACZ,KAAK,CAACM,OAAP,CAA9B;AACAH,IAAAA,OAAO,CAACG,OAAR,GAAkB,IAAlB;AACH,GANa,EAMX,CAACV,QAAD,CANW,CAAd;AAQA,QAAMiB,KAAK,GAAGZ,KAAK,CAACI,WAAN,CAAkB,MAAM;AAClC,QAAI,CAACT,QAAL,EAAe;AACX;AACH;;AACDO,IAAAA,OAAO,CAACG,OAAR,GAAkB,KAAlB;AACAF,IAAAA,IAAI;AACP,GANa,EAMX,CAACA,IAAD,EAAOR,QAAP,CANW,CAAd;AAQAK,EAAAA,KAAK,CAACa,SAAN,CAAgB,MAAM;AAClB,QAAIlB,QAAJ,EAAc;AACViB,MAAAA,KAAK;AACR,KAFD,MAEO;AACHF,MAAAA,KAAK;AACR;;AACD,WAAOA,KAAP;AACH,GAPD,EAOG,CAACA,KAAD,EAAQE,KAAR,EAAejB,QAAf,CAPH;AASA,SAAO;AACHe,IAAAA,KADG;AAEHE,IAAAA;AAFG,GAAP;AAIH","sourcesContent":["import * as React from 'react';\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 timer = React.useRef<NodeJS.Timer>();\n const stopped = React.useRef<boolean>(!autoPlay);\n\n const play = React.useCallback(() => {\n if (stopped.current) {\n return;\n }\n\n timer.current = setTimeout(() => {\n autoPlayReverse\n ? carouselController.prev({ onFinished: play })\n : carouselController.next({ onFinished: play });\n }, autoPlayInterval);\n }, [autoPlayReverse, autoPlayInterval, carouselController]);\n\n const pause = React.useCallback(() => {\n if (!autoPlay) {\n return;\n }\n timer.current && clearInterval(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"]}
|