react-native-reanimated-carousel 4.0.0-alpha.6 → 4.0.0-alpha.7
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/components/Carousel.js +4 -2
- package/lib/commonjs/components/Carousel.js.map +1 -1
- package/lib/commonjs/hooks/useCarouselController.js +4 -3
- package/lib/commonjs/hooks/useCarouselController.js.map +1 -1
- package/lib/commonjs/hooks/useVisibleRanges.js +5 -4
- package/lib/commonjs/hooks/useVisibleRanges.js.map +1 -1
- package/lib/commonjs/utils/handleroffset-direction.js +5 -5
- package/lib/commonjs/utils/handleroffset-direction.js.map +1 -1
- package/lib/commonjs/utils/handleroffset-direction.test.js +46 -0
- package/lib/commonjs/utils/handleroffset-direction.test.js.map +1 -0
- package/lib/module/components/Carousel.js +4 -2
- package/lib/module/components/Carousel.js.map +1 -1
- package/lib/module/hooks/useCarouselController.js +4 -3
- package/lib/module/hooks/useCarouselController.js.map +1 -1
- package/lib/module/hooks/useVisibleRanges.js +5 -4
- package/lib/module/hooks/useVisibleRanges.js.map +1 -1
- package/lib/module/utils/handleroffset-direction.js +5 -5
- package/lib/module/utils/handleroffset-direction.js.map +1 -1
- package/lib/module/utils/handleroffset-direction.test.js +41 -0
- package/lib/module/utils/handleroffset-direction.test.js.map +1 -0
- package/lib/typescript/hooks/useCarouselController.d.ts +2 -1
- package/lib/typescript/utils/handleroffset-direction.d.ts +2 -1
- package/lib/typescript/utils/handleroffset-direction.test.d.ts +1 -0
- package/package.json +1 -1
- package/src/components/Carousel.tsx +3 -1
- package/src/hooks/useCarouselController.tsx +16 -13
- package/src/hooks/useVisibleRanges.tsx +4 -4
- package/src/utils/handleroffset-direction.test.ts +52 -0
- package/src/utils/handleroffset-direction.ts +12 -9
|
@@ -64,6 +64,7 @@ const Carousel = /*#__PURE__*/_react.default.forwardRef((_props, ref) => {
|
|
|
64
64
|
autoPlayInterval,
|
|
65
65
|
scrollAnimationDuration,
|
|
66
66
|
withAnimation,
|
|
67
|
+
fixedDirection,
|
|
67
68
|
renderItem,
|
|
68
69
|
onScrollEnd,
|
|
69
70
|
onSnapToItem,
|
|
@@ -102,9 +103,10 @@ const Carousel = /*#__PURE__*/_react.default.forwardRef((_props, ref) => {
|
|
|
102
103
|
handlerOffset,
|
|
103
104
|
withAnimation,
|
|
104
105
|
defaultIndex,
|
|
106
|
+
fixedDirection,
|
|
107
|
+
duration: scrollAnimationDuration,
|
|
105
108
|
onScrollEnd: () => (0, _reactNativeReanimated.runOnJS)(_onScrollEnd)(),
|
|
106
|
-
onScrollBegin: () => !!onScrollBegin && (0, _reactNativeReanimated.runOnJS)(onScrollBegin)()
|
|
107
|
-
duration: scrollAnimationDuration
|
|
109
|
+
onScrollBegin: () => !!onScrollBegin && (0, _reactNativeReanimated.runOnJS)(onScrollBegin)()
|
|
108
110
|
});
|
|
109
111
|
const {
|
|
110
112
|
next,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["Carousel.tsx"],"names":["Carousel","React","forwardRef","_props","ref","props","testID","loop","autoFillData","data","dataLength","rawData","rawDataLength","mode","style","width","height","vertical","autoPlay","windowSize","autoPlayReverse","autoPlayInterval","scrollAnimationDuration","withAnimation","renderItem","onScrollEnd","onSnapToItem","onScrollBegin","onProgressChange","customAnimation","defaultIndex","commonVariables","size","handlerOffset","offsetX","totalSize","x","value","isNaN","carouselController","_onScrollEnd","duration","next","prev","scrollTo","getSharedIndex","getCurrentIndex","start","startAutoPlay","pause","pauseAutoPlay","useCallback","_sharedIndex","Math","round","realIndex","index","scrollViewGestureOnScrollBegin","scrollViewGestureOnScrollEnd","scrollViewGestureOnTouchBegin","scrollViewGestureOnTouchEnd","useImperativeHandle","visibleRanges","total","viewSize","translation","layoutConfig","renderLayout","item","i","animationValue","common","styles","container","itemsVertical","itemsHorizontal","map","StyleSheet","create","overflow","flexDirection"],"mappings":"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","sourcesContent":["import React from \"react\";\nimport { StyleSheet } from \"react-native\";\nimport { GestureHandlerRootView } from \"react-native-gesture-handler\";\nimport { runOnJS, useDerivedValue } from \"react-native-reanimated\";\n\nimport { BaseLayout } from \"./BaseLayout\";\nimport { ScrollViewGesture } from \"./ScrollViewGesture\";\n\nimport { useAutoPlay } from \"../hooks/useAutoPlay\";\nimport { useCarouselController } from \"../hooks/useCarouselController\";\nimport { useCommonVariables } from \"../hooks/useCommonVariables\";\nimport { useInitProps } from \"../hooks/useInitProps\";\nimport { useLayoutConfig } from \"../hooks/useLayoutConfig\";\nimport { useOnProgressChange } from \"../hooks/useOnProgressChange\";\nimport { usePropsErrorBoundary } from \"../hooks/usePropsErrorBoundary\";\nimport { useVisibleRanges } from \"../hooks/useVisibleRanges\";\nimport { CTX } from \"../store\";\nimport type { ICarouselInstance, TCarouselProps } from \"../types\";\nimport { computedRealIndexWithAutoFillData } from \"../utils/computed-with-auto-fill-data\";\n\nconst Carousel = React.forwardRef<ICarouselInstance, TCarouselProps<any>>(\n (_props, ref) => {\n const props = useInitProps(_props);\n\n const {\n testID,\n loop,\n autoFillData,\n // Fill data with autoFillData\n data,\n // Length of fill data\n dataLength,\n // Raw data that has not been processed\n rawData,\n // Length of raw data\n rawDataLength,\n mode,\n style,\n width,\n height,\n vertical,\n autoPlay,\n windowSize,\n autoPlayReverse,\n autoPlayInterval,\n scrollAnimationDuration,\n withAnimation,\n renderItem,\n onScrollEnd,\n onSnapToItem,\n onScrollBegin,\n onProgressChange,\n customAnimation,\n defaultIndex,\n } = props;\n\n const commonVariables = useCommonVariables(props);\n const { size, handlerOffset } = commonVariables;\n\n const offsetX = useDerivedValue(() => {\n const totalSize = size * dataLength;\n const x = handlerOffset.value % totalSize;\n\n if (!loop)\n return handlerOffset.value;\n\n return isNaN(x) ? 0 : x;\n }, [loop, size, dataLength]);\n\n usePropsErrorBoundary({ ...props, dataLength });\n useOnProgressChange({\n autoFillData,\n loop,\n size,\n offsetX,\n rawDataLength,\n onProgressChange,\n });\n\n const carouselController = useCarouselController({\n loop,\n size,\n dataLength,\n autoFillData,\n handlerOffset,\n withAnimation,\n defaultIndex,\n onScrollEnd: () => runOnJS(_onScrollEnd)(),\n onScrollBegin: () => !!onScrollBegin && runOnJS(onScrollBegin)(),\n duration: scrollAnimationDuration,\n });\n\n const { next, prev, scrollTo, getSharedIndex, getCurrentIndex }\n = carouselController;\n\n const { start: startAutoPlay, pause: pauseAutoPlay } = useAutoPlay({\n autoPlay,\n autoPlayInterval,\n autoPlayReverse,\n carouselController,\n });\n\n const _onScrollEnd = React.useCallback(() => {\n const _sharedIndex = Math.round(getSharedIndex());\n\n const realIndex = computedRealIndexWithAutoFillData({\n index: _sharedIndex,\n dataLength: rawDataLength,\n loop,\n autoFillData,\n });\n\n if (onSnapToItem)\n onSnapToItem(realIndex);\n\n if (onScrollEnd)\n onScrollEnd(realIndex);\n }, [\n loop,\n autoFillData,\n rawDataLength,\n getSharedIndex,\n onSnapToItem,\n onScrollEnd,\n ]);\n\n const scrollViewGestureOnScrollBegin = React.useCallback(() => {\n pauseAutoPlay();\n onScrollBegin?.();\n }, [onScrollBegin, pauseAutoPlay]);\n\n const scrollViewGestureOnScrollEnd = React.useCallback(() => {\n startAutoPlay();\n _onScrollEnd();\n }, [_onScrollEnd, startAutoPlay]);\n\n const scrollViewGestureOnTouchBegin = React.useCallback(pauseAutoPlay, [\n pauseAutoPlay,\n ]);\n\n const scrollViewGestureOnTouchEnd = React.useCallback(startAutoPlay, [\n startAutoPlay,\n ]);\n\n React.useImperativeHandle(\n ref,\n () => ({\n next,\n prev,\n getCurrentIndex,\n scrollTo,\n }),\n [getCurrentIndex, next, prev, scrollTo],\n );\n\n const visibleRanges = useVisibleRanges({\n total: dataLength,\n viewSize: size,\n translation: handlerOffset,\n windowSize,\n loop,\n });\n\n const layoutConfig = useLayoutConfig({ ...props, size });\n\n const renderLayout = React.useCallback(\n (item: any, i: number) => {\n const realIndex = computedRealIndexWithAutoFillData({\n index: i,\n dataLength: rawDataLength,\n loop,\n autoFillData,\n });\n\n return (\n <BaseLayout\n key={i}\n index={i}\n handlerOffset={offsetX}\n visibleRanges={visibleRanges}\n animationStyle={customAnimation || layoutConfig}\n >\n {({ animationValue }) =>\n renderItem({\n item,\n index: realIndex,\n animationValue,\n })\n }\n </BaseLayout>\n );\n },\n [\n loop,\n rawData,\n offsetX,\n visibleRanges,\n autoFillData,\n renderItem,\n layoutConfig,\n customAnimation,\n ],\n );\n\n return (\n <GestureHandlerRootView>\n <CTX.Provider value={{ props, common: commonVariables }}>\n <ScrollViewGesture\n key={mode}\n size={size}\n translation={handlerOffset}\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 testID={testID}\n onScrollBegin={scrollViewGestureOnScrollBegin}\n onScrollEnd={scrollViewGestureOnScrollEnd}\n onTouchBegin={scrollViewGestureOnTouchBegin}\n onTouchEnd={scrollViewGestureOnTouchEnd}\n >\n {data.map(renderLayout)}\n </ScrollViewGesture>\n </CTX.Provider>\n </GestureHandlerRootView>\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","testID","loop","autoFillData","data","dataLength","rawData","rawDataLength","mode","style","width","height","vertical","autoPlay","windowSize","autoPlayReverse","autoPlayInterval","scrollAnimationDuration","withAnimation","fixedDirection","renderItem","onScrollEnd","onSnapToItem","onScrollBegin","onProgressChange","customAnimation","defaultIndex","commonVariables","size","handlerOffset","offsetX","totalSize","x","value","isNaN","carouselController","duration","_onScrollEnd","next","prev","scrollTo","getSharedIndex","getCurrentIndex","start","startAutoPlay","pause","pauseAutoPlay","useCallback","_sharedIndex","Math","round","realIndex","index","scrollViewGestureOnScrollBegin","scrollViewGestureOnScrollEnd","scrollViewGestureOnTouchBegin","scrollViewGestureOnTouchEnd","useImperativeHandle","visibleRanges","total","viewSize","translation","layoutConfig","renderLayout","item","i","animationValue","common","styles","container","itemsVertical","itemsHorizontal","map","StyleSheet","create","overflow","flexDirection"],"mappings":"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","sourcesContent":["import React from \"react\";\nimport { StyleSheet } from \"react-native\";\nimport { GestureHandlerRootView } from \"react-native-gesture-handler\";\nimport { runOnJS, useDerivedValue } from \"react-native-reanimated\";\n\nimport { BaseLayout } from \"./BaseLayout\";\nimport { ScrollViewGesture } from \"./ScrollViewGesture\";\n\nimport { useAutoPlay } from \"../hooks/useAutoPlay\";\nimport { useCarouselController } from \"../hooks/useCarouselController\";\nimport { useCommonVariables } from \"../hooks/useCommonVariables\";\nimport { useInitProps } from \"../hooks/useInitProps\";\nimport { useLayoutConfig } from \"../hooks/useLayoutConfig\";\nimport { useOnProgressChange } from \"../hooks/useOnProgressChange\";\nimport { usePropsErrorBoundary } from \"../hooks/usePropsErrorBoundary\";\nimport { useVisibleRanges } from \"../hooks/useVisibleRanges\";\nimport { CTX } from \"../store\";\nimport type { ICarouselInstance, TCarouselProps } from \"../types\";\nimport { computedRealIndexWithAutoFillData } from \"../utils/computed-with-auto-fill-data\";\n\nconst Carousel = React.forwardRef<ICarouselInstance, TCarouselProps<any>>(\n (_props, ref) => {\n const props = useInitProps(_props);\n\n const {\n testID,\n loop,\n autoFillData,\n // Fill data with autoFillData\n data,\n // Length of fill data\n dataLength,\n // Raw data that has not been processed\n rawData,\n // Length of raw data\n rawDataLength,\n mode,\n style,\n width,\n height,\n vertical,\n autoPlay,\n windowSize,\n autoPlayReverse,\n autoPlayInterval,\n scrollAnimationDuration,\n withAnimation,\n fixedDirection,\n renderItem,\n onScrollEnd,\n onSnapToItem,\n onScrollBegin,\n onProgressChange,\n customAnimation,\n defaultIndex,\n } = props;\n\n const commonVariables = useCommonVariables(props);\n const { size, handlerOffset } = commonVariables;\n\n const offsetX = useDerivedValue(() => {\n const totalSize = size * dataLength;\n const x = handlerOffset.value % totalSize;\n\n if (!loop)\n return handlerOffset.value;\n\n return isNaN(x) ? 0 : x;\n }, [loop, size, dataLength]);\n\n usePropsErrorBoundary({ ...props, dataLength });\n useOnProgressChange({\n autoFillData,\n loop,\n size,\n offsetX,\n rawDataLength,\n onProgressChange,\n });\n\n const carouselController = useCarouselController({\n loop,\n size,\n dataLength,\n autoFillData,\n handlerOffset,\n withAnimation,\n defaultIndex,\n fixedDirection,\n duration: scrollAnimationDuration,\n onScrollEnd: () => runOnJS(_onScrollEnd)(),\n onScrollBegin: () => !!onScrollBegin && runOnJS(onScrollBegin)(),\n });\n\n const { next, prev, scrollTo, getSharedIndex, getCurrentIndex }\n = carouselController;\n\n const { start: startAutoPlay, pause: pauseAutoPlay } = useAutoPlay({\n autoPlay,\n autoPlayInterval,\n autoPlayReverse,\n carouselController,\n });\n\n const _onScrollEnd = React.useCallback(() => {\n const _sharedIndex = Math.round(getSharedIndex());\n\n const realIndex = computedRealIndexWithAutoFillData({\n index: _sharedIndex,\n dataLength: rawDataLength,\n loop,\n autoFillData,\n });\n\n if (onSnapToItem)\n onSnapToItem(realIndex);\n\n if (onScrollEnd)\n onScrollEnd(realIndex);\n }, [\n loop,\n autoFillData,\n rawDataLength,\n getSharedIndex,\n onSnapToItem,\n onScrollEnd,\n ]);\n\n const scrollViewGestureOnScrollBegin = React.useCallback(() => {\n pauseAutoPlay();\n onScrollBegin?.();\n }, [onScrollBegin, pauseAutoPlay]);\n\n const scrollViewGestureOnScrollEnd = React.useCallback(() => {\n startAutoPlay();\n _onScrollEnd();\n }, [_onScrollEnd, startAutoPlay]);\n\n const scrollViewGestureOnTouchBegin = React.useCallback(pauseAutoPlay, [\n pauseAutoPlay,\n ]);\n\n const scrollViewGestureOnTouchEnd = React.useCallback(startAutoPlay, [\n startAutoPlay,\n ]);\n\n React.useImperativeHandle(\n ref,\n () => ({\n next,\n prev,\n getCurrentIndex,\n scrollTo,\n }),\n [getCurrentIndex, next, prev, scrollTo],\n );\n\n const visibleRanges = useVisibleRanges({\n total: dataLength,\n viewSize: size,\n translation: handlerOffset,\n windowSize,\n loop,\n });\n\n const layoutConfig = useLayoutConfig({ ...props, size });\n\n const renderLayout = React.useCallback(\n (item: any, i: number) => {\n const realIndex = computedRealIndexWithAutoFillData({\n index: i,\n dataLength: rawDataLength,\n loop,\n autoFillData,\n });\n\n return (\n <BaseLayout\n key={i}\n index={i}\n handlerOffset={offsetX}\n visibleRanges={visibleRanges}\n animationStyle={customAnimation || layoutConfig}\n >\n {({ animationValue }) =>\n renderItem({\n item,\n index: realIndex,\n animationValue,\n })\n }\n </BaseLayout>\n );\n },\n [\n loop,\n rawData,\n offsetX,\n visibleRanges,\n autoFillData,\n renderItem,\n layoutConfig,\n customAnimation,\n ],\n );\n\n return (\n <GestureHandlerRootView>\n <CTX.Provider value={{ props, common: commonVariables }}>\n <ScrollViewGesture\n key={mode}\n size={size}\n translation={handlerOffset}\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 testID={testID}\n onScrollBegin={scrollViewGestureOnScrollBegin}\n onScrollEnd={scrollViewGestureOnScrollEnd}\n onTouchBegin={scrollViewGestureOnTouchBegin}\n onTouchEnd={scrollViewGestureOnTouchEnd}\n >\n {data.map(renderLayout)}\n </ScrollViewGesture>\n </CTX.Provider>\n </GestureHandlerRootView>\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"]}
|
|
@@ -32,7 +32,8 @@ function useCarouselController(options) {
|
|
|
32
32
|
withAnimation,
|
|
33
33
|
defaultIndex = 0,
|
|
34
34
|
duration,
|
|
35
|
-
autoFillData
|
|
35
|
+
autoFillData,
|
|
36
|
+
fixedDirection
|
|
36
37
|
} = options;
|
|
37
38
|
|
|
38
39
|
const dataInfo = _react.default.useMemo(() => ({
|
|
@@ -180,7 +181,7 @@ function useCarouselController(options) {
|
|
|
180
181
|
if (!canSliding()) return;
|
|
181
182
|
onScrollBegin === null || onScrollBegin === void 0 ? void 0 : onScrollBegin(); // direction -> 1 | -1
|
|
182
183
|
|
|
183
|
-
const direction = (0, _handleroffsetDirection.handlerOffsetDirection)(handlerOffset); // target offset
|
|
184
|
+
const direction = (0, _handleroffsetDirection.handlerOffsetDirection)(handlerOffset, fixedDirection); // target offset
|
|
184
185
|
|
|
185
186
|
const offset = i * size * direction; // page width size * page count
|
|
186
187
|
|
|
@@ -201,7 +202,7 @@ function useCarouselController(options) {
|
|
|
201
202
|
index.value = i;
|
|
202
203
|
onFinished === null || onFinished === void 0 ? void 0 : onFinished();
|
|
203
204
|
}
|
|
204
|
-
}, [
|
|
205
|
+
}, [size, loop, index, fixedDirection, handlerOffset, dataInfo.length, canSliding, onScrollBegin, scrollWithTiming]);
|
|
205
206
|
|
|
206
207
|
const scrollTo = _react.default.useCallback(function () {
|
|
207
208
|
let opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useCarouselController.tsx"],"names":["useCarouselController","options","size","loop","dataLength","handlerOffset","withAnimation","defaultIndex","duration","autoFillData","dataInfo","React","useMemo","length","disable","originalLength","index","sharedIndex","sharedPreIndex","currentFixedPage","useCallback","Math","round","value","fixed","abs","setSharedIndex","newSharedIndex","current","handlerOffsetValue","toInt","isPositive","i","newSharedIndexValue","rawDataLength","getCurrentIndex","realIndex","canSliding","onScrollEnd","onScrollBegin","scrollWithTiming","toValue","onFinished","callback","isFinished","defaultWithAnimation","type","config","easing","Easing","easeOutQuart","next","opts","count","animated","nextPage","prev","prevPage","to","direction","offset","totalSize","isCloseToNextLoop","finalOffset","floor","scrollTo","n","getSharedIndex"],"mappings":"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","sourcesContent":["import React, { useRef } from \"react\";\nimport type Animated from \"react-native-reanimated\";\nimport {\n runOnJS,\n useAnimatedReaction,\n useSharedValue,\n} from \"react-native-reanimated\";\n\nimport { Easing } from \"../constants\";\nimport type {\n TCarouselActionOptions,\n TCarouselProps,\n WithTimingAnimation,\n} from \"../types\";\nimport { computedRealIndexWithAutoFillData, convertToSharedIndex } from \"../utils/computed-with-auto-fill-data\";\nimport { dealWithAnimation } from \"../utils/deal-with-animation\";\nimport { handlerOffsetDirection } from \"../utils/handleroffset-direction\";\nimport { round } from \"../utils/log\";\n\ninterface IOpts {\n loop: boolean\n size: number\n dataLength: number\n autoFillData: TCarouselProps[\"autoFillData\"]\n handlerOffset: Animated.SharedValue<number>\n withAnimation?: TCarouselProps[\"withAnimation\"]\n duration?: number\n defaultIndex?: number\n onScrollBegin?: () => void\n onScrollEnd?: () => void\n}\n\nexport interface ICarouselController {\n getSharedIndex: () => number\n prev: (opts?: TCarouselActionOptions) => void\n next: (opts?: TCarouselActionOptions) => void\n getCurrentIndex: () => number\n scrollTo: (opts?: TCarouselActionOptions) => void\n}\n\nexport function useCarouselController(options: IOpts): ICarouselController {\n const {\n size,\n loop,\n dataLength,\n handlerOffset,\n withAnimation,\n defaultIndex = 0,\n duration,\n autoFillData,\n } = options;\n\n const dataInfo = React.useMemo(\n () => ({\n length: dataLength,\n disable: !dataLength,\n originalLength: dataLength,\n }),\n [dataLength],\n );\n\n const index = useSharedValue<number>(defaultIndex);\n // The Index displayed to the user\n const sharedIndex = useRef<number>(defaultIndex);\n const sharedPreIndex = useRef<number>(defaultIndex);\n\n const currentFixedPage = React.useCallback(() => {\n if (loop)\n return -Math.round(handlerOffset.value / size);\n\n const fixed = (handlerOffset.value / size) % dataInfo.length;\n return Math.round(\n handlerOffset.value <= 0\n ? Math.abs(fixed)\n : Math.abs(fixed > 0 ? dataInfo.length - fixed : 0),\n );\n }, [handlerOffset, dataInfo, size, loop]);\n\n function setSharedIndex(newSharedIndex: number) {\n sharedIndex.current = newSharedIndex;\n }\n\n useAnimatedReaction(\n () => {\n const handlerOffsetValue = handlerOffset.value;\n const toInt = round(handlerOffsetValue / size) % dataInfo.length;\n const isPositive = handlerOffsetValue <= 0;\n const i = isPositive\n ? Math.abs(toInt)\n : Math.abs(toInt > 0 ? dataInfo.length - toInt : 0);\n\n const newSharedIndexValue = convertToSharedIndex({\n loop,\n rawDataLength: dataInfo.originalLength,\n autoFillData: autoFillData!,\n index: i,\n });\n\n return {\n i,\n newSharedIndexValue,\n };\n },\n ({ i, newSharedIndexValue }) => {\n index.value = i;\n runOnJS(setSharedIndex)(newSharedIndexValue);\n },\n [\n sharedPreIndex,\n sharedIndex,\n size,\n dataInfo,\n index,\n loop,\n autoFillData,\n handlerOffset,\n ],\n );\n\n const getCurrentIndex = React.useCallback(() => {\n const realIndex = computedRealIndexWithAutoFillData({\n index: index.value,\n dataLength: dataInfo.originalLength,\n loop,\n autoFillData: autoFillData!,\n });\n\n return realIndex;\n }, [index, autoFillData, dataInfo, loop]);\n\n const canSliding = React.useCallback(() => {\n return !dataInfo.disable;\n }, [dataInfo]);\n\n const onScrollEnd = React.useCallback(() => {\n options.onScrollEnd?.();\n }, [options]);\n\n const onScrollBegin = React.useCallback(() => {\n options.onScrollBegin?.();\n }, [options]);\n\n const scrollWithTiming = React.useCallback(\n (toValue: number, onFinished?: () => void) => {\n \"worklet\";\n const callback = (isFinished: boolean) => {\n \"worklet\";\n if (isFinished) {\n runOnJS(onScrollEnd)();\n onFinished && runOnJS(onFinished)();\n }\n };\n\n const defaultWithAnimation: WithTimingAnimation = {\n type: \"timing\",\n config: { duration, easing: Easing.easeOutQuart },\n };\n\n return dealWithAnimation(withAnimation ?? defaultWithAnimation)(\n toValue,\n callback,\n );\n },\n [duration, withAnimation, onScrollEnd],\n );\n\n const next = React.useCallback(\n (opts: TCarouselActionOptions = {}) => {\n \"worklet\";\n const { count = 1, animated = true, onFinished } = opts;\n if (!canSliding() || (!loop && index.value >= dataInfo.length - 1))\n return;\n\n onScrollBegin?.();\n\n const nextPage = currentFixedPage() + count;\n index.value = nextPage;\n\n if (animated) {\n handlerOffset.value = scrollWithTiming(\n -nextPage * size,\n onFinished,\n ) as any;\n }\n else {\n handlerOffset.value = -nextPage * size;\n onFinished?.();\n }\n },\n [\n canSliding,\n loop,\n index,\n dataInfo,\n onScrollBegin,\n handlerOffset,\n size,\n scrollWithTiming,\n currentFixedPage,\n ],\n );\n\n const prev = React.useCallback(\n (opts: TCarouselActionOptions = {}) => {\n const { count = 1, animated = true, onFinished } = opts;\n if (!canSliding() || (!loop && index.value <= 0)) return;\n\n onScrollBegin?.();\n\n const prevPage = currentFixedPage() - count;\n index.value = prevPage;\n\n if (animated) {\n handlerOffset.value = scrollWithTiming(\n -prevPage * size,\n onFinished,\n );\n }\n else {\n handlerOffset.value = -prevPage * size;\n onFinished?.();\n }\n },\n [\n canSliding,\n loop,\n index,\n onScrollBegin,\n handlerOffset,\n size,\n scrollWithTiming,\n currentFixedPage,\n ],\n );\n\n const to = React.useCallback(\n (opts: { i: number; animated: boolean; onFinished?: () => void }) => {\n const { i, animated = false, onFinished } = opts;\n if (i === index.value) return;\n if (!canSliding()) return;\n\n onScrollBegin?.();\n // direction -> 1 | -1\n const direction = handlerOffsetDirection(handlerOffset);\n\n // target offset\n const offset = i * size * direction;\n // page width size * page count\n const totalSize = dataInfo.length * size;\n\n let isCloseToNextLoop = false;\n\n if (loop) {\n isCloseToNextLoop\n = Math.abs(handlerOffset.value % totalSize) / totalSize\n >= 0.5;\n }\n\n const finalOffset\n = (Math.floor(Math.abs(handlerOffset.value / totalSize))\n + (isCloseToNextLoop ? 1 : 0))\n * totalSize\n * direction\n + offset;\n\n if (animated) {\n index.value = i;\n handlerOffset.value = scrollWithTiming(finalOffset, onFinished);\n }\n else {\n handlerOffset.value = finalOffset;\n index.value = i;\n onFinished?.();\n }\n },\n [\n index,\n canSliding,\n onScrollBegin,\n handlerOffset,\n size,\n dataInfo.length,\n loop,\n scrollWithTiming,\n ],\n );\n\n const scrollTo = React.useCallback(\n (opts: TCarouselActionOptions = {}) => {\n const { index: i, count, animated = false, onFinished } = opts;\n if (typeof i === \"number\" && i > -1) {\n to({ i, animated, onFinished });\n return;\n }\n\n if (!count)\n return;\n\n const n = Math.round(count);\n\n if (n < 0)\n prev({ count: Math.abs(n), animated, onFinished });\n\n else\n next({ count: n, animated, onFinished });\n },\n [prev, next, to],\n );\n\n return {\n next,\n prev,\n scrollTo,\n getCurrentIndex,\n getSharedIndex: () => sharedIndex.current,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["useCarouselController.tsx"],"names":["useCarouselController","options","size","loop","dataLength","handlerOffset","withAnimation","defaultIndex","duration","autoFillData","fixedDirection","dataInfo","React","useMemo","length","disable","originalLength","index","sharedIndex","sharedPreIndex","currentFixedPage","useCallback","Math","round","value","fixed","abs","setSharedIndex","newSharedIndex","current","handlerOffsetValue","toInt","isPositive","i","newSharedIndexValue","rawDataLength","getCurrentIndex","realIndex","canSliding","onScrollEnd","onScrollBegin","scrollWithTiming","toValue","onFinished","callback","isFinished","defaultWithAnimation","type","config","easing","Easing","easeOutQuart","next","opts","count","animated","nextPage","prev","prevPage","to","direction","offset","totalSize","isCloseToNextLoop","finalOffset","floor","scrollTo","n","getSharedIndex"],"mappings":"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","sourcesContent":["import React, { useRef } from \"react\";\nimport type Animated from \"react-native-reanimated\";\nimport {\n runOnJS,\n useAnimatedReaction,\n useSharedValue,\n} from \"react-native-reanimated\";\n\nimport { Easing } from \"../constants\";\nimport type {\n TCarouselActionOptions,\n TCarouselProps,\n WithTimingAnimation,\n} from \"../types\";\nimport { computedRealIndexWithAutoFillData, convertToSharedIndex } from \"../utils/computed-with-auto-fill-data\";\nimport { dealWithAnimation } from \"../utils/deal-with-animation\";\nimport { handlerOffsetDirection } from \"../utils/handleroffset-direction\";\nimport { round } from \"../utils/log\";\n\ninterface IOpts {\n loop: boolean\n size: number\n dataLength: number\n handlerOffset: Animated.SharedValue<number>\n autoFillData: TCarouselProps[\"autoFillData\"]\n withAnimation?: TCarouselProps[\"withAnimation\"]\n fixedDirection?: TCarouselProps[\"fixedDirection\"]\n duration?: number\n defaultIndex?: number\n onScrollBegin?: () => void\n onScrollEnd?: () => void\n}\n\nexport interface ICarouselController {\n getSharedIndex: () => number\n prev: (opts?: TCarouselActionOptions) => void\n next: (opts?: TCarouselActionOptions) => void\n getCurrentIndex: () => number\n scrollTo: (opts?: TCarouselActionOptions) => void\n}\n\nexport function useCarouselController(options: IOpts): ICarouselController {\n const {\n size,\n loop,\n dataLength,\n handlerOffset,\n withAnimation,\n defaultIndex = 0,\n duration,\n autoFillData,\n fixedDirection,\n } = options;\n\n const dataInfo = React.useMemo(\n () => ({\n length: dataLength,\n disable: !dataLength,\n originalLength: dataLength,\n }),\n [dataLength],\n );\n\n const index = useSharedValue<number>(defaultIndex);\n // The Index displayed to the user\n const sharedIndex = useRef<number>(defaultIndex);\n const sharedPreIndex = useRef<number>(defaultIndex);\n\n const currentFixedPage = React.useCallback(() => {\n if (loop)\n return -Math.round(handlerOffset.value / size);\n\n const fixed = (handlerOffset.value / size) % dataInfo.length;\n return Math.round(\n handlerOffset.value <= 0\n ? Math.abs(fixed)\n : Math.abs(fixed > 0 ? dataInfo.length - fixed : 0),\n );\n }, [handlerOffset, dataInfo, size, loop]);\n\n function setSharedIndex(newSharedIndex: number) {\n sharedIndex.current = newSharedIndex;\n }\n\n useAnimatedReaction(\n () => {\n const handlerOffsetValue = handlerOffset.value;\n const toInt = round(handlerOffsetValue / size) % dataInfo.length;\n const isPositive = handlerOffsetValue <= 0;\n const i = isPositive\n ? Math.abs(toInt)\n : Math.abs(toInt > 0 ? dataInfo.length - toInt : 0);\n\n const newSharedIndexValue = convertToSharedIndex({\n loop,\n rawDataLength: dataInfo.originalLength,\n autoFillData: autoFillData!,\n index: i,\n });\n\n return {\n i,\n newSharedIndexValue,\n };\n },\n ({ i, newSharedIndexValue }) => {\n index.value = i;\n runOnJS(setSharedIndex)(newSharedIndexValue);\n },\n [\n sharedPreIndex,\n sharedIndex,\n size,\n dataInfo,\n index,\n loop,\n autoFillData,\n handlerOffset,\n ],\n );\n\n const getCurrentIndex = React.useCallback(() => {\n const realIndex = computedRealIndexWithAutoFillData({\n index: index.value,\n dataLength: dataInfo.originalLength,\n loop,\n autoFillData: autoFillData!,\n });\n\n return realIndex;\n }, [index, autoFillData, dataInfo, loop]);\n\n const canSliding = React.useCallback(() => {\n return !dataInfo.disable;\n }, [dataInfo]);\n\n const onScrollEnd = React.useCallback(() => {\n options.onScrollEnd?.();\n }, [options]);\n\n const onScrollBegin = React.useCallback(() => {\n options.onScrollBegin?.();\n }, [options]);\n\n const scrollWithTiming = React.useCallback(\n (toValue: number, onFinished?: () => void) => {\n \"worklet\";\n const callback = (isFinished: boolean) => {\n \"worklet\";\n if (isFinished) {\n runOnJS(onScrollEnd)();\n onFinished && runOnJS(onFinished)();\n }\n };\n\n const defaultWithAnimation: WithTimingAnimation = {\n type: \"timing\",\n config: { duration, easing: Easing.easeOutQuart },\n };\n\n return dealWithAnimation(withAnimation ?? defaultWithAnimation)(\n toValue,\n callback,\n );\n },\n [duration, withAnimation, onScrollEnd],\n );\n\n const next = React.useCallback(\n (opts: TCarouselActionOptions = {}) => {\n \"worklet\";\n const { count = 1, animated = true, onFinished } = opts;\n if (!canSliding() || (!loop && index.value >= dataInfo.length - 1))\n return;\n\n onScrollBegin?.();\n\n const nextPage = currentFixedPage() + count;\n index.value = nextPage;\n\n if (animated) {\n handlerOffset.value = scrollWithTiming(\n -nextPage * size,\n onFinished,\n ) as any;\n }\n else {\n handlerOffset.value = -nextPage * size;\n onFinished?.();\n }\n },\n [\n canSliding,\n loop,\n index,\n dataInfo,\n onScrollBegin,\n handlerOffset,\n size,\n scrollWithTiming,\n currentFixedPage,\n ],\n );\n\n const prev = React.useCallback(\n (opts: TCarouselActionOptions = {}) => {\n const { count = 1, animated = true, onFinished } = opts;\n if (!canSliding() || (!loop && index.value <= 0)) return;\n\n onScrollBegin?.();\n\n const prevPage = currentFixedPage() - count;\n index.value = prevPage;\n\n if (animated) {\n handlerOffset.value = scrollWithTiming(\n -prevPage * size,\n onFinished,\n );\n }\n else {\n handlerOffset.value = -prevPage * size;\n onFinished?.();\n }\n },\n [\n canSliding,\n loop,\n index,\n onScrollBegin,\n handlerOffset,\n size,\n scrollWithTiming,\n currentFixedPage,\n ],\n );\n\n const to = React.useCallback(\n (opts: { i: number; animated: boolean; onFinished?: () => void }) => {\n const { i, animated = false, onFinished } = opts;\n if (i === index.value) return;\n if (!canSliding()) return;\n\n onScrollBegin?.();\n // direction -> 1 | -1\n const direction = handlerOffsetDirection(handlerOffset, fixedDirection);\n\n // target offset\n const offset = i * size * direction;\n // page width size * page count\n const totalSize = dataInfo.length * size;\n\n let isCloseToNextLoop = false;\n\n if (loop) {\n isCloseToNextLoop\n = Math.abs(handlerOffset.value % totalSize) / totalSize\n >= 0.5;\n }\n\n const finalOffset\n = (Math.floor(Math.abs(handlerOffset.value / totalSize))\n + (isCloseToNextLoop ? 1 : 0))\n * totalSize\n * direction\n + offset;\n\n if (animated) {\n index.value = i;\n handlerOffset.value = scrollWithTiming(finalOffset, onFinished);\n }\n else {\n handlerOffset.value = finalOffset;\n index.value = i;\n onFinished?.();\n }\n },\n [\n size,\n loop,\n index,\n fixedDirection,\n handlerOffset,\n dataInfo.length,\n canSliding,\n onScrollBegin,\n scrollWithTiming,\n ],\n );\n\n const scrollTo = React.useCallback(\n (opts: TCarouselActionOptions = {}) => {\n const { index: i, count, animated = false, onFinished } = opts;\n if (typeof i === \"number\" && i > -1) {\n to({ i, animated, onFinished });\n return;\n }\n\n if (!count)\n return;\n\n const n = Math.round(count);\n\n if (n < 0)\n prev({ count: Math.abs(n), animated, onFinished });\n\n else\n next({ count: n, animated, onFinished });\n },\n [prev, next, to],\n );\n\n return {\n next,\n prev,\n scrollTo,\n getCurrentIndex,\n getSharedIndex: () => sharedIndex.current,\n };\n}\n"]}
|
|
@@ -12,10 +12,10 @@ function useVisibleRanges(options) {
|
|
|
12
12
|
total = 0,
|
|
13
13
|
viewSize,
|
|
14
14
|
translation,
|
|
15
|
-
windowSize: _windowSize
|
|
15
|
+
windowSize: _windowSize,
|
|
16
16
|
loop
|
|
17
17
|
} = options;
|
|
18
|
-
const windowSize =
|
|
18
|
+
const windowSize = _windowSize !== null && _windowSize !== void 0 ? _windowSize : total;
|
|
19
19
|
const ranges = (0, _reactNativeReanimated.useDerivedValue)(() => {
|
|
20
20
|
const positiveCount = Math.round(windowSize / 2);
|
|
21
21
|
const negativeCount = windowSize - positiveCount;
|
|
@@ -27,7 +27,7 @@ function useVisibleRanges(options) {
|
|
|
27
27
|
// So, It will be only displayed the positive items.
|
|
28
28
|
return {
|
|
29
29
|
negativeRange: [0 + currentIndex - (windowSize - 1), 0 + currentIndex],
|
|
30
|
-
positiveRange: [0 + currentIndex, windowSize - 1
|
|
30
|
+
positiveRange: [0 + currentIndex, currentIndex + (windowSize - 1)]
|
|
31
31
|
};
|
|
32
32
|
}
|
|
33
33
|
|
|
@@ -42,7 +42,8 @@ function useVisibleRanges(options) {
|
|
|
42
42
|
if (positiveRange[0] > positiveRange[1]) {
|
|
43
43
|
negativeRange[1] = total - 1;
|
|
44
44
|
positiveRange[0] = 0;
|
|
45
|
-
}
|
|
45
|
+
} // console.log({ negativeRange, positiveRange ,total,windowSize,a:total <= _windowSize})
|
|
46
|
+
|
|
46
47
|
|
|
47
48
|
return {
|
|
48
49
|
negativeRange,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useVisibleRanges.tsx"],"names":["useVisibleRanges","options","total","viewSize","translation","windowSize","_windowSize","loop","ranges","positiveCount","Math","round","negativeCount","currentIndex","value","negativeRange","positiveRange"],"mappings":";;;;;;;AACA;;AAOO,SAASA,gBAAT,CAA0BC,OAA1B,EAMY;AACjB,QAAM;AACJC,IAAAA,KAAK,GAAG,CADJ;AAEJC,IAAAA,QAFI;AAGJC,IAAAA,WAHI;AAIJC,IAAAA,UAAU,EAAEC,
|
|
1
|
+
{"version":3,"sources":["useVisibleRanges.tsx"],"names":["useVisibleRanges","options","total","viewSize","translation","windowSize","_windowSize","loop","ranges","positiveCount","Math","round","negativeCount","currentIndex","value","negativeRange","positiveRange"],"mappings":";;;;;;;AACA;;AAOO,SAASA,gBAAT,CAA0BC,OAA1B,EAMY;AACjB,QAAM;AACJC,IAAAA,KAAK,GAAG,CADJ;AAEJC,IAAAA,QAFI;AAGJC,IAAAA,WAHI;AAIJC,IAAAA,UAAU,EAAEC,WAJR;AAKJC,IAAAA;AALI,MAMFN,OANJ;AAQA,QAAMI,UAAU,GAAGC,WAAH,aAAGA,WAAH,cAAGA,WAAH,GAAkBJ,KAAlC;AAEA,QAAMM,MAAM,GAAG,4CAAgB,MAAM;AACnC,UAAMC,aAAa,GAAGC,IAAI,CAACC,KAAL,CAAWN,UAAU,GAAG,CAAxB,CAAtB;AACA,UAAMO,aAAa,GAAGP,UAAU,GAAGI,aAAnC;AAEA,QAAII,YAAY,GAAGH,IAAI,CAACC,KAAL,CAAW,CAACP,WAAW,CAACU,KAAb,GAAqBX,QAAhC,CAAnB;AACAU,IAAAA,YAAY,GAAGA,YAAY,GAAG,CAAf,GAAoBA,YAAY,GAAGX,KAAhB,GAAyBA,KAA5C,GAAoDW,YAAnE;;AAEA,QAAI,CAACN,IAAL,EAAW;AACT;AACA;AACA,aAAO;AACLQ,QAAAA,aAAa,EAAE,CAAC,IAAIF,YAAJ,IAAoBR,UAAU,GAAG,CAAjC,CAAD,EAAsC,IAAIQ,YAA1C,CADV;AAELG,QAAAA,aAAa,EAAE,CAAC,IAAIH,YAAL,EAAmBA,YAAY,IAAIR,UAAU,GAAG,CAAjB,CAA/B;AAFV,OAAP;AAID;;AAED,UAAMU,aAAa,GAAG,CACpB,CAACF,YAAY,GAAGD,aAAf,GAA+BV,KAAhC,IAAyCA,KADrB,EAEpB,CAACW,YAAY,GAAG,CAAf,GAAmBX,KAApB,IAA6BA,KAFT,CAAtB;AAKA,UAAMc,aAAa,GAAG,CACpB,CAACH,YAAY,GAAGX,KAAhB,IAAyBA,KADL,EAEpB,CAACW,YAAY,GAAGJ,aAAf,GAA+BP,KAAhC,IAAyCA,KAFrB,CAAtB;;AAKA,QAAIa,aAAa,CAAC,CAAD,CAAb,GAAmBb,KAAnB,IAA4Ba,aAAa,CAAC,CAAD,CAAb,GAAmBA,aAAa,CAAC,CAAD,CAAhE,EAAqE;AACnEA,MAAAA,aAAa,CAAC,CAAD,CAAb,GAAmBb,KAAK,GAAG,CAA3B;AACAc,MAAAA,aAAa,CAAC,CAAD,CAAb,GAAmB,CAAnB;AACD;;AACD,QAAIA,aAAa,CAAC,CAAD,CAAb,GAAmBA,aAAa,CAAC,CAAD,CAApC,EAAyC;AACvCD,MAAAA,aAAa,CAAC,CAAD,CAAb,GAAmBb,KAAK,GAAG,CAA3B;AACAc,MAAAA,aAAa,CAAC,CAAD,CAAb,GAAmB,CAAnB;AACD,KAjCkC,CAkCnC;;;AACA,WAAO;AAAED,MAAAA,aAAF;AAAiBC,MAAAA;AAAjB,KAAP;AACD,GApCc,EAoCZ,CAACT,IAAD,EAAOL,KAAP,EAAcG,UAAd,EAA0BD,WAA1B,CApCY,CAAf;AAsCA,SAAOI,MAAP;AACD","sourcesContent":["import type Animated from \"react-native-reanimated\";\nimport { useDerivedValue } from \"react-native-reanimated\";\n\nexport type IVisibleRanges = Animated.SharedValue<{\n negativeRange: number[]\n positiveRange: number[]\n}>;\n\nexport function useVisibleRanges(options: {\n total: number\n viewSize: number\n windowSize?: number\n translation: Animated.SharedValue<number>\n loop?: boolean\n}): IVisibleRanges {\n const {\n total = 0,\n viewSize,\n translation,\n windowSize: _windowSize,\n loop,\n } = options;\n\n const windowSize = _windowSize ?? total;\n\n const ranges = useDerivedValue(() => {\n const positiveCount = Math.round(windowSize / 2);\n const negativeCount = windowSize - positiveCount;\n\n let currentIndex = Math.round(-translation.value / viewSize);\n currentIndex = currentIndex < 0 ? (currentIndex % total) + total : currentIndex;\n\n if (!loop) {\n // Adjusting negative range if the carousel is not loopable.\n // So, It will be only displayed the positive items.\n return {\n negativeRange: [0 + currentIndex - (windowSize - 1), 0 + currentIndex],\n positiveRange: [0 + currentIndex, currentIndex + (windowSize - 1)],\n };\n }\n\n const negativeRange = [\n (currentIndex - negativeCount + total) % total,\n (currentIndex - 1 + total) % total,\n ];\n\n const positiveRange = [\n (currentIndex + total) % total,\n (currentIndex + positiveCount + total) % total,\n ];\n\n if (negativeRange[0] < total && negativeRange[0] > negativeRange[1]) {\n negativeRange[1] = total - 1;\n positiveRange[0] = 0;\n }\n if (positiveRange[0] > positiveRange[1]) {\n negativeRange[1] = total - 1;\n positiveRange[0] = 0;\n }\n // console.log({ negativeRange, positiveRange ,total,windowSize,a:total <= _windowSize})\n return { negativeRange, positiveRange };\n }, [loop, total, windowSize, translation]);\n\n return ranges;\n}\n"]}
|
|
@@ -5,12 +5,12 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.handlerOffsetDirection = handlerOffsetDirection;
|
|
7
7
|
|
|
8
|
-
function handlerOffsetDirection(handlerOffset) {
|
|
8
|
+
function handlerOffsetDirection(handlerOffset, fixedDirection) {
|
|
9
9
|
"worklet";
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
return
|
|
11
|
+
if (fixedDirection === "negative") return -1;
|
|
12
|
+
if (fixedDirection === "positive") return 1;
|
|
13
|
+
if (handlerOffset.value === 0) return -1;
|
|
14
|
+
return Math.sign(handlerOffset.value);
|
|
15
15
|
}
|
|
16
16
|
//# sourceMappingURL=handleroffset-direction.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["handleroffset-direction.ts"],"names":["handlerOffsetDirection","handlerOffset","
|
|
1
|
+
{"version":3,"sources":["handleroffset-direction.ts"],"names":["handlerOffsetDirection","handlerOffset","fixedDirection","value","Math","sign"],"mappings":";;;;;;;AAIO,SAASA,sBAAT,CAAgCC,aAAhC,EAAoEC,cAApE,EAA+H;AACpI;;AAEA,MAAIA,cAAc,KAAK,UAAvB,EACE,OAAO,CAAC,CAAR;AAEF,MAAIA,cAAc,KAAK,UAAvB,EACE,OAAO,CAAP;AAEF,MAAID,aAAa,CAACE,KAAd,KAAwB,CAA5B,EACE,OAAO,CAAC,CAAR;AAEF,SAAOC,IAAI,CAACC,IAAL,CAAUJ,aAAa,CAACE,KAAxB,CAAP;AACD","sourcesContent":["import type { SharedValue } from \"react-native-reanimated\";\n\nimport type { TCarouselProps } from \"../types\";\n\nexport function handlerOffsetDirection(handlerOffset: SharedValue<number>, fixedDirection?: TCarouselProps[\"fixedDirection\"]): -1 | 1 {\n \"worklet\";\n\n if (fixedDirection === \"negative\")\n return -1;\n\n if (fixedDirection === \"positive\")\n return 1;\n\n if (handlerOffset.value === 0)\n return -1;\n\n return Math.sign(handlerOffset.value) as -1 | 1;\n}\n"]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _reactNativeReanimated = require("react-native-reanimated");
|
|
4
|
+
|
|
5
|
+
var _reactHooks = require("@testing-library/react-hooks");
|
|
6
|
+
|
|
7
|
+
var _handleroffsetDirection = require("./handleroffset-direction");
|
|
8
|
+
|
|
9
|
+
describe("handlerOffsetDirection", () => {
|
|
10
|
+
it("should return -1 when default value equals to zero", () => {
|
|
11
|
+
const result = (0, _reactHooks.renderHook)(() => {
|
|
12
|
+
const handlerOffsetAnimVal = (0, _reactNativeReanimated.useSharedValue)(0);
|
|
13
|
+
return (0, _handleroffsetDirection.handlerOffsetDirection)(handlerOffsetAnimVal);
|
|
14
|
+
});
|
|
15
|
+
expect(result.result.current).toBe(-1);
|
|
16
|
+
});
|
|
17
|
+
it("should return 1 when default value is greater than zero", () => {
|
|
18
|
+
const result = (0, _reactHooks.renderHook)(() => {
|
|
19
|
+
const handlerOffsetAnimVal = (0, _reactNativeReanimated.useSharedValue)(1);
|
|
20
|
+
return (0, _handleroffsetDirection.handlerOffsetDirection)(handlerOffsetAnimVal);
|
|
21
|
+
});
|
|
22
|
+
expect(result.result.current).toBe(1);
|
|
23
|
+
});
|
|
24
|
+
it("should return -1 when default value is less than zero", () => {
|
|
25
|
+
const result = (0, _reactHooks.renderHook)(() => {
|
|
26
|
+
const handlerOffsetAnimVal = (0, _reactNativeReanimated.useSharedValue)(-1);
|
|
27
|
+
return (0, _handleroffsetDirection.handlerOffsetDirection)(handlerOffsetAnimVal);
|
|
28
|
+
});
|
|
29
|
+
expect(result.result.current).toBe(-1);
|
|
30
|
+
});
|
|
31
|
+
it("should return 1 when default value equals to zero and fixedDirection is negative", () => {
|
|
32
|
+
const result = (0, _reactHooks.renderHook)(() => {
|
|
33
|
+
const handlerOffsetAnimVal = (0, _reactNativeReanimated.useSharedValue)(-1);
|
|
34
|
+
return (0, _handleroffsetDirection.handlerOffsetDirection)(handlerOffsetAnimVal, "positive");
|
|
35
|
+
});
|
|
36
|
+
expect(result.result.current).toBe(1);
|
|
37
|
+
});
|
|
38
|
+
it("should return -1 when default value is greater than zero and fixedDirection is negative", () => {
|
|
39
|
+
const result = (0, _reactHooks.renderHook)(() => {
|
|
40
|
+
const handlerOffsetAnimVal = (0, _reactNativeReanimated.useSharedValue)(1);
|
|
41
|
+
return (0, _handleroffsetDirection.handlerOffsetDirection)(handlerOffsetAnimVal, "negative");
|
|
42
|
+
});
|
|
43
|
+
expect(result.result.current).toBe(-1);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
//# sourceMappingURL=handleroffset-direction.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["handleroffset-direction.test.ts"],"names":["describe","it","result","handlerOffsetAnimVal","expect","current","toBe"],"mappings":";;AAAA;;AAEA;;AAEA;;AAEAA,QAAQ,CAAC,wBAAD,EAA2B,MAAM;AACvCC,EAAAA,EAAE,CAAC,oDAAD,EAAuD,MAAM;AAC7D,UAAMC,MAAM,GAAG,4BAAW,MAAM;AAC9B,YAAMC,oBAAoB,GAAG,2CAAe,CAAf,CAA7B;AACA,aAAO,oDAAuBA,oBAAvB,CAAP;AACD,KAHc,CAAf;AAKAC,IAAAA,MAAM,CAACF,MAAM,CAACA,MAAP,CAAcG,OAAf,CAAN,CAA8BC,IAA9B,CAAmC,CAAC,CAApC;AACD,GAPC,CAAF;AASAL,EAAAA,EAAE,CAAC,yDAAD,EAA4D,MAAM;AAClE,UAAMC,MAAM,GAAG,4BAAW,MAAM;AAC9B,YAAMC,oBAAoB,GAAG,2CAAe,CAAf,CAA7B;AACA,aAAO,oDAAuBA,oBAAvB,CAAP;AACD,KAHc,CAAf;AAKAC,IAAAA,MAAM,CAACF,MAAM,CAACA,MAAP,CAAcG,OAAf,CAAN,CAA8BC,IAA9B,CAAmC,CAAnC;AACD,GAPC,CAAF;AASAL,EAAAA,EAAE,CAAC,uDAAD,EAA0D,MAAM;AAChE,UAAMC,MAAM,GAAG,4BAAW,MAAM;AAC9B,YAAMC,oBAAoB,GAAG,2CAAe,CAAC,CAAhB,CAA7B;AACA,aAAO,oDAAuBA,oBAAvB,CAAP;AACD,KAHc,CAAf;AAKAC,IAAAA,MAAM,CAACF,MAAM,CAACA,MAAP,CAAcG,OAAf,CAAN,CAA8BC,IAA9B,CAAmC,CAAC,CAApC;AACD,GAPC,CAAF;AASAL,EAAAA,EAAE,CAAC,kFAAD,EAAqF,MAAM;AAC3F,UAAMC,MAAM,GAAG,4BAAW,MAAM;AAC9B,YAAMC,oBAAoB,GAAG,2CAAe,CAAC,CAAhB,CAA7B;AACA,aAAO,oDAAuBA,oBAAvB,EAA6C,UAA7C,CAAP;AACD,KAHc,CAAf;AAKAC,IAAAA,MAAM,CAACF,MAAM,CAACA,MAAP,CAAcG,OAAf,CAAN,CAA8BC,IAA9B,CAAmC,CAAnC;AACD,GAPC,CAAF;AASAL,EAAAA,EAAE,CAAC,yFAAD,EAA4F,MAAM;AAClG,UAAMC,MAAM,GAAG,4BAAW,MAAM;AAC9B,YAAMC,oBAAoB,GAAG,2CAAe,CAAf,CAA7B;AACA,aAAO,oDAAuBA,oBAAvB,EAA6C,UAA7C,CAAP;AACD,KAHc,CAAf;AAKAC,IAAAA,MAAM,CAACF,MAAM,CAACA,MAAP,CAAcG,OAAf,CAAN,CAA8BC,IAA9B,CAAmC,CAAC,CAApC;AACD,GAPC,CAAF;AAQD,CA7CO,CAAR","sourcesContent":["import { useSharedValue } from \"react-native-reanimated\";\n\nimport { renderHook } from \"@testing-library/react-hooks\";\n\nimport { handlerOffsetDirection } from \"./handleroffset-direction\";\n\ndescribe(\"handlerOffsetDirection\", () => {\n it(\"should return -1 when default value equals to zero\", () => {\n const result = renderHook(() => {\n const handlerOffsetAnimVal = useSharedValue(0);\n return handlerOffsetDirection(handlerOffsetAnimVal);\n });\n\n expect(result.result.current).toBe(-1);\n });\n\n it(\"should return 1 when default value is greater than zero\", () => {\n const result = renderHook(() => {\n const handlerOffsetAnimVal = useSharedValue(1);\n return handlerOffsetDirection(handlerOffsetAnimVal);\n });\n\n expect(result.result.current).toBe(1);\n });\n\n it(\"should return -1 when default value is less than zero\", () => {\n const result = renderHook(() => {\n const handlerOffsetAnimVal = useSharedValue(-1);\n return handlerOffsetDirection(handlerOffsetAnimVal);\n });\n\n expect(result.result.current).toBe(-1);\n });\n\n it(\"should return 1 when default value equals to zero and fixedDirection is negative\", () => {\n const result = renderHook(() => {\n const handlerOffsetAnimVal = useSharedValue(-1);\n return handlerOffsetDirection(handlerOffsetAnimVal, \"positive\");\n });\n\n expect(result.result.current).toBe(1);\n });\n\n it(\"should return -1 when default value is greater than zero and fixedDirection is negative\", () => {\n const result = renderHook(() => {\n const handlerOffsetAnimVal = useSharedValue(1);\n return handlerOffsetDirection(handlerOffsetAnimVal, \"negative\");\n });\n\n expect(result.result.current).toBe(-1);\n });\n});\n"]}
|
|
@@ -39,6 +39,7 @@ const Carousel = /*#__PURE__*/React.forwardRef((_props, ref) => {
|
|
|
39
39
|
autoPlayInterval,
|
|
40
40
|
scrollAnimationDuration,
|
|
41
41
|
withAnimation,
|
|
42
|
+
fixedDirection,
|
|
42
43
|
renderItem,
|
|
43
44
|
onScrollEnd,
|
|
44
45
|
onSnapToItem,
|
|
@@ -77,9 +78,10 @@ const Carousel = /*#__PURE__*/React.forwardRef((_props, ref) => {
|
|
|
77
78
|
handlerOffset,
|
|
78
79
|
withAnimation,
|
|
79
80
|
defaultIndex,
|
|
81
|
+
fixedDirection,
|
|
82
|
+
duration: scrollAnimationDuration,
|
|
80
83
|
onScrollEnd: () => runOnJS(_onScrollEnd)(),
|
|
81
|
-
onScrollBegin: () => !!onScrollBegin && runOnJS(onScrollBegin)()
|
|
82
|
-
duration: scrollAnimationDuration
|
|
84
|
+
onScrollBegin: () => !!onScrollBegin && runOnJS(onScrollBegin)()
|
|
83
85
|
});
|
|
84
86
|
const {
|
|
85
87
|
next,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["Carousel.tsx"],"names":["React","StyleSheet","GestureHandlerRootView","runOnJS","useDerivedValue","BaseLayout","ScrollViewGesture","useAutoPlay","useCarouselController","useCommonVariables","useInitProps","useLayoutConfig","useOnProgressChange","usePropsErrorBoundary","useVisibleRanges","CTX","computedRealIndexWithAutoFillData","Carousel","forwardRef","_props","ref","props","testID","loop","autoFillData","data","dataLength","rawData","rawDataLength","mode","style","width","height","vertical","autoPlay","windowSize","autoPlayReverse","autoPlayInterval","scrollAnimationDuration","withAnimation","renderItem","onScrollEnd","onSnapToItem","onScrollBegin","onProgressChange","customAnimation","defaultIndex","commonVariables","size","handlerOffset","offsetX","totalSize","x","value","isNaN","carouselController","_onScrollEnd","duration","next","prev","scrollTo","getSharedIndex","getCurrentIndex","start","startAutoPlay","pause","pauseAutoPlay","useCallback","_sharedIndex","Math","round","realIndex","index","scrollViewGestureOnScrollBegin","scrollViewGestureOnScrollEnd","scrollViewGestureOnTouchBegin","scrollViewGestureOnTouchEnd","useImperativeHandle","visibleRanges","total","viewSize","translation","layoutConfig","renderLayout","item","i","animationValue","common","styles","container","itemsVertical","itemsHorizontal","map","create","overflow","flexDirection"],"mappings":"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","sourcesContent":["import React from \"react\";\nimport { StyleSheet } from \"react-native\";\nimport { GestureHandlerRootView } from \"react-native-gesture-handler\";\nimport { runOnJS, useDerivedValue } from \"react-native-reanimated\";\n\nimport { BaseLayout } from \"./BaseLayout\";\nimport { ScrollViewGesture } from \"./ScrollViewGesture\";\n\nimport { useAutoPlay } from \"../hooks/useAutoPlay\";\nimport { useCarouselController } from \"../hooks/useCarouselController\";\nimport { useCommonVariables } from \"../hooks/useCommonVariables\";\nimport { useInitProps } from \"../hooks/useInitProps\";\nimport { useLayoutConfig } from \"../hooks/useLayoutConfig\";\nimport { useOnProgressChange } from \"../hooks/useOnProgressChange\";\nimport { usePropsErrorBoundary } from \"../hooks/usePropsErrorBoundary\";\nimport { useVisibleRanges } from \"../hooks/useVisibleRanges\";\nimport { CTX } from \"../store\";\nimport type { ICarouselInstance, TCarouselProps } from \"../types\";\nimport { computedRealIndexWithAutoFillData } from \"../utils/computed-with-auto-fill-data\";\n\nconst Carousel = React.forwardRef<ICarouselInstance, TCarouselProps<any>>(\n (_props, ref) => {\n const props = useInitProps(_props);\n\n const {\n testID,\n loop,\n autoFillData,\n // Fill data with autoFillData\n data,\n // Length of fill data\n dataLength,\n // Raw data that has not been processed\n rawData,\n // Length of raw data\n rawDataLength,\n mode,\n style,\n width,\n height,\n vertical,\n autoPlay,\n windowSize,\n autoPlayReverse,\n autoPlayInterval,\n scrollAnimationDuration,\n withAnimation,\n renderItem,\n onScrollEnd,\n onSnapToItem,\n onScrollBegin,\n onProgressChange,\n customAnimation,\n defaultIndex,\n } = props;\n\n const commonVariables = useCommonVariables(props);\n const { size, handlerOffset } = commonVariables;\n\n const offsetX = useDerivedValue(() => {\n const totalSize = size * dataLength;\n const x = handlerOffset.value % totalSize;\n\n if (!loop)\n return handlerOffset.value;\n\n return isNaN(x) ? 0 : x;\n }, [loop, size, dataLength]);\n\n usePropsErrorBoundary({ ...props, dataLength });\n useOnProgressChange({\n autoFillData,\n loop,\n size,\n offsetX,\n rawDataLength,\n onProgressChange,\n });\n\n const carouselController = useCarouselController({\n loop,\n size,\n dataLength,\n autoFillData,\n handlerOffset,\n withAnimation,\n defaultIndex,\n onScrollEnd: () => runOnJS(_onScrollEnd)(),\n onScrollBegin: () => !!onScrollBegin && runOnJS(onScrollBegin)(),\n duration: scrollAnimationDuration,\n });\n\n const { next, prev, scrollTo, getSharedIndex, getCurrentIndex }\n = carouselController;\n\n const { start: startAutoPlay, pause: pauseAutoPlay } = useAutoPlay({\n autoPlay,\n autoPlayInterval,\n autoPlayReverse,\n carouselController,\n });\n\n const _onScrollEnd = React.useCallback(() => {\n const _sharedIndex = Math.round(getSharedIndex());\n\n const realIndex = computedRealIndexWithAutoFillData({\n index: _sharedIndex,\n dataLength: rawDataLength,\n loop,\n autoFillData,\n });\n\n if (onSnapToItem)\n onSnapToItem(realIndex);\n\n if (onScrollEnd)\n onScrollEnd(realIndex);\n }, [\n loop,\n autoFillData,\n rawDataLength,\n getSharedIndex,\n onSnapToItem,\n onScrollEnd,\n ]);\n\n const scrollViewGestureOnScrollBegin = React.useCallback(() => {\n pauseAutoPlay();\n onScrollBegin?.();\n }, [onScrollBegin, pauseAutoPlay]);\n\n const scrollViewGestureOnScrollEnd = React.useCallback(() => {\n startAutoPlay();\n _onScrollEnd();\n }, [_onScrollEnd, startAutoPlay]);\n\n const scrollViewGestureOnTouchBegin = React.useCallback(pauseAutoPlay, [\n pauseAutoPlay,\n ]);\n\n const scrollViewGestureOnTouchEnd = React.useCallback(startAutoPlay, [\n startAutoPlay,\n ]);\n\n React.useImperativeHandle(\n ref,\n () => ({\n next,\n prev,\n getCurrentIndex,\n scrollTo,\n }),\n [getCurrentIndex, next, prev, scrollTo],\n );\n\n const visibleRanges = useVisibleRanges({\n total: dataLength,\n viewSize: size,\n translation: handlerOffset,\n windowSize,\n loop,\n });\n\n const layoutConfig = useLayoutConfig({ ...props, size });\n\n const renderLayout = React.useCallback(\n (item: any, i: number) => {\n const realIndex = computedRealIndexWithAutoFillData({\n index: i,\n dataLength: rawDataLength,\n loop,\n autoFillData,\n });\n\n return (\n <BaseLayout\n key={i}\n index={i}\n handlerOffset={offsetX}\n visibleRanges={visibleRanges}\n animationStyle={customAnimation || layoutConfig}\n >\n {({ animationValue }) =>\n renderItem({\n item,\n index: realIndex,\n animationValue,\n })\n }\n </BaseLayout>\n );\n },\n [\n loop,\n rawData,\n offsetX,\n visibleRanges,\n autoFillData,\n renderItem,\n layoutConfig,\n customAnimation,\n ],\n );\n\n return (\n <GestureHandlerRootView>\n <CTX.Provider value={{ props, common: commonVariables }}>\n <ScrollViewGesture\n key={mode}\n size={size}\n translation={handlerOffset}\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 testID={testID}\n onScrollBegin={scrollViewGestureOnScrollBegin}\n onScrollEnd={scrollViewGestureOnScrollEnd}\n onTouchBegin={scrollViewGestureOnTouchBegin}\n onTouchEnd={scrollViewGestureOnTouchEnd}\n >\n {data.map(renderLayout)}\n </ScrollViewGesture>\n </CTX.Provider>\n </GestureHandlerRootView>\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","StyleSheet","GestureHandlerRootView","runOnJS","useDerivedValue","BaseLayout","ScrollViewGesture","useAutoPlay","useCarouselController","useCommonVariables","useInitProps","useLayoutConfig","useOnProgressChange","usePropsErrorBoundary","useVisibleRanges","CTX","computedRealIndexWithAutoFillData","Carousel","forwardRef","_props","ref","props","testID","loop","autoFillData","data","dataLength","rawData","rawDataLength","mode","style","width","height","vertical","autoPlay","windowSize","autoPlayReverse","autoPlayInterval","scrollAnimationDuration","withAnimation","fixedDirection","renderItem","onScrollEnd","onSnapToItem","onScrollBegin","onProgressChange","customAnimation","defaultIndex","commonVariables","size","handlerOffset","offsetX","totalSize","x","value","isNaN","carouselController","duration","_onScrollEnd","next","prev","scrollTo","getSharedIndex","getCurrentIndex","start","startAutoPlay","pause","pauseAutoPlay","useCallback","_sharedIndex","Math","round","realIndex","index","scrollViewGestureOnScrollBegin","scrollViewGestureOnScrollEnd","scrollViewGestureOnTouchBegin","scrollViewGestureOnTouchEnd","useImperativeHandle","visibleRanges","total","viewSize","translation","layoutConfig","renderLayout","item","i","animationValue","common","styles","container","itemsVertical","itemsHorizontal","map","create","overflow","flexDirection"],"mappings":"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","sourcesContent":["import React from \"react\";\nimport { StyleSheet } from \"react-native\";\nimport { GestureHandlerRootView } from \"react-native-gesture-handler\";\nimport { runOnJS, useDerivedValue } from \"react-native-reanimated\";\n\nimport { BaseLayout } from \"./BaseLayout\";\nimport { ScrollViewGesture } from \"./ScrollViewGesture\";\n\nimport { useAutoPlay } from \"../hooks/useAutoPlay\";\nimport { useCarouselController } from \"../hooks/useCarouselController\";\nimport { useCommonVariables } from \"../hooks/useCommonVariables\";\nimport { useInitProps } from \"../hooks/useInitProps\";\nimport { useLayoutConfig } from \"../hooks/useLayoutConfig\";\nimport { useOnProgressChange } from \"../hooks/useOnProgressChange\";\nimport { usePropsErrorBoundary } from \"../hooks/usePropsErrorBoundary\";\nimport { useVisibleRanges } from \"../hooks/useVisibleRanges\";\nimport { CTX } from \"../store\";\nimport type { ICarouselInstance, TCarouselProps } from \"../types\";\nimport { computedRealIndexWithAutoFillData } from \"../utils/computed-with-auto-fill-data\";\n\nconst Carousel = React.forwardRef<ICarouselInstance, TCarouselProps<any>>(\n (_props, ref) => {\n const props = useInitProps(_props);\n\n const {\n testID,\n loop,\n autoFillData,\n // Fill data with autoFillData\n data,\n // Length of fill data\n dataLength,\n // Raw data that has not been processed\n rawData,\n // Length of raw data\n rawDataLength,\n mode,\n style,\n width,\n height,\n vertical,\n autoPlay,\n windowSize,\n autoPlayReverse,\n autoPlayInterval,\n scrollAnimationDuration,\n withAnimation,\n fixedDirection,\n renderItem,\n onScrollEnd,\n onSnapToItem,\n onScrollBegin,\n onProgressChange,\n customAnimation,\n defaultIndex,\n } = props;\n\n const commonVariables = useCommonVariables(props);\n const { size, handlerOffset } = commonVariables;\n\n const offsetX = useDerivedValue(() => {\n const totalSize = size * dataLength;\n const x = handlerOffset.value % totalSize;\n\n if (!loop)\n return handlerOffset.value;\n\n return isNaN(x) ? 0 : x;\n }, [loop, size, dataLength]);\n\n usePropsErrorBoundary({ ...props, dataLength });\n useOnProgressChange({\n autoFillData,\n loop,\n size,\n offsetX,\n rawDataLength,\n onProgressChange,\n });\n\n const carouselController = useCarouselController({\n loop,\n size,\n dataLength,\n autoFillData,\n handlerOffset,\n withAnimation,\n defaultIndex,\n fixedDirection,\n duration: scrollAnimationDuration,\n onScrollEnd: () => runOnJS(_onScrollEnd)(),\n onScrollBegin: () => !!onScrollBegin && runOnJS(onScrollBegin)(),\n });\n\n const { next, prev, scrollTo, getSharedIndex, getCurrentIndex }\n = carouselController;\n\n const { start: startAutoPlay, pause: pauseAutoPlay } = useAutoPlay({\n autoPlay,\n autoPlayInterval,\n autoPlayReverse,\n carouselController,\n });\n\n const _onScrollEnd = React.useCallback(() => {\n const _sharedIndex = Math.round(getSharedIndex());\n\n const realIndex = computedRealIndexWithAutoFillData({\n index: _sharedIndex,\n dataLength: rawDataLength,\n loop,\n autoFillData,\n });\n\n if (onSnapToItem)\n onSnapToItem(realIndex);\n\n if (onScrollEnd)\n onScrollEnd(realIndex);\n }, [\n loop,\n autoFillData,\n rawDataLength,\n getSharedIndex,\n onSnapToItem,\n onScrollEnd,\n ]);\n\n const scrollViewGestureOnScrollBegin = React.useCallback(() => {\n pauseAutoPlay();\n onScrollBegin?.();\n }, [onScrollBegin, pauseAutoPlay]);\n\n const scrollViewGestureOnScrollEnd = React.useCallback(() => {\n startAutoPlay();\n _onScrollEnd();\n }, [_onScrollEnd, startAutoPlay]);\n\n const scrollViewGestureOnTouchBegin = React.useCallback(pauseAutoPlay, [\n pauseAutoPlay,\n ]);\n\n const scrollViewGestureOnTouchEnd = React.useCallback(startAutoPlay, [\n startAutoPlay,\n ]);\n\n React.useImperativeHandle(\n ref,\n () => ({\n next,\n prev,\n getCurrentIndex,\n scrollTo,\n }),\n [getCurrentIndex, next, prev, scrollTo],\n );\n\n const visibleRanges = useVisibleRanges({\n total: dataLength,\n viewSize: size,\n translation: handlerOffset,\n windowSize,\n loop,\n });\n\n const layoutConfig = useLayoutConfig({ ...props, size });\n\n const renderLayout = React.useCallback(\n (item: any, i: number) => {\n const realIndex = computedRealIndexWithAutoFillData({\n index: i,\n dataLength: rawDataLength,\n loop,\n autoFillData,\n });\n\n return (\n <BaseLayout\n key={i}\n index={i}\n handlerOffset={offsetX}\n visibleRanges={visibleRanges}\n animationStyle={customAnimation || layoutConfig}\n >\n {({ animationValue }) =>\n renderItem({\n item,\n index: realIndex,\n animationValue,\n })\n }\n </BaseLayout>\n );\n },\n [\n loop,\n rawData,\n offsetX,\n visibleRanges,\n autoFillData,\n renderItem,\n layoutConfig,\n customAnimation,\n ],\n );\n\n return (\n <GestureHandlerRootView>\n <CTX.Provider value={{ props, common: commonVariables }}>\n <ScrollViewGesture\n key={mode}\n size={size}\n translation={handlerOffset}\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 testID={testID}\n onScrollBegin={scrollViewGestureOnScrollBegin}\n onScrollEnd={scrollViewGestureOnScrollEnd}\n onTouchBegin={scrollViewGestureOnTouchBegin}\n onTouchEnd={scrollViewGestureOnTouchEnd}\n >\n {data.map(renderLayout)}\n </ScrollViewGesture>\n </CTX.Provider>\n </GestureHandlerRootView>\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"]}
|
|
@@ -14,7 +14,8 @@ export function useCarouselController(options) {
|
|
|
14
14
|
withAnimation,
|
|
15
15
|
defaultIndex = 0,
|
|
16
16
|
duration,
|
|
17
|
-
autoFillData
|
|
17
|
+
autoFillData,
|
|
18
|
+
fixedDirection
|
|
18
19
|
} = options;
|
|
19
20
|
const dataInfo = React.useMemo(() => ({
|
|
20
21
|
length: dataLength,
|
|
@@ -151,7 +152,7 @@ export function useCarouselController(options) {
|
|
|
151
152
|
if (!canSliding()) return;
|
|
152
153
|
onScrollBegin === null || onScrollBegin === void 0 ? void 0 : onScrollBegin(); // direction -> 1 | -1
|
|
153
154
|
|
|
154
|
-
const direction = handlerOffsetDirection(handlerOffset); // target offset
|
|
155
|
+
const direction = handlerOffsetDirection(handlerOffset, fixedDirection); // target offset
|
|
155
156
|
|
|
156
157
|
const offset = i * size * direction; // page width size * page count
|
|
157
158
|
|
|
@@ -172,7 +173,7 @@ export function useCarouselController(options) {
|
|
|
172
173
|
index.value = i;
|
|
173
174
|
onFinished === null || onFinished === void 0 ? void 0 : onFinished();
|
|
174
175
|
}
|
|
175
|
-
}, [
|
|
176
|
+
}, [size, loop, index, fixedDirection, handlerOffset, dataInfo.length, canSliding, onScrollBegin, scrollWithTiming]);
|
|
176
177
|
const scrollTo = React.useCallback(function () {
|
|
177
178
|
let opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
178
179
|
const {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useCarouselController.tsx"],"names":["React","useRef","runOnJS","useAnimatedReaction","useSharedValue","Easing","computedRealIndexWithAutoFillData","convertToSharedIndex","dealWithAnimation","handlerOffsetDirection","round","useCarouselController","options","size","loop","dataLength","handlerOffset","withAnimation","defaultIndex","duration","autoFillData","dataInfo","useMemo","length","disable","originalLength","index","sharedIndex","sharedPreIndex","currentFixedPage","useCallback","Math","value","fixed","abs","setSharedIndex","newSharedIndex","current","handlerOffsetValue","toInt","isPositive","i","newSharedIndexValue","rawDataLength","getCurrentIndex","realIndex","canSliding","onScrollEnd","onScrollBegin","scrollWithTiming","toValue","onFinished","callback","isFinished","defaultWithAnimation","type","config","easing","easeOutQuart","next","opts","count","animated","nextPage","prev","prevPage","to","direction","offset","totalSize","isCloseToNextLoop","finalOffset","floor","scrollTo","n","getSharedIndex"],"mappings":"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","sourcesContent":["import React, { useRef } from \"react\";\nimport type Animated from \"react-native-reanimated\";\nimport {\n runOnJS,\n useAnimatedReaction,\n useSharedValue,\n} from \"react-native-reanimated\";\n\nimport { Easing } from \"../constants\";\nimport type {\n TCarouselActionOptions,\n TCarouselProps,\n WithTimingAnimation,\n} from \"../types\";\nimport { computedRealIndexWithAutoFillData, convertToSharedIndex } from \"../utils/computed-with-auto-fill-data\";\nimport { dealWithAnimation } from \"../utils/deal-with-animation\";\nimport { handlerOffsetDirection } from \"../utils/handleroffset-direction\";\nimport { round } from \"../utils/log\";\n\ninterface IOpts {\n loop: boolean\n size: number\n dataLength: number\n autoFillData: TCarouselProps[\"autoFillData\"]\n handlerOffset: Animated.SharedValue<number>\n withAnimation?: TCarouselProps[\"withAnimation\"]\n duration?: number\n defaultIndex?: number\n onScrollBegin?: () => void\n onScrollEnd?: () => void\n}\n\nexport interface ICarouselController {\n getSharedIndex: () => number\n prev: (opts?: TCarouselActionOptions) => void\n next: (opts?: TCarouselActionOptions) => void\n getCurrentIndex: () => number\n scrollTo: (opts?: TCarouselActionOptions) => void\n}\n\nexport function useCarouselController(options: IOpts): ICarouselController {\n const {\n size,\n loop,\n dataLength,\n handlerOffset,\n withAnimation,\n defaultIndex = 0,\n duration,\n autoFillData,\n } = options;\n\n const dataInfo = React.useMemo(\n () => ({\n length: dataLength,\n disable: !dataLength,\n originalLength: dataLength,\n }),\n [dataLength],\n );\n\n const index = useSharedValue<number>(defaultIndex);\n // The Index displayed to the user\n const sharedIndex = useRef<number>(defaultIndex);\n const sharedPreIndex = useRef<number>(defaultIndex);\n\n const currentFixedPage = React.useCallback(() => {\n if (loop)\n return -Math.round(handlerOffset.value / size);\n\n const fixed = (handlerOffset.value / size) % dataInfo.length;\n return Math.round(\n handlerOffset.value <= 0\n ? Math.abs(fixed)\n : Math.abs(fixed > 0 ? dataInfo.length - fixed : 0),\n );\n }, [handlerOffset, dataInfo, size, loop]);\n\n function setSharedIndex(newSharedIndex: number) {\n sharedIndex.current = newSharedIndex;\n }\n\n useAnimatedReaction(\n () => {\n const handlerOffsetValue = handlerOffset.value;\n const toInt = round(handlerOffsetValue / size) % dataInfo.length;\n const isPositive = handlerOffsetValue <= 0;\n const i = isPositive\n ? Math.abs(toInt)\n : Math.abs(toInt > 0 ? dataInfo.length - toInt : 0);\n\n const newSharedIndexValue = convertToSharedIndex({\n loop,\n rawDataLength: dataInfo.originalLength,\n autoFillData: autoFillData!,\n index: i,\n });\n\n return {\n i,\n newSharedIndexValue,\n };\n },\n ({ i, newSharedIndexValue }) => {\n index.value = i;\n runOnJS(setSharedIndex)(newSharedIndexValue);\n },\n [\n sharedPreIndex,\n sharedIndex,\n size,\n dataInfo,\n index,\n loop,\n autoFillData,\n handlerOffset,\n ],\n );\n\n const getCurrentIndex = React.useCallback(() => {\n const realIndex = computedRealIndexWithAutoFillData({\n index: index.value,\n dataLength: dataInfo.originalLength,\n loop,\n autoFillData: autoFillData!,\n });\n\n return realIndex;\n }, [index, autoFillData, dataInfo, loop]);\n\n const canSliding = React.useCallback(() => {\n return !dataInfo.disable;\n }, [dataInfo]);\n\n const onScrollEnd = React.useCallback(() => {\n options.onScrollEnd?.();\n }, [options]);\n\n const onScrollBegin = React.useCallback(() => {\n options.onScrollBegin?.();\n }, [options]);\n\n const scrollWithTiming = React.useCallback(\n (toValue: number, onFinished?: () => void) => {\n \"worklet\";\n const callback = (isFinished: boolean) => {\n \"worklet\";\n if (isFinished) {\n runOnJS(onScrollEnd)();\n onFinished && runOnJS(onFinished)();\n }\n };\n\n const defaultWithAnimation: WithTimingAnimation = {\n type: \"timing\",\n config: { duration, easing: Easing.easeOutQuart },\n };\n\n return dealWithAnimation(withAnimation ?? defaultWithAnimation)(\n toValue,\n callback,\n );\n },\n [duration, withAnimation, onScrollEnd],\n );\n\n const next = React.useCallback(\n (opts: TCarouselActionOptions = {}) => {\n \"worklet\";\n const { count = 1, animated = true, onFinished } = opts;\n if (!canSliding() || (!loop && index.value >= dataInfo.length - 1))\n return;\n\n onScrollBegin?.();\n\n const nextPage = currentFixedPage() + count;\n index.value = nextPage;\n\n if (animated) {\n handlerOffset.value = scrollWithTiming(\n -nextPage * size,\n onFinished,\n ) as any;\n }\n else {\n handlerOffset.value = -nextPage * size;\n onFinished?.();\n }\n },\n [\n canSliding,\n loop,\n index,\n dataInfo,\n onScrollBegin,\n handlerOffset,\n size,\n scrollWithTiming,\n currentFixedPage,\n ],\n );\n\n const prev = React.useCallback(\n (opts: TCarouselActionOptions = {}) => {\n const { count = 1, animated = true, onFinished } = opts;\n if (!canSliding() || (!loop && index.value <= 0)) return;\n\n onScrollBegin?.();\n\n const prevPage = currentFixedPage() - count;\n index.value = prevPage;\n\n if (animated) {\n handlerOffset.value = scrollWithTiming(\n -prevPage * size,\n onFinished,\n );\n }\n else {\n handlerOffset.value = -prevPage * size;\n onFinished?.();\n }\n },\n [\n canSliding,\n loop,\n index,\n onScrollBegin,\n handlerOffset,\n size,\n scrollWithTiming,\n currentFixedPage,\n ],\n );\n\n const to = React.useCallback(\n (opts: { i: number; animated: boolean; onFinished?: () => void }) => {\n const { i, animated = false, onFinished } = opts;\n if (i === index.value) return;\n if (!canSliding()) return;\n\n onScrollBegin?.();\n // direction -> 1 | -1\n const direction = handlerOffsetDirection(handlerOffset);\n\n // target offset\n const offset = i * size * direction;\n // page width size * page count\n const totalSize = dataInfo.length * size;\n\n let isCloseToNextLoop = false;\n\n if (loop) {\n isCloseToNextLoop\n = Math.abs(handlerOffset.value % totalSize) / totalSize\n >= 0.5;\n }\n\n const finalOffset\n = (Math.floor(Math.abs(handlerOffset.value / totalSize))\n + (isCloseToNextLoop ? 1 : 0))\n * totalSize\n * direction\n + offset;\n\n if (animated) {\n index.value = i;\n handlerOffset.value = scrollWithTiming(finalOffset, onFinished);\n }\n else {\n handlerOffset.value = finalOffset;\n index.value = i;\n onFinished?.();\n }\n },\n [\n index,\n canSliding,\n onScrollBegin,\n handlerOffset,\n size,\n dataInfo.length,\n loop,\n scrollWithTiming,\n ],\n );\n\n const scrollTo = React.useCallback(\n (opts: TCarouselActionOptions = {}) => {\n const { index: i, count, animated = false, onFinished } = opts;\n if (typeof i === \"number\" && i > -1) {\n to({ i, animated, onFinished });\n return;\n }\n\n if (!count)\n return;\n\n const n = Math.round(count);\n\n if (n < 0)\n prev({ count: Math.abs(n), animated, onFinished });\n\n else\n next({ count: n, animated, onFinished });\n },\n [prev, next, to],\n );\n\n return {\n next,\n prev,\n scrollTo,\n getCurrentIndex,\n getSharedIndex: () => sharedIndex.current,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["useCarouselController.tsx"],"names":["React","useRef","runOnJS","useAnimatedReaction","useSharedValue","Easing","computedRealIndexWithAutoFillData","convertToSharedIndex","dealWithAnimation","handlerOffsetDirection","round","useCarouselController","options","size","loop","dataLength","handlerOffset","withAnimation","defaultIndex","duration","autoFillData","fixedDirection","dataInfo","useMemo","length","disable","originalLength","index","sharedIndex","sharedPreIndex","currentFixedPage","useCallback","Math","value","fixed","abs","setSharedIndex","newSharedIndex","current","handlerOffsetValue","toInt","isPositive","i","newSharedIndexValue","rawDataLength","getCurrentIndex","realIndex","canSliding","onScrollEnd","onScrollBegin","scrollWithTiming","toValue","onFinished","callback","isFinished","defaultWithAnimation","type","config","easing","easeOutQuart","next","opts","count","animated","nextPage","prev","prevPage","to","direction","offset","totalSize","isCloseToNextLoop","finalOffset","floor","scrollTo","n","getSharedIndex"],"mappings":"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","sourcesContent":["import React, { useRef } from \"react\";\nimport type Animated from \"react-native-reanimated\";\nimport {\n runOnJS,\n useAnimatedReaction,\n useSharedValue,\n} from \"react-native-reanimated\";\n\nimport { Easing } from \"../constants\";\nimport type {\n TCarouselActionOptions,\n TCarouselProps,\n WithTimingAnimation,\n} from \"../types\";\nimport { computedRealIndexWithAutoFillData, convertToSharedIndex } from \"../utils/computed-with-auto-fill-data\";\nimport { dealWithAnimation } from \"../utils/deal-with-animation\";\nimport { handlerOffsetDirection } from \"../utils/handleroffset-direction\";\nimport { round } from \"../utils/log\";\n\ninterface IOpts {\n loop: boolean\n size: number\n dataLength: number\n handlerOffset: Animated.SharedValue<number>\n autoFillData: TCarouselProps[\"autoFillData\"]\n withAnimation?: TCarouselProps[\"withAnimation\"]\n fixedDirection?: TCarouselProps[\"fixedDirection\"]\n duration?: number\n defaultIndex?: number\n onScrollBegin?: () => void\n onScrollEnd?: () => void\n}\n\nexport interface ICarouselController {\n getSharedIndex: () => number\n prev: (opts?: TCarouselActionOptions) => void\n next: (opts?: TCarouselActionOptions) => void\n getCurrentIndex: () => number\n scrollTo: (opts?: TCarouselActionOptions) => void\n}\n\nexport function useCarouselController(options: IOpts): ICarouselController {\n const {\n size,\n loop,\n dataLength,\n handlerOffset,\n withAnimation,\n defaultIndex = 0,\n duration,\n autoFillData,\n fixedDirection,\n } = options;\n\n const dataInfo = React.useMemo(\n () => ({\n length: dataLength,\n disable: !dataLength,\n originalLength: dataLength,\n }),\n [dataLength],\n );\n\n const index = useSharedValue<number>(defaultIndex);\n // The Index displayed to the user\n const sharedIndex = useRef<number>(defaultIndex);\n const sharedPreIndex = useRef<number>(defaultIndex);\n\n const currentFixedPage = React.useCallback(() => {\n if (loop)\n return -Math.round(handlerOffset.value / size);\n\n const fixed = (handlerOffset.value / size) % dataInfo.length;\n return Math.round(\n handlerOffset.value <= 0\n ? Math.abs(fixed)\n : Math.abs(fixed > 0 ? dataInfo.length - fixed : 0),\n );\n }, [handlerOffset, dataInfo, size, loop]);\n\n function setSharedIndex(newSharedIndex: number) {\n sharedIndex.current = newSharedIndex;\n }\n\n useAnimatedReaction(\n () => {\n const handlerOffsetValue = handlerOffset.value;\n const toInt = round(handlerOffsetValue / size) % dataInfo.length;\n const isPositive = handlerOffsetValue <= 0;\n const i = isPositive\n ? Math.abs(toInt)\n : Math.abs(toInt > 0 ? dataInfo.length - toInt : 0);\n\n const newSharedIndexValue = convertToSharedIndex({\n loop,\n rawDataLength: dataInfo.originalLength,\n autoFillData: autoFillData!,\n index: i,\n });\n\n return {\n i,\n newSharedIndexValue,\n };\n },\n ({ i, newSharedIndexValue }) => {\n index.value = i;\n runOnJS(setSharedIndex)(newSharedIndexValue);\n },\n [\n sharedPreIndex,\n sharedIndex,\n size,\n dataInfo,\n index,\n loop,\n autoFillData,\n handlerOffset,\n ],\n );\n\n const getCurrentIndex = React.useCallback(() => {\n const realIndex = computedRealIndexWithAutoFillData({\n index: index.value,\n dataLength: dataInfo.originalLength,\n loop,\n autoFillData: autoFillData!,\n });\n\n return realIndex;\n }, [index, autoFillData, dataInfo, loop]);\n\n const canSliding = React.useCallback(() => {\n return !dataInfo.disable;\n }, [dataInfo]);\n\n const onScrollEnd = React.useCallback(() => {\n options.onScrollEnd?.();\n }, [options]);\n\n const onScrollBegin = React.useCallback(() => {\n options.onScrollBegin?.();\n }, [options]);\n\n const scrollWithTiming = React.useCallback(\n (toValue: number, onFinished?: () => void) => {\n \"worklet\";\n const callback = (isFinished: boolean) => {\n \"worklet\";\n if (isFinished) {\n runOnJS(onScrollEnd)();\n onFinished && runOnJS(onFinished)();\n }\n };\n\n const defaultWithAnimation: WithTimingAnimation = {\n type: \"timing\",\n config: { duration, easing: Easing.easeOutQuart },\n };\n\n return dealWithAnimation(withAnimation ?? defaultWithAnimation)(\n toValue,\n callback,\n );\n },\n [duration, withAnimation, onScrollEnd],\n );\n\n const next = React.useCallback(\n (opts: TCarouselActionOptions = {}) => {\n \"worklet\";\n const { count = 1, animated = true, onFinished } = opts;\n if (!canSliding() || (!loop && index.value >= dataInfo.length - 1))\n return;\n\n onScrollBegin?.();\n\n const nextPage = currentFixedPage() + count;\n index.value = nextPage;\n\n if (animated) {\n handlerOffset.value = scrollWithTiming(\n -nextPage * size,\n onFinished,\n ) as any;\n }\n else {\n handlerOffset.value = -nextPage * size;\n onFinished?.();\n }\n },\n [\n canSliding,\n loop,\n index,\n dataInfo,\n onScrollBegin,\n handlerOffset,\n size,\n scrollWithTiming,\n currentFixedPage,\n ],\n );\n\n const prev = React.useCallback(\n (opts: TCarouselActionOptions = {}) => {\n const { count = 1, animated = true, onFinished } = opts;\n if (!canSliding() || (!loop && index.value <= 0)) return;\n\n onScrollBegin?.();\n\n const prevPage = currentFixedPage() - count;\n index.value = prevPage;\n\n if (animated) {\n handlerOffset.value = scrollWithTiming(\n -prevPage * size,\n onFinished,\n );\n }\n else {\n handlerOffset.value = -prevPage * size;\n onFinished?.();\n }\n },\n [\n canSliding,\n loop,\n index,\n onScrollBegin,\n handlerOffset,\n size,\n scrollWithTiming,\n currentFixedPage,\n ],\n );\n\n const to = React.useCallback(\n (opts: { i: number; animated: boolean; onFinished?: () => void }) => {\n const { i, animated = false, onFinished } = opts;\n if (i === index.value) return;\n if (!canSliding()) return;\n\n onScrollBegin?.();\n // direction -> 1 | -1\n const direction = handlerOffsetDirection(handlerOffset, fixedDirection);\n\n // target offset\n const offset = i * size * direction;\n // page width size * page count\n const totalSize = dataInfo.length * size;\n\n let isCloseToNextLoop = false;\n\n if (loop) {\n isCloseToNextLoop\n = Math.abs(handlerOffset.value % totalSize) / totalSize\n >= 0.5;\n }\n\n const finalOffset\n = (Math.floor(Math.abs(handlerOffset.value / totalSize))\n + (isCloseToNextLoop ? 1 : 0))\n * totalSize\n * direction\n + offset;\n\n if (animated) {\n index.value = i;\n handlerOffset.value = scrollWithTiming(finalOffset, onFinished);\n }\n else {\n handlerOffset.value = finalOffset;\n index.value = i;\n onFinished?.();\n }\n },\n [\n size,\n loop,\n index,\n fixedDirection,\n handlerOffset,\n dataInfo.length,\n canSliding,\n onScrollBegin,\n scrollWithTiming,\n ],\n );\n\n const scrollTo = React.useCallback(\n (opts: TCarouselActionOptions = {}) => {\n const { index: i, count, animated = false, onFinished } = opts;\n if (typeof i === \"number\" && i > -1) {\n to({ i, animated, onFinished });\n return;\n }\n\n if (!count)\n return;\n\n const n = Math.round(count);\n\n if (n < 0)\n prev({ count: Math.abs(n), animated, onFinished });\n\n else\n next({ count: n, animated, onFinished });\n },\n [prev, next, to],\n );\n\n return {\n next,\n prev,\n scrollTo,\n getCurrentIndex,\n getSharedIndex: () => sharedIndex.current,\n };\n}\n"]}
|
|
@@ -4,10 +4,10 @@ export function useVisibleRanges(options) {
|
|
|
4
4
|
total = 0,
|
|
5
5
|
viewSize,
|
|
6
6
|
translation,
|
|
7
|
-
windowSize: _windowSize
|
|
7
|
+
windowSize: _windowSize,
|
|
8
8
|
loop
|
|
9
9
|
} = options;
|
|
10
|
-
const windowSize =
|
|
10
|
+
const windowSize = _windowSize !== null && _windowSize !== void 0 ? _windowSize : total;
|
|
11
11
|
const ranges = useDerivedValue(() => {
|
|
12
12
|
const positiveCount = Math.round(windowSize / 2);
|
|
13
13
|
const negativeCount = windowSize - positiveCount;
|
|
@@ -19,7 +19,7 @@ export function useVisibleRanges(options) {
|
|
|
19
19
|
// So, It will be only displayed the positive items.
|
|
20
20
|
return {
|
|
21
21
|
negativeRange: [0 + currentIndex - (windowSize - 1), 0 + currentIndex],
|
|
22
|
-
positiveRange: [0 + currentIndex, windowSize - 1
|
|
22
|
+
positiveRange: [0 + currentIndex, currentIndex + (windowSize - 1)]
|
|
23
23
|
};
|
|
24
24
|
}
|
|
25
25
|
|
|
@@ -34,7 +34,8 @@ export function useVisibleRanges(options) {
|
|
|
34
34
|
if (positiveRange[0] > positiveRange[1]) {
|
|
35
35
|
negativeRange[1] = total - 1;
|
|
36
36
|
positiveRange[0] = 0;
|
|
37
|
-
}
|
|
37
|
+
} // console.log({ negativeRange, positiveRange ,total,windowSize,a:total <= _windowSize})
|
|
38
|
+
|
|
38
39
|
|
|
39
40
|
return {
|
|
40
41
|
negativeRange,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useVisibleRanges.tsx"],"names":["useDerivedValue","useVisibleRanges","options","total","viewSize","translation","windowSize","_windowSize","loop","ranges","positiveCount","Math","round","negativeCount","currentIndex","value","negativeRange","positiveRange"],"mappings":"AACA,SAASA,eAAT,QAAgC,yBAAhC;AAOA,OAAO,SAASC,gBAAT,CAA0BC,OAA1B,EAMY;AACjB,QAAM;AACJC,IAAAA,KAAK,GAAG,CADJ;AAEJC,IAAAA,QAFI;AAGJC,IAAAA,WAHI;AAIJC,IAAAA,UAAU,EAAEC,
|
|
1
|
+
{"version":3,"sources":["useVisibleRanges.tsx"],"names":["useDerivedValue","useVisibleRanges","options","total","viewSize","translation","windowSize","_windowSize","loop","ranges","positiveCount","Math","round","negativeCount","currentIndex","value","negativeRange","positiveRange"],"mappings":"AACA,SAASA,eAAT,QAAgC,yBAAhC;AAOA,OAAO,SAASC,gBAAT,CAA0BC,OAA1B,EAMY;AACjB,QAAM;AACJC,IAAAA,KAAK,GAAG,CADJ;AAEJC,IAAAA,QAFI;AAGJC,IAAAA,WAHI;AAIJC,IAAAA,UAAU,EAAEC,WAJR;AAKJC,IAAAA;AALI,MAMFN,OANJ;AAQA,QAAMI,UAAU,GAAGC,WAAH,aAAGA,WAAH,cAAGA,WAAH,GAAkBJ,KAAlC;AAEA,QAAMM,MAAM,GAAGT,eAAe,CAAC,MAAM;AACnC,UAAMU,aAAa,GAAGC,IAAI,CAACC,KAAL,CAAWN,UAAU,GAAG,CAAxB,CAAtB;AACA,UAAMO,aAAa,GAAGP,UAAU,GAAGI,aAAnC;AAEA,QAAII,YAAY,GAAGH,IAAI,CAACC,KAAL,CAAW,CAACP,WAAW,CAACU,KAAb,GAAqBX,QAAhC,CAAnB;AACAU,IAAAA,YAAY,GAAGA,YAAY,GAAG,CAAf,GAAoBA,YAAY,GAAGX,KAAhB,GAAyBA,KAA5C,GAAoDW,YAAnE;;AAEA,QAAI,CAACN,IAAL,EAAW;AACT;AACA;AACA,aAAO;AACLQ,QAAAA,aAAa,EAAE,CAAC,IAAIF,YAAJ,IAAoBR,UAAU,GAAG,CAAjC,CAAD,EAAsC,IAAIQ,YAA1C,CADV;AAELG,QAAAA,aAAa,EAAE,CAAC,IAAIH,YAAL,EAAmBA,YAAY,IAAIR,UAAU,GAAG,CAAjB,CAA/B;AAFV,OAAP;AAID;;AAED,UAAMU,aAAa,GAAG,CACpB,CAACF,YAAY,GAAGD,aAAf,GAA+BV,KAAhC,IAAyCA,KADrB,EAEpB,CAACW,YAAY,GAAG,CAAf,GAAmBX,KAApB,IAA6BA,KAFT,CAAtB;AAKA,UAAMc,aAAa,GAAG,CACpB,CAACH,YAAY,GAAGX,KAAhB,IAAyBA,KADL,EAEpB,CAACW,YAAY,GAAGJ,aAAf,GAA+BP,KAAhC,IAAyCA,KAFrB,CAAtB;;AAKA,QAAIa,aAAa,CAAC,CAAD,CAAb,GAAmBb,KAAnB,IAA4Ba,aAAa,CAAC,CAAD,CAAb,GAAmBA,aAAa,CAAC,CAAD,CAAhE,EAAqE;AACnEA,MAAAA,aAAa,CAAC,CAAD,CAAb,GAAmBb,KAAK,GAAG,CAA3B;AACAc,MAAAA,aAAa,CAAC,CAAD,CAAb,GAAmB,CAAnB;AACD;;AACD,QAAIA,aAAa,CAAC,CAAD,CAAb,GAAmBA,aAAa,CAAC,CAAD,CAApC,EAAyC;AACvCD,MAAAA,aAAa,CAAC,CAAD,CAAb,GAAmBb,KAAK,GAAG,CAA3B;AACAc,MAAAA,aAAa,CAAC,CAAD,CAAb,GAAmB,CAAnB;AACD,KAjCkC,CAkCnC;;;AACA,WAAO;AAAED,MAAAA,aAAF;AAAiBC,MAAAA;AAAjB,KAAP;AACD,GApC6B,EAoC3B,CAACT,IAAD,EAAOL,KAAP,EAAcG,UAAd,EAA0BD,WAA1B,CApC2B,CAA9B;AAsCA,SAAOI,MAAP;AACD","sourcesContent":["import type Animated from \"react-native-reanimated\";\nimport { useDerivedValue } from \"react-native-reanimated\";\n\nexport type IVisibleRanges = Animated.SharedValue<{\n negativeRange: number[]\n positiveRange: number[]\n}>;\n\nexport function useVisibleRanges(options: {\n total: number\n viewSize: number\n windowSize?: number\n translation: Animated.SharedValue<number>\n loop?: boolean\n}): IVisibleRanges {\n const {\n total = 0,\n viewSize,\n translation,\n windowSize: _windowSize,\n loop,\n } = options;\n\n const windowSize = _windowSize ?? total;\n\n const ranges = useDerivedValue(() => {\n const positiveCount = Math.round(windowSize / 2);\n const negativeCount = windowSize - positiveCount;\n\n let currentIndex = Math.round(-translation.value / viewSize);\n currentIndex = currentIndex < 0 ? (currentIndex % total) + total : currentIndex;\n\n if (!loop) {\n // Adjusting negative range if the carousel is not loopable.\n // So, It will be only displayed the positive items.\n return {\n negativeRange: [0 + currentIndex - (windowSize - 1), 0 + currentIndex],\n positiveRange: [0 + currentIndex, currentIndex + (windowSize - 1)],\n };\n }\n\n const negativeRange = [\n (currentIndex - negativeCount + total) % total,\n (currentIndex - 1 + total) % total,\n ];\n\n const positiveRange = [\n (currentIndex + total) % total,\n (currentIndex + positiveCount + total) % total,\n ];\n\n if (negativeRange[0] < total && negativeRange[0] > negativeRange[1]) {\n negativeRange[1] = total - 1;\n positiveRange[0] = 0;\n }\n if (positiveRange[0] > positiveRange[1]) {\n negativeRange[1] = total - 1;\n positiveRange[0] = 0;\n }\n // console.log({ negativeRange, positiveRange ,total,windowSize,a:total <= _windowSize})\n return { negativeRange, positiveRange };\n }, [loop, total, windowSize, translation]);\n\n return ranges;\n}\n"]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
export function handlerOffsetDirection(handlerOffset) {
|
|
1
|
+
export function handlerOffsetDirection(handlerOffset, fixedDirection) {
|
|
2
2
|
"worklet";
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
return
|
|
4
|
+
if (fixedDirection === "negative") return -1;
|
|
5
|
+
if (fixedDirection === "positive") return 1;
|
|
6
|
+
if (handlerOffset.value === 0) return -1;
|
|
7
|
+
return Math.sign(handlerOffset.value);
|
|
8
8
|
}
|
|
9
9
|
//# sourceMappingURL=handleroffset-direction.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["handleroffset-direction.ts"],"names":["handlerOffsetDirection","handlerOffset","
|
|
1
|
+
{"version":3,"sources":["handleroffset-direction.ts"],"names":["handlerOffsetDirection","handlerOffset","fixedDirection","value","Math","sign"],"mappings":"AAIA,OAAO,SAASA,sBAAT,CAAgCC,aAAhC,EAAoEC,cAApE,EAA+H;AACpI;;AAEA,MAAIA,cAAc,KAAK,UAAvB,EACE,OAAO,CAAC,CAAR;AAEF,MAAIA,cAAc,KAAK,UAAvB,EACE,OAAO,CAAP;AAEF,MAAID,aAAa,CAACE,KAAd,KAAwB,CAA5B,EACE,OAAO,CAAC,CAAR;AAEF,SAAOC,IAAI,CAACC,IAAL,CAAUJ,aAAa,CAACE,KAAxB,CAAP;AACD","sourcesContent":["import type { SharedValue } from \"react-native-reanimated\";\n\nimport type { TCarouselProps } from \"../types\";\n\nexport function handlerOffsetDirection(handlerOffset: SharedValue<number>, fixedDirection?: TCarouselProps[\"fixedDirection\"]): -1 | 1 {\n \"worklet\";\n\n if (fixedDirection === \"negative\")\n return -1;\n\n if (fixedDirection === \"positive\")\n return 1;\n\n if (handlerOffset.value === 0)\n return -1;\n\n return Math.sign(handlerOffset.value) as -1 | 1;\n}\n"]}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { useSharedValue } from "react-native-reanimated";
|
|
2
|
+
import { renderHook } from "@testing-library/react-hooks";
|
|
3
|
+
import { handlerOffsetDirection } from "./handleroffset-direction";
|
|
4
|
+
describe("handlerOffsetDirection", () => {
|
|
5
|
+
it("should return -1 when default value equals to zero", () => {
|
|
6
|
+
const result = renderHook(() => {
|
|
7
|
+
const handlerOffsetAnimVal = useSharedValue(0);
|
|
8
|
+
return handlerOffsetDirection(handlerOffsetAnimVal);
|
|
9
|
+
});
|
|
10
|
+
expect(result.result.current).toBe(-1);
|
|
11
|
+
});
|
|
12
|
+
it("should return 1 when default value is greater than zero", () => {
|
|
13
|
+
const result = renderHook(() => {
|
|
14
|
+
const handlerOffsetAnimVal = useSharedValue(1);
|
|
15
|
+
return handlerOffsetDirection(handlerOffsetAnimVal);
|
|
16
|
+
});
|
|
17
|
+
expect(result.result.current).toBe(1);
|
|
18
|
+
});
|
|
19
|
+
it("should return -1 when default value is less than zero", () => {
|
|
20
|
+
const result = renderHook(() => {
|
|
21
|
+
const handlerOffsetAnimVal = useSharedValue(-1);
|
|
22
|
+
return handlerOffsetDirection(handlerOffsetAnimVal);
|
|
23
|
+
});
|
|
24
|
+
expect(result.result.current).toBe(-1);
|
|
25
|
+
});
|
|
26
|
+
it("should return 1 when default value equals to zero and fixedDirection is negative", () => {
|
|
27
|
+
const result = renderHook(() => {
|
|
28
|
+
const handlerOffsetAnimVal = useSharedValue(-1);
|
|
29
|
+
return handlerOffsetDirection(handlerOffsetAnimVal, "positive");
|
|
30
|
+
});
|
|
31
|
+
expect(result.result.current).toBe(1);
|
|
32
|
+
});
|
|
33
|
+
it("should return -1 when default value is greater than zero and fixedDirection is negative", () => {
|
|
34
|
+
const result = renderHook(() => {
|
|
35
|
+
const handlerOffsetAnimVal = useSharedValue(1);
|
|
36
|
+
return handlerOffsetDirection(handlerOffsetAnimVal, "negative");
|
|
37
|
+
});
|
|
38
|
+
expect(result.result.current).toBe(-1);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
//# sourceMappingURL=handleroffset-direction.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["handleroffset-direction.test.ts"],"names":["useSharedValue","renderHook","handlerOffsetDirection","describe","it","result","handlerOffsetAnimVal","expect","current","toBe"],"mappings":"AAAA,SAASA,cAAT,QAA+B,yBAA/B;AAEA,SAASC,UAAT,QAA2B,8BAA3B;AAEA,SAASC,sBAAT,QAAuC,2BAAvC;AAEAC,QAAQ,CAAC,wBAAD,EAA2B,MAAM;AACvCC,EAAAA,EAAE,CAAC,oDAAD,EAAuD,MAAM;AAC7D,UAAMC,MAAM,GAAGJ,UAAU,CAAC,MAAM;AAC9B,YAAMK,oBAAoB,GAAGN,cAAc,CAAC,CAAD,CAA3C;AACA,aAAOE,sBAAsB,CAACI,oBAAD,CAA7B;AACD,KAHwB,CAAzB;AAKAC,IAAAA,MAAM,CAACF,MAAM,CAACA,MAAP,CAAcG,OAAf,CAAN,CAA8BC,IAA9B,CAAmC,CAAC,CAApC;AACD,GAPC,CAAF;AASAL,EAAAA,EAAE,CAAC,yDAAD,EAA4D,MAAM;AAClE,UAAMC,MAAM,GAAGJ,UAAU,CAAC,MAAM;AAC9B,YAAMK,oBAAoB,GAAGN,cAAc,CAAC,CAAD,CAA3C;AACA,aAAOE,sBAAsB,CAACI,oBAAD,CAA7B;AACD,KAHwB,CAAzB;AAKAC,IAAAA,MAAM,CAACF,MAAM,CAACA,MAAP,CAAcG,OAAf,CAAN,CAA8BC,IAA9B,CAAmC,CAAnC;AACD,GAPC,CAAF;AASAL,EAAAA,EAAE,CAAC,uDAAD,EAA0D,MAAM;AAChE,UAAMC,MAAM,GAAGJ,UAAU,CAAC,MAAM;AAC9B,YAAMK,oBAAoB,GAAGN,cAAc,CAAC,CAAC,CAAF,CAA3C;AACA,aAAOE,sBAAsB,CAACI,oBAAD,CAA7B;AACD,KAHwB,CAAzB;AAKAC,IAAAA,MAAM,CAACF,MAAM,CAACA,MAAP,CAAcG,OAAf,CAAN,CAA8BC,IAA9B,CAAmC,CAAC,CAApC;AACD,GAPC,CAAF;AASAL,EAAAA,EAAE,CAAC,kFAAD,EAAqF,MAAM;AAC3F,UAAMC,MAAM,GAAGJ,UAAU,CAAC,MAAM;AAC9B,YAAMK,oBAAoB,GAAGN,cAAc,CAAC,CAAC,CAAF,CAA3C;AACA,aAAOE,sBAAsB,CAACI,oBAAD,EAAuB,UAAvB,CAA7B;AACD,KAHwB,CAAzB;AAKAC,IAAAA,MAAM,CAACF,MAAM,CAACA,MAAP,CAAcG,OAAf,CAAN,CAA8BC,IAA9B,CAAmC,CAAnC;AACD,GAPC,CAAF;AASAL,EAAAA,EAAE,CAAC,yFAAD,EAA4F,MAAM;AAClG,UAAMC,MAAM,GAAGJ,UAAU,CAAC,MAAM;AAC9B,YAAMK,oBAAoB,GAAGN,cAAc,CAAC,CAAD,CAA3C;AACA,aAAOE,sBAAsB,CAACI,oBAAD,EAAuB,UAAvB,CAA7B;AACD,KAHwB,CAAzB;AAKAC,IAAAA,MAAM,CAACF,MAAM,CAACA,MAAP,CAAcG,OAAf,CAAN,CAA8BC,IAA9B,CAAmC,CAAC,CAApC;AACD,GAPC,CAAF;AAQD,CA7CO,CAAR","sourcesContent":["import { useSharedValue } from \"react-native-reanimated\";\n\nimport { renderHook } from \"@testing-library/react-hooks\";\n\nimport { handlerOffsetDirection } from \"./handleroffset-direction\";\n\ndescribe(\"handlerOffsetDirection\", () => {\n it(\"should return -1 when default value equals to zero\", () => {\n const result = renderHook(() => {\n const handlerOffsetAnimVal = useSharedValue(0);\n return handlerOffsetDirection(handlerOffsetAnimVal);\n });\n\n expect(result.result.current).toBe(-1);\n });\n\n it(\"should return 1 when default value is greater than zero\", () => {\n const result = renderHook(() => {\n const handlerOffsetAnimVal = useSharedValue(1);\n return handlerOffsetDirection(handlerOffsetAnimVal);\n });\n\n expect(result.result.current).toBe(1);\n });\n\n it(\"should return -1 when default value is less than zero\", () => {\n const result = renderHook(() => {\n const handlerOffsetAnimVal = useSharedValue(-1);\n return handlerOffsetDirection(handlerOffsetAnimVal);\n });\n\n expect(result.result.current).toBe(-1);\n });\n\n it(\"should return 1 when default value equals to zero and fixedDirection is negative\", () => {\n const result = renderHook(() => {\n const handlerOffsetAnimVal = useSharedValue(-1);\n return handlerOffsetDirection(handlerOffsetAnimVal, \"positive\");\n });\n\n expect(result.result.current).toBe(1);\n });\n\n it(\"should return -1 when default value is greater than zero and fixedDirection is negative\", () => {\n const result = renderHook(() => {\n const handlerOffsetAnimVal = useSharedValue(1);\n return handlerOffsetDirection(handlerOffsetAnimVal, \"negative\");\n });\n\n expect(result.result.current).toBe(-1);\n });\n});\n"]}
|
|
@@ -4,9 +4,10 @@ interface IOpts {
|
|
|
4
4
|
loop: boolean;
|
|
5
5
|
size: number;
|
|
6
6
|
dataLength: number;
|
|
7
|
-
autoFillData: TCarouselProps["autoFillData"];
|
|
8
7
|
handlerOffset: Animated.SharedValue<number>;
|
|
8
|
+
autoFillData: TCarouselProps["autoFillData"];
|
|
9
9
|
withAnimation?: TCarouselProps["withAnimation"];
|
|
10
|
+
fixedDirection?: TCarouselProps["fixedDirection"];
|
|
10
11
|
duration?: number;
|
|
11
12
|
defaultIndex?: number;
|
|
12
13
|
onScrollBegin?: () => void;
|
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
import type { SharedValue } from "react-native-reanimated";
|
|
2
|
-
|
|
2
|
+
import type { TCarouselProps } from "../types";
|
|
3
|
+
export declare function handlerOffsetDirection(handlerOffset: SharedValue<number>, fixedDirection?: TCarouselProps["fixedDirection"]): -1 | 1;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-reanimated-carousel",
|
|
3
|
-
"version": "4.0.0-alpha.
|
|
3
|
+
"version": "4.0.0-alpha.7",
|
|
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",
|
|
@@ -45,6 +45,7 @@ const Carousel = React.forwardRef<ICarouselInstance, TCarouselProps<any>>(
|
|
|
45
45
|
autoPlayInterval,
|
|
46
46
|
scrollAnimationDuration,
|
|
47
47
|
withAnimation,
|
|
48
|
+
fixedDirection,
|
|
48
49
|
renderItem,
|
|
49
50
|
onScrollEnd,
|
|
50
51
|
onSnapToItem,
|
|
@@ -85,9 +86,10 @@ const Carousel = React.forwardRef<ICarouselInstance, TCarouselProps<any>>(
|
|
|
85
86
|
handlerOffset,
|
|
86
87
|
withAnimation,
|
|
87
88
|
defaultIndex,
|
|
89
|
+
fixedDirection,
|
|
90
|
+
duration: scrollAnimationDuration,
|
|
88
91
|
onScrollEnd: () => runOnJS(_onScrollEnd)(),
|
|
89
92
|
onScrollBegin: () => !!onScrollBegin && runOnJS(onScrollBegin)(),
|
|
90
|
-
duration: scrollAnimationDuration,
|
|
91
93
|
});
|
|
92
94
|
|
|
93
95
|
const { next, prev, scrollTo, getSharedIndex, getCurrentIndex }
|
|
@@ -21,9 +21,10 @@ interface IOpts {
|
|
|
21
21
|
loop: boolean
|
|
22
22
|
size: number
|
|
23
23
|
dataLength: number
|
|
24
|
-
autoFillData: TCarouselProps["autoFillData"]
|
|
25
24
|
handlerOffset: Animated.SharedValue<number>
|
|
25
|
+
autoFillData: TCarouselProps["autoFillData"]
|
|
26
26
|
withAnimation?: TCarouselProps["withAnimation"]
|
|
27
|
+
fixedDirection?: TCarouselProps["fixedDirection"]
|
|
27
28
|
duration?: number
|
|
28
29
|
defaultIndex?: number
|
|
29
30
|
onScrollBegin?: () => void
|
|
@@ -48,6 +49,7 @@ export function useCarouselController(options: IOpts): ICarouselController {
|
|
|
48
49
|
defaultIndex = 0,
|
|
49
50
|
duration,
|
|
50
51
|
autoFillData,
|
|
52
|
+
fixedDirection,
|
|
51
53
|
} = options;
|
|
52
54
|
|
|
53
55
|
const dataInfo = React.useMemo(
|
|
@@ -241,7 +243,7 @@ export function useCarouselController(options: IOpts): ICarouselController {
|
|
|
241
243
|
|
|
242
244
|
onScrollBegin?.();
|
|
243
245
|
// direction -> 1 | -1
|
|
244
|
-
const direction = handlerOffsetDirection(handlerOffset);
|
|
246
|
+
const direction = handlerOffsetDirection(handlerOffset, fixedDirection);
|
|
245
247
|
|
|
246
248
|
// target offset
|
|
247
249
|
const offset = i * size * direction;
|
|
@@ -252,16 +254,16 @@ export function useCarouselController(options: IOpts): ICarouselController {
|
|
|
252
254
|
|
|
253
255
|
if (loop) {
|
|
254
256
|
isCloseToNextLoop
|
|
255
|
-
|
|
256
|
-
|
|
257
|
+
= Math.abs(handlerOffset.value % totalSize) / totalSize
|
|
258
|
+
>= 0.5;
|
|
257
259
|
}
|
|
258
260
|
|
|
259
261
|
const finalOffset
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
262
|
+
= (Math.floor(Math.abs(handlerOffset.value / totalSize))
|
|
263
|
+
+ (isCloseToNextLoop ? 1 : 0))
|
|
264
|
+
* totalSize
|
|
265
|
+
* direction
|
|
266
|
+
+ offset;
|
|
265
267
|
|
|
266
268
|
if (animated) {
|
|
267
269
|
index.value = i;
|
|
@@ -274,13 +276,14 @@ export function useCarouselController(options: IOpts): ICarouselController {
|
|
|
274
276
|
}
|
|
275
277
|
},
|
|
276
278
|
[
|
|
279
|
+
size,
|
|
280
|
+
loop,
|
|
277
281
|
index,
|
|
278
|
-
|
|
279
|
-
onScrollBegin,
|
|
282
|
+
fixedDirection,
|
|
280
283
|
handlerOffset,
|
|
281
|
-
size,
|
|
282
284
|
dataInfo.length,
|
|
283
|
-
|
|
285
|
+
canSliding,
|
|
286
|
+
onScrollBegin,
|
|
284
287
|
scrollWithTiming,
|
|
285
288
|
],
|
|
286
289
|
);
|
|
@@ -17,11 +17,11 @@ export function useVisibleRanges(options: {
|
|
|
17
17
|
total = 0,
|
|
18
18
|
viewSize,
|
|
19
19
|
translation,
|
|
20
|
-
windowSize: _windowSize
|
|
20
|
+
windowSize: _windowSize,
|
|
21
21
|
loop,
|
|
22
22
|
} = options;
|
|
23
23
|
|
|
24
|
-
const windowSize =
|
|
24
|
+
const windowSize = _windowSize ?? total;
|
|
25
25
|
|
|
26
26
|
const ranges = useDerivedValue(() => {
|
|
27
27
|
const positiveCount = Math.round(windowSize / 2);
|
|
@@ -35,7 +35,7 @@ export function useVisibleRanges(options: {
|
|
|
35
35
|
// So, It will be only displayed the positive items.
|
|
36
36
|
return {
|
|
37
37
|
negativeRange: [0 + currentIndex - (windowSize - 1), 0 + currentIndex],
|
|
38
|
-
positiveRange: [0 + currentIndex, windowSize - 1
|
|
38
|
+
positiveRange: [0 + currentIndex, currentIndex + (windowSize - 1)],
|
|
39
39
|
};
|
|
40
40
|
}
|
|
41
41
|
|
|
@@ -57,7 +57,7 @@ export function useVisibleRanges(options: {
|
|
|
57
57
|
negativeRange[1] = total - 1;
|
|
58
58
|
positiveRange[0] = 0;
|
|
59
59
|
}
|
|
60
|
-
|
|
60
|
+
// console.log({ negativeRange, positiveRange ,total,windowSize,a:total <= _windowSize})
|
|
61
61
|
return { negativeRange, positiveRange };
|
|
62
62
|
}, [loop, total, windowSize, translation]);
|
|
63
63
|
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { useSharedValue } from "react-native-reanimated";
|
|
2
|
+
|
|
3
|
+
import { renderHook } from "@testing-library/react-hooks";
|
|
4
|
+
|
|
5
|
+
import { handlerOffsetDirection } from "./handleroffset-direction";
|
|
6
|
+
|
|
7
|
+
describe("handlerOffsetDirection", () => {
|
|
8
|
+
it("should return -1 when default value equals to zero", () => {
|
|
9
|
+
const result = renderHook(() => {
|
|
10
|
+
const handlerOffsetAnimVal = useSharedValue(0);
|
|
11
|
+
return handlerOffsetDirection(handlerOffsetAnimVal);
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
expect(result.result.current).toBe(-1);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it("should return 1 when default value is greater than zero", () => {
|
|
18
|
+
const result = renderHook(() => {
|
|
19
|
+
const handlerOffsetAnimVal = useSharedValue(1);
|
|
20
|
+
return handlerOffsetDirection(handlerOffsetAnimVal);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
expect(result.result.current).toBe(1);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it("should return -1 when default value is less than zero", () => {
|
|
27
|
+
const result = renderHook(() => {
|
|
28
|
+
const handlerOffsetAnimVal = useSharedValue(-1);
|
|
29
|
+
return handlerOffsetDirection(handlerOffsetAnimVal);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
expect(result.result.current).toBe(-1);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it("should return 1 when default value equals to zero and fixedDirection is negative", () => {
|
|
36
|
+
const result = renderHook(() => {
|
|
37
|
+
const handlerOffsetAnimVal = useSharedValue(-1);
|
|
38
|
+
return handlerOffsetDirection(handlerOffsetAnimVal, "positive");
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
expect(result.result.current).toBe(1);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it("should return -1 when default value is greater than zero and fixedDirection is negative", () => {
|
|
45
|
+
const result = renderHook(() => {
|
|
46
|
+
const handlerOffsetAnimVal = useSharedValue(1);
|
|
47
|
+
return handlerOffsetDirection(handlerOffsetAnimVal, "negative");
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
expect(result.result.current).toBe(-1);
|
|
51
|
+
});
|
|
52
|
+
});
|
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import type { SharedValue } from "react-native-reanimated";
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
import type { TCarouselProps } from "../types";
|
|
4
|
+
|
|
5
|
+
export function handlerOffsetDirection(handlerOffset: SharedValue<number>, fixedDirection?: TCarouselProps["fixedDirection"]): -1 | 1 {
|
|
4
6
|
"worklet";
|
|
5
7
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
if (fixedDirection === "negative")
|
|
9
|
+
return -1;
|
|
10
|
+
|
|
11
|
+
if (fixedDirection === "positive")
|
|
12
|
+
return 1;
|
|
13
|
+
|
|
14
|
+
if (handlerOffset.value === 0)
|
|
15
|
+
return -1;
|
|
13
16
|
|
|
14
|
-
return
|
|
17
|
+
return Math.sign(handlerOffset.value) as -1 | 1;
|
|
15
18
|
}
|