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.
Files changed (34) hide show
  1. package/README.md +15 -14
  2. package/lib/commonjs/Carousel.js +86 -46
  3. package/lib/commonjs/Carousel.js.map +1 -1
  4. package/lib/commonjs/{useLoop.js → useAutoPlay.js} +7 -6
  5. package/lib/commonjs/useAutoPlay.js.map +1 -0
  6. package/lib/commonjs/useCarouselController.js +20 -22
  7. package/lib/commonjs/useCarouselController.js.map +1 -1
  8. package/lib/commonjs/useLock.js +41 -0
  9. package/lib/commonjs/useLock.js.map +1 -0
  10. package/lib/module/Carousel.js +84 -42
  11. package/lib/module/Carousel.js.map +1 -1
  12. package/lib/module/{useLoop.js → useAutoPlay.js} +6 -5
  13. package/lib/module/useAutoPlay.js.map +1 -0
  14. package/lib/module/useCarouselController.js +21 -21
  15. package/lib/module/useCarouselController.js.map +1 -1
  16. package/lib/module/useLock.js +34 -0
  17. package/lib/module/useLock.js.map +1 -0
  18. package/lib/typescript/Carousel.d.ts +5 -1
  19. package/lib/typescript/{useLoop.d.ts → useAutoPlay.d.ts} +3 -1
  20. package/lib/typescript/useCarouselController.d.ts +4 -0
  21. package/lib/typescript/useLock.d.ts +9 -0
  22. package/package.json +1 -1
  23. package/src/Carousel.tsx +91 -60
  24. package/src/{useLoop.ts → useAutoPlay.ts} +12 -3
  25. package/src/useCarouselController.tsx +44 -21
  26. package/src/useLock.ts +31 -0
  27. package/lib/commonjs/fillNum.js +0 -30
  28. package/lib/commonjs/fillNum.js.map +0 -1
  29. package/lib/commonjs/useLoop.js.map +0 -1
  30. package/lib/module/fillNum.js +0 -23
  31. package/lib/module/fillNum.js.map +0 -1
  32. package/lib/module/useLoop.js.map +0 -1
  33. package/lib/typescript/fillNum.d.ts +0 -4
  34. package/src/fillNum.ts +0 -17
@@ -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 { useLoop } from './useLoop';
8
+ import { useAutoPlay } from './useAutoPlay';
10
9
  import { useComputedIndex } from './useComputedIndex';
11
- export const _withTiming = (num, callback) => {
12
- 'worklet';
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
- useLoop({
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 => onSnapToItem && runOnJS(onSnapToItem)(i), [onSnapToItem]);
73
- const callComputedIndex = React.useCallback(isFinished => isFinished && (computedIndex === null || computedIndex === void 0 ? void 0 : computedIndex()), [computedIndex]);
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.startContentOffsetX + Math.round(e.translationX);
115
+ handlerOffsetX.value = ctx.currentContentOffsetX + e.translationX;
90
116
  return;
91
117
  }
92
118
 
93
- handlerOffsetX.value = Math.max(Math.min(ctx.startContentOffsetX + Math.round(e.translationX), 0), -(data.length - 1) * width);
119
+ handlerOffsetX.value = Math.max(Math.min(ctx.currentContentOffsetX + e.translationX, 0), -(data.length - 1) * width);
94
120
  },
95
- onEnd: e => {
96
- const intTranslationX = Math.round(e.translationX);
97
- const sub = Math.abs(intTranslationX);
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 _withTiming(num, callComputedIndex);
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 (intTranslationX > 0) {
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
- if (sub > width / 2) {
109
- handlerOffsetX.value = _withTimingCallback(fillNum(width, handlerOffsetX.value + (width - sub)));
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(fillNum(width, handlerOffsetX.value - sub));
148
+ handlerOffsetX.value = _withTimingCallback(handlerOffsetX.value - translationX);
112
149
  }
113
150
 
114
151
  return;
115
152
  }
116
153
 
117
- if (intTranslationX < 0) {
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
- if (sub > width / 2) {
123
- handlerOffsetX.value = _withTimingCallback(fillNum(width, handlerOffsetX.value - (width - sub)));
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(fillNum(width, handlerOffsetX.value + sub));
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: index,
152
- key: index,
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: index,
166
- key: index,
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, index) => {
223
+ }, data.map((item, i) => {
182
224
  return /*#__PURE__*/React.createElement(Layouts, {
183
- index: index,
184
- key: index
185
- }, renderItem(item, index));
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 useLoop(opts) {
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=useLoop.js.map
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 { _withTiming } from './Carousel';
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
- lock.value = false;
13
+ lockController.unLock();
13
14
  }
14
- }, [lock]);
15
- const openLock = React.useCallback(() => {
16
- lock.value = true;
17
- }, [lock]);
15
+ }, [lockController]);
18
16
  const next = React.useCallback(callback => {
19
- if (lock.value) return;
20
- openLock();
21
- handlerOffsetX.value = _withTiming(handlerOffsetX.value - width, isFinished => {
22
- callback === null || callback === void 0 ? void 0 : callback(isFinished);
23
- closeLock(isFinished);
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, openLock, closeLock, lock, handlerOffsetX]);
24
+ }, [width, lockController, timingConfig, closeLock, handlerOffsetX, disable]);
26
25
  const prev = React.useCallback(callback => {
27
- if (lock.value) return;
28
- openLock();
29
- handlerOffsetX.value = _withTiming(handlerOffsetX.value + width, isFinished => {
30
- callback === null || callback === void 0 ? void 0 : callback(isFinished);
31
- closeLock(isFinished);
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, openLock, closeLock, lock, handlerOffsetX]);
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","_withTiming","useSharedValue","useCarouselController","opts","lock","width","handlerOffsetX","closeLock","useCallback","isFinished","value","openLock","next","callback","prev"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,SAASC,WAAT,QAA4B,YAA5B;AAEA,SAASC,cAAT,QAA+B,yBAA/B;AAYA,OAAO,SAASC,qBAAT,CAA+BC,IAA/B,EAAiE;AACpE,QAAMC,IAAI,GAAGH,cAAc,CAAU,KAAV,CAA3B;AACA,QAAM;AAAEI,IAAAA,KAAF;AAASC,IAAAA;AAAT,MAA4BH,IAAlC;AAEA,QAAMI,SAAS,GAAGR,KAAK,CAACS,WAAN,CACbC,UAAD,IAAyB;AACrB,QAAIA,UAAJ,EAAgB;AACZL,MAAAA,IAAI,CAACM,KAAL,GAAa,KAAb;AACH;AACJ,GALa,EAMd,CAACN,IAAD,CANc,CAAlB;AAQA,QAAMO,QAAQ,GAAGZ,KAAK,CAACS,WAAN,CAAkB,MAAM;AACrCJ,IAAAA,IAAI,CAACM,KAAL,GAAa,IAAb;AACH,GAFgB,EAEd,CAACN,IAAD,CAFc,CAAjB;AAIA,QAAMQ,IAAI,GAAGb,KAAK,CAACS,WAAN,CACRK,QAAD,IAA8C;AAC1C,QAAIT,IAAI,CAACM,KAAT,EAAgB;AAChBC,IAAAA,QAAQ;AACRL,IAAAA,cAAc,CAACI,KAAf,GAAuBV,WAAW,CAC9BM,cAAc,CAACI,KAAf,GAAuBL,KADO,EAE7BI,UAAD,IAAyB;AACrBI,MAAAA,QAAQ,SAAR,IAAAA,QAAQ,WAAR,YAAAA,QAAQ,CAAGJ,UAAH,CAAR;AACAF,MAAAA,SAAS,CAACE,UAAD,CAAT;AACH,KAL6B,CAAlC;AAOH,GAXQ,EAYT,CAACJ,KAAD,EAAQM,QAAR,EAAkBJ,SAAlB,EAA6BH,IAA7B,EAAmCE,cAAnC,CAZS,CAAb;AAeA,QAAMQ,IAAI,GAAGf,KAAK,CAACS,WAAN,CACRK,QAAD,IAA8C;AAC1C,QAAIT,IAAI,CAACM,KAAT,EAAgB;AAChBC,IAAAA,QAAQ;AACRL,IAAAA,cAAc,CAACI,KAAf,GAAuBV,WAAW,CAC9BM,cAAc,CAACI,KAAf,GAAuBL,KADO,EAE7BI,UAAD,IAAyB;AACrBI,MAAAA,QAAQ,SAAR,IAAAA,QAAQ,WAAR,YAAAA,QAAQ,CAAGJ,UAAH,CAAR;AACAF,MAAAA,SAAS,CAACE,UAAD,CAAT;AACH,KAL6B,CAAlC;AAOH,GAXQ,EAYT,CAACJ,KAAD,EAAQM,QAAR,EAAkBJ,SAAlB,EAA6BH,IAA7B,EAAmCE,cAAnC,CAZS,CAAb;AAeA,SAAO;AACHM,IAAAA,IADG;AAEHE,IAAAA;AAFG,GAAP;AAIH","sourcesContent":["import React from 'react';\nimport { _withTiming } from './Carousel';\nimport type Animated from 'react-native-reanimated';\nimport { useSharedValue } from 'react-native-reanimated';\n\ninterface IOpts {\n width: number;\n handlerOffsetX: Animated.SharedValue<number>;\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 lock = useSharedValue<boolean>(false);\n const { width, handlerOffsetX } = opts;\n\n const closeLock = React.useCallback(\n (isFinished: boolean) => {\n if (isFinished) {\n lock.value = false;\n }\n },\n [lock]\n );\n const openLock = React.useCallback(() => {\n lock.value = true;\n }, [lock]);\n\n const next = React.useCallback(\n (callback?: (isFinished: boolean) => void) => {\n if (lock.value) return;\n openLock();\n handlerOffsetX.value = _withTiming(\n handlerOffsetX.value - width,\n (isFinished: boolean) => {\n callback?.(isFinished);\n closeLock(isFinished);\n }\n );\n },\n [width, openLock, closeLock, lock, handlerOffsetX]\n );\n\n const prev = React.useCallback(\n (callback?: (isFinished: boolean) => void) => {\n if (lock.value) return;\n openLock();\n handlerOffsetX.value = _withTiming(\n handlerOffsetX.value + width,\n (isFinished: boolean) => {\n callback?.(isFinished);\n closeLock(isFinished);\n }\n );\n },\n [width, openLock, closeLock, lock, handlerOffsetX]\n );\n\n return {\n next,\n prev,\n };\n}\n"]}
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
- export declare function useLoop(opts: {
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;
@@ -0,0 +1,9 @@
1
+ export interface ILockController {
2
+ lock(): void;
3
+ unLock(): void;
4
+ isLock(): boolean;
5
+ }
6
+ /**
7
+ * Cannot operate while animation is locking
8
+ */
9
+ export declare function useLockController(): ILockController;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-reanimated-carousel",
3
- "version": "0.4.0",
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",