react-native-reanimated-carousel 1.0.2 → 1.0.6
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 +40 -41
- package/README.zh-CN.md +42 -39
- package/lib/commonjs/Carousel.js +46 -26
- package/lib/commonjs/Carousel.js.map +1 -1
- package/lib/commonjs/CarouselItem.js +1 -1
- package/lib/commonjs/CarouselItem.js.map +1 -1
- package/lib/commonjs/{useAutoPlay.js → hooks/useAutoPlay.js} +0 -0
- package/lib/commonjs/{useAutoPlay.js.map → hooks/useAutoPlay.js.map} +0 -0
- package/lib/commonjs/{useCarouselController.js → hooks/useCarouselController.js} +4 -2
- package/lib/commonjs/hooks/useCarouselController.js.map +1 -0
- package/lib/commonjs/{useComputedAnim.js → hooks/useComputedAnim.js} +0 -0
- package/lib/commonjs/{useComputedAnim.js.map → hooks/useComputedAnim.js.map} +0 -0
- package/lib/commonjs/{useIndexController.js → hooks/useIndexController.js} +0 -0
- package/lib/commonjs/{useIndexController.js.map → hooks/useIndexController.js.map} +0 -0
- package/lib/commonjs/{useOffsetX.js → hooks/useOffsetX.js} +0 -0
- package/lib/commonjs/{useOffsetX.js.map → hooks/useOffsetX.js.map} +0 -0
- package/lib/commonjs/hooks/usePropsErrorBoundary.js +26 -0
- package/lib/commonjs/hooks/usePropsErrorBoundary.js.map +1 -0
- package/lib/commonjs/layouts/ParallaxLayout.js +1 -1
- package/lib/commonjs/layouts/ParallaxLayout.js.map +1 -1
- package/lib/commonjs/utils/log.js +15 -0
- package/lib/commonjs/utils/log.js.map +1 -0
- package/lib/module/Carousel.js +45 -26
- package/lib/module/Carousel.js.map +1 -1
- package/lib/module/CarouselItem.js +1 -1
- package/lib/module/CarouselItem.js.map +1 -1
- package/lib/module/{useAutoPlay.js → hooks/useAutoPlay.js} +0 -0
- package/lib/module/{useAutoPlay.js.map → hooks/useAutoPlay.js.map} +0 -0
- package/lib/module/{useCarouselController.js → hooks/useCarouselController.js} +4 -2
- package/lib/module/hooks/useCarouselController.js.map +1 -0
- package/lib/module/{useComputedAnim.js → hooks/useComputedAnim.js} +0 -0
- package/lib/module/{useComputedAnim.js.map → hooks/useComputedAnim.js.map} +0 -0
- package/lib/module/{useIndexController.js → hooks/useIndexController.js} +0 -0
- package/lib/module/{useIndexController.js.map → hooks/useIndexController.js.map} +0 -0
- package/lib/module/{useOffsetX.js → hooks/useOffsetX.js} +0 -0
- package/lib/module/{useOffsetX.js.map → hooks/useOffsetX.js.map} +0 -0
- package/lib/module/hooks/usePropsErrorBoundary.js +16 -0
- package/lib/module/hooks/usePropsErrorBoundary.js.map +1 -0
- package/lib/module/layouts/ParallaxLayout.js +1 -1
- package/lib/module/layouts/ParallaxLayout.js.map +1 -1
- package/lib/module/utils/log.js +8 -0
- package/lib/module/utils/log.js.map +1 -0
- package/lib/typescript/Carousel.d.ts +9 -4
- package/lib/typescript/CarouselItem.d.ts +1 -1
- package/lib/typescript/{useAutoPlay.d.ts → hooks/useAutoPlay.d.ts} +0 -0
- package/lib/typescript/{useCarouselController.d.ts → hooks/useCarouselController.d.ts} +0 -0
- package/lib/typescript/{useComputedAnim.d.ts → hooks/useComputedAnim.d.ts} +0 -0
- package/lib/typescript/{useIndexController.d.ts → hooks/useIndexController.d.ts} +0 -0
- package/lib/typescript/{useOffsetX.d.ts → hooks/useOffsetX.d.ts} +0 -0
- package/lib/typescript/hooks/usePropsErrorBoundary.d.ts +2 -0
- package/lib/typescript/layouts/ParallaxLayout.d.ts +1 -1
- package/lib/typescript/utils/log.d.ts +5 -0
- package/package.json +1 -1
- package/src/Carousel.tsx +100 -61
- package/src/CarouselItem.tsx +2 -2
- package/src/{useAutoPlay.ts → hooks/useAutoPlay.ts} +0 -0
- package/src/{useCarouselController.tsx → hooks/useCarouselController.tsx} +6 -2
- package/src/{useComputedAnim.ts → hooks/useComputedAnim.ts} +0 -0
- package/src/{useIndexController.ts → hooks/useIndexController.ts} +0 -0
- package/src/{useOffsetX.ts → hooks/useOffsetX.ts} +0 -0
- package/src/hooks/usePropsErrorBoundary.ts +15 -0
- package/src/layouts/ParallaxLayout.tsx +2 -2
- package/src/utils/log.ts +7 -0
- package/lib/commonjs/useCarouselController.js.map +0 -1
- package/lib/module/useCarouselController.js.map +0 -1
package/README.md
CHANGED
|
@@ -17,17 +17,18 @@ English | [简体中文](./README.zh-CN.md)
|
|
|
17
17
|
<br/>
|
|
18
18
|
|
|
19
19
|
## Here comes the official edition!
|
|
20
|
+
|
|
20
21
|
`v1` has been born, now the carousel will be more natural, and fixed various bugs in the 0.x version, this library will continue to maintain, rest assured to use! [come and experience](https://snack.expo.dev/@zhaodonghao586/simple-carousel) 🎉🎉🎉
|
|
21
22
|
|
|
22
23
|
Updates:
|
|
23
|
-
- Reconstructed some logic, sliding animation more smooth, natural
|
|
24
|
-
- timingConfig -> springConfig (The configuration of the 'duration' property is no longer supported by this configuration)
|
|
25
|
-
- [...](https://github.com/dohooo/react-native-reanimated-carousel/releases/tag/v1.0.0)
|
|
26
24
|
|
|
25
|
+
- Reconstructed some logic, sliding animation more smooth, natural
|
|
26
|
+
- timingConfig -> springConfig (The configuration of the 'duration' property is no longer supported by this configuration)
|
|
27
|
+
- [...](https://github.com/dohooo/react-native-reanimated-carousel/releases/tag/v1.0.0)
|
|
27
28
|
|
|
28
29
|
## Reason
|
|
29
30
|
|
|
30
|
-
🎉 **Simple、Infinitely scrolling very smooth、Fully implemented using Reanimated 2!**
|
|
31
|
+
🎉 **It completely solves [this problem](https://github.com/meliorence/react-native-snap-carousel/issues/632) for `react-native-snap-carousel`! Simple、Infinitely scrolling very smooth、Fully implemented using Reanimated 2!**
|
|
31
32
|
|
|
32
33
|
> The common RN infinite scroll component. It's common to get stuck on a fast slide. Wait for the next element to appear. This component will not have similar problems. That's why this library was created.
|
|
33
34
|
|
|
@@ -72,52 +73,50 @@ If use EXPO managed workflow please ensure that the version is greater than 41.B
|
|
|
72
73
|
## Usage
|
|
73
74
|
|
|
74
75
|
```typescript
|
|
75
|
-
import Carousel from
|
|
76
|
+
import Carousel from 'react-native-reanimated-carousel';
|
|
76
77
|
|
|
77
78
|
// ...
|
|
78
79
|
|
|
79
80
|
<Carousel<{ color: string }>
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
81
|
+
width={width}
|
|
82
|
+
data={[{ color: 'red' }, { color: 'purple' }, { color: 'yellow' }]}
|
|
83
|
+
renderItem={({ color }) => {
|
|
84
|
+
return (
|
|
85
|
+
<View
|
|
86
|
+
style={{
|
|
87
|
+
backgroundColor: color,
|
|
88
|
+
justifyContent: 'center',
|
|
89
|
+
flex: 1,
|
|
90
|
+
}}
|
|
91
|
+
/>
|
|
92
|
+
);
|
|
93
|
+
}}
|
|
93
94
|
/>;
|
|
94
95
|
```
|
|
95
96
|
|
|
96
97
|
## Props
|
|
97
98
|
|
|
98
|
-
| name | required | default
|
|
99
|
-
| ----------------------- | -------- |
|
|
100
|
-
| data | ✅ |
|
|
101
|
-
| width | ✅ |
|
|
102
|
-
| renderItem | ✅ |
|
|
103
|
-
|
|
|
104
|
-
|
|
|
105
|
-
|
|
|
106
|
-
|
|
|
107
|
-
|
|
|
108
|
-
|
|
|
109
|
-
|
|
|
110
|
-
|
|
|
111
|
-
|
|
|
112
|
-
|
|
|
113
|
-
|
|
|
114
|
-
|
|
|
115
|
-
|
|
|
116
|
-
|
|
|
117
|
-
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
99
|
+
| name | required | default | types | description |
|
|
100
|
+
| ----------------------- | -------- | -------------- | ---------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
|
|
101
|
+
| data | ✅ | | T[] | Carousel items data set |
|
|
102
|
+
| width | ✅ | | number | Specified carousel container width |
|
|
103
|
+
| renderItem | ✅ | | (data: T, index: number) => React.ReactNode | Render carousel item |
|
|
104
|
+
| defaultIndex | ❌ | 0 | number | Default index |
|
|
105
|
+
| autoPlay | ❌ | false | boolean | Auto play |
|
|
106
|
+
| autoPlayReverse | ❌ | false | boolean | Auto play reverse playback |
|
|
107
|
+
| autoPlayInterval | ❌ | 1000 | autoPlayInterval | Auto play playback interval |
|
|
108
|
+
| mode | ❌ | defalut | 'default'\|'parallax' | Carousel Animated transitions |
|
|
109
|
+
| loop | ❌ | true | boolean | Carousel loop playback |
|
|
110
|
+
| parallaxScrollingOffset | ❌ | 100 | number | When use 'parallax' Layout props,this prop can be control prev/next item offset |
|
|
111
|
+
| parallaxScrollingScale | ❌ | 0.8 | number | When use 'parallax' Layout props,this prop can be control prev/next item scale |
|
|
112
|
+
| style | ❌ | {} | ViewStyle | Carousel container style |
|
|
113
|
+
| height | ❌ | '100%' | undefined \| string \| number | Specified carousel container height |
|
|
114
|
+
| springConfig | ❌ | {damping: 100} | Animated.WithSpringConfig | Spring config of translation animated |
|
|
115
|
+
| onSnapToItem | ❌ | | (index: number) => void | Callback fired when navigating to an item |
|
|
116
|
+
| onScrollBegin | ❌ | | () => void | Callback fired when scroll begin |
|
|
117
|
+
| onScrollEnd | ❌ | | (previous: number, current: number) => void | Callback fired when scroll end |
|
|
118
|
+
| panGestureHandlerProps | ❌ | {} | Omit<Partial\<PanGestureHandlerProps\>,'onHandlerStateChange'> | PanGestureHandler props |
|
|
119
|
+
| onProgressChange | ❌ | | onProgressChange?: (offsetProgress: number,absoluteProgress: number) => void | On progress change. `offsetProgress`:Total of offset distance (0 390 780 ...); `absoluteProgress`:Convert to index (0 1 2 ...) |
|
|
121
120
|
|
|
122
121
|
## Ref
|
|
123
122
|
|
package/README.zh-CN.md
CHANGED
|
@@ -17,16 +17,18 @@
|
|
|
17
17
|
<br/>
|
|
18
18
|
|
|
19
19
|
## 正式版来了!
|
|
20
|
-
|
|
20
|
+
|
|
21
|
+
`v1`已经诞生,现在轮播图的滚动将会更加自然,并且修复了 0.x 版本中出现的各种 bug,此库将会持续维护,放心使用! [快来体验](https://snack.expo.dev/@zhaodonghao586/simple-carousel) 🎉🎉🎉
|
|
21
22
|
|
|
22
23
|
更新:
|
|
23
|
-
|
|
24
|
-
-
|
|
25
|
-
-
|
|
24
|
+
|
|
25
|
+
- 重构了部分逻辑,滑动动画更加流畅、自然
|
|
26
|
+
- timingConfig -> springConfig (此配置不再支持对`duration`属性的配置)
|
|
27
|
+
- [...](https://github.com/dohooo/react-native-reanimated-carousel/releases/tag/v1.0.0)
|
|
26
28
|
|
|
27
29
|
## 原因
|
|
28
30
|
|
|
29
|
-
🎉
|
|
31
|
+
🎉 **完全解决了`react-native-snap-carousel`的[这个问题](https://github.com/meliorence/react-native-snap-carousel/issues/632)! 易用、无限滚动、完全使用 Reanimated2 实现**
|
|
30
32
|
|
|
31
33
|
> 常见的无限滚动轮播图,在快速滑动时会出现卡住的情况,这是因为实现方式而导致的问题。这个组件用了不同的方式来实现,解决了这个问题,这就是创建这个库的原因。
|
|
32
34
|
|
|
@@ -71,49 +73,50 @@ npm install react-native-reanimated-carousel
|
|
|
71
73
|
## 使用
|
|
72
74
|
|
|
73
75
|
```typescript
|
|
74
|
-
import Carousel from
|
|
76
|
+
import Carousel from 'react-native-reanimated-carousel';
|
|
75
77
|
|
|
76
78
|
// ...
|
|
77
79
|
|
|
78
80
|
<Carousel<{ color: string }>
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
81
|
+
width={width}
|
|
82
|
+
data={[{ color: 'red' }, { color: 'purple' }, { color: 'yellow' }]}
|
|
83
|
+
renderItem={({ color }) => {
|
|
84
|
+
return (
|
|
85
|
+
<View
|
|
86
|
+
style={{
|
|
87
|
+
backgroundColor: color,
|
|
88
|
+
justifyContent: 'center',
|
|
89
|
+
flex: 1,
|
|
90
|
+
}}
|
|
91
|
+
/>
|
|
92
|
+
);
|
|
93
|
+
}}
|
|
92
94
|
/>;
|
|
93
95
|
```
|
|
94
96
|
|
|
95
97
|
## Props
|
|
96
98
|
|
|
97
|
-
| name | required | default
|
|
98
|
-
| ----------------------- | -------- |
|
|
99
|
-
| data | ✅ |
|
|
100
|
-
| width | ✅ |
|
|
101
|
-
| renderItem | ✅ |
|
|
102
|
-
|
|
|
103
|
-
|
|
|
104
|
-
|
|
|
105
|
-
|
|
|
106
|
-
|
|
|
107
|
-
|
|
|
108
|
-
|
|
|
109
|
-
|
|
|
110
|
-
|
|
|
111
|
-
|
|
|
112
|
-
|
|
|
113
|
-
|
|
|
114
|
-
|
|
|
115
|
-
|
|
|
116
|
-
|
|
|
99
|
+
| name | required | default | types | description |
|
|
100
|
+
| ----------------------- | -------- | -------------- | ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
|
|
101
|
+
| data | ✅ | | T[] | 即将渲染的数据集合 |
|
|
102
|
+
| width | ✅ | | number | 轮播图容器的宽度 |
|
|
103
|
+
| renderItem | ✅ | | (data: T, index: number) => React.ReactNode | 渲染元素的方法 |
|
|
104
|
+
| defaultIndex | ❌ | 0 | number | 默认 index |
|
|
105
|
+
| autoPlay | ❌ | false | boolean | 是否自动播放 |
|
|
106
|
+
| autoPlayReverse | ❌ | false | boolean | 是否倒序自动播放 |
|
|
107
|
+
| autoPlayInterval | ❌ | 1000 | autoPlayInterval | 自动播放的间隔 |
|
|
108
|
+
| mode | ❌ | defalut | 'default'\|'parallax' | 轮播图播放模式,`default`为默认无任何 UI 效果,演示图片使用的`parallax` |
|
|
109
|
+
| loop | ❌ | true | boolean | 是否循环播放 |
|
|
110
|
+
| parallaxScrollingOffset | ❌ | 100 | number | 当使用 mode=`parallax`,这个属性可以控制两侧图片离中间元素的距离 |
|
|
111
|
+
| parallaxScrollingScale | ❌ | 0.8 | number | 当使用 mode=`parallax`,这个属性可以控制两侧图片的缩放比例 |
|
|
112
|
+
| style | ❌ | {} | ViewStyle | 轮播图容器样式 |
|
|
113
|
+
| height | ❌ | '100%' | undefined \| string \| number | 指定轮播图容器高度 |
|
|
114
|
+
| springConfig | ❌ | {damping: 100} | Animated.WithSpringConfig | 配置动画效果 |
|
|
115
|
+
| onSnapToItem | ❌ | | (index: number) => void | 切换至另一张轮播图时触发 |
|
|
116
|
+
| onScrollBegin | ❌ | | () => void | 切换动画开始时触发 |
|
|
117
|
+
| onScrollEnd | ❌ | | (previous: number, current: number) => void | 切换动画结束时触发 |
|
|
118
|
+
| panGestureHandlerProps | ❌ | {} | Omit<Partial\<PanGestureHandlerProps\>,'onHandlerStateChange'> | PanGestureHandler props |
|
|
119
|
+
| onProgressChange | ❌ | | onProgressChange?: (offsetProgress: number,absoluteProgress: number) => void | 当滚动进度发生变化时触发 `offsetProgress`:总的偏移值 (0 390 780 ...); `absoluteProgress`:转化为 index 的进度变化 (0 1 2 ...) |
|
|
117
120
|
|
|
118
121
|
## Ref
|
|
119
122
|
|
package/lib/commonjs/Carousel.js
CHANGED
|
@@ -15,13 +15,15 @@ var _CarouselItem = require("./CarouselItem");
|
|
|
15
15
|
|
|
16
16
|
var _index = require("./layouts/index");
|
|
17
17
|
|
|
18
|
-
var _useCarouselController = require("./useCarouselController");
|
|
18
|
+
var _useCarouselController = require("./hooks/useCarouselController");
|
|
19
19
|
|
|
20
|
-
var _useComputedAnim = require("./useComputedAnim");
|
|
20
|
+
var _useComputedAnim = require("./hooks/useComputedAnim");
|
|
21
21
|
|
|
22
|
-
var _useAutoPlay = require("./useAutoPlay");
|
|
22
|
+
var _useAutoPlay = require("./hooks/useAutoPlay");
|
|
23
23
|
|
|
24
|
-
var _useIndexController = require("./useIndexController");
|
|
24
|
+
var _useIndexController = require("./hooks/useIndexController");
|
|
25
|
+
|
|
26
|
+
var _usePropsErrorBoundary = require("./hooks/usePropsErrorBoundary");
|
|
25
27
|
|
|
26
28
|
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); }
|
|
27
29
|
|
|
@@ -37,6 +39,7 @@ const defaultSpringConfig = {
|
|
|
37
39
|
|
|
38
40
|
function Carousel(props, ref) {
|
|
39
41
|
const {
|
|
42
|
+
defaultIndex = 0,
|
|
40
43
|
height = '100%',
|
|
41
44
|
data: _data = [],
|
|
42
45
|
loop = true,
|
|
@@ -52,11 +55,30 @@ function Carousel(props, ref) {
|
|
|
52
55
|
onSnapToItem,
|
|
53
56
|
onProgressChange
|
|
54
57
|
} = props;
|
|
58
|
+
(0, _usePropsErrorBoundary.usePropsErrorBoundary)({ ...props,
|
|
59
|
+
defaultIndex,
|
|
60
|
+
height,
|
|
61
|
+
data: _data,
|
|
62
|
+
loop,
|
|
63
|
+
mode,
|
|
64
|
+
autoPlay,
|
|
65
|
+
autoPlayReverse,
|
|
66
|
+
autoPlayInterval,
|
|
67
|
+
parallaxScrollingOffset,
|
|
68
|
+
parallaxScrollingScale,
|
|
69
|
+
style,
|
|
70
|
+
panGestureHandlerProps,
|
|
71
|
+
// @ts-ignore
|
|
72
|
+
renderItem,
|
|
73
|
+
onSnapToItem,
|
|
74
|
+
onProgressChange
|
|
75
|
+
});
|
|
55
76
|
const timingConfig = { ...defaultSpringConfig,
|
|
56
77
|
...props.springConfig
|
|
57
78
|
};
|
|
58
79
|
const width = Math.round(props.width);
|
|
59
|
-
const
|
|
80
|
+
const defaultHandlerOffsetX = -Math.abs(defaultIndex * width);
|
|
81
|
+
const handlerOffsetX = (0, _reactNativeReanimated.useSharedValue)(defaultHandlerOffsetX);
|
|
60
82
|
|
|
61
83
|
const data = _react.default.useMemo(() => {
|
|
62
84
|
if (!loop) return _data;
|
|
@@ -123,8 +145,13 @@ function Carousel(props, ref) {
|
|
|
123
145
|
|
|
124
146
|
const offsetX = (0, _reactNativeReanimated.useDerivedValue)(() => {
|
|
125
147
|
const x = handlerOffsetX.value % computedAnimResult.TOTAL_WIDTH;
|
|
148
|
+
|
|
149
|
+
if (!loop) {
|
|
150
|
+
return handlerOffsetX.value;
|
|
151
|
+
}
|
|
152
|
+
|
|
126
153
|
return isNaN(x) ? 0 : x;
|
|
127
|
-
}, [computedAnimResult]);
|
|
154
|
+
}, [computedAnimResult, loop]);
|
|
128
155
|
(0, _reactNativeReanimated.useAnimatedReaction)(() => offsetX.value, value => {
|
|
129
156
|
let absoluteProgress = Math.abs(value / width);
|
|
130
157
|
|
|
@@ -184,7 +211,11 @@ function Carousel(props, ref) {
|
|
|
184
211
|
|
|
185
212
|
const page = Math.round(handlerOffsetX.value / width);
|
|
186
213
|
const velocityPage = Math.round((handlerOffsetX.value + e.velocityX) / width);
|
|
187
|
-
|
|
214
|
+
let pageWithVelocity = Math.min(page + 1, Math.max(page - 1, velocityPage));
|
|
215
|
+
|
|
216
|
+
if (!loop) {
|
|
217
|
+
pageWithVelocity = Math.max(-(data.length - 1), Math.min(0, pageWithVelocity));
|
|
218
|
+
}
|
|
188
219
|
|
|
189
220
|
if (loop) {
|
|
190
221
|
handlerOffsetX.value = _withAnimationCallback(pageWithVelocity * width);
|
|
@@ -212,13 +243,10 @@ function Carousel(props, ref) {
|
|
|
212
243
|
goToIndex
|
|
213
244
|
}), [getCurrentIndex, goToIndex, next, prev]);
|
|
214
245
|
|
|
215
|
-
const
|
|
246
|
+
const renderLayout = _react.default.useCallback((item, i) => {
|
|
216
247
|
switch (mode) {
|
|
217
248
|
case 'parallax':
|
|
218
|
-
return ({
|
|
219
|
-
index: i,
|
|
220
|
-
children
|
|
221
|
-
}) => /*#__PURE__*/_react.default.createElement(_index.ParallaxLayout, {
|
|
249
|
+
return /*#__PURE__*/_react.default.createElement(_index.ParallaxLayout, {
|
|
222
250
|
parallaxScrollingOffset: parallaxScrollingOffset,
|
|
223
251
|
parallaxScrollingScale: parallaxScrollingScale,
|
|
224
252
|
computedAnimResult: computedAnimResult,
|
|
@@ -227,13 +255,10 @@ function Carousel(props, ref) {
|
|
|
227
255
|
index: i,
|
|
228
256
|
key: i,
|
|
229
257
|
loop: loop
|
|
230
|
-
},
|
|
258
|
+
}, renderItem(item, i));
|
|
231
259
|
|
|
232
260
|
default:
|
|
233
|
-
return ({
|
|
234
|
-
index: i,
|
|
235
|
-
children
|
|
236
|
-
}) => /*#__PURE__*/_react.default.createElement(_CarouselItem.CarouselItem, {
|
|
261
|
+
return /*#__PURE__*/_react.default.createElement(_CarouselItem.CarouselItem, {
|
|
237
262
|
computedAnimResult: computedAnimResult,
|
|
238
263
|
width: width,
|
|
239
264
|
height: height,
|
|
@@ -241,12 +266,12 @@ function Carousel(props, ref) {
|
|
|
241
266
|
index: i,
|
|
242
267
|
key: i,
|
|
243
268
|
loop: loop
|
|
244
|
-
},
|
|
269
|
+
}, renderItem(item, i));
|
|
245
270
|
}
|
|
246
|
-
}, [loop, mode, computedAnimResult, height, offsetX, parallaxScrollingOffset, parallaxScrollingScale, width]);
|
|
271
|
+
}, [loop, mode, computedAnimResult, height, offsetX, parallaxScrollingOffset, parallaxScrollingScale, width, renderItem]);
|
|
247
272
|
|
|
248
273
|
return /*#__PURE__*/_react.default.createElement(_reactNativeGestureHandler.PanGestureHandler, _extends({}, panGestureHandlerProps, {
|
|
249
|
-
|
|
274
|
+
onGestureEvent: animatedListScrollHandler
|
|
250
275
|
}), /*#__PURE__*/_react.default.createElement(_reactNativeReanimated.default.View, {
|
|
251
276
|
// eslint-disable-next-line react-native/no-inline-styles
|
|
252
277
|
style: { ...style,
|
|
@@ -255,12 +280,7 @@ function Carousel(props, ref) {
|
|
|
255
280
|
flexDirection: 'row',
|
|
256
281
|
position: 'relative'
|
|
257
282
|
}
|
|
258
|
-
}, data.map(
|
|
259
|
-
return /*#__PURE__*/_react.default.createElement(Layouts, {
|
|
260
|
-
index: i,
|
|
261
|
-
key: i
|
|
262
|
-
}, renderItem(item, i));
|
|
263
|
-
})));
|
|
283
|
+
}, data.map(renderLayout)));
|
|
264
284
|
}
|
|
265
285
|
|
|
266
286
|
var _default = /*#__PURE__*/_react.default.forwardRef(Carousel);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["Carousel.tsx"],"names":["defaultSpringConfig","damping","Carousel","props","ref","height","data","_data","loop","mode","autoPlay","autoPlayReverse","autoPlayInterval","parallaxScrollingOffset","parallaxScrollingScale","style","panGestureHandlerProps","renderItem","onSnapToItem","onProgressChange","timingConfig","springConfig","width","Math","round","handlerOffsetX","React","useMemo","length","computedAnimResult","indexController","originalLength","onChange","i","carouselController","disable","onScrollBegin","onScrollEnd","run","pause","index","sharedPreIndex","sharedIndex","computedIndex","useCallback","current","offsetX","x","value","TOTAL_WIDTH","isNaN","absoluteProgress","abs","next","prev","getCurrentIndex","goToIndex","animated","to","animatedListScrollHandler","onStart","_","ctx","currentContentOffsetX","start","onActive","e","translationX","onEnd","_withAnimationCallback","num","Object","assign","velocity","velocityX","isFinished","page","velocityPage","pageWithVelocity","min","max","useImperativeHandle","Layouts","children","flexDirection","position","map","item","forwardRef"],"mappings":"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","sourcesContent":["import React from 'react';\nimport type { FlexStyle, ViewStyle } from 'react-native';\nimport {\n PanGestureHandler,\n PanGestureHandlerProps,\n PanGestureHandlerGestureEvent,\n} from 'react-native-gesture-handler';\nimport Animated, {\n cancelAnimation,\n runOnJS,\n useAnimatedGestureHandler,\n useAnimatedReaction,\n useDerivedValue,\n useSharedValue,\n withSpring,\n} from 'react-native-reanimated';\nimport { CarouselItem } from './CarouselItem';\nimport type { TMode } from './layouts';\nimport { ParallaxLayout } from './layouts/index';\nimport { useCarouselController } from './useCarouselController';\nimport { useComputedAnim } from './useComputedAnim';\nimport { useAutoPlay } from './useAutoPlay';\nimport { useIndexController } from './useIndexController';\n\nconst defaultSpringConfig: Animated.WithSpringConfig = {\n damping: 100,\n};\nexport interface ICarouselProps<T extends unknown> {\n ref?: React.Ref<ICarouselInstance>;\n /**\n * Carousel loop playback.\n * @default true\n */\n loop?: boolean;\n /**\n * Carousel Animated transitions.\n * @default 'default'\n */\n mode?: TMode;\n /**\n * Render carousel item.\n */\n renderItem: (data: T, index: number) => React.ReactNode;\n /**\n * Specified carousel container width.\n */\n width: number;\n /**\n * Specified carousel container height.\n * @default '100%'\n */\n height?: FlexStyle['height'];\n /**\n * Carousel items data set.\n */\n data: T[];\n /**\n * Auto play\n */\n autoPlay?: boolean;\n /**\n * Auto play\n * @description reverse playback\n */\n autoPlayReverse?: boolean;\n /**\n * Auto play\n * @description playback interval\n */\n autoPlayInterval?: number;\n /**\n * Carousel container style\n */\n style?: ViewStyle;\n /**\n * When use 'default' Layout props,this prop can be control prev/next item offset.\n * @default 100\n */\n parallaxScrollingOffset?: number;\n /**\n * When use 'default' Layout props,this prop can be control prev/next item offset.\n * @default 0.8\n */\n parallaxScrollingScale?: number;\n /**\n * Sping config of translation animated\n */\n springConfig?: Animated.WithSpringConfig;\n /**\n * PanGestureHandler props\n */\n panGestureHandlerProps?: Omit<\n Partial<PanGestureHandlerProps>,\n 'onHandlerStateChange'\n >;\n /**\n * Callback fired when navigating to an item\n */\n onSnapToItem?: (index: number) => void;\n /**\n * On scroll begin\n */\n onScrollBegin?: () => void;\n /**\n * On scroll end\n */\n onScrollEnd?: (previous: number, current: number) => void;\n /**\n * On progress change\n * @param offsetProgress Total of offset distance (0 390 780 ...)\n * @param absoluteProgress Convert to index (0 1 2 ...)\n */\n onProgressChange?: (\n offsetProgress: number,\n absoluteProgress: number\n ) => void;\n}\n\nexport interface ICarouselInstance {\n /**\n * Play the last one\n */\n prev: () => void;\n /**\n * Play the next one\n */\n next: () => void;\n /**\n * Get current item index\n */\n getCurrentIndex: () => number;\n /**\n * Go to index\n */\n goToIndex: (index: number, animated?: boolean) => void;\n}\n\nfunction Carousel<T extends unknown = any>(\n props: ICarouselProps<T>,\n ref: React.Ref<ICarouselInstance>\n) {\n const {\n height = '100%',\n data: _data = [],\n loop = true,\n mode = 'default',\n autoPlay,\n autoPlayReverse,\n autoPlayInterval = 1000,\n parallaxScrollingOffset,\n parallaxScrollingScale,\n style,\n panGestureHandlerProps = {},\n renderItem,\n onSnapToItem,\n onProgressChange,\n } = props;\n\n const timingConfig = {\n ...defaultSpringConfig,\n ...props.springConfig,\n };\n const width = Math.round(props.width);\n const handlerOffsetX = useSharedValue<number>(0);\n const data = React.useMemo<T[]>(() => {\n if (!loop) return _data;\n\n if (_data.length === 1) {\n return [_data[0], _data[0], _data[0]];\n }\n\n if (_data.length === 2) {\n return [_data[0], _data[1], _data[0], _data[1]];\n }\n\n return _data;\n }, [_data, loop]);\n\n const computedAnimResult = useComputedAnim(width, data.length);\n\n const indexController = useIndexController({\n originalLength: _data.length,\n length: data.length,\n handlerOffsetX,\n width,\n loop,\n onChange: (i) => onSnapToItem && runOnJS(onSnapToItem)(i),\n });\n\n const carouselController = useCarouselController({\n loop,\n width,\n handlerOffsetX,\n indexController,\n disable: !data.length,\n onScrollBegin: () => runOnJS(onScrollBegin)(),\n onScrollEnd: () => runOnJS(onScrollEnd)(),\n });\n\n const { run, pause } = useAutoPlay({\n autoPlay,\n autoPlayInterval,\n autoPlayReverse,\n carouselController,\n });\n\n const { index, sharedPreIndex, sharedIndex, computedIndex } =\n indexController;\n\n const onScrollBegin = React.useCallback(() => {\n pause();\n props.onScrollBegin?.();\n }, [pause, props]);\n\n const onScrollEnd = React.useCallback(() => {\n run();\n computedIndex();\n props.onScrollEnd?.(sharedPreIndex.current, sharedIndex.current);\n }, [sharedPreIndex, sharedIndex, computedIndex, props, run]);\n\n const offsetX = useDerivedValue(() => {\n const x = handlerOffsetX.value % computedAnimResult.TOTAL_WIDTH;\n return isNaN(x) ? 0 : x;\n }, [computedAnimResult]);\n\n useAnimatedReaction(\n () => offsetX.value,\n (value) => {\n let absoluteProgress = Math.abs(value / width);\n if (value > 0) {\n absoluteProgress = data.length - absoluteProgress;\n }\n !!onProgressChange &&\n runOnJS(onProgressChange)(value, absoluteProgress);\n },\n [onProgressChange, data]\n );\n\n const next = React.useCallback(() => {\n return carouselController.next();\n }, [carouselController]);\n\n const prev = React.useCallback(() => {\n return carouselController.prev();\n }, [carouselController]);\n\n const getCurrentIndex = React.useCallback(() => {\n return index.value;\n }, [index]);\n\n const goToIndex = React.useCallback(\n (i: number, animated?: boolean) => {\n carouselController.to(i, animated);\n },\n [carouselController]\n );\n\n const animatedListScrollHandler =\n useAnimatedGestureHandler<PanGestureHandlerGestureEvent>(\n {\n onStart: (_, ctx: any) => {\n runOnJS(pause)();\n runOnJS(onScrollBegin)();\n cancelAnimation(handlerOffsetX);\n ctx.currentContentOffsetX = handlerOffsetX.value;\n ctx.start = true;\n },\n onActive: (e, ctx: any) => {\n const { translationX } = e;\n if (\n !loop &&\n (handlerOffsetX.value >= 0 ||\n handlerOffsetX.value <= -(data.length - 1) * width)\n ) {\n handlerOffsetX.value =\n ctx.currentContentOffsetX + translationX / 2;\n return;\n }\n handlerOffsetX.value =\n ctx.currentContentOffsetX + translationX;\n },\n onEnd: (e) => {\n function _withAnimationCallback(num: number) {\n return withSpring(\n num,\n Object.assign({}, timingConfig, {\n velocity: e.velocityX,\n }),\n (isFinished) => {\n if (isFinished) {\n runOnJS(onScrollEnd)();\n }\n }\n );\n }\n\n const page = Math.round(handlerOffsetX.value / width);\n const velocityPage = Math.round(\n (handlerOffsetX.value + e.velocityX) / width\n );\n const pageWithVelocity = Math.min(\n page + 1,\n Math.max(page - 1, velocityPage)\n );\n\n if (loop) {\n handlerOffsetX.value = _withAnimationCallback(\n pageWithVelocity * width\n );\n return;\n }\n if (handlerOffsetX.value >= 0) {\n handlerOffsetX.value = _withAnimationCallback(0);\n return;\n }\n\n if (handlerOffsetX.value <= -(data.length - 1) * width) {\n handlerOffsetX.value = _withAnimationCallback(\n -(data.length - 1) * width\n );\n return;\n }\n\n handlerOffsetX.value = _withAnimationCallback(\n pageWithVelocity * width\n );\n },\n },\n [loop, data, onScrollBegin, onScrollEnd]\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 Layouts = React.useMemo<React.FC<{ index: number }>>(() => {\n switch (mode) {\n case 'parallax':\n return ({ index: i, children }) => (\n <ParallaxLayout\n parallaxScrollingOffset={parallaxScrollingOffset}\n parallaxScrollingScale={parallaxScrollingScale}\n computedAnimResult={computedAnimResult}\n width={width}\n handlerOffsetX={offsetX}\n index={i}\n key={i}\n loop={loop}\n >\n {children}\n </ParallaxLayout>\n );\n default:\n return ({ index: i, children }) => (\n <CarouselItem\n computedAnimResult={computedAnimResult}\n width={width}\n height={height}\n handlerOffsetX={offsetX}\n index={i}\n key={i}\n loop={loop}\n >\n {children}\n </CarouselItem>\n );\n }\n }, [\n loop,\n mode,\n computedAnimResult,\n height,\n offsetX,\n parallaxScrollingOffset,\n parallaxScrollingScale,\n width,\n ]);\n\n return (\n <PanGestureHandler\n {...panGestureHandlerProps}\n onHandlerStateChange={animatedListScrollHandler}\n >\n <Animated.View\n // eslint-disable-next-line react-native/no-inline-styles\n style={{\n ...style,\n width,\n height,\n flexDirection: 'row',\n position: 'relative',\n }}\n >\n {data.map((item, i) => {\n return (\n <Layouts index={i} key={i}>\n {renderItem(item, i)}\n </Layouts>\n );\n })}\n </Animated.View>\n </PanGestureHandler>\n );\n}\n\nexport default React.forwardRef(Carousel) as typeof Carousel;\n"]}
|
|
1
|
+
{"version":3,"sources":["Carousel.tsx"],"names":["defaultSpringConfig","damping","Carousel","props","ref","defaultIndex","height","data","_data","loop","mode","autoPlay","autoPlayReverse","autoPlayInterval","parallaxScrollingOffset","parallaxScrollingScale","style","panGestureHandlerProps","renderItem","onSnapToItem","onProgressChange","timingConfig","springConfig","width","Math","round","defaultHandlerOffsetX","abs","handlerOffsetX","React","useMemo","length","computedAnimResult","indexController","originalLength","onChange","i","carouselController","disable","onScrollBegin","onScrollEnd","run","pause","index","sharedPreIndex","sharedIndex","computedIndex","useCallback","current","offsetX","x","value","TOTAL_WIDTH","isNaN","absoluteProgress","next","prev","getCurrentIndex","goToIndex","animated","to","animatedListScrollHandler","onStart","_","ctx","currentContentOffsetX","start","onActive","e","translationX","onEnd","_withAnimationCallback","num","Object","assign","velocity","velocityX","isFinished","page","velocityPage","pageWithVelocity","min","max","useImperativeHandle","renderLayout","item","flexDirection","position","map","forwardRef"],"mappings":"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","sourcesContent":["import React from 'react';\nimport type { FlexStyle, ViewStyle } from 'react-native';\nimport {\n PanGestureHandler,\n PanGestureHandlerProps,\n PanGestureHandlerGestureEvent,\n} from 'react-native-gesture-handler';\nimport Animated, {\n cancelAnimation,\n runOnJS,\n useAnimatedGestureHandler,\n useAnimatedReaction,\n useDerivedValue,\n useSharedValue,\n withSpring,\n} from 'react-native-reanimated';\nimport { CarouselItem } from './CarouselItem';\nimport type { TMode } from './layouts';\nimport { ParallaxLayout } from './layouts/index';\nimport { useCarouselController } from './hooks/useCarouselController';\nimport { useComputedAnim } from './hooks/useComputedAnim';\nimport { useAutoPlay } from './hooks/useAutoPlay';\nimport { useIndexController } from './hooks/useIndexController';\nimport { usePropsErrorBoundary } from './hooks/usePropsErrorBoundary';\n\nconst defaultSpringConfig: Animated.WithSpringConfig = {\n damping: 100,\n};\nexport interface ICarouselProps<T extends unknown> {\n ref?: React.Ref<ICarouselInstance>;\n /**\n * Carousel loop playback.\n * @default true\n */\n loop?: boolean;\n /**\n * Carousel Animated transitions.\n * @default 'default'\n */\n mode?: TMode;\n /**\n * Specified carousel container width.\n */\n width: number;\n /**\n * Specified carousel container height.\n * @default '100%'\n */\n height?: FlexStyle['height'];\n /**\n * Carousel items data set.\n */\n data: T[];\n /**\n * Default index\n * @default 0\n */\n defaultIndex?: number;\n /**\n * Auto play\n */\n autoPlay?: boolean;\n /**\n * Auto play\n * @description reverse playback\n */\n autoPlayReverse?: boolean;\n /**\n * Auto play\n * @description playback interval\n */\n autoPlayInterval?: number;\n /**\n * Carousel container style\n */\n style?: ViewStyle;\n /**\n * When use 'default' Layout props,this prop can be control prev/next item offset.\n * @default 100\n */\n parallaxScrollingOffset?: number;\n /**\n * When use 'default' Layout props,this prop can be control prev/next item offset.\n * @default 0.8\n */\n parallaxScrollingScale?: number;\n /**\n * Sping config of translation animated\n */\n springConfig?: Animated.WithSpringConfig;\n /**\n * PanGestureHandler props\n */\n panGestureHandlerProps?: Omit<\n Partial<PanGestureHandlerProps>,\n 'onHandlerStateChange'\n >;\n /**\n * Render carousel item.\n */\n renderItem: (data: T, index: number) => React.ReactNode;\n /**\n * Callback fired when navigating to an item\n */\n onSnapToItem?: (index: number) => void;\n /**\n * On scroll begin\n */\n onScrollBegin?: () => void;\n /**\n * On scroll end\n */\n onScrollEnd?: (previous: number, current: number) => void;\n /**\n * On progress change\n * @param offsetProgress Total of offset distance (0 390 780 ...)\n * @param absoluteProgress Convert to index (0 1 2 ...)\n */\n onProgressChange?: (\n offsetProgress: number,\n absoluteProgress: number\n ) => void;\n}\n\nexport interface ICarouselInstance {\n /**\n * Play the last one\n */\n prev: () => void;\n /**\n * Play the next one\n */\n next: () => void;\n /**\n * Get current item index\n */\n getCurrentIndex: () => number;\n /**\n * Go to index\n */\n goToIndex: (index: number, animated?: boolean) => void;\n}\n\nfunction Carousel<T extends unknown = any>(\n props: ICarouselProps<T>,\n ref: React.Ref<ICarouselInstance>\n) {\n const {\n defaultIndex = 0,\n height = '100%',\n data: _data = [],\n loop = true,\n mode = 'default',\n autoPlay,\n autoPlayReverse,\n autoPlayInterval = 1000,\n parallaxScrollingOffset,\n parallaxScrollingScale,\n style,\n panGestureHandlerProps = {},\n renderItem,\n onSnapToItem,\n onProgressChange,\n } = props;\n\n usePropsErrorBoundary({\n ...props,\n defaultIndex,\n height,\n data: _data,\n loop,\n mode,\n autoPlay,\n autoPlayReverse,\n autoPlayInterval,\n parallaxScrollingOffset,\n parallaxScrollingScale,\n style,\n panGestureHandlerProps,\n // @ts-ignore\n renderItem,\n onSnapToItem,\n onProgressChange,\n });\n\n const timingConfig = {\n ...defaultSpringConfig,\n ...props.springConfig,\n };\n const width = Math.round(props.width);\n const defaultHandlerOffsetX = -Math.abs(defaultIndex * width);\n const handlerOffsetX = useSharedValue<number>(defaultHandlerOffsetX);\n const data = React.useMemo<T[]>(() => {\n if (!loop) return _data;\n\n if (_data.length === 1) {\n return [_data[0], _data[0], _data[0]];\n }\n\n if (_data.length === 2) {\n return [_data[0], _data[1], _data[0], _data[1]];\n }\n\n return _data;\n }, [_data, loop]);\n\n const computedAnimResult = useComputedAnim(width, data.length);\n\n const indexController = useIndexController({\n originalLength: _data.length,\n length: data.length,\n handlerOffsetX,\n width,\n loop,\n onChange: (i) => onSnapToItem && runOnJS(onSnapToItem)(i),\n });\n\n const carouselController = useCarouselController({\n loop,\n width,\n handlerOffsetX,\n indexController,\n disable: !data.length,\n onScrollBegin: () => runOnJS(onScrollBegin)(),\n onScrollEnd: () => runOnJS(onScrollEnd)(),\n });\n\n const { run, pause } = useAutoPlay({\n autoPlay,\n autoPlayInterval,\n autoPlayReverse,\n carouselController,\n });\n\n const { index, sharedPreIndex, sharedIndex, computedIndex } =\n indexController;\n\n const onScrollBegin = React.useCallback(() => {\n pause();\n props.onScrollBegin?.();\n }, [pause, props]);\n\n const onScrollEnd = React.useCallback(() => {\n run();\n computedIndex();\n props.onScrollEnd?.(sharedPreIndex.current, sharedIndex.current);\n }, [sharedPreIndex, sharedIndex, computedIndex, props, run]);\n\n const offsetX = useDerivedValue(() => {\n const x = handlerOffsetX.value % computedAnimResult.TOTAL_WIDTH;\n\n if (!loop) {\n return handlerOffsetX.value;\n }\n return isNaN(x) ? 0 : x;\n }, [computedAnimResult, loop]);\n\n useAnimatedReaction(\n () => offsetX.value,\n (value) => {\n let absoluteProgress = Math.abs(value / width);\n if (value > 0) {\n absoluteProgress = data.length - absoluteProgress;\n }\n !!onProgressChange &&\n runOnJS(onProgressChange)(value, absoluteProgress);\n },\n [onProgressChange, data]\n );\n\n const next = React.useCallback(() => {\n return carouselController.next();\n }, [carouselController]);\n\n const prev = React.useCallback(() => {\n return carouselController.prev();\n }, [carouselController]);\n\n const getCurrentIndex = React.useCallback(() => {\n return index.value;\n }, [index]);\n\n const goToIndex = React.useCallback(\n (i: number, animated?: boolean) => {\n carouselController.to(i, animated);\n },\n [carouselController]\n );\n\n const animatedListScrollHandler =\n useAnimatedGestureHandler<PanGestureHandlerGestureEvent>(\n {\n onStart: (_, ctx: any) => {\n runOnJS(pause)();\n runOnJS(onScrollBegin)();\n cancelAnimation(handlerOffsetX);\n ctx.currentContentOffsetX = handlerOffsetX.value;\n ctx.start = true;\n },\n onActive: (e, ctx: any) => {\n const { translationX } = e;\n if (\n !loop &&\n (handlerOffsetX.value >= 0 ||\n handlerOffsetX.value <= -(data.length - 1) * width)\n ) {\n handlerOffsetX.value =\n ctx.currentContentOffsetX + translationX / 2;\n return;\n }\n handlerOffsetX.value =\n ctx.currentContentOffsetX + translationX;\n },\n onEnd: (e) => {\n function _withAnimationCallback(num: number) {\n return withSpring(\n num,\n Object.assign({}, timingConfig, {\n velocity: e.velocityX,\n }),\n (isFinished) => {\n if (isFinished) {\n runOnJS(onScrollEnd)();\n }\n }\n );\n }\n\n const page = Math.round(handlerOffsetX.value / width);\n\n const velocityPage = Math.round(\n (handlerOffsetX.value + e.velocityX) / width\n );\n\n let pageWithVelocity = Math.min(\n page + 1,\n Math.max(page - 1, velocityPage)\n );\n\n if (!loop) {\n pageWithVelocity = Math.max(\n -(data.length - 1),\n Math.min(0, pageWithVelocity)\n );\n }\n\n if (loop) {\n handlerOffsetX.value = _withAnimationCallback(\n pageWithVelocity * width\n );\n return;\n }\n if (handlerOffsetX.value >= 0) {\n handlerOffsetX.value = _withAnimationCallback(0);\n return;\n }\n\n if (handlerOffsetX.value <= -(data.length - 1) * width) {\n handlerOffsetX.value = _withAnimationCallback(\n -(data.length - 1) * width\n );\n return;\n }\n\n handlerOffsetX.value = _withAnimationCallback(\n pageWithVelocity * width\n );\n },\n },\n [loop, data, onScrollBegin, onScrollEnd]\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 renderLayout = React.useCallback(\n (item: T, i: number) => {\n switch (mode) {\n case 'parallax':\n return (\n <ParallaxLayout\n parallaxScrollingOffset={parallaxScrollingOffset}\n parallaxScrollingScale={parallaxScrollingScale}\n computedAnimResult={computedAnimResult}\n width={width}\n handlerOffsetX={offsetX}\n index={i}\n key={i}\n loop={loop}\n >\n {renderItem(item, i)}\n </ParallaxLayout>\n );\n default:\n return (\n <CarouselItem\n computedAnimResult={computedAnimResult}\n width={width}\n height={height}\n handlerOffsetX={offsetX}\n index={i}\n key={i}\n loop={loop}\n >\n {renderItem(item, i)}\n </CarouselItem>\n );\n }\n },\n [\n loop,\n mode,\n computedAnimResult,\n height,\n offsetX,\n parallaxScrollingOffset,\n parallaxScrollingScale,\n width,\n renderItem,\n ]\n );\n\n return (\n <PanGestureHandler\n {...panGestureHandlerProps}\n onGestureEvent={animatedListScrollHandler}\n >\n <Animated.View\n // eslint-disable-next-line react-native/no-inline-styles\n style={{\n ...style,\n width,\n height,\n flexDirection: 'row',\n position: 'relative',\n }}\n >\n {data.map(renderLayout)}\n </Animated.View>\n </PanGestureHandler>\n );\n}\n\nexport default React.forwardRef(Carousel) as typeof Carousel;\n"]}
|
|
@@ -11,7 +11,7 @@ var _reactNative = require("react-native");
|
|
|
11
11
|
|
|
12
12
|
var _reactNativeReanimated = _interopRequireWildcard(require("react-native-reanimated"));
|
|
13
13
|
|
|
14
|
-
var _useOffsetX = require("./useOffsetX");
|
|
14
|
+
var _useOffsetX = require("./hooks/useOffsetX");
|
|
15
15
|
|
|
16
16
|
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); }
|
|
17
17
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["CarouselItem.tsx"],"names":["CarouselItem","props","handlerOffsetX","index","children","width","height","computedAnimResult","loop","x","offsetXStyle","transform","translateX","value"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AAEA;;;;;;;;AAEO,MAAMA,YAOX,GAAIC,KAAD,IAAW;AACZ,QAAM;AACFC,IAAAA,cADE;AAEFC,IAAAA,KAFE;AAGFC,IAAAA,QAHE;AAIFC,IAAAA,KAJE;AAKFC,IAAAA,MAAM,GAAG,MALP;AAMFC,IAAAA,kBANE;AAOFC,IAAAA;AAPE,MAQFP,KARJ;AASA,QAAMQ,CAAC,GAAG,4BAAW;AACjBP,IAAAA,cADiB;AAEjBC,IAAAA,KAFiB;AAGjBE,IAAAA,KAHiB;AAIjBE,IAAAA,kBAJiB;AAKjBC,IAAAA;AALiB,GAAX,CAAV;AAOA,QAAME,YAAY,GAAG,6CAAiB,MAAM;AACxC,WAAO;AACHC,MAAAA,SAAS,EAAE,CAAC;AAAEC,QAAAA,UAAU,EAAEH,CAAC,CAACI,KAAF,GAAUV,KAAK,GAAGE;AAAhC,OAAD;AADR,KAAP;AAGH,GAJoB,EAIlB,EAJkB,CAArB;AAMA,sBACI,6BAAC,8BAAD,CAAU,IAAV;AAAe,IAAA,KAAK,EAAEK;AAAtB,kBACI,6BAAC,iBAAD;AAAM,IAAA,KAAK,EAAE;AAAEL,MAAAA,KAAF;AAASC,MAAAA;AAAT;AAAb,KAAiCF,QAAjC,CADJ,CADJ;AAKH,CAnCM","sourcesContent":["import React from 'react';\nimport { FlexStyle, View } from 'react-native';\nimport Animated, { useAnimatedStyle } from 'react-native-reanimated';\nimport type { IComputedAnimResult } from './useComputedAnim';\nimport { useOffsetX } from './useOffsetX';\n\nexport const CarouselItem: React.FC<{\n loop?: boolean;\n index: number;\n handlerOffsetX: Animated.SharedValue<number>;\n width: number;\n height?: FlexStyle['height'];\n computedAnimResult: IComputedAnimResult;\n}> = (props) => {\n const {\n handlerOffsetX,\n index,\n children,\n width,\n height = '100%',\n computedAnimResult,\n loop,\n } = props;\n const x = useOffsetX({\n handlerOffsetX,\n index,\n width,\n computedAnimResult,\n loop,\n });\n const offsetXStyle = useAnimatedStyle(() => {\n return {\n transform: [{ translateX: x.value - index * width }],\n };\n }, []);\n\n return (\n <Animated.View style={offsetXStyle}>\n <View style={{ width, height }}>{children}</View>\n </Animated.View>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["CarouselItem.tsx"],"names":["CarouselItem","props","handlerOffsetX","index","children","width","height","computedAnimResult","loop","x","offsetXStyle","transform","translateX","value"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AAEA;;;;;;;;AAEO,MAAMA,YAOX,GAAIC,KAAD,IAAW;AACZ,QAAM;AACFC,IAAAA,cADE;AAEFC,IAAAA,KAFE;AAGFC,IAAAA,QAHE;AAIFC,IAAAA,KAJE;AAKFC,IAAAA,MAAM,GAAG,MALP;AAMFC,IAAAA,kBANE;AAOFC,IAAAA;AAPE,MAQFP,KARJ;AASA,QAAMQ,CAAC,GAAG,4BAAW;AACjBP,IAAAA,cADiB;AAEjBC,IAAAA,KAFiB;AAGjBE,IAAAA,KAHiB;AAIjBE,IAAAA,kBAJiB;AAKjBC,IAAAA;AALiB,GAAX,CAAV;AAOA,QAAME,YAAY,GAAG,6CAAiB,MAAM;AACxC,WAAO;AACHC,MAAAA,SAAS,EAAE,CAAC;AAAEC,QAAAA,UAAU,EAAEH,CAAC,CAACI,KAAF,GAAUV,KAAK,GAAGE;AAAhC,OAAD;AADR,KAAP;AAGH,GAJoB,EAIlB,EAJkB,CAArB;AAMA,sBACI,6BAAC,8BAAD,CAAU,IAAV;AAAe,IAAA,KAAK,EAAEK;AAAtB,kBACI,6BAAC,iBAAD;AAAM,IAAA,KAAK,EAAE;AAAEL,MAAAA,KAAF;AAASC,MAAAA;AAAT;AAAb,KAAiCF,QAAjC,CADJ,CADJ;AAKH,CAnCM","sourcesContent":["import React from 'react';\nimport { FlexStyle, View } from 'react-native';\nimport Animated, { useAnimatedStyle } from 'react-native-reanimated';\nimport type { IComputedAnimResult } from './hooks/useComputedAnim';\nimport { useOffsetX } from './hooks/useOffsetX';\n\nexport const CarouselItem: React.FC<{\n loop?: boolean;\n index: number;\n handlerOffsetX: Animated.SharedValue<number>;\n width: number;\n height?: FlexStyle['height'];\n computedAnimResult: IComputedAnimResult;\n}> = (props) => {\n const {\n handlerOffsetX,\n index,\n children,\n width,\n height = '100%',\n computedAnimResult,\n loop,\n } = props;\n const x = useOffsetX({\n handlerOffsetX,\n index,\n width,\n computedAnimResult,\n loop,\n });\n const offsetXStyle = useAnimatedStyle(() => {\n return {\n transform: [{ translateX: x.value - index * width }],\n };\n }, []);\n\n return (\n <Animated.View style={offsetXStyle}>\n <View style={{ width, height }}>{children}</View>\n </Animated.View>\n );\n};\n"]}
|
|
File without changes
|
|
File without changes
|
|
@@ -43,7 +43,8 @@ function useCarouselController(opts) {
|
|
|
43
43
|
const next = _react.default.useCallback(() => {
|
|
44
44
|
if (!canSliding() || !loop && indexController.index.value === indexController.length - 1) return;
|
|
45
45
|
onScrollBegin === null || onScrollBegin === void 0 ? void 0 : onScrollBegin();
|
|
46
|
-
|
|
46
|
+
const currentPage = Math.round(handlerOffsetX.value / width);
|
|
47
|
+
handlerOffsetX.value = (0, _reactNativeReanimated.withTiming)((currentPage - 1) * width, defaultTimingConfig, isFinished => {
|
|
47
48
|
if (isFinished) {
|
|
48
49
|
(0, _reactNativeReanimated.runOnJS)(onScrollEnd)();
|
|
49
50
|
}
|
|
@@ -53,7 +54,8 @@ function useCarouselController(opts) {
|
|
|
53
54
|
const prev = _react.default.useCallback(() => {
|
|
54
55
|
if (!canSliding() || !loop && indexController.index.value === 0) return;
|
|
55
56
|
onScrollBegin === null || onScrollBegin === void 0 ? void 0 : onScrollBegin();
|
|
56
|
-
|
|
57
|
+
const currentPage = Math.round(handlerOffsetX.value / width);
|
|
58
|
+
handlerOffsetX.value = (0, _reactNativeReanimated.withTiming)((currentPage + 1) * width, defaultTimingConfig, isFinished => {
|
|
57
59
|
if (isFinished) {
|
|
58
60
|
(0, _reactNativeReanimated.runOnJS)(onScrollEnd)();
|
|
59
61
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["useCarouselController.tsx"],"names":["defaultTimingConfig","duration","useCarouselController","opts","width","loop","handlerOffsetX","indexController","disable","canSliding","React","useCallback","onScrollEnd","onScrollBegin","next","index","value","length","currentPage","Math","round","isFinished","prev","to","animated","offset"],"mappings":";;;;;;;AAAA;;AAEA;;;;AAGA,MAAMA,mBAA8C,GAAG;AACnDC,EAAAA,QAAQ,EAAE;AADyC,CAAvD;;AAoBO,SAASC,qBAAT,CAA+BC,IAA/B,EAAiE;AACpE,QAAM;AACFC,IAAAA,KADE;AAEFC,IAAAA,IAFE;AAGFC,IAAAA,cAHE;AAIFC,IAAAA,eAJE;AAKFC,IAAAA,OAAO,GAAG;AALR,MAMFL,IANJ;;AAQA,QAAMM,UAAU,GAAGC,eAAMC,WAAN,CAAkB,MAAM;AACvC,WAAO,CAACH,OAAR;AACH,GAFkB,EAEhB,CAACA,OAAD,CAFgB,CAAnB;;AAIA,QAAMI,WAAW,GAAGF,eAAMC,WAAN,CAAkB,MAAM;AAAA;;AACxC,yBAAAR,IAAI,CAACS,WAAL,6EAAAT,IAAI;AACP,GAFmB,EAEjB,CAACA,IAAD,CAFiB,CAApB;;AAIA,QAAMU,aAAa,GAAGH,eAAMC,WAAN,CAAkB,MAAM;AAAA;;AAC1C,2BAAAR,IAAI,CAACU,aAAL,iFAAAV,IAAI;AACP,GAFqB,EAEnB,CAACA,IAAD,CAFmB,CAAtB;;AAIA,QAAMW,IAAI,GAAGJ,eAAMC,WAAN,CAAkB,MAAM;AACjC,QACI,CAACF,UAAU,EAAX,IACC,CAACJ,IAAD,IACGE,eAAe,CAACQ,KAAhB,CAAsBC,KAAtB,KAAgCT,eAAe,CAACU,MAAhB,GAAyB,CAHjE,EAKI;AAEJJ,IAAAA,aAAa,SAAb,IAAAA,aAAa,WAAb,YAAAA,aAAa;AAEb,UAAMK,WAAW,GAAGC,IAAI,CAACC,KAAL,CAAWd,cAAc,CAACU,KAAf,GAAuBZ,KAAlC,CAApB;AAEAE,IAAAA,cAAc,CAACU,KAAf,GAAuB,uCACnB,CAACE,WAAW,GAAG,CAAf,IAAoBd,KADD,EAEnBJ,mBAFmB,EAGlBqB,UAAD,IAAyB;AACrB,UAAIA,UAAJ,EAAgB;AACZ,4CAAQT,WAAR;AACH;AACJ,KAPkB,CAAvB;AASH,GArBY,EAqBV,CACCA,WADD,EAECH,UAFD,EAGCI,aAHD,EAICT,KAJD,EAKCE,cALD,EAMCC,eAND,EAOCF,IAPD,CArBU,CAAb;;AA+BA,QAAMiB,IAAI,GAAGZ,eAAMC,WAAN,CAAkB,MAAM;AACjC,QAAI,CAACF,UAAU,EAAX,IAAkB,CAACJ,IAAD,IAASE,eAAe,CAACQ,KAAhB,CAAsBC,KAAtB,KAAgC,CAA/D,EACI;AAEJH,IAAAA,aAAa,SAAb,IAAAA,aAAa,WAAb,YAAAA,aAAa;AAEb,UAAMK,WAAW,GAAGC,IAAI,CAACC,KAAL,CAAWd,cAAc,CAACU,KAAf,GAAuBZ,KAAlC,CAApB;AAEAE,IAAAA,cAAc,CAACU,KAAf,GAAuB,uCACnB,CAACE,WAAW,GAAG,CAAf,IAAoBd,KADD,EAEnBJ,mBAFmB,EAGlBqB,UAAD,IAAyB;AACrB,UAAIA,UAAJ,EAAgB;AACZ,4CAAQT,WAAR;AACH;AACJ,KAPkB,CAAvB;AASH,GAjBY,EAiBV,CACCA,WADD,EAECH,UAFD,EAGCI,aAHD,EAICT,KAJD,EAKCE,cALD,EAMCC,eAND,EAOCF,IAPD,CAjBU,CAAb;;AA2BA,QAAMkB,EAAE,GAAGb,eAAMC,WAAN,CACP,CAACI,KAAD,EAAgBS,QAAiB,GAAG,KAApC,KAA8C;AAC1C,QAAIT,KAAK,KAAKR,eAAe,CAACQ,KAAhB,CAAsBC,KAApC,EAA2C;AAC3C,QAAI,CAACP,UAAU,EAAf,EAAmB;AAEnBI,IAAAA,aAAa,SAAb,IAAAA,aAAa,WAAb,YAAAA,aAAa;AAEb,UAAMY,MAAM,GACRnB,cAAc,CAACU,KAAf,GACA,CAACT,eAAe,CAACQ,KAAhB,CAAsBC,KAAtB,GAA8BD,KAA/B,IAAwCX,KAF5C;;AAIA,QAAIoB,QAAJ,EAAc;AACVlB,MAAAA,cAAc,CAACU,KAAf,GAAuB,uCACnBS,MADmB,EAEnBzB,mBAFmB,EAGlBqB,UAAD,IAAyB;AACrBd,QAAAA,eAAe,CAACQ,KAAhB,CAAsBC,KAAtB,GAA8BD,KAA9B;;AACA,YAAIM,UAAJ,EAAgB;AACZ,8CAAQT,WAAR;AACH;AACJ,OARkB,CAAvB;AAUH,KAXD,MAWO;AACHN,MAAAA,cAAc,CAACU,KAAf,GAAuBS,MAAvB;AACAlB,MAAAA,eAAe,CAACQ,KAAhB,CAAsBC,KAAtB,GAA8BD,KAA9B;AACA,0CAAQH,WAAR;AACH;AACJ,GA3BM,EA4BP,CACIH,UADJ,EAEII,aAFJ,EAGID,WAHJ,EAIIR,KAJJ,EAKIG,eALJ,EAMID,cANJ,CA5BO,CAAX;;AAsCA,SAAO;AACHQ,IAAAA,IADG;AAEHQ,IAAAA,IAFG;AAGHC,IAAAA;AAHG,GAAP;AAKH","sourcesContent":["import React from 'react';\nimport type Animated from 'react-native-reanimated';\nimport { runOnJS, withTiming } from 'react-native-reanimated';\nimport type { IIndexController } from './useIndexController';\n\nconst defaultTimingConfig: Animated.WithTimingConfig = {\n duration: 250,\n};\n\ninterface IOpts {\n loop: boolean;\n width: number;\n handlerOffsetX: Animated.SharedValue<number>;\n indexController: IIndexController;\n disable?: boolean;\n onScrollBegin?: () => void;\n onScrollEnd?: () => void;\n}\n\nexport interface ICarouselController {\n prev: () => void;\n next: () => void;\n to: (index: number, animated?: boolean) => void;\n}\n\nexport function useCarouselController(opts: IOpts): ICarouselController {\n const {\n width,\n loop,\n handlerOffsetX,\n indexController,\n disable = false,\n } = opts;\n\n const canSliding = React.useCallback(() => {\n return !disable;\n }, [disable]);\n\n const onScrollEnd = React.useCallback(() => {\n opts.onScrollEnd?.();\n }, [opts]);\n\n const onScrollBegin = React.useCallback(() => {\n opts.onScrollBegin?.();\n }, [opts]);\n\n const next = React.useCallback(() => {\n if (\n !canSliding() ||\n (!loop &&\n indexController.index.value === indexController.length - 1)\n )\n return;\n\n onScrollBegin?.();\n\n const currentPage = Math.round(handlerOffsetX.value / width);\n\n handlerOffsetX.value = withTiming(\n (currentPage - 1) * width,\n defaultTimingConfig,\n (isFinished: boolean) => {\n if (isFinished) {\n runOnJS(onScrollEnd)();\n }\n }\n );\n }, [\n onScrollEnd,\n canSliding,\n onScrollBegin,\n width,\n handlerOffsetX,\n indexController,\n loop,\n ]);\n\n const prev = React.useCallback(() => {\n if (!canSliding() || (!loop && indexController.index.value === 0))\n return;\n\n onScrollBegin?.();\n\n const currentPage = Math.round(handlerOffsetX.value / width);\n\n handlerOffsetX.value = withTiming(\n (currentPage + 1) * width,\n defaultTimingConfig,\n (isFinished: boolean) => {\n if (isFinished) {\n runOnJS(onScrollEnd)();\n }\n }\n );\n }, [\n onScrollEnd,\n canSliding,\n onScrollBegin,\n width,\n handlerOffsetX,\n indexController,\n loop,\n ]);\n\n const to = React.useCallback(\n (index: number, animated: boolean = false) => {\n if (index === indexController.index.value) return;\n if (!canSliding()) return;\n\n onScrollBegin?.();\n\n const offset =\n handlerOffsetX.value +\n (indexController.index.value - index) * width;\n\n if (animated) {\n handlerOffsetX.value = withTiming(\n offset,\n defaultTimingConfig,\n (isFinished: boolean) => {\n indexController.index.value = index;\n if (isFinished) {\n runOnJS(onScrollEnd)();\n }\n }\n );\n } else {\n handlerOffsetX.value = offset;\n indexController.index.value = index;\n runOnJS(onScrollEnd)();\n }\n },\n [\n canSliding,\n onScrollBegin,\n onScrollEnd,\n width,\n indexController,\n handlerOffsetX,\n ]\n );\n\n return {\n next,\n prev,\n to,\n };\n}\n"]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.usePropsErrorBoundary = usePropsErrorBoundary;
|
|
7
|
+
|
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
|
9
|
+
|
|
10
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
+
|
|
12
|
+
function usePropsErrorBoundary(props) {
|
|
13
|
+
_react.default.useEffect(() => {
|
|
14
|
+
const {
|
|
15
|
+
defaultIndex,
|
|
16
|
+
data
|
|
17
|
+
} = props;
|
|
18
|
+
|
|
19
|
+
if (typeof defaultIndex === 'number' && (data === null || data === void 0 ? void 0 : data.length) > 0) {
|
|
20
|
+
if (defaultIndex < 0 || defaultIndex >= data.length) {
|
|
21
|
+
throw Error('DefaultIndex must be in the range of data length.');
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}, [props]);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=usePropsErrorBoundary.js.map
|