react-native-reanimated-carousel 2.2.4 → 2.2.5-beta.0
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/lib/commonjs/Carousel.js +2 -0
- package/lib/commonjs/Carousel.js.map +1 -1
- package/lib/commonjs/ScrollViewGesture.js +22 -10
- package/lib/commonjs/ScrollViewGesture.js.map +1 -1
- package/lib/commonjs/hooks/useCarouselController.js +21 -6
- package/lib/commonjs/hooks/useCarouselController.js.map +1 -1
- package/lib/commonjs/utils/dealWithAnimation.js +25 -0
- package/lib/commonjs/utils/dealWithAnimation.js.map +1 -0
- package/lib/module/Carousel.js +2 -0
- package/lib/module/Carousel.js.map +1 -1
- package/lib/module/ScrollViewGesture.js +22 -11
- package/lib/module/ScrollViewGesture.js.map +1 -1
- package/lib/module/hooks/useCarouselController.js +21 -7
- package/lib/module/hooks/useCarouselController.js.map +1 -1
- package/lib/module/utils/dealWithAnimation.js +17 -0
- package/lib/module/utils/dealWithAnimation.js.map +1 -0
- package/lib/typescript/hooks/useCarouselController.d.ts +2 -1
- package/lib/typescript/types.d.ts +12 -1
- package/lib/typescript/utils/dealWithAnimation.d.ts +2 -0
- package/package.json +3 -1
- package/src/Carousel.tsx +2 -0
- package/src/ScrollViewGesture.tsx +21 -11
- package/src/hooks/useCarouselController.tsx +28 -12
- package/src/types.ts +16 -3
- package/src/utils/dealWithAnimation.ts +22 -0
package/lib/commonjs/Carousel.js
CHANGED
|
@@ -57,6 +57,7 @@ const Carousel = /*#__PURE__*/_react.default.forwardRef((_props, ref) => {
|
|
|
57
57
|
autoPlayReverse,
|
|
58
58
|
autoPlayInterval,
|
|
59
59
|
scrollAnimationDuration,
|
|
60
|
+
withAnimation,
|
|
60
61
|
renderItem,
|
|
61
62
|
onScrollEnd,
|
|
62
63
|
onSnapToItem,
|
|
@@ -92,6 +93,7 @@ const Carousel = /*#__PURE__*/_react.default.forwardRef((_props, ref) => {
|
|
|
92
93
|
handlerOffsetX,
|
|
93
94
|
length: data.length,
|
|
94
95
|
disable: !data.length,
|
|
96
|
+
withAnimation,
|
|
95
97
|
originalLength: data.length,
|
|
96
98
|
onScrollEnd: () => (0, _reactNativeReanimated.runOnJS)(_onScrollEnd)(),
|
|
97
99
|
onScrollBegin: () => !!onScrollBegin && (0, _reactNativeReanimated.runOnJS)(onScrollBegin)(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["Carousel.tsx"],"names":["Carousel","React","forwardRef","_props","ref","props","data","rawData","loop","mode","style","width","height","vertical","autoPlay","windowSize","autoPlayReverse","autoPlayInterval","scrollAnimationDuration","renderItem","onScrollEnd","onSnapToItem","onScrollBegin","onProgressChange","customAnimation","commonVariables","size","handlerOffsetX","offsetX","totalSize","length","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","DATA_LENGTH","SINGLE_ITEM","DOUBLE_ITEM","animationValue","index","common","styles","container","itemsVertical","itemsHorizontal","map","StyleSheet","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 { DATA_LENGTH } from './constants';\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';\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 mode,\n style,\n width,\n height,\n vertical,\n autoPlay,\n windowSize,\n autoPlayReverse,\n autoPlayInterval,\n scrollAnimationDuration,\n renderItem,\n onScrollEnd,\n onSnapToItem,\n onScrollBegin,\n onProgressChange,\n customAnimation,\n } = props;\n\n const commonVariables = useCommonVariables(props);\n const { size, handlerOffsetX } = commonVariables;\n\n const offsetX = useDerivedValue(() => {\n const totalSize = size * data.length;\n const x = handlerOffsetX.value % totalSize;\n\n if (!loop) {\n return handlerOffsetX.value;\n }\n return isNaN(x) ? 0 : x;\n }, [loop, size, data]);\n\n usePropsErrorBoundary(props);\n useOnProgressChange({ size, offsetX, rawData, onProgressChange });\n\n const carouselController = useCarouselController({\n loop,\n size,\n handlerOffsetX,\n length: data.length,\n disable: !data.length,\n originalLength: data.length,\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 let realIndex = i;\n if (rawData.length === DATA_LENGTH.SINGLE_ITEM) {\n realIndex = i % 1;\n }\n\n if (rawData.length === DATA_LENGTH.DOUBLE_ITEM) {\n realIndex = i % 2;\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 rawData,\n offsetX,\n visibleRanges,\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":["Carousel","React","forwardRef","_props","ref","props","data","rawData","loop","mode","style","width","height","vertical","autoPlay","windowSize","autoPlayReverse","autoPlayInterval","scrollAnimationDuration","withAnimation","renderItem","onScrollEnd","onSnapToItem","onScrollBegin","onProgressChange","customAnimation","commonVariables","size","handlerOffsetX","offsetX","totalSize","length","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","DATA_LENGTH","SINGLE_ITEM","DOUBLE_ITEM","animationValue","index","common","styles","container","itemsVertical","itemsHorizontal","map","StyleSheet","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 { DATA_LENGTH } from './constants';\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';\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 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 } = props;\n\n const commonVariables = useCommonVariables(props);\n const { size, handlerOffsetX } = commonVariables;\n\n const offsetX = useDerivedValue(() => {\n const totalSize = size * data.length;\n const x = handlerOffsetX.value % totalSize;\n\n if (!loop) {\n return handlerOffsetX.value;\n }\n return isNaN(x) ? 0 : x;\n }, [loop, size, data]);\n\n usePropsErrorBoundary(props);\n useOnProgressChange({ size, offsetX, rawData, onProgressChange });\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 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 let realIndex = i;\n if (rawData.length === DATA_LENGTH.SINGLE_ITEM) {\n realIndex = i % 1;\n }\n\n if (rawData.length === DATA_LENGTH.DOUBLE_ITEM) {\n realIndex = i % 2;\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 rawData,\n offsetX,\n visibleRanges,\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"]}
|
|
@@ -17,6 +17,8 @@ var _constants = require("./constants");
|
|
|
17
17
|
|
|
18
18
|
var _store = require("./store");
|
|
19
19
|
|
|
20
|
+
var _dealWithAnimation = require("./utils/dealWithAnimation");
|
|
21
|
+
|
|
20
22
|
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); }
|
|
21
23
|
|
|
22
24
|
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; }
|
|
@@ -35,7 +37,8 @@ const IScrollViewGesture = props => {
|
|
|
35
37
|
enableSnap,
|
|
36
38
|
panGestureHandlerProps,
|
|
37
39
|
loop: infinite,
|
|
38
|
-
scrollAnimationDuration
|
|
40
|
+
scrollAnimationDuration,
|
|
41
|
+
withAnimation
|
|
39
42
|
}
|
|
40
43
|
} = _react.default.useContext(_store.CTX);
|
|
41
44
|
|
|
@@ -56,15 +59,23 @@ const IScrollViewGesture = props => {
|
|
|
56
59
|
const _withSpring = _react.default.useCallback((toValue, onFinished) => {
|
|
57
60
|
'worklet';
|
|
58
61
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
}, isFinished => {
|
|
62
|
+
const callback = isFinished => {
|
|
63
|
+
'worklet';
|
|
64
|
+
|
|
63
65
|
if (isFinished) {
|
|
64
|
-
onFinished
|
|
66
|
+
onFinished && (0, _reactNativeReanimated.runOnJS)(onFinished)();
|
|
65
67
|
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const defaultWithAnimation = {
|
|
71
|
+
type: 'timing',
|
|
72
|
+
config: {
|
|
73
|
+
duration: scrollAnimationDuration,
|
|
74
|
+
easing: _constants.Easing.easeOutQuart
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
return (0, _dealWithAnimation.dealWithAnimation)(withAnimation !== null && withAnimation !== void 0 ? withAnimation : defaultWithAnimation)(toValue, callback);
|
|
78
|
+
}, [scrollAnimationDuration, withAnimation]);
|
|
68
79
|
|
|
69
80
|
const endWithSpring = _react.default.useCallback(onFinished => {
|
|
70
81
|
'worklet';
|
|
@@ -186,8 +197,9 @@ const IScrollViewGesture = props => {
|
|
|
186
197
|
translationY
|
|
187
198
|
} = e;
|
|
188
199
|
scrollEndVelocity.value = isHorizontal.value ? velocityX : velocityY;
|
|
189
|
-
scrollEndTranslation.value = isHorizontal.value ? translationX : translationY;
|
|
190
|
-
|
|
200
|
+
scrollEndTranslation.value = isHorizontal.value ? translationX : translationY; // endWithSpring(() => onScrollEnd && runOnJS(onScrollEnd)());
|
|
201
|
+
|
|
202
|
+
endWithSpring(onScrollEnd);
|
|
191
203
|
|
|
192
204
|
if (!infinite) {
|
|
193
205
|
touching.value = false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["ScrollViewGesture.tsx"],"names":["IScrollViewGesture","props","vertical","style","data","pagingEnabled","enableSnap","panGestureHandlerProps","loop","infinite","scrollAnimationDuration","React","useContext","CTX","translation","size","onScrollBegin","onScrollEnd","onTouchBegin","onTouchEnd","maxPage","length","isHorizontal","touching","scrollEndTranslation","scrollEndVelocity","_withSpring","useCallback","toValue","onFinished","duration","easing","Easing","easeOutQuart","isFinished","endWithSpring","origin","value","velocity","nextPage","Math","round","deceleration","page","velocityPage","finalPage","min","max","onFinish","activeDecay","resetBoundary","panGestureEventHandler","onStart","_","ctx","panOffset","onActive","e","translationX","translationY","panTranslation","boundary","fixed","dynamic","onEnd","velocityX","velocityY","directionStyle","useMemo","styles","contentHorizontal","contentVertical","container","children","ScrollViewGesture","StyleSheet","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 withTiming,\n} from 'react-native-reanimated';\nimport { Easing } from './constants';\nimport { CTX } from './store';\n\ntype GestureContext = {\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 style,\n data,\n pagingEnabled,\n enableSnap,\n panGestureHandlerProps,\n loop: infinite,\n scrollAnimationDuration,\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 return withTiming(\n toValue,\n {\n duration: scrollAnimationDuration,\n easing: Easing.easeOutQuart,\n },\n (isFinished) => {\n if (isFinished) {\n onFinished?.();\n }\n }\n );\n },\n [scrollAnimationDuration]\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 (enableSnap) {\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 enableSnap,\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 onFinish\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 cancelAnimation(translation);\n onScrollBegin && runOnJS(onScrollBegin)();\n ctx.max = (maxPage - 1) * size;\n ctx.panOffset = translation.value;\n },\n onActive: (e, ctx) => {\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 && runOnJS(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 enableSnap,\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={[styles.container, directionStyle, style]}\n onTouchStart={onTouchBegin}\n onTouchEnd={onTouchEnd}\n >\n <PanGestureHandler\n {...panGestureHandlerProps}\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":["IScrollViewGesture","props","vertical","style","data","pagingEnabled","enableSnap","panGestureHandlerProps","loop","infinite","scrollAnimationDuration","withAnimation","React","useContext","CTX","translation","size","onScrollBegin","onScrollEnd","onTouchBegin","onTouchEnd","maxPage","length","isHorizontal","touching","scrollEndTranslation","scrollEndVelocity","_withSpring","useCallback","toValue","onFinished","callback","isFinished","defaultWithAnimation","type","config","duration","easing","Easing","easeOutQuart","endWithSpring","origin","value","velocity","nextPage","Math","round","deceleration","page","velocityPage","finalPage","min","max","onFinish","activeDecay","resetBoundary","panGestureEventHandler","onStart","_","ctx","panOffset","onActive","e","translationX","translationY","panTranslation","boundary","fixed","dynamic","onEnd","velocityX","velocityY","directionStyle","useMemo","styles","contentHorizontal","contentVertical","container","children","ScrollViewGesture","StyleSheet","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 { WithAnimation } from './types';\nimport { dealWithAnimation } from './utils/dealWithAnimation';\n\ntype GestureContext = {\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 style,\n data,\n pagingEnabled,\n enableSnap,\n panGestureHandlerProps,\n loop: infinite,\n scrollAnimationDuration,\n withAnimation,\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: WithAnimation = {\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 (enableSnap) {\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 enableSnap,\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 onFinish\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 cancelAnimation(translation);\n onScrollBegin && runOnJS(onScrollBegin)();\n ctx.max = (maxPage - 1) * size;\n ctx.panOffset = translation.value;\n },\n onActive: (e, ctx) => {\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 && runOnJS(onScrollEnd)());\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 enableSnap,\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={[styles.container, directionStyle, style]}\n onTouchStart={onTouchBegin}\n onTouchEnd={onTouchEnd}\n >\n <PanGestureHandler\n {...panGestureHandlerProps}\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"]}
|
|
@@ -11,6 +11,8 @@ var _constants = require("../constants");
|
|
|
11
11
|
|
|
12
12
|
var _reactNativeReanimated = require("react-native-reanimated");
|
|
13
13
|
|
|
14
|
+
var _dealWithAnimation = require("@/utils/dealWithAnimation");
|
|
15
|
+
|
|
14
16
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
17
|
|
|
16
18
|
function useCarouselController(options) {
|
|
@@ -18,6 +20,7 @@ function useCarouselController(options) {
|
|
|
18
20
|
size,
|
|
19
21
|
loop,
|
|
20
22
|
handlerOffsetX,
|
|
23
|
+
withAnimation,
|
|
21
24
|
disable = false,
|
|
22
25
|
originalLength,
|
|
23
26
|
length,
|
|
@@ -86,18 +89,30 @@ function useCarouselController(options) {
|
|
|
86
89
|
}, [options]);
|
|
87
90
|
|
|
88
91
|
const scrollWithTiming = _react.default.useCallback((toValue, onFinished) => {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
92
|
+
'worklet';
|
|
93
|
+
|
|
94
|
+
const callback = isFinished => {
|
|
95
|
+
'worklet';
|
|
96
|
+
|
|
93
97
|
if (isFinished) {
|
|
94
98
|
(0, _reactNativeReanimated.runOnJS)(onScrollEnd)();
|
|
95
99
|
onFinished && (0, _reactNativeReanimated.runOnJS)(onFinished)();
|
|
96
100
|
}
|
|
97
|
-
}
|
|
98
|
-
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
const defaultWithAnimation = {
|
|
104
|
+
type: 'timing',
|
|
105
|
+
config: {
|
|
106
|
+
duration,
|
|
107
|
+
easing: _constants.Easing.easeOutQuart
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
return (0, _dealWithAnimation.dealWithAnimation)(withAnimation !== null && withAnimation !== void 0 ? withAnimation : defaultWithAnimation)(toValue, callback);
|
|
111
|
+
}, [duration, withAnimation, onScrollEnd]);
|
|
99
112
|
|
|
100
113
|
const next = _react.default.useCallback((opts = {}) => {
|
|
114
|
+
'worklet';
|
|
115
|
+
|
|
101
116
|
const {
|
|
102
117
|
count = 1,
|
|
103
118
|
animated = true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useCarouselController.tsx"],"names":["useCarouselController","options","size","loop","handlerOffsetX","disable","originalLength","length","onChange","duration","index","sharedIndex","React","useRef","sharedPreIndex","currentFixedPage","useCallback","Math","round","value","fixed","abs","convertToSharedIndex","i","computedIndex","current","toInt","_sharedIndex","getCurrentIndex","canSliding","onScrollEnd","onScrollBegin","scrollWithTiming","toValue","onFinished","easing","Easing","easeOutQuart","isFinished","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, withTiming } from 'react-native-reanimated';\nimport type { TCarouselActionOptions } from '../types';\n\ninterface IOpts {\n loop: boolean;\n size: number;\n handlerOffsetX: Animated.SharedValue<number>;\n disable?: boolean;\n duration?: number;\n originalLength: number;\n length: 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 disable = false,\n originalLength,\n length,\n onChange,\n duration,\n } = options;\n\n const index = useSharedValue<number>(0);\n // The Index displayed to the user\n const sharedIndex = React.useRef<number>(0);\n const sharedPreIndex = React.useRef<number>(0);\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 return withTiming(\n toValue,\n { duration, easing: Easing.easeOutQuart },\n (isFinished: boolean) => {\n if (isFinished) {\n runOnJS(onScrollEnd)();\n onFinished && runOnJS(onFinished)();\n }\n }\n );\n },\n [onScrollEnd, duration]\n );\n\n const next = React.useCallback(\n (opts: TCarouselActionOptions = {}) => {\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 );\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":["useCarouselController","options","size","loop","handlerOffsetX","withAnimation","disable","originalLength","length","onChange","duration","index","sharedIndex","React","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","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 WithAnimation,\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 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 } = options;\n\n const index = useSharedValue<number>(0);\n // The Index displayed to the user\n const sharedIndex = React.useRef<number>(0);\n const sharedPreIndex = React.useRef<number>(0);\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: WithAnimation = {\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"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.dealWithAnimation = dealWithAnimation;
|
|
7
|
+
|
|
8
|
+
var _reactNativeReanimated = require("react-native-reanimated");
|
|
9
|
+
|
|
10
|
+
function dealWithAnimation(withAnimation) {
|
|
11
|
+
'worklet';
|
|
12
|
+
|
|
13
|
+
switch (withAnimation.type) {
|
|
14
|
+
case 'spring':
|
|
15
|
+
return (value, cb) => {
|
|
16
|
+
return (0, _reactNativeReanimated.withSpring)(value, withAnimation.config, isFinished => cb(isFinished));
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
case 'timing':
|
|
20
|
+
return (value, cb) => {
|
|
21
|
+
return (0, _reactNativeReanimated.withTiming)(value, withAnimation.config, isFinished => cb(isFinished));
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=dealWithAnimation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["dealWithAnimation.ts"],"names":["dealWithAnimation","withAnimation","type","value","cb","config","isFinished"],"mappings":";;;;;;;AACA;;AAEO,SAASA,iBAAT,CACHC,aADG,EAEyD;AAC5D;;AACA,UAAQA,aAAa,CAACC,IAAtB;AACI,SAAK,QAAL;AACI,aAAO,CAACC,KAAD,EAAQC,EAAR,KAAe;AAClB,eAAO,uCAAWD,KAAX,EAAkBF,aAAa,CAACI,MAAhC,EAAyCC,UAAD,IAC3CF,EAAE,CAACE,UAAD,CADC,CAAP;AAGH,OAJD;;AAKJ,SAAK,QAAL;AACI,aAAO,CAACH,KAAD,EAAQC,EAAR,KAAe;AAClB,eAAO,uCAAWD,KAAX,EAAkBF,aAAa,CAACI,MAAhC,EAAyCC,UAAD,IAC3CF,EAAE,CAACE,UAAD,CADC,CAAP;AAGH,OAJD;AARR;AAcH","sourcesContent":["import type { WithAnimation } from '../types';\nimport { withSpring, withTiming } from 'react-native-reanimated';\n\nexport function dealWithAnimation(\n withAnimation: WithAnimation\n): (value: number, cb: (isFinished: boolean) => void) => number {\n 'worklet';\n switch (withAnimation.type) {\n case 'spring':\n return (value, cb) => {\n return withSpring(value, withAnimation.config, (isFinished) =>\n cb(isFinished)\n );\n };\n case 'timing':\n return (value, cb) => {\n return withTiming(value, withAnimation.config, (isFinished) =>\n cb(isFinished)\n );\n };\n }\n}\n"]}
|
package/lib/module/Carousel.js
CHANGED
|
@@ -29,6 +29,7 @@ const Carousel = /*#__PURE__*/React.forwardRef((_props, ref) => {
|
|
|
29
29
|
autoPlayReverse,
|
|
30
30
|
autoPlayInterval,
|
|
31
31
|
scrollAnimationDuration,
|
|
32
|
+
withAnimation,
|
|
32
33
|
renderItem,
|
|
33
34
|
onScrollEnd,
|
|
34
35
|
onSnapToItem,
|
|
@@ -64,6 +65,7 @@ const Carousel = /*#__PURE__*/React.forwardRef((_props, ref) => {
|
|
|
64
65
|
handlerOffsetX,
|
|
65
66
|
length: data.length,
|
|
66
67
|
disable: !data.length,
|
|
68
|
+
withAnimation,
|
|
67
69
|
originalLength: data.length,
|
|
68
70
|
onScrollEnd: () => runOnJS(_onScrollEnd)(),
|
|
69
71
|
onScrollBegin: () => !!onScrollBegin && runOnJS(onScrollBegin)(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["Carousel.tsx"],"names":["React","Animated","runOnJS","useDerivedValue","useCarouselController","useAutoPlay","usePropsErrorBoundary","ScrollViewGesture","useVisibleRanges","StyleSheet","View","DATA_LENGTH","BaseLayout","useLayoutConfig","useInitProps","CTX","useCommonVariables","useOnProgressChange","Carousel","forwardRef","_props","ref","props","data","rawData","loop","mode","style","width","height","vertical","autoPlay","windowSize","autoPlayReverse","autoPlayInterval","scrollAnimationDuration","renderItem","onScrollEnd","onSnapToItem","onScrollBegin","onProgressChange","customAnimation","commonVariables","size","handlerOffsetX","offsetX","totalSize","length","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","SINGLE_ITEM","DOUBLE_ITEM","animationValue","index","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 { DATA_LENGTH } from './constants';\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';\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 mode,\n style,\n width,\n height,\n vertical,\n autoPlay,\n windowSize,\n autoPlayReverse,\n autoPlayInterval,\n scrollAnimationDuration,\n renderItem,\n onScrollEnd,\n onSnapToItem,\n onScrollBegin,\n onProgressChange,\n customAnimation,\n } = props;\n\n const commonVariables = useCommonVariables(props);\n const { size, handlerOffsetX } = commonVariables;\n\n const offsetX = useDerivedValue(() => {\n const totalSize = size * data.length;\n const x = handlerOffsetX.value % totalSize;\n\n if (!loop) {\n return handlerOffsetX.value;\n }\n return isNaN(x) ? 0 : x;\n }, [loop, size, data]);\n\n usePropsErrorBoundary(props);\n useOnProgressChange({ size, offsetX, rawData, onProgressChange });\n\n const carouselController = useCarouselController({\n loop,\n size,\n handlerOffsetX,\n length: data.length,\n disable: !data.length,\n originalLength: data.length,\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 let realIndex = i;\n if (rawData.length === DATA_LENGTH.SINGLE_ITEM) {\n realIndex = i % 1;\n }\n\n if (rawData.length === DATA_LENGTH.DOUBLE_ITEM) {\n realIndex = i % 2;\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 rawData,\n offsetX,\n visibleRanges,\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","useDerivedValue","useCarouselController","useAutoPlay","usePropsErrorBoundary","ScrollViewGesture","useVisibleRanges","StyleSheet","View","DATA_LENGTH","BaseLayout","useLayoutConfig","useInitProps","CTX","useCommonVariables","useOnProgressChange","Carousel","forwardRef","_props","ref","props","data","rawData","loop","mode","style","width","height","vertical","autoPlay","windowSize","autoPlayReverse","autoPlayInterval","scrollAnimationDuration","withAnimation","renderItem","onScrollEnd","onSnapToItem","onScrollBegin","onProgressChange","customAnimation","commonVariables","size","handlerOffsetX","offsetX","totalSize","length","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","SINGLE_ITEM","DOUBLE_ITEM","animationValue","index","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 { DATA_LENGTH } from './constants';\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';\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 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 } = props;\n\n const commonVariables = useCommonVariables(props);\n const { size, handlerOffsetX } = commonVariables;\n\n const offsetX = useDerivedValue(() => {\n const totalSize = size * data.length;\n const x = handlerOffsetX.value % totalSize;\n\n if (!loop) {\n return handlerOffsetX.value;\n }\n return isNaN(x) ? 0 : x;\n }, [loop, size, data]);\n\n usePropsErrorBoundary(props);\n useOnProgressChange({ size, offsetX, rawData, onProgressChange });\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 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 let realIndex = i;\n if (rawData.length === DATA_LENGTH.SINGLE_ITEM) {\n realIndex = i % 1;\n }\n\n if (rawData.length === DATA_LENGTH.DOUBLE_ITEM) {\n realIndex = i % 2;\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 rawData,\n offsetX,\n visibleRanges,\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"]}
|
|
@@ -3,9 +3,10 @@ function _extends() { _extends = Object.assign || function (target) { for (var i
|
|
|
3
3
|
import React from 'react';
|
|
4
4
|
import { StyleSheet } from 'react-native';
|
|
5
5
|
import { PanGestureHandler } from 'react-native-gesture-handler';
|
|
6
|
-
import Animated, { cancelAnimation, runOnJS, useAnimatedGestureHandler, useAnimatedReaction, useDerivedValue, useSharedValue, withDecay
|
|
6
|
+
import Animated, { cancelAnimation, runOnJS, useAnimatedGestureHandler, useAnimatedReaction, useDerivedValue, useSharedValue, withDecay } from 'react-native-reanimated';
|
|
7
7
|
import { Easing } from './constants';
|
|
8
8
|
import { CTX } from './store';
|
|
9
|
+
import { dealWithAnimation } from './utils/dealWithAnimation';
|
|
9
10
|
|
|
10
11
|
const IScrollViewGesture = props => {
|
|
11
12
|
const {
|
|
@@ -17,7 +18,8 @@ const IScrollViewGesture = props => {
|
|
|
17
18
|
enableSnap,
|
|
18
19
|
panGestureHandlerProps,
|
|
19
20
|
loop: infinite,
|
|
20
|
-
scrollAnimationDuration
|
|
21
|
+
scrollAnimationDuration,
|
|
22
|
+
withAnimation
|
|
21
23
|
}
|
|
22
24
|
} = React.useContext(CTX);
|
|
23
25
|
const {
|
|
@@ -37,15 +39,23 @@ const IScrollViewGesture = props => {
|
|
|
37
39
|
const _withSpring = React.useCallback((toValue, onFinished) => {
|
|
38
40
|
'worklet';
|
|
39
41
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}, isFinished => {
|
|
42
|
+
const callback = isFinished => {
|
|
43
|
+
'worklet';
|
|
44
|
+
|
|
44
45
|
if (isFinished) {
|
|
45
|
-
onFinished
|
|
46
|
+
onFinished && runOnJS(onFinished)();
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const defaultWithAnimation = {
|
|
51
|
+
type: 'timing',
|
|
52
|
+
config: {
|
|
53
|
+
duration: scrollAnimationDuration,
|
|
54
|
+
easing: Easing.easeOutQuart
|
|
46
55
|
}
|
|
47
|
-
}
|
|
48
|
-
|
|
56
|
+
};
|
|
57
|
+
return dealWithAnimation(withAnimation !== null && withAnimation !== void 0 ? withAnimation : defaultWithAnimation)(toValue, callback);
|
|
58
|
+
}, [scrollAnimationDuration, withAnimation]);
|
|
49
59
|
|
|
50
60
|
const endWithSpring = React.useCallback(onFinished => {
|
|
51
61
|
'worklet';
|
|
@@ -163,8 +173,9 @@ const IScrollViewGesture = props => {
|
|
|
163
173
|
translationY
|
|
164
174
|
} = e;
|
|
165
175
|
scrollEndVelocity.value = isHorizontal.value ? velocityX : velocityY;
|
|
166
|
-
scrollEndTranslation.value = isHorizontal.value ? translationX : translationY;
|
|
167
|
-
|
|
176
|
+
scrollEndTranslation.value = isHorizontal.value ? translationX : translationY; // endWithSpring(() => onScrollEnd && runOnJS(onScrollEnd)());
|
|
177
|
+
|
|
178
|
+
endWithSpring(onScrollEnd);
|
|
168
179
|
|
|
169
180
|
if (!infinite) {
|
|
170
181
|
touching.value = false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["ScrollViewGesture.tsx"],"names":["React","StyleSheet","PanGestureHandler","Animated","cancelAnimation","runOnJS","useAnimatedGestureHandler","useAnimatedReaction","useDerivedValue","useSharedValue","withDecay","withTiming","Easing","CTX","IScrollViewGesture","props","vertical","style","data","pagingEnabled","enableSnap","panGestureHandlerProps","loop","infinite","scrollAnimationDuration","useContext","translation","size","onScrollBegin","onScrollEnd","onTouchBegin","onTouchEnd","maxPage","length","isHorizontal","touching","scrollEndTranslation","scrollEndVelocity","_withSpring","useCallback","toValue","onFinished","duration","easing","easeOutQuart","isFinished","endWithSpring","origin","value","velocity","nextPage","Math","round","deceleration","page","velocityPage","finalPage","min","max","onFinish","activeDecay","resetBoundary","panGestureEventHandler","onStart","_","ctx","panOffset","onActive","e","translationX","translationY","panTranslation","boundary","fixed","dynamic","onEnd","velocityX","velocityY","directionStyle","useMemo","styles","contentHorizontal","contentVertical","container","children","ScrollViewGesture","create","flex","overflow","flexDirection"],"mappings":";;AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,SAAoBC,UAApB,QAAiD,cAAjD;AACA,SACIC,iBADJ,QAGO,8BAHP;AAIA,OAAOC,QAAP,IACIC,eADJ,EAEIC,OAFJ,EAGIC,yBAHJ,EAIIC,mBAJJ,EAKIC,eALJ,EAMIC,cANJ,EAOIC,SAPJ,EAQIC,UARJ,QASO,yBATP;AAUA,SAASC,MAAT,QAAuB,aAAvB;AACA,SAASC,GAAT,QAAoB,SAApB;;AAkBA,MAAMC,kBAAmC,GAAIC,KAAD,IAAW;AACnD,QAAM;AACFA,IAAAA,KAAK,EAAE;AACHC,MAAAA,QADG;AAEHC,MAAAA,KAFG;AAGHC,MAAAA,IAHG;AAIHC,MAAAA,aAJG;AAKHC,MAAAA,UALG;AAMHC,MAAAA,sBANG;AAOHC,MAAAA,IAAI,EAAEC,QAPH;AAQHC,MAAAA;AARG;AADL,MAWFxB,KAAK,CAACyB,UAAN,CAAiBZ,GAAjB,CAXJ;AAaA,QAAM;AACFa,IAAAA,WADE;AAEFC,IAAAA,IAFE;AAGFC,IAAAA,aAHE;AAIFC,IAAAA,WAJE;AAKFC,IAAAA,YALE;AAMFC,IAAAA;AANE,MAOFhB,KAPJ;AASA,QAAMiB,OAAO,GAAGd,IAAI,CAACe,MAArB;AACA,QAAMC,YAAY,GAAG1B,eAAe,CAAC,MAAM,CAACQ,QAAR,EAAkB,CAACA,QAAD,CAAlB,CAApC;AACA,QAAMmB,QAAQ,GAAG1B,cAAc,CAAC,KAAD,CAA/B;AACA,QAAM2B,oBAAoB,GAAG3B,cAAc,CAAC,CAAD,CAA3C;AACA,QAAM4B,iBAAiB,GAAG5B,cAAc,CAAC,CAAD,CAAxC;;AAEA,QAAM6B,WAAW,GAAGtC,KAAK,CAACuC,WAAN,CAChB,CAACC,OAAD,EAAkBC,UAAlB,KAA8C;AAC1C;;AACA,WAAO9B,UAAU,CACb6B,OADa,EAEb;AACIE,MAAAA,QAAQ,EAAElB,uBADd;AAEImB,MAAAA,MAAM,EAAE/B,MAAM,CAACgC;AAFnB,KAFa,EAMZC,UAAD,IAAgB;AACZ,UAAIA,UAAJ,EAAgB;AACZJ,QAAAA,UAAU,SAAV,IAAAA,UAAU,WAAV,YAAAA,UAAU;AACb;AACJ,KAVY,CAAjB;AAYH,GAfe,EAgBhB,CAACjB,uBAAD,CAhBgB,CAApB;;AAmBA,QAAMsB,aAAa,GAAG9C,KAAK,CAACuC,WAAN,CACjBE,UAAD,IAA6B;AACzB;;AACA,UAAMM,MAAM,GAAGrB,WAAW,CAACsB,KAA3B;AACA,UAAMC,QAAQ,GAAGZ,iBAAiB,CAACW,KAAnC;;AACA,QAAI,CAAC7B,aAAL,EAAoB;AAChB,UAAIC,UAAJ,EAAgB;AACZ,cAAM8B,QAAQ,GACVC,IAAI,CAACC,KAAL,CAAW,CAACL,MAAM,GAAGE,QAAQ,GAAG,GAArB,IAA4BtB,IAAvC,IAA+CA,IADnD;AAEAD,QAAAA,WAAW,CAACsB,KAAZ,GAAoBV,WAAW,CAACY,QAAD,EAAWT,UAAX,CAA/B;AACA;AACH;;AACDf,MAAAA,WAAW,CAACsB,KAAZ,GAAoBtC,SAAS,CAAC;AAC1BuC,QAAAA,QAD0B;AAE1BI,QAAAA,YAAY,EAAE;AAFY,OAAD,CAA7B;AAIA;AACH;;AACD,UAAMC,IAAI,GAAGH,IAAI,CAACC,KAAL,CAAW,CAAC1B,WAAW,CAACsB,KAAb,GAAqBrB,IAAhC,CAAb;AACA,UAAM4B,YAAY,GAAGJ,IAAI,CAACC,KAAL,CACjB,EAAE1B,WAAW,CAACsB,KAAZ,GAAoBX,iBAAiB,CAACW,KAAxC,IAAiDrB,IADhC,CAArB;AAGA,QAAI6B,SAAS,GAAGL,IAAI,CAACM,GAAL,CACZH,IAAI,GAAG,CADK,EAEZH,IAAI,CAACO,GAAL,CAASJ,IAAI,GAAG,CAAhB,EAAmBC,YAAnB,CAFY,CAAhB;;AAIA,QAAI,CAAChC,QAAL,EAAe;AACXiC,MAAAA,SAAS,GAAGL,IAAI,CAACM,GAAL,CAASzB,OAAO,GAAG,CAAnB,EAAsBmB,IAAI,CAACO,GAAL,CAAS,CAAT,EAAYF,SAAZ,CAAtB,CAAZ;AACH;;AAED9B,IAAAA,WAAW,CAACsB,KAAZ,GAAoBV,WAAW,CAAC,CAACkB,SAAD,GAAa7B,IAAd,EAAoBc,UAApB,CAA/B;AACH,GA/BiB,EAgClB,CACIlB,QADJ,EAEIe,WAFJ,EAGIZ,WAHJ,EAIIW,iBAJJ,EAKIV,IALJ,EAMIK,OANJ,EAOIb,aAPJ,EAQIC,UARJ,CAhCkB,CAAtB;AA4CA,QAAMuC,QAAQ,GAAG3D,KAAK,CAACuC,WAAN,CACZM,UAAD,IAAyB;AACrB;;AACA,QAAIA,UAAJ,EAAgB;AACZV,MAAAA,QAAQ,CAACa,KAAT,GAAiB,KAAjB;AACAnB,MAAAA,WAAW,IAAIxB,OAAO,CAACwB,WAAD,CAAP,EAAf;AACH;AACJ,GAPY,EAQb,CAACA,WAAD,EAAcM,QAAd,CARa,CAAjB;AAWA,QAAMyB,WAAW,GAAG5D,KAAK,CAACuC,WAAN,CAAkB,MAAM;AACxC;;AACAJ,IAAAA,QAAQ,CAACa,KAAT,GAAiB,IAAjB;AACAtB,IAAAA,WAAW,CAACsB,KAAZ,GAAoBtC,SAAS,CACzB;AAAEuC,MAAAA,QAAQ,EAAEZ,iBAAiB,CAACW;AAA9B,KADyB,EAEzBW,QAFyB,CAA7B;AAIH,GAPmB,EAOjB,CAACA,QAAD,EAAWtB,iBAAiB,CAACW,KAA7B,EAAoCb,QAApC,EAA8CT,WAA9C,CAPiB,CAApB;AASA,QAAMmC,aAAa,GAAG7D,KAAK,CAACuC,WAAN,CAAkB,MAAM;AAC1C;;AACA,QAAIJ,QAAQ,CAACa,KAAb,EAAoB;AAChB;AACH;;AAED,QAAItB,WAAW,CAACsB,KAAZ,GAAoB,CAAxB,EAA2B;AACvB,UAAIZ,oBAAoB,CAACY,KAArB,GAA6B,CAAjC,EAAoC;AAChCY,QAAAA,WAAW;AACX;AACH;;AACD,UAAI,CAACrC,QAAL,EAAe;AACXG,QAAAA,WAAW,CAACsB,KAAZ,GAAoBV,WAAW,CAAC,CAAD,CAA/B;AACA;AACH;AACJ;;AAED,QAAIZ,WAAW,CAACsB,KAAZ,GAAoB,EAAE,CAAChB,OAAO,GAAG,CAAX,IAAgBL,IAAlB,CAAxB,EAAiD;AAC7C,UAAIS,oBAAoB,CAACY,KAArB,GAA6B,CAAjC,EAAoC;AAChCY,QAAAA,WAAW;AACX;AACH;;AACD,UAAI,CAACrC,QAAL,EAAe;AACXG,QAAAA,WAAW,CAACsB,KAAZ,GAAoBV,WAAW,CAAC,EAAE,CAACN,OAAO,GAAG,CAAX,IAAgBL,IAAlB,CAAD,CAA/B;AACA;AACH;AACJ;AACJ,GA3BqB,EA2BnB,CACCQ,QAAQ,CAACa,KADV,EAECtB,WAFD,EAGCM,OAHD,EAICL,IAJD,EAKCS,oBAAoB,CAACY,KALtB,EAMCzB,QAND,EAOCqC,WAPD,EAQCtB,WARD,CA3BmB,CAAtB;AAsCA/B,EAAAA,mBAAmB,CACf,MAAMmB,WAAW,CAACsB,KADH,EAEf,MAAM;AACF,QAAI,CAAC7B,aAAL,EAAoB;AAChB0C,MAAAA,aAAa;AAChB;AACJ,GANc,EAOf,CAAC1C,aAAD,EAAgB0C,aAAhB,CAPe,CAAnB;AAUA,QAAMC,sBAAsB,GAAGxD,yBAAyB,CAIpD;AACIyD,IAAAA,OAAO,EAAE,CAACC,CAAD,EAAIC,GAAJ,KAAY;AACjB9B,MAAAA,QAAQ,CAACa,KAAT,GAAiB,IAAjB;AACA5C,MAAAA,eAAe,CAACsB,WAAD,CAAf;AACAE,MAAAA,aAAa,IAAIvB,OAAO,CAACuB,aAAD,CAAP,EAAjB;AACAqC,MAAAA,GAAG,CAACP,GAAJ,GAAU,CAAC1B,OAAO,GAAG,CAAX,IAAgBL,IAA1B;AACAsC,MAAAA,GAAG,CAACC,SAAJ,GAAgBxC,WAAW,CAACsB,KAA5B;AACH,KAPL;AAQImB,IAAAA,QAAQ,EAAE,CAACC,CAAD,EAAIH,GAAJ,KAAY;AAClB9B,MAAAA,QAAQ,CAACa,KAAT,GAAiB,IAAjB;AACA,YAAM;AAAEqB,QAAAA,YAAF;AAAgBC,QAAAA;AAAhB,UAAiCF,CAAvC;AACA,UAAIG,cAAc,GAAGrC,YAAY,CAACc,KAAb,GACfqB,YADe,GAEfC,YAFN;;AAIA,UACI,CAAC/C,QAAD,KACCG,WAAW,CAACsB,KAAZ,GAAoB,CAApB,IAAyBtB,WAAW,CAACsB,KAAZ,GAAoB,CAACiB,GAAG,CAACP,GADnD,CADJ,EAGE;AACE,cAAMc,QAAQ,GAAG9C,WAAW,CAACsB,KAAZ,GAAoB,CAApB,GAAwB,CAAxB,GAA4B,CAACiB,GAAG,CAACP,GAAlD;AACA,cAAMe,KAAK,GAAGD,QAAQ,GAAGP,GAAG,CAACC,SAA7B;AACA,cAAMQ,OAAO,GAAGH,cAAc,GAAGE,KAAjC;AACA/C,QAAAA,WAAW,CAACsB,KAAZ,GAAoBwB,QAAQ,GAAGE,OAAO,GAAG,GAAzC;AACA;AACH;;AAEDhD,MAAAA,WAAW,CAACsB,KAAZ,GAAoBiB,GAAG,CAACC,SAAJ,GAAgBK,cAApC;AACH,KA3BL;AA4BII,IAAAA,KAAK,EAAGP,CAAD,IAAO;AACV,YAAM;AAAEQ,QAAAA,SAAF;AAAaC,QAAAA,SAAb;AAAwBR,QAAAA,YAAxB;AAAsCC,QAAAA;AAAtC,UAAuDF,CAA7D;AACA/B,MAAAA,iBAAiB,CAACW,KAAlB,GAA0Bd,YAAY,CAACc,KAAb,GACpB4B,SADoB,GAEpBC,SAFN;AAGAzC,MAAAA,oBAAoB,CAACY,KAArB,GAA6Bd,YAAY,CAACc,KAAb,GACvBqB,YADuB,GAEvBC,YAFN;AAIAxB,MAAAA,aAAa,CAAC,MAAMjB,WAAW,IAAIxB,OAAO,CAACwB,WAAD,CAAP,EAAtB,CAAb;;AAEA,UAAI,CAACN,QAAL,EAAe;AACXY,QAAAA,QAAQ,CAACa,KAAT,GAAiB,KAAjB;AACH;AACJ;AA1CL,GAJoD,EAgDpD,CACI7B,aADJ,EAEIe,YAAY,CAACc,KAFjB,EAGIzB,QAHJ,EAIIS,OAJJ,EAKIL,IALJ,EAMIP,UANJ,EAOIQ,aAPJ,EAQIC,WARJ,CAhDoD,CAAxD;AA4DA,QAAMiD,cAAc,GAAG9E,KAAK,CAAC+E,OAAN,CAAc,MAAM;AACvC,WAAO/D,QAAQ,GAAGgE,MAAM,CAACC,iBAAV,GAA8BD,MAAM,CAACE,eAApD;AACH,GAFsB,EAEpB,CAAClE,QAAD,CAFoB,CAAvB;AAIA,sBACI,oBAAC,QAAD,CAAU,IAAV;AACI,IAAA,KAAK,EAAE,CAACgE,MAAM,CAACG,SAAR,EAAmBL,cAAnB,EAAmC7D,KAAnC,CADX;AAEI,IAAA,YAAY,EAAEa,YAFlB;AAGI,IAAA,UAAU,EAAEC;AAHhB,kBAKI,oBAAC,iBAAD,eACQV,sBADR;AAEI,IAAA,cAAc,EAAEyC;AAFpB,MAIK/C,KAAK,CAACqE,QAJX,CALJ,CADJ;AAcH,CA9OD;;AAgPA,OAAO,MAAMC,iBAAiB,GAAGvE,kBAA1B;AAEP,MAAMkE,MAAM,GAAG/E,UAAU,CAACqF,MAAX,CAAkB;AAC7BH,EAAAA,SAAS,EAAE;AACPI,IAAAA,IAAI,EAAE,CADC;AAEPC,IAAAA,QAAQ,EAAE;AAFH,GADkB;AAK7BN,EAAAA,eAAe,EAAE;AACbO,IAAAA,aAAa,EAAE;AADF,GALY;AAQ7BR,EAAAA,iBAAiB,EAAE;AACfQ,IAAAA,aAAa,EAAE;AADA;AARU,CAAlB,CAAf","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 withTiming,\n} from 'react-native-reanimated';\nimport { Easing } from './constants';\nimport { CTX } from './store';\n\ntype GestureContext = {\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 style,\n data,\n pagingEnabled,\n enableSnap,\n panGestureHandlerProps,\n loop: infinite,\n scrollAnimationDuration,\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 return withTiming(\n toValue,\n {\n duration: scrollAnimationDuration,\n easing: Easing.easeOutQuart,\n },\n (isFinished) => {\n if (isFinished) {\n onFinished?.();\n }\n }\n );\n },\n [scrollAnimationDuration]\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 (enableSnap) {\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 enableSnap,\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 onFinish\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 cancelAnimation(translation);\n onScrollBegin && runOnJS(onScrollBegin)();\n ctx.max = (maxPage - 1) * size;\n ctx.panOffset = translation.value;\n },\n onActive: (e, ctx) => {\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 && runOnJS(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 enableSnap,\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={[styles.container, directionStyle, style]}\n onTouchStart={onTouchBegin}\n onTouchEnd={onTouchEnd}\n >\n <PanGestureHandler\n {...panGestureHandlerProps}\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","style","data","pagingEnabled","enableSnap","panGestureHandlerProps","loop","infinite","scrollAnimationDuration","withAnimation","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","panOffset","onActive","e","translationX","translationY","panTranslation","boundary","fixed","dynamic","onEnd","velocityX","velocityY","directionStyle","useMemo","styles","contentHorizontal","contentVertical","container","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 { WithAnimation } from './types';\nimport { dealWithAnimation } from './utils/dealWithAnimation';\n\ntype GestureContext = {\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 style,\n data,\n pagingEnabled,\n enableSnap,\n panGestureHandlerProps,\n loop: infinite,\n scrollAnimationDuration,\n withAnimation,\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: WithAnimation = {\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 (enableSnap) {\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 enableSnap,\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 onFinish\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 cancelAnimation(translation);\n onScrollBegin && runOnJS(onScrollBegin)();\n ctx.max = (maxPage - 1) * size;\n ctx.panOffset = translation.value;\n },\n onActive: (e, ctx) => {\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 && runOnJS(onScrollEnd)());\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 enableSnap,\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={[styles.container, directionStyle, style]}\n onTouchStart={onTouchBegin}\n onTouchEnd={onTouchEnd}\n >\n <PanGestureHandler\n {...panGestureHandlerProps}\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,11 +1,13 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { Easing } from '../constants';
|
|
3
|
-
import { runOnJS, useSharedValue
|
|
3
|
+
import { runOnJS, useSharedValue } from 'react-native-reanimated';
|
|
4
|
+
import { dealWithAnimation } from '@/utils/dealWithAnimation';
|
|
4
5
|
export function useCarouselController(options) {
|
|
5
6
|
const {
|
|
6
7
|
size,
|
|
7
8
|
loop,
|
|
8
9
|
handlerOffsetX,
|
|
10
|
+
withAnimation,
|
|
9
11
|
disable = false,
|
|
10
12
|
originalLength,
|
|
11
13
|
length,
|
|
@@ -65,17 +67,29 @@ export function useCarouselController(options) {
|
|
|
65
67
|
(_options$onScrollBegi = options.onScrollBegin) === null || _options$onScrollBegi === void 0 ? void 0 : _options$onScrollBegi.call(options);
|
|
66
68
|
}, [options]);
|
|
67
69
|
const scrollWithTiming = React.useCallback((toValue, onFinished) => {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
70
|
+
'worklet';
|
|
71
|
+
|
|
72
|
+
const callback = isFinished => {
|
|
73
|
+
'worklet';
|
|
74
|
+
|
|
72
75
|
if (isFinished) {
|
|
73
76
|
runOnJS(onScrollEnd)();
|
|
74
77
|
onFinished && runOnJS(onFinished)();
|
|
75
78
|
}
|
|
76
|
-
}
|
|
77
|
-
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
const defaultWithAnimation = {
|
|
82
|
+
type: 'timing',
|
|
83
|
+
config: {
|
|
84
|
+
duration,
|
|
85
|
+
easing: Easing.easeOutQuart
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
return dealWithAnimation(withAnimation !== null && withAnimation !== void 0 ? withAnimation : defaultWithAnimation)(toValue, callback);
|
|
89
|
+
}, [duration, withAnimation, onScrollEnd]);
|
|
78
90
|
const next = React.useCallback((opts = {}) => {
|
|
91
|
+
'worklet';
|
|
92
|
+
|
|
79
93
|
const {
|
|
80
94
|
count = 1,
|
|
81
95
|
animated = true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useCarouselController.tsx"],"names":["React","Easing","runOnJS","useSharedValue","withTiming","useCarouselController","options","size","loop","handlerOffsetX","disable","originalLength","length","onChange","duration","index","sharedIndex","useRef","sharedPreIndex","currentFixedPage","useCallback","Math","round","value","fixed","abs","convertToSharedIndex","i","computedIndex","current","toInt","_sharedIndex","getCurrentIndex","canSliding","onScrollEnd","onScrollBegin","scrollWithTiming","toValue","onFinished","easing","easeOutQuart","isFinished","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, withTiming } from 'react-native-reanimated';\nimport type { TCarouselActionOptions } from '../types';\n\ninterface IOpts {\n loop: boolean;\n size: number;\n handlerOffsetX: Animated.SharedValue<number>;\n disable?: boolean;\n duration?: number;\n originalLength: number;\n length: 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 disable = false,\n originalLength,\n length,\n onChange,\n duration,\n } = options;\n\n const index = useSharedValue<number>(0);\n // The Index displayed to the user\n const sharedIndex = React.useRef<number>(0);\n const sharedPreIndex = React.useRef<number>(0);\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 return withTiming(\n toValue,\n { duration, easing: Easing.easeOutQuart },\n (isFinished: boolean) => {\n if (isFinished) {\n runOnJS(onScrollEnd)();\n onFinished && runOnJS(onFinished)();\n }\n }\n );\n },\n [onScrollEnd, duration]\n );\n\n const next = React.useCallback(\n (opts: TCarouselActionOptions = {}) => {\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 );\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","useSharedValue","dealWithAnimation","useCarouselController","options","size","loop","handlerOffsetX","withAnimation","disable","originalLength","length","onChange","duration","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 WithAnimation,\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 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 } = options;\n\n const index = useSharedValue<number>(0);\n // The Index displayed to the user\n const sharedIndex = React.useRef<number>(0);\n const sharedPreIndex = React.useRef<number>(0);\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: WithAnimation = {\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"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { withSpring, withTiming } from 'react-native-reanimated';
|
|
2
|
+
export function dealWithAnimation(withAnimation) {
|
|
3
|
+
'worklet';
|
|
4
|
+
|
|
5
|
+
switch (withAnimation.type) {
|
|
6
|
+
case 'spring':
|
|
7
|
+
return (value, cb) => {
|
|
8
|
+
return withSpring(value, withAnimation.config, isFinished => cb(isFinished));
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
case 'timing':
|
|
12
|
+
return (value, cb) => {
|
|
13
|
+
return withTiming(value, withAnimation.config, isFinished => cb(isFinished));
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=dealWithAnimation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["dealWithAnimation.ts"],"names":["withSpring","withTiming","dealWithAnimation","withAnimation","type","value","cb","config","isFinished"],"mappings":"AACA,SAASA,UAAT,EAAqBC,UAArB,QAAuC,yBAAvC;AAEA,OAAO,SAASC,iBAAT,CACHC,aADG,EAEyD;AAC5D;;AACA,UAAQA,aAAa,CAACC,IAAtB;AACI,SAAK,QAAL;AACI,aAAO,CAACC,KAAD,EAAQC,EAAR,KAAe;AAClB,eAAON,UAAU,CAACK,KAAD,EAAQF,aAAa,CAACI,MAAtB,EAA+BC,UAAD,IAC3CF,EAAE,CAACE,UAAD,CADW,CAAjB;AAGH,OAJD;;AAKJ,SAAK,QAAL;AACI,aAAO,CAACH,KAAD,EAAQC,EAAR,KAAe;AAClB,eAAOL,UAAU,CAACI,KAAD,EAAQF,aAAa,CAACI,MAAtB,EAA+BC,UAAD,IAC3CF,EAAE,CAACE,UAAD,CADW,CAAjB;AAGH,OAJD;AARR;AAcH","sourcesContent":["import type { WithAnimation } from '../types';\nimport { withSpring, withTiming } from 'react-native-reanimated';\n\nexport function dealWithAnimation(\n withAnimation: WithAnimation\n): (value: number, cb: (isFinished: boolean) => void) => number {\n 'worklet';\n switch (withAnimation.type) {\n case 'spring':\n return (value, cb) => {\n return withSpring(value, withAnimation.config, (isFinished) =>\n cb(isFinished)\n );\n };\n case 'timing':\n return (value, cb) => {\n return withTiming(value, withAnimation.config, (isFinished) =>\n cb(isFinished)\n );\n };\n }\n}\n"]}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import type Animated from 'react-native-reanimated';
|
|
3
|
-
import type { TCarouselActionOptions } from '../types';
|
|
3
|
+
import type { TCarouselActionOptions, TCarouselProps } from '../types';
|
|
4
4
|
interface IOpts {
|
|
5
5
|
loop: boolean;
|
|
6
6
|
size: number;
|
|
7
7
|
handlerOffsetX: Animated.SharedValue<number>;
|
|
8
|
+
withAnimation?: TCarouselProps['withAnimation'];
|
|
8
9
|
disable?: boolean;
|
|
9
10
|
duration?: number;
|
|
10
11
|
originalLength: number;
|
|
@@ -35,6 +35,13 @@ export declare type CustomConfig = {
|
|
|
35
35
|
type?: 'negative' | 'positive';
|
|
36
36
|
viewCount?: number;
|
|
37
37
|
};
|
|
38
|
+
export declare type WithAnimation = {
|
|
39
|
+
type: 'spring';
|
|
40
|
+
config: Animated.WithSpringConfig;
|
|
41
|
+
} | {
|
|
42
|
+
type: 'timing';
|
|
43
|
+
config: Animated.WithTimingConfig;
|
|
44
|
+
};
|
|
38
45
|
export declare type TCarouselProps<T = any> = {
|
|
39
46
|
ref?: React.Ref<ICarouselInstance>;
|
|
40
47
|
/**
|
|
@@ -77,7 +84,7 @@ export declare type TCarouselProps<T = any> = {
|
|
|
77
84
|
/**
|
|
78
85
|
* PanGestureHandler props
|
|
79
86
|
*/
|
|
80
|
-
panGestureHandlerProps?: Omit<
|
|
87
|
+
panGestureHandlerProps?: Partial<Omit<PanGestureHandlerProps, 'onHandlerStateChange'>>;
|
|
81
88
|
/**
|
|
82
89
|
* Determines the maximum number of items will respond to pan gesture events,
|
|
83
90
|
* windowSize={11} will active visible item plus up to 5 items above and 5 below the viewpor,
|
|
@@ -96,6 +103,10 @@ export declare type TCarouselProps<T = any> = {
|
|
|
96
103
|
* @default true
|
|
97
104
|
*/
|
|
98
105
|
enableSnap?: boolean;
|
|
106
|
+
/**
|
|
107
|
+
* Specifies the scrolling animation effect.
|
|
108
|
+
*/
|
|
109
|
+
withAnimation?: WithAnimation;
|
|
99
110
|
/**
|
|
100
111
|
* Custom carousel config.
|
|
101
112
|
*/
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-reanimated-carousel",
|
|
3
|
-
"version": "2.2.
|
|
3
|
+
"version": "2.2.5-beta.0",
|
|
4
4
|
"description": "Simple carousel component.fully implemented using Reanimated 2.Infinitely scrolling, very smooth.",
|
|
5
5
|
"main": "lib/commonjs/index",
|
|
6
6
|
"module": "lib/module/index",
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
"lint": "eslint \"src/**/*.{js,ts,tsx}\"",
|
|
29
29
|
"prepare": "bob build",
|
|
30
30
|
"release": "release-it --no-git.requireUpstream",
|
|
31
|
+
"preRelease": "release-it --no-git.requireUpstream --preRelease=beta",
|
|
31
32
|
"ios": "yarn --cwd example ios",
|
|
32
33
|
"ios:pretty": "yarn --cwd example ios:pretty",
|
|
33
34
|
"web": "yarn --cwd example web",
|
|
@@ -60,6 +61,7 @@
|
|
|
60
61
|
"@types/jest": "^26.0.0",
|
|
61
62
|
"@types/react": "^16.9.19",
|
|
62
63
|
"@types/react-native": "0.62.13",
|
|
64
|
+
"babel-plugin-module-resolver": "^4.1.0",
|
|
63
65
|
"commitlint": "^11.0.0",
|
|
64
66
|
"cz-conventional-changelog": "^3.3.0",
|
|
65
67
|
"eslint": "^7.2.0",
|
package/src/Carousel.tsx
CHANGED
|
@@ -35,6 +35,7 @@ const Carousel = React.forwardRef<ICarouselInstance, TCarouselProps<any>>(
|
|
|
35
35
|
autoPlayReverse,
|
|
36
36
|
autoPlayInterval,
|
|
37
37
|
scrollAnimationDuration,
|
|
38
|
+
withAnimation,
|
|
38
39
|
renderItem,
|
|
39
40
|
onScrollEnd,
|
|
40
41
|
onSnapToItem,
|
|
@@ -65,6 +66,7 @@ const Carousel = React.forwardRef<ICarouselInstance, TCarouselProps<any>>(
|
|
|
65
66
|
handlerOffsetX,
|
|
66
67
|
length: data.length,
|
|
67
68
|
disable: !data.length,
|
|
69
|
+
withAnimation,
|
|
68
70
|
originalLength: data.length,
|
|
69
71
|
onScrollEnd: () => runOnJS(_onScrollEnd)(),
|
|
70
72
|
onScrollBegin: () => !!onScrollBegin && runOnJS(onScrollBegin)(),
|
|
@@ -12,10 +12,11 @@ import Animated, {
|
|
|
12
12
|
useDerivedValue,
|
|
13
13
|
useSharedValue,
|
|
14
14
|
withDecay,
|
|
15
|
-
withTiming,
|
|
16
15
|
} from 'react-native-reanimated';
|
|
17
16
|
import { Easing } from './constants';
|
|
18
17
|
import { CTX } from './store';
|
|
18
|
+
import type { WithAnimation } from './types';
|
|
19
|
+
import { dealWithAnimation } from './utils/dealWithAnimation';
|
|
19
20
|
|
|
20
21
|
type GestureContext = {
|
|
21
22
|
panOffset: number;
|
|
@@ -44,6 +45,7 @@ const IScrollViewGesture: React.FC<Props> = (props) => {
|
|
|
44
45
|
panGestureHandlerProps,
|
|
45
46
|
loop: infinite,
|
|
46
47
|
scrollAnimationDuration,
|
|
48
|
+
withAnimation,
|
|
47
49
|
},
|
|
48
50
|
} = React.useContext(CTX);
|
|
49
51
|
|
|
@@ -65,20 +67,27 @@ const IScrollViewGesture: React.FC<Props> = (props) => {
|
|
|
65
67
|
const _withSpring = React.useCallback(
|
|
66
68
|
(toValue: number, onFinished?: () => void) => {
|
|
67
69
|
'worklet';
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
{
|
|
70
|
+
const callback = (isFinished: boolean) => {
|
|
71
|
+
'worklet';
|
|
72
|
+
if (isFinished) {
|
|
73
|
+
onFinished && runOnJS(onFinished)();
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
const defaultWithAnimation: WithAnimation = {
|
|
78
|
+
type: 'timing',
|
|
79
|
+
config: {
|
|
71
80
|
duration: scrollAnimationDuration,
|
|
72
81
|
easing: Easing.easeOutQuart,
|
|
73
82
|
},
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
return dealWithAnimation(withAnimation ?? defaultWithAnimation)(
|
|
86
|
+
toValue,
|
|
87
|
+
callback
|
|
79
88
|
);
|
|
80
89
|
},
|
|
81
|
-
[scrollAnimationDuration]
|
|
90
|
+
[scrollAnimationDuration, withAnimation]
|
|
82
91
|
);
|
|
83
92
|
|
|
84
93
|
const endWithSpring = React.useCallback(
|
|
@@ -234,7 +243,8 @@ const IScrollViewGesture: React.FC<Props> = (props) => {
|
|
|
234
243
|
? translationX
|
|
235
244
|
: translationY;
|
|
236
245
|
|
|
237
|
-
endWithSpring(() => onScrollEnd && runOnJS(onScrollEnd)());
|
|
246
|
+
// endWithSpring(() => onScrollEnd && runOnJS(onScrollEnd)());
|
|
247
|
+
endWithSpring(onScrollEnd);
|
|
238
248
|
|
|
239
249
|
if (!infinite) {
|
|
240
250
|
touching.value = false;
|
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import type Animated from 'react-native-reanimated';
|
|
3
3
|
import { Easing } from '../constants';
|
|
4
|
-
import { runOnJS, useSharedValue
|
|
5
|
-
import type {
|
|
4
|
+
import { runOnJS, useSharedValue } from 'react-native-reanimated';
|
|
5
|
+
import type {
|
|
6
|
+
TCarouselActionOptions,
|
|
7
|
+
TCarouselProps,
|
|
8
|
+
WithAnimation,
|
|
9
|
+
} from '../types';
|
|
10
|
+
import { dealWithAnimation } from '@/utils/dealWithAnimation';
|
|
6
11
|
|
|
7
12
|
interface IOpts {
|
|
8
13
|
loop: boolean;
|
|
9
14
|
size: number;
|
|
10
15
|
handlerOffsetX: Animated.SharedValue<number>;
|
|
16
|
+
withAnimation?: TCarouselProps['withAnimation'];
|
|
11
17
|
disable?: boolean;
|
|
12
18
|
duration?: number;
|
|
13
19
|
originalLength: number;
|
|
@@ -36,6 +42,7 @@ export function useCarouselController(options: IOpts): ICarouselController {
|
|
|
36
42
|
size,
|
|
37
43
|
loop,
|
|
38
44
|
handlerOffsetX,
|
|
45
|
+
withAnimation,
|
|
39
46
|
disable = false,
|
|
40
47
|
originalLength,
|
|
41
48
|
length,
|
|
@@ -116,22 +123,31 @@ export function useCarouselController(options: IOpts): ICarouselController {
|
|
|
116
123
|
|
|
117
124
|
const scrollWithTiming = React.useCallback(
|
|
118
125
|
(toValue: number, onFinished?: () => void) => {
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
(isFinished
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
onFinished && runOnJS(onFinished)();
|
|
126
|
-
}
|
|
126
|
+
'worklet';
|
|
127
|
+
const callback = (isFinished: boolean) => {
|
|
128
|
+
'worklet';
|
|
129
|
+
if (isFinished) {
|
|
130
|
+
runOnJS(onScrollEnd)();
|
|
131
|
+
onFinished && runOnJS(onFinished)();
|
|
127
132
|
}
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
const defaultWithAnimation: WithAnimation = {
|
|
136
|
+
type: 'timing',
|
|
137
|
+
config: { duration, easing: Easing.easeOutQuart },
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
return dealWithAnimation(withAnimation ?? defaultWithAnimation)(
|
|
141
|
+
toValue,
|
|
142
|
+
callback
|
|
128
143
|
);
|
|
129
144
|
},
|
|
130
|
-
[
|
|
145
|
+
[duration, withAnimation, onScrollEnd]
|
|
131
146
|
);
|
|
132
147
|
|
|
133
148
|
const next = React.useCallback(
|
|
134
149
|
(opts: TCarouselActionOptions = {}) => {
|
|
150
|
+
'worklet';
|
|
135
151
|
const { count = 1, animated = true, onFinished } = opts;
|
|
136
152
|
if (!canSliding() || (!loop && index.value >= length - 1)) return;
|
|
137
153
|
|
|
@@ -144,7 +160,7 @@ export function useCarouselController(options: IOpts): ICarouselController {
|
|
|
144
160
|
handlerOffsetX.value = scrollWithTiming(
|
|
145
161
|
-nextPage * size,
|
|
146
162
|
onFinished
|
|
147
|
-
);
|
|
163
|
+
) as any;
|
|
148
164
|
} else {
|
|
149
165
|
handlerOffsetX.value = -nextPage * size;
|
|
150
166
|
onFinished?.();
|
package/src/types.ts
CHANGED
|
@@ -41,6 +41,16 @@ export type CustomConfig = {
|
|
|
41
41
|
viewCount?: number;
|
|
42
42
|
};
|
|
43
43
|
|
|
44
|
+
export type WithAnimation =
|
|
45
|
+
| {
|
|
46
|
+
type: 'spring';
|
|
47
|
+
config: Animated.WithSpringConfig;
|
|
48
|
+
}
|
|
49
|
+
| {
|
|
50
|
+
type: 'timing';
|
|
51
|
+
config: Animated.WithTimingConfig;
|
|
52
|
+
};
|
|
53
|
+
|
|
44
54
|
export type TCarouselProps<T = any> = {
|
|
45
55
|
ref?: React.Ref<ICarouselInstance>;
|
|
46
56
|
/**
|
|
@@ -83,9 +93,8 @@ export type TCarouselProps<T = any> = {
|
|
|
83
93
|
/**
|
|
84
94
|
* PanGestureHandler props
|
|
85
95
|
*/
|
|
86
|
-
panGestureHandlerProps?:
|
|
87
|
-
|
|
88
|
-
'onHandlerStateChange'
|
|
96
|
+
panGestureHandlerProps?: Partial<
|
|
97
|
+
Omit<PanGestureHandlerProps, 'onHandlerStateChange'>
|
|
89
98
|
>;
|
|
90
99
|
/**
|
|
91
100
|
* Determines the maximum number of items will respond to pan gesture events,
|
|
@@ -105,6 +114,10 @@ export type TCarouselProps<T = any> = {
|
|
|
105
114
|
* @default true
|
|
106
115
|
*/
|
|
107
116
|
enableSnap?: boolean;
|
|
117
|
+
/**
|
|
118
|
+
* Specifies the scrolling animation effect.
|
|
119
|
+
*/
|
|
120
|
+
withAnimation?: WithAnimation;
|
|
108
121
|
/**
|
|
109
122
|
* Custom carousel config.
|
|
110
123
|
*/
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { WithAnimation } from '../types';
|
|
2
|
+
import { withSpring, withTiming } from 'react-native-reanimated';
|
|
3
|
+
|
|
4
|
+
export function dealWithAnimation(
|
|
5
|
+
withAnimation: WithAnimation
|
|
6
|
+
): (value: number, cb: (isFinished: boolean) => void) => number {
|
|
7
|
+
'worklet';
|
|
8
|
+
switch (withAnimation.type) {
|
|
9
|
+
case 'spring':
|
|
10
|
+
return (value, cb) => {
|
|
11
|
+
return withSpring(value, withAnimation.config, (isFinished) =>
|
|
12
|
+
cb(isFinished)
|
|
13
|
+
);
|
|
14
|
+
};
|
|
15
|
+
case 'timing':
|
|
16
|
+
return (value, cb) => {
|
|
17
|
+
return withTiming(value, withAnimation.config, (isFinished) =>
|
|
18
|
+
cb(isFinished)
|
|
19
|
+
);
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
}
|