react-native-reanimated-carousel 0.4.1 → 0.4.5

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 +73 -48
  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 +21 -24
  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 +71 -44
  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 +22 -23
  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 +7 -2
  21. package/lib/typescript/useLock.d.ts +9 -0
  22. package/package.json +1 -1
  23. package/src/Carousel.tsx +73 -60
  24. package/src/{useLoop.ts → useAutoPlay.ts} +12 -3
  25. package/src/useCarouselController.tsx +61 -41
  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
package/README.md CHANGED
@@ -52,20 +52,21 @@ import Carousel from "react-native-reanimated-carousel";
52
52
 
53
53
  ## Props
54
54
 
55
- | name | required | default | types | description |
56
- | ----------------------- | -------- | ------- | ------------------------------------------- | ------------------------------------------------------------------------------ |
57
- | data | true | | T[] | Carousel items data set |
58
- | width | true | | number | Specified carousel container width |
59
- | renderItem | true | | (data: T, index: number) => React.ReactNode | Render carousel item |
60
- | autoPlay | false | false | boolean | Auto play |
61
- | autoPlayReverse | false | false | boolean | Auto play reverse playback |
62
- | autoPlayInterval | false | 1000 | autoPlayInterval | Auto play playback interval |
63
- | mode | false | defalut | 'default'\|'parallax' | Carousel Animated transitions |
64
- | loop | false | true | boolean | Carousel loop playback |
65
- | parallaxScrollingOffset | false | 100 | number | When use 'default' Layout props,this prop can be control prev/next item offset |
66
- | parallaxScrollingScale | false | 0.8 | number | When use 'default' Layout props,this prop can be control prev/next item scale |
67
- | style | false | {} | ViewStyle | Carousel container style |
68
- | height | false | '100%' | undefined \| string \| number | Specified carousel container height |
55
+ | name | required | default | types | description |
56
+ | ----------------------- | -------- | --------------- | ------------------------------------------- | ------------------------------------------------------------------------------ |
57
+ | data | true | | T[] | Carousel items data set |
58
+ | width | true | | number | Specified carousel container width |
59
+ | renderItem | true | | (data: T, index: number) => React.ReactNode | Render carousel item |
60
+ | autoPlay | false | false | boolean | Auto play |
61
+ | autoPlayReverse | false | false | boolean | Auto play reverse playback |
62
+ | autoPlayInterval | false | 1000 | autoPlayInterval | Auto play playback interval |
63
+ | mode | false | defalut | 'default'\|'parallax' | Carousel Animated transitions |
64
+ | loop | false | true | boolean | Carousel loop playback |
65
+ | parallaxScrollingOffset | false | 100 | number | When use 'default' Layout props,this prop can be control prev/next item offset |
66
+ | parallaxScrollingScale | false | 0.8 | number | When use 'default' Layout props,this prop can be control prev/next item scale |
67
+ | style | false | {} | ViewStyle | Carousel container style |
68
+ | height | false | '100%' | undefined \| string \| number | Specified carousel container height |
69
+ | timingConfig | false | {duration: 250} | Animated.WithTimingConfig | Timing config of translation animated |
69
70
 
70
71
  ## Ref
71
72
 
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.default = exports._withTiming = void 0;
6
+ exports.default = void 0;
7
7
 
8
8
  var _react = _interopRequireDefault(require("react"));
9
9
 
@@ -13,36 +13,28 @@ var _reactNativeReanimated = _interopRequireWildcard(require("react-native-reani
13
13
 
14
14
  var _CarouselItem = require("./CarouselItem");
15
15
 
16
- var _fillNum = require("./fillNum");
17
-
18
16
  var _index = require("./layouts/index");
19
17
 
20
18
  var _useCarouselController = require("./useCarouselController");
21
19
 
22
20
  var _useComputedAnim = require("./useComputedAnim");
23
21
 
24
- var _useLoop = require("./useLoop");
22
+ var _useAutoPlay = require("./useAutoPlay");
25
23
 
26
24
  var _useComputedIndex = require("./useComputedIndex");
27
25
 
26
+ var _useLock = require("./useLock");
27
+
28
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); }
29
29
 
30
30
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
31
31
 
32
32
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
33
33
 
34
- const _withTiming = (num, callback) => {
35
- 'worklet';
36
-
37
- return (0, _reactNativeReanimated.withTiming)(num, {
38
- duration: 250
39
- }, isFinished => {
40
- !!callback && (0, _reactNativeReanimated.runOnJS)(callback)(isFinished);
41
- });
34
+ const defaultTimingConfig = {
35
+ duration: 250
42
36
  };
43
37
 
44
- exports._withTiming = _withTiming;
45
-
46
38
  function Carousel(props, ref) {
47
39
  const {
48
40
  height = '100%',
@@ -57,8 +49,10 @@ function Carousel(props, ref) {
57
49
  parallaxScrollingOffset,
58
50
  parallaxScrollingScale,
59
51
  onSnapToItem,
60
- style
52
+ style,
53
+ timingConfig = defaultTimingConfig
61
54
  } = props;
55
+ const lockController = (0, _useLock.useLockController)();
62
56
  const handlerOffsetX = (0, _reactNativeReanimated.useSharedValue)(0);
63
57
 
64
58
  const data = _react.default.useMemo(() => {
@@ -79,13 +73,18 @@ function Carousel(props, ref) {
79
73
  const carouselController = (0, _useCarouselController.useCarouselController)({
80
74
  width,
81
75
  handlerOffsetX,
82
- disable: !data.length
76
+ lockController,
77
+ timingConfig,
78
+ disable: !data.length,
79
+ onNext: isFinished => isFinished && callComputedIndex(),
80
+ onPrev: isFinished => isFinished && callComputedIndex()
83
81
  });
84
- (0, _useLoop.useLoop)({
82
+ (0, _useAutoPlay.useAutoPlay)({
85
83
  autoPlay,
86
84
  autoPlayInterval,
87
85
  autoPlayReverse,
88
- carouselController
86
+ carouselController,
87
+ lockController
89
88
  });
90
89
  const {
91
90
  index,
@@ -115,15 +114,15 @@ function Carousel(props, ref) {
115
114
  }
116
115
  }, [onSnapToItem, loop, _data]);
117
116
 
118
- const callComputedIndex = _react.default.useCallback(isFinished => isFinished && (computedIndex === null || computedIndex === void 0 ? void 0 : computedIndex()), [computedIndex]);
117
+ const callComputedIndex = _react.default.useCallback(() => computedIndex === null || computedIndex === void 0 ? void 0 : computedIndex(), [computedIndex]);
119
118
 
120
119
  const next = _react.default.useCallback(() => {
121
- return carouselController.next(callComputedIndex);
122
- }, [carouselController, callComputedIndex]);
120
+ return carouselController.next();
121
+ }, [carouselController]);
123
122
 
124
123
  const prev = _react.default.useCallback(() => {
125
- return carouselController.prev(callComputedIndex);
126
- }, [carouselController, callComputedIndex]);
124
+ return carouselController.prev();
125
+ }, [carouselController]);
127
126
 
128
127
  const getCurrentIndex = _react.default.useCallback(() => {
129
128
  return index.value;
@@ -131,53 +130,79 @@ function Carousel(props, ref) {
131
130
 
132
131
  const animatedListScrollHandler = (0, _reactNativeReanimated.useAnimatedGestureHandler)({
133
132
  onStart: (_, ctx) => {
133
+ if (lockController.isLock()) return;
134
134
  ctx.startContentOffsetX = handlerOffsetX.value;
135
+ ctx.currentContentOffsetX = handlerOffsetX.value;
136
+ ctx.start = true;
135
137
  },
136
138
  onActive: (e, ctx) => {
139
+ if (lockController.isLock() || !ctx.start) return;
140
+ /**
141
+ * `onActive` and `onEnd` return different values of translationX!So that creates a bias!TAT
142
+ * */
143
+
144
+ ctx.translationX = e.translationX;
145
+
137
146
  if (loop) {
138
- handlerOffsetX.value = ctx.startContentOffsetX + Math.round(e.translationX);
147
+ handlerOffsetX.value = ctx.currentContentOffsetX + e.translationX;
139
148
  return;
140
149
  }
141
150
 
142
- handlerOffsetX.value = Math.max(Math.min(ctx.startContentOffsetX + Math.round(e.translationX), 0), -(data.length - 1) * width);
151
+ handlerOffsetX.value = Math.max(Math.min(ctx.currentContentOffsetX + e.translationX, 0), -(data.length - 1) * width);
143
152
  },
144
- onEnd: e => {
145
- const intTranslationX = Math.round(e.translationX);
146
- const sub = Math.abs(intTranslationX);
153
+ onEnd: (e, ctx) => {
154
+ if (lockController.isLock() || !ctx.start) return;
155
+ const translationX = ctx.translationX;
147
156
 
148
157
  function _withTimingCallback(num) {
149
- return _withTiming(num, callComputedIndex);
158
+ return (0, _reactNativeReanimated.withTiming)(num, timingConfig, isFinished => {
159
+ if (isFinished) {
160
+ ctx.start = false;
161
+ lockController.unLock();
162
+ (0, _reactNativeReanimated.runOnJS)(callComputedIndex)();
163
+ }
164
+ });
150
165
  }
151
166
 
152
- if (intTranslationX > 0) {
167
+ if (translationX > 0) {
168
+ /**
169
+ * If not loop no , longer scroll when sliding to the start.
170
+ * */
153
171
  if (!loop && handlerOffsetX.value >= 0) {
154
172
  return;
155
173
  }
156
174
 
157
- if (sub > width / 2) {
158
- handlerOffsetX.value = _withTimingCallback((0, _fillNum.fillNum)(width, handlerOffsetX.value + (width - sub)));
175
+ lockController.lock();
176
+
177
+ if (Math.abs(translationX) + Math.abs(e.velocityX) > width / 2) {
178
+ handlerOffsetX.value = _withTimingCallback(handlerOffsetX.value + width - translationX);
159
179
  } else {
160
- handlerOffsetX.value = _withTimingCallback((0, _fillNum.fillNum)(width, handlerOffsetX.value - sub));
180
+ handlerOffsetX.value = _withTimingCallback(handlerOffsetX.value - translationX);
161
181
  }
162
182
 
163
183
  return;
164
184
  }
165
185
 
166
- if (intTranslationX < 0) {
186
+ if (translationX < 0) {
187
+ /**
188
+ * If not loop , no longer scroll when sliding to the end.
189
+ * */
167
190
  if (!loop && handlerOffsetX.value <= -(data.length - 1) * width) {
168
191
  return;
169
192
  }
170
193
 
171
- if (sub > width / 2) {
172
- handlerOffsetX.value = _withTimingCallback((0, _fillNum.fillNum)(width, handlerOffsetX.value - (width - sub)));
194
+ lockController.lock();
195
+
196
+ if (Math.abs(translationX) + Math.abs(e.velocityX) > width / 2) {
197
+ handlerOffsetX.value = _withTimingCallback(handlerOffsetX.value - width - translationX);
173
198
  } else {
174
- handlerOffsetX.value = _withTimingCallback((0, _fillNum.fillNum)(width, handlerOffsetX.value + sub));
199
+ handlerOffsetX.value = _withTimingCallback(handlerOffsetX.value - translationX);
175
200
  }
176
201
 
177
202
  return;
178
203
  }
179
204
  }
180
- }, [loop, data]);
205
+ }, [loop, data, lockController]);
181
206
 
182
207
  _react.default.useImperativeHandle(ref, () => {
183
208
  return {
@@ -191,7 +216,7 @@ function Carousel(props, ref) {
191
216
  switch (mode) {
192
217
  case 'parallax':
193
218
  return ({
194
- index,
219
+ index: i,
195
220
  children
196
221
  }) => /*#__PURE__*/_react.default.createElement(_index.ParallaxLayout, {
197
222
  parallaxScrollingOffset: parallaxScrollingOffset,
@@ -199,22 +224,22 @@ function Carousel(props, ref) {
199
224
  computedAnimResult: computedAnimResult,
200
225
  width: width,
201
226
  handlerOffsetX: offsetX,
202
- index: index,
203
- key: index,
227
+ index: i,
228
+ key: i,
204
229
  loop: loop
205
230
  }, children);
206
231
 
207
232
  default:
208
233
  return ({
209
- index,
234
+ index: i,
210
235
  children
211
236
  }) => /*#__PURE__*/_react.default.createElement(_CarouselItem.CarouselItem, {
212
237
  computedAnimResult: computedAnimResult,
213
238
  width: width,
214
239
  height: height,
215
240
  handlerOffsetX: offsetX,
216
- index: index,
217
- key: index,
241
+ index: i,
242
+ key: i,
218
243
  loop: loop
219
244
  }, children);
220
245
  }
@@ -230,11 +255,11 @@ function Carousel(props, ref) {
230
255
  flexDirection: 'row',
231
256
  position: 'relative'
232
257
  }, style]
233
- }, data.map((item, index) => {
258
+ }, data.map((item, i) => {
234
259
  return /*#__PURE__*/_react.default.createElement(Layouts, {
235
- index: index,
236
- key: index
237
- }, renderItem(item, index));
260
+ index: i,
261
+ key: i
262
+ }, renderItem(item, i));
238
263
  })));
239
264
  }
240
265
 
@@ -1 +1 @@
1
- {"version":3,"sources":["Carousel.tsx"],"names":["_withTiming","num","callback","duration","isFinished","Carousel","props","ref","height","data","_data","width","loop","mode","renderItem","autoPlay","autoPlayReverse","autoPlayInterval","parallaxScrollingOffset","parallaxScrollingScale","onSnapToItem","style","handlerOffsetX","React","useMemo","length","computedAnimResult","carouselController","disable","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 (!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 disable: !data.length,\n });\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) => {\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 (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":["defaultTimingConfig","duration","Carousel","props","ref","height","data","_data","width","loop","mode","renderItem","autoPlay","autoPlayReverse","autoPlayInterval","parallaxScrollingOffset","parallaxScrollingScale","onSnapToItem","style","timingConfig","lockController","handlerOffsetX","React","useMemo","length","computedAnimResult","carouselController","disable","onNext","isFinished","callComputedIndex","onPrev","index","computedIndex","offsetX","x","value","WL","isNaN","i","useCallback","next","prev","getCurrentIndex","animatedListScrollHandler","onStart","_","ctx","isLock","startContentOffsetX","currentContentOffsetX","start","onActive","e","translationX","Math","max","min","onEnd","_withTimingCallback","num","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 onNext: (isFinished) => isFinished && callComputedIndex(),\n onPrev: (isFinished) => isFinished && callComputedIndex(),\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();\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 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"]}
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.useLoop = useLoop;
6
+ exports.useAutoPlay = useAutoPlay;
7
7
 
8
8
  var React = _interopRequireWildcard(require("react"));
9
9
 
@@ -11,12 +11,13 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
11
11
 
12
12
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
13
13
 
14
- function useLoop(opts) {
14
+ function useAutoPlay(opts) {
15
15
  const {
16
16
  autoPlay = false,
17
17
  autoPlayReverse = false,
18
18
  autoPlayInterval = 1000,
19
- carouselController
19
+ carouselController,
20
+ lockController
20
21
  } = opts;
21
22
  const timer = React.useRef();
22
23
  React.useEffect(() => {
@@ -24,7 +25,7 @@ function useLoop(opts) {
24
25
  clearInterval(timer.current);
25
26
  }
26
27
 
27
- if (autoPlay) {
28
+ if (autoPlay && !lockController.isLock()) {
28
29
  timer.current = setInterval(() => {
29
30
  autoPlayReverse ? carouselController.prev() : carouselController.next();
30
31
  }, autoPlayInterval);
@@ -33,6 +34,6 @@ function useLoop(opts) {
33
34
  return () => {
34
35
  !!timer.current && clearInterval(timer.current);
35
36
  };
36
- }, [autoPlay, autoPlayReverse, autoPlayInterval, carouselController]);
37
+ }, [autoPlay, autoPlayReverse, autoPlayInterval, carouselController, lockController]);
37
38
  }
38
- //# sourceMappingURL=useLoop.js.map
39
+ //# sourceMappingURL=useAutoPlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["useAutoPlay.ts"],"names":["useAutoPlay","opts","autoPlay","autoPlayReverse","autoPlayInterval","carouselController","lockController","timer","React","useRef","useEffect","current","clearInterval","isLock","setInterval","prev","next"],"mappings":";;;;;;;AAAA;;;;;;AAIO,SAASA,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,GAAGC,KAAK,CAACC,MAAN,EAAd;AACAD,EAAAA,KAAK,CAACE,SAAN,CAAgB,MAAM;AAClB,QAAIH,KAAK,CAACI,OAAV,EAAmB;AACfC,MAAAA,aAAa,CAACL,KAAK,CAACI,OAAP,CAAb;AACH;;AACD,QAAIT,QAAQ,IAAI,CAACI,cAAc,CAACO,MAAf,EAAjB,EAA0C;AACtCN,MAAAA,KAAK,CAACI,OAAN,GAAgBG,WAAW,CAAC,MAAM;AAC9BX,QAAAA,eAAe,GACTE,kBAAkB,CAACU,IAAnB,EADS,GAETV,kBAAkB,CAACW,IAAnB,EAFN;AAGH,OAJ0B,EAIxBZ,gBAJwB,CAA3B;AAKH;;AACD,WAAO,MAAM;AACT,OAAC,CAACG,KAAK,CAACI,OAAR,IAAmBC,aAAa,CAACL,KAAK,CAACI,OAAP,CAAhC;AACH,KAFD;AAGH,GAdD,EAcG,CACCT,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"]}
@@ -7,49 +7,46 @@ exports.useCarouselController = useCarouselController;
7
7
 
8
8
  var _react = _interopRequireDefault(require("react"));
9
9
 
10
- var _Carousel = require("./Carousel");
11
-
12
10
  var _reactNativeReanimated = require("react-native-reanimated");
13
11
 
14
12
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
13
 
16
14
  function useCarouselController(opts) {
17
- const lock = (0, _reactNativeReanimated.useSharedValue)(false);
18
15
  const {
19
16
  width,
20
17
  handlerOffsetX,
21
- disable = false
18
+ timingConfig,
19
+ lockController,
20
+ disable = false,
21
+ onPrev,
22
+ onNext
22
23
  } = opts;
23
24
 
24
25
  const closeLock = _react.default.useCallback(isFinished => {
25
26
  if (isFinished) {
26
- lock.value = false;
27
+ lockController.unLock();
27
28
  }
28
- }, [lock]);
29
-
30
- const openLock = _react.default.useCallback(() => {
31
- lock.value = true;
32
- }, [lock]);
29
+ }, [lockController]);
33
30
 
34
- const next = _react.default.useCallback(callback => {
31
+ const next = _react.default.useCallback(() => {
35
32
  if (disable) return;
36
- if (lock.value) return;
37
- openLock();
38
- handlerOffsetX.value = (0, _Carousel._withTiming)(handlerOffsetX.value - width, isFinished => {
39
- callback === null || callback === void 0 ? void 0 : callback(isFinished);
40
- closeLock(isFinished);
33
+ if (lockController.isLock()) return;
34
+ lockController.lock();
35
+ handlerOffsetX.value = (0, _reactNativeReanimated.withTiming)(handlerOffsetX.value - width, timingConfig, isFinished => {
36
+ !!onNext && (0, _reactNativeReanimated.runOnJS)(onNext)(isFinished);
37
+ (0, _reactNativeReanimated.runOnJS)(closeLock)(isFinished);
41
38
  });
42
- }, [width, openLock, closeLock, lock, handlerOffsetX, disable]);
39
+ }, [onNext, width, lockController, timingConfig, closeLock, handlerOffsetX, disable]);
43
40
 
44
- const prev = _react.default.useCallback(callback => {
41
+ const prev = _react.default.useCallback(() => {
45
42
  if (disable) return;
46
- if (lock.value) return;
47
- openLock();
48
- handlerOffsetX.value = (0, _Carousel._withTiming)(handlerOffsetX.value + width, isFinished => {
49
- callback === null || callback === void 0 ? void 0 : callback(isFinished);
50
- closeLock(isFinished);
43
+ if (lockController.isLock()) return;
44
+ lockController.lock();
45
+ handlerOffsetX.value = (0, _reactNativeReanimated.withTiming)(handlerOffsetX.value + width, timingConfig, isFinished => {
46
+ !!onPrev && (0, _reactNativeReanimated.runOnJS)(onPrev)(isFinished);
47
+ (0, _reactNativeReanimated.runOnJS)(closeLock)(isFinished);
51
48
  });
52
- }, [width, openLock, closeLock, lock, handlerOffsetX, disable]);
49
+ }, [onPrev, width, lockController, timingConfig, closeLock, handlerOffsetX, disable]);
53
50
 
54
51
  return {
55
52
  next,
@@ -1 +1 @@
1
- {"version":3,"sources":["useCarouselController.tsx"],"names":["useCarouselController","opts","lock","width","handlerOffsetX","disable","closeLock","React","useCallback","isFinished","value","openLock","next","callback","prev"],"mappings":";;;;;;;AAAA;;AACA;;AAEA;;;;AAaO,SAASA,qBAAT,CAA+BC,IAA/B,EAAiE;AACpE,QAAMC,IAAI,GAAG,2CAAwB,KAAxB,CAAb;AACA,QAAM;AAAEC,IAAAA,KAAF;AAASC,IAAAA,cAAT;AAAyBC,IAAAA,OAAO,GAAG;AAAnC,MAA6CJ,IAAnD;;AAEA,QAAMK,SAAS,GAAGC,eAAMC,WAAN,CACbC,UAAD,IAAyB;AACrB,QAAIA,UAAJ,EAAgB;AACZP,MAAAA,IAAI,CAACQ,KAAL,GAAa,KAAb;AACH;AACJ,GALa,EAMd,CAACR,IAAD,CANc,CAAlB;;AAQA,QAAMS,QAAQ,GAAGJ,eAAMC,WAAN,CAAkB,MAAM;AACrCN,IAAAA,IAAI,CAACQ,KAAL,GAAa,IAAb;AACH,GAFgB,EAEd,CAACR,IAAD,CAFc,CAAjB;;AAIA,QAAMU,IAAI,GAAGL,eAAMC,WAAN,CACRK,QAAD,IAA8C;AAC1C,QAAIR,OAAJ,EAAa;AACb,QAAIH,IAAI,CAACQ,KAAT,EAAgB;AAChBC,IAAAA,QAAQ;AACRP,IAAAA,cAAc,CAACM,KAAf,GAAuB,2BACnBN,cAAc,CAACM,KAAf,GAAuBP,KADJ,EAElBM,UAAD,IAAyB;AACrBI,MAAAA,QAAQ,SAAR,IAAAA,QAAQ,WAAR,YAAAA,QAAQ,CAAGJ,UAAH,CAAR;AACAH,MAAAA,SAAS,CAACG,UAAD,CAAT;AACH,KALkB,CAAvB;AAOH,GAZQ,EAaT,CAACN,KAAD,EAAQQ,QAAR,EAAkBL,SAAlB,EAA6BJ,IAA7B,EAAmCE,cAAnC,EAAmDC,OAAnD,CAbS,CAAb;;AAgBA,QAAMS,IAAI,GAAGP,eAAMC,WAAN,CACRK,QAAD,IAA8C;AAC1C,QAAIR,OAAJ,EAAa;AACb,QAAIH,IAAI,CAACQ,KAAT,EAAgB;AAChBC,IAAAA,QAAQ;AACRP,IAAAA,cAAc,CAACM,KAAf,GAAuB,2BACnBN,cAAc,CAACM,KAAf,GAAuBP,KADJ,EAElBM,UAAD,IAAyB;AACrBI,MAAAA,QAAQ,SAAR,IAAAA,QAAQ,WAAR,YAAAA,QAAQ,CAAGJ,UAAH,CAAR;AACAH,MAAAA,SAAS,CAACG,UAAD,CAAT;AACH,KALkB,CAAvB;AAOH,GAZQ,EAaT,CAACN,KAAD,EAAQQ,QAAR,EAAkBL,SAAlB,EAA6BJ,IAA7B,EAAmCE,cAAnC,EAAmDC,OAAnD,CAbS,CAAb;;AAgBA,SAAO;AACHO,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 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 lock = useSharedValue<boolean>(false);\n const { width, handlerOffsetX, disable = false } = 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 (disable) return;\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, disable]\n );\n\n const prev = React.useCallback(\n (callback?: (isFinished: boolean) => void) => {\n if (disable) return;\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, disable]\n );\n\n return {\n next,\n prev,\n };\n}\n"]}
1
+ {"version":3,"sources":["useCarouselController.tsx"],"names":["useCarouselController","opts","width","handlerOffsetX","timingConfig","lockController","disable","onPrev","onNext","closeLock","React","useCallback","isFinished","unLock","next","isLock","lock","value","prev"],"mappings":";;;;;;;AAAA;;AAEA;;;;AAkBO,SAASA,qBAAT,CAA+BC,IAA/B,EAAiE;AACpE,QAAM;AACFC,IAAAA,KADE;AAEFC,IAAAA,cAFE;AAGFC,IAAAA,YAHE;AAIFC,IAAAA,cAJE;AAKFC,IAAAA,OAAO,GAAG,KALR;AAMFC,IAAAA,MANE;AAOFC,IAAAA;AAPE,MAQFP,IARJ;;AAUA,QAAMQ,SAAS,GAAGC,eAAMC,WAAN,CACbC,UAAD,IAAyB;AACrB,QAAIA,UAAJ,EAAgB;AACZP,MAAAA,cAAc,CAACQ,MAAf;AACH;AACJ,GALa,EAMd,CAACR,cAAD,CANc,CAAlB;;AASA,QAAMS,IAAI,GAAGJ,eAAMC,WAAN,CAAkB,MAAM;AACjC,QAAIL,OAAJ,EAAa;AACb,QAAID,cAAc,CAACU,MAAf,EAAJ,EAA6B;AAC7BV,IAAAA,cAAc,CAACW,IAAf;AACAb,IAAAA,cAAc,CAACc,KAAf,GAAuB,uCACnBd,cAAc,CAACc,KAAf,GAAuBf,KADJ,EAEnBE,YAFmB,EAGlBQ,UAAD,IAAyB;AACrB,OAAC,CAACJ,MAAF,IAAY,oCAAQA,MAAR,EAAgBI,UAAhB,CAAZ;AACA,0CAAQH,SAAR,EAAmBG,UAAnB;AACH,KANkB,CAAvB;AAQH,GAZY,EAYV,CACCJ,MADD,EAECN,KAFD,EAGCG,cAHD,EAICD,YAJD,EAKCK,SALD,EAMCN,cAND,EAOCG,OAPD,CAZU,CAAb;;AAsBA,QAAMY,IAAI,GAAGR,eAAMC,WAAN,CAAkB,MAAM;AACjC,QAAIL,OAAJ,EAAa;AACb,QAAID,cAAc,CAACU,MAAf,EAAJ,EAA6B;AAC7BV,IAAAA,cAAc,CAACW,IAAf;AACAb,IAAAA,cAAc,CAACc,KAAf,GAAuB,uCACnBd,cAAc,CAACc,KAAf,GAAuBf,KADJ,EAEnBE,YAFmB,EAGlBQ,UAAD,IAAyB;AACrB,OAAC,CAACL,MAAF,IAAY,oCAAQA,MAAR,EAAgBK,UAAhB,CAAZ;AACA,0CAAQH,SAAR,EAAmBG,UAAnB;AACH,KANkB,CAAvB;AAQH,GAZY,EAYV,CACCL,MADD,EAECL,KAFD,EAGCG,cAHD,EAICD,YAJD,EAKCK,SALD,EAMCN,cAND,EAOCG,OAPD,CAZU,CAAb;;AAsBA,SAAO;AACHQ,IAAAA,IADG;AAEHI,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 onPrev?: (isFinished: boolean) => void;\n onNext?: (isFinished: boolean) => void;\n}\n\nexport interface ICarouselController {\n prev: () => void;\n next: () => void;\n}\n\nexport function useCarouselController(opts: IOpts): ICarouselController {\n const {\n width,\n handlerOffsetX,\n timingConfig,\n lockController,\n disable = false,\n onPrev,\n onNext,\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 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 !!onNext && runOnJS(onNext)(isFinished);\n runOnJS(closeLock)(isFinished);\n }\n );\n }, [\n onNext,\n width,\n lockController,\n timingConfig,\n closeLock,\n handlerOffsetX,\n disable,\n ]);\n\n const prev = React.useCallback(() => {\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 !!onPrev && runOnJS(onPrev)(isFinished);\n runOnJS(closeLock)(isFinished);\n }\n );\n }, [\n onPrev,\n width,\n lockController,\n timingConfig,\n closeLock,\n handlerOffsetX,\n disable,\n ]);\n\n return {\n next,\n prev,\n };\n}\n"]}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useLockController = useLockController;
7
+
8
+ var _reactNativeReanimated = require("react-native-reanimated");
9
+
10
+ /**
11
+ * Cannot operate while animation is locking
12
+ */
13
+ function useLockController() {
14
+ // This value is true if the animation is executing
15
+ const _lock = (0, _reactNativeReanimated.useSharedValue)(false);
16
+
17
+ function lock() {
18
+ 'worklet';
19
+
20
+ _lock.value = true;
21
+ }
22
+
23
+ function unLock() {
24
+ 'worklet';
25
+
26
+ _lock.value = false;
27
+ }
28
+
29
+ function isLock() {
30
+ 'worklet';
31
+
32
+ return _lock.value;
33
+ }
34
+
35
+ return {
36
+ lock,
37
+ unLock,
38
+ isLock
39
+ };
40
+ }
41
+ //# sourceMappingURL=useLock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["useLock.ts"],"names":["useLockController","_lock","lock","value","unLock","isLock"],"mappings":";;;;;;;AAAA;;AAOA;AACA;AACA;AACO,SAASA,iBAAT,GAA8C;AACjD;AACA,QAAMC,KAAK,GAAG,2CAAwB,KAAxB,CAAd;;AACA,WAASC,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"]}