react-native-reanimated-carousel 2.3.9 → 2.3.10

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 (30) hide show
  1. package/lib/commonjs/Carousel.js +1 -1
  2. package/lib/commonjs/Carousel.js.map +1 -1
  3. package/lib/commonjs/ScrollViewGesture.js +1 -1
  4. package/lib/commonjs/ScrollViewGesture.js.map +1 -1
  5. package/lib/commonjs/hooks/useAutoPlay.js +1 -1
  6. package/lib/commonjs/hooks/useAutoPlay.js.map +1 -1
  7. package/lib/commonjs/hooks/useCarouselController.js +1 -1
  8. package/lib/commonjs/hooks/useCarouselController.js.map +1 -1
  9. package/lib/commonjs/utils/computedWithAutoFillData.js +1 -1
  10. package/lib/commonjs/utils/computedWithAutoFillData.js.map +1 -1
  11. package/lib/module/Carousel.js +40 -25
  12. package/lib/module/Carousel.js.map +1 -1
  13. package/lib/module/ScrollViewGesture.js +8 -10
  14. package/lib/module/ScrollViewGesture.js.map +1 -1
  15. package/lib/module/hooks/useAutoPlay.js +7 -3
  16. package/lib/module/hooks/useAutoPlay.js.map +1 -1
  17. package/lib/module/hooks/useCarouselController.js +36 -43
  18. package/lib/module/hooks/useCarouselController.js.map +1 -1
  19. package/lib/module/utils/computedWithAutoFillData.js +25 -0
  20. package/lib/module/utils/computedWithAutoFillData.js.map +1 -1
  21. package/lib/typescript/hooks/useCarouselController.d.ts +4 -10
  22. package/lib/typescript/types.d.ts +4 -0
  23. package/lib/typescript/utils/computedWithAutoFillData.d.ts +4 -0
  24. package/package.json +3 -3
  25. package/src/Carousel.tsx +43 -29
  26. package/src/ScrollViewGesture.tsx +7 -9
  27. package/src/hooks/useAutoPlay.ts +4 -3
  28. package/src/hooks/useCarouselController.tsx +53 -62
  29. package/src/types.ts +4 -0
  30. package/src/utils/computedWithAutoFillData.ts +18 -0
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import Animated, { runOnJS, useDerivedValue } from 'react-native-reanimated';
2
+ import Animated, { runOnJS, runOnUI, useDerivedValue } from 'react-native-reanimated';
3
3
  import { useCarouselController } from './hooks/useCarouselController';
4
4
  import { useAutoPlay } from './hooks/useAutoPlay';
5
5
  import { usePropsErrorBoundary } from './hooks/usePropsErrorBoundary';
@@ -16,6 +16,7 @@ import { computedRealIndexWithAutoFillData } from './utils/computedWithAutoFillD
16
16
  const Carousel = /*#__PURE__*/React.forwardRef((_props, ref) => {
17
17
  const props = useInitProps(_props);
18
18
  const {
19
+ testID,
19
20
  data,
20
21
  rawData,
21
22
  loop,
@@ -67,28 +68,27 @@ const Carousel = /*#__PURE__*/React.forwardRef((_props, ref) => {
67
68
  const carouselController = useCarouselController({
68
69
  loop,
69
70
  size,
71
+ data,
72
+ autoFillData,
70
73
  handlerOffsetX,
71
- length: data.length,
72
- disable: !data.length,
73
74
  withAnimation,
74
- originalLength: data.length,
75
75
  defaultIndex,
76
76
  onScrollEnd: () => runOnJS(_onScrollEnd)(),
77
77
  onScrollBegin: () => !!onScrollBegin && runOnJS(onScrollBegin)(),
78
- onChange: i => !!onSnapToItem && runOnJS(onSnapToItem)(i),
79
78
  duration: scrollAnimationDuration
80
79
  });
81
80
  const {
81
+ sharedIndex,
82
+ sharedPreIndex,
83
+ to,
82
84
  next,
83
85
  prev,
84
- sharedPreIndex,
85
- sharedIndex,
86
- computedIndex,
86
+ scrollTo,
87
87
  getCurrentIndex
88
88
  } = carouselController;
89
89
  const {
90
- start,
91
- pause
90
+ start: startAutoPlay,
91
+ pause: pauseAutoPlay
92
92
  } = useAutoPlay({
93
93
  autoPlay,
94
94
  autoPlayInterval,
@@ -97,31 +97,45 @@ const Carousel = /*#__PURE__*/React.forwardRef((_props, ref) => {
97
97
  });
98
98
 
99
99
  const _onScrollEnd = React.useCallback(() => {
100
- computedIndex();
101
- onScrollEnd === null || onScrollEnd === void 0 ? void 0 : onScrollEnd(sharedPreIndex.current, sharedIndex.current);
102
- }, [sharedPreIndex, sharedIndex, computedIndex, onScrollEnd]);
100
+ 'worklet';
101
+
102
+ const _sharedIndex = Math.round(sharedIndex.value);
103
+
104
+ const _sharedPreIndex = Math.round(sharedPreIndex.value);
105
+
106
+ if (onSnapToItem) {
107
+ runOnJS(onSnapToItem)(_sharedIndex);
108
+ }
109
+
110
+ if (onScrollEnd) {
111
+ runOnJS(onScrollEnd)(_sharedPreIndex, _sharedIndex);
112
+ }
113
+ }, [onSnapToItem, onScrollEnd, sharedIndex, sharedPreIndex]);
103
114
 
104
115
  const scrollViewGestureOnScrollBegin = React.useCallback(() => {
105
- pause();
116
+ pauseAutoPlay();
106
117
  onScrollBegin === null || onScrollBegin === void 0 ? void 0 : onScrollBegin();
107
- }, [onScrollBegin, pause]);
118
+ }, [onScrollBegin, pauseAutoPlay]);
108
119
  const scrollViewGestureOnScrollEnd = React.useCallback(() => {
109
- start();
120
+ startAutoPlay();
121
+ /**
122
+ * TODO magic
123
+ */
110
124
 
111
- _onScrollEnd();
112
- }, [_onScrollEnd, start]);
113
- const scrollViewGestureOnTouchBegin = React.useCallback(pause, [pause]);
114
- const scrollViewGestureOnTouchEnd = React.useCallback(start, [start]);
125
+ runOnUI(_onScrollEnd)();
126
+ }, [_onScrollEnd, startAutoPlay]);
127
+ const scrollViewGestureOnTouchBegin = React.useCallback(pauseAutoPlay, [pauseAutoPlay]);
128
+ const scrollViewGestureOnTouchEnd = React.useCallback(startAutoPlay, [startAutoPlay]);
115
129
  const goToIndex = React.useCallback((i, animated) => {
116
- carouselController.to(i, animated);
117
- }, [carouselController]);
130
+ to(i, animated);
131
+ }, [to]);
118
132
  React.useImperativeHandle(ref, () => ({
119
133
  next,
120
134
  prev,
121
135
  getCurrentIndex,
122
136
  goToIndex,
123
- scrollTo: carouselController.scrollTo
124
- }), [getCurrentIndex, goToIndex, next, prev, carouselController.scrollTo]);
137
+ scrollTo
138
+ }), [getCurrentIndex, goToIndex, next, prev, scrollTo]);
125
139
  const visibleRanges = useVisibleRanges({
126
140
  total: data.length,
127
141
  viewSize: size,
@@ -164,7 +178,8 @@ const Carousel = /*#__PURE__*/React.forwardRef((_props, ref) => {
164
178
  style: [styles.container, {
165
179
  width: width || '100%',
166
180
  height: height || '100%'
167
- }, style]
181
+ }, style],
182
+ testID: testID
168
183
  }, /*#__PURE__*/React.createElement(ScrollViewGesture, {
169
184
  size: size,
170
185
  translation: handlerOffsetX,
@@ -1 +1 @@
1
- {"version":3,"sources":["Carousel.tsx"],"names":["React","Animated","runOnJS","useDerivedValue","useCarouselController","useAutoPlay","usePropsErrorBoundary","ScrollViewGesture","useVisibleRanges","StyleSheet","View","BaseLayout","useLayoutConfig","useInitProps","CTX","useCommonVariables","useOnProgressChange","computedRealIndexWithAutoFillData","Carousel","forwardRef","_props","ref","props","data","rawData","loop","autoFillData","mode","style","width","height","vertical","autoPlay","windowSize","autoPlayReverse","autoPlayInterval","scrollAnimationDuration","withAnimation","renderItem","onScrollEnd","onSnapToItem","onScrollBegin","onProgressChange","customAnimation","defaultIndex","commonVariables","size","handlerOffsetX","dataLength","length","offsetX","totalSize","x","value","isNaN","carouselController","disable","originalLength","_onScrollEnd","onChange","i","duration","next","prev","sharedPreIndex","sharedIndex","computedIndex","getCurrentIndex","start","pause","useCallback","current","scrollViewGestureOnScrollBegin","scrollViewGestureOnScrollEnd","scrollViewGestureOnTouchBegin","scrollViewGestureOnTouchEnd","goToIndex","animated","to","useImperativeHandle","scrollTo","visibleRanges","total","viewSize","translation","layoutConfig","renderLayout","item","realIndex","index","animationValue","common","styles","container","itemsVertical","itemsHorizontal","map","create","overflow","flexDirection"],"mappings":"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","sourcesContent":["import React from 'react';\nimport Animated, { runOnJS, useDerivedValue } from 'react-native-reanimated';\n\nimport { useCarouselController } from './hooks/useCarouselController';\nimport { useAutoPlay } from './hooks/useAutoPlay';\nimport { usePropsErrorBoundary } from './hooks/usePropsErrorBoundary';\nimport { ScrollViewGesture } from './ScrollViewGesture';\nimport { useVisibleRanges } from './hooks/useVisibleRanges';\n\nimport type { ICarouselInstance, TCarouselProps } from './types';\nimport { StyleSheet, View } from 'react-native';\nimport { BaseLayout } from './layouts/BaseLayout';\nimport { useLayoutConfig } from './hooks/useLayoutConfig';\nimport { useInitProps } from './hooks/useInitProps';\nimport { CTX } from './store';\nimport { useCommonVariables } from './hooks/useCommonVariables';\nimport { useOnProgressChange } from './hooks/useOnProgressChange';\nimport { computedRealIndexWithAutoFillData } from './utils/computedWithAutoFillData';\n\nconst Carousel = React.forwardRef<ICarouselInstance, TCarouselProps<any>>(\n (_props, ref) => {\n const props = useInitProps(_props);\n\n const {\n data,\n rawData,\n loop,\n autoFillData,\n mode,\n style,\n width,\n height,\n vertical,\n autoPlay,\n windowSize,\n autoPlayReverse,\n autoPlayInterval,\n scrollAnimationDuration,\n withAnimation,\n renderItem,\n onScrollEnd,\n onSnapToItem,\n onScrollBegin,\n onProgressChange,\n customAnimation,\n defaultIndex,\n } = props;\n\n const commonVariables = useCommonVariables(props);\n const { size, handlerOffsetX } = commonVariables;\n const dataLength = data.length;\n\n const offsetX = useDerivedValue(() => {\n const totalSize = size * dataLength;\n const x = handlerOffsetX.value % totalSize;\n\n if (!loop) {\n return handlerOffsetX.value;\n }\n return isNaN(x) ? 0 : x;\n }, [loop, size, dataLength]);\n\n usePropsErrorBoundary(props);\n useOnProgressChange({\n autoFillData,\n loop,\n size,\n offsetX,\n rawData,\n onProgressChange,\n });\n\n const carouselController = useCarouselController({\n loop,\n size,\n handlerOffsetX,\n length: data.length,\n disable: !data.length,\n withAnimation,\n originalLength: data.length,\n defaultIndex,\n onScrollEnd: () => runOnJS(_onScrollEnd)(),\n onScrollBegin: () => !!onScrollBegin && runOnJS(onScrollBegin)(),\n onChange: (i) => !!onSnapToItem && runOnJS(onSnapToItem)(i),\n duration: scrollAnimationDuration,\n });\n\n const {\n next,\n prev,\n sharedPreIndex,\n sharedIndex,\n computedIndex,\n getCurrentIndex,\n } = carouselController;\n\n const { start, pause } = useAutoPlay({\n autoPlay,\n autoPlayInterval,\n autoPlayReverse,\n carouselController,\n });\n\n const _onScrollEnd = React.useCallback(() => {\n computedIndex();\n onScrollEnd?.(sharedPreIndex.current, sharedIndex.current);\n }, [sharedPreIndex, sharedIndex, computedIndex, onScrollEnd]);\n\n const scrollViewGestureOnScrollBegin = React.useCallback(() => {\n pause();\n onScrollBegin?.();\n }, [onScrollBegin, pause]);\n\n const scrollViewGestureOnScrollEnd = React.useCallback(() => {\n start();\n _onScrollEnd();\n }, [_onScrollEnd, start]);\n\n const scrollViewGestureOnTouchBegin = React.useCallback(pause, [pause]);\n\n const scrollViewGestureOnTouchEnd = React.useCallback(start, [start]);\n\n const goToIndex = React.useCallback(\n (i: number, animated?: boolean) => {\n carouselController.to(i, animated);\n },\n [carouselController]\n );\n\n React.useImperativeHandle(\n ref,\n () => ({\n next,\n prev,\n getCurrentIndex,\n goToIndex,\n scrollTo: carouselController.scrollTo,\n }),\n [\n getCurrentIndex,\n goToIndex,\n next,\n prev,\n carouselController.scrollTo,\n ]\n );\n\n const visibleRanges = useVisibleRanges({\n total: data.length,\n viewSize: size,\n translation: handlerOffsetX,\n windowSize,\n });\n\n const layoutConfig = useLayoutConfig({ ...props, size });\n\n const renderLayout = React.useCallback(\n (item: any, i: number) => {\n const realIndex = computedRealIndexWithAutoFillData({\n index: i,\n dataLength: rawData.length,\n loop,\n autoFillData,\n });\n\n return (\n <BaseLayout\n key={i}\n index={i}\n handlerOffsetX={offsetX}\n visibleRanges={visibleRanges}\n animationStyle={customAnimation || layoutConfig}\n >\n {({ animationValue }) =>\n renderItem({\n item,\n index: realIndex,\n animationValue,\n })\n }\n </BaseLayout>\n );\n },\n [\n loop,\n rawData,\n offsetX,\n visibleRanges,\n autoFillData,\n renderItem,\n layoutConfig,\n customAnimation,\n ]\n );\n\n return (\n <CTX.Provider value={{ props, common: commonVariables }}>\n <View\n style={[\n styles.container,\n { width: width || '100%', height: height || '100%' },\n style,\n ]}\n >\n <ScrollViewGesture\n size={size}\n translation={handlerOffsetX}\n onScrollBegin={scrollViewGestureOnScrollBegin}\n onScrollEnd={scrollViewGestureOnScrollEnd}\n onTouchBegin={scrollViewGestureOnTouchBegin}\n onTouchEnd={scrollViewGestureOnTouchEnd}\n >\n <Animated.View\n key={mode}\n style={[\n styles.container,\n {\n width: width || '100%',\n height: height || '100%',\n },\n style,\n vertical\n ? styles.itemsVertical\n : styles.itemsHorizontal,\n ]}\n >\n {data.map(renderLayout)}\n </Animated.View>\n </ScrollViewGesture>\n </View>\n </CTX.Provider>\n );\n }\n);\n\nexport default Carousel as <T extends any>(\n props: React.PropsWithChildren<TCarouselProps<T>>\n) => React.ReactElement;\n\nconst styles = StyleSheet.create({\n container: {\n overflow: 'hidden',\n },\n itemsHorizontal: {\n flexDirection: 'row',\n },\n itemsVertical: {\n flexDirection: 'column',\n },\n});\n"]}
1
+ {"version":3,"sources":["Carousel.tsx"],"names":["React","Animated","runOnJS","runOnUI","useDerivedValue","useCarouselController","useAutoPlay","usePropsErrorBoundary","ScrollViewGesture","useVisibleRanges","StyleSheet","View","BaseLayout","useLayoutConfig","useInitProps","CTX","useCommonVariables","useOnProgressChange","computedRealIndexWithAutoFillData","Carousel","forwardRef","_props","ref","props","testID","data","rawData","loop","autoFillData","mode","style","width","height","vertical","autoPlay","windowSize","autoPlayReverse","autoPlayInterval","scrollAnimationDuration","withAnimation","renderItem","onScrollEnd","onSnapToItem","onScrollBegin","onProgressChange","customAnimation","defaultIndex","commonVariables","size","handlerOffsetX","dataLength","length","offsetX","totalSize","x","value","isNaN","carouselController","_onScrollEnd","duration","sharedIndex","sharedPreIndex","to","next","prev","scrollTo","getCurrentIndex","start","startAutoPlay","pause","pauseAutoPlay","useCallback","_sharedIndex","Math","round","_sharedPreIndex","scrollViewGestureOnScrollBegin","scrollViewGestureOnScrollEnd","scrollViewGestureOnTouchBegin","scrollViewGestureOnTouchEnd","goToIndex","i","animated","useImperativeHandle","visibleRanges","total","viewSize","translation","layoutConfig","renderLayout","item","realIndex","index","animationValue","common","styles","container","itemsVertical","itemsHorizontal","map","create","overflow","flexDirection"],"mappings":"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","sourcesContent":["import React from 'react';\nimport Animated, {\n runOnJS,\n runOnUI,\n useDerivedValue,\n} from 'react-native-reanimated';\n\nimport { useCarouselController } from './hooks/useCarouselController';\nimport { useAutoPlay } from './hooks/useAutoPlay';\nimport { usePropsErrorBoundary } from './hooks/usePropsErrorBoundary';\nimport { ScrollViewGesture } from './ScrollViewGesture';\nimport { useVisibleRanges } from './hooks/useVisibleRanges';\n\nimport type { ICarouselInstance, TCarouselProps } from './types';\nimport { StyleSheet, View } from 'react-native';\nimport { BaseLayout } from './layouts/BaseLayout';\nimport { useLayoutConfig } from './hooks/useLayoutConfig';\nimport { useInitProps } from './hooks/useInitProps';\nimport { CTX } from './store';\nimport { useCommonVariables } from './hooks/useCommonVariables';\nimport { useOnProgressChange } from './hooks/useOnProgressChange';\nimport { computedRealIndexWithAutoFillData } from './utils/computedWithAutoFillData';\n\nconst Carousel = React.forwardRef<ICarouselInstance, TCarouselProps<any>>(\n (_props, ref) => {\n const props = useInitProps(_props);\n\n const {\n testID,\n data,\n rawData,\n loop,\n autoFillData,\n mode,\n style,\n width,\n height,\n vertical,\n autoPlay,\n windowSize,\n autoPlayReverse,\n autoPlayInterval,\n scrollAnimationDuration,\n withAnimation,\n renderItem,\n onScrollEnd,\n onSnapToItem,\n onScrollBegin,\n onProgressChange,\n customAnimation,\n defaultIndex,\n } = props;\n\n const commonVariables = useCommonVariables(props);\n const { size, handlerOffsetX } = commonVariables;\n const dataLength = data.length;\n\n const offsetX = useDerivedValue(() => {\n const totalSize = size * dataLength;\n const x = handlerOffsetX.value % totalSize;\n\n if (!loop) {\n return handlerOffsetX.value;\n }\n return isNaN(x) ? 0 : x;\n }, [loop, size, dataLength]);\n\n usePropsErrorBoundary(props);\n useOnProgressChange({\n autoFillData,\n loop,\n size,\n offsetX,\n rawData,\n onProgressChange,\n });\n\n const carouselController = useCarouselController({\n loop,\n size,\n data,\n autoFillData,\n handlerOffsetX,\n withAnimation,\n defaultIndex,\n onScrollEnd: () => runOnJS(_onScrollEnd)(),\n onScrollBegin: () => !!onScrollBegin && runOnJS(onScrollBegin)(),\n duration: scrollAnimationDuration,\n });\n\n const {\n sharedIndex,\n sharedPreIndex,\n to,\n next,\n prev,\n scrollTo,\n getCurrentIndex,\n } = carouselController;\n\n const { start: startAutoPlay, pause: pauseAutoPlay } = useAutoPlay({\n autoPlay,\n autoPlayInterval,\n autoPlayReverse,\n carouselController,\n });\n\n const _onScrollEnd = React.useCallback(() => {\n 'worklet';\n const _sharedIndex = Math.round(sharedIndex.value);\n const _sharedPreIndex = Math.round(sharedPreIndex.value);\n\n if (onSnapToItem) {\n runOnJS(onSnapToItem)(_sharedIndex);\n }\n if (onScrollEnd) {\n runOnJS(onScrollEnd)(_sharedPreIndex, _sharedIndex);\n }\n }, [onSnapToItem, onScrollEnd, sharedIndex, sharedPreIndex]);\n\n const scrollViewGestureOnScrollBegin = React.useCallback(() => {\n pauseAutoPlay();\n onScrollBegin?.();\n }, [onScrollBegin, pauseAutoPlay]);\n\n const scrollViewGestureOnScrollEnd = React.useCallback(() => {\n startAutoPlay();\n /**\n * TODO magic\n */\n runOnUI(_onScrollEnd)();\n }, [_onScrollEnd, startAutoPlay]);\n\n const scrollViewGestureOnTouchBegin = React.useCallback(pauseAutoPlay, [\n pauseAutoPlay,\n ]);\n\n const scrollViewGestureOnTouchEnd = React.useCallback(startAutoPlay, [\n startAutoPlay,\n ]);\n\n const goToIndex = React.useCallback(\n (i: number, animated?: boolean) => {\n to(i, animated);\n },\n [to]\n );\n\n React.useImperativeHandle(\n ref,\n () => ({\n next,\n prev,\n getCurrentIndex,\n goToIndex,\n scrollTo,\n }),\n [getCurrentIndex, goToIndex, next, prev, scrollTo]\n );\n\n const visibleRanges = useVisibleRanges({\n total: data.length,\n viewSize: size,\n translation: handlerOffsetX,\n windowSize,\n });\n\n const layoutConfig = useLayoutConfig({ ...props, size });\n\n const renderLayout = React.useCallback(\n (item: any, i: number) => {\n const realIndex = computedRealIndexWithAutoFillData({\n index: i,\n dataLength: rawData.length,\n loop,\n autoFillData,\n });\n\n return (\n <BaseLayout\n key={i}\n index={i}\n handlerOffsetX={offsetX}\n visibleRanges={visibleRanges}\n animationStyle={customAnimation || layoutConfig}\n >\n {({ animationValue }) =>\n renderItem({\n item,\n index: realIndex,\n animationValue,\n })\n }\n </BaseLayout>\n );\n },\n [\n loop,\n rawData,\n offsetX,\n visibleRanges,\n autoFillData,\n renderItem,\n layoutConfig,\n customAnimation,\n ]\n );\n\n return (\n <CTX.Provider value={{ props, common: commonVariables }}>\n <View\n style={[\n styles.container,\n { width: width || '100%', height: height || '100%' },\n style,\n ]}\n testID={testID}\n >\n <ScrollViewGesture\n size={size}\n translation={handlerOffsetX}\n onScrollBegin={scrollViewGestureOnScrollBegin}\n onScrollEnd={scrollViewGestureOnScrollEnd}\n onTouchBegin={scrollViewGestureOnTouchBegin}\n onTouchEnd={scrollViewGestureOnTouchEnd}\n >\n <Animated.View\n key={mode}\n style={[\n styles.container,\n {\n width: width || '100%',\n height: height || '100%',\n },\n style,\n vertical\n ? styles.itemsVertical\n : styles.itemsHorizontal,\n ]}\n >\n {data.map(renderLayout)}\n </Animated.View>\n </ScrollViewGesture>\n </View>\n </CTX.Provider>\n );\n }\n);\n\nexport default Carousel as <T extends any>(\n props: React.PropsWithChildren<TCarouselProps<T>>\n) => React.ReactElement;\n\nconst styles = StyleSheet.create({\n container: {\n overflow: 'hidden',\n },\n itemsHorizontal: {\n flexDirection: 'row',\n },\n itemsVertical: {\n flexDirection: 'column',\n },\n});\n"]}
@@ -39,22 +39,20 @@ const IScrollViewGesture = props => {
39
39
  const _withSpring = React.useCallback((toValue, onFinished) => {
40
40
  'worklet';
41
41
 
42
- const callback = isFinished => {
43
- 'worklet';
44
-
45
- if (isFinished) {
46
- onFinished && runOnJS(onFinished)();
47
- }
48
- };
49
-
50
42
  const defaultWithAnimation = {
51
43
  type: 'timing',
52
44
  config: {
53
- duration: scrollAnimationDuration,
45
+ duration: scrollAnimationDuration + 100,
54
46
  easing: Easing.easeOutQuart
55
47
  }
56
48
  };
57
- return dealWithAnimation(withAnimation !== null && withAnimation !== void 0 ? withAnimation : defaultWithAnimation)(toValue, callback);
49
+ return dealWithAnimation(withAnimation !== null && withAnimation !== void 0 ? withAnimation : defaultWithAnimation)(toValue, isFinished => {
50
+ 'worklet';
51
+
52
+ if (isFinished) {
53
+ onFinished && runOnJS(onFinished)();
54
+ }
55
+ });
58
56
  }, [scrollAnimationDuration, withAnimation]);
59
57
 
60
58
  const endWithSpring = React.useCallback(onFinished => {
@@ -1 +1 @@
1
- {"version":3,"sources":["ScrollViewGesture.tsx"],"names":["React","StyleSheet","PanGestureHandler","Animated","cancelAnimation","runOnJS","useAnimatedGestureHandler","useAnimatedReaction","useDerivedValue","useSharedValue","withDecay","Easing","CTX","dealWithAnimation","IScrollViewGesture","props","vertical","data","pagingEnabled","snapEnabled","panGestureHandlerProps","loop","infinite","scrollAnimationDuration","withAnimation","enabled","useContext","translation","size","onScrollBegin","onScrollEnd","onTouchBegin","onTouchEnd","maxPage","length","isHorizontal","touching","scrollEndTranslation","scrollEndVelocity","_withSpring","useCallback","toValue","onFinished","callback","isFinished","defaultWithAnimation","type","config","duration","easing","easeOutQuart","endWithSpring","origin","value","velocity","nextPage","Math","round","deceleration","page","velocityPage","finalPage","min","max","onFinish","activeDecay","resetBoundary","panGestureEventHandler","onStart","_","ctx","validStart","panOffset","onActive","e","translationX","translationY","panTranslation","boundary","fixed","dynamic","onEnd","velocityX","velocityY","directionStyle","useMemo","styles","contentHorizontal","contentVertical","container","width","height","children","ScrollViewGesture","create","flex","overflow","flexDirection"],"mappings":"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","sourcesContent":["import React from 'react';\nimport { StyleProp, StyleSheet, ViewStyle } from 'react-native';\nimport {\n PanGestureHandler,\n PanGestureHandlerGestureEvent,\n} from 'react-native-gesture-handler';\nimport Animated, {\n cancelAnimation,\n runOnJS,\n useAnimatedGestureHandler,\n useAnimatedReaction,\n useDerivedValue,\n useSharedValue,\n withDecay,\n} from 'react-native-reanimated';\nimport { Easing } from './constants';\nimport { CTX } from './store';\nimport type { WithTimingAnimation } from './types';\nimport { dealWithAnimation } from './utils/dealWithAnimation';\n\ntype GestureContext = {\n validStart: boolean;\n panOffset: number;\n max: number;\n};\n\ninterface Props {\n size: number;\n infinite?: boolean;\n onScrollBegin?: () => void;\n onScrollEnd?: () => void;\n onTouchBegin?: () => void;\n onTouchEnd?: () => void;\n style?: StyleProp<ViewStyle>;\n translation: Animated.SharedValue<number>;\n}\n\nconst IScrollViewGesture: React.FC<Props> = (props) => {\n const {\n props: {\n vertical,\n data,\n pagingEnabled,\n snapEnabled,\n panGestureHandlerProps,\n loop: infinite,\n scrollAnimationDuration,\n withAnimation,\n enabled,\n },\n } = React.useContext(CTX);\n\n const {\n translation,\n size,\n onScrollBegin,\n onScrollEnd,\n onTouchBegin,\n onTouchEnd,\n } = props;\n\n const maxPage = data.length;\n const isHorizontal = useDerivedValue(() => !vertical, [vertical]);\n const touching = useSharedValue(false);\n const scrollEndTranslation = useSharedValue(0);\n const scrollEndVelocity = useSharedValue(0);\n\n const _withSpring = React.useCallback(\n (toValue: number, onFinished?: () => void) => {\n 'worklet';\n const callback = (isFinished: boolean) => {\n 'worklet';\n if (isFinished) {\n onFinished && runOnJS(onFinished)();\n }\n };\n\n const defaultWithAnimation: WithTimingAnimation = {\n type: 'timing',\n config: {\n duration: scrollAnimationDuration,\n easing: Easing.easeOutQuart,\n },\n };\n\n return dealWithAnimation(withAnimation ?? defaultWithAnimation)(\n toValue,\n callback\n );\n },\n [scrollAnimationDuration, withAnimation]\n );\n\n const endWithSpring = React.useCallback(\n (onFinished?: () => void) => {\n 'worklet';\n const origin = translation.value;\n const velocity = scrollEndVelocity.value;\n if (!pagingEnabled) {\n if (snapEnabled) {\n const nextPage =\n Math.round((origin + velocity * 0.4) / size) * size;\n translation.value = _withSpring(nextPage, onFinished);\n return;\n }\n translation.value = withDecay({\n velocity,\n deceleration: 0.999,\n });\n return;\n }\n const page = Math.round(-translation.value / size);\n const velocityPage = Math.round(\n -(translation.value + scrollEndVelocity.value) / size\n );\n let finalPage = Math.min(\n page + 1,\n Math.max(page - 1, velocityPage)\n );\n if (!infinite) {\n finalPage = Math.min(maxPage - 1, Math.max(0, finalPage));\n }\n\n translation.value = _withSpring(-finalPage * size, onFinished);\n },\n [\n infinite,\n _withSpring,\n translation,\n scrollEndVelocity,\n size,\n maxPage,\n pagingEnabled,\n snapEnabled,\n ]\n );\n\n const onFinish = React.useCallback(\n (isFinished: boolean) => {\n 'worklet';\n if (isFinished) {\n touching.value = false;\n onScrollEnd && runOnJS(onScrollEnd)();\n }\n },\n [onScrollEnd, touching]\n );\n\n const activeDecay = React.useCallback(() => {\n 'worklet';\n touching.value = true;\n translation.value = withDecay(\n { velocity: scrollEndVelocity.value },\n (isFinished) => onFinish(isFinished as boolean)\n );\n }, [onFinish, scrollEndVelocity.value, touching, translation]);\n\n const resetBoundary = React.useCallback(() => {\n 'worklet';\n if (touching.value) {\n return;\n }\n\n if (translation.value > 0) {\n if (scrollEndTranslation.value < 0) {\n activeDecay();\n return;\n }\n if (!infinite) {\n translation.value = _withSpring(0);\n return;\n }\n }\n\n if (translation.value < -((maxPage - 1) * size)) {\n if (scrollEndTranslation.value > 0) {\n activeDecay();\n return;\n }\n if (!infinite) {\n translation.value = _withSpring(-((maxPage - 1) * size));\n return;\n }\n }\n }, [\n touching.value,\n translation,\n maxPage,\n size,\n scrollEndTranslation.value,\n infinite,\n activeDecay,\n _withSpring,\n ]);\n\n useAnimatedReaction(\n () => translation.value,\n () => {\n if (!pagingEnabled) {\n resetBoundary();\n }\n },\n [pagingEnabled, resetBoundary]\n );\n\n const panGestureEventHandler = useAnimatedGestureHandler<\n PanGestureHandlerGestureEvent,\n GestureContext\n >(\n {\n onStart: (_, ctx) => {\n touching.value = true;\n ctx.validStart = true;\n onScrollBegin && runOnJS(onScrollBegin)();\n ctx.max = (maxPage - 1) * size;\n ctx.panOffset = translation.value;\n },\n onActive: (e, ctx) => {\n if (ctx.validStart) {\n ctx.validStart = false;\n cancelAnimation(translation);\n }\n touching.value = true;\n const { translationX, translationY } = e;\n let panTranslation = isHorizontal.value\n ? translationX\n : translationY;\n\n if (\n !infinite &&\n (translation.value > 0 || translation.value < -ctx.max)\n ) {\n const boundary = translation.value > 0 ? 0 : -ctx.max;\n const fixed = boundary - ctx.panOffset;\n const dynamic = panTranslation - fixed;\n translation.value = boundary + dynamic * 0.5;\n return;\n }\n\n translation.value = ctx.panOffset + panTranslation;\n },\n onEnd: (e) => {\n const { velocityX, velocityY, translationX, translationY } = e;\n scrollEndVelocity.value = isHorizontal.value\n ? velocityX\n : velocityY;\n scrollEndTranslation.value = isHorizontal.value\n ? translationX\n : translationY;\n\n endWithSpring(onScrollEnd);\n\n if (!infinite) {\n touching.value = false;\n }\n },\n },\n [\n pagingEnabled,\n isHorizontal.value,\n infinite,\n maxPage,\n size,\n snapEnabled,\n onScrollBegin,\n onScrollEnd,\n ]\n );\n\n const directionStyle = React.useMemo(() => {\n return vertical ? styles.contentHorizontal : styles.contentVertical;\n }, [vertical]);\n\n return (\n <Animated.View\n style={[\n styles.container,\n directionStyle,\n { width: '100%', height: '100%' },\n ]}\n onTouchStart={onTouchBegin}\n onTouchEnd={onTouchEnd}\n >\n <PanGestureHandler\n {...panGestureHandlerProps}\n enabled={enabled}\n onGestureEvent={panGestureEventHandler}\n >\n {props.children}\n </PanGestureHandler>\n </Animated.View>\n );\n};\n\nexport const ScrollViewGesture = IScrollViewGesture;\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n overflow: 'hidden',\n },\n contentVertical: {\n flexDirection: 'column',\n },\n contentHorizontal: {\n flexDirection: 'row',\n },\n});\n"]}
1
+ {"version":3,"sources":["ScrollViewGesture.tsx"],"names":["React","StyleSheet","PanGestureHandler","Animated","cancelAnimation","runOnJS","useAnimatedGestureHandler","useAnimatedReaction","useDerivedValue","useSharedValue","withDecay","Easing","CTX","dealWithAnimation","IScrollViewGesture","props","vertical","data","pagingEnabled","snapEnabled","panGestureHandlerProps","loop","infinite","scrollAnimationDuration","withAnimation","enabled","useContext","translation","size","onScrollBegin","onScrollEnd","onTouchBegin","onTouchEnd","maxPage","length","isHorizontal","touching","scrollEndTranslation","scrollEndVelocity","_withSpring","useCallback","toValue","onFinished","defaultWithAnimation","type","config","duration","easing","easeOutQuart","isFinished","endWithSpring","origin","value","velocity","nextPage","Math","round","deceleration","page","velocityPage","finalPage","min","max","onFinish","activeDecay","resetBoundary","panGestureEventHandler","onStart","_","ctx","validStart","panOffset","onActive","e","translationX","translationY","panTranslation","boundary","fixed","dynamic","onEnd","velocityX","velocityY","directionStyle","useMemo","styles","contentHorizontal","contentVertical","container","width","height","children","ScrollViewGesture","create","flex","overflow","flexDirection"],"mappings":"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","sourcesContent":["import React from 'react';\nimport { StyleProp, StyleSheet, ViewStyle } from 'react-native';\nimport {\n PanGestureHandler,\n PanGestureHandlerGestureEvent,\n} from 'react-native-gesture-handler';\nimport Animated, {\n cancelAnimation,\n runOnJS,\n useAnimatedGestureHandler,\n useAnimatedReaction,\n useDerivedValue,\n useSharedValue,\n withDecay,\n} from 'react-native-reanimated';\nimport { Easing } from './constants';\nimport { CTX } from './store';\nimport type { WithTimingAnimation } from './types';\nimport { dealWithAnimation } from './utils/dealWithAnimation';\n\ntype GestureContext = {\n validStart: boolean;\n panOffset: number;\n max: number;\n};\n\ninterface Props {\n size: number;\n infinite?: boolean;\n onScrollBegin?: () => void;\n onScrollEnd?: () => void;\n onTouchBegin?: () => void;\n onTouchEnd?: () => void;\n style?: StyleProp<ViewStyle>;\n translation: Animated.SharedValue<number>;\n}\n\nconst IScrollViewGesture: React.FC<Props> = (props) => {\n const {\n props: {\n vertical,\n data,\n pagingEnabled,\n snapEnabled,\n panGestureHandlerProps,\n loop: infinite,\n scrollAnimationDuration,\n withAnimation,\n enabled,\n },\n } = React.useContext(CTX);\n\n const {\n translation,\n size,\n onScrollBegin,\n onScrollEnd,\n onTouchBegin,\n onTouchEnd,\n } = props;\n\n const maxPage = data.length;\n const isHorizontal = useDerivedValue(() => !vertical, [vertical]);\n const touching = useSharedValue(false);\n const scrollEndTranslation = useSharedValue(0);\n const scrollEndVelocity = useSharedValue(0);\n\n const _withSpring = React.useCallback(\n (toValue: number, onFinished?: () => void) => {\n 'worklet';\n const defaultWithAnimation: WithTimingAnimation = {\n type: 'timing',\n config: {\n duration: scrollAnimationDuration + 100,\n easing: Easing.easeOutQuart,\n },\n };\n\n return dealWithAnimation(withAnimation ?? defaultWithAnimation)(\n toValue,\n (isFinished: boolean) => {\n 'worklet';\n if (isFinished) {\n onFinished && runOnJS(onFinished)();\n }\n }\n );\n },\n [scrollAnimationDuration, withAnimation]\n );\n\n const endWithSpring = React.useCallback(\n (onFinished?: () => void) => {\n 'worklet';\n const origin = translation.value;\n const velocity = scrollEndVelocity.value;\n if (!pagingEnabled) {\n if (snapEnabled) {\n const nextPage =\n Math.round((origin + velocity * 0.4) / size) * size;\n translation.value = _withSpring(nextPage, onFinished);\n return;\n }\n translation.value = withDecay({\n velocity,\n deceleration: 0.999,\n });\n return;\n }\n const page = Math.round(-translation.value / size);\n const velocityPage = Math.round(\n -(translation.value + scrollEndVelocity.value) / size\n );\n let finalPage = Math.min(\n page + 1,\n Math.max(page - 1, velocityPage)\n );\n if (!infinite) {\n finalPage = Math.min(maxPage - 1, Math.max(0, finalPage));\n }\n\n translation.value = _withSpring(-finalPage * size, onFinished);\n },\n [\n infinite,\n _withSpring,\n translation,\n scrollEndVelocity,\n size,\n maxPage,\n pagingEnabled,\n snapEnabled,\n ]\n );\n\n const onFinish = React.useCallback(\n (isFinished: boolean) => {\n 'worklet';\n if (isFinished) {\n touching.value = false;\n onScrollEnd && runOnJS(onScrollEnd)();\n }\n },\n [onScrollEnd, touching]\n );\n\n const activeDecay = React.useCallback(() => {\n 'worklet';\n touching.value = true;\n translation.value = withDecay(\n { velocity: scrollEndVelocity.value },\n (isFinished) => onFinish(isFinished as boolean)\n );\n }, [onFinish, scrollEndVelocity.value, touching, translation]);\n\n const resetBoundary = React.useCallback(() => {\n 'worklet';\n if (touching.value) {\n return;\n }\n\n if (translation.value > 0) {\n if (scrollEndTranslation.value < 0) {\n activeDecay();\n return;\n }\n if (!infinite) {\n translation.value = _withSpring(0);\n return;\n }\n }\n\n if (translation.value < -((maxPage - 1) * size)) {\n if (scrollEndTranslation.value > 0) {\n activeDecay();\n return;\n }\n if (!infinite) {\n translation.value = _withSpring(-((maxPage - 1) * size));\n return;\n }\n }\n }, [\n touching.value,\n translation,\n maxPage,\n size,\n scrollEndTranslation.value,\n infinite,\n activeDecay,\n _withSpring,\n ]);\n\n useAnimatedReaction(\n () => translation.value,\n () => {\n if (!pagingEnabled) {\n resetBoundary();\n }\n },\n [pagingEnabled, resetBoundary]\n );\n\n const panGestureEventHandler = useAnimatedGestureHandler<\n PanGestureHandlerGestureEvent,\n GestureContext\n >(\n {\n onStart: (_, ctx) => {\n touching.value = true;\n ctx.validStart = true;\n onScrollBegin && runOnJS(onScrollBegin)();\n ctx.max = (maxPage - 1) * size;\n ctx.panOffset = translation.value;\n },\n onActive: (e, ctx) => {\n if (ctx.validStart) {\n ctx.validStart = false;\n cancelAnimation(translation);\n }\n touching.value = true;\n const { translationX, translationY } = e;\n let panTranslation = isHorizontal.value\n ? translationX\n : translationY;\n\n if (\n !infinite &&\n (translation.value > 0 || translation.value < -ctx.max)\n ) {\n const boundary = translation.value > 0 ? 0 : -ctx.max;\n const fixed = boundary - ctx.panOffset;\n const dynamic = panTranslation - fixed;\n translation.value = boundary + dynamic * 0.5;\n return;\n }\n\n translation.value = ctx.panOffset + panTranslation;\n },\n onEnd: (e) => {\n const { velocityX, velocityY, translationX, translationY } = e;\n scrollEndVelocity.value = isHorizontal.value\n ? velocityX\n : velocityY;\n scrollEndTranslation.value = isHorizontal.value\n ? translationX\n : translationY;\n\n endWithSpring(onScrollEnd);\n\n if (!infinite) {\n touching.value = false;\n }\n },\n },\n [\n pagingEnabled,\n isHorizontal.value,\n infinite,\n maxPage,\n size,\n snapEnabled,\n onScrollBegin,\n onScrollEnd,\n ]\n );\n\n const directionStyle = React.useMemo(() => {\n return vertical ? styles.contentHorizontal : styles.contentVertical;\n }, [vertical]);\n\n return (\n <Animated.View\n style={[\n styles.container,\n directionStyle,\n { width: '100%', height: '100%' },\n ]}\n onTouchStart={onTouchBegin}\n onTouchEnd={onTouchEnd}\n >\n <PanGestureHandler\n {...panGestureHandlerProps}\n enabled={enabled}\n onGestureEvent={panGestureEventHandler}\n >\n {props.children}\n </PanGestureHandler>\n </Animated.View>\n );\n};\n\nexport const ScrollViewGesture = IScrollViewGesture;\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n overflow: 'hidden',\n },\n contentVertical: {\n flexDirection: 'column',\n },\n contentHorizontal: {\n flexDirection: 'row',\n },\n});\n"]}
@@ -6,6 +6,10 @@ export function useAutoPlay(opts) {
6
6
  autoPlayInterval,
7
7
  carouselController
8
8
  } = opts;
9
+ const {
10
+ prev,
11
+ next
12
+ } = carouselController;
9
13
  const timer = React.useRef();
10
14
  const stopped = React.useRef(!autoPlay);
11
15
  const play = React.useCallback(() => {
@@ -15,13 +19,13 @@ export function useAutoPlay(opts) {
15
19
 
16
20
  timer.current && clearTimeout(timer.current);
17
21
  timer.current = setTimeout(() => {
18
- autoPlayReverse ? carouselController.prev({
22
+ autoPlayReverse ? prev({
19
23
  onFinished: play
20
- }) : carouselController.next({
24
+ }) : next({
21
25
  onFinished: play
22
26
  });
23
27
  }, autoPlayInterval);
24
- }, [autoPlayReverse, autoPlayInterval, carouselController]);
28
+ }, [autoPlayReverse, autoPlayInterval, prev, next]);
25
29
  const pause = React.useCallback(() => {
26
30
  if (!autoPlay) {
27
31
  return;
@@ -1 +1 @@
1
- {"version":3,"sources":["useAutoPlay.ts"],"names":["React","useAutoPlay","opts","autoPlay","autoPlayReverse","autoPlayInterval","carouselController","timer","useRef","stopped","play","useCallback","current","clearTimeout","setTimeout","prev","onFinished","next","pause","start","useEffect"],"mappings":"AAAA,OAAO,KAAKA,KAAZ,MAAuB,OAAvB;AAGA,OAAO,SAASC,WAAT,CAAqBC,IAArB,EAKJ;AACC,QAAM;AACFC,IAAAA,QAAQ,GAAG,KADT;AAEFC,IAAAA,eAAe,GAAG,KAFhB;AAGFC,IAAAA,gBAHE;AAIFC,IAAAA;AAJE,MAKFJ,IALJ;AAOA,QAAMK,KAAK,GAAGP,KAAK,CAACQ,MAAN,EAAd;AACA,QAAMC,OAAO,GAAGT,KAAK,CAACQ,MAAN,CAAsB,CAACL,QAAvB,CAAhB;AAEA,QAAMO,IAAI,GAAGV,KAAK,CAACW,WAAN,CAAkB,MAAM;AACjC,QAAIF,OAAO,CAACG,OAAZ,EAAqB;AACjB;AACH;;AAEDL,IAAAA,KAAK,CAACK,OAAN,IAAiBC,YAAY,CAACN,KAAK,CAACK,OAAP,CAA7B;AACAL,IAAAA,KAAK,CAACK,OAAN,GAAgBE,UAAU,CAAC,MAAM;AAC7BV,MAAAA,eAAe,GACTE,kBAAkB,CAACS,IAAnB,CAAwB;AAAEC,QAAAA,UAAU,EAAEN;AAAd,OAAxB,CADS,GAETJ,kBAAkB,CAACW,IAAnB,CAAwB;AAAED,QAAAA,UAAU,EAAEN;AAAd,OAAxB,CAFN;AAGH,KAJyB,EAIvBL,gBAJuB,CAA1B;AAKH,GAXY,EAWV,CAACD,eAAD,EAAkBC,gBAAlB,EAAoCC,kBAApC,CAXU,CAAb;AAaA,QAAMY,KAAK,GAAGlB,KAAK,CAACW,WAAN,CAAkB,MAAM;AAClC,QAAI,CAACR,QAAL,EAAe;AACX;AACH;;AACDI,IAAAA,KAAK,CAACK,OAAN,IAAiBC,YAAY,CAACN,KAAK,CAACK,OAAP,CAA7B;AACAH,IAAAA,OAAO,CAACG,OAAR,GAAkB,IAAlB;AACH,GANa,EAMX,CAACT,QAAD,CANW,CAAd;AAQA,QAAMgB,KAAK,GAAGnB,KAAK,CAACW,WAAN,CAAkB,MAAM;AAClC,QAAI,CAACR,QAAL,EAAe;AACX;AACH;;AACDM,IAAAA,OAAO,CAACG,OAAR,GAAkB,KAAlB;AACAF,IAAAA,IAAI;AACP,GANa,EAMX,CAACA,IAAD,EAAOP,QAAP,CANW,CAAd;AAQAH,EAAAA,KAAK,CAACoB,SAAN,CAAgB,MAAM;AAClB,QAAIjB,QAAJ,EAAc;AACVgB,MAAAA,KAAK;AACR,KAFD,MAEO;AACHD,MAAAA,KAAK;AACR;;AACD,WAAOA,KAAP;AACH,GAPD,EAOG,CAACA,KAAD,EAAQC,KAAR,EAAehB,QAAf,CAPH;AASA,SAAO;AACHe,IAAAA,KADG;AAEHC,IAAAA;AAFG,GAAP;AAIH","sourcesContent":["import * as React from 'react';\nimport type { ICarouselController } from './useCarouselController';\n\nexport function useAutoPlay(opts: {\n autoPlay?: boolean;\n autoPlayInterval?: number;\n autoPlayReverse?: boolean;\n carouselController: ICarouselController;\n}) {\n const {\n autoPlay = false,\n autoPlayReverse = false,\n autoPlayInterval,\n carouselController,\n } = opts;\n\n const timer = React.useRef<NodeJS.Timer>();\n const stopped = React.useRef<boolean>(!autoPlay);\n\n const play = React.useCallback(() => {\n if (stopped.current) {\n return;\n }\n\n timer.current && clearTimeout(timer.current);\n timer.current = setTimeout(() => {\n autoPlayReverse\n ? carouselController.prev({ onFinished: play })\n : carouselController.next({ onFinished: play });\n }, autoPlayInterval);\n }, [autoPlayReverse, autoPlayInterval, carouselController]);\n\n const pause = React.useCallback(() => {\n if (!autoPlay) {\n return;\n }\n timer.current && clearTimeout(timer.current);\n stopped.current = true;\n }, [autoPlay]);\n\n const start = React.useCallback(() => {\n if (!autoPlay) {\n return;\n }\n stopped.current = false;\n play();\n }, [play, autoPlay]);\n\n React.useEffect(() => {\n if (autoPlay) {\n start();\n } else {\n pause();\n }\n return pause;\n }, [pause, start, autoPlay]);\n\n return {\n pause,\n start,\n };\n}\n"]}
1
+ {"version":3,"sources":["useAutoPlay.ts"],"names":["React","useAutoPlay","opts","autoPlay","autoPlayReverse","autoPlayInterval","carouselController","prev","next","timer","useRef","stopped","play","useCallback","current","clearTimeout","setTimeout","onFinished","pause","start","useEffect"],"mappings":"AAAA,OAAO,KAAKA,KAAZ,MAAuB,OAAvB;AAGA,OAAO,SAASC,WAAT,CAAqBC,IAArB,EAKJ;AACC,QAAM;AACFC,IAAAA,QAAQ,GAAG,KADT;AAEFC,IAAAA,eAAe,GAAG,KAFhB;AAGFC,IAAAA,gBAHE;AAIFC,IAAAA;AAJE,MAKFJ,IALJ;AAOA,QAAM;AAAEK,IAAAA,IAAF;AAAQC,IAAAA;AAAR,MAAiBF,kBAAvB;AACA,QAAMG,KAAK,GAAGT,KAAK,CAACU,MAAN,EAAd;AACA,QAAMC,OAAO,GAAGX,KAAK,CAACU,MAAN,CAAsB,CAACP,QAAvB,CAAhB;AAEA,QAAMS,IAAI,GAAGZ,KAAK,CAACa,WAAN,CAAkB,MAAM;AACjC,QAAIF,OAAO,CAACG,OAAZ,EAAqB;AACjB;AACH;;AAEDL,IAAAA,KAAK,CAACK,OAAN,IAAiBC,YAAY,CAACN,KAAK,CAACK,OAAP,CAA7B;AACAL,IAAAA,KAAK,CAACK,OAAN,GAAgBE,UAAU,CAAC,MAAM;AAC7BZ,MAAAA,eAAe,GACTG,IAAI,CAAC;AAAEU,QAAAA,UAAU,EAAEL;AAAd,OAAD,CADK,GAETJ,IAAI,CAAC;AAAES,QAAAA,UAAU,EAAEL;AAAd,OAAD,CAFV;AAGH,KAJyB,EAIvBP,gBAJuB,CAA1B;AAKH,GAXY,EAWV,CAACD,eAAD,EAAkBC,gBAAlB,EAAoCE,IAApC,EAA0CC,IAA1C,CAXU,CAAb;AAaA,QAAMU,KAAK,GAAGlB,KAAK,CAACa,WAAN,CAAkB,MAAM;AAClC,QAAI,CAACV,QAAL,EAAe;AACX;AACH;;AACDM,IAAAA,KAAK,CAACK,OAAN,IAAiBC,YAAY,CAACN,KAAK,CAACK,OAAP,CAA7B;AACAH,IAAAA,OAAO,CAACG,OAAR,GAAkB,IAAlB;AACH,GANa,EAMX,CAACX,QAAD,CANW,CAAd;AAQA,QAAMgB,KAAK,GAAGnB,KAAK,CAACa,WAAN,CAAkB,MAAM;AAClC,QAAI,CAACV,QAAL,EAAe;AACX;AACH;;AACDQ,IAAAA,OAAO,CAACG,OAAR,GAAkB,KAAlB;AACAF,IAAAA,IAAI;AACP,GANa,EAMX,CAACA,IAAD,EAAOT,QAAP,CANW,CAAd;AAQAH,EAAAA,KAAK,CAACoB,SAAN,CAAgB,MAAM;AAClB,QAAIjB,QAAJ,EAAc;AACVgB,MAAAA,KAAK;AACR,KAFD,MAEO;AACHD,MAAAA,KAAK;AACR;;AACD,WAAOA,KAAP;AACH,GAPD,EAOG,CAACA,KAAD,EAAQC,KAAR,EAAehB,QAAf,CAPH;AASA,SAAO;AACHe,IAAAA,KADG;AAEHC,IAAAA;AAFG,GAAP;AAIH","sourcesContent":["import * as React from 'react';\nimport type { ICarouselController } from './useCarouselController';\n\nexport function useAutoPlay(opts: {\n autoPlay?: boolean;\n autoPlayInterval?: number;\n autoPlayReverse?: boolean;\n carouselController: ICarouselController;\n}) {\n const {\n autoPlay = false,\n autoPlayReverse = false,\n autoPlayInterval,\n carouselController,\n } = opts;\n\n const { prev, next } = carouselController;\n const timer = React.useRef<NodeJS.Timer>();\n const stopped = React.useRef<boolean>(!autoPlay);\n\n const play = React.useCallback(() => {\n if (stopped.current) {\n return;\n }\n\n timer.current && clearTimeout(timer.current);\n timer.current = setTimeout(() => {\n autoPlayReverse\n ? prev({ onFinished: play })\n : next({ onFinished: play });\n }, autoPlayInterval);\n }, [autoPlayReverse, autoPlayInterval, prev, next]);\n\n const pause = React.useCallback(() => {\n if (!autoPlay) {\n return;\n }\n timer.current && clearTimeout(timer.current);\n stopped.current = true;\n }, [autoPlay]);\n\n const start = React.useCallback(() => {\n if (!autoPlay) {\n return;\n }\n stopped.current = false;\n play();\n }, [play, autoPlay]);\n\n React.useEffect(() => {\n if (autoPlay) {\n start();\n } else {\n pause();\n }\n return pause;\n }, [pause, start, autoPlay]);\n\n return {\n pause,\n start,\n };\n}\n"]}
@@ -1,62 +1,58 @@
1
1
  import React from 'react';
2
2
  import { Easing } from '../constants';
3
- import { runOnJS, useSharedValue } from 'react-native-reanimated';
3
+ import { runOnJS, useAnimatedReaction, useSharedValue } from 'react-native-reanimated';
4
4
  import { dealWithAnimation } from '@/utils/dealWithAnimation';
5
+ import { convertToSharedIndex } from '@/utils/computedWithAutoFillData';
5
6
  export function useCarouselController(options) {
6
7
  const {
7
8
  size,
9
+ data,
8
10
  loop,
9
11
  handlerOffsetX,
10
12
  withAnimation,
11
- disable = false,
12
- originalLength,
13
- length,
14
- onChange,
13
+ defaultIndex = 0,
15
14
  duration,
16
- defaultIndex = 0
15
+ autoFillData
17
16
  } = options;
17
+ const dataInfo = React.useMemo(() => ({
18
+ length: data.length,
19
+ disable: !data.length,
20
+ originalLength: data.length
21
+ }), [data]);
18
22
  const index = useSharedValue(defaultIndex); // The Index displayed to the user
19
23
 
20
- const sharedIndex = React.useRef(defaultIndex);
21
- const sharedPreIndex = React.useRef(defaultIndex);
24
+ const sharedIndex = useSharedValue(defaultIndex);
25
+ const sharedPreIndex = useSharedValue(defaultIndex);
22
26
  const currentFixedPage = React.useCallback(() => {
23
27
  if (loop) {
24
28
  return -Math.round(handlerOffsetX.value / size);
25
29
  }
26
30
 
27
- const fixed = handlerOffsetX.value / size % length;
28
- return Math.round(handlerOffsetX.value <= 0 ? Math.abs(fixed) : Math.abs(fixed > 0 ? length - fixed : 0));
29
- }, [handlerOffsetX, length, size, loop]);
30
- const convertToSharedIndex = React.useCallback(i => {
31
- if (loop) {
32
- switch (originalLength) {
33
- case 1:
34
- return 0;
35
-
36
- case 2:
37
- return i % 2;
38
- }
39
- }
31
+ const fixed = handlerOffsetX.value / size % dataInfo.length;
32
+ return Math.round(handlerOffsetX.value <= 0 ? Math.abs(fixed) : Math.abs(fixed > 0 ? dataInfo.length - fixed : 0));
33
+ }, [handlerOffsetX, dataInfo, size, loop]);
34
+ const computedIndex = React.useCallback(handlerOffsetXValue => {
35
+ 'worklet';
40
36
 
41
- return i;
42
- }, [originalLength, loop]);
43
- const computedIndex = React.useCallback(() => {
44
- sharedPreIndex.current = sharedIndex.current;
45
- const toInt = handlerOffsetX.value / size % length;
46
- const i = handlerOffsetX.value <= 0 ? Math.abs(toInt) : Math.abs(toInt > 0 ? length - toInt : 0);
37
+ sharedPreIndex.value = sharedIndex.value;
38
+ const toInt = handlerOffsetXValue / size % dataInfo.length;
39
+ const isPositive = handlerOffsetXValue <= 0;
40
+ const i = isPositive ? Math.abs(toInt) : Math.abs(toInt > 0 ? dataInfo.length - toInt : 0);
47
41
  index.value = i;
48
-
49
- const _sharedIndex = convertToSharedIndex(i);
50
-
51
- sharedIndex.current = _sharedIndex;
52
- onChange(_sharedIndex);
53
- }, [length, handlerOffsetX, sharedPreIndex, index, size, sharedIndex, convertToSharedIndex, onChange]);
42
+ sharedIndex.value = convertToSharedIndex({
43
+ loop,
44
+ rawDataLength: dataInfo.originalLength,
45
+ autoFillData: autoFillData,
46
+ index: i
47
+ });
48
+ }, [sharedPreIndex, sharedIndex, size, dataInfo, index, loop, autoFillData]);
49
+ useAnimatedReaction(() => handlerOffsetX.value, computedIndex, [handlerOffsetX]);
54
50
  const getCurrentIndex = React.useCallback(() => {
55
51
  return index.value;
56
52
  }, [index]);
57
53
  const canSliding = React.useCallback(() => {
58
- return !disable;
59
- }, [disable]);
54
+ return !dataInfo.disable;
55
+ }, [dataInfo]);
60
56
  const onScrollEnd = React.useCallback(() => {
61
57
  var _options$onScrollEnd;
62
58
 
@@ -97,7 +93,7 @@ export function useCarouselController(options) {
97
93
  animated = true,
98
94
  onFinished
99
95
  } = opts;
100
- if (!canSliding() || !loop && index.value >= length - 1) return;
96
+ if (!canSliding() || !loop && index.value >= dataInfo.length - 1) return;
101
97
  onScrollBegin === null || onScrollBegin === void 0 ? void 0 : onScrollBegin();
102
98
  const nextPage = currentFixedPage() + count;
103
99
  index.value = nextPage;
@@ -108,7 +104,7 @@ export function useCarouselController(options) {
108
104
  handlerOffsetX.value = -nextPage * size;
109
105
  onFinished === null || onFinished === void 0 ? void 0 : onFinished();
110
106
  }
111
- }, [canSliding, loop, index, length, onScrollBegin, handlerOffsetX, size, scrollWithTiming, currentFixedPage]);
107
+ }, [canSliding, loop, index, dataInfo, onScrollBegin, handlerOffsetX, size, scrollWithTiming, currentFixedPage]);
112
108
  const prev = React.useCallback(function () {
113
109
  let opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
114
110
  const {
@@ -173,15 +169,12 @@ export function useCarouselController(options) {
173
169
  }
174
170
  }, [prev, next]);
175
171
  return {
172
+ sharedIndex,
173
+ sharedPreIndex,
174
+ to,
176
175
  next,
177
176
  prev,
178
- to,
179
177
  scrollTo,
180
- index,
181
- length,
182
- sharedIndex,
183
- sharedPreIndex,
184
- computedIndex,
185
178
  getCurrentIndex
186
179
  };
187
180
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["useCarouselController.tsx"],"names":["React","Easing","runOnJS","useSharedValue","dealWithAnimation","useCarouselController","options","size","loop","handlerOffsetX","withAnimation","disable","originalLength","length","onChange","duration","defaultIndex","index","sharedIndex","useRef","sharedPreIndex","currentFixedPage","useCallback","Math","round","value","fixed","abs","convertToSharedIndex","i","computedIndex","current","toInt","_sharedIndex","getCurrentIndex","canSliding","onScrollEnd","onScrollBegin","scrollWithTiming","toValue","onFinished","callback","isFinished","defaultWithAnimation","type","config","easing","easeOutQuart","next","opts","count","animated","nextPage","prev","prevPage","to","idx","offset","scrollTo","n"],"mappings":"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","sourcesContent":["import React from 'react';\nimport type Animated from 'react-native-reanimated';\nimport { Easing } from '../constants';\nimport { runOnJS, useSharedValue } from 'react-native-reanimated';\nimport type {\n TCarouselActionOptions,\n TCarouselProps,\n WithTimingAnimation,\n} from '../types';\nimport { dealWithAnimation } from '@/utils/dealWithAnimation';\n\ninterface IOpts {\n loop: boolean;\n size: number;\n handlerOffsetX: Animated.SharedValue<number>;\n withAnimation?: TCarouselProps['withAnimation'];\n disable?: boolean;\n duration?: number;\n originalLength: number;\n length: number;\n defaultIndex?: number;\n onScrollBegin?: () => void;\n onScrollEnd?: () => void;\n // the length before fill data\n onChange: (index: number) => void;\n}\n\nexport interface ICarouselController {\n length: number;\n index: Animated.SharedValue<number>;\n sharedIndex: React.MutableRefObject<number>;\n sharedPreIndex: React.MutableRefObject<number>;\n prev: (opts?: TCarouselActionOptions) => void;\n next: (opts?: TCarouselActionOptions) => void;\n computedIndex: () => void;\n getCurrentIndex: () => number;\n to: (index: number, animated?: boolean) => void;\n scrollTo: (opts?: TCarouselActionOptions) => void;\n}\n\nexport function useCarouselController(options: IOpts): ICarouselController {\n const {\n size,\n loop,\n handlerOffsetX,\n withAnimation,\n disable = false,\n originalLength,\n length,\n onChange,\n duration,\n defaultIndex = 0,\n } = options;\n\n const index = useSharedValue<number>(defaultIndex);\n // The Index displayed to the user\n const sharedIndex = React.useRef<number>(defaultIndex);\n const sharedPreIndex = React.useRef<number>(defaultIndex);\n\n const currentFixedPage = React.useCallback(() => {\n if (loop) {\n return -Math.round(handlerOffsetX.value / size);\n }\n\n const fixed = (handlerOffsetX.value / size) % length;\n return Math.round(\n handlerOffsetX.value <= 0\n ? Math.abs(fixed)\n : Math.abs(fixed > 0 ? length - fixed : 0)\n );\n }, [handlerOffsetX, length, size, loop]);\n\n const convertToSharedIndex = React.useCallback(\n (i: number) => {\n if (loop) {\n switch (originalLength) {\n case 1:\n return 0;\n case 2:\n return i % 2;\n }\n }\n return i;\n },\n [originalLength, loop]\n );\n\n const computedIndex = React.useCallback(() => {\n sharedPreIndex.current = sharedIndex.current;\n const toInt = (handlerOffsetX.value / size) % length;\n const i =\n handlerOffsetX.value <= 0\n ? Math.abs(toInt)\n : Math.abs(toInt > 0 ? length - toInt : 0);\n index.value = i;\n const _sharedIndex = convertToSharedIndex(i);\n sharedIndex.current = _sharedIndex;\n onChange(_sharedIndex);\n }, [\n length,\n handlerOffsetX,\n sharedPreIndex,\n index,\n size,\n sharedIndex,\n convertToSharedIndex,\n onChange,\n ]);\n\n const getCurrentIndex = React.useCallback(() => {\n return index.value;\n }, [index]);\n\n const canSliding = React.useCallback(() => {\n return !disable;\n }, [disable]);\n\n const onScrollEnd = React.useCallback(() => {\n options.onScrollEnd?.();\n }, [options]);\n\n const onScrollBegin = React.useCallback(() => {\n options.onScrollBegin?.();\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)(\n toValue,\n callback\n );\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() || (!loop && index.value >= length - 1)) return;\n\n onScrollBegin?.();\n\n const nextPage = currentFixedPage() + count;\n index.value = nextPage;\n\n if (animated) {\n handlerOffsetX.value = scrollWithTiming(\n -nextPage * size,\n onFinished\n ) as any;\n } else {\n handlerOffsetX.value = -nextPage * size;\n onFinished?.();\n }\n },\n [\n canSliding,\n loop,\n index,\n length,\n onScrollBegin,\n handlerOffsetX,\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() || (!loop && index.value <= 0)) return;\n\n onScrollBegin?.();\n\n const prevPage = currentFixedPage() - count;\n index.value = prevPage;\n\n if (animated) {\n handlerOffsetX.value = scrollWithTiming(\n -prevPage * size,\n onFinished\n );\n } else {\n handlerOffsetX.value = -prevPage * size;\n onFinished?.();\n }\n },\n [\n canSliding,\n loop,\n index,\n onScrollBegin,\n handlerOffsetX,\n size,\n scrollWithTiming,\n currentFixedPage,\n ]\n );\n\n const to = React.useCallback(\n (idx: number, animated: boolean = false) => {\n if (idx === index.value) return;\n if (!canSliding()) return;\n\n onScrollBegin?.();\n\n const offset = handlerOffsetX.value + (index.value - idx) * size;\n\n if (animated) {\n index.value = idx;\n handlerOffsetX.value = scrollWithTiming(offset);\n } else {\n handlerOffsetX.value = offset;\n index.value = idx;\n runOnJS(onScrollEnd)();\n }\n },\n [\n index,\n canSliding,\n onScrollBegin,\n handlerOffsetX,\n size,\n scrollWithTiming,\n onScrollEnd,\n ]\n );\n\n const scrollTo = React.useCallback(\n (opts: TCarouselActionOptions = {}) => {\n const { count, animated = false, onFinished } = opts;\n if (!count) {\n return;\n }\n const n = Math.round(count);\n if (n < 0) {\n prev({ count: Math.abs(n), animated, onFinished });\n } else {\n next({ count: n, animated, onFinished });\n }\n },\n [prev, next]\n );\n\n return {\n next,\n prev,\n to,\n scrollTo,\n index,\n length,\n sharedIndex,\n sharedPreIndex,\n computedIndex,\n getCurrentIndex,\n };\n}\n"]}
1
+ {"version":3,"sources":["useCarouselController.tsx"],"names":["React","Easing","runOnJS","useAnimatedReaction","useSharedValue","dealWithAnimation","convertToSharedIndex","useCarouselController","options","size","data","loop","handlerOffsetX","withAnimation","defaultIndex","duration","autoFillData","dataInfo","useMemo","length","disable","originalLength","index","sharedIndex","sharedPreIndex","currentFixedPage","useCallback","Math","round","value","fixed","abs","computedIndex","handlerOffsetXValue","toInt","isPositive","i","rawDataLength","getCurrentIndex","canSliding","onScrollEnd","onScrollBegin","scrollWithTiming","toValue","onFinished","callback","isFinished","defaultWithAnimation","type","config","easing","easeOutQuart","next","opts","count","animated","nextPage","prev","prevPage","to","idx","offset","scrollTo","n"],"mappings":"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","sourcesContent":["import React from 'react';\nimport type Animated from 'react-native-reanimated';\nimport { Easing } from '../constants';\nimport {\n runOnJS,\n useAnimatedReaction,\n useSharedValue,\n} from 'react-native-reanimated';\nimport type {\n TCarouselActionOptions,\n TCarouselProps,\n WithTimingAnimation,\n} from '../types';\nimport { dealWithAnimation } from '@/utils/dealWithAnimation';\nimport { convertToSharedIndex } from '@/utils/computedWithAutoFillData';\n\ninterface IOpts {\n loop: boolean;\n size: number;\n data: TCarouselProps['data'];\n autoFillData: TCarouselProps['autoFillData'];\n handlerOffsetX: Animated.SharedValue<number>;\n withAnimation?: TCarouselProps['withAnimation'];\n duration?: number;\n defaultIndex?: number;\n onScrollBegin?: () => void;\n onScrollEnd?: () => void;\n}\n\nexport interface ICarouselController {\n sharedIndex: Animated.SharedValue<number>;\n sharedPreIndex: Animated.SharedValue<number>;\n prev: (opts?: TCarouselActionOptions) => void;\n next: (opts?: TCarouselActionOptions) => void;\n getCurrentIndex: () => number;\n to: (index: number, animated?: boolean) => void;\n scrollTo: (opts?: TCarouselActionOptions) => void;\n}\n\nexport function useCarouselController(options: IOpts): ICarouselController {\n const {\n size,\n data,\n loop,\n handlerOffsetX,\n withAnimation,\n defaultIndex = 0,\n duration,\n autoFillData,\n } = options;\n\n const dataInfo = React.useMemo(\n () => ({\n length: data.length,\n disable: !data.length,\n originalLength: data.length,\n }),\n [data]\n );\n\n const index = useSharedValue<number>(defaultIndex);\n // The Index displayed to the user\n const sharedIndex = useSharedValue<number>(defaultIndex);\n const sharedPreIndex = useSharedValue<number>(defaultIndex);\n\n const currentFixedPage = React.useCallback(() => {\n if (loop) {\n return -Math.round(handlerOffsetX.value / size);\n }\n\n const fixed = (handlerOffsetX.value / size) % dataInfo.length;\n return Math.round(\n handlerOffsetX.value <= 0\n ? Math.abs(fixed)\n : Math.abs(fixed > 0 ? dataInfo.length - fixed : 0)\n );\n }, [handlerOffsetX, dataInfo, size, loop]);\n\n const computedIndex = React.useCallback(\n (handlerOffsetXValue: number) => {\n 'worklet';\n sharedPreIndex.value = sharedIndex.value;\n const toInt = (handlerOffsetXValue / size) % dataInfo.length;\n const isPositive = handlerOffsetXValue <= 0;\n const i = isPositive\n ? Math.abs(toInt)\n : Math.abs(toInt > 0 ? dataInfo.length - toInt : 0);\n index.value = i;\n sharedIndex.value = convertToSharedIndex({\n loop,\n rawDataLength: dataInfo.originalLength,\n autoFillData: autoFillData!,\n index: i,\n });\n },\n [sharedPreIndex, sharedIndex, size, dataInfo, index, loop, autoFillData]\n );\n\n useAnimatedReaction(() => handlerOffsetX.value, computedIndex, [\n handlerOffsetX,\n ]);\n\n const getCurrentIndex = React.useCallback(() => {\n return index.value;\n }, [index]);\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 onScrollBegin = React.useCallback(() => {\n options.onScrollBegin?.();\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)(\n toValue,\n callback\n );\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() || (!loop && index.value >= dataInfo.length - 1))\n return;\n\n onScrollBegin?.();\n\n const nextPage = currentFixedPage() + count;\n index.value = nextPage;\n\n if (animated) {\n handlerOffsetX.value = scrollWithTiming(\n -nextPage * size,\n onFinished\n ) as any;\n } else {\n handlerOffsetX.value = -nextPage * size;\n onFinished?.();\n }\n },\n [\n canSliding,\n loop,\n index,\n dataInfo,\n onScrollBegin,\n handlerOffsetX,\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() || (!loop && index.value <= 0)) return;\n\n onScrollBegin?.();\n\n const prevPage = currentFixedPage() - count;\n index.value = prevPage;\n\n if (animated) {\n handlerOffsetX.value = scrollWithTiming(\n -prevPage * size,\n onFinished\n );\n } else {\n handlerOffsetX.value = -prevPage * size;\n onFinished?.();\n }\n },\n [\n canSliding,\n loop,\n index,\n onScrollBegin,\n handlerOffsetX,\n size,\n scrollWithTiming,\n currentFixedPage,\n ]\n );\n\n const to = React.useCallback(\n (idx: number, animated: boolean = false) => {\n if (idx === index.value) return;\n if (!canSliding()) return;\n\n onScrollBegin?.();\n\n const offset = handlerOffsetX.value + (index.value - idx) * size;\n\n if (animated) {\n index.value = idx;\n handlerOffsetX.value = scrollWithTiming(offset);\n } else {\n handlerOffsetX.value = offset;\n index.value = idx;\n runOnJS(onScrollEnd)();\n }\n },\n [\n index,\n canSliding,\n onScrollBegin,\n handlerOffsetX,\n size,\n scrollWithTiming,\n onScrollEnd,\n ]\n );\n\n const scrollTo = React.useCallback(\n (opts: TCarouselActionOptions = {}) => {\n const { count, animated = false, onFinished } = opts;\n if (!count) {\n return;\n }\n const n = Math.round(count);\n if (n < 0) {\n prev({ count: Math.abs(n), animated, onFinished });\n } else {\n next({ count: n, animated, onFinished });\n }\n },\n [prev, next]\n );\n\n return {\n sharedIndex,\n sharedPreIndex,\n to,\n next,\n prev,\n scrollTo,\n getCurrentIndex,\n };\n}\n"]}
@@ -10,6 +10,31 @@ function isAutoFillData(params) {
10
10
  return !!params.loop && !!params.autoFillData;
11
11
  }
12
12
 
13
+ export function convertToSharedIndex(params) {
14
+ 'worklet';
15
+
16
+ const {
17
+ loop,
18
+ rawDataLength,
19
+ index,
20
+ autoFillData
21
+ } = params;
22
+
23
+ if (isAutoFillData({
24
+ loop,
25
+ autoFillData
26
+ })) {
27
+ switch (rawDataLength) {
28
+ case SINGLE_ITEM:
29
+ return 0;
30
+
31
+ case DOUBLE_ITEM:
32
+ return index % 2;
33
+ }
34
+ }
35
+
36
+ return index;
37
+ }
13
38
  export function computedOffsetXValueWithAutoFillData(params) {
14
39
  'worklet';
15
40
 
@@ -1 +1 @@
1
- {"version":3,"sources":["computedWithAutoFillData.ts"],"names":["DATA_LENGTH","SINGLE_ITEM","DOUBLE_ITEM","isAutoFillData","params","loop","autoFillData","computedOffsetXValueWithAutoFillData","rawDataLength","value","size","computedRealIndexWithAutoFillData","index","dataLength","computedFillDataWithAutoFillData","data"],"mappings":"AAAA,SAASA,WAAT,QAA4B,eAA5B;AAEA,MAAM;AAAEC,EAAAA,WAAF;AAAeC,EAAAA;AAAf,IAA+BF,WAArC;;AAEA,SAASG,cAAT,CAAwBC,MAAxB,EAA0E;AACtE;;AACA,SAAO,CAAC,CAACA,MAAM,CAACC,IAAT,IAAiB,CAAC,CAACD,MAAM,CAACE,YAAjC;AACH;;AAOD,OAAO,SAASC,oCAAT,CACHH,MADG,EAML;AACE;;AAEA,QAAM;AAAEI,IAAAA,aAAF;AAAiBC,IAAAA,KAAjB;AAAwBC,IAAAA,IAAxB;AAA8BL,IAAAA,IAA9B;AAAoCC,IAAAA;AAApC,MAAqDF,MAA3D;;AAEA,MAAID,cAAc,CAAC;AAAEE,IAAAA,IAAF;AAAQC,IAAAA;AAAR,GAAD,CAAlB,EAA4C;AACxC,YAAQE,aAAR;AACI,WAAKP,WAAL;AACI,eAAOQ,KAAK,GAAGC,IAAf;;AACJ,WAAKR,WAAL;AACI,eAAOO,KAAK,IAAIC,IAAI,GAAG,CAAX,CAAZ;AAJR;AAMH;;AAED,SAAOD,KAAP;AACH;AAED,OAAO,SAASE,iCAAT,CACHP,MADG,EAKL;AACE,QAAM;AAAEQ,IAAAA,KAAF;AAASC,IAAAA,UAAT;AAAqBR,IAAAA,IAArB;AAA2BC,IAAAA;AAA3B,MAA4CF,MAAlD;;AAEA,MAAID,cAAc,CAAC;AAAEE,IAAAA,IAAF;AAAQC,IAAAA;AAAR,GAAD,CAAlB,EAA4C;AACxC,YAAQO,UAAR;AACI,WAAKZ,WAAL;AACI,eAAOW,KAAK,GAAG,CAAf;;AACJ,WAAKV,WAAL;AACI,eAAOU,KAAK,GAAG,CAAf;AAJR;AAMH;;AAED,SAAOA,KAAP;AACH;AAED,OAAO,SAASE,gCAAT,CACHV,MADG,EAKA;AACH,QAAM;AAAEW,IAAAA,IAAF;AAAQV,IAAAA,IAAR;AAAcC,IAAAA,YAAd;AAA4BO,IAAAA;AAA5B,MAA2CT,MAAjD;;AAEA,MAAID,cAAc,CAAC;AAAEE,IAAAA,IAAF;AAAQC,IAAAA;AAAR,GAAD,CAAlB,EAA4C;AACxC,YAAQO,UAAR;AACI,WAAKZ,WAAL;AACI,eAAO,CAACc,IAAI,CAAC,CAAD,CAAL,EAAUA,IAAI,CAAC,CAAD,CAAd,EAAmBA,IAAI,CAAC,CAAD,CAAvB,CAAP;;AACJ,WAAKb,WAAL;AACI,eAAO,CAACa,IAAI,CAAC,CAAD,CAAL,EAAUA,IAAI,CAAC,CAAD,CAAd,EAAmBA,IAAI,CAAC,CAAD,CAAvB,EAA4BA,IAAI,CAAC,CAAD,CAAhC,CAAP;AAJR;AAMH;;AAED,SAAOA,IAAP;AACH","sourcesContent":["import { DATA_LENGTH } from 'src/constants';\n\nconst { SINGLE_ITEM, DOUBLE_ITEM } = DATA_LENGTH;\n\nfunction isAutoFillData(params: { autoFillData: boolean; loop: boolean }) {\n 'worklet';\n return !!params.loop && !!params.autoFillData;\n}\n\ntype BaseParams<T extends object = {}> = {\n autoFillData: boolean;\n loop: boolean;\n} & T;\n\nexport function computedOffsetXValueWithAutoFillData(\n params: BaseParams<{\n rawDataLength: number;\n value: number;\n size: number;\n }>\n) {\n 'worklet';\n\n const { rawDataLength, value, size, loop, autoFillData } = params;\n\n if (isAutoFillData({ loop, autoFillData })) {\n switch (rawDataLength) {\n case SINGLE_ITEM:\n return value % size;\n case DOUBLE_ITEM:\n return value % (size * 2);\n }\n }\n\n return value;\n}\n\nexport function computedRealIndexWithAutoFillData(\n params: BaseParams<{\n index: number;\n dataLength: number;\n }>\n) {\n const { index, dataLength, loop, autoFillData } = params;\n\n if (isAutoFillData({ loop, autoFillData })) {\n switch (dataLength) {\n case SINGLE_ITEM:\n return index % 1;\n case DOUBLE_ITEM:\n return index % 2;\n }\n }\n\n return index;\n}\n\nexport function computedFillDataWithAutoFillData<T>(\n params: BaseParams<{\n data: T[];\n dataLength: number;\n }>\n): T[] {\n const { data, loop, autoFillData, dataLength } = params;\n\n if (isAutoFillData({ loop, autoFillData })) {\n switch (dataLength) {\n case SINGLE_ITEM:\n return [data[0], data[0], data[0]];\n case DOUBLE_ITEM:\n return [data[0], data[1], data[0], data[1]];\n }\n }\n\n return data;\n}\n"]}
1
+ {"version":3,"sources":["computedWithAutoFillData.ts"],"names":["DATA_LENGTH","SINGLE_ITEM","DOUBLE_ITEM","isAutoFillData","params","loop","autoFillData","convertToSharedIndex","rawDataLength","index","computedOffsetXValueWithAutoFillData","value","size","computedRealIndexWithAutoFillData","dataLength","computedFillDataWithAutoFillData","data"],"mappings":"AAAA,SAASA,WAAT,QAA4B,eAA5B;AAEA,MAAM;AAAEC,EAAAA,WAAF;AAAeC,EAAAA;AAAf,IAA+BF,WAArC;;AAEA,SAASG,cAAT,CAAwBC,MAAxB,EAA0E;AACtE;;AACA,SAAO,CAAC,CAACA,MAAM,CAACC,IAAT,IAAiB,CAAC,CAACD,MAAM,CAACE,YAAjC;AACH;;AAOD,OAAO,SAASC,oBAAT,CACHH,MADG,EAEL;AACE;;AACA,QAAM;AAAEC,IAAAA,IAAF;AAAQG,IAAAA,aAAR;AAAuBC,IAAAA,KAAvB;AAA8BH,IAAAA;AAA9B,MAA+CF,MAArD;;AAEA,MAAID,cAAc,CAAC;AAAEE,IAAAA,IAAF;AAAQC,IAAAA;AAAR,GAAD,CAAlB,EAA4C;AACxC,YAAQE,aAAR;AACI,WAAKP,WAAL;AACI,eAAO,CAAP;;AACJ,WAAKC,WAAL;AACI,eAAOO,KAAK,GAAG,CAAf;AAJR;AAMH;;AAED,SAAOA,KAAP;AACH;AAED,OAAO,SAASC,oCAAT,CACHN,MADG,EAML;AACE;;AAEA,QAAM;AAAEI,IAAAA,aAAF;AAAiBG,IAAAA,KAAjB;AAAwBC,IAAAA,IAAxB;AAA8BP,IAAAA,IAA9B;AAAoCC,IAAAA;AAApC,MAAqDF,MAA3D;;AAEA,MAAID,cAAc,CAAC;AAAEE,IAAAA,IAAF;AAAQC,IAAAA;AAAR,GAAD,CAAlB,EAA4C;AACxC,YAAQE,aAAR;AACI,WAAKP,WAAL;AACI,eAAOU,KAAK,GAAGC,IAAf;;AACJ,WAAKV,WAAL;AACI,eAAOS,KAAK,IAAIC,IAAI,GAAG,CAAX,CAAZ;AAJR;AAMH;;AAED,SAAOD,KAAP;AACH;AAED,OAAO,SAASE,iCAAT,CACHT,MADG,EAKL;AACE,QAAM;AAAEK,IAAAA,KAAF;AAASK,IAAAA,UAAT;AAAqBT,IAAAA,IAArB;AAA2BC,IAAAA;AAA3B,MAA4CF,MAAlD;;AAEA,MAAID,cAAc,CAAC;AAAEE,IAAAA,IAAF;AAAQC,IAAAA;AAAR,GAAD,CAAlB,EAA4C;AACxC,YAAQQ,UAAR;AACI,WAAKb,WAAL;AACI,eAAOQ,KAAK,GAAG,CAAf;;AACJ,WAAKP,WAAL;AACI,eAAOO,KAAK,GAAG,CAAf;AAJR;AAMH;;AAED,SAAOA,KAAP;AACH;AAED,OAAO,SAASM,gCAAT,CACHX,MADG,EAKA;AACH,QAAM;AAAEY,IAAAA,IAAF;AAAQX,IAAAA,IAAR;AAAcC,IAAAA,YAAd;AAA4BQ,IAAAA;AAA5B,MAA2CV,MAAjD;;AAEA,MAAID,cAAc,CAAC;AAAEE,IAAAA,IAAF;AAAQC,IAAAA;AAAR,GAAD,CAAlB,EAA4C;AACxC,YAAQQ,UAAR;AACI,WAAKb,WAAL;AACI,eAAO,CAACe,IAAI,CAAC,CAAD,CAAL,EAAUA,IAAI,CAAC,CAAD,CAAd,EAAmBA,IAAI,CAAC,CAAD,CAAvB,CAAP;;AACJ,WAAKd,WAAL;AACI,eAAO,CAACc,IAAI,CAAC,CAAD,CAAL,EAAUA,IAAI,CAAC,CAAD,CAAd,EAAmBA,IAAI,CAAC,CAAD,CAAvB,EAA4BA,IAAI,CAAC,CAAD,CAAhC,CAAP;AAJR;AAMH;;AAED,SAAOA,IAAP;AACH","sourcesContent":["import { DATA_LENGTH } from 'src/constants';\n\nconst { SINGLE_ITEM, DOUBLE_ITEM } = DATA_LENGTH;\n\nfunction isAutoFillData(params: { autoFillData: boolean; loop: boolean }) {\n 'worklet';\n return !!params.loop && !!params.autoFillData;\n}\n\ntype BaseParams<T extends object = {}> = {\n autoFillData: boolean;\n loop: boolean;\n} & T;\n\nexport function convertToSharedIndex(\n params: BaseParams<{ index: number; rawDataLength: number }>\n) {\n 'worklet';\n const { loop, rawDataLength, index, autoFillData } = params;\n\n if (isAutoFillData({ loop, autoFillData })) {\n switch (rawDataLength) {\n case SINGLE_ITEM:\n return 0;\n case DOUBLE_ITEM:\n return index % 2;\n }\n }\n\n return index;\n}\n\nexport function computedOffsetXValueWithAutoFillData(\n params: BaseParams<{\n rawDataLength: number;\n value: number;\n size: number;\n }>\n) {\n 'worklet';\n\n const { rawDataLength, value, size, loop, autoFillData } = params;\n\n if (isAutoFillData({ loop, autoFillData })) {\n switch (rawDataLength) {\n case SINGLE_ITEM:\n return value % size;\n case DOUBLE_ITEM:\n return value % (size * 2);\n }\n }\n\n return value;\n}\n\nexport function computedRealIndexWithAutoFillData(\n params: BaseParams<{\n index: number;\n dataLength: number;\n }>\n) {\n const { index, dataLength, loop, autoFillData } = params;\n\n if (isAutoFillData({ loop, autoFillData })) {\n switch (dataLength) {\n case SINGLE_ITEM:\n return index % 1;\n case DOUBLE_ITEM:\n return index % 2;\n }\n }\n\n return index;\n}\n\nexport function computedFillDataWithAutoFillData<T>(\n params: BaseParams<{\n data: T[];\n dataLength: number;\n }>\n): T[] {\n const { data, loop, autoFillData, dataLength } = params;\n\n if (isAutoFillData({ loop, autoFillData })) {\n switch (dataLength) {\n case SINGLE_ITEM:\n return [data[0], data[0], data[0]];\n case DOUBLE_ITEM:\n return [data[0], data[1], data[0], data[1]];\n }\n }\n\n return data;\n}\n"]}