react-native-reanimated-carousel 4.0.0 → 4.0.2

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 (120) hide show
  1. package/README.md +2 -40
  2. package/lib/commonjs/components/Carousel.js +1 -42
  3. package/lib/commonjs/components/Carousel.js.map +1 -1
  4. package/lib/commonjs/components/Carousel.test.js +2 -678
  5. package/lib/commonjs/components/Carousel.test.js.map +1 -1
  6. package/lib/commonjs/components/CarouselLayout.js +1 -211
  7. package/lib/commonjs/components/CarouselLayout.js.map +1 -1
  8. package/lib/commonjs/components/ItemLayout.js +1 -98
  9. package/lib/commonjs/components/ItemLayout.js.map +1 -1
  10. package/lib/commonjs/components/ItemRenderer.js +1 -79
  11. package/lib/commonjs/components/ItemRenderer.js.map +1 -1
  12. package/lib/commonjs/components/LazyView.js +1 -21
  13. package/lib/commonjs/components/LazyView.js.map +1 -1
  14. package/lib/commonjs/components/Pagination/Basic/PaginationItem.js +1 -83
  15. package/lib/commonjs/components/Pagination/Basic/PaginationItem.js.map +1 -1
  16. package/lib/commonjs/components/Pagination/Basic/index.js +1 -53
  17. package/lib/commonjs/components/Pagination/Basic/index.js.map +1 -1
  18. package/lib/commonjs/components/Pagination/Custom/PaginationItem.js +1 -88
  19. package/lib/commonjs/components/Pagination/Custom/PaginationItem.js.map +1 -1
  20. package/lib/commonjs/components/Pagination/Custom/index.js +1 -61
  21. package/lib/commonjs/components/Pagination/Custom/index.js.map +1 -1
  22. package/lib/commonjs/components/Pagination/index.js +1 -16
  23. package/lib/commonjs/components/Pagination/index.js.map +1 -1
  24. package/lib/commonjs/components/ScrollViewGesture.js +1 -362
  25. package/lib/commonjs/components/ScrollViewGesture.js.map +1 -1
  26. package/lib/commonjs/components/rnr-demo.test.js +1 -44
  27. package/lib/commonjs/components/rnr-demo.test.js.map +1 -1
  28. package/lib/commonjs/constants/index.js +1 -21
  29. package/lib/commonjs/constants/index.js.map +1 -1
  30. package/lib/commonjs/hooks/useAutoPlay.js +1 -56
  31. package/lib/commonjs/hooks/useAutoPlay.js.map +1 -1
  32. package/lib/commonjs/hooks/useAutoPlay.test.js +1 -154
  33. package/lib/commonjs/hooks/useAutoPlay.test.js.map +1 -1
  34. package/lib/commonjs/hooks/useCarouselController.js +1 -301
  35. package/lib/commonjs/hooks/useCarouselController.js.map +1 -1
  36. package/lib/commonjs/hooks/useCarouselController.test.js +1 -456
  37. package/lib/commonjs/hooks/useCarouselController.test.js.map +1 -1
  38. package/lib/commonjs/hooks/useCheckMounted.js +1 -23
  39. package/lib/commonjs/hooks/useCheckMounted.js.map +1 -1
  40. package/lib/commonjs/hooks/useCheckMounted.test.js +1 -44
  41. package/lib/commonjs/hooks/useCheckMounted.test.js.map +1 -1
  42. package/lib/commonjs/hooks/useCommonVariables.js +1 -102
  43. package/lib/commonjs/hooks/useCommonVariables.js.map +1 -1
  44. package/lib/commonjs/hooks/useCommonVariables.test.js +1 -37
  45. package/lib/commonjs/hooks/useCommonVariables.test.js.map +1 -1
  46. package/lib/commonjs/hooks/useInitProps.js +1 -78
  47. package/lib/commonjs/hooks/useInitProps.js.map +1 -1
  48. package/lib/commonjs/hooks/useInitProps.test.js +1 -126
  49. package/lib/commonjs/hooks/useInitProps.test.js.map +1 -1
  50. package/lib/commonjs/hooks/useLayoutConfig.js +1 -39
  51. package/lib/commonjs/hooks/useLayoutConfig.js.map +1 -1
  52. package/lib/commonjs/hooks/useLayoutConfig.test.js +1 -241
  53. package/lib/commonjs/hooks/useLayoutConfig.test.js.map +1 -1
  54. package/lib/commonjs/hooks/useOffsetX.js +1 -51
  55. package/lib/commonjs/hooks/useOffsetX.js.map +1 -1
  56. package/lib/commonjs/hooks/useOffsetX.test.js +2 -40
  57. package/lib/commonjs/hooks/useOffsetX.test.js.map +1 -1
  58. package/lib/commonjs/hooks/useOnProgressChange.js +1 -46
  59. package/lib/commonjs/hooks/useOnProgressChange.js.map +1 -1
  60. package/lib/commonjs/hooks/useOnProgressChange.test.js +1 -162
  61. package/lib/commonjs/hooks/useOnProgressChange.test.js.map +1 -1
  62. package/lib/commonjs/hooks/usePanGestureProxy.js +1 -117
  63. package/lib/commonjs/hooks/usePanGestureProxy.js.map +1 -1
  64. package/lib/commonjs/hooks/usePanGestureProxy.test.js +1 -419
  65. package/lib/commonjs/hooks/usePanGestureProxy.test.js.map +1 -1
  66. package/lib/commonjs/hooks/usePropsErrorBoundary.js +1 -36
  67. package/lib/commonjs/hooks/usePropsErrorBoundary.js.map +1 -1
  68. package/lib/commonjs/hooks/useUpdateGestureConfig.js +1 -19
  69. package/lib/commonjs/hooks/useUpdateGestureConfig.js.map +1 -1
  70. package/lib/commonjs/hooks/useUpdateGestureConfig.test.js +1 -91
  71. package/lib/commonjs/hooks/useUpdateGestureConfig.test.js.map +1 -1
  72. package/lib/commonjs/hooks/useVisibleRanges.js +1 -71
  73. package/lib/commonjs/hooks/useVisibleRanges.js.map +1 -1
  74. package/lib/commonjs/hooks/useVisibleRanges.test.js +7 -101
  75. package/lib/commonjs/hooks/useVisibleRanges.test.js.map +1 -1
  76. package/lib/commonjs/index.js +1 -21
  77. package/lib/commonjs/index.js.map +1 -1
  78. package/lib/commonjs/layouts/index.js +1 -20
  79. package/lib/commonjs/layouts/index.js.map +1 -1
  80. package/lib/commonjs/layouts/normal.js +1 -27
  81. package/lib/commonjs/layouts/normal.js.map +1 -1
  82. package/lib/commonjs/layouts/parallax.js +1 -38
  83. package/lib/commonjs/layouts/parallax.js.map +1 -1
  84. package/lib/commonjs/layouts/stack.js +1 -213
  85. package/lib/commonjs/layouts/stack.js.map +1 -1
  86. package/lib/commonjs/layouts/stack.test.js +3 -22
  87. package/lib/commonjs/layouts/stack.test.js.map +1 -1
  88. package/lib/commonjs/store/index.js +1 -67
  89. package/lib/commonjs/store/index.js.map +1 -1
  90. package/lib/commonjs/types.js +1 -5
  91. package/lib/commonjs/utils/compute-offset-if-data-changed.js +1 -51
  92. package/lib/commonjs/utils/compute-offset-if-data-changed.js.map +1 -1
  93. package/lib/commonjs/utils/compute-offset-if-data-changed.test.js +1 -29
  94. package/lib/commonjs/utils/compute-offset-if-data-changed.test.js.map +1 -1
  95. package/lib/commonjs/utils/compute-offset-if-size-changed.js +1 -17
  96. package/lib/commonjs/utils/compute-offset-if-size-changed.js.map +1 -1
  97. package/lib/commonjs/utils/compute-offset-if-size-changed.test.js +1 -71
  98. package/lib/commonjs/utils/compute-offset-if-size-changed.test.js.map +1 -1
  99. package/lib/commonjs/utils/computed-with-auto-fill-data.js +1 -123
  100. package/lib/commonjs/utils/computed-with-auto-fill-data.js.map +1 -1
  101. package/lib/commonjs/utils/computed-with-auto-fill-data.test.js +1 -179
  102. package/lib/commonjs/utils/computed-with-auto-fill-data.test.js.map +1 -1
  103. package/lib/commonjs/utils/deal-with-animation.js +1 -20
  104. package/lib/commonjs/utils/deal-with-animation.js.map +1 -1
  105. package/lib/commonjs/utils/deal-with-animation.test.js +1 -75
  106. package/lib/commonjs/utils/deal-with-animation.test.js.map +1 -1
  107. package/lib/commonjs/utils/handleroffset-direction.js +1 -15
  108. package/lib/commonjs/utils/handleroffset-direction.js.map +1 -1
  109. package/lib/commonjs/utils/handleroffset-direction.test.js +1 -45
  110. package/lib/commonjs/utils/handleroffset-direction.test.js.map +1 -1
  111. package/lib/commonjs/utils/index.test.js +1 -73
  112. package/lib/commonjs/utils/index.test.js.map +1 -1
  113. package/lib/commonjs/utils/log.js +1 -21
  114. package/lib/commonjs/utils/log.js.map +1 -1
  115. package/lib/commonjs/utils/log.test.js +1 -57
  116. package/lib/commonjs/utils/log.test.js.map +1 -1
  117. package/lib/module/hooks/useOnProgressChange.js +1 -1
  118. package/lib/module/hooks/useOnProgressChange.js.map +1 -1
  119. package/package.json +7 -2
  120. package/src/hooks/useOnProgressChange.ts +1 -1
@@ -1,302 +1,2 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.useCarouselController = useCarouselController;
7
-
8
- var _react = _interopRequireWildcard(require("react"));
9
-
10
- var _reactNativeReanimated = require("react-native-reanimated");
11
-
12
- var _constants = require("../constants");
13
-
14
- var _store = require("../store");
15
-
16
- var _computedWithAutoFillData = require("../utils/computed-with-auto-fill-data");
17
-
18
- var _dealWithAnimation = require("../utils/deal-with-animation");
19
-
20
- var _handleroffsetDirection = require("../utils/handleroffset-direction");
21
-
22
- var _log = require("../utils/log");
23
-
24
- 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); }
25
-
26
- 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; }
27
-
28
- function useCarouselController(options) {
29
- const {
30
- ref,
31
- size,
32
- loop,
33
- dataLength,
34
- handlerOffset,
35
- withAnimation,
36
- defaultIndex = 0,
37
- duration,
38
- autoFillData,
39
- fixedDirection
40
- } = options;
41
- const globalState = (0, _store.useGlobalState)();
42
- const {
43
- props: {
44
- overscrollEnabled
45
- },
46
- layout: {
47
- containerSize
48
- }
49
- } = globalState;
50
-
51
- const dataInfo = _react.default.useMemo(() => ({
52
- length: dataLength,
53
- disable: !dataLength,
54
- originalLength: dataLength
55
- }), [dataLength]);
56
-
57
- const index = (0, _reactNativeReanimated.useSharedValue)(defaultIndex); // The Index displayed to the user
58
-
59
- const sharedIndex = (0, _react.useRef)(defaultIndex);
60
- const sharedPreIndex = (0, _react.useRef)(defaultIndex);
61
-
62
- const currentFixedPage = _react.default.useCallback(() => {
63
- if (loop) return -Math.round(handlerOffset.value / size);
64
- const fixed = handlerOffset.value / size % dataInfo.length;
65
- return Math.round(handlerOffset.value <= 0 ? Math.abs(fixed) : Math.abs(fixed > 0 ? dataInfo.length - fixed : 0));
66
- }, [handlerOffset, dataInfo, size, loop]);
67
-
68
- function setSharedIndex(newSharedIndex) {
69
- sharedIndex.current = newSharedIndex;
70
- }
71
-
72
- (0, _reactNativeReanimated.useAnimatedReaction)(() => {
73
- const handlerOffsetValue = handlerOffset.value;
74
- const toInt = (0, _log.round)(handlerOffsetValue / size) % dataInfo.length;
75
- const isPositive = handlerOffsetValue <= 0;
76
- const i = isPositive ? Math.abs(toInt) : Math.abs(toInt > 0 ? dataInfo.length - toInt : 0);
77
- const newSharedIndexValue = (0, _computedWithAutoFillData.convertToSharedIndex)({
78
- loop,
79
- rawDataLength: dataInfo.originalLength,
80
- autoFillData: autoFillData,
81
- index: i
82
- });
83
- return {
84
- i,
85
- newSharedIndexValue
86
- };
87
- }, _ref => {
88
- let {
89
- i,
90
- newSharedIndexValue
91
- } = _ref;
92
- index.value = i;
93
- (0, _reactNativeReanimated.runOnJS)(setSharedIndex)(newSharedIndexValue);
94
- }, [sharedPreIndex, sharedIndex, size, dataInfo, index, loop, autoFillData, handlerOffset]);
95
-
96
- const getCurrentIndex = _react.default.useCallback(() => {
97
- const realIndex = (0, _computedWithAutoFillData.computedRealIndexWithAutoFillData)({
98
- index: index.value,
99
- dataLength: dataInfo.originalLength,
100
- loop,
101
- autoFillData: autoFillData
102
- });
103
- return realIndex;
104
- }, [index, autoFillData, dataInfo, loop]);
105
-
106
- const canSliding = _react.default.useCallback(() => {
107
- return !dataInfo.disable;
108
- }, [dataInfo]);
109
-
110
- const onScrollEnd = _react.default.useCallback(() => {
111
- var _options$onScrollEnd;
112
-
113
- (_options$onScrollEnd = options.onScrollEnd) === null || _options$onScrollEnd === void 0 ? void 0 : _options$onScrollEnd.call(options);
114
- }, [options]);
115
-
116
- const onScrollStart = _react.default.useCallback(() => {
117
- var _options$onScrollStar;
118
-
119
- (_options$onScrollStar = options.onScrollStart) === null || _options$onScrollStar === void 0 ? void 0 : _options$onScrollStar.call(options);
120
- }, [options]);
121
-
122
- const scrollWithTiming = _react.default.useCallback((toValue, onFinished) => {
123
- "worklet";
124
-
125
- const callback = isFinished => {
126
- "worklet";
127
-
128
- if (isFinished) {
129
- (0, _reactNativeReanimated.runOnJS)(onScrollEnd)();
130
- onFinished && (0, _reactNativeReanimated.runOnJS)(onFinished)();
131
- }
132
- };
133
-
134
- const defaultWithAnimation = {
135
- type: "timing",
136
- config: {
137
- duration,
138
- easing: _constants.Easing.easeOutQuart
139
- }
140
- };
141
- return (0, _dealWithAnimation.dealWithAnimation)(withAnimation !== null && withAnimation !== void 0 ? withAnimation : defaultWithAnimation)(toValue, callback);
142
- }, [duration, withAnimation, onScrollEnd]);
143
-
144
- const next = _react.default.useCallback(function () {
145
- "worklet";
146
-
147
- let opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
148
- const {
149
- count = 1,
150
- animated = true,
151
- onFinished
152
- } = opts;
153
- if (!canSliding()) return;
154
- if (!loop && index.value >= dataInfo.length - 1) return;
155
- /*
156
- [Overscroll Protection Logic]
157
-
158
- This section handles the overscroll protection when overscrollEnabled is false.
159
- It prevents scrolling beyond the visible content area.
160
- Example scenario:
161
- - Container width: 300px
162
- - Item width: 75px (4 items per view)
163
- - Total items: 6
164
-
165
- Initial state (index = 0):
166
- [0][1][2][3] | [4][5]
167
- visible | remaining
168
- After 2 slides (index = 2):
169
- [0][1] | [2][3][4][5]
170
- hidden | visible
171
- The visibleContentWidth calculation:
172
- - At index 2, remaining items = 4 (items 2,3,4,5)
173
- - visibleContentWidth = 4 * 75px = 300px
174
-
175
- If we try to slide again:
176
- - New visibleContentWidth would be: 2 * 75px = 150px (only items 4,5 remain)
177
- - Since 150px < container width (300px), the slide is prevented
178
-
179
- This ensures we don't scroll beyond the last set of fully visible items,
180
- maintaining a clean UX without partial item visibility at the edges.
181
- */
182
-
183
- const visibleContentWidth = (dataInfo.length - index.value) * size;
184
-
185
- if (!overscrollEnabled && !(visibleContentWidth > containerSize.value.width)) {
186
- return;
187
- }
188
-
189
- onScrollStart === null || onScrollStart === void 0 ? void 0 : onScrollStart();
190
- const nextPage = currentFixedPage() + count;
191
- index.value = nextPage;
192
-
193
- if (animated) {
194
- handlerOffset.value = scrollWithTiming(-nextPage * size, onFinished);
195
- } else {
196
- handlerOffset.value = -nextPage * size;
197
- onFinished === null || onFinished === void 0 ? void 0 : onFinished();
198
- }
199
- }, [canSliding, loop, index, dataInfo, onScrollStart, handlerOffset, size, scrollWithTiming, currentFixedPage]);
200
-
201
- const prev = _react.default.useCallback(function () {
202
- let opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
203
- const {
204
- count = 1,
205
- animated = true,
206
- onFinished
207
- } = opts;
208
- if (!canSliding()) return;
209
- if (!loop && index.value <= 0) return;
210
- onScrollStart === null || onScrollStart === void 0 ? void 0 : onScrollStart();
211
- const prevPage = currentFixedPage() - count;
212
- index.value = prevPage;
213
-
214
- if (animated) {
215
- handlerOffset.value = scrollWithTiming(-prevPage * size, onFinished);
216
- } else {
217
- handlerOffset.value = -prevPage * size;
218
- onFinished === null || onFinished === void 0 ? void 0 : onFinished();
219
- }
220
- }, [canSliding, loop, index, onScrollStart, handlerOffset, size, scrollWithTiming, currentFixedPage]);
221
-
222
- const to = _react.default.useCallback(opts => {
223
- const {
224
- i,
225
- animated = false,
226
- onFinished
227
- } = opts;
228
- if (i === index.value) return;
229
- if (!canSliding()) return;
230
- onScrollStart === null || onScrollStart === void 0 ? void 0 : onScrollStart(); // direction -> 1 | -1
231
-
232
- const direction = (0, _handleroffsetDirection.handlerOffsetDirection)(handlerOffset, fixedDirection); // target offset
233
-
234
- const offset = i * size * direction; // page width size * page count
235
-
236
- const totalSize = dataInfo.length * size;
237
- let isCloseToNextLoop = false;
238
-
239
- if (loop) {
240
- isCloseToNextLoop = Math.abs(handlerOffset.value % totalSize) / totalSize >= 0.5;
241
- }
242
-
243
- const finalOffset = (Math.floor(Math.abs(handlerOffset.value / totalSize)) + (isCloseToNextLoop ? 1 : 0)) * totalSize * direction + offset;
244
-
245
- if (animated) {
246
- index.value = i;
247
- handlerOffset.value = scrollWithTiming(finalOffset, onFinished);
248
- } else {
249
- handlerOffset.value = finalOffset;
250
- index.value = i;
251
- onFinished === null || onFinished === void 0 ? void 0 : onFinished();
252
- }
253
- }, [size, loop, index, fixedDirection, handlerOffset, dataInfo.length, canSliding, onScrollStart, scrollWithTiming]);
254
-
255
- const scrollTo = _react.default.useCallback(function () {
256
- let opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
257
- const {
258
- index: i,
259
- count,
260
- animated = false,
261
- onFinished
262
- } = opts;
263
-
264
- if (typeof i === "number" && i > -1) {
265
- to({
266
- i,
267
- animated,
268
- onFinished
269
- });
270
- return;
271
- }
272
-
273
- if (!count) return;
274
- const n = Math.round(count);
275
- if (n < 0) prev({
276
- count: Math.abs(n),
277
- animated,
278
- onFinished
279
- });else next({
280
- count: n,
281
- animated,
282
- onFinished
283
- });
284
- }, [prev, next, to]);
285
-
286
- _react.default.useImperativeHandle(ref, () => ({
287
- next,
288
- prev,
289
- getCurrentIndex,
290
- scrollTo
291
- }), [getCurrentIndex, next, prev, scrollTo]);
292
-
293
- return {
294
- next,
295
- prev,
296
- scrollTo,
297
- getCurrentIndex,
298
- getSharedIndex: () => sharedIndex.current,
299
- index
300
- };
301
- }
1
+ Object.defineProperty(exports,"__esModule",{value:true});exports.useCarouselController=useCarouselController;var _react=_interopRequireWildcard(require("react"));var _reactNativeReanimated=require("react-native-reanimated");var _constants=require("../constants");var _store=require("../store");var _computedWithAutoFillData=require("../utils/computed-with-auto-fill-data");var _dealWithAnimation=require("../utils/deal-with-animation");var _handleroffsetDirection=require("../utils/handleroffset-direction");var _log=require("../utils/log");function _getRequireWildcardCache(nodeInterop){if(typeof WeakMap!=="function")return null;var cacheBabelInterop=new WeakMap();var cacheNodeInterop=new WeakMap();return(_getRequireWildcardCache=function _getRequireWildcardCache(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop;})(nodeInterop);}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;}var _worklet_3425041857917_init_data={code:"function anonymous(){const{handlerOffset,round,size,dataInfo,convertToSharedIndex,loop,autoFillData}=this.__closure;const handlerOffsetValue=handlerOffset.value;const toInt=round(handlerOffsetValue/size)%dataInfo.length;const isPositive=handlerOffsetValue<=0;const i=isPositive?Math.abs(toInt):Math.abs(toInt>0?dataInfo.length-toInt:0);const newSharedIndexValue=convertToSharedIndex({loop:loop,rawDataLength:dataInfo.originalLength,autoFillData:autoFillData,index:i});return{i:i,newSharedIndexValue:newSharedIndexValue};}",location:"/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/hooks/useCarouselController.tsx",sourceMap:"{\"version\":3,\"mappings\":\"AA4FI,QAAAA,UAAA,EAAM,gGACJ,KAAMC,mBAAkB,CAAGC,aAAa,CAACC,KAAzC,CACA,KAAMC,MAAK,CAAGC,KAAK,CAACJ,kBAAkB,CAAGK,IAAtB,CAALD,CAAmCE,QAAQ,CAACC,MAA1D,CACA,KAAMC,WAAU,CAAGR,kBAAkB,EAAI,CAAzC,CACA,KAAMS,EAAC,CAAGD,UAAU,CAAGE,IAAI,CAACC,GAALD,CAASP,KAATO,CAAH,CAAqBA,IAAI,CAACC,GAALD,CAASP,KAAK,CAAG,CAARA,CAAYG,QAAQ,CAACC,MAATD,CAAkBH,KAA9BA,CAAsC,CAA/CO,CAAzC,CAEA,KAAME,oBAAmB,CAAGC,oBAAoB,CAAC,CAC/CC,IAAI,CAAJA,IAD+C,CAE/CC,aAAa,CAAET,QAAQ,CAACU,cAFuB,CAG/CC,YAAY,CAAEA,YAHiC,CAI/CC,KAAK,CAAET,CAJwC,CAAD,CAAhD,CAOA,MAAO,CACLA,CAAC,CAADA,CADK,CAELG,uCAFK,CAAP,CAbF\",\"names\":[\"anonymous\",\"handlerOffsetValue\",\"handlerOffset\",\"value\",\"toInt\",\"round\",\"size\",\"dataInfo\",\"length\",\"isPositive\",\"i\",\"Math\",\"abs\",\"newSharedIndexValue\",\"convertToSharedIndex\",\"loop\",\"rawDataLength\",\"originalLength\",\"autoFillData\",\"index\"],\"sources\":[\"/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/hooks/useCarouselController.tsx\"]}",version:"3.10.1"};var _worklet_13024854302038_init_data={code:"function anonymous({i:i,newSharedIndexValue:newSharedIndexValue}){const{index,runOnJS,setSharedIndex}=this.__closure;index.value=i;runOnJS(setSharedIndex)(newSharedIndexValue);}",location:"/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/hooks/useCarouselController.tsx",sourceMap:"{\"version\":3,\"mappings\":\"AA8GI,QAACA,UAAD,CAAC,CAAEC,CAAC,CAADA,CAAF,CAAKC,uCAAL,CAAD,CAAgC,oDAC9BC,KAAK,CAACC,KAAND,CAAcF,CAAdE,CACAE,OAAO,CAACC,cAAD,CAAPD,CAAwBH,mBAAxBG,EAFF\",\"names\":[\"anonymous\",\"i\",\"newSharedIndexValue\",\"index\",\"value\",\"runOnJS\",\"setSharedIndex\"],\"sources\":[\"/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/hooks/useCarouselController.tsx\"]}",version:"3.10.1"};var _worklet_1474026268410_init_data={code:"function anonymous(toValue,onFinished){const{runOnJS,onScrollEnd,duration,Easing,dealWithAnimation,withAnimation}=this.__closure;var _withAnimation;const callback=function(isFinished){\"worklet\";if(isFinished){runOnJS(onScrollEnd)();onFinished&&runOnJS(onFinished)();}};const defaultWithAnimation={type:\"timing\",config:{duration:duration,easing:Easing.easeOutQuart}};return dealWithAnimation((_withAnimation=withAnimation)!==null&&_withAnimation!==void 0?_withAnimation:defaultWithAnimation)(toValue,callback);}",location:"/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/hooks/useCarouselController.tsx",sourceMap:"{\"version\":3,\"mappings\":\"AA6II,QAACA,UAAD,CAACA,OAAD,CAAkBC,UAAlB,CAA8C,8FAAAC,eAAA,qCAE5C,yBAEEC,OAAIC,aAAJ,GACED,UAAQE,SAARF,YAAQE,EAARF,CACAF,CACF,EACD,KANDK,qBAAA,gBAQAC,MAAMD,EACJE,QAAM,CAAAC,QADFH,CAEJC,MAAQ,CAAAG,MAAA,CAAAC,YAFJL,CARN,CAMC,CAIS,MAAAM,kBAAA,EAAAV,cAAA,CAAAW,aAAA,UAAAX,cAAA,UAAAA,cAAA,CAAAI,oBAAA,EAAAN,OAAA,CAAAc,QAAA,EAFwC\",\"names\":[\"toValue\",\"onFinished\",\"_withAnimation\",\"runOnJS\",\"isFinished\",\"onScrollEnd\",\"defaultWithAnimation\",\"config\",\"type\",\"duration\",\"Easing\",\"easeOutQuart\",\"dealWithAnimation\",\"withAnimation\",\"callback\"],\"sources\":[\"/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/hooks/useCarouselController.tsx\"]}",version:"3.10.1"};var _worklet_14889674324583_init_data={code:"function anonymous(isFinished){const{runOnJS,onScrollEnd,onFinished}=this.__closure;if(isFinished){runOnJS(onScrollEnd)();onFinished&&runOnJS(onFinished)();}}",location:"/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/hooks/useCarouselController.tsx",sourceMap:"{\"version\":3,\"mappings\":\"AA+IuB,QAACA,UAAD,CAACA,UAAD,CAAyB,sDAExC,GAAIA,UAAJ,CAAgB,CACdC,OAAO,CAACC,WAAD,CAAPD,GACAE,UAAU,EAAIF,OAAO,CAACE,UAAD,CAAPF,EAAdE,CACF,CALe\",\"names\":[\"isFinished\",\"runOnJS\",\"onScrollEnd\",\"onFinished\"],\"sources\":[\"/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/hooks/useCarouselController.tsx\"]}",version:"3.10.1"};var _worklet_9387606738433_init_data={code:"function anonymous(opts={}){const{canSliding,loop,index,dataInfo,size,overscrollEnabled,containerSize,onScrollStart,currentFixedPage,handlerOffset,scrollWithTiming}=this.__closure;var _onScrollStart;const{count=1,animated=true,onFinished:onFinished}=opts;if(!canSliding())return;if(!loop&&index.value>=dataInfo.length-1)return;const visibleContentWidth=(dataInfo.length-index.value)*size;if(!overscrollEnabled&&!(visibleContentWidth>containerSize.value.width)){return;}(_onScrollStart=onScrollStart)===null||_onScrollStart===void 0||_onScrollStart();const nextPage=currentFixedPage()+count;index.value=nextPage;if(animated){handlerOffset.value=scrollWithTiming(-nextPage*size,onFinished);}else{handlerOffset.value=-nextPage*size;onFinished===null||onFinished===void 0||onFinished();}}",location:"/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/hooks/useCarouselController.tsx",sourceMap:"{\"version\":3,\"mappings\":\"AAkKI,QAACA,UAAD,CAAiCA,IAAM,GAAvC,CAAuC,4JAAAC,eAAA,OAErCC,KAAM,GAAEA,QAAQ,CAAV,KAAaC,UAAQ,CAAGC,YAAMA,KAA9B,GAA6CJ,WAAnD,EAAM,CAAN,OACA,GAAI,CAACK,IAAD,EAACA,KAAL,CAAmBC,KAAdD,EAAcE,QAAA,CAAAC,MAAA,EAAnB,CAAmB,oEAkCnB,IAAAC,iBAAA,EAAyB,EAAGC,mBAAmBC,cAAeC,MAAfD,CAA/CE,KAAyB,CAAzB,SACA,CACE,CAAAZ,cAAA,CAAAa,aAAA,UAAAb,cAAA,WAAAA,cAAA,GACF,KAAAc,SAAA,CAAAC,gBAAA,GAAAd,KAAA,sBAEAY,aAEAG,aAAc,CAAAX,KAAd,CAAiBU,gBAAqBd,WAAtCU,IAAsCV,CAAtCE,UAAsCF,CAAtC,CACAS,CAHAG,IAGMR,oCAENF,UAAA,GAAc,IAAd,EAAcA,UAAA,SAAd,EAAcA,UAAA,EAAd,CACEa,CACD\",\"names\":[\"opts\",\"_onScrollStart\",\"count\",\"animated\",\"onFinished\",\"canSliding\",\"value\",\"dataInfo\",\"length\",\"overscrollEnabled\",\"visibleContentWidth\",\"index\",\"size\",\"width\",\"onScrollStart\",\"nextPage\",\"currentFixedPage\",\"handlerOffset\"],\"sources\":[\"/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/hooks/useCarouselController.tsx\"]}",version:"3.10.1"};function useCarouselController(options){var ref=options.ref,size=options.size,loop=options.loop,dataLength=options.dataLength,handlerOffset=options.handlerOffset,withAnimation=options.withAnimation,_options$defaultIndex=options.defaultIndex,defaultIndex=_options$defaultIndex===void 0?0:_options$defaultIndex,duration=options.duration,autoFillData=options.autoFillData,fixedDirection=options.fixedDirection;var globalState=(0,_store.useGlobalState)();var overscrollEnabled=globalState.props.overscrollEnabled,containerSize=globalState.layout.containerSize;var dataInfo=_react.default.useMemo(function(){return{length:dataLength,disable:!dataLength,originalLength:dataLength};},[dataLength]);var index=(0,_reactNativeReanimated.useSharedValue)(defaultIndex);var sharedIndex=(0,_react.useRef)(defaultIndex);var sharedPreIndex=(0,_react.useRef)(defaultIndex);var currentFixedPage=_react.default.useCallback(function(){if(loop)return-Math.round(handlerOffset.value/size);var fixed=handlerOffset.value/size%dataInfo.length;return Math.round(handlerOffset.value<=0?Math.abs(fixed):Math.abs(fixed>0?dataInfo.length-fixed:0));},[handlerOffset,dataInfo,size,loop]);function setSharedIndex(newSharedIndex){sharedIndex.current=newSharedIndex;}(0,_reactNativeReanimated.useAnimatedReaction)(function(){var _e=[new global.Error(),-8,-27];var anonymous=function anonymous(){var handlerOffsetValue=handlerOffset.value;var toInt=(0,_log.round)(handlerOffsetValue/size)%dataInfo.length;var isPositive=handlerOffsetValue<=0;var i=isPositive?Math.abs(toInt):Math.abs(toInt>0?dataInfo.length-toInt:0);var newSharedIndexValue=(0,_computedWithAutoFillData.convertToSharedIndex)({loop:loop,rawDataLength:dataInfo.originalLength,autoFillData:autoFillData,index:i});return{i:i,newSharedIndexValue:newSharedIndexValue};};anonymous.__closure={handlerOffset:handlerOffset,round:_log.round,size:size,dataInfo:dataInfo,convertToSharedIndex:_computedWithAutoFillData.convertToSharedIndex,loop:loop,autoFillData:autoFillData};anonymous.__workletHash=3425041857917;anonymous.__initData=_worklet_3425041857917_init_data;anonymous.__stackDetails=_e;return anonymous;}(),function(){var _e=[new global.Error(),-4,-27];var anonymous=function anonymous(_ref){var i=_ref.i,newSharedIndexValue=_ref.newSharedIndexValue;index.value=i;(0,_reactNativeReanimated.runOnJS)(setSharedIndex)(newSharedIndexValue);};anonymous.__closure={index:index,runOnJS:_reactNativeReanimated.runOnJS,setSharedIndex:setSharedIndex};anonymous.__workletHash=13024854302038;anonymous.__initData=_worklet_13024854302038_init_data;anonymous.__stackDetails=_e;return anonymous;}(),[sharedPreIndex,sharedIndex,size,dataInfo,index,loop,autoFillData,handlerOffset]);var getCurrentIndex=_react.default.useCallback(function(){var realIndex=(0,_computedWithAutoFillData.computedRealIndexWithAutoFillData)({index:index.value,dataLength:dataInfo.originalLength,loop:loop,autoFillData:autoFillData});return realIndex;},[index,autoFillData,dataInfo,loop]);var canSliding=_react.default.useCallback(function(){return!dataInfo.disable;},[dataInfo]);var onScrollEnd=_react.default.useCallback(function(){options.onScrollEnd==null?void 0:options.onScrollEnd();},[options]);var onScrollStart=_react.default.useCallback(function(){options.onScrollStart==null?void 0:options.onScrollStart();},[options]);var scrollWithTiming=_react.default.useCallback(function(){var _e=[new global.Error(),-7,-27];var anonymous=function anonymous(toValue,onFinished){var callback=function(){var _e=[new global.Error(),-4,-27];var anonymous=function anonymous(isFinished){if(isFinished){(0,_reactNativeReanimated.runOnJS)(onScrollEnd)();onFinished&&(0,_reactNativeReanimated.runOnJS)(onFinished)();}};anonymous.__closure={runOnJS:_reactNativeReanimated.runOnJS,onScrollEnd:onScrollEnd,onFinished:onFinished};anonymous.__workletHash=14889674324583;anonymous.__initData=_worklet_14889674324583_init_data;anonymous.__stackDetails=_e;return anonymous;}();var defaultWithAnimation={type:"timing",config:{duration:duration,easing:_constants.Easing.easeOutQuart}};return(0,_dealWithAnimation.dealWithAnimation)(withAnimation!=null?withAnimation:defaultWithAnimation)(toValue,callback);};anonymous.__closure={runOnJS:_reactNativeReanimated.runOnJS,onScrollEnd:onScrollEnd,duration:duration,Easing:_constants.Easing,dealWithAnimation:_dealWithAnimation.dealWithAnimation,withAnimation:withAnimation};anonymous.__workletHash=1474026268410;anonymous.__initData=_worklet_1474026268410_init_data;anonymous.__stackDetails=_e;return anonymous;}(),[duration,withAnimation,onScrollEnd]);var next=_react.default.useCallback(function(){var _e=[new global.Error(),-12,-27];var anonymous=function anonymous(){var opts=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var _opts$count=opts.count,count=_opts$count===void 0?1:_opts$count,_opts$animated=opts.animated,animated=_opts$animated===void 0?true:_opts$animated,onFinished=opts.onFinished;if(!canSliding())return;if(!loop&&index.value>=dataInfo.length-1)return;var visibleContentWidth=(dataInfo.length-index.value)*size;if(!overscrollEnabled&&!(visibleContentWidth>containerSize.value.width)){return;}onScrollStart==null?void 0:onScrollStart();var nextPage=currentFixedPage()+count;index.value=nextPage;if(animated){handlerOffset.value=scrollWithTiming(-nextPage*size,onFinished);}else{handlerOffset.value=-nextPage*size;onFinished==null?void 0:onFinished();}};anonymous.__closure={canSliding:canSliding,loop:loop,index:index,dataInfo:dataInfo,size:size,overscrollEnabled:overscrollEnabled,containerSize:containerSize,onScrollStart:onScrollStart,currentFixedPage:currentFixedPage,handlerOffset:handlerOffset,scrollWithTiming:scrollWithTiming};anonymous.__workletHash=9387606738433;anonymous.__initData=_worklet_9387606738433_init_data;anonymous.__stackDetails=_e;return anonymous;}(),[canSliding,loop,index,dataInfo,onScrollStart,handlerOffset,size,scrollWithTiming,currentFixedPage]);var prev=_react.default.useCallback(function(){var opts=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var _opts$count2=opts.count,count=_opts$count2===void 0?1:_opts$count2,_opts$animated2=opts.animated,animated=_opts$animated2===void 0?true:_opts$animated2,onFinished=opts.onFinished;if(!canSliding())return;if(!loop&&index.value<=0)return;onScrollStart==null?void 0:onScrollStart();var prevPage=currentFixedPage()-count;index.value=prevPage;if(animated){handlerOffset.value=scrollWithTiming(-prevPage*size,onFinished);}else{handlerOffset.value=-prevPage*size;onFinished==null?void 0:onFinished();}},[canSliding,loop,index,onScrollStart,handlerOffset,size,scrollWithTiming,currentFixedPage]);var to=_react.default.useCallback(function(opts){var i=opts.i,_opts$animated3=opts.animated,animated=_opts$animated3===void 0?false:_opts$animated3,onFinished=opts.onFinished;if(i===index.value)return;if(!canSliding())return;onScrollStart==null?void 0:onScrollStart();var direction=(0,_handleroffsetDirection.handlerOffsetDirection)(handlerOffset,fixedDirection);var offset=i*size*direction;var totalSize=dataInfo.length*size;var isCloseToNextLoop=false;if(loop){isCloseToNextLoop=Math.abs(handlerOffset.value%totalSize)/totalSize>=0.5;}var finalOffset=(Math.floor(Math.abs(handlerOffset.value/totalSize))+(isCloseToNextLoop?1:0))*totalSize*direction+offset;if(animated){index.value=i;handlerOffset.value=scrollWithTiming(finalOffset,onFinished);}else{handlerOffset.value=finalOffset;index.value=i;onFinished==null?void 0:onFinished();}},[size,loop,index,fixedDirection,handlerOffset,dataInfo.length,canSliding,onScrollStart,scrollWithTiming]);var scrollTo=_react.default.useCallback(function(){var opts=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var i=opts.index,count=opts.count,_opts$animated4=opts.animated,animated=_opts$animated4===void 0?false:_opts$animated4,onFinished=opts.onFinished;if(typeof i==="number"&&i>-1){to({i:i,animated:animated,onFinished:onFinished});return;}if(!count)return;var n=Math.round(count);if(n<0)prev({count:Math.abs(n),animated:animated,onFinished:onFinished});else next({count:n,animated:animated,onFinished:onFinished});},[prev,next,to]);_react.default.useImperativeHandle(ref,function(){return{next:next,prev:prev,getCurrentIndex:getCurrentIndex,scrollTo:scrollTo};},[getCurrentIndex,next,prev,scrollTo]);return{next:next,prev:prev,scrollTo:scrollTo,getCurrentIndex:getCurrentIndex,getSharedIndex:function getSharedIndex(){return sharedIndex.current;},index:index};}
302
2
  //# sourceMappingURL=useCarouselController.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["useCarouselController.tsx"],"names":["useCarouselController","options","ref","size","loop","dataLength","handlerOffset","withAnimation","defaultIndex","duration","autoFillData","fixedDirection","globalState","props","overscrollEnabled","layout","containerSize","dataInfo","React","useMemo","length","disable","originalLength","index","sharedIndex","sharedPreIndex","currentFixedPage","useCallback","Math","round","value","fixed","abs","setSharedIndex","newSharedIndex","current","handlerOffsetValue","toInt","isPositive","i","newSharedIndexValue","rawDataLength","getCurrentIndex","realIndex","canSliding","onScrollEnd","onScrollStart","scrollWithTiming","toValue","onFinished","callback","isFinished","defaultWithAnimation","type","config","easing","Easing","easeOutQuart","next","opts","count","animated","visibleContentWidth","width","nextPage","prev","prevPage","to","direction","offset","totalSize","isCloseToNextLoop","finalOffset","floor","scrollTo","n","useImperativeHandle","getSharedIndex"],"mappings":"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","sourcesContent":["import React, { useRef } from \"react\";\nimport { SharedValue, runOnJS, useAnimatedReaction, useSharedValue } from \"react-native-reanimated\";\n\nimport { Easing } from \"../constants\";\nimport { useGlobalState } from \"../store\";\nimport type {\n ICarouselInstance,\n TCarouselActionOptions,\n TCarouselProps,\n WithTimingAnimation,\n} from \"../types\";\nimport {\n computedRealIndexWithAutoFillData,\n convertToSharedIndex,\n} from \"../utils/computed-with-auto-fill-data\";\nimport { dealWithAnimation } from \"../utils/deal-with-animation\";\nimport { handlerOffsetDirection } from \"../utils/handleroffset-direction\";\nimport { round } from \"../utils/log\";\n\ninterface IOpts {\n ref: React.ForwardedRef<ICarouselInstance>;\n loop: boolean;\n size: number;\n dataLength: number;\n handlerOffset: SharedValue<number>;\n autoFillData: TCarouselProps[\"autoFillData\"];\n withAnimation?: TCarouselProps[\"withAnimation\"];\n fixedDirection?: TCarouselProps[\"fixedDirection\"];\n duration?: number;\n defaultIndex?: number;\n onScrollStart?: () => void;\n onScrollEnd?: () => void;\n}\n\nexport interface ICarouselController {\n getSharedIndex: () => number;\n prev: (opts?: TCarouselActionOptions) => void;\n next: (opts?: TCarouselActionOptions) => void;\n getCurrentIndex: () => number;\n scrollTo: (opts?: TCarouselActionOptions) => void;\n index: SharedValue<number>;\n}\n\nexport function useCarouselController(options: IOpts): ICarouselController {\n const {\n ref,\n size,\n loop,\n dataLength,\n handlerOffset,\n withAnimation,\n defaultIndex = 0,\n duration,\n autoFillData,\n fixedDirection,\n } = options;\n\n const globalState = useGlobalState();\n\n const {\n props: { overscrollEnabled },\n layout: { containerSize },\n } = globalState;\n\n const dataInfo = React.useMemo(\n () => ({\n length: dataLength,\n disable: !dataLength,\n originalLength: dataLength,\n }),\n [dataLength]\n );\n\n const index = useSharedValue<number>(defaultIndex);\n // The Index displayed to the user\n const sharedIndex = useRef<number>(defaultIndex);\n const sharedPreIndex = useRef<number>(defaultIndex);\n\n const currentFixedPage = React.useCallback(() => {\n if (loop) return -Math.round(handlerOffset.value / size);\n\n const fixed = (handlerOffset.value / size) % dataInfo.length;\n return Math.round(\n handlerOffset.value <= 0 ? Math.abs(fixed) : Math.abs(fixed > 0 ? dataInfo.length - fixed : 0)\n );\n }, [handlerOffset, dataInfo, size, loop]);\n\n function setSharedIndex(newSharedIndex: number) {\n sharedIndex.current = newSharedIndex;\n }\n\n useAnimatedReaction(\n () => {\n const handlerOffsetValue = handlerOffset.value;\n const toInt = round(handlerOffsetValue / size) % dataInfo.length;\n const isPositive = handlerOffsetValue <= 0;\n const i = isPositive ? Math.abs(toInt) : Math.abs(toInt > 0 ? dataInfo.length - toInt : 0);\n\n const newSharedIndexValue = convertToSharedIndex({\n loop,\n rawDataLength: dataInfo.originalLength,\n autoFillData: autoFillData!,\n index: i,\n });\n\n return {\n i,\n newSharedIndexValue,\n };\n },\n ({ i, newSharedIndexValue }) => {\n index.value = i;\n runOnJS(setSharedIndex)(newSharedIndexValue);\n },\n [sharedPreIndex, sharedIndex, size, dataInfo, index, loop, autoFillData, handlerOffset]\n );\n\n const getCurrentIndex = React.useCallback(() => {\n const realIndex = computedRealIndexWithAutoFillData({\n index: index.value,\n dataLength: dataInfo.originalLength,\n loop,\n autoFillData: autoFillData!,\n });\n\n return realIndex;\n }, [index, autoFillData, dataInfo, loop]);\n\n const canSliding = React.useCallback(() => {\n return !dataInfo.disable;\n }, [dataInfo]);\n\n const onScrollEnd = React.useCallback(() => {\n options.onScrollEnd?.();\n }, [options]);\n\n const onScrollStart = React.useCallback(() => {\n options.onScrollStart?.();\n }, [options]);\n\n const scrollWithTiming = React.useCallback(\n (toValue: number, onFinished?: () => void) => {\n \"worklet\";\n const callback = (isFinished: boolean) => {\n \"worklet\";\n if (isFinished) {\n runOnJS(onScrollEnd)();\n onFinished && runOnJS(onFinished)();\n }\n };\n\n const defaultWithAnimation: WithTimingAnimation = {\n type: \"timing\",\n config: { duration, easing: Easing.easeOutQuart },\n };\n\n return dealWithAnimation(withAnimation ?? defaultWithAnimation)(toValue, callback);\n },\n [duration, withAnimation, onScrollEnd]\n );\n\n const next = React.useCallback(\n (opts: TCarouselActionOptions = {}) => {\n \"worklet\";\n const { count = 1, animated = true, onFinished } = opts;\n if (!canSliding()) return;\n\n if (!loop && index.value >= dataInfo.length - 1) return;\n\n /* \n [Overscroll Protection Logic]\n \n This section handles the overscroll protection when overscrollEnabled is false.\n It prevents scrolling beyond the visible content area.\n\n Example scenario:\n - Container width: 300px\n - Item width: 75px (4 items per view)\n - Total items: 6\n \n Initial state (index = 0):\n [0][1][2][3] | [4][5]\n visible | remaining\n\n After 2 slides (index = 2):\n [0][1] | [2][3][4][5]\n hidden | visible\n\n The visibleContentWidth calculation:\n - At index 2, remaining items = 4 (items 2,3,4,5)\n - visibleContentWidth = 4 * 75px = 300px\n \n If we try to slide again:\n - New visibleContentWidth would be: 2 * 75px = 150px (only items 4,5 remain)\n - Since 150px < container width (300px), the slide is prevented\n \n This ensures we don't scroll beyond the last set of fully visible items,\n maintaining a clean UX without partial item visibility at the edges.\n */\n const visibleContentWidth = (dataInfo.length - index.value) * size;\n if (!overscrollEnabled && !(visibleContentWidth > containerSize.value.width)) {\n return;\n }\n\n onScrollStart?.();\n\n const nextPage = currentFixedPage() + count;\n index.value = nextPage;\n\n if (animated) {\n handlerOffset.value = scrollWithTiming(-nextPage * size, onFinished) as any;\n } else {\n handlerOffset.value = -nextPage * size;\n onFinished?.();\n }\n },\n [\n canSliding,\n loop,\n index,\n dataInfo,\n onScrollStart,\n handlerOffset,\n size,\n scrollWithTiming,\n currentFixedPage,\n ]\n );\n\n const prev = React.useCallback(\n (opts: TCarouselActionOptions = {}) => {\n const { count = 1, animated = true, onFinished } = opts;\n if (!canSliding()) return;\n\n if (!loop && index.value <= 0) return;\n\n onScrollStart?.();\n\n const prevPage = currentFixedPage() - count;\n index.value = prevPage;\n\n if (animated) {\n handlerOffset.value = scrollWithTiming(-prevPage * size, onFinished);\n } else {\n handlerOffset.value = -prevPage * size;\n onFinished?.();\n }\n },\n [\n canSliding,\n loop,\n index,\n onScrollStart,\n handlerOffset,\n size,\n scrollWithTiming,\n currentFixedPage,\n ]\n );\n\n const to = React.useCallback(\n (opts: { i: number; animated: boolean; onFinished?: () => void }) => {\n const { i, animated = false, onFinished } = opts;\n\n if (i === index.value) return;\n\n if (!canSliding()) return;\n\n onScrollStart?.();\n // direction -> 1 | -1\n const direction = handlerOffsetDirection(handlerOffset, fixedDirection);\n\n // target offset\n const offset = i * size * direction;\n // page width size * page count\n const totalSize = dataInfo.length * size;\n\n let isCloseToNextLoop = false;\n\n if (loop) {\n isCloseToNextLoop = Math.abs(handlerOffset.value % totalSize) / totalSize >= 0.5;\n }\n\n const finalOffset =\n (Math.floor(Math.abs(handlerOffset.value / totalSize)) + (isCloseToNextLoop ? 1 : 0)) *\n totalSize *\n direction +\n offset;\n\n if (animated) {\n index.value = i;\n handlerOffset.value = scrollWithTiming(finalOffset, onFinished);\n } else {\n handlerOffset.value = finalOffset;\n index.value = i;\n onFinished?.();\n }\n },\n [\n size,\n loop,\n index,\n fixedDirection,\n handlerOffset,\n dataInfo.length,\n canSliding,\n onScrollStart,\n scrollWithTiming,\n ]\n );\n\n const scrollTo = React.useCallback(\n (opts: TCarouselActionOptions = {}) => {\n const { index: i, count, animated = false, onFinished } = opts;\n\n if (typeof i === \"number\" && i > -1) {\n to({ i, animated, onFinished });\n return;\n }\n\n if (!count) return;\n\n const n = Math.round(count);\n\n if (n < 0) prev({ count: Math.abs(n), animated, onFinished });\n else next({ count: n, animated, onFinished });\n },\n [prev, next, to]\n );\n\n React.useImperativeHandle(\n ref,\n () => ({\n next,\n prev,\n getCurrentIndex,\n scrollTo,\n }),\n [getCurrentIndex, next, prev, scrollTo]\n );\n\n return {\n next,\n prev,\n scrollTo,\n getCurrentIndex,\n getSharedIndex: () => sharedIndex.current,\n index,\n };\n}\n"]}
1
+ {"version":3,"sources":["useCarouselController.tsx"],"names":["useCarouselController","options","ref","size","loop","dataLength","handlerOffset","withAnimation","defaultIndex","duration","autoFillData","fixedDirection","globalState","overscrollEnabled","props","containerSize","layout","dataInfo","React","useMemo","length","disable","originalLength","index","sharedIndex","sharedPreIndex","currentFixedPage","useCallback","Math","round","value","fixed","abs","setSharedIndex","newSharedIndex","current","handlerOffsetValue","toInt","isPositive","i","newSharedIndexValue","rawDataLength","convertToSharedIndex","runOnJS","getCurrentIndex","realIndex","canSliding","onScrollEnd","onScrollStart","scrollWithTiming","toValue","onFinished","callback","isFinished","defaultWithAnimation","type","config","easing","Easing","easeOutQuart","dealWithAnimation","next","opts","count","animated","visibleContentWidth","width","nextPage","prev","prevPage","to","direction","offset","totalSize","isCloseToNextLoop","finalOffset","floor","scrollTo","n","useImperativeHandle","getSharedIndex"],"mappings":"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","sourcesContent":["import React, { useRef } from \"react\";\nimport { SharedValue, runOnJS, useAnimatedReaction, useSharedValue } from \"react-native-reanimated\";\n\nimport { Easing } from \"../constants\";\nimport { useGlobalState } from \"../store\";\nimport type {\n ICarouselInstance,\n TCarouselActionOptions,\n TCarouselProps,\n WithTimingAnimation,\n} from \"../types\";\nimport {\n computedRealIndexWithAutoFillData,\n convertToSharedIndex,\n} from \"../utils/computed-with-auto-fill-data\";\nimport { dealWithAnimation } from \"../utils/deal-with-animation\";\nimport { handlerOffsetDirection } from \"../utils/handleroffset-direction\";\nimport { round } from \"../utils/log\";\n\ninterface IOpts {\n ref: React.ForwardedRef<ICarouselInstance>;\n loop: boolean;\n size: number;\n dataLength: number;\n handlerOffset: SharedValue<number>;\n autoFillData: TCarouselProps[\"autoFillData\"];\n withAnimation?: TCarouselProps[\"withAnimation\"];\n fixedDirection?: TCarouselProps[\"fixedDirection\"];\n duration?: number;\n defaultIndex?: number;\n onScrollStart?: () => void;\n onScrollEnd?: () => void;\n}\n\nexport interface ICarouselController {\n getSharedIndex: () => number;\n prev: (opts?: TCarouselActionOptions) => void;\n next: (opts?: TCarouselActionOptions) => void;\n getCurrentIndex: () => number;\n scrollTo: (opts?: TCarouselActionOptions) => void;\n index: SharedValue<number>;\n}\n\nexport function useCarouselController(options: IOpts): ICarouselController {\n const {\n ref,\n size,\n loop,\n dataLength,\n handlerOffset,\n withAnimation,\n defaultIndex = 0,\n duration,\n autoFillData,\n fixedDirection,\n } = options;\n\n const globalState = useGlobalState();\n\n const {\n props: { overscrollEnabled },\n layout: { containerSize },\n } = globalState;\n\n const dataInfo = React.useMemo(\n () => ({\n length: dataLength,\n disable: !dataLength,\n originalLength: dataLength,\n }),\n [dataLength]\n );\n\n const index = useSharedValue<number>(defaultIndex);\n // The Index displayed to the user\n const sharedIndex = useRef<number>(defaultIndex);\n const sharedPreIndex = useRef<number>(defaultIndex);\n\n const currentFixedPage = React.useCallback(() => {\n if (loop) return -Math.round(handlerOffset.value / size);\n\n const fixed = (handlerOffset.value / size) % dataInfo.length;\n return Math.round(\n handlerOffset.value <= 0 ? Math.abs(fixed) : Math.abs(fixed > 0 ? dataInfo.length - fixed : 0)\n );\n }, [handlerOffset, dataInfo, size, loop]);\n\n function setSharedIndex(newSharedIndex: number) {\n sharedIndex.current = newSharedIndex;\n }\n\n useAnimatedReaction(\n () => {\n const handlerOffsetValue = handlerOffset.value;\n const toInt = round(handlerOffsetValue / size) % dataInfo.length;\n const isPositive = handlerOffsetValue <= 0;\n const i = isPositive ? Math.abs(toInt) : Math.abs(toInt > 0 ? dataInfo.length - toInt : 0);\n\n const newSharedIndexValue = convertToSharedIndex({\n loop,\n rawDataLength: dataInfo.originalLength,\n autoFillData: autoFillData!,\n index: i,\n });\n\n return {\n i,\n newSharedIndexValue,\n };\n },\n ({ i, newSharedIndexValue }) => {\n index.value = i;\n runOnJS(setSharedIndex)(newSharedIndexValue);\n },\n [sharedPreIndex, sharedIndex, size, dataInfo, index, loop, autoFillData, handlerOffset]\n );\n\n const getCurrentIndex = React.useCallback(() => {\n const realIndex = computedRealIndexWithAutoFillData({\n index: index.value,\n dataLength: dataInfo.originalLength,\n loop,\n autoFillData: autoFillData!,\n });\n\n return realIndex;\n }, [index, autoFillData, dataInfo, loop]);\n\n const canSliding = React.useCallback(() => {\n return !dataInfo.disable;\n }, [dataInfo]);\n\n const onScrollEnd = React.useCallback(() => {\n options.onScrollEnd?.();\n }, [options]);\n\n const onScrollStart = React.useCallback(() => {\n options.onScrollStart?.();\n }, [options]);\n\n const scrollWithTiming = React.useCallback(\n (toValue: number, onFinished?: () => void) => {\n \"worklet\";\n const callback = (isFinished: boolean) => {\n \"worklet\";\n if (isFinished) {\n runOnJS(onScrollEnd)();\n onFinished && runOnJS(onFinished)();\n }\n };\n\n const defaultWithAnimation: WithTimingAnimation = {\n type: \"timing\",\n config: { duration, easing: Easing.easeOutQuart },\n };\n\n return dealWithAnimation(withAnimation ?? defaultWithAnimation)(toValue, callback);\n },\n [duration, withAnimation, onScrollEnd]\n );\n\n const next = React.useCallback(\n (opts: TCarouselActionOptions = {}) => {\n \"worklet\";\n const { count = 1, animated = true, onFinished } = opts;\n if (!canSliding()) return;\n\n if (!loop && index.value >= dataInfo.length - 1) return;\n\n /* \n [Overscroll Protection Logic]\n \n This section handles the overscroll protection when overscrollEnabled is false.\n It prevents scrolling beyond the visible content area.\n\n Example scenario:\n - Container width: 300px\n - Item width: 75px (4 items per view)\n - Total items: 6\n \n Initial state (index = 0):\n [0][1][2][3] | [4][5]\n visible | remaining\n\n After 2 slides (index = 2):\n [0][1] | [2][3][4][5]\n hidden | visible\n\n The visibleContentWidth calculation:\n - At index 2, remaining items = 4 (items 2,3,4,5)\n - visibleContentWidth = 4 * 75px = 300px\n \n If we try to slide again:\n - New visibleContentWidth would be: 2 * 75px = 150px (only items 4,5 remain)\n - Since 150px < container width (300px), the slide is prevented\n \n This ensures we don't scroll beyond the last set of fully visible items,\n maintaining a clean UX without partial item visibility at the edges.\n */\n const visibleContentWidth = (dataInfo.length - index.value) * size;\n if (!overscrollEnabled && !(visibleContentWidth > containerSize.value.width)) {\n return;\n }\n\n onScrollStart?.();\n\n const nextPage = currentFixedPage() + count;\n index.value = nextPage;\n\n if (animated) {\n handlerOffset.value = scrollWithTiming(-nextPage * size, onFinished) as any;\n } else {\n handlerOffset.value = -nextPage * size;\n onFinished?.();\n }\n },\n [\n canSliding,\n loop,\n index,\n dataInfo,\n onScrollStart,\n handlerOffset,\n size,\n scrollWithTiming,\n currentFixedPage,\n ]\n );\n\n const prev = React.useCallback(\n (opts: TCarouselActionOptions = {}) => {\n const { count = 1, animated = true, onFinished } = opts;\n if (!canSliding()) return;\n\n if (!loop && index.value <= 0) return;\n\n onScrollStart?.();\n\n const prevPage = currentFixedPage() - count;\n index.value = prevPage;\n\n if (animated) {\n handlerOffset.value = scrollWithTiming(-prevPage * size, onFinished);\n } else {\n handlerOffset.value = -prevPage * size;\n onFinished?.();\n }\n },\n [\n canSliding,\n loop,\n index,\n onScrollStart,\n handlerOffset,\n size,\n scrollWithTiming,\n currentFixedPage,\n ]\n );\n\n const to = React.useCallback(\n (opts: { i: number; animated: boolean; onFinished?: () => void }) => {\n const { i, animated = false, onFinished } = opts;\n\n if (i === index.value) return;\n\n if (!canSliding()) return;\n\n onScrollStart?.();\n // direction -> 1 | -1\n const direction = handlerOffsetDirection(handlerOffset, fixedDirection);\n\n // target offset\n const offset = i * size * direction;\n // page width size * page count\n const totalSize = dataInfo.length * size;\n\n let isCloseToNextLoop = false;\n\n if (loop) {\n isCloseToNextLoop = Math.abs(handlerOffset.value % totalSize) / totalSize >= 0.5;\n }\n\n const finalOffset =\n (Math.floor(Math.abs(handlerOffset.value / totalSize)) + (isCloseToNextLoop ? 1 : 0)) *\n totalSize *\n direction +\n offset;\n\n if (animated) {\n index.value = i;\n handlerOffset.value = scrollWithTiming(finalOffset, onFinished);\n } else {\n handlerOffset.value = finalOffset;\n index.value = i;\n onFinished?.();\n }\n },\n [\n size,\n loop,\n index,\n fixedDirection,\n handlerOffset,\n dataInfo.length,\n canSliding,\n onScrollStart,\n scrollWithTiming,\n ]\n );\n\n const scrollTo = React.useCallback(\n (opts: TCarouselActionOptions = {}) => {\n const { index: i, count, animated = false, onFinished } = opts;\n\n if (typeof i === \"number\" && i > -1) {\n to({ i, animated, onFinished });\n return;\n }\n\n if (!count) return;\n\n const n = Math.round(count);\n\n if (n < 0) prev({ count: Math.abs(n), animated, onFinished });\n else next({ count: n, animated, onFinished });\n },\n [prev, next, to]\n );\n\n React.useImperativeHandle(\n ref,\n () => ({\n next,\n prev,\n getCurrentIndex,\n scrollTo,\n }),\n [getCurrentIndex, next, prev, scrollTo]\n );\n\n return {\n next,\n prev,\n scrollTo,\n getCurrentIndex,\n getSharedIndex: () => sharedIndex.current,\n index,\n };\n}\n"]}