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.
- package/README.md +2 -40
- package/lib/commonjs/components/Carousel.js +1 -42
- package/lib/commonjs/components/Carousel.js.map +1 -1
- package/lib/commonjs/components/Carousel.test.js +2 -678
- package/lib/commonjs/components/Carousel.test.js.map +1 -1
- package/lib/commonjs/components/CarouselLayout.js +1 -211
- package/lib/commonjs/components/CarouselLayout.js.map +1 -1
- package/lib/commonjs/components/ItemLayout.js +1 -98
- package/lib/commonjs/components/ItemLayout.js.map +1 -1
- package/lib/commonjs/components/ItemRenderer.js +1 -79
- package/lib/commonjs/components/ItemRenderer.js.map +1 -1
- package/lib/commonjs/components/LazyView.js +1 -21
- package/lib/commonjs/components/LazyView.js.map +1 -1
- package/lib/commonjs/components/Pagination/Basic/PaginationItem.js +1 -83
- package/lib/commonjs/components/Pagination/Basic/PaginationItem.js.map +1 -1
- package/lib/commonjs/components/Pagination/Basic/index.js +1 -53
- package/lib/commonjs/components/Pagination/Basic/index.js.map +1 -1
- package/lib/commonjs/components/Pagination/Custom/PaginationItem.js +1 -88
- package/lib/commonjs/components/Pagination/Custom/PaginationItem.js.map +1 -1
- package/lib/commonjs/components/Pagination/Custom/index.js +1 -61
- package/lib/commonjs/components/Pagination/Custom/index.js.map +1 -1
- package/lib/commonjs/components/Pagination/index.js +1 -16
- package/lib/commonjs/components/Pagination/index.js.map +1 -1
- package/lib/commonjs/components/ScrollViewGesture.js +1 -362
- package/lib/commonjs/components/ScrollViewGesture.js.map +1 -1
- package/lib/commonjs/components/rnr-demo.test.js +1 -44
- package/lib/commonjs/components/rnr-demo.test.js.map +1 -1
- package/lib/commonjs/constants/index.js +1 -21
- package/lib/commonjs/constants/index.js.map +1 -1
- package/lib/commonjs/hooks/useAutoPlay.js +1 -56
- package/lib/commonjs/hooks/useAutoPlay.js.map +1 -1
- package/lib/commonjs/hooks/useAutoPlay.test.js +1 -154
- package/lib/commonjs/hooks/useAutoPlay.test.js.map +1 -1
- package/lib/commonjs/hooks/useCarouselController.js +1 -301
- package/lib/commonjs/hooks/useCarouselController.js.map +1 -1
- package/lib/commonjs/hooks/useCarouselController.test.js +1 -456
- package/lib/commonjs/hooks/useCarouselController.test.js.map +1 -1
- package/lib/commonjs/hooks/useCheckMounted.js +1 -23
- package/lib/commonjs/hooks/useCheckMounted.js.map +1 -1
- package/lib/commonjs/hooks/useCheckMounted.test.js +1 -44
- package/lib/commonjs/hooks/useCheckMounted.test.js.map +1 -1
- package/lib/commonjs/hooks/useCommonVariables.js +1 -102
- package/lib/commonjs/hooks/useCommonVariables.js.map +1 -1
- package/lib/commonjs/hooks/useCommonVariables.test.js +1 -37
- package/lib/commonjs/hooks/useCommonVariables.test.js.map +1 -1
- package/lib/commonjs/hooks/useInitProps.js +1 -78
- package/lib/commonjs/hooks/useInitProps.js.map +1 -1
- package/lib/commonjs/hooks/useInitProps.test.js +1 -126
- package/lib/commonjs/hooks/useInitProps.test.js.map +1 -1
- package/lib/commonjs/hooks/useLayoutConfig.js +1 -39
- package/lib/commonjs/hooks/useLayoutConfig.js.map +1 -1
- package/lib/commonjs/hooks/useLayoutConfig.test.js +1 -241
- package/lib/commonjs/hooks/useLayoutConfig.test.js.map +1 -1
- package/lib/commonjs/hooks/useOffsetX.js +1 -51
- package/lib/commonjs/hooks/useOffsetX.js.map +1 -1
- package/lib/commonjs/hooks/useOffsetX.test.js +2 -40
- package/lib/commonjs/hooks/useOffsetX.test.js.map +1 -1
- package/lib/commonjs/hooks/useOnProgressChange.js +1 -46
- package/lib/commonjs/hooks/useOnProgressChange.js.map +1 -1
- package/lib/commonjs/hooks/useOnProgressChange.test.js +1 -162
- package/lib/commonjs/hooks/useOnProgressChange.test.js.map +1 -1
- package/lib/commonjs/hooks/usePanGestureProxy.js +1 -117
- package/lib/commonjs/hooks/usePanGestureProxy.js.map +1 -1
- package/lib/commonjs/hooks/usePanGestureProxy.test.js +1 -419
- package/lib/commonjs/hooks/usePanGestureProxy.test.js.map +1 -1
- package/lib/commonjs/hooks/usePropsErrorBoundary.js +1 -36
- package/lib/commonjs/hooks/usePropsErrorBoundary.js.map +1 -1
- package/lib/commonjs/hooks/useUpdateGestureConfig.js +1 -19
- package/lib/commonjs/hooks/useUpdateGestureConfig.js.map +1 -1
- package/lib/commonjs/hooks/useUpdateGestureConfig.test.js +1 -91
- package/lib/commonjs/hooks/useUpdateGestureConfig.test.js.map +1 -1
- package/lib/commonjs/hooks/useVisibleRanges.js +1 -71
- package/lib/commonjs/hooks/useVisibleRanges.js.map +1 -1
- package/lib/commonjs/hooks/useVisibleRanges.test.js +7 -101
- package/lib/commonjs/hooks/useVisibleRanges.test.js.map +1 -1
- package/lib/commonjs/index.js +1 -21
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/layouts/index.js +1 -20
- package/lib/commonjs/layouts/index.js.map +1 -1
- package/lib/commonjs/layouts/normal.js +1 -27
- package/lib/commonjs/layouts/normal.js.map +1 -1
- package/lib/commonjs/layouts/parallax.js +1 -38
- package/lib/commonjs/layouts/parallax.js.map +1 -1
- package/lib/commonjs/layouts/stack.js +1 -213
- package/lib/commonjs/layouts/stack.js.map +1 -1
- package/lib/commonjs/layouts/stack.test.js +3 -22
- package/lib/commonjs/layouts/stack.test.js.map +1 -1
- package/lib/commonjs/store/index.js +1 -67
- package/lib/commonjs/store/index.js.map +1 -1
- package/lib/commonjs/types.js +1 -5
- package/lib/commonjs/utils/compute-offset-if-data-changed.js +1 -51
- package/lib/commonjs/utils/compute-offset-if-data-changed.js.map +1 -1
- package/lib/commonjs/utils/compute-offset-if-data-changed.test.js +1 -29
- package/lib/commonjs/utils/compute-offset-if-data-changed.test.js.map +1 -1
- package/lib/commonjs/utils/compute-offset-if-size-changed.js +1 -17
- package/lib/commonjs/utils/compute-offset-if-size-changed.js.map +1 -1
- package/lib/commonjs/utils/compute-offset-if-size-changed.test.js +1 -71
- package/lib/commonjs/utils/compute-offset-if-size-changed.test.js.map +1 -1
- package/lib/commonjs/utils/computed-with-auto-fill-data.js +1 -123
- package/lib/commonjs/utils/computed-with-auto-fill-data.js.map +1 -1
- package/lib/commonjs/utils/computed-with-auto-fill-data.test.js +1 -179
- package/lib/commonjs/utils/computed-with-auto-fill-data.test.js.map +1 -1
- package/lib/commonjs/utils/deal-with-animation.js +1 -20
- package/lib/commonjs/utils/deal-with-animation.js.map +1 -1
- package/lib/commonjs/utils/deal-with-animation.test.js +1 -75
- package/lib/commonjs/utils/deal-with-animation.test.js.map +1 -1
- package/lib/commonjs/utils/handleroffset-direction.js +1 -15
- package/lib/commonjs/utils/handleroffset-direction.js.map +1 -1
- package/lib/commonjs/utils/handleroffset-direction.test.js +1 -45
- package/lib/commonjs/utils/handleroffset-direction.test.js.map +1 -1
- package/lib/commonjs/utils/index.test.js +1 -73
- package/lib/commonjs/utils/index.test.js.map +1 -1
- package/lib/commonjs/utils/log.js +1 -21
- package/lib/commonjs/utils/log.js.map +1 -1
- package/lib/commonjs/utils/log.test.js +1 -57
- package/lib/commonjs/utils/log.test.js.map +1 -1
- package/lib/module/hooks/useOnProgressChange.js +1 -1
- package/lib/module/hooks/useOnProgressChange.js.map +1 -1
- package/package.json +7 -2
- 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":"6GAAA,qDACA,8DAEA,uCACA,+BAOA,+EAIA,+DACA,wEACA,iC,glPA0BO,QAASA,CAAAA,qBAAT,CAA+BC,OAA/B,CAAoE,CACzE,GACEC,CAAAA,GADF,CAWID,OAXJ,CACEC,GADF,CAEEC,IAFF,CAWIF,OAXJ,CAEEE,IAFF,CAGEC,IAHF,CAWIH,OAXJ,CAGEG,IAHF,CAIEC,UAJF,CAWIJ,OAXJ,CAIEI,UAJF,CAKEC,aALF,CAWIL,OAXJ,CAKEK,aALF,CAMEC,aANF,CAWIN,OAXJ,CAMEM,aANF,uBAWIN,OAXJ,CAOEO,YAPF,CAOEA,YAPF,gCAOiB,CAPjB,uBAQEC,QARF,CAWIR,OAXJ,CAQEQ,QARF,CASEC,YATF,CAWIT,OAXJ,CASES,YATF,CAUEC,cAVF,CAWIV,OAXJ,CAUEU,cAVF,CAaA,GAAMC,CAAAA,WAAW,CAAG,2BAApB,CAEA,GACWC,CAAAA,iBADX,CAGID,WAHJ,CACEE,KADF,CACWD,iBADX,CAEYE,aAFZ,CAGIH,WAHJ,CAEEI,MAFF,CAEYD,aAFZ,CAKA,GAAME,CAAAA,QAAQ,CAAGC,eAAMC,OAAN,CACf,iBAAO,CACLC,MAAM,CAAEf,UADH,CAELgB,OAAO,CAAE,CAAChB,UAFL,CAGLiB,cAAc,CAAEjB,UAHX,CAAP,EADe,CAMf,CAACA,UAAD,CANe,CAAjB,CASA,GAAMkB,CAAAA,KAAK,CAAG,0CAAuBf,YAAvB,CAAd,CAEA,GAAMgB,CAAAA,WAAW,CAAG,kBAAehB,YAAf,CAApB,CACA,GAAMiB,CAAAA,cAAc,CAAG,kBAAejB,YAAf,CAAvB,CAEA,GAAMkB,CAAAA,gBAAgB,CAAGR,eAAMS,WAAN,CAAkB,UAAM,CAC/C,GAAIvB,IAAJ,CAAU,MAAO,CAACwB,IAAI,CAACC,KAAL,CAAWvB,aAAa,CAACwB,KAAd,CAAsB3B,IAAjC,CAAR,CAEV,GAAM4B,CAAAA,KAAK,CAAIzB,aAAa,CAACwB,KAAd,CAAsB3B,IAAvB,CAA+Bc,QAAQ,CAACG,MAAtD,CACA,MAAOQ,CAAAA,IAAI,CAACC,KAAL,CACLvB,aAAa,CAACwB,KAAd,EAAuB,CAAvB,CAA2BF,IAAI,CAACI,GAAL,CAASD,KAAT,CAA3B,CAA6CH,IAAI,CAACI,GAAL,CAASD,KAAK,CAAG,CAAR,CAAYd,QAAQ,CAACG,MAAT,CAAkBW,KAA9B,CAAsC,CAA/C,CADxC,CAAP,CAGD,CAPwB,CAOtB,CAACzB,aAAD,CAAgBW,QAAhB,CAA0Bd,IAA1B,CAAgCC,IAAhC,CAPsB,CAAzB,CASA,QAAS6B,CAAAA,cAAT,CAAwBC,cAAxB,CAAgD,CAC9CV,WAAW,CAACW,OAAZ,CAAsBD,cAAtB,CACD,CAED,+CACE,gFAAM,CACJ,GAAME,CAAAA,kBAAkB,CAAG9B,aAAa,CAACwB,KAAzC,CACA,GAAMO,CAAAA,KAAK,CAAG,eAAMD,kBAAkB,CAAGjC,IAA3B,EAAmCc,QAAQ,CAACG,MAA1D,CACA,GAAMkB,CAAAA,UAAU,CAAGF,kBAAkB,EAAI,CAAzC,CACA,GAAMG,CAAAA,CAAC,CAAGD,UAAU,CAAGV,IAAI,CAACI,GAAL,CAASK,KAAT,CAAH,CAAqBT,IAAI,CAACI,GAAL,CAASK,KAAK,CAAG,CAAR,CAAYpB,QAAQ,CAACG,MAAT,CAAkBiB,KAA9B,CAAsC,CAA/C,CAAzC,CAEA,GAAMG,CAAAA,mBAAmB,CAAG,mDAAqB,CAC/CpC,IAAI,CAAJA,IAD+C,CAE/CqC,aAAa,CAAExB,QAAQ,CAACK,cAFuB,CAG/CZ,YAAY,CAAEA,YAHiC,CAI/Ca,KAAK,CAAEgB,CAJwC,CAArB,CAA5B,CAOA,MAAO,CACLA,CAAC,CAADA,CADK,CAELC,mBAAmB,CAAnBA,mBAFK,CAAP,CAID,CAjBD,oCAC6BlC,aAD7B,OAEgBuB,UAFhB,MAE2C1B,IAF3C,UAEmDc,QAFnD,sBAM8ByB,8CAN9B,MAOItC,IAPJ,cASkBM,YATlB,4IADF,GAmBE,oFAAgC,IAA7B6B,CAAAA,CAA6B,MAA7BA,CAA6B,CAA1BC,mBAA0B,MAA1BA,mBAA0B,CAC9BjB,KAAK,CAACO,KAAN,CAAcS,CAAd,CACA,mCAAQN,cAAR,EAAwBO,mBAAxB,EACD,CAHD,4BACEjB,KADF,SAEEoB,8BAFF,gBAEUV,cAFV,8IAnBF,GAuBE,CAACR,cAAD,CAAiBD,WAAjB,CAA8BrB,IAA9B,CAAoCc,QAApC,CAA8CM,KAA9C,CAAqDnB,IAArD,CAA2DM,YAA3D,CAAyEJ,aAAzE,CAvBF,EA0BA,GAAMsC,CAAAA,eAAe,CAAG1B,eAAMS,WAAN,CAAkB,UAAM,CAC9C,GAAMkB,CAAAA,SAAS,CAAG,gEAAkC,CAClDtB,KAAK,CAAEA,KAAK,CAACO,KADqC,CAElDzB,UAAU,CAAEY,QAAQ,CAACK,cAF6B,CAGlDlB,IAAI,CAAJA,IAHkD,CAIlDM,YAAY,CAAEA,YAJoC,CAAlC,CAAlB,CAOA,MAAOmC,CAAAA,SAAP,CACD,CATuB,CASrB,CAACtB,KAAD,CAAQb,YAAR,CAAsBO,QAAtB,CAAgCb,IAAhC,CATqB,CAAxB,CAWA,GAAM0C,CAAAA,UAAU,CAAG5B,eAAMS,WAAN,CAAkB,UAAM,CACzC,MAAO,CAACV,QAAQ,CAACI,OAAjB,CACD,CAFkB,CAEhB,CAACJ,QAAD,CAFgB,CAAnB,CAIA,GAAM8B,CAAAA,WAAW,CAAG7B,eAAMS,WAAN,CAAkB,UAAM,CAC1C1B,OAAO,CAAC8C,WAAR,cAAA9C,OAAO,CAAC8C,WAAR,GACD,CAFmB,CAEjB,CAAC9C,OAAD,CAFiB,CAApB,CAIA,GAAM+C,CAAAA,aAAa,CAAG9B,eAAMS,WAAN,CAAkB,UAAM,CAC5C1B,OAAO,CAAC+C,aAAR,cAAA/C,OAAO,CAAC+C,aAAR,GACD,CAFqB,CAEnB,CAAC/C,OAAD,CAFmB,CAAtB,CAIA,GAAMgD,CAAAA,gBAAgB,CAAG/B,eAAMS,WAAN,CACvB,+EAACuB,OAAD,CAAkBC,UAAlB,CAA8C,CAE5C,GAAMC,CAAAA,QAAQ,CAAG,+EAACC,UAAD,CAAyB,CAExC,GAAIA,UAAJ,CAAgB,CACd,mCAAQN,WAAR,IACAI,UAAU,EAAI,mCAAQA,UAAR,GAAd,CACD,CACF,CANgB,8BAGbR,8BAHa,aAGLI,WAHK,YAIbI,UAJa,8IAAH,EAAd,CAQA,GAAMG,CAAAA,oBAAyC,CAAG,CAChDC,IAAI,CAAE,QAD0C,CAEhDC,MAAM,CAAE,CAAE/C,QAAQ,CAARA,QAAF,CAAYgD,MAAM,CAAEC,kBAAOC,YAA3B,CAFwC,CAAlD,CAKA,MAAO,yCAAkBpD,aAAlB,OAAkBA,aAAlB,CAAmC+C,oBAAnC,EAAyDJ,OAAzD,CAAkEE,QAAlE,CAAP,CACD,CAhBD,8BAKMT,8BALN,aAKcI,WALd,UAYctC,QAZd,QAYgCiD,iBAZhC,mBAeSE,oCAfT,eAe2BrD,aAf3B,4IADuB,GAkBvB,CAACE,QAAD,CAAWF,aAAX,CAA0BwC,WAA1B,CAlBuB,CAAzB,CAqBA,GAAMc,CAAAA,IAAI,CAAG3C,eAAMS,WAAN,CACX,iFAAuC,IAAtCmC,CAAAA,IAAsC,2DAAP,EAAO,CAErC,gBAAmDA,IAAnD,CAAQC,KAAR,CAAQA,KAAR,sBAAgB,CAAhB,4BAAmDD,IAAnD,CAAmBE,QAAnB,CAAmBA,QAAnB,yBAA8B,IAA9B,gBAAoCb,UAApC,CAAmDW,IAAnD,CAAoCX,UAApC,CACA,GAAI,CAACL,UAAU,EAAf,CAAmB,OAEnB,GAAI,CAAC1C,IAAD,EAASmB,KAAK,CAACO,KAAN,EAAeb,QAAQ,CAACG,MAAT,CAAkB,CAA9C,CAAiD,OAgCjD,GAAM6C,CAAAA,mBAAmB,CAAG,CAAChD,QAAQ,CAACG,MAAT,CAAkBG,KAAK,CAACO,KAAzB,EAAkC3B,IAA9D,CACA,GAAI,CAACU,iBAAD,EAAsB,EAAEoD,mBAAmB,CAAGlD,aAAa,CAACe,KAAd,CAAoBoC,KAA5C,CAA1B,CAA8E,CAC5E,OACD,CAEDlB,aAAa,MAAb,QAAAA,aAAa,GAEb,GAAMmB,CAAAA,QAAQ,CAAGzC,gBAAgB,GAAKqC,KAAtC,CACAxC,KAAK,CAACO,KAAN,CAAcqC,QAAd,CAEA,GAAIH,QAAJ,CAAc,CACZ1D,aAAa,CAACwB,KAAd,CAAsBmB,gBAAgB,CAAC,CAACkB,QAAD,CAAYhE,IAAb,CAAmBgD,UAAnB,CAAtC,CACD,CAFD,IAEO,CACL7C,aAAa,CAACwB,KAAd,CAAsB,CAACqC,QAAD,CAAYhE,IAAlC,CACAgD,UAAU,MAAV,QAAAA,UAAU,GACX,CACF,CArDD,iCAGOL,UAHP,MAKO1C,IALP,OAKemB,KALf,UAK8BN,QAL9B,MAqCgEd,IArChE,mBAsCOU,iBAtCP,eAsCoDE,aAtCpD,eA0CEiC,aA1CF,kBA4CmBtB,gBA5CnB,eAgDIpB,aAhDJ,kBAgD0B2C,gBAhD1B,4IADW,GAuDX,CACEH,UADF,CAEE1C,IAFF,CAGEmB,KAHF,CAIEN,QAJF,CAKE+B,aALF,CAME1C,aANF,CAOEH,IAPF,CAQE8C,gBARF,CASEvB,gBATF,CAvDW,CAAb,CAoEA,GAAM0C,CAAAA,IAAI,CAAGlD,eAAMS,WAAN,CACX,UAAuC,IAAtCmC,CAAAA,IAAsC,2DAAP,EAAO,CACrC,iBAAmDA,IAAnD,CAAQC,KAAR,CAAQA,KAAR,uBAAgB,CAAhB,8BAAmDD,IAAnD,CAAmBE,QAAnB,CAAmBA,QAAnB,0BAA8B,IAA9B,iBAAoCb,UAApC,CAAmDW,IAAnD,CAAoCX,UAApC,CACA,GAAI,CAACL,UAAU,EAAf,CAAmB,OAEnB,GAAI,CAAC1C,IAAD,EAASmB,KAAK,CAACO,KAAN,EAAe,CAA5B,CAA+B,OAE/BkB,aAAa,MAAb,QAAAA,aAAa,GAEb,GAAMqB,CAAAA,QAAQ,CAAG3C,gBAAgB,GAAKqC,KAAtC,CACAxC,KAAK,CAACO,KAAN,CAAcuC,QAAd,CAEA,GAAIL,QAAJ,CAAc,CACZ1D,aAAa,CAACwB,KAAd,CAAsBmB,gBAAgB,CAAC,CAACoB,QAAD,CAAYlE,IAAb,CAAmBgD,UAAnB,CAAtC,CACD,CAFD,IAEO,CACL7C,aAAa,CAACwB,KAAd,CAAsB,CAACuC,QAAD,CAAYlE,IAAlC,CACAgD,UAAU,MAAV,QAAAA,UAAU,GACX,CACF,CAlBU,CAmBX,CACEL,UADF,CAEE1C,IAFF,CAGEmB,KAHF,CAIEyB,aAJF,CAKE1C,aALF,CAMEH,IANF,CAOE8C,gBAPF,CAQEvB,gBARF,CAnBW,CAAb,CA+BA,GAAM4C,CAAAA,EAAE,CAAGpD,eAAMS,WAAN,CACT,SAACmC,IAAD,CAAqE,CACnE,GAAQvB,CAAAA,CAAR,CAA4CuB,IAA5C,CAAQvB,CAAR,iBAA4CuB,IAA5C,CAAWE,QAAX,CAAWA,QAAX,0BAAsB,KAAtB,iBAA6Bb,UAA7B,CAA4CW,IAA5C,CAA6BX,UAA7B,CAEA,GAAIZ,CAAC,GAAKhB,KAAK,CAACO,KAAhB,CAAuB,OAEvB,GAAI,CAACgB,UAAU,EAAf,CAAmB,OAEnBE,aAAa,MAAb,QAAAA,aAAa,GAEb,GAAMuB,CAAAA,SAAS,CAAG,mDAAuBjE,aAAvB,CAAsCK,cAAtC,CAAlB,CAGA,GAAM6D,CAAAA,MAAM,CAAGjC,CAAC,CAAGpC,IAAJ,CAAWoE,SAA1B,CAEA,GAAME,CAAAA,SAAS,CAAGxD,QAAQ,CAACG,MAAT,CAAkBjB,IAApC,CAEA,GAAIuE,CAAAA,iBAAiB,CAAG,KAAxB,CAEA,GAAItE,IAAJ,CAAU,CACRsE,iBAAiB,CAAG9C,IAAI,CAACI,GAAL,CAAS1B,aAAa,CAACwB,KAAd,CAAsB2C,SAA/B,EAA4CA,SAA5C,EAAyD,GAA7E,CACD,CAED,GAAME,CAAAA,WAAW,CACf,CAAC/C,IAAI,CAACgD,KAAL,CAAWhD,IAAI,CAACI,GAAL,CAAS1B,aAAa,CAACwB,KAAd,CAAsB2C,SAA/B,CAAX,GAAyDC,iBAAiB,CAAG,CAAH,CAAO,CAAjF,CAAD,EACED,SADF,CAEEF,SAFF,CAGAC,MAJF,CAMA,GAAIR,QAAJ,CAAc,CACZzC,KAAK,CAACO,KAAN,CAAcS,CAAd,CACAjC,aAAa,CAACwB,KAAd,CAAsBmB,gBAAgB,CAAC0B,WAAD,CAAcxB,UAAd,CAAtC,CACD,CAHD,IAGO,CACL7C,aAAa,CAACwB,KAAd,CAAsB6C,WAAtB,CACApD,KAAK,CAACO,KAAN,CAAcS,CAAd,CACAY,UAAU,MAAV,QAAAA,UAAU,GACX,CACF,CArCQ,CAsCT,CACEhD,IADF,CAEEC,IAFF,CAGEmB,KAHF,CAIEZ,cAJF,CAKEL,aALF,CAMEW,QAAQ,CAACG,MANX,CAOE0B,UAPF,CAQEE,aARF,CASEC,gBATF,CAtCS,CAAX,CAmDA,GAAM4B,CAAAA,QAAQ,CAAG3D,eAAMS,WAAN,CACf,UAAuC,IAAtCmC,CAAAA,IAAsC,2DAAP,EAAO,CACrC,GAAevB,CAAAA,CAAf,CAA0DuB,IAA1D,CAAQvC,KAAR,CAAkBwC,KAAlB,CAA0DD,IAA1D,CAAkBC,KAAlB,iBAA0DD,IAA1D,CAAyBE,QAAzB,CAAyBA,QAAzB,0BAAoC,KAApC,iBAA2Cb,UAA3C,CAA0DW,IAA1D,CAA2CX,UAA3C,CAEA,GAAI,MAAOZ,CAAAA,CAAP,GAAa,QAAb,EAAyBA,CAAC,CAAG,CAAC,CAAlC,CAAqC,CACnC+B,EAAE,CAAC,CAAE/B,CAAC,CAADA,CAAF,CAAKyB,QAAQ,CAARA,QAAL,CAAeb,UAAU,CAAVA,UAAf,CAAD,CAAF,CACA,OACD,CAED,GAAI,CAACY,KAAL,CAAY,OAEZ,GAAMe,CAAAA,CAAC,CAAGlD,IAAI,CAACC,KAAL,CAAWkC,KAAX,CAAV,CAEA,GAAIe,CAAC,CAAG,CAAR,CAAWV,IAAI,CAAC,CAAEL,KAAK,CAAEnC,IAAI,CAACI,GAAL,CAAS8C,CAAT,CAAT,CAAsBd,QAAQ,CAARA,QAAtB,CAAgCb,UAAU,CAAVA,UAAhC,CAAD,CAAJ,CAAX,IACKU,CAAAA,IAAI,CAAC,CAAEE,KAAK,CAAEe,CAAT,CAAYd,QAAQ,CAARA,QAAZ,CAAsBb,UAAU,CAAVA,UAAtB,CAAD,CAAJ,CACN,CAfc,CAgBf,CAACiB,IAAD,CAAOP,IAAP,CAAaS,EAAb,CAhBe,CAAjB,CAmBApD,eAAM6D,mBAAN,CACE7E,GADF,CAEE,iBAAO,CACL2D,IAAI,CAAJA,IADK,CAELO,IAAI,CAAJA,IAFK,CAGLxB,eAAe,CAAfA,eAHK,CAILiC,QAAQ,CAARA,QAJK,CAAP,EAFF,CAQE,CAACjC,eAAD,CAAkBiB,IAAlB,CAAwBO,IAAxB,CAA8BS,QAA9B,CARF,EAWA,MAAO,CACLhB,IAAI,CAAJA,IADK,CAELO,IAAI,CAAJA,IAFK,CAGLS,QAAQ,CAARA,QAHK,CAILjC,eAAe,CAAfA,eAJK,CAKLoC,cAAc,CAAE,gCAAMxD,CAAAA,WAAW,CAACW,OAAlB,EALX,CAMLZ,KAAK,CAALA,KANK,CAAP,CAQD","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"]}
|