react-native-reanimated-carousel 2.1.1 → 2.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -6
- package/README.zh-CN.md +10 -4
- package/lib/commonjs/Carousel.js +26 -17
- package/lib/commonjs/Carousel.js.map +1 -1
- package/lib/commonjs/ScrollViewGesture.js +34 -22
- package/lib/commonjs/ScrollViewGesture.js.map +1 -1
- package/lib/commonjs/hooks/useAutoPlay.js +27 -13
- package/lib/commonjs/hooks/useAutoPlay.js.map +1 -1
- package/lib/commonjs/hooks/useCarouselController.js +84 -24
- package/lib/commonjs/hooks/useCarouselController.js.map +1 -1
- package/lib/commonjs/hooks/useInitProps.js +13 -9
- package/lib/commonjs/hooks/useInitProps.js.map +1 -1
- package/lib/commonjs/hooks/useOnProgressChange.js +5 -5
- package/lib/commonjs/hooks/useOnProgressChange.js.map +1 -1
- package/lib/commonjs/layouts/normal.js +1 -1
- package/lib/commonjs/layouts/normal.js.map +1 -1
- package/lib/module/Carousel.js +23 -16
- package/lib/module/Carousel.js.map +1 -1
- package/lib/module/ScrollViewGesture.js +32 -22
- package/lib/module/ScrollViewGesture.js.map +1 -1
- package/lib/module/hooks/useAutoPlay.js +27 -13
- package/lib/module/hooks/useAutoPlay.js.map +1 -1
- package/lib/module/hooks/useCarouselController.js +82 -24
- package/lib/module/hooks/useCarouselController.js.map +1 -1
- package/lib/module/hooks/useInitProps.js +13 -9
- package/lib/module/hooks/useInitProps.js.map +1 -1
- package/lib/module/hooks/useOnProgressChange.js +5 -5
- package/lib/module/hooks/useOnProgressChange.js.map +1 -1
- package/lib/module/layouts/normal.js +2 -2
- package/lib/module/layouts/normal.js.map +1 -1
- package/lib/typescript/ScrollViewGesture.d.ts +3 -1
- package/lib/typescript/hooks/useAutoPlay.d.ts +1 -1
- package/lib/typescript/hooks/useCarouselController.d.ts +5 -3
- package/lib/typescript/hooks/useInitProps.d.ts +4 -5
- package/lib/typescript/hooks/useOnProgressChange.d.ts +2 -1
- package/lib/typescript/types.d.ts +22 -4
- package/package.json +5 -2
- package/src/Carousel.tsx +26 -15
- package/src/ScrollViewGesture.tsx +57 -26
- package/src/hooks/useAutoPlay.ts +25 -22
- package/src/hooks/useCarouselController.tsx +101 -42
- package/src/hooks/useInitProps.ts +30 -15
- package/src/hooks/useOnProgressChange.ts +7 -6
- package/src/layouts/normal.ts +2 -7
- package/src/types.ts +23 -4
- package/CHANGELOG.md +0 -353
- package/lib/commonjs/hooks/useIndexController.js +0 -65
- package/lib/commonjs/hooks/useIndexController.js.map +0 -1
- package/lib/module/hooks/useIndexController.js +0 -52
- package/lib/module/hooks/useIndexController.js.map +0 -1
- package/lib/typescript/hooks/useIndexController.d.ts +0 -18
- package/src/.DS_Store +0 -0
- package/src/hooks/useIndexController.ts +0 -78
|
@@ -17,14 +17,16 @@ const IScrollViewGesture = props => {
|
|
|
17
17
|
enableSnap,
|
|
18
18
|
panGestureHandlerProps,
|
|
19
19
|
loop: infinite,
|
|
20
|
-
|
|
20
|
+
scrollAnimationDuration
|
|
21
21
|
}
|
|
22
22
|
} = React.useContext(CTX);
|
|
23
23
|
const {
|
|
24
24
|
translation,
|
|
25
|
+
size,
|
|
25
26
|
onScrollBegin,
|
|
26
27
|
onScrollEnd,
|
|
27
|
-
|
|
28
|
+
onTouchBegin,
|
|
29
|
+
onTouchEnd
|
|
28
30
|
} = props;
|
|
29
31
|
const maxPage = data.length;
|
|
30
32
|
const isHorizontal = useDerivedValue(() => !vertical, [vertical]);
|
|
@@ -36,14 +38,14 @@ const IScrollViewGesture = props => {
|
|
|
36
38
|
'worklet';
|
|
37
39
|
|
|
38
40
|
return withTiming(toValue, {
|
|
39
|
-
duration:
|
|
41
|
+
duration: scrollAnimationDuration,
|
|
40
42
|
easing: Easing.easeOutQuart
|
|
41
43
|
}, isFinished => {
|
|
42
44
|
if (isFinished) {
|
|
43
45
|
onFinished === null || onFinished === void 0 ? void 0 : onFinished();
|
|
44
46
|
}
|
|
45
47
|
});
|
|
46
|
-
}, [
|
|
48
|
+
}, [scrollAnimationDuration]);
|
|
47
49
|
|
|
48
50
|
const endWithSpring = React.useCallback(onFinished => {
|
|
49
51
|
'worklet';
|
|
@@ -75,22 +77,24 @@ const IScrollViewGesture = props => {
|
|
|
75
77
|
|
|
76
78
|
translation.value = _withSpring(-finalPage * size, onFinished);
|
|
77
79
|
}, [infinite, _withSpring, translation, scrollEndVelocity, size, maxPage, pagingEnabled, enableSnap]);
|
|
78
|
-
const
|
|
80
|
+
const onFinish = React.useCallback(isFinished => {
|
|
79
81
|
'worklet';
|
|
80
82
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
83
|
+
if (isFinished) {
|
|
84
|
+
touching.value = false;
|
|
85
|
+
onScrollEnd && runOnJS(onScrollEnd)();
|
|
86
|
+
}
|
|
87
|
+
}, [onScrollEnd, touching]);
|
|
88
|
+
const activeDecay = React.useCallback(() => {
|
|
89
|
+
'worklet';
|
|
87
90
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
91
|
+
touching.value = true;
|
|
92
|
+
translation.value = withDecay({
|
|
93
|
+
velocity: scrollEndVelocity.value
|
|
94
|
+
}, onFinish);
|
|
95
|
+
}, [onFinish, scrollEndVelocity.value, touching, translation]);
|
|
96
|
+
const resetBoundary = React.useCallback(() => {
|
|
97
|
+
'worklet';
|
|
94
98
|
|
|
95
99
|
if (touching.value) {
|
|
96
100
|
return;
|
|
@@ -119,12 +123,12 @@ const IScrollViewGesture = props => {
|
|
|
119
123
|
return;
|
|
120
124
|
}
|
|
121
125
|
}
|
|
122
|
-
}, [
|
|
126
|
+
}, [touching.value, translation, maxPage, size, scrollEndTranslation.value, infinite, activeDecay, _withSpring]);
|
|
123
127
|
useAnimatedReaction(() => translation.value, () => {
|
|
124
128
|
if (!pagingEnabled) {
|
|
125
129
|
resetBoundary();
|
|
126
130
|
}
|
|
127
|
-
}, [pagingEnabled]);
|
|
131
|
+
}, [pagingEnabled, resetBoundary]);
|
|
128
132
|
const panGestureEventHandler = useAnimatedGestureHandler({
|
|
129
133
|
onStart: (_, ctx) => {
|
|
130
134
|
touching.value = true;
|
|
@@ -142,7 +146,11 @@ const IScrollViewGesture = props => {
|
|
|
142
146
|
let panTranslation = isHorizontal.value ? translationX : translationY;
|
|
143
147
|
|
|
144
148
|
if (!infinite && (translation.value > 0 || translation.value < -ctx.max)) {
|
|
145
|
-
|
|
149
|
+
const boundary = translation.value > 0 ? 0 : -ctx.max;
|
|
150
|
+
const fixed = boundary - ctx.panOffset;
|
|
151
|
+
const dynamic = panTranslation - fixed;
|
|
152
|
+
translation.value = boundary + dynamic * 0.5;
|
|
153
|
+
return;
|
|
146
154
|
}
|
|
147
155
|
|
|
148
156
|
translation.value = ctx.panOffset + panTranslation;
|
|
@@ -162,12 +170,14 @@ const IScrollViewGesture = props => {
|
|
|
162
170
|
touching.value = false;
|
|
163
171
|
}
|
|
164
172
|
}
|
|
165
|
-
}, [pagingEnabled, isHorizontal.value, infinite, maxPage, size, enableSnap]);
|
|
173
|
+
}, [pagingEnabled, isHorizontal.value, infinite, maxPage, size, enableSnap, onScrollBegin, onScrollEnd]);
|
|
166
174
|
const directionStyle = React.useMemo(() => {
|
|
167
175
|
return vertical ? styles.contentHorizontal : styles.contentVertical;
|
|
168
176
|
}, [vertical]);
|
|
169
177
|
return /*#__PURE__*/React.createElement(Animated.View, {
|
|
170
|
-
style: [styles.container, directionStyle, style]
|
|
178
|
+
style: [styles.container, directionStyle, style],
|
|
179
|
+
onTouchStart: onTouchBegin,
|
|
180
|
+
onTouchEnd: onTouchEnd
|
|
171
181
|
}, /*#__PURE__*/React.createElement(PanGestureHandler, _extends({}, panGestureHandlerProps, {
|
|
172
182
|
onGestureEvent: panGestureEventHandler
|
|
173
183
|
}), props.children));
|
|
@@ -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","autoPlayInterval","useContext","translation","onScrollBegin","onScrollEnd","size","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","resetBoundary","onFinish","activeDecay","panGestureEventHandler","onStart","_","ctx","panOffset","onActive","e","translationX","translationY","panTranslation","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 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 onScrollEnd?: () => void;\n onScrollBegin?: () => 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 autoPlayInterval,\n },\n } = React.useContext(CTX);\n\n const { translation, onScrollBegin, onScrollEnd, size } = 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: autoPlayInterval,\n easing: Easing.easeOutQuart,\n },\n (isFinished) => {\n if (isFinished) {\n onFinished?.();\n }\n }\n );\n },\n [autoPlayInterval]\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 resetBoundary = React.useCallback(() => {\n 'worklet';\n const onFinish = (isFinished: boolean) => {\n if (isFinished) {\n touching.value = false;\n onScrollEnd && runOnJS(onScrollEnd)();\n }\n };\n const activeDecay = () => {\n touching.value = true;\n translation.value = withDecay(\n { velocity: scrollEndVelocity.value },\n onFinish\n );\n };\n\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 infinite,\n touching,\n _withSpring,\n translation,\n scrollEndTranslation,\n scrollEndVelocity,\n onScrollEnd,\n maxPage,\n size,\n ]);\n\n useAnimatedReaction(\n () => translation.value,\n () => {\n if (!pagingEnabled) {\n resetBoundary();\n }\n },\n [pagingEnabled]\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 panTranslation = panTranslation * 0.5;\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 [pagingEnabled, isHorizontal.value, infinite, maxPage, size, enableSnap]\n );\n\n const directionStyle = React.useMemo(() => {\n return vertical ? styles.contentHorizontal : styles.contentVertical;\n }, [vertical]);\n\n return (\n <Animated.View style={[styles.container, directionStyle, style]}>\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","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":"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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"]}
|
|
@@ -7,34 +7,48 @@ export function useAutoPlay(opts) {
|
|
|
7
7
|
carouselController
|
|
8
8
|
} = opts;
|
|
9
9
|
const timer = React.useRef();
|
|
10
|
+
const stopped = React.useRef(!autoPlay);
|
|
11
|
+
const play = React.useCallback(() => {
|
|
12
|
+
if (stopped.current) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
timer.current = setTimeout(() => {
|
|
17
|
+
autoPlayReverse ? carouselController.prev({
|
|
18
|
+
onFinished: play
|
|
19
|
+
}) : carouselController.next({
|
|
20
|
+
onFinished: play
|
|
21
|
+
});
|
|
22
|
+
}, autoPlayInterval);
|
|
23
|
+
}, [autoPlayReverse, autoPlayInterval, carouselController]);
|
|
10
24
|
const pause = React.useCallback(() => {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const run = React.useCallback(() => {
|
|
14
|
-
if (timer.current) {
|
|
15
|
-
pause();
|
|
25
|
+
if (!autoPlay) {
|
|
26
|
+
return;
|
|
16
27
|
}
|
|
17
28
|
|
|
29
|
+
timer.current && clearInterval(timer.current);
|
|
30
|
+
stopped.current = true;
|
|
31
|
+
}, [autoPlay]);
|
|
32
|
+
const start = React.useCallback(() => {
|
|
18
33
|
if (!autoPlay) {
|
|
19
34
|
return;
|
|
20
35
|
}
|
|
21
36
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}, [pause, autoPlay, autoPlayReverse, autoPlayInterval, carouselController]);
|
|
37
|
+
stopped.current = false;
|
|
38
|
+
play();
|
|
39
|
+
}, [play, autoPlay]);
|
|
26
40
|
React.useEffect(() => {
|
|
27
41
|
if (autoPlay) {
|
|
28
|
-
|
|
42
|
+
start();
|
|
29
43
|
} else {
|
|
30
44
|
pause();
|
|
31
45
|
}
|
|
32
46
|
|
|
33
47
|
return pause;
|
|
34
|
-
}, [
|
|
48
|
+
}, [pause, start, autoPlay]);
|
|
35
49
|
return {
|
|
36
|
-
|
|
37
|
-
|
|
50
|
+
pause,
|
|
51
|
+
start
|
|
38
52
|
};
|
|
39
53
|
}
|
|
40
54
|
//# sourceMappingURL=useAutoPlay.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useAutoPlay.ts"],"names":["React","useAutoPlay","opts","autoPlay","autoPlayReverse","autoPlayInterval","carouselController","timer","useRef","
|
|
1
|
+
{"version":3,"sources":["useAutoPlay.ts"],"names":["React","useAutoPlay","opts","autoPlay","autoPlayReverse","autoPlayInterval","carouselController","timer","useRef","stopped","play","useCallback","current","setTimeout","prev","onFinished","next","pause","clearInterval","start","useEffect"],"mappings":"AAAA,OAAO,KAAKA,KAAZ,MAAuB,OAAvB;AAGA,OAAO,SAASC,WAAT,CAAqBC,IAArB,EAKJ;AACC,QAAM;AACFC,IAAAA,QAAQ,GAAG,KADT;AAEFC,IAAAA,eAAe,GAAG,KAFhB;AAGFC,IAAAA,gBAHE;AAIFC,IAAAA;AAJE,MAKFJ,IALJ;AAOA,QAAMK,KAAK,GAAGP,KAAK,CAACQ,MAAN,EAAd;AACA,QAAMC,OAAO,GAAGT,KAAK,CAACQ,MAAN,CAAsB,CAACL,QAAvB,CAAhB;AAEA,QAAMO,IAAI,GAAGV,KAAK,CAACW,WAAN,CAAkB,MAAM;AACjC,QAAIF,OAAO,CAACG,OAAZ,EAAqB;AACjB;AACH;;AAEDL,IAAAA,KAAK,CAACK,OAAN,GAAgBC,UAAU,CAAC,MAAM;AAC7BT,MAAAA,eAAe,GACTE,kBAAkB,CAACQ,IAAnB,CAAwB;AAAEC,QAAAA,UAAU,EAAEL;AAAd,OAAxB,CADS,GAETJ,kBAAkB,CAACU,IAAnB,CAAwB;AAAED,QAAAA,UAAU,EAAEL;AAAd,OAAxB,CAFN;AAGH,KAJyB,EAIvBL,gBAJuB,CAA1B;AAKH,GAVY,EAUV,CAACD,eAAD,EAAkBC,gBAAlB,EAAoCC,kBAApC,CAVU,CAAb;AAYA,QAAMW,KAAK,GAAGjB,KAAK,CAACW,WAAN,CAAkB,MAAM;AAClC,QAAI,CAACR,QAAL,EAAe;AACX;AACH;;AACDI,IAAAA,KAAK,CAACK,OAAN,IAAiBM,aAAa,CAACX,KAAK,CAACK,OAAP,CAA9B;AACAH,IAAAA,OAAO,CAACG,OAAR,GAAkB,IAAlB;AACH,GANa,EAMX,CAACT,QAAD,CANW,CAAd;AAQA,QAAMgB,KAAK,GAAGnB,KAAK,CAACW,WAAN,CAAkB,MAAM;AAClC,QAAI,CAACR,QAAL,EAAe;AACX;AACH;;AACDM,IAAAA,OAAO,CAACG,OAAR,GAAkB,KAAlB;AACAF,IAAAA,IAAI;AACP,GANa,EAMX,CAACA,IAAD,EAAOP,QAAP,CANW,CAAd;AAQAH,EAAAA,KAAK,CAACoB,SAAN,CAAgB,MAAM;AAClB,QAAIjB,QAAJ,EAAc;AACVgB,MAAAA,KAAK;AACR,KAFD,MAEO;AACHF,MAAAA,KAAK;AACR;;AACD,WAAOA,KAAP;AACH,GAPD,EAOG,CAACA,KAAD,EAAQE,KAAR,EAAehB,QAAf,CAPH;AASA,SAAO;AACHc,IAAAA,KADG;AAEHE,IAAAA;AAFG,GAAP;AAIH","sourcesContent":["import * as React from 'react';\nimport type { ICarouselController } from './useCarouselController';\n\nexport function useAutoPlay(opts: {\n autoPlay?: boolean;\n autoPlayInterval?: number;\n autoPlayReverse?: boolean;\n carouselController: ICarouselController;\n}) {\n const {\n autoPlay = false,\n autoPlayReverse = false,\n autoPlayInterval,\n carouselController,\n } = opts;\n\n const timer = React.useRef<NodeJS.Timer>();\n const stopped = React.useRef<boolean>(!autoPlay);\n\n const play = React.useCallback(() => {\n if (stopped.current) {\n return;\n }\n\n timer.current = setTimeout(() => {\n autoPlayReverse\n ? carouselController.prev({ onFinished: play })\n : carouselController.next({ onFinished: play });\n }, autoPlayInterval);\n }, [autoPlayReverse, autoPlayInterval, carouselController]);\n\n const pause = React.useCallback(() => {\n if (!autoPlay) {\n return;\n }\n timer.current && clearInterval(timer.current);\n stopped.current = true;\n }, [autoPlay]);\n\n const start = React.useCallback(() => {\n if (!autoPlay) {\n return;\n }\n stopped.current = false;\n play();\n }, [play, autoPlay]);\n\n React.useEffect(() => {\n if (autoPlay) {\n start();\n } else {\n pause();\n }\n return pause;\n }, [pause, start, autoPlay]);\n\n return {\n pause,\n start,\n };\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { Easing } from '../constants';
|
|
3
3
|
import { runOnJS, useSharedValue, withTiming } from 'react-native-reanimated';
|
|
4
|
-
export function useCarouselController(
|
|
4
|
+
export function useCarouselController(options) {
|
|
5
5
|
const {
|
|
6
6
|
size,
|
|
7
7
|
loop,
|
|
@@ -11,11 +11,19 @@ export function useCarouselController(opts) {
|
|
|
11
11
|
length,
|
|
12
12
|
onChange,
|
|
13
13
|
duration
|
|
14
|
-
} =
|
|
14
|
+
} = options;
|
|
15
15
|
const index = useSharedValue(0); // The Index displayed to the user
|
|
16
16
|
|
|
17
17
|
const sharedIndex = React.useRef(0);
|
|
18
18
|
const sharedPreIndex = React.useRef(0);
|
|
19
|
+
const currentFixedPage = React.useCallback(() => {
|
|
20
|
+
if (loop) {
|
|
21
|
+
return -Math.round(handlerOffsetX.value / size);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const fixed = handlerOffsetX.value / size % length;
|
|
25
|
+
return Math.round(handlerOffsetX.value <= 0 ? Math.abs(fixed) : Math.abs(fixed > 0 ? length - fixed : 0));
|
|
26
|
+
}, [handlerOffsetX, length, size, loop]);
|
|
19
27
|
const convertToSharedIndex = React.useCallback(i => {
|
|
20
28
|
if (loop) {
|
|
21
29
|
switch (originalLength) {
|
|
@@ -47,39 +55,62 @@ export function useCarouselController(opts) {
|
|
|
47
55
|
return !disable;
|
|
48
56
|
}, [disable]);
|
|
49
57
|
const onScrollEnd = React.useCallback(() => {
|
|
50
|
-
var
|
|
58
|
+
var _options$onScrollEnd;
|
|
51
59
|
|
|
52
|
-
(
|
|
53
|
-
}, [
|
|
60
|
+
(_options$onScrollEnd = options.onScrollEnd) === null || _options$onScrollEnd === void 0 ? void 0 : _options$onScrollEnd.call(options);
|
|
61
|
+
}, [options]);
|
|
54
62
|
const onScrollBegin = React.useCallback(() => {
|
|
55
|
-
var
|
|
63
|
+
var _options$onScrollBegi;
|
|
56
64
|
|
|
57
|
-
(
|
|
58
|
-
}, [
|
|
59
|
-
const scrollWithTiming = React.useCallback((toValue,
|
|
65
|
+
(_options$onScrollBegi = options.onScrollBegin) === null || _options$onScrollBegi === void 0 ? void 0 : _options$onScrollBegi.call(options);
|
|
66
|
+
}, [options]);
|
|
67
|
+
const scrollWithTiming = React.useCallback((toValue, onFinished) => {
|
|
60
68
|
return withTiming(toValue, {
|
|
61
69
|
duration,
|
|
62
70
|
easing: Easing.easeOutQuart
|
|
63
71
|
}, isFinished => {
|
|
64
|
-
callback === null || callback === void 0 ? void 0 : callback();
|
|
65
|
-
|
|
66
72
|
if (isFinished) {
|
|
67
73
|
runOnJS(onScrollEnd)();
|
|
74
|
+
onFinished && runOnJS(onFinished)();
|
|
68
75
|
}
|
|
69
76
|
});
|
|
70
77
|
}, [onScrollEnd, duration]);
|
|
71
|
-
const next = React.useCallback(() => {
|
|
72
|
-
|
|
78
|
+
const next = React.useCallback((opts = {}) => {
|
|
79
|
+
const {
|
|
80
|
+
count = 1,
|
|
81
|
+
animated = true,
|
|
82
|
+
onFinished
|
|
83
|
+
} = opts;
|
|
84
|
+
if (!canSliding() || !loop && index.value >= length - 1) return;
|
|
73
85
|
onScrollBegin === null || onScrollBegin === void 0 ? void 0 : onScrollBegin();
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
86
|
+
const nextPage = currentFixedPage() + count;
|
|
87
|
+
index.value = nextPage;
|
|
88
|
+
|
|
89
|
+
if (animated) {
|
|
90
|
+
handlerOffsetX.value = scrollWithTiming(-nextPage * size, onFinished);
|
|
91
|
+
} else {
|
|
92
|
+
handlerOffsetX.value = -nextPage * size;
|
|
93
|
+
onFinished === null || onFinished === void 0 ? void 0 : onFinished();
|
|
94
|
+
}
|
|
95
|
+
}, [canSliding, loop, index, length, onScrollBegin, handlerOffsetX, size, scrollWithTiming, currentFixedPage]);
|
|
96
|
+
const prev = React.useCallback((opts = {}) => {
|
|
97
|
+
const {
|
|
98
|
+
count = 1,
|
|
99
|
+
animated = true,
|
|
100
|
+
onFinished
|
|
101
|
+
} = opts;
|
|
102
|
+
if (!canSliding() || !loop && index.value <= 0) return;
|
|
79
103
|
onScrollBegin === null || onScrollBegin === void 0 ? void 0 : onScrollBegin();
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
104
|
+
const prevPage = currentFixedPage() - count;
|
|
105
|
+
index.value = prevPage;
|
|
106
|
+
|
|
107
|
+
if (animated) {
|
|
108
|
+
handlerOffsetX.value = scrollWithTiming(-prevPage * size, onFinished);
|
|
109
|
+
} else {
|
|
110
|
+
handlerOffsetX.value = -prevPage * size;
|
|
111
|
+
onFinished === null || onFinished === void 0 ? void 0 : onFinished();
|
|
112
|
+
}
|
|
113
|
+
}, [canSliding, loop, index, onScrollBegin, handlerOffsetX, size, scrollWithTiming, currentFixedPage]);
|
|
83
114
|
const to = React.useCallback((idx, animated = false) => {
|
|
84
115
|
if (idx === index.value) return;
|
|
85
116
|
if (!canSliding()) return;
|
|
@@ -87,19 +118,46 @@ export function useCarouselController(opts) {
|
|
|
87
118
|
const offset = handlerOffsetX.value + (index.value - idx) * size;
|
|
88
119
|
|
|
89
120
|
if (animated) {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
});
|
|
121
|
+
index.value = idx;
|
|
122
|
+
handlerOffsetX.value = scrollWithTiming(offset);
|
|
93
123
|
} else {
|
|
94
124
|
handlerOffsetX.value = offset;
|
|
95
125
|
index.value = idx;
|
|
96
126
|
runOnJS(onScrollEnd)();
|
|
97
127
|
}
|
|
98
128
|
}, [index, canSliding, onScrollBegin, handlerOffsetX, size, scrollWithTiming, onScrollEnd]);
|
|
129
|
+
const scrollTo = React.useCallback((opts = {}) => {
|
|
130
|
+
const {
|
|
131
|
+
count,
|
|
132
|
+
animated = false,
|
|
133
|
+
onFinished
|
|
134
|
+
} = opts;
|
|
135
|
+
|
|
136
|
+
if (!count) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
const n = Math.round(count);
|
|
141
|
+
|
|
142
|
+
if (n < 0) {
|
|
143
|
+
prev({
|
|
144
|
+
count: Math.abs(n),
|
|
145
|
+
animated,
|
|
146
|
+
onFinished
|
|
147
|
+
});
|
|
148
|
+
} else {
|
|
149
|
+
next({
|
|
150
|
+
count: n,
|
|
151
|
+
animated,
|
|
152
|
+
onFinished
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
}, [prev, next]);
|
|
99
156
|
return {
|
|
100
157
|
next,
|
|
101
158
|
prev,
|
|
102
159
|
to,
|
|
160
|
+
scrollTo,
|
|
103
161
|
index,
|
|
104
162
|
length,
|
|
105
163
|
sharedIndex,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useCarouselController.tsx"],"names":["React","Easing","runOnJS","useSharedValue","withTiming","useCarouselController","opts","size","loop","handlerOffsetX","disable","originalLength","length","onChange","duration","index","sharedIndex","useRef","sharedPreIndex","convertToSharedIndex","useCallback","i","computedIndex","current","toInt","value","Math","abs","_sharedIndex","getCurrentIndex","canSliding","onScrollEnd","onScrollBegin","scrollWithTiming","toValue","callback","easing","easeOutQuart","isFinished","next","currentPage","round","prev","to","idx","animated","offset"],"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';\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: () => void;\n next: () => void;\n computedIndex: () => void;\n getCurrentIndex: () => number;\n to: (index: number, animated?: boolean) => void;\n}\n\nexport function useCarouselController(opts: IOpts): ICarouselController {\n const {\n size,\n loop,\n handlerOffsetX,\n disable = false,\n originalLength,\n length,\n onChange,\n duration,\n } = opts;\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 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 opts.onScrollEnd?.();\n }, [opts]);\n\n const onScrollBegin = React.useCallback(() => {\n opts.onScrollBegin?.();\n }, [opts]);\n\n const scrollWithTiming = React.useCallback(\n (toValue: number, callback?: () => void) => {\n return withTiming(\n toValue,\n { duration, easing: Easing.easeOutQuart },\n (isFinished: boolean) => {\n callback?.();\n if (isFinished) {\n runOnJS(onScrollEnd)();\n }\n }\n );\n },\n [onScrollEnd, duration]\n );\n\n const next = React.useCallback(() => {\n if (!canSliding() || (!loop && index.value === length - 1)) return;\n\n onScrollBegin?.();\n\n const currentPage = Math.round(handlerOffsetX.value / size);\n\n handlerOffsetX.value = scrollWithTiming((currentPage - 1) * size);\n }, [\n canSliding,\n loop,\n index.value,\n length,\n onScrollBegin,\n handlerOffsetX,\n size,\n scrollWithTiming,\n ]);\n\n const prev = React.useCallback(() => {\n if (!canSliding() || (!loop && index.value === 0)) return;\n\n onScrollBegin?.();\n\n const currentPage = Math.round(handlerOffsetX.value / size);\n\n handlerOffsetX.value = scrollWithTiming((currentPage + 1) * size);\n }, [\n canSliding,\n loop,\n index.value,\n onScrollBegin,\n handlerOffsetX,\n size,\n scrollWithTiming,\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 handlerOffsetX.value = scrollWithTiming(offset, () => {\n index.value = idx;\n });\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 return {\n next,\n prev,\n to,\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","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"]}
|
|
@@ -3,9 +3,10 @@ import { DATA_LENGTH } from '../constants';
|
|
|
3
3
|
export function useInitProps(props) {
|
|
4
4
|
const {
|
|
5
5
|
defaultIndex = 0,
|
|
6
|
-
data:
|
|
6
|
+
data: rawData = [],
|
|
7
7
|
loop = true,
|
|
8
|
-
autoPlayInterval = 1000,
|
|
8
|
+
autoPlayInterval: _autoPlayInterval = 1000,
|
|
9
|
+
scrollAnimationDuration = 500,
|
|
9
10
|
style = {},
|
|
10
11
|
panGestureHandlerProps = {},
|
|
11
12
|
pagingEnabled = true,
|
|
@@ -15,19 +16,20 @@ export function useInitProps(props) {
|
|
|
15
16
|
} = props;
|
|
16
17
|
const width = Math.round(_width || 0);
|
|
17
18
|
const height = Math.round(_height || 0);
|
|
19
|
+
const autoPlayInterval = Math.max(_autoPlayInterval, 0);
|
|
18
20
|
const data = React.useMemo(() => {
|
|
19
|
-
if (!loop) return
|
|
21
|
+
if (!loop) return rawData;
|
|
20
22
|
|
|
21
|
-
if (
|
|
22
|
-
return [
|
|
23
|
+
if (rawData.length === DATA_LENGTH.SINGLE_ITEM) {
|
|
24
|
+
return [rawData[0], rawData[0], rawData[0]];
|
|
23
25
|
}
|
|
24
26
|
|
|
25
|
-
if (
|
|
26
|
-
return [
|
|
27
|
+
if (rawData.length === DATA_LENGTH.DOUBLE_ITEM) {
|
|
28
|
+
return [rawData[0], rawData[1], rawData[0], rawData[1]];
|
|
27
29
|
}
|
|
28
30
|
|
|
29
|
-
return
|
|
30
|
-
}, [
|
|
31
|
+
return rawData;
|
|
32
|
+
}, [rawData, loop]);
|
|
31
33
|
|
|
32
34
|
if (props.mode === 'vertical-stack' || props.mode === 'horizontal-stack') {
|
|
33
35
|
var _props$modeConfig$sho, _props$modeConfig;
|
|
@@ -42,8 +44,10 @@ export function useInitProps(props) {
|
|
|
42
44
|
return { ...props,
|
|
43
45
|
defaultIndex,
|
|
44
46
|
data,
|
|
47
|
+
rawData,
|
|
45
48
|
loop,
|
|
46
49
|
autoPlayInterval,
|
|
50
|
+
scrollAnimationDuration,
|
|
47
51
|
style,
|
|
48
52
|
panGestureHandlerProps,
|
|
49
53
|
pagingEnabled,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useInitProps.ts"],"names":["React","DATA_LENGTH","useInitProps","props","defaultIndex","data","
|
|
1
|
+
{"version":3,"sources":["useInitProps.ts"],"names":["React","DATA_LENGTH","useInitProps","props","defaultIndex","data","rawData","loop","autoPlayInterval","_autoPlayInterval","scrollAnimationDuration","style","panGestureHandlerProps","pagingEnabled","enableSnap","width","_width","height","_height","Math","round","max","useMemo","length","SINGLE_ITEM","DOUBLE_ITEM","mode","modeConfig","showLength"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,SAASC,WAAT,QAA4B,cAA5B;AAqBA,OAAO,SAASC,YAAT,CACHC,KADG,EAEwB;AAC3B,QAAM;AACFC,IAAAA,YAAY,GAAG,CADb;AAEFC,IAAAA,IAAI,EAAEC,OAAO,GAAG,EAFd;AAGFC,IAAAA,IAAI,GAAG,IAHL;AAIFC,IAAAA,gBAAgB,EAAEC,iBAAiB,GAAG,IAJpC;AAKFC,IAAAA,uBAAuB,GAAG,GALxB;AAMFC,IAAAA,KAAK,GAAG,EANN;AAOFC,IAAAA,sBAAsB,GAAG,EAPvB;AAQFC,IAAAA,aAAa,GAAG,IARd;AASFC,IAAAA,UAAU,GAAG,IATX;AAUFC,IAAAA,KAAK,EAAEC,MAVL;AAWFC,IAAAA,MAAM,EAAEC;AAXN,MAYFf,KAZJ;AAcA,QAAMY,KAAK,GAAGI,IAAI,CAACC,KAAL,CAAWJ,MAAM,IAAI,CAArB,CAAd;AACA,QAAMC,MAAM,GAAGE,IAAI,CAACC,KAAL,CAAWF,OAAO,IAAI,CAAtB,CAAf;AACA,QAAMV,gBAAgB,GAAGW,IAAI,CAACE,GAAL,CAASZ,iBAAT,EAA4B,CAA5B,CAAzB;AAEA,QAAMJ,IAAI,GAAGL,KAAK,CAACsB,OAAN,CAAmB,MAAM;AAClC,QAAI,CAACf,IAAL,EAAW,OAAOD,OAAP;;AAEX,QAAIA,OAAO,CAACiB,MAAR,KAAmBtB,WAAW,CAACuB,WAAnC,EAAgD;AAC5C,aAAO,CAAClB,OAAO,CAAC,CAAD,CAAR,EAAaA,OAAO,CAAC,CAAD,CAApB,EAAyBA,OAAO,CAAC,CAAD,CAAhC,CAAP;AACH;;AAED,QAAIA,OAAO,CAACiB,MAAR,KAAmBtB,WAAW,CAACwB,WAAnC,EAAgD;AAC5C,aAAO,CAACnB,OAAO,CAAC,CAAD,CAAR,EAAaA,OAAO,CAAC,CAAD,CAApB,EAAyBA,OAAO,CAAC,CAAD,CAAhC,EAAqCA,OAAO,CAAC,CAAD,CAA5C,CAAP;AACH;;AAED,WAAOA,OAAP;AACH,GAZY,EAYV,CAACA,OAAD,EAAUC,IAAV,CAZU,CAAb;;AAcA,MAAIJ,KAAK,CAACuB,IAAN,KAAe,gBAAf,IAAmCvB,KAAK,CAACuB,IAAN,KAAe,kBAAtD,EAA0E;AAAA;;AACtE,QAAI,CAACvB,KAAK,CAACwB,UAAX,EAAuB;AACnBxB,MAAAA,KAAK,CAACwB,UAAN,GAAmB,EAAnB;AACH;;AACDxB,IAAAA,KAAK,CAACwB,UAAN,CAAiBC,UAAjB,iDACIzB,KAAK,CAACwB,UADV,sDACI,kBAAkBC,UADtB,yEACoCvB,IAAI,CAACkB,MAAL,GAAc,CADlD;AAEH;;AACD,SAAO,EACH,GAAGpB,KADA;AAEHC,IAAAA,YAFG;AAGHC,IAAAA,IAHG;AAIHC,IAAAA,OAJG;AAKHC,IAAAA,IALG;AAMHC,IAAAA,gBANG;AAOHE,IAAAA,uBAPG;AAQHC,IAAAA,KARG;AASHC,IAAAA,sBATG;AAUHC,IAAAA,aAVG;AAWHC,IAAAA,UAXG;AAYHC,IAAAA,KAZG;AAaHE,IAAAA;AAbG,GAAP;AAeH","sourcesContent":["import React from 'react';\nimport { DATA_LENGTH } from '../constants';\nimport type { TCarouselProps } from '../types';\n\ntype TGetRequiredProps<P extends keyof TCarouselProps> = Record<\n P,\n Required<TCarouselProps>[P]\n>;\n\nexport type TInitializeCarouselProps<T> = TCarouselProps<T> &\n TGetRequiredProps<\n | 'defaultIndex'\n | 'loop'\n | 'width'\n | 'height'\n | 'scrollAnimationDuration'\n | 'autoPlayInterval'\n > & {\n // Raw data that has not been processed\n rawData: T[];\n };\n\nexport function useInitProps<T>(\n props: TCarouselProps<T>\n): TInitializeCarouselProps<T> {\n const {\n defaultIndex = 0,\n data: rawData = [],\n loop = true,\n autoPlayInterval: _autoPlayInterval = 1000,\n scrollAnimationDuration = 500,\n style = {},\n panGestureHandlerProps = {},\n pagingEnabled = true,\n enableSnap = true,\n width: _width,\n height: _height,\n } = props;\n\n const width = Math.round(_width || 0);\n const height = Math.round(_height || 0);\n const autoPlayInterval = Math.max(_autoPlayInterval, 0);\n\n const data = React.useMemo<T[]>(() => {\n if (!loop) return rawData;\n\n if (rawData.length === DATA_LENGTH.SINGLE_ITEM) {\n return [rawData[0], rawData[0], rawData[0]];\n }\n\n if (rawData.length === DATA_LENGTH.DOUBLE_ITEM) {\n return [rawData[0], rawData[1], rawData[0], rawData[1]];\n }\n\n return rawData;\n }, [rawData, loop]);\n\n if (props.mode === 'vertical-stack' || props.mode === 'horizontal-stack') {\n if (!props.modeConfig) {\n props.modeConfig = {};\n }\n props.modeConfig.showLength =\n props.modeConfig?.showLength ?? data.length - 1;\n }\n return {\n ...props,\n defaultIndex,\n data,\n rawData,\n loop,\n autoPlayInterval,\n scrollAnimationDuration,\n style,\n panGestureHandlerProps,\n pagingEnabled,\n enableSnap,\n width,\n height,\n };\n}\n"]}
|
|
@@ -3,28 +3,28 @@ import { DATA_LENGTH } from '../constants';
|
|
|
3
3
|
export function useOnProgressChange(opts) {
|
|
4
4
|
const {
|
|
5
5
|
offsetX,
|
|
6
|
-
|
|
6
|
+
rawData,
|
|
7
7
|
size,
|
|
8
8
|
onProgressChange
|
|
9
9
|
} = opts;
|
|
10
10
|
useAnimatedReaction(() => offsetX.value, _value => {
|
|
11
11
|
let value = _value;
|
|
12
12
|
|
|
13
|
-
if (
|
|
13
|
+
if (rawData.length === DATA_LENGTH.SINGLE_ITEM) {
|
|
14
14
|
value = value % size;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
if (
|
|
17
|
+
if (rawData.length === DATA_LENGTH.DOUBLE_ITEM) {
|
|
18
18
|
value = value % (size * 2);
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
let absoluteProgress = Math.abs(value / size);
|
|
22
22
|
|
|
23
23
|
if (value > 0) {
|
|
24
|
-
absoluteProgress =
|
|
24
|
+
absoluteProgress = rawData.length - absoluteProgress;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
!!onProgressChange && runOnJS(onProgressChange)(value, absoluteProgress);
|
|
28
|
-
}, [onProgressChange,
|
|
28
|
+
}, [onProgressChange, rawData]);
|
|
29
29
|
}
|
|
30
30
|
//# sourceMappingURL=useOnProgressChange.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useOnProgressChange.ts"],"names":["runOnJS","useAnimatedReaction","DATA_LENGTH","useOnProgressChange","opts","offsetX","
|
|
1
|
+
{"version":3,"sources":["useOnProgressChange.ts"],"names":["runOnJS","useAnimatedReaction","DATA_LENGTH","useOnProgressChange","opts","offsetX","rawData","size","onProgressChange","value","_value","length","SINGLE_ITEM","DOUBLE_ITEM","absoluteProgress","Math","abs"],"mappings":"AAAA,SACIA,OADJ,EAEIC,mBAFJ,QAGO,yBAHP;AAIA,SAASC,WAAT,QAA4B,cAA5B;AAGA,OAAO,SAASC,mBAAT,CACHC,IADG,EAML;AACE,QAAM;AAAEC,IAAAA,OAAF;AAAWC,IAAAA,OAAX;AAAoBC,IAAAA,IAApB;AAA0BC,IAAAA;AAA1B,MAA+CJ,IAArD;AACAH,EAAAA,mBAAmB,CACf,MAAMI,OAAO,CAACI,KADC,EAEdC,MAAD,IAAY;AACR,QAAID,KAAK,GAAGC,MAAZ;;AAEA,QAAIJ,OAAO,CAACK,MAAR,KAAmBT,WAAW,CAACU,WAAnC,EAAgD;AAC5CH,MAAAA,KAAK,GAAGA,KAAK,GAAGF,IAAhB;AACH;;AAED,QAAID,OAAO,CAACK,MAAR,KAAmBT,WAAW,CAACW,WAAnC,EAAgD;AAC5CJ,MAAAA,KAAK,GAAGA,KAAK,IAAIF,IAAI,GAAG,CAAX,CAAb;AACH;;AAED,QAAIO,gBAAgB,GAAGC,IAAI,CAACC,GAAL,CAASP,KAAK,GAAGF,IAAjB,CAAvB;;AAEA,QAAIE,KAAK,GAAG,CAAZ,EAAe;AACXK,MAAAA,gBAAgB,GAAGR,OAAO,CAACK,MAAR,GAAiBG,gBAApC;AACH;;AAED,KAAC,CAACN,gBAAF,IACIR,OAAO,CAACQ,gBAAD,CAAP,CAA0BC,KAA1B,EAAiCK,gBAAjC,CADJ;AAEH,GArBc,EAsBf,CAACN,gBAAD,EAAmBF,OAAnB,CAtBe,CAAnB;AAwBH","sourcesContent":["import Animated, {\n runOnJS,\n useAnimatedReaction,\n} from 'react-native-reanimated';\nimport { DATA_LENGTH } from '../constants';\nimport type { TCarouselProps } from '../types';\n\nexport function useOnProgressChange(\n opts: {\n size: number;\n offsetX: Animated.SharedValue<number>;\n rawData: TCarouselProps['data'];\n } & Pick<TCarouselProps, 'onProgressChange'>\n) {\n const { offsetX, rawData, size, onProgressChange } = opts;\n useAnimatedReaction(\n () => offsetX.value,\n (_value) => {\n let value = _value;\n\n if (rawData.length === DATA_LENGTH.SINGLE_ITEM) {\n value = value % size;\n }\n\n if (rawData.length === DATA_LENGTH.DOUBLE_ITEM) {\n value = value % (size * 2);\n }\n\n let absoluteProgress = Math.abs(value / size);\n\n if (value > 0) {\n absoluteProgress = rawData.length - absoluteProgress;\n }\n\n !!onProgressChange &&\n runOnJS(onProgressChange)(value, absoluteProgress);\n },\n [onProgressChange, rawData]\n );\n}\n"]}
|