react-native-reanimated-carousel 0.4.0 → 0.4.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 +15 -14
- package/lib/commonjs/Carousel.js +86 -46
- package/lib/commonjs/Carousel.js.map +1 -1
- package/lib/commonjs/{useLoop.js → useAutoPlay.js} +7 -6
- package/lib/commonjs/useAutoPlay.js.map +1 -0
- package/lib/commonjs/useCarouselController.js +20 -22
- package/lib/commonjs/useCarouselController.js.map +1 -1
- package/lib/commonjs/useLock.js +41 -0
- package/lib/commonjs/useLock.js.map +1 -0
- package/lib/module/Carousel.js +84 -42
- package/lib/module/Carousel.js.map +1 -1
- package/lib/module/{useLoop.js → useAutoPlay.js} +6 -5
- package/lib/module/useAutoPlay.js.map +1 -0
- package/lib/module/useCarouselController.js +21 -21
- package/lib/module/useCarouselController.js.map +1 -1
- package/lib/module/useLock.js +34 -0
- package/lib/module/useLock.js.map +1 -0
- package/lib/typescript/Carousel.d.ts +5 -1
- package/lib/typescript/{useLoop.d.ts → useAutoPlay.d.ts} +3 -1
- package/lib/typescript/useCarouselController.d.ts +4 -0
- package/lib/typescript/useLock.d.ts +9 -0
- package/package.json +1 -1
- package/src/Carousel.tsx +91 -60
- package/src/{useLoop.ts → useAutoPlay.ts} +12 -3
- package/src/useCarouselController.tsx +44 -21
- package/src/useLock.ts +31 -0
- package/lib/commonjs/fillNum.js +0 -30
- package/lib/commonjs/fillNum.js.map +0 -1
- package/lib/commonjs/useLoop.js.map +0 -1
- package/lib/module/fillNum.js +0 -23
- package/lib/module/fillNum.js.map +0 -1
- package/lib/module/useLoop.js.map +0 -1
- package/lib/typescript/fillNum.d.ts +0 -4
- package/src/fillNum.ts +0 -17
package/lib/module/Carousel.js
CHANGED
|
@@ -2,20 +2,14 @@ import React from 'react';
|
|
|
2
2
|
import { PanGestureHandler } from 'react-native-gesture-handler';
|
|
3
3
|
import Animated, { runOnJS, useAnimatedGestureHandler, useAnimatedReaction, useDerivedValue, useSharedValue, withTiming } from 'react-native-reanimated';
|
|
4
4
|
import { CarouselItem } from './CarouselItem';
|
|
5
|
-
import { fillNum } from './fillNum';
|
|
6
5
|
import { ParallaxLayout } from './layouts/index';
|
|
7
6
|
import { useCarouselController } from './useCarouselController';
|
|
8
7
|
import { useComputedAnim } from './useComputedAnim';
|
|
9
|
-
import {
|
|
8
|
+
import { useAutoPlay } from './useAutoPlay';
|
|
10
9
|
import { useComputedIndex } from './useComputedIndex';
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
return withTiming(num, {
|
|
15
|
-
duration: 250
|
|
16
|
-
}, isFinished => {
|
|
17
|
-
!!callback && runOnJS(callback)(isFinished);
|
|
18
|
-
});
|
|
10
|
+
import { useLockController } from './useLock';
|
|
11
|
+
const defaultTimingConfig = {
|
|
12
|
+
duration: 250
|
|
19
13
|
};
|
|
20
14
|
|
|
21
15
|
function Carousel(props, ref) {
|
|
@@ -32,10 +26,14 @@ function Carousel(props, ref) {
|
|
|
32
26
|
parallaxScrollingOffset,
|
|
33
27
|
parallaxScrollingScale,
|
|
34
28
|
onSnapToItem,
|
|
35
|
-
style
|
|
29
|
+
style,
|
|
30
|
+
timingConfig = defaultTimingConfig
|
|
36
31
|
} = props;
|
|
32
|
+
const lockController = useLockController();
|
|
37
33
|
const handlerOffsetX = useSharedValue(0);
|
|
38
34
|
const data = React.useMemo(() => {
|
|
35
|
+
if (!loop) return _data;
|
|
36
|
+
|
|
39
37
|
if (_data.length === 1) {
|
|
40
38
|
return [_data[0], _data[0], _data[0]];
|
|
41
39
|
}
|
|
@@ -45,17 +43,21 @@ function Carousel(props, ref) {
|
|
|
45
43
|
}
|
|
46
44
|
|
|
47
45
|
return _data;
|
|
48
|
-
}, [_data]);
|
|
46
|
+
}, [_data, loop]);
|
|
49
47
|
const computedAnimResult = useComputedAnim(width, data.length);
|
|
50
48
|
const carouselController = useCarouselController({
|
|
51
49
|
width,
|
|
52
|
-
handlerOffsetX
|
|
50
|
+
handlerOffsetX,
|
|
51
|
+
lockController,
|
|
52
|
+
timingConfig,
|
|
53
|
+
disable: !data.length
|
|
53
54
|
});
|
|
54
|
-
|
|
55
|
+
useAutoPlay({
|
|
55
56
|
autoPlay,
|
|
56
57
|
autoPlayInterval,
|
|
57
58
|
autoPlayReverse,
|
|
58
|
-
carouselController
|
|
59
|
+
carouselController,
|
|
60
|
+
lockController
|
|
59
61
|
});
|
|
60
62
|
const {
|
|
61
63
|
index,
|
|
@@ -69,8 +71,22 @@ function Carousel(props, ref) {
|
|
|
69
71
|
const x = handlerOffsetX.value % computedAnimResult.WL;
|
|
70
72
|
return isNaN(x) ? 0 : x;
|
|
71
73
|
}, [computedAnimResult]);
|
|
72
|
-
useAnimatedReaction(() => index.value, i =>
|
|
73
|
-
|
|
74
|
+
useAnimatedReaction(() => index.value, i => {
|
|
75
|
+
if (loop) {
|
|
76
|
+
switch (_data.length) {
|
|
77
|
+
case 1:
|
|
78
|
+
i = 0;
|
|
79
|
+
break;
|
|
80
|
+
|
|
81
|
+
case 2:
|
|
82
|
+
i = i % 2;
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
onSnapToItem && runOnJS(onSnapToItem)(i);
|
|
87
|
+
}
|
|
88
|
+
}, [onSnapToItem, loop, _data]);
|
|
89
|
+
const callComputedIndex = React.useCallback(() => computedIndex === null || computedIndex === void 0 ? void 0 : computedIndex(), [computedIndex]);
|
|
74
90
|
const next = React.useCallback(() => {
|
|
75
91
|
return carouselController.next(callComputedIndex);
|
|
76
92
|
}, [carouselController, callComputedIndex]);
|
|
@@ -82,53 +98,79 @@ function Carousel(props, ref) {
|
|
|
82
98
|
}, [index]);
|
|
83
99
|
const animatedListScrollHandler = useAnimatedGestureHandler({
|
|
84
100
|
onStart: (_, ctx) => {
|
|
101
|
+
if (lockController.isLock()) return;
|
|
85
102
|
ctx.startContentOffsetX = handlerOffsetX.value;
|
|
103
|
+
ctx.currentContentOffsetX = handlerOffsetX.value;
|
|
104
|
+
ctx.start = true;
|
|
86
105
|
},
|
|
87
106
|
onActive: (e, ctx) => {
|
|
107
|
+
if (lockController.isLock() || !ctx.start) return;
|
|
108
|
+
/**
|
|
109
|
+
* `onActive` and `onEnd` return different values of translationX!So that creates a bias!TAT
|
|
110
|
+
* */
|
|
111
|
+
|
|
112
|
+
ctx.translationX = e.translationX;
|
|
113
|
+
|
|
88
114
|
if (loop) {
|
|
89
|
-
handlerOffsetX.value = ctx.
|
|
115
|
+
handlerOffsetX.value = ctx.currentContentOffsetX + e.translationX;
|
|
90
116
|
return;
|
|
91
117
|
}
|
|
92
118
|
|
|
93
|
-
handlerOffsetX.value = Math.max(Math.min(ctx.
|
|
119
|
+
handlerOffsetX.value = Math.max(Math.min(ctx.currentContentOffsetX + e.translationX, 0), -(data.length - 1) * width);
|
|
94
120
|
},
|
|
95
|
-
onEnd: e => {
|
|
96
|
-
|
|
97
|
-
const
|
|
121
|
+
onEnd: (e, ctx) => {
|
|
122
|
+
if (lockController.isLock() || !ctx.start) return;
|
|
123
|
+
const translationX = ctx.translationX;
|
|
98
124
|
|
|
99
125
|
function _withTimingCallback(num) {
|
|
100
|
-
return
|
|
126
|
+
return withTiming(num, timingConfig, isFinished => {
|
|
127
|
+
if (isFinished) {
|
|
128
|
+
ctx.start = false;
|
|
129
|
+
lockController.unLock();
|
|
130
|
+
runOnJS(callComputedIndex)();
|
|
131
|
+
}
|
|
132
|
+
});
|
|
101
133
|
}
|
|
102
134
|
|
|
103
|
-
if (
|
|
135
|
+
if (translationX > 0) {
|
|
136
|
+
/**
|
|
137
|
+
* If not loop no , longer scroll when sliding to the start.
|
|
138
|
+
* */
|
|
104
139
|
if (!loop && handlerOffsetX.value >= 0) {
|
|
105
140
|
return;
|
|
106
141
|
}
|
|
107
142
|
|
|
108
|
-
|
|
109
|
-
|
|
143
|
+
lockController.lock();
|
|
144
|
+
|
|
145
|
+
if (Math.abs(translationX) + Math.abs(e.velocityX) > width / 2) {
|
|
146
|
+
handlerOffsetX.value = _withTimingCallback(handlerOffsetX.value + width - translationX);
|
|
110
147
|
} else {
|
|
111
|
-
handlerOffsetX.value = _withTimingCallback(
|
|
148
|
+
handlerOffsetX.value = _withTimingCallback(handlerOffsetX.value - translationX);
|
|
112
149
|
}
|
|
113
150
|
|
|
114
151
|
return;
|
|
115
152
|
}
|
|
116
153
|
|
|
117
|
-
if (
|
|
154
|
+
if (translationX < 0) {
|
|
155
|
+
/**
|
|
156
|
+
* If not loop , no longer scroll when sliding to the end.
|
|
157
|
+
* */
|
|
118
158
|
if (!loop && handlerOffsetX.value <= -(data.length - 1) * width) {
|
|
119
159
|
return;
|
|
120
160
|
}
|
|
121
161
|
|
|
122
|
-
|
|
123
|
-
|
|
162
|
+
lockController.lock();
|
|
163
|
+
|
|
164
|
+
if (Math.abs(translationX) + Math.abs(e.velocityX) > width / 2) {
|
|
165
|
+
handlerOffsetX.value = _withTimingCallback(handlerOffsetX.value - width - translationX);
|
|
124
166
|
} else {
|
|
125
|
-
handlerOffsetX.value = _withTimingCallback(
|
|
167
|
+
handlerOffsetX.value = _withTimingCallback(handlerOffsetX.value - translationX);
|
|
126
168
|
}
|
|
127
169
|
|
|
128
170
|
return;
|
|
129
171
|
}
|
|
130
172
|
}
|
|
131
|
-
}, [loop, data]);
|
|
173
|
+
}, [loop, data, lockController]);
|
|
132
174
|
React.useImperativeHandle(ref, () => {
|
|
133
175
|
return {
|
|
134
176
|
next,
|
|
@@ -140,7 +182,7 @@ function Carousel(props, ref) {
|
|
|
140
182
|
switch (mode) {
|
|
141
183
|
case 'parallax':
|
|
142
184
|
return ({
|
|
143
|
-
index,
|
|
185
|
+
index: i,
|
|
144
186
|
children
|
|
145
187
|
}) => /*#__PURE__*/React.createElement(ParallaxLayout, {
|
|
146
188
|
parallaxScrollingOffset: parallaxScrollingOffset,
|
|
@@ -148,22 +190,22 @@ function Carousel(props, ref) {
|
|
|
148
190
|
computedAnimResult: computedAnimResult,
|
|
149
191
|
width: width,
|
|
150
192
|
handlerOffsetX: offsetX,
|
|
151
|
-
index:
|
|
152
|
-
key:
|
|
193
|
+
index: i,
|
|
194
|
+
key: i,
|
|
153
195
|
loop: loop
|
|
154
196
|
}, children);
|
|
155
197
|
|
|
156
198
|
default:
|
|
157
199
|
return ({
|
|
158
|
-
index,
|
|
200
|
+
index: i,
|
|
159
201
|
children
|
|
160
202
|
}) => /*#__PURE__*/React.createElement(CarouselItem, {
|
|
161
203
|
computedAnimResult: computedAnimResult,
|
|
162
204
|
width: width,
|
|
163
205
|
height: height,
|
|
164
206
|
handlerOffsetX: offsetX,
|
|
165
|
-
index:
|
|
166
|
-
key:
|
|
207
|
+
index: i,
|
|
208
|
+
key: i,
|
|
167
209
|
loop: loop
|
|
168
210
|
}, children);
|
|
169
211
|
}
|
|
@@ -178,11 +220,11 @@ function Carousel(props, ref) {
|
|
|
178
220
|
flexDirection: 'row',
|
|
179
221
|
position: 'relative'
|
|
180
222
|
}, style]
|
|
181
|
-
}, data.map((item,
|
|
223
|
+
}, data.map((item, i) => {
|
|
182
224
|
return /*#__PURE__*/React.createElement(Layouts, {
|
|
183
|
-
index:
|
|
184
|
-
key:
|
|
185
|
-
}, renderItem(item,
|
|
225
|
+
index: i,
|
|
226
|
+
key: i
|
|
227
|
+
}, renderItem(item, i));
|
|
186
228
|
})));
|
|
187
229
|
}
|
|
188
230
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["Carousel.tsx"],"names":["React","PanGestureHandler","Animated","runOnJS","useAnimatedGestureHandler","useAnimatedReaction","useDerivedValue","useSharedValue","withTiming","CarouselItem","fillNum","ParallaxLayout","useCarouselController","useComputedAnim","useLoop","useComputedIndex","_withTiming","num","callback","duration","isFinished","Carousel","props","ref","height","data","_data","width","loop","mode","renderItem","autoPlay","autoPlayReverse","autoPlayInterval","parallaxScrollingOffset","parallaxScrollingScale","onSnapToItem","style","handlerOffsetX","useMemo","length","computedAnimResult","carouselController","index","computedIndex","offsetX","x","value","WL","isNaN","i","callComputedIndex","useCallback","next","prev","getCurrentIndex","animatedListScrollHandler","onStart","_","ctx","startContentOffsetX","onActive","e","Math","round","translationX","max","min","onEnd","intTranslationX","sub","abs","_withTimingCallback","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 PanGestureHandlerGestureEvent,\n} from 'react-native-gesture-handler';\nimport Animated, {\n runOnJS,\n useAnimatedGestureHandler,\n useAnimatedReaction,\n useDerivedValue,\n useSharedValue,\n withTiming,\n} from 'react-native-reanimated';\nimport { CarouselItem } from './CarouselItem';\nimport { fillNum } from './fillNum';\nimport type { TMode } from './layouts';\nimport { ParallaxLayout } from './layouts/index';\nimport { useCarouselController } from './useCarouselController';\nimport { useComputedAnim } from './useComputedAnim';\nimport { useLoop } from './useLoop';\nimport { useComputedIndex } from './useComputedIndex';\n\nexport const _withTiming = (\n num: number,\n callback?: (isFinished: boolean) => void\n) => {\n 'worklet';\n return withTiming(\n num,\n {\n duration: 250,\n },\n (isFinished) => {\n !!callback && runOnJS(callback)(isFinished);\n }\n );\n};\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 * Callback fired when navigating to an item\n */\n onSnapToItem?: (index: number) => 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\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 width,\n loop = true,\n mode = 'default',\n renderItem,\n autoPlay,\n autoPlayReverse,\n autoPlayInterval,\n parallaxScrollingOffset,\n parallaxScrollingScale,\n onSnapToItem,\n style,\n } = props;\n const handlerOffsetX = useSharedValue<number>(0);\n const data = React.useMemo<T[]>(() => {\n if (_data.length === 1) {\n return [_data[0], _data[0], _data[0]];\n }\n if (_data.length === 2) {\n return [_data[0], _data[1], _data[0], _data[1]];\n }\n return _data;\n }, [_data]);\n\n const computedAnimResult = useComputedAnim(width, data.length);\n const carouselController = useCarouselController({ width, handlerOffsetX });\n useLoop({\n autoPlay,\n autoPlayInterval,\n autoPlayReverse,\n carouselController,\n });\n const { index, computedIndex } = useComputedIndex({\n length: data.length,\n handlerOffsetX,\n width,\n });\n\n const offsetX = useDerivedValue(() => {\n const x = handlerOffsetX.value % computedAnimResult.WL;\n return isNaN(x) ? 0 : x;\n }, [computedAnimResult]);\n\n useAnimatedReaction(\n () => index.value,\n (i) => onSnapToItem && runOnJS(onSnapToItem)(i),\n [onSnapToItem]\n );\n\n const callComputedIndex = React.useCallback(\n (isFinished: boolean) => isFinished && computedIndex?.(),\n [computedIndex]\n );\n\n const next = React.useCallback(() => {\n return carouselController.next(callComputedIndex);\n }, [carouselController, callComputedIndex]);\n\n const prev = React.useCallback(() => {\n return carouselController.prev(callComputedIndex);\n }, [carouselController, callComputedIndex]);\n\n const getCurrentIndex = React.useCallback(() => {\n return index.value;\n }, [index]);\n\n const animatedListScrollHandler =\n useAnimatedGestureHandler<PanGestureHandlerGestureEvent>(\n {\n onStart: (_, ctx: any) => {\n ctx.startContentOffsetX = handlerOffsetX.value;\n },\n onActive: (e, ctx: any) => {\n if (loop) {\n handlerOffsetX.value =\n ctx.startContentOffsetX +\n Math.round(e.translationX);\n return;\n }\n handlerOffsetX.value = Math.max(\n Math.min(\n ctx.startContentOffsetX +\n Math.round(e.translationX),\n 0\n ),\n -(data.length - 1) * width\n );\n },\n onEnd: (e) => {\n const intTranslationX = Math.round(e.translationX);\n const sub = Math.abs(intTranslationX);\n\n function _withTimingCallback(num: number) {\n return _withTiming(num, callComputedIndex);\n }\n\n if (intTranslationX > 0) {\n if (!loop && handlerOffsetX.value >= 0) {\n return;\n }\n\n if (sub > width / 2) {\n handlerOffsetX.value = _withTimingCallback(\n fillNum(\n width,\n handlerOffsetX.value + (width - sub)\n )\n );\n } else {\n handlerOffsetX.value = _withTimingCallback(\n fillNum(width, handlerOffsetX.value - sub)\n );\n }\n return;\n }\n\n if (intTranslationX < 0) {\n if (\n !loop &&\n handlerOffsetX.value <= -(data.length - 1) * width\n ) {\n return;\n }\n\n if (sub > width / 2) {\n handlerOffsetX.value = _withTimingCallback(\n fillNum(\n width,\n handlerOffsetX.value - (width - sub)\n )\n );\n } else {\n handlerOffsetX.value = _withTimingCallback(\n fillNum(width, handlerOffsetX.value + sub)\n );\n }\n return;\n }\n },\n },\n [loop, data]\n );\n\n React.useImperativeHandle(ref, () => {\n return {\n next,\n prev,\n getCurrentIndex,\n };\n });\n\n const Layouts = React.useMemo<React.FC<{ index: number }>>(() => {\n switch (mode) {\n case 'parallax':\n return ({ index, children }) => (\n <ParallaxLayout\n parallaxScrollingOffset={parallaxScrollingOffset}\n parallaxScrollingScale={parallaxScrollingScale}\n computedAnimResult={computedAnimResult}\n width={width}\n handlerOffsetX={offsetX}\n index={index}\n key={index}\n loop={loop}\n >\n {children}\n </ParallaxLayout>\n );\n default:\n return ({ index, children }) => (\n <CarouselItem\n computedAnimResult={computedAnimResult}\n width={width}\n height={height}\n handlerOffsetX={offsetX}\n index={index}\n key={index}\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 onHandlerStateChange={animatedListScrollHandler}>\n <Animated.View\n style={[\n // eslint-disable-next-line react-native/no-inline-styles\n {\n width,\n height,\n flexDirection: 'row',\n position: 'relative',\n },\n style,\n ]}\n >\n {data.map((item, index) => {\n return (\n <Layouts index={index} key={index}>\n {renderItem(item, index)}\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":["React","PanGestureHandler","Animated","runOnJS","useAnimatedGestureHandler","useAnimatedReaction","useDerivedValue","useSharedValue","withTiming","CarouselItem","ParallaxLayout","useCarouselController","useComputedAnim","useAutoPlay","useComputedIndex","useLockController","defaultTimingConfig","duration","Carousel","props","ref","height","data","_data","width","loop","mode","renderItem","autoPlay","autoPlayReverse","autoPlayInterval","parallaxScrollingOffset","parallaxScrollingScale","onSnapToItem","style","timingConfig","lockController","handlerOffsetX","useMemo","length","computedAnimResult","carouselController","disable","index","computedIndex","offsetX","x","value","WL","isNaN","i","callComputedIndex","useCallback","next","prev","getCurrentIndex","animatedListScrollHandler","onStart","_","ctx","isLock","startContentOffsetX","currentContentOffsetX","start","onActive","e","translationX","Math","max","min","onEnd","_withTimingCallback","num","isFinished","unLock","lock","abs","velocityX","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 PanGestureHandlerGestureEvent,\n} from 'react-native-gesture-handler';\nimport Animated, {\n runOnJS,\n useAnimatedGestureHandler,\n useAnimatedReaction,\n useDerivedValue,\n useSharedValue,\n withTiming,\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 { useComputedIndex } from './useComputedIndex';\nimport { useLockController } from './useLock';\n\nconst defaultTimingConfig: Animated.WithTimingConfig = {\n duration: 250,\n};\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 * Callback fired when navigating to an item\n */\n onSnapToItem?: (index: number) => void;\n /**\n * Timing config of translation animated\n */\n timingConfig?: Animated.WithTimingConfig;\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\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 width,\n loop = true,\n mode = 'default',\n renderItem,\n autoPlay,\n autoPlayReverse,\n autoPlayInterval,\n parallaxScrollingOffset,\n parallaxScrollingScale,\n onSnapToItem,\n style,\n timingConfig = defaultTimingConfig,\n } = props;\n const lockController = useLockController();\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 const carouselController = useCarouselController({\n width,\n handlerOffsetX,\n lockController,\n timingConfig,\n disable: !data.length,\n });\n useAutoPlay({\n autoPlay,\n autoPlayInterval,\n autoPlayReverse,\n carouselController,\n lockController,\n });\n const { index, computedIndex } = useComputedIndex({\n length: data.length,\n handlerOffsetX,\n width,\n });\n\n const offsetX = useDerivedValue(() => {\n const x = handlerOffsetX.value % computedAnimResult.WL;\n return isNaN(x) ? 0 : x;\n }, [computedAnimResult]);\n\n useAnimatedReaction(\n () => index.value,\n (i) => {\n if (loop) {\n switch (_data.length) {\n case 1:\n i = 0;\n break;\n case 2:\n i = i % 2;\n break;\n }\n onSnapToItem && runOnJS(onSnapToItem)(i);\n }\n },\n [onSnapToItem, loop, _data]\n );\n\n const callComputedIndex = React.useCallback(\n () => computedIndex?.(),\n [computedIndex]\n );\n\n const next = React.useCallback(() => {\n return carouselController.next(callComputedIndex);\n }, [carouselController, callComputedIndex]);\n\n const prev = React.useCallback(() => {\n return carouselController.prev(callComputedIndex);\n }, [carouselController, callComputedIndex]);\n\n const getCurrentIndex = React.useCallback(() => {\n return index.value;\n }, [index]);\n\n const animatedListScrollHandler =\n useAnimatedGestureHandler<PanGestureHandlerGestureEvent>(\n {\n onStart: (_, ctx: any) => {\n if (lockController.isLock()) return;\n ctx.startContentOffsetX = handlerOffsetX.value;\n ctx.currentContentOffsetX = handlerOffsetX.value;\n ctx.start = true;\n },\n onActive: (e, ctx: any) => {\n if (lockController.isLock() || !ctx.start) return;\n /**\n * `onActive` and `onEnd` return different values of translationX!So that creates a bias!TAT\n * */\n ctx.translationX = e.translationX;\n if (loop) {\n handlerOffsetX.value =\n ctx.currentContentOffsetX + e.translationX;\n return;\n }\n handlerOffsetX.value = Math.max(\n Math.min(ctx.currentContentOffsetX + e.translationX, 0),\n -(data.length - 1) * width\n );\n },\n onEnd: (e, ctx: any) => {\n if (lockController.isLock() || !ctx.start) return;\n const translationX = ctx.translationX;\n function _withTimingCallback(num: number) {\n return withTiming(num, timingConfig, (isFinished) => {\n if (isFinished) {\n ctx.start = false;\n lockController.unLock();\n runOnJS(callComputedIndex)();\n }\n });\n }\n\n if (translationX > 0) {\n /**\n * If not loop no , longer scroll when sliding to the start.\n * */\n if (!loop && handlerOffsetX.value >= 0) {\n return;\n }\n lockController.lock();\n if (\n Math.abs(translationX) + Math.abs(e.velocityX) >\n width / 2\n ) {\n handlerOffsetX.value = _withTimingCallback(\n handlerOffsetX.value + width - translationX\n );\n } else {\n handlerOffsetX.value = _withTimingCallback(\n handlerOffsetX.value - translationX\n );\n }\n return;\n }\n\n if (translationX < 0) {\n /**\n * If not loop , no longer scroll when sliding to the end.\n * */\n if (\n !loop &&\n handlerOffsetX.value <= -(data.length - 1) * width\n ) {\n return;\n }\n lockController.lock();\n if (\n Math.abs(translationX) + Math.abs(e.velocityX) >\n width / 2\n ) {\n handlerOffsetX.value = _withTimingCallback(\n handlerOffsetX.value - width - translationX\n );\n } else {\n handlerOffsetX.value = _withTimingCallback(\n handlerOffsetX.value - translationX\n );\n }\n return;\n }\n },\n },\n [loop, data, lockController]\n );\n\n React.useImperativeHandle(ref, () => {\n return {\n next,\n prev,\n getCurrentIndex,\n };\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 onHandlerStateChange={animatedListScrollHandler}>\n <Animated.View\n style={[\n // eslint-disable-next-line react-native/no-inline-styles\n {\n width,\n height,\n flexDirection: 'row',\n position: 'relative',\n },\n style,\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,10 +1,11 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
export function
|
|
2
|
+
export function useAutoPlay(opts) {
|
|
3
3
|
const {
|
|
4
4
|
autoPlay = false,
|
|
5
5
|
autoPlayReverse = false,
|
|
6
6
|
autoPlayInterval = 1000,
|
|
7
|
-
carouselController
|
|
7
|
+
carouselController,
|
|
8
|
+
lockController
|
|
8
9
|
} = opts;
|
|
9
10
|
const timer = React.useRef();
|
|
10
11
|
React.useEffect(() => {
|
|
@@ -12,7 +13,7 @@ export function useLoop(opts) {
|
|
|
12
13
|
clearInterval(timer.current);
|
|
13
14
|
}
|
|
14
15
|
|
|
15
|
-
if (autoPlay) {
|
|
16
|
+
if (autoPlay && !lockController.isLock()) {
|
|
16
17
|
timer.current = setInterval(() => {
|
|
17
18
|
autoPlayReverse ? carouselController.prev() : carouselController.next();
|
|
18
19
|
}, autoPlayInterval);
|
|
@@ -21,6 +22,6 @@ export function useLoop(opts) {
|
|
|
21
22
|
return () => {
|
|
22
23
|
!!timer.current && clearInterval(timer.current);
|
|
23
24
|
};
|
|
24
|
-
}, [autoPlay, autoPlayReverse, autoPlayInterval, carouselController]);
|
|
25
|
+
}, [autoPlay, autoPlayReverse, autoPlayInterval, carouselController, lockController]);
|
|
25
26
|
}
|
|
26
|
-
//# sourceMappingURL=
|
|
27
|
+
//# sourceMappingURL=useAutoPlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["useAutoPlay.ts"],"names":["React","useAutoPlay","opts","autoPlay","autoPlayReverse","autoPlayInterval","carouselController","lockController","timer","useRef","useEffect","current","clearInterval","isLock","setInterval","prev","next"],"mappings":"AAAA,OAAO,KAAKA,KAAZ,MAAuB,OAAvB;AAIA,OAAO,SAASC,WAAT,CAAqBC,IAArB,EAMJ;AACC,QAAM;AACFC,IAAAA,QAAQ,GAAG,KADT;AAEFC,IAAAA,eAAe,GAAG,KAFhB;AAGFC,IAAAA,gBAAgB,GAAG,IAHjB;AAIFC,IAAAA,kBAJE;AAKFC,IAAAA;AALE,MAMFL,IANJ;AAOA,QAAMM,KAAK,GAAGR,KAAK,CAACS,MAAN,EAAd;AACAT,EAAAA,KAAK,CAACU,SAAN,CAAgB,MAAM;AAClB,QAAIF,KAAK,CAACG,OAAV,EAAmB;AACfC,MAAAA,aAAa,CAACJ,KAAK,CAACG,OAAP,CAAb;AACH;;AACD,QAAIR,QAAQ,IAAI,CAACI,cAAc,CAACM,MAAf,EAAjB,EAA0C;AACtCL,MAAAA,KAAK,CAACG,OAAN,GAAgBG,WAAW,CAAC,MAAM;AAC9BV,QAAAA,eAAe,GACTE,kBAAkB,CAACS,IAAnB,EADS,GAETT,kBAAkB,CAACU,IAAnB,EAFN;AAGH,OAJ0B,EAIxBX,gBAJwB,CAA3B;AAKH;;AACD,WAAO,MAAM;AACT,OAAC,CAACG,KAAK,CAACG,OAAR,IAAmBC,aAAa,CAACJ,KAAK,CAACG,OAAP,CAAhC;AACH,KAFD;AAGH,GAdD,EAcG,CACCR,QADD,EAECC,eAFD,EAGCC,gBAHD,EAICC,kBAJD,EAKCC,cALD,CAdH;AAqBH","sourcesContent":["import * as React from 'react';\nimport type { ICarouselController } from './useCarouselController';\nimport type { ILockController } from './useLock';\n\nexport function useAutoPlay(opts: {\n autoPlay?: boolean;\n autoPlayInterval?: number;\n autoPlayReverse?: boolean;\n carouselController: ICarouselController;\n lockController: ILockController;\n}) {\n const {\n autoPlay = false,\n autoPlayReverse = false,\n autoPlayInterval = 1000,\n carouselController,\n lockController,\n } = opts;\n const timer = React.useRef<NodeJS.Timer>();\n React.useEffect(() => {\n if (timer.current) {\n clearInterval(timer.current);\n }\n if (autoPlay && !lockController.isLock()) {\n timer.current = setInterval(() => {\n autoPlayReverse\n ? carouselController.prev()\n : carouselController.next();\n }, autoPlayInterval);\n }\n return () => {\n !!timer.current && clearInterval(timer.current);\n };\n }, [\n autoPlay,\n autoPlayReverse,\n autoPlayInterval,\n carouselController,\n lockController,\n ]);\n}\n"]}
|
|
@@ -1,36 +1,36 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import {
|
|
3
|
-
import { useSharedValue } from 'react-native-reanimated';
|
|
2
|
+
import { runOnJS, withTiming } from 'react-native-reanimated';
|
|
4
3
|
export function useCarouselController(opts) {
|
|
5
|
-
const lock = useSharedValue(false);
|
|
6
4
|
const {
|
|
7
5
|
width,
|
|
8
|
-
handlerOffsetX
|
|
6
|
+
handlerOffsetX,
|
|
7
|
+
timingConfig,
|
|
8
|
+
lockController,
|
|
9
|
+
disable = false
|
|
9
10
|
} = opts;
|
|
10
11
|
const closeLock = React.useCallback(isFinished => {
|
|
11
12
|
if (isFinished) {
|
|
12
|
-
|
|
13
|
+
lockController.unLock();
|
|
13
14
|
}
|
|
14
|
-
}, [
|
|
15
|
-
const openLock = React.useCallback(() => {
|
|
16
|
-
lock.value = true;
|
|
17
|
-
}, [lock]);
|
|
15
|
+
}, [lockController]);
|
|
18
16
|
const next = React.useCallback(callback => {
|
|
19
|
-
if (
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
17
|
+
if (disable) return;
|
|
18
|
+
if (lockController.isLock()) return;
|
|
19
|
+
lockController.lock();
|
|
20
|
+
handlerOffsetX.value = withTiming(handlerOffsetX.value - width, timingConfig, isFinished => {
|
|
21
|
+
!!callback && runOnJS(callback)(isFinished);
|
|
22
|
+
runOnJS(closeLock)(isFinished);
|
|
24
23
|
});
|
|
25
|
-
}, [width,
|
|
24
|
+
}, [width, lockController, timingConfig, closeLock, handlerOffsetX, disable]);
|
|
26
25
|
const prev = React.useCallback(callback => {
|
|
27
|
-
if (
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
26
|
+
if (disable) return;
|
|
27
|
+
if (lockController.isLock()) return;
|
|
28
|
+
lockController.lock();
|
|
29
|
+
handlerOffsetX.value = withTiming(handlerOffsetX.value + width, timingConfig, isFinished => {
|
|
30
|
+
!!callback && runOnJS(callback)(isFinished);
|
|
31
|
+
runOnJS(closeLock)(isFinished);
|
|
32
32
|
});
|
|
33
|
-
}, [width,
|
|
33
|
+
}, [width, lockController, timingConfig, closeLock, handlerOffsetX, disable]);
|
|
34
34
|
return {
|
|
35
35
|
next,
|
|
36
36
|
prev
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useCarouselController.tsx"],"names":["React","
|
|
1
|
+
{"version":3,"sources":["useCarouselController.tsx"],"names":["React","runOnJS","withTiming","useCarouselController","opts","width","handlerOffsetX","timingConfig","lockController","disable","closeLock","useCallback","isFinished","unLock","next","callback","isLock","lock","value","prev"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AAEA,SAASC,OAAT,EAAkBC,UAAlB,QAAoC,yBAApC;AAgBA,OAAO,SAASC,qBAAT,CAA+BC,IAA/B,EAAiE;AACpE,QAAM;AACFC,IAAAA,KADE;AAEFC,IAAAA,cAFE;AAGFC,IAAAA,YAHE;AAIFC,IAAAA,cAJE;AAKFC,IAAAA,OAAO,GAAG;AALR,MAMFL,IANJ;AAQA,QAAMM,SAAS,GAAGV,KAAK,CAACW,WAAN,CACbC,UAAD,IAAyB;AACrB,QAAIA,UAAJ,EAAgB;AACZJ,MAAAA,cAAc,CAACK,MAAf;AACH;AACJ,GALa,EAMd,CAACL,cAAD,CANc,CAAlB;AASA,QAAMM,IAAI,GAAGd,KAAK,CAACW,WAAN,CACRI,QAAD,IAA8C;AAC1C,QAAIN,OAAJ,EAAa;AACb,QAAID,cAAc,CAACQ,MAAf,EAAJ,EAA6B;AAC7BR,IAAAA,cAAc,CAACS,IAAf;AACAX,IAAAA,cAAc,CAACY,KAAf,GAAuBhB,UAAU,CAC7BI,cAAc,CAACY,KAAf,GAAuBb,KADM,EAE7BE,YAF6B,EAG5BK,UAAD,IAAyB;AACrB,OAAC,CAACG,QAAF,IAAcd,OAAO,CAACc,QAAD,CAAP,CAAkBH,UAAlB,CAAd;AACAX,MAAAA,OAAO,CAACS,SAAD,CAAP,CAAmBE,UAAnB;AACH,KAN4B,CAAjC;AAQH,GAbQ,EAcT,CACIP,KADJ,EAEIG,cAFJ,EAGID,YAHJ,EAIIG,SAJJ,EAKIJ,cALJ,EAMIG,OANJ,CAdS,CAAb;AAwBA,QAAMU,IAAI,GAAGnB,KAAK,CAACW,WAAN,CACRI,QAAD,IAA8C;AAC1C,QAAIN,OAAJ,EAAa;AACb,QAAID,cAAc,CAACQ,MAAf,EAAJ,EAA6B;AAC7BR,IAAAA,cAAc,CAACS,IAAf;AACAX,IAAAA,cAAc,CAACY,KAAf,GAAuBhB,UAAU,CAC7BI,cAAc,CAACY,KAAf,GAAuBb,KADM,EAE7BE,YAF6B,EAG5BK,UAAD,IAAyB;AACrB,OAAC,CAACG,QAAF,IAAcd,OAAO,CAACc,QAAD,CAAP,CAAkBH,UAAlB,CAAd;AACAX,MAAAA,OAAO,CAACS,SAAD,CAAP,CAAmBE,UAAnB;AACH,KAN4B,CAAjC;AAQH,GAbQ,EAcT,CACIP,KADJ,EAEIG,cAFJ,EAGID,YAHJ,EAIIG,SAJJ,EAKIJ,cALJ,EAMIG,OANJ,CAdS,CAAb;AAwBA,SAAO;AACHK,IAAAA,IADG;AAEHK,IAAAA;AAFG,GAAP;AAIH","sourcesContent":["import React from 'react';\nimport type Animated from 'react-native-reanimated';\nimport { runOnJS, withTiming } from 'react-native-reanimated';\nimport type { ILockController } from './useLock';\n\ninterface IOpts {\n width: number;\n handlerOffsetX: Animated.SharedValue<number>;\n lockController: ILockController;\n timingConfig: Animated.WithTimingConfig;\n disable?: boolean;\n}\n\nexport interface ICarouselController {\n prev: (callback?: (isFinished: boolean) => void) => void;\n next: (callback?: (isFinished: boolean) => void) => void;\n}\n\nexport function useCarouselController(opts: IOpts): ICarouselController {\n const {\n width,\n handlerOffsetX,\n timingConfig,\n lockController,\n disable = false,\n } = opts;\n\n const closeLock = React.useCallback(\n (isFinished: boolean) => {\n if (isFinished) {\n lockController.unLock();\n }\n },\n [lockController]\n );\n\n const next = React.useCallback(\n (callback?: (isFinished: boolean) => void) => {\n if (disable) return;\n if (lockController.isLock()) return;\n lockController.lock();\n handlerOffsetX.value = withTiming(\n handlerOffsetX.value - width,\n timingConfig,\n (isFinished: boolean) => {\n !!callback && runOnJS(callback)(isFinished);\n runOnJS(closeLock)(isFinished);\n }\n );\n },\n [\n width,\n lockController,\n timingConfig,\n closeLock,\n handlerOffsetX,\n disable,\n ]\n );\n\n const prev = React.useCallback(\n (callback?: (isFinished: boolean) => void) => {\n if (disable) return;\n if (lockController.isLock()) return;\n lockController.lock();\n handlerOffsetX.value = withTiming(\n handlerOffsetX.value + width,\n timingConfig,\n (isFinished: boolean) => {\n !!callback && runOnJS(callback)(isFinished);\n runOnJS(closeLock)(isFinished);\n }\n );\n },\n [\n width,\n lockController,\n timingConfig,\n closeLock,\n handlerOffsetX,\n disable,\n ]\n );\n\n return {\n next,\n prev,\n };\n}\n"]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { useSharedValue } from 'react-native-reanimated';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Cannot operate while animation is locking
|
|
5
|
+
*/
|
|
6
|
+
export function useLockController() {
|
|
7
|
+
// This value is true if the animation is executing
|
|
8
|
+
const _lock = useSharedValue(false);
|
|
9
|
+
|
|
10
|
+
function lock() {
|
|
11
|
+
'worklet';
|
|
12
|
+
|
|
13
|
+
_lock.value = true;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function unLock() {
|
|
17
|
+
'worklet';
|
|
18
|
+
|
|
19
|
+
_lock.value = false;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function isLock() {
|
|
23
|
+
'worklet';
|
|
24
|
+
|
|
25
|
+
return _lock.value;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return {
|
|
29
|
+
lock,
|
|
30
|
+
unLock,
|
|
31
|
+
isLock
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=useLock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["useLock.ts"],"names":["useSharedValue","useLockController","_lock","lock","value","unLock","isLock"],"mappings":"AAAA,SAASA,cAAT,QAA+B,yBAA/B;;AAOA;AACA;AACA;AACA,OAAO,SAASC,iBAAT,GAA8C;AACjD;AACA,QAAMC,KAAK,GAAGF,cAAc,CAAU,KAAV,CAA5B;;AACA,WAASG,IAAT,GAAgB;AACZ;;AACAD,IAAAA,KAAK,CAACE,KAAN,GAAc,IAAd;AACH;;AACD,WAASC,MAAT,GAAkB;AACd;;AACAH,IAAAA,KAAK,CAACE,KAAN,GAAc,KAAd;AACH;;AACD,WAASE,MAAT,GAAkB;AACd;;AACA,WAAOJ,KAAK,CAACE,KAAb;AACH;;AACD,SAAO;AACHD,IAAAA,IADG;AAEHE,IAAAA,MAFG;AAGHC,IAAAA;AAHG,GAAP;AAKH","sourcesContent":["import { useSharedValue } from 'react-native-reanimated';\nexport interface ILockController {\n lock(): void;\n unLock(): void;\n isLock(): boolean;\n}\n\n/**\n * Cannot operate while animation is locking\n */\nexport function useLockController(): ILockController {\n // This value is true if the animation is executing\n const _lock = useSharedValue<boolean>(false);\n function lock() {\n 'worklet';\n _lock.value = true;\n }\n function unLock() {\n 'worklet';\n _lock.value = false;\n }\n function isLock() {\n 'worklet';\n return _lock.value;\n }\n return {\n lock,\n unLock,\n isLock,\n };\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import type { FlexStyle, ViewStyle } from 'react-native';
|
|
3
|
+
import Animated from 'react-native-reanimated';
|
|
3
4
|
import type { TMode } from './layouts';
|
|
4
|
-
export declare const _withTiming: (num: number, callback?: ((isFinished: boolean) => void) | undefined) => number;
|
|
5
5
|
export interface ICarouselProps<T extends unknown> {
|
|
6
6
|
ref?: React.Ref<ICarouselInstance>;
|
|
7
7
|
/**
|
|
@@ -63,6 +63,10 @@ export interface ICarouselProps<T extends unknown> {
|
|
|
63
63
|
* Callback fired when navigating to an item
|
|
64
64
|
*/
|
|
65
65
|
onSnapToItem?: (index: number) => void;
|
|
66
|
+
/**
|
|
67
|
+
* Timing config of translation animated
|
|
68
|
+
*/
|
|
69
|
+
timingConfig?: Animated.WithTimingConfig;
|
|
66
70
|
}
|
|
67
71
|
export interface ICarouselInstance {
|
|
68
72
|
/**
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { ICarouselController } from './useCarouselController';
|
|
2
|
-
|
|
2
|
+
import type { ILockController } from './useLock';
|
|
3
|
+
export declare function useAutoPlay(opts: {
|
|
3
4
|
autoPlay?: boolean;
|
|
4
5
|
autoPlayInterval?: number;
|
|
5
6
|
autoPlayReverse?: boolean;
|
|
6
7
|
carouselController: ICarouselController;
|
|
8
|
+
lockController: ILockController;
|
|
7
9
|
}): void;
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import type Animated from 'react-native-reanimated';
|
|
2
|
+
import type { ILockController } from './useLock';
|
|
2
3
|
interface IOpts {
|
|
3
4
|
width: number;
|
|
4
5
|
handlerOffsetX: Animated.SharedValue<number>;
|
|
6
|
+
lockController: ILockController;
|
|
7
|
+
timingConfig: Animated.WithTimingConfig;
|
|
8
|
+
disable?: boolean;
|
|
5
9
|
}
|
|
6
10
|
export interface ICarouselController {
|
|
7
11
|
prev: (callback?: (isFinished: boolean) => void) => void;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-reanimated-carousel",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.4",
|
|
4
4
|
"description": "Simple carousel component.fully implemented using Reanimated 2.Infinitely scrolling, very smooth.",
|
|
5
5
|
"main": "lib/commonjs/index",
|
|
6
6
|
"module": "lib/module/index",
|