react-native-reanimated-carousel 1.0.6 → 1.0.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/Carousel.js +6 -8
- package/lib/commonjs/Carousel.js.map +1 -1
- package/lib/commonjs/CarouselItem.js +3 -3
- package/lib/commonjs/CarouselItem.js.map +1 -1
- package/lib/commonjs/hooks/useOffsetX.js +42 -15
- package/lib/commonjs/hooks/useOffsetX.js.map +1 -1
- package/lib/commonjs/layouts/ParallaxLayout.js +3 -3
- package/lib/commonjs/layouts/ParallaxLayout.js.map +1 -1
- package/lib/module/Carousel.js +6 -7
- package/lib/module/Carousel.js.map +1 -1
- package/lib/module/CarouselItem.js +3 -3
- package/lib/module/CarouselItem.js.map +1 -1
- package/lib/module/hooks/useOffsetX.js +42 -15
- package/lib/module/hooks/useOffsetX.js.map +1 -1
- package/lib/module/layouts/ParallaxLayout.js +3 -3
- package/lib/module/layouts/ParallaxLayout.js.map +1 -1
- package/lib/typescript/CarouselItem.d.ts +1 -2
- package/lib/typescript/hooks/useOffsetX.d.ts +3 -2
- package/lib/typescript/layouts/ParallaxLayout.d.ts +1 -2
- package/package.json +1 -1
- package/src/Carousel.tsx +6 -8
- package/src/CarouselItem.tsx +5 -4
- package/src/hooks/useOffsetX.ts +59 -19
- package/src/layouts/ParallaxLayout.tsx +3 -4
- package/lib/commonjs/hooks/useComputedAnim.js +0 -20
- package/lib/commonjs/hooks/useComputedAnim.js.map +0 -1
- package/lib/module/hooks/useComputedAnim.js +0 -13
- package/lib/module/hooks/useComputedAnim.js.map +0 -1
- package/lib/typescript/hooks/useComputedAnim.d.ts +0 -7
- package/src/hooks/useComputedAnim.ts +0 -23
package/lib/commonjs/Carousel.js
CHANGED
|
@@ -17,8 +17,6 @@ var _index = require("./layouts/index");
|
|
|
17
17
|
|
|
18
18
|
var _useCarouselController = require("./hooks/useCarouselController");
|
|
19
19
|
|
|
20
|
-
var _useComputedAnim = require("./hooks/useComputedAnim");
|
|
21
|
-
|
|
22
20
|
var _useAutoPlay = require("./hooks/useAutoPlay");
|
|
23
21
|
|
|
24
22
|
var _useIndexController = require("./hooks/useIndexController");
|
|
@@ -94,7 +92,6 @@ function Carousel(props, ref) {
|
|
|
94
92
|
return _data;
|
|
95
93
|
}, [_data, loop]);
|
|
96
94
|
|
|
97
|
-
const computedAnimResult = (0, _useComputedAnim.useComputedAnim)(width, data.length);
|
|
98
95
|
const indexController = (0, _useIndexController.useIndexController)({
|
|
99
96
|
originalLength: _data.length,
|
|
100
97
|
length: data.length,
|
|
@@ -144,14 +141,15 @@ function Carousel(props, ref) {
|
|
|
144
141
|
}, [sharedPreIndex, sharedIndex, computedIndex, props, run]);
|
|
145
142
|
|
|
146
143
|
const offsetX = (0, _reactNativeReanimated.useDerivedValue)(() => {
|
|
147
|
-
const
|
|
144
|
+
const totalWidth = width * data.length;
|
|
145
|
+
const x = handlerOffsetX.value % totalWidth;
|
|
148
146
|
|
|
149
147
|
if (!loop) {
|
|
150
148
|
return handlerOffsetX.value;
|
|
151
149
|
}
|
|
152
150
|
|
|
153
151
|
return isNaN(x) ? 0 : x;
|
|
154
|
-
}, [
|
|
152
|
+
}, [loop, width, data]);
|
|
155
153
|
(0, _reactNativeReanimated.useAnimatedReaction)(() => offsetX.value, value => {
|
|
156
154
|
let absoluteProgress = Math.abs(value / width);
|
|
157
155
|
|
|
@@ -249,7 +247,7 @@ function Carousel(props, ref) {
|
|
|
249
247
|
return /*#__PURE__*/_react.default.createElement(_index.ParallaxLayout, {
|
|
250
248
|
parallaxScrollingOffset: parallaxScrollingOffset,
|
|
251
249
|
parallaxScrollingScale: parallaxScrollingScale,
|
|
252
|
-
|
|
250
|
+
data: data,
|
|
253
251
|
width: width,
|
|
254
252
|
handlerOffsetX: offsetX,
|
|
255
253
|
index: i,
|
|
@@ -259,7 +257,7 @@ function Carousel(props, ref) {
|
|
|
259
257
|
|
|
260
258
|
default:
|
|
261
259
|
return /*#__PURE__*/_react.default.createElement(_CarouselItem.CarouselItem, {
|
|
262
|
-
|
|
260
|
+
data: data,
|
|
263
261
|
width: width,
|
|
264
262
|
height: height,
|
|
265
263
|
handlerOffsetX: offsetX,
|
|
@@ -268,7 +266,7 @@ function Carousel(props, ref) {
|
|
|
268
266
|
loop: loop
|
|
269
267
|
}, renderItem(item, i));
|
|
270
268
|
}
|
|
271
|
-
}, [loop, mode,
|
|
269
|
+
}, [loop, mode, data, height, offsetX, parallaxScrollingOffset, parallaxScrollingScale, width, renderItem]);
|
|
272
270
|
|
|
273
271
|
return /*#__PURE__*/_react.default.createElement(_reactNativeGestureHandler.PanGestureHandler, _extends({}, panGestureHandlerProps, {
|
|
274
272
|
onGestureEvent: animatedListScrollHandler
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["Carousel.tsx"],"names":["defaultSpringConfig","damping","Carousel","props","ref","defaultIndex","height","data","_data","loop","mode","autoPlay","autoPlayReverse","autoPlayInterval","parallaxScrollingOffset","parallaxScrollingScale","style","panGestureHandlerProps","renderItem","onSnapToItem","onProgressChange","timingConfig","springConfig","width","Math","round","defaultHandlerOffsetX","abs","handlerOffsetX","React","useMemo","length","computedAnimResult","indexController","originalLength","onChange","i","carouselController","disable","onScrollBegin","onScrollEnd","run","pause","index","sharedPreIndex","sharedIndex","computedIndex","useCallback","current","offsetX","x","value","TOTAL_WIDTH","isNaN","absoluteProgress","next","prev","getCurrentIndex","goToIndex","animated","to","animatedListScrollHandler","onStart","_","ctx","currentContentOffsetX","start","onActive","e","translationX","onEnd","_withAnimationCallback","num","Object","assign","velocity","velocityX","isFinished","page","velocityPage","pageWithVelocity","min","max","useImperativeHandle","renderLayout","item","flexDirection","position","map","forwardRef"],"mappings":"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","sourcesContent":["import React from 'react';\nimport type { FlexStyle, ViewStyle } from 'react-native';\nimport {\n PanGestureHandler,\n PanGestureHandlerProps,\n PanGestureHandlerGestureEvent,\n} from 'react-native-gesture-handler';\nimport Animated, {\n cancelAnimation,\n runOnJS,\n useAnimatedGestureHandler,\n useAnimatedReaction,\n useDerivedValue,\n useSharedValue,\n withSpring,\n} from 'react-native-reanimated';\nimport { CarouselItem } from './CarouselItem';\nimport type { TMode } from './layouts';\nimport { ParallaxLayout } from './layouts/index';\nimport { useCarouselController } from './hooks/useCarouselController';\nimport { useComputedAnim } from './hooks/useComputedAnim';\nimport { useAutoPlay } from './hooks/useAutoPlay';\nimport { useIndexController } from './hooks/useIndexController';\nimport { usePropsErrorBoundary } from './hooks/usePropsErrorBoundary';\n\nconst defaultSpringConfig: Animated.WithSpringConfig = {\n damping: 100,\n};\nexport interface ICarouselProps<T extends unknown> {\n ref?: React.Ref<ICarouselInstance>;\n /**\n * Carousel loop playback.\n * @default true\n */\n loop?: boolean;\n /**\n * Carousel Animated transitions.\n * @default 'default'\n */\n mode?: TMode;\n /**\n * Specified carousel container width.\n */\n width: number;\n /**\n * Specified carousel container height.\n * @default '100%'\n */\n height?: FlexStyle['height'];\n /**\n * Carousel items data set.\n */\n data: T[];\n /**\n * Default index\n * @default 0\n */\n defaultIndex?: number;\n /**\n * Auto play\n */\n autoPlay?: boolean;\n /**\n * Auto play\n * @description reverse playback\n */\n autoPlayReverse?: boolean;\n /**\n * Auto play\n * @description playback interval\n */\n autoPlayInterval?: number;\n /**\n * Carousel container style\n */\n style?: ViewStyle;\n /**\n * When use 'default' Layout props,this prop can be control prev/next item offset.\n * @default 100\n */\n parallaxScrollingOffset?: number;\n /**\n * When use 'default' Layout props,this prop can be control prev/next item offset.\n * @default 0.8\n */\n parallaxScrollingScale?: number;\n /**\n * Sping config of translation animated\n */\n springConfig?: Animated.WithSpringConfig;\n /**\n * PanGestureHandler props\n */\n panGestureHandlerProps?: Omit<\n Partial<PanGestureHandlerProps>,\n 'onHandlerStateChange'\n >;\n /**\n * Render carousel item.\n */\n renderItem: (data: T, index: number) => React.ReactNode;\n /**\n * Callback fired when navigating to an item\n */\n onSnapToItem?: (index: number) => void;\n /**\n * On scroll begin\n */\n onScrollBegin?: () => void;\n /**\n * On scroll end\n */\n onScrollEnd?: (previous: number, current: number) => void;\n /**\n * On progress change\n * @param offsetProgress Total of offset distance (0 390 780 ...)\n * @param absoluteProgress Convert to index (0 1 2 ...)\n */\n onProgressChange?: (\n offsetProgress: number,\n absoluteProgress: number\n ) => void;\n}\n\nexport interface ICarouselInstance {\n /**\n * Play the last one\n */\n prev: () => void;\n /**\n * Play the next one\n */\n next: () => void;\n /**\n * Get current item index\n */\n getCurrentIndex: () => number;\n /**\n * Go to index\n */\n goToIndex: (index: number, animated?: boolean) => void;\n}\n\nfunction Carousel<T extends unknown = any>(\n props: ICarouselProps<T>,\n ref: React.Ref<ICarouselInstance>\n) {\n const {\n defaultIndex = 0,\n height = '100%',\n data: _data = [],\n loop = true,\n mode = 'default',\n autoPlay,\n autoPlayReverse,\n autoPlayInterval = 1000,\n parallaxScrollingOffset,\n parallaxScrollingScale,\n style,\n panGestureHandlerProps = {},\n renderItem,\n onSnapToItem,\n onProgressChange,\n } = props;\n\n usePropsErrorBoundary({\n ...props,\n defaultIndex,\n height,\n data: _data,\n loop,\n mode,\n autoPlay,\n autoPlayReverse,\n autoPlayInterval,\n parallaxScrollingOffset,\n parallaxScrollingScale,\n style,\n panGestureHandlerProps,\n // @ts-ignore\n renderItem,\n onSnapToItem,\n onProgressChange,\n });\n\n const timingConfig = {\n ...defaultSpringConfig,\n ...props.springConfig,\n };\n const width = Math.round(props.width);\n const defaultHandlerOffsetX = -Math.abs(defaultIndex * width);\n const handlerOffsetX = useSharedValue<number>(defaultHandlerOffsetX);\n const data = React.useMemo<T[]>(() => {\n if (!loop) return _data;\n\n if (_data.length === 1) {\n return [_data[0], _data[0], _data[0]];\n }\n\n if (_data.length === 2) {\n return [_data[0], _data[1], _data[0], _data[1]];\n }\n\n return _data;\n }, [_data, loop]);\n\n const computedAnimResult = useComputedAnim(width, data.length);\n\n const indexController = useIndexController({\n originalLength: _data.length,\n length: data.length,\n handlerOffsetX,\n width,\n loop,\n onChange: (i) => onSnapToItem && runOnJS(onSnapToItem)(i),\n });\n\n const carouselController = useCarouselController({\n loop,\n width,\n handlerOffsetX,\n indexController,\n disable: !data.length,\n onScrollBegin: () => runOnJS(onScrollBegin)(),\n onScrollEnd: () => runOnJS(onScrollEnd)(),\n });\n\n const { run, pause } = useAutoPlay({\n autoPlay,\n autoPlayInterval,\n autoPlayReverse,\n carouselController,\n });\n\n const { index, sharedPreIndex, sharedIndex, computedIndex } =\n indexController;\n\n const onScrollBegin = React.useCallback(() => {\n pause();\n props.onScrollBegin?.();\n }, [pause, props]);\n\n const onScrollEnd = React.useCallback(() => {\n run();\n computedIndex();\n props.onScrollEnd?.(sharedPreIndex.current, sharedIndex.current);\n }, [sharedPreIndex, sharedIndex, computedIndex, props, run]);\n\n const offsetX = useDerivedValue(() => {\n const x = handlerOffsetX.value % computedAnimResult.TOTAL_WIDTH;\n\n if (!loop) {\n return handlerOffsetX.value;\n }\n return isNaN(x) ? 0 : x;\n }, [computedAnimResult, loop]);\n\n useAnimatedReaction(\n () => offsetX.value,\n (value) => {\n let absoluteProgress = Math.abs(value / width);\n if (value > 0) {\n absoluteProgress = data.length - absoluteProgress;\n }\n !!onProgressChange &&\n runOnJS(onProgressChange)(value, absoluteProgress);\n },\n [onProgressChange, data]\n );\n\n const next = React.useCallback(() => {\n return carouselController.next();\n }, [carouselController]);\n\n const prev = React.useCallback(() => {\n return carouselController.prev();\n }, [carouselController]);\n\n const getCurrentIndex = React.useCallback(() => {\n return index.value;\n }, [index]);\n\n const goToIndex = React.useCallback(\n (i: number, animated?: boolean) => {\n carouselController.to(i, animated);\n },\n [carouselController]\n );\n\n const animatedListScrollHandler =\n useAnimatedGestureHandler<PanGestureHandlerGestureEvent>(\n {\n onStart: (_, ctx: any) => {\n runOnJS(pause)();\n runOnJS(onScrollBegin)();\n cancelAnimation(handlerOffsetX);\n ctx.currentContentOffsetX = handlerOffsetX.value;\n ctx.start = true;\n },\n onActive: (e, ctx: any) => {\n const { translationX } = e;\n if (\n !loop &&\n (handlerOffsetX.value >= 0 ||\n handlerOffsetX.value <= -(data.length - 1) * width)\n ) {\n handlerOffsetX.value =\n ctx.currentContentOffsetX + translationX / 2;\n return;\n }\n handlerOffsetX.value =\n ctx.currentContentOffsetX + translationX;\n },\n onEnd: (e) => {\n function _withAnimationCallback(num: number) {\n return withSpring(\n num,\n Object.assign({}, timingConfig, {\n velocity: e.velocityX,\n }),\n (isFinished) => {\n if (isFinished) {\n runOnJS(onScrollEnd)();\n }\n }\n );\n }\n\n const page = Math.round(handlerOffsetX.value / width);\n\n const velocityPage = Math.round(\n (handlerOffsetX.value + e.velocityX) / width\n );\n\n let pageWithVelocity = Math.min(\n page + 1,\n Math.max(page - 1, velocityPage)\n );\n\n if (!loop) {\n pageWithVelocity = Math.max(\n -(data.length - 1),\n Math.min(0, pageWithVelocity)\n );\n }\n\n if (loop) {\n handlerOffsetX.value = _withAnimationCallback(\n pageWithVelocity * width\n );\n return;\n }\n if (handlerOffsetX.value >= 0) {\n handlerOffsetX.value = _withAnimationCallback(0);\n return;\n }\n\n if (handlerOffsetX.value <= -(data.length - 1) * width) {\n handlerOffsetX.value = _withAnimationCallback(\n -(data.length - 1) * width\n );\n return;\n }\n\n handlerOffsetX.value = _withAnimationCallback(\n pageWithVelocity * width\n );\n },\n },\n [loop, data, onScrollBegin, onScrollEnd]\n );\n\n React.useImperativeHandle(\n ref,\n () => ({\n next,\n prev,\n getCurrentIndex,\n goToIndex,\n }),\n [getCurrentIndex, goToIndex, next, prev]\n );\n\n const renderLayout = React.useCallback(\n (item: T, i: number) => {\n switch (mode) {\n case 'parallax':\n return (\n <ParallaxLayout\n parallaxScrollingOffset={parallaxScrollingOffset}\n parallaxScrollingScale={parallaxScrollingScale}\n computedAnimResult={computedAnimResult}\n width={width}\n handlerOffsetX={offsetX}\n index={i}\n key={i}\n loop={loop}\n >\n {renderItem(item, i)}\n </ParallaxLayout>\n );\n default:\n return (\n <CarouselItem\n computedAnimResult={computedAnimResult}\n width={width}\n height={height}\n handlerOffsetX={offsetX}\n index={i}\n key={i}\n loop={loop}\n >\n {renderItem(item, i)}\n </CarouselItem>\n );\n }\n },\n [\n loop,\n mode,\n computedAnimResult,\n height,\n offsetX,\n parallaxScrollingOffset,\n parallaxScrollingScale,\n width,\n renderItem,\n ]\n );\n\n return (\n <PanGestureHandler\n {...panGestureHandlerProps}\n onGestureEvent={animatedListScrollHandler}\n >\n <Animated.View\n // eslint-disable-next-line react-native/no-inline-styles\n style={{\n ...style,\n width,\n height,\n flexDirection: 'row',\n position: 'relative',\n }}\n >\n {data.map(renderLayout)}\n </Animated.View>\n </PanGestureHandler>\n );\n}\n\nexport default React.forwardRef(Carousel) as typeof Carousel;\n"]}
|
|
1
|
+
{"version":3,"sources":["Carousel.tsx"],"names":["defaultSpringConfig","damping","Carousel","props","ref","defaultIndex","height","data","_data","loop","mode","autoPlay","autoPlayReverse","autoPlayInterval","parallaxScrollingOffset","parallaxScrollingScale","style","panGestureHandlerProps","renderItem","onSnapToItem","onProgressChange","timingConfig","springConfig","width","Math","round","defaultHandlerOffsetX","abs","handlerOffsetX","React","useMemo","length","indexController","originalLength","onChange","i","carouselController","disable","onScrollBegin","onScrollEnd","run","pause","index","sharedPreIndex","sharedIndex","computedIndex","useCallback","current","offsetX","totalWidth","x","value","isNaN","absoluteProgress","next","prev","getCurrentIndex","goToIndex","animated","to","animatedListScrollHandler","onStart","_","ctx","currentContentOffsetX","start","onActive","e","translationX","onEnd","_withAnimationCallback","num","Object","assign","velocity","velocityX","isFinished","page","velocityPage","pageWithVelocity","min","max","useImperativeHandle","renderLayout","item","flexDirection","position","map","forwardRef"],"mappings":"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","sourcesContent":["import React from 'react';\nimport type { FlexStyle, ViewStyle } from 'react-native';\nimport {\n PanGestureHandler,\n PanGestureHandlerProps,\n PanGestureHandlerGestureEvent,\n} from 'react-native-gesture-handler';\nimport Animated, {\n cancelAnimation,\n runOnJS,\n useAnimatedGestureHandler,\n useAnimatedReaction,\n useDerivedValue,\n useSharedValue,\n withSpring,\n} from 'react-native-reanimated';\nimport { CarouselItem } from './CarouselItem';\nimport type { TMode } from './layouts';\nimport { ParallaxLayout } from './layouts/index';\nimport { useCarouselController } from './hooks/useCarouselController';\nimport { useAutoPlay } from './hooks/useAutoPlay';\nimport { useIndexController } from './hooks/useIndexController';\nimport { usePropsErrorBoundary } from './hooks/usePropsErrorBoundary';\n\nconst defaultSpringConfig: Animated.WithSpringConfig = {\n damping: 100,\n};\nexport interface ICarouselProps<T extends unknown> {\n ref?: React.Ref<ICarouselInstance>;\n /**\n * Carousel loop playback.\n * @default true\n */\n loop?: boolean;\n /**\n * Carousel Animated transitions.\n * @default 'default'\n */\n mode?: TMode;\n /**\n * Specified carousel container width.\n */\n width: number;\n /**\n * Specified carousel container height.\n * @default '100%'\n */\n height?: FlexStyle['height'];\n /**\n * Carousel items data set.\n */\n data: T[];\n /**\n * Default index\n * @default 0\n */\n defaultIndex?: number;\n /**\n * Auto play\n */\n autoPlay?: boolean;\n /**\n * Auto play\n * @description reverse playback\n */\n autoPlayReverse?: boolean;\n /**\n * Auto play\n * @description playback interval\n */\n autoPlayInterval?: number;\n /**\n * Carousel container style\n */\n style?: ViewStyle;\n /**\n * When use 'default' Layout props,this prop can be control prev/next item offset.\n * @default 100\n */\n parallaxScrollingOffset?: number;\n /**\n * When use 'default' Layout props,this prop can be control prev/next item offset.\n * @default 0.8\n */\n parallaxScrollingScale?: number;\n /**\n * Sping config of translation animated\n */\n springConfig?: Animated.WithSpringConfig;\n /**\n * PanGestureHandler props\n */\n panGestureHandlerProps?: Omit<\n Partial<PanGestureHandlerProps>,\n 'onHandlerStateChange'\n >;\n /**\n * Render carousel item.\n */\n renderItem: (data: T, index: number) => React.ReactNode;\n /**\n * Callback fired when navigating to an item\n */\n onSnapToItem?: (index: number) => void;\n /**\n * On scroll begin\n */\n onScrollBegin?: () => void;\n /**\n * On scroll end\n */\n onScrollEnd?: (previous: number, current: number) => void;\n /**\n * On progress change\n * @param offsetProgress Total of offset distance (0 390 780 ...)\n * @param absoluteProgress Convert to index (0 1 2 ...)\n */\n onProgressChange?: (\n offsetProgress: number,\n absoluteProgress: number\n ) => void;\n}\n\nexport interface ICarouselInstance {\n /**\n * Play the last one\n */\n prev: () => void;\n /**\n * Play the next one\n */\n next: () => void;\n /**\n * Get current item index\n */\n getCurrentIndex: () => number;\n /**\n * Go to index\n */\n goToIndex: (index: number, animated?: boolean) => void;\n}\n\nfunction Carousel<T extends unknown = any>(\n props: ICarouselProps<T>,\n ref: React.Ref<ICarouselInstance>\n) {\n const {\n defaultIndex = 0,\n height = '100%',\n data: _data = [],\n loop = true,\n mode = 'default',\n autoPlay,\n autoPlayReverse,\n autoPlayInterval = 1000,\n parallaxScrollingOffset,\n parallaxScrollingScale,\n style,\n panGestureHandlerProps = {},\n renderItem,\n onSnapToItem,\n onProgressChange,\n } = props;\n\n usePropsErrorBoundary({\n ...props,\n defaultIndex,\n height,\n data: _data,\n loop,\n mode,\n autoPlay,\n autoPlayReverse,\n autoPlayInterval,\n parallaxScrollingOffset,\n parallaxScrollingScale,\n style,\n panGestureHandlerProps,\n // @ts-ignore\n renderItem,\n onSnapToItem,\n onProgressChange,\n });\n\n const timingConfig = {\n ...defaultSpringConfig,\n ...props.springConfig,\n };\n const width = Math.round(props.width);\n const defaultHandlerOffsetX = -Math.abs(defaultIndex * width);\n const handlerOffsetX = useSharedValue<number>(defaultHandlerOffsetX);\n const data = React.useMemo<T[]>(() => {\n if (!loop) return _data;\n\n if (_data.length === 1) {\n return [_data[0], _data[0], _data[0]];\n }\n\n if (_data.length === 2) {\n return [_data[0], _data[1], _data[0], _data[1]];\n }\n\n return _data;\n }, [_data, loop]);\n\n const indexController = useIndexController({\n originalLength: _data.length,\n length: data.length,\n handlerOffsetX,\n width,\n loop,\n onChange: (i) => onSnapToItem && runOnJS(onSnapToItem)(i),\n });\n\n const carouselController = useCarouselController({\n loop,\n width,\n handlerOffsetX,\n indexController,\n disable: !data.length,\n onScrollBegin: () => runOnJS(onScrollBegin)(),\n onScrollEnd: () => runOnJS(onScrollEnd)(),\n });\n\n const { run, pause } = useAutoPlay({\n autoPlay,\n autoPlayInterval,\n autoPlayReverse,\n carouselController,\n });\n\n const { index, sharedPreIndex, sharedIndex, computedIndex } =\n indexController;\n\n const onScrollBegin = React.useCallback(() => {\n pause();\n props.onScrollBegin?.();\n }, [pause, props]);\n\n const onScrollEnd = React.useCallback(() => {\n run();\n computedIndex();\n props.onScrollEnd?.(sharedPreIndex.current, sharedIndex.current);\n }, [sharedPreIndex, sharedIndex, computedIndex, props, run]);\n\n const offsetX = useDerivedValue(() => {\n const totalWidth = width * data.length;\n const x = handlerOffsetX.value % totalWidth;\n\n if (!loop) {\n return handlerOffsetX.value;\n }\n return isNaN(x) ? 0 : x;\n }, [loop, width, data]);\n\n useAnimatedReaction(\n () => offsetX.value,\n (value) => {\n let absoluteProgress = Math.abs(value / width);\n if (value > 0) {\n absoluteProgress = data.length - absoluteProgress;\n }\n !!onProgressChange &&\n runOnJS(onProgressChange)(value, absoluteProgress);\n },\n [onProgressChange, data]\n );\n\n const next = React.useCallback(() => {\n return carouselController.next();\n }, [carouselController]);\n\n const prev = React.useCallback(() => {\n return carouselController.prev();\n }, [carouselController]);\n\n const getCurrentIndex = React.useCallback(() => {\n return index.value;\n }, [index]);\n\n const goToIndex = React.useCallback(\n (i: number, animated?: boolean) => {\n carouselController.to(i, animated);\n },\n [carouselController]\n );\n\n const animatedListScrollHandler =\n useAnimatedGestureHandler<PanGestureHandlerGestureEvent>(\n {\n onStart: (_, ctx: any) => {\n runOnJS(pause)();\n runOnJS(onScrollBegin)();\n cancelAnimation(handlerOffsetX);\n ctx.currentContentOffsetX = handlerOffsetX.value;\n ctx.start = true;\n },\n onActive: (e, ctx: any) => {\n const { translationX } = e;\n if (\n !loop &&\n (handlerOffsetX.value >= 0 ||\n handlerOffsetX.value <= -(data.length - 1) * width)\n ) {\n handlerOffsetX.value =\n ctx.currentContentOffsetX + translationX / 2;\n return;\n }\n handlerOffsetX.value =\n ctx.currentContentOffsetX + translationX;\n },\n onEnd: (e) => {\n function _withAnimationCallback(num: number) {\n return withSpring(\n num,\n Object.assign({}, timingConfig, {\n velocity: e.velocityX,\n }),\n (isFinished) => {\n if (isFinished) {\n runOnJS(onScrollEnd)();\n }\n }\n );\n }\n\n const page = Math.round(handlerOffsetX.value / width);\n\n const velocityPage = Math.round(\n (handlerOffsetX.value + e.velocityX) / width\n );\n\n let pageWithVelocity = Math.min(\n page + 1,\n Math.max(page - 1, velocityPage)\n );\n\n if (!loop) {\n pageWithVelocity = Math.max(\n -(data.length - 1),\n Math.min(0, pageWithVelocity)\n );\n }\n\n if (loop) {\n handlerOffsetX.value = _withAnimationCallback(\n pageWithVelocity * width\n );\n return;\n }\n if (handlerOffsetX.value >= 0) {\n handlerOffsetX.value = _withAnimationCallback(0);\n return;\n }\n\n if (handlerOffsetX.value <= -(data.length - 1) * width) {\n handlerOffsetX.value = _withAnimationCallback(\n -(data.length - 1) * width\n );\n return;\n }\n\n handlerOffsetX.value = _withAnimationCallback(\n pageWithVelocity * width\n );\n },\n },\n [loop, data, onScrollBegin, onScrollEnd]\n );\n\n React.useImperativeHandle(\n ref,\n () => ({\n next,\n prev,\n getCurrentIndex,\n goToIndex,\n }),\n [getCurrentIndex, goToIndex, next, prev]\n );\n\n const renderLayout = React.useCallback(\n (item: T, i: number) => {\n switch (mode) {\n case 'parallax':\n return (\n <ParallaxLayout\n parallaxScrollingOffset={parallaxScrollingOffset}\n parallaxScrollingScale={parallaxScrollingScale}\n data={data}\n width={width}\n handlerOffsetX={offsetX}\n index={i}\n key={i}\n loop={loop}\n >\n {renderItem(item, i)}\n </ParallaxLayout>\n );\n default:\n return (\n <CarouselItem\n data={data}\n width={width}\n height={height}\n handlerOffsetX={offsetX}\n index={i}\n key={i}\n loop={loop}\n >\n {renderItem(item, i)}\n </CarouselItem>\n );\n }\n },\n [\n loop,\n mode,\n data,\n height,\n offsetX,\n parallaxScrollingOffset,\n parallaxScrollingScale,\n width,\n renderItem,\n ]\n );\n\n return (\n <PanGestureHandler\n {...panGestureHandlerProps}\n onGestureEvent={animatedListScrollHandler}\n >\n <Animated.View\n // eslint-disable-next-line react-native/no-inline-styles\n style={{\n ...style,\n width,\n height,\n flexDirection: 'row',\n position: 'relative',\n }}\n >\n {data.map(renderLayout)}\n </Animated.View>\n </PanGestureHandler>\n );\n}\n\nexport default React.forwardRef(Carousel) as typeof Carousel;\n"]}
|
|
@@ -26,14 +26,14 @@ const CarouselItem = props => {
|
|
|
26
26
|
children,
|
|
27
27
|
width,
|
|
28
28
|
height = '100%',
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
loop,
|
|
30
|
+
data
|
|
31
31
|
} = props;
|
|
32
32
|
const x = (0, _useOffsetX.useOffsetX)({
|
|
33
33
|
handlerOffsetX,
|
|
34
34
|
index,
|
|
35
35
|
width,
|
|
36
|
-
|
|
36
|
+
data,
|
|
37
37
|
loop
|
|
38
38
|
});
|
|
39
39
|
const offsetXStyle = (0, _reactNativeReanimated.useAnimatedStyle)(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["CarouselItem.tsx"],"names":["CarouselItem","props","handlerOffsetX","index","children","width","height","
|
|
1
|
+
{"version":3,"sources":["CarouselItem.tsx"],"names":["CarouselItem","props","handlerOffsetX","index","children","width","height","loop","data","x","offsetXStyle","transform","translateX","value"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AACA;;;;;;;;AAEO,MAAMA,YAOX,GAAIC,KAAD,IAAW;AACZ,QAAM;AACFC,IAAAA,cADE;AAEFC,IAAAA,KAFE;AAGFC,IAAAA,QAHE;AAIFC,IAAAA,KAJE;AAKFC,IAAAA,MAAM,GAAG,MALP;AAMFC,IAAAA,IANE;AAOFC,IAAAA;AAPE,MAQFP,KARJ;AAUA,QAAMQ,CAAC,GAAG,4BAAW;AACjBP,IAAAA,cADiB;AAEjBC,IAAAA,KAFiB;AAGjBE,IAAAA,KAHiB;AAIjBG,IAAAA,IAJiB;AAKjBD,IAAAA;AALiB,GAAX,CAAV;AAQA,QAAMG,YAAY,GAAG,6CAAiB,MAAM;AACxC,WAAO;AACHC,MAAAA,SAAS,EAAE,CAAC;AAAEC,QAAAA,UAAU,EAAEH,CAAC,CAACI,KAAF,GAAUV,KAAK,GAAGE;AAAhC,OAAD;AADR,KAAP;AAGH,GAJoB,EAIlB,EAJkB,CAArB;AAMA,sBACI,6BAAC,8BAAD,CAAU,IAAV;AAAe,IAAA,KAAK,EAAEK;AAAtB,kBACI,6BAAC,iBAAD;AAAM,IAAA,KAAK,EAAE;AAAEL,MAAAA,KAAF;AAASC,MAAAA;AAAT;AAAb,KAAiCF,QAAjC,CADJ,CADJ;AAKH,CArCM","sourcesContent":["import React from 'react';\nimport { FlexStyle, View } from 'react-native';\nimport Animated, { useAnimatedStyle } from 'react-native-reanimated';\nimport { useOffsetX } from './hooks/useOffsetX';\n\nexport const CarouselItem: React.FC<{\n loop?: boolean;\n index: number;\n handlerOffsetX: Animated.SharedValue<number>;\n width: number;\n data: unknown[];\n height?: FlexStyle['height'];\n}> = (props) => {\n const {\n handlerOffsetX,\n index,\n children,\n width,\n height = '100%',\n loop,\n data,\n } = props;\n\n const x = useOffsetX({\n handlerOffsetX,\n index,\n width,\n data,\n loop,\n });\n\n const offsetXStyle = useAnimatedStyle(() => {\n return {\n transform: [{ translateX: x.value - index * width }],\n };\n }, []);\n\n return (\n <Animated.View style={offsetXStyle}>\n <View style={{ width, height }}>{children}</View>\n </Animated.View>\n );\n};\n"]}
|
|
@@ -12,28 +12,55 @@ const useOffsetX = opts => {
|
|
|
12
12
|
handlerOffsetX,
|
|
13
13
|
index,
|
|
14
14
|
width,
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
loop,
|
|
16
|
+
data,
|
|
17
|
+
type = 'positive',
|
|
18
|
+
viewCount = Math.round((data.length - 1) / 2)
|
|
17
19
|
} = opts;
|
|
20
|
+
const ITEM_LENGTH = data.length;
|
|
21
|
+
const VALID_LENGTH = ITEM_LENGTH - 1;
|
|
22
|
+
const TOTAL_WIDTH = width * ITEM_LENGTH;
|
|
23
|
+
const HALF_WIDTH = 0.5 * width;
|
|
18
24
|
const x = (0, _reactNativeReanimated.useDerivedValue)(() => {
|
|
19
|
-
const
|
|
20
|
-
MAX,
|
|
21
|
-
MIN,
|
|
22
|
-
TOTAL_WIDTH,
|
|
23
|
-
HALF_WIDTH
|
|
24
|
-
} = computedAnimResult;
|
|
25
|
+
const defaultPos = width * index;
|
|
25
26
|
|
|
26
27
|
if (loop) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
function getDefaultPos(_type, _count) {
|
|
29
|
+
let MAX = null;
|
|
30
|
+
let MIN = null;
|
|
31
|
+
let startPos = defaultPos;
|
|
32
|
+
|
|
33
|
+
if (_type === 'positive') {
|
|
34
|
+
MAX = _count * width;
|
|
35
|
+
MIN = -(VALID_LENGTH - _count) * width;
|
|
36
|
+
} else {
|
|
37
|
+
MAX = (VALID_LENGTH - _count) * width;
|
|
38
|
+
MIN = -_count * width;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (defaultPos > MAX) {
|
|
42
|
+
startPos = MAX - defaultPos;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return {
|
|
46
|
+
startPos,
|
|
47
|
+
MAX,
|
|
48
|
+
MIN
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const {
|
|
53
|
+
startPos,
|
|
54
|
+
MAX,
|
|
55
|
+
MIN
|
|
56
|
+
} = getDefaultPos(type, viewCount);
|
|
57
|
+
const inputRange = [-TOTAL_WIDTH, MIN - HALF_WIDTH - startPos - 1, MIN - HALF_WIDTH - startPos, 0, MAX + HALF_WIDTH - startPos, MAX + HALF_WIDTH - startPos + 1, TOTAL_WIDTH];
|
|
58
|
+
const outputRange = [startPos, MAX + HALF_WIDTH - 1, MIN - HALF_WIDTH, startPos, MAX + HALF_WIDTH, MIN - HALF_WIDTH + 1, startPos];
|
|
31
59
|
return (0, _reactNativeReanimated.interpolate)(Math.round(handlerOffsetX.value), inputRange.map(Math.round), outputRange.map(Math.round), _reactNativeReanimated.Extrapolate.CLAMP);
|
|
32
60
|
}
|
|
33
61
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}, [loop, computedAnimResult]);
|
|
62
|
+
return handlerOffsetX.value + defaultPos;
|
|
63
|
+
}, [loop, data, viewCount, type]);
|
|
37
64
|
return x;
|
|
38
65
|
};
|
|
39
66
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useOffsetX.ts"],"names":["useOffsetX","opts","handlerOffsetX","index","width","
|
|
1
|
+
{"version":3,"sources":["useOffsetX.ts"],"names":["useOffsetX","opts","handlerOffsetX","index","width","loop","data","type","viewCount","Math","round","length","ITEM_LENGTH","VALID_LENGTH","TOTAL_WIDTH","HALF_WIDTH","x","defaultPos","getDefaultPos","_type","_count","MAX","MIN","startPos","inputRange","outputRange","value","map","Extrapolate","CLAMP"],"mappings":";;;;;;;AAAA;;AAgBO,MAAMA,UAAU,GAAIC,IAAD,IAAiB;AACvC,QAAM;AACFC,IAAAA,cADE;AAEFC,IAAAA,KAFE;AAGFC,IAAAA,KAHE;AAIFC,IAAAA,IAJE;AAKFC,IAAAA,IALE;AAMFC,IAAAA,IAAI,GAAG,UANL;AAOFC,IAAAA,SAAS,GAAGC,IAAI,CAACC,KAAL,CAAW,CAACJ,IAAI,CAACK,MAAL,GAAc,CAAf,IAAoB,CAA/B;AAPV,MAQFV,IARJ;AASA,QAAMW,WAAW,GAAGN,IAAI,CAACK,MAAzB;AACA,QAAME,YAAY,GAAGD,WAAW,GAAG,CAAnC;AACA,QAAME,WAAW,GAAGV,KAAK,GAAGQ,WAA5B;AACA,QAAMG,UAAU,GAAG,MAAMX,KAAzB;AAEA,QAAMY,CAAC,GAAG,4CAAgB,MAAM;AAC5B,UAAMC,UAAU,GAAGb,KAAK,GAAGD,KAA3B;;AACA,QAAIE,IAAJ,EAAU;AACN,eAASa,aAAT,CACIC,KADJ,EAEIC,MAFJ,EAOE;AACE,YAAIC,GAAG,GAAG,IAAV;AACA,YAAIC,GAAG,GAAG,IAAV;AAEA,YAAIC,QAAgB,GAAGN,UAAvB;;AAEA,YAAIE,KAAK,KAAK,UAAd,EAA0B;AACtBE,UAAAA,GAAG,GAAGD,MAAM,GAAGhB,KAAf;AACAkB,UAAAA,GAAG,GAAG,EAAET,YAAY,GAAGO,MAAjB,IAA2BhB,KAAjC;AACH,SAHD,MAGO;AACHiB,UAAAA,GAAG,GAAG,CAACR,YAAY,GAAGO,MAAhB,IAA0BhB,KAAhC;AACAkB,UAAAA,GAAG,GAAG,CAACF,MAAD,GAAUhB,KAAhB;AACH;;AAED,YAAIa,UAAU,GAAGI,GAAjB,EAAsB;AAClBE,UAAAA,QAAQ,GAAGF,GAAG,GAAGJ,UAAjB;AACH;;AAED,eAAO;AACHM,UAAAA,QADG;AAEHF,UAAAA,GAFG;AAGHC,UAAAA;AAHG,SAAP;AAKH;;AAED,YAAM;AAAEC,QAAAA,QAAF;AAAYF,QAAAA,GAAZ;AAAiBC,QAAAA;AAAjB,UAAyBJ,aAAa,CAACX,IAAD,EAAOC,SAAP,CAA5C;AAEA,YAAMgB,UAAU,GAAG,CACf,CAACV,WADc,EAEfQ,GAAG,GAAGP,UAAN,GAAmBQ,QAAnB,GAA8B,CAFf,EAGfD,GAAG,GAAGP,UAAN,GAAmBQ,QAHJ,EAIf,CAJe,EAKfF,GAAG,GAAGN,UAAN,GAAmBQ,QALJ,EAMfF,GAAG,GAAGN,UAAN,GAAmBQ,QAAnB,GAA8B,CANf,EAOfT,WAPe,CAAnB;AAUA,YAAMW,WAAW,GAAG,CAChBF,QADgB,EAEhBF,GAAG,GAAGN,UAAN,GAAmB,CAFH,EAGhBO,GAAG,GAAGP,UAHU,EAIhBQ,QAJgB,EAKhBF,GAAG,GAAGN,UALU,EAMhBO,GAAG,GAAGP,UAAN,GAAmB,CANH,EAOhBQ,QAPgB,CAApB;AAUA,aAAO,wCACHd,IAAI,CAACC,KAAL,CAAWR,cAAc,CAACwB,KAA1B,CADG,EAEHF,UAAU,CAACG,GAAX,CAAelB,IAAI,CAACC,KAApB,CAFG,EAGHe,WAAW,CAACE,GAAZ,CAAgBlB,IAAI,CAACC,KAArB,CAHG,EAIHkB,mCAAYC,KAJT,CAAP;AAMH;;AAED,WAAO3B,cAAc,CAACwB,KAAf,GAAuBT,UAA9B;AACH,GAlES,EAkEP,CAACZ,IAAD,EAAOC,IAAP,EAAaE,SAAb,EAAwBD,IAAxB,CAlEO,CAAV;AAoEA,SAAOS,CAAP;AACH,CApFM","sourcesContent":["import Animated, {\n Extrapolate,\n interpolate,\n useDerivedValue,\n} from 'react-native-reanimated';\n\ninterface IOpts {\n index: number;\n width: number;\n handlerOffsetX: Animated.SharedValue<number>;\n data: unknown[];\n type?: 'positive' | 'negative';\n viewCount?: number;\n loop?: boolean;\n}\n\nexport const useOffsetX = (opts: IOpts) => {\n const {\n handlerOffsetX,\n index,\n width,\n loop,\n data,\n type = 'positive',\n viewCount = Math.round((data.length - 1) / 2),\n } = opts;\n const ITEM_LENGTH = data.length;\n const VALID_LENGTH = ITEM_LENGTH - 1;\n const TOTAL_WIDTH = width * ITEM_LENGTH;\n const HALF_WIDTH = 0.5 * width;\n\n const x = useDerivedValue(() => {\n const defaultPos = width * index;\n if (loop) {\n function getDefaultPos(\n _type: 'positive' | 'negative',\n _count: number\n ): {\n MAX: number;\n MIN: number;\n startPos: number;\n } {\n let MAX = null;\n let MIN = null;\n\n let startPos: number = defaultPos;\n\n if (_type === 'positive') {\n MAX = _count * width;\n MIN = -(VALID_LENGTH - _count) * width;\n } else {\n MAX = (VALID_LENGTH - _count) * width;\n MIN = -_count * width;\n }\n\n if (defaultPos > MAX) {\n startPos = MAX - defaultPos;\n }\n\n return {\n startPos,\n MAX,\n MIN,\n };\n }\n\n const { startPos, MAX, MIN } = getDefaultPos(type, viewCount);\n\n const inputRange = [\n -TOTAL_WIDTH,\n MIN - HALF_WIDTH - startPos - 1,\n MIN - HALF_WIDTH - startPos,\n 0,\n MAX + HALF_WIDTH - startPos,\n MAX + HALF_WIDTH - startPos + 1,\n TOTAL_WIDTH,\n ];\n\n const outputRange = [\n startPos,\n MAX + HALF_WIDTH - 1,\n MIN - HALF_WIDTH,\n startPos,\n MAX + HALF_WIDTH,\n MIN - HALF_WIDTH + 1,\n startPos,\n ];\n\n return interpolate(\n Math.round(handlerOffsetX.value),\n inputRange.map(Math.round),\n outputRange.map(Math.round),\n Extrapolate.CLAMP\n );\n }\n\n return handlerOffsetX.value + defaultPos;\n }, [loop, data, viewCount, type]);\n\n return x;\n};\n"]}
|
|
@@ -28,14 +28,14 @@ const ParallaxLayout = props => {
|
|
|
28
28
|
index,
|
|
29
29
|
width,
|
|
30
30
|
loop,
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
data,
|
|
32
|
+
children
|
|
33
33
|
} = props;
|
|
34
34
|
const x = (0, _useOffsetX.useOffsetX)({
|
|
35
35
|
handlerOffsetX,
|
|
36
36
|
index,
|
|
37
37
|
width,
|
|
38
|
-
|
|
38
|
+
data,
|
|
39
39
|
loop
|
|
40
40
|
});
|
|
41
41
|
const offsetXStyle = (0, _reactNativeReanimated.useAnimatedStyle)(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["ParallaxLayout.tsx"],"names":["ParallaxLayout","props","handlerOffsetX","parallaxScrollingOffset","parallaxScrollingScale","index","width","loop","
|
|
1
|
+
{"version":3,"sources":["ParallaxLayout.tsx"],"names":["ParallaxLayout","props","handlerOffsetX","parallaxScrollingOffset","parallaxScrollingScale","index","width","loop","data","children","x","offsetXStyle","baseTranslateX","value","padding","extraOffset","zIndex","Extrapolate","CLAMP","scale","relatedTranslateX","transform","translateX","height","alignSelf","flex"],"mappings":";;;;;;;AACA;;AACA;;AACA;;AAKA;;;;;;;;AARA;AAUO,MAAMA,cAQX,GAAIC,KAAD,IAAW;AACZ,QAAM;AACFC,IAAAA,cADE;AAEFC,IAAAA,uBAAuB,GAAG,GAFxB;AAGFC,IAAAA,sBAAsB,GAAG,GAHvB;AAIFC,IAAAA,KAJE;AAKFC,IAAAA,KALE;AAMFC,IAAAA,IANE;AAOFC,IAAAA,IAPE;AAQFC,IAAAA;AARE,MASFR,KATJ;AAWA,QAAMS,CAAC,GAAG,4BAAW;AACjBR,IAAAA,cADiB;AAEjBG,IAAAA,KAFiB;AAGjBC,IAAAA,KAHiB;AAIjBE,IAAAA,IAJiB;AAKjBD,IAAAA;AALiB,GAAX,CAAV;AAQA,QAAMI,YAAY,GAAG,6CAAiB,MAAM;AACxC,UAAMC,cAAc,GAAGF,CAAC,CAACG,KAAF,GAAUR,KAAK,GAAGC,KAAzC;AACA,UAAMQ,OAAO,GAAG,CAAC,IAAIV,sBAAL,IAA+BE,KAA/C;AACA,UAAMS,WAAW,GAAGV,KAAK,GAAGS,OAAR,GAAkBA,OAAO,GAAG,CAAhD;AAEA,UAAME,MAAM,GAAG,wCACXN,CAAC,CAACG,KADS,EAEX,CAAC,CAACP,KAAF,EAAS,CAAT,EAAYA,KAAZ,CAFW,EAGX,CAAC,CAAD,EAAIA,KAAJ,EAAW,CAAX,CAHW,EAIXW,mCAAYC,KAJD,CAAf;AAMA,UAAMC,KAAK,GAAG,wCACVT,CAAC,CAACG,KADQ,EAEV,CAAC,CAACP,KAAF,EAAS,CAAT,EAAYA,KAAZ,CAFU,EAGV,CAACF,sBAAD,EAAyB,CAAzB,EAA4BA,sBAA5B,CAHU,EAIVa,mCAAYC,KAJF,CAAd;AAMA,UAAME,iBAAiB,GAAG,wCACtBV,CAAC,CAACG,KADoB,EAEtB,CAAC,CAACP,KAAF,EAAS,CAAT,EAAYA,KAAZ,CAFsB,EAGtB,CAACH,uBAAD,EAA0B,CAA1B,EAA6B,CAACA,uBAA9B,CAHsB,EAItBc,mCAAYC,KAJU,CAA1B;AAMA,WAAO;AACHG,MAAAA,SAAS,EAAE,CACP;AACIC,QAAAA,UAAU,EACNV,cAAc,GAAGG,WAAjB,GAA+BK;AAFvC,OADO,EAKP;AAAED,QAAAA;AAAF,OALO,CADR;AAQHH,MAAAA;AARG,KAAP;AAUH,GAjCoB,EAiClB,CAACT,IAAD,CAjCkB,CAArB;AAmCA,sBACI,6BAAC,8BAAD,CAAU,IAAV;AACI,IAAA,KAAK,EAAE,CACH;AACID,MAAAA,KAAK,EAAG,GAAEF,sBAAsB,GAAG,GAAI,GAD3C;AAEImB,MAAAA,MAAM,EAAG,GAAEnB,sBAAsB,GAAG,GAAI,GAF5C;AAGIoB,MAAAA,SAAS,EAAE;AAHf,KADG,EAMHb,YANG;AADX,kBAUI,6BAAC,iBAAD;AAAM,IAAA,KAAK,EAAE;AAAEc,MAAAA,IAAI,EAAE;AAAR;AAAb,KAA2BhB,QAA3B,CAVJ,CADJ;AAcH,CA7EM","sourcesContent":["/* eslint-disable react-native/no-inline-styles */\nimport React from 'react';\nimport { View } from 'react-native';\nimport Animated, {\n Extrapolate,\n interpolate,\n useAnimatedStyle,\n} from 'react-native-reanimated';\nimport { useOffsetX } from '../hooks/useOffsetX';\n\nexport const ParallaxLayout: React.FC<{\n loop?: boolean;\n parallaxScrollingOffset?: number;\n parallaxScrollingScale?: number;\n handlerOffsetX: Animated.SharedValue<number>;\n index: number;\n width: number;\n data: unknown[];\n}> = (props) => {\n const {\n handlerOffsetX,\n parallaxScrollingOffset = 100,\n parallaxScrollingScale = 0.8,\n index,\n width,\n loop,\n data,\n children,\n } = props;\n\n const x = useOffsetX({\n handlerOffsetX,\n index,\n width,\n data,\n loop,\n });\n\n const offsetXStyle = useAnimatedStyle(() => {\n const baseTranslateX = x.value - index * width;\n const padding = (1 - parallaxScrollingScale) * width;\n const extraOffset = index * padding + padding / 2;\n\n const zIndex = interpolate(\n x.value,\n [-width, 0, width],\n [0, width, 0],\n Extrapolate.CLAMP\n );\n const scale = interpolate(\n x.value,\n [-width, 0, width],\n [parallaxScrollingScale, 1, parallaxScrollingScale],\n Extrapolate.CLAMP\n );\n const relatedTranslateX = interpolate(\n x.value,\n [-width, 0, width],\n [parallaxScrollingOffset, 0, -parallaxScrollingOffset],\n Extrapolate.CLAMP\n );\n return {\n transform: [\n {\n translateX:\n baseTranslateX + extraOffset + relatedTranslateX,\n },\n { scale },\n ],\n zIndex,\n };\n }, [loop]);\n\n return (\n <Animated.View\n style={[\n {\n width: `${parallaxScrollingScale * 100}%`,\n height: `${parallaxScrollingScale * 100}%`,\n alignSelf: 'center',\n },\n offsetXStyle,\n ]}\n >\n <View style={{ flex: 1 }}>{children}</View>\n </Animated.View>\n );\n};\n"]}
|
package/lib/module/Carousel.js
CHANGED
|
@@ -6,7 +6,6 @@ import Animated, { cancelAnimation, runOnJS, useAnimatedGestureHandler, useAnima
|
|
|
6
6
|
import { CarouselItem } from './CarouselItem';
|
|
7
7
|
import { ParallaxLayout } from './layouts/index';
|
|
8
8
|
import { useCarouselController } from './hooks/useCarouselController';
|
|
9
|
-
import { useComputedAnim } from './hooks/useComputedAnim';
|
|
10
9
|
import { useAutoPlay } from './hooks/useAutoPlay';
|
|
11
10
|
import { useIndexController } from './hooks/useIndexController';
|
|
12
11
|
import { usePropsErrorBoundary } from './hooks/usePropsErrorBoundary';
|
|
@@ -69,7 +68,6 @@ function Carousel(props, ref) {
|
|
|
69
68
|
|
|
70
69
|
return _data;
|
|
71
70
|
}, [_data, loop]);
|
|
72
|
-
const computedAnimResult = useComputedAnim(width, data.length);
|
|
73
71
|
const indexController = useIndexController({
|
|
74
72
|
originalLength: _data.length,
|
|
75
73
|
length: data.length,
|
|
@@ -116,14 +114,15 @@ function Carousel(props, ref) {
|
|
|
116
114
|
(_props$onScrollEnd = props.onScrollEnd) === null || _props$onScrollEnd === void 0 ? void 0 : _props$onScrollEnd.call(props, sharedPreIndex.current, sharedIndex.current);
|
|
117
115
|
}, [sharedPreIndex, sharedIndex, computedIndex, props, run]);
|
|
118
116
|
const offsetX = useDerivedValue(() => {
|
|
119
|
-
const
|
|
117
|
+
const totalWidth = width * data.length;
|
|
118
|
+
const x = handlerOffsetX.value % totalWidth;
|
|
120
119
|
|
|
121
120
|
if (!loop) {
|
|
122
121
|
return handlerOffsetX.value;
|
|
123
122
|
}
|
|
124
123
|
|
|
125
124
|
return isNaN(x) ? 0 : x;
|
|
126
|
-
}, [
|
|
125
|
+
}, [loop, width, data]);
|
|
127
126
|
useAnimatedReaction(() => offsetX.value, value => {
|
|
128
127
|
let absoluteProgress = Math.abs(value / width);
|
|
129
128
|
|
|
@@ -214,7 +213,7 @@ function Carousel(props, ref) {
|
|
|
214
213
|
return /*#__PURE__*/React.createElement(ParallaxLayout, {
|
|
215
214
|
parallaxScrollingOffset: parallaxScrollingOffset,
|
|
216
215
|
parallaxScrollingScale: parallaxScrollingScale,
|
|
217
|
-
|
|
216
|
+
data: data,
|
|
218
217
|
width: width,
|
|
219
218
|
handlerOffsetX: offsetX,
|
|
220
219
|
index: i,
|
|
@@ -224,7 +223,7 @@ function Carousel(props, ref) {
|
|
|
224
223
|
|
|
225
224
|
default:
|
|
226
225
|
return /*#__PURE__*/React.createElement(CarouselItem, {
|
|
227
|
-
|
|
226
|
+
data: data,
|
|
228
227
|
width: width,
|
|
229
228
|
height: height,
|
|
230
229
|
handlerOffsetX: offsetX,
|
|
@@ -233,7 +232,7 @@ function Carousel(props, ref) {
|
|
|
233
232
|
loop: loop
|
|
234
233
|
}, renderItem(item, i));
|
|
235
234
|
}
|
|
236
|
-
}, [loop, mode,
|
|
235
|
+
}, [loop, mode, data, height, offsetX, parallaxScrollingOffset, parallaxScrollingScale, width, renderItem]);
|
|
237
236
|
return /*#__PURE__*/React.createElement(PanGestureHandler, _extends({}, panGestureHandlerProps, {
|
|
238
237
|
onGestureEvent: animatedListScrollHandler
|
|
239
238
|
}), /*#__PURE__*/React.createElement(Animated.View, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["Carousel.tsx"],"names":["React","PanGestureHandler","Animated","cancelAnimation","runOnJS","useAnimatedGestureHandler","useAnimatedReaction","useDerivedValue","useSharedValue","withSpring","CarouselItem","ParallaxLayout","useCarouselController","useComputedAnim","useAutoPlay","useIndexController","usePropsErrorBoundary","defaultSpringConfig","damping","Carousel","props","ref","defaultIndex","height","data","_data","loop","mode","autoPlay","autoPlayReverse","autoPlayInterval","parallaxScrollingOffset","parallaxScrollingScale","style","panGestureHandlerProps","renderItem","onSnapToItem","onProgressChange","timingConfig","springConfig","width","Math","round","defaultHandlerOffsetX","abs","handlerOffsetX","useMemo","length","computedAnimResult","indexController","originalLength","onChange","i","carouselController","disable","onScrollBegin","onScrollEnd","run","pause","index","sharedPreIndex","sharedIndex","computedIndex","useCallback","current","offsetX","x","value","TOTAL_WIDTH","isNaN","absoluteProgress","next","prev","getCurrentIndex","goToIndex","animated","to","animatedListScrollHandler","onStart","_","ctx","currentContentOffsetX","start","onActive","e","translationX","onEnd","_withAnimationCallback","num","Object","assign","velocity","velocityX","isFinished","page","velocityPage","pageWithVelocity","min","max","useImperativeHandle","renderLayout","item","flexDirection","position","map","forwardRef"],"mappings":"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","sourcesContent":["import React from 'react';\nimport type { FlexStyle, ViewStyle } from 'react-native';\nimport {\n PanGestureHandler,\n PanGestureHandlerProps,\n PanGestureHandlerGestureEvent,\n} from 'react-native-gesture-handler';\nimport Animated, {\n cancelAnimation,\n runOnJS,\n useAnimatedGestureHandler,\n useAnimatedReaction,\n useDerivedValue,\n useSharedValue,\n withSpring,\n} from 'react-native-reanimated';\nimport { CarouselItem } from './CarouselItem';\nimport type { TMode } from './layouts';\nimport { ParallaxLayout } from './layouts/index';\nimport { useCarouselController } from './hooks/useCarouselController';\nimport { useComputedAnim } from './hooks/useComputedAnim';\nimport { useAutoPlay } from './hooks/useAutoPlay';\nimport { useIndexController } from './hooks/useIndexController';\nimport { usePropsErrorBoundary } from './hooks/usePropsErrorBoundary';\n\nconst defaultSpringConfig: Animated.WithSpringConfig = {\n damping: 100,\n};\nexport interface ICarouselProps<T extends unknown> {\n ref?: React.Ref<ICarouselInstance>;\n /**\n * Carousel loop playback.\n * @default true\n */\n loop?: boolean;\n /**\n * Carousel Animated transitions.\n * @default 'default'\n */\n mode?: TMode;\n /**\n * Specified carousel container width.\n */\n width: number;\n /**\n * Specified carousel container height.\n * @default '100%'\n */\n height?: FlexStyle['height'];\n /**\n * Carousel items data set.\n */\n data: T[];\n /**\n * Default index\n * @default 0\n */\n defaultIndex?: number;\n /**\n * Auto play\n */\n autoPlay?: boolean;\n /**\n * Auto play\n * @description reverse playback\n */\n autoPlayReverse?: boolean;\n /**\n * Auto play\n * @description playback interval\n */\n autoPlayInterval?: number;\n /**\n * Carousel container style\n */\n style?: ViewStyle;\n /**\n * When use 'default' Layout props,this prop can be control prev/next item offset.\n * @default 100\n */\n parallaxScrollingOffset?: number;\n /**\n * When use 'default' Layout props,this prop can be control prev/next item offset.\n * @default 0.8\n */\n parallaxScrollingScale?: number;\n /**\n * Sping config of translation animated\n */\n springConfig?: Animated.WithSpringConfig;\n /**\n * PanGestureHandler props\n */\n panGestureHandlerProps?: Omit<\n Partial<PanGestureHandlerProps>,\n 'onHandlerStateChange'\n >;\n /**\n * Render carousel item.\n */\n renderItem: (data: T, index: number) => React.ReactNode;\n /**\n * Callback fired when navigating to an item\n */\n onSnapToItem?: (index: number) => void;\n /**\n * On scroll begin\n */\n onScrollBegin?: () => void;\n /**\n * On scroll end\n */\n onScrollEnd?: (previous: number, current: number) => void;\n /**\n * On progress change\n * @param offsetProgress Total of offset distance (0 390 780 ...)\n * @param absoluteProgress Convert to index (0 1 2 ...)\n */\n onProgressChange?: (\n offsetProgress: number,\n absoluteProgress: number\n ) => void;\n}\n\nexport interface ICarouselInstance {\n /**\n * Play the last one\n */\n prev: () => void;\n /**\n * Play the next one\n */\n next: () => void;\n /**\n * Get current item index\n */\n getCurrentIndex: () => number;\n /**\n * Go to index\n */\n goToIndex: (index: number, animated?: boolean) => void;\n}\n\nfunction Carousel<T extends unknown = any>(\n props: ICarouselProps<T>,\n ref: React.Ref<ICarouselInstance>\n) {\n const {\n defaultIndex = 0,\n height = '100%',\n data: _data = [],\n loop = true,\n mode = 'default',\n autoPlay,\n autoPlayReverse,\n autoPlayInterval = 1000,\n parallaxScrollingOffset,\n parallaxScrollingScale,\n style,\n panGestureHandlerProps = {},\n renderItem,\n onSnapToItem,\n onProgressChange,\n } = props;\n\n usePropsErrorBoundary({\n ...props,\n defaultIndex,\n height,\n data: _data,\n loop,\n mode,\n autoPlay,\n autoPlayReverse,\n autoPlayInterval,\n parallaxScrollingOffset,\n parallaxScrollingScale,\n style,\n panGestureHandlerProps,\n // @ts-ignore\n renderItem,\n onSnapToItem,\n onProgressChange,\n });\n\n const timingConfig = {\n ...defaultSpringConfig,\n ...props.springConfig,\n };\n const width = Math.round(props.width);\n const defaultHandlerOffsetX = -Math.abs(defaultIndex * width);\n const handlerOffsetX = useSharedValue<number>(defaultHandlerOffsetX);\n const data = React.useMemo<T[]>(() => {\n if (!loop) return _data;\n\n if (_data.length === 1) {\n return [_data[0], _data[0], _data[0]];\n }\n\n if (_data.length === 2) {\n return [_data[0], _data[1], _data[0], _data[1]];\n }\n\n return _data;\n }, [_data, loop]);\n\n const computedAnimResult = useComputedAnim(width, data.length);\n\n const indexController = useIndexController({\n originalLength: _data.length,\n length: data.length,\n handlerOffsetX,\n width,\n loop,\n onChange: (i) => onSnapToItem && runOnJS(onSnapToItem)(i),\n });\n\n const carouselController = useCarouselController({\n loop,\n width,\n handlerOffsetX,\n indexController,\n disable: !data.length,\n onScrollBegin: () => runOnJS(onScrollBegin)(),\n onScrollEnd: () => runOnJS(onScrollEnd)(),\n });\n\n const { run, pause } = useAutoPlay({\n autoPlay,\n autoPlayInterval,\n autoPlayReverse,\n carouselController,\n });\n\n const { index, sharedPreIndex, sharedIndex, computedIndex } =\n indexController;\n\n const onScrollBegin = React.useCallback(() => {\n pause();\n props.onScrollBegin?.();\n }, [pause, props]);\n\n const onScrollEnd = React.useCallback(() => {\n run();\n computedIndex();\n props.onScrollEnd?.(sharedPreIndex.current, sharedIndex.current);\n }, [sharedPreIndex, sharedIndex, computedIndex, props, run]);\n\n const offsetX = useDerivedValue(() => {\n const x = handlerOffsetX.value % computedAnimResult.TOTAL_WIDTH;\n\n if (!loop) {\n return handlerOffsetX.value;\n }\n return isNaN(x) ? 0 : x;\n }, [computedAnimResult, loop]);\n\n useAnimatedReaction(\n () => offsetX.value,\n (value) => {\n let absoluteProgress = Math.abs(value / width);\n if (value > 0) {\n absoluteProgress = data.length - absoluteProgress;\n }\n !!onProgressChange &&\n runOnJS(onProgressChange)(value, absoluteProgress);\n },\n [onProgressChange, data]\n );\n\n const next = React.useCallback(() => {\n return carouselController.next();\n }, [carouselController]);\n\n const prev = React.useCallback(() => {\n return carouselController.prev();\n }, [carouselController]);\n\n const getCurrentIndex = React.useCallback(() => {\n return index.value;\n }, [index]);\n\n const goToIndex = React.useCallback(\n (i: number, animated?: boolean) => {\n carouselController.to(i, animated);\n },\n [carouselController]\n );\n\n const animatedListScrollHandler =\n useAnimatedGestureHandler<PanGestureHandlerGestureEvent>(\n {\n onStart: (_, ctx: any) => {\n runOnJS(pause)();\n runOnJS(onScrollBegin)();\n cancelAnimation(handlerOffsetX);\n ctx.currentContentOffsetX = handlerOffsetX.value;\n ctx.start = true;\n },\n onActive: (e, ctx: any) => {\n const { translationX } = e;\n if (\n !loop &&\n (handlerOffsetX.value >= 0 ||\n handlerOffsetX.value <= -(data.length - 1) * width)\n ) {\n handlerOffsetX.value =\n ctx.currentContentOffsetX + translationX / 2;\n return;\n }\n handlerOffsetX.value =\n ctx.currentContentOffsetX + translationX;\n },\n onEnd: (e) => {\n function _withAnimationCallback(num: number) {\n return withSpring(\n num,\n Object.assign({}, timingConfig, {\n velocity: e.velocityX,\n }),\n (isFinished) => {\n if (isFinished) {\n runOnJS(onScrollEnd)();\n }\n }\n );\n }\n\n const page = Math.round(handlerOffsetX.value / width);\n\n const velocityPage = Math.round(\n (handlerOffsetX.value + e.velocityX) / width\n );\n\n let pageWithVelocity = Math.min(\n page + 1,\n Math.max(page - 1, velocityPage)\n );\n\n if (!loop) {\n pageWithVelocity = Math.max(\n -(data.length - 1),\n Math.min(0, pageWithVelocity)\n );\n }\n\n if (loop) {\n handlerOffsetX.value = _withAnimationCallback(\n pageWithVelocity * width\n );\n return;\n }\n if (handlerOffsetX.value >= 0) {\n handlerOffsetX.value = _withAnimationCallback(0);\n return;\n }\n\n if (handlerOffsetX.value <= -(data.length - 1) * width) {\n handlerOffsetX.value = _withAnimationCallback(\n -(data.length - 1) * width\n );\n return;\n }\n\n handlerOffsetX.value = _withAnimationCallback(\n pageWithVelocity * width\n );\n },\n },\n [loop, data, onScrollBegin, onScrollEnd]\n );\n\n React.useImperativeHandle(\n ref,\n () => ({\n next,\n prev,\n getCurrentIndex,\n goToIndex,\n }),\n [getCurrentIndex, goToIndex, next, prev]\n );\n\n const renderLayout = React.useCallback(\n (item: T, i: number) => {\n switch (mode) {\n case 'parallax':\n return (\n <ParallaxLayout\n parallaxScrollingOffset={parallaxScrollingOffset}\n parallaxScrollingScale={parallaxScrollingScale}\n computedAnimResult={computedAnimResult}\n width={width}\n handlerOffsetX={offsetX}\n index={i}\n key={i}\n loop={loop}\n >\n {renderItem(item, i)}\n </ParallaxLayout>\n );\n default:\n return (\n <CarouselItem\n computedAnimResult={computedAnimResult}\n width={width}\n height={height}\n handlerOffsetX={offsetX}\n index={i}\n key={i}\n loop={loop}\n >\n {renderItem(item, i)}\n </CarouselItem>\n );\n }\n },\n [\n loop,\n mode,\n computedAnimResult,\n height,\n offsetX,\n parallaxScrollingOffset,\n parallaxScrollingScale,\n width,\n renderItem,\n ]\n );\n\n return (\n <PanGestureHandler\n {...panGestureHandlerProps}\n onGestureEvent={animatedListScrollHandler}\n >\n <Animated.View\n // eslint-disable-next-line react-native/no-inline-styles\n style={{\n ...style,\n width,\n height,\n flexDirection: 'row',\n position: 'relative',\n }}\n >\n {data.map(renderLayout)}\n </Animated.View>\n </PanGestureHandler>\n );\n}\n\nexport default React.forwardRef(Carousel) as typeof Carousel;\n"]}
|
|
1
|
+
{"version":3,"sources":["Carousel.tsx"],"names":["React","PanGestureHandler","Animated","cancelAnimation","runOnJS","useAnimatedGestureHandler","useAnimatedReaction","useDerivedValue","useSharedValue","withSpring","CarouselItem","ParallaxLayout","useCarouselController","useAutoPlay","useIndexController","usePropsErrorBoundary","defaultSpringConfig","damping","Carousel","props","ref","defaultIndex","height","data","_data","loop","mode","autoPlay","autoPlayReverse","autoPlayInterval","parallaxScrollingOffset","parallaxScrollingScale","style","panGestureHandlerProps","renderItem","onSnapToItem","onProgressChange","timingConfig","springConfig","width","Math","round","defaultHandlerOffsetX","abs","handlerOffsetX","useMemo","length","indexController","originalLength","onChange","i","carouselController","disable","onScrollBegin","onScrollEnd","run","pause","index","sharedPreIndex","sharedIndex","computedIndex","useCallback","current","offsetX","totalWidth","x","value","isNaN","absoluteProgress","next","prev","getCurrentIndex","goToIndex","animated","to","animatedListScrollHandler","onStart","_","ctx","currentContentOffsetX","start","onActive","e","translationX","onEnd","_withAnimationCallback","num","Object","assign","velocity","velocityX","isFinished","page","velocityPage","pageWithVelocity","min","max","useImperativeHandle","renderLayout","item","flexDirection","position","map","forwardRef"],"mappings":"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","sourcesContent":["import React from 'react';\nimport type { FlexStyle, ViewStyle } from 'react-native';\nimport {\n PanGestureHandler,\n PanGestureHandlerProps,\n PanGestureHandlerGestureEvent,\n} from 'react-native-gesture-handler';\nimport Animated, {\n cancelAnimation,\n runOnJS,\n useAnimatedGestureHandler,\n useAnimatedReaction,\n useDerivedValue,\n useSharedValue,\n withSpring,\n} from 'react-native-reanimated';\nimport { CarouselItem } from './CarouselItem';\nimport type { TMode } from './layouts';\nimport { ParallaxLayout } from './layouts/index';\nimport { useCarouselController } from './hooks/useCarouselController';\nimport { useAutoPlay } from './hooks/useAutoPlay';\nimport { useIndexController } from './hooks/useIndexController';\nimport { usePropsErrorBoundary } from './hooks/usePropsErrorBoundary';\n\nconst defaultSpringConfig: Animated.WithSpringConfig = {\n damping: 100,\n};\nexport interface ICarouselProps<T extends unknown> {\n ref?: React.Ref<ICarouselInstance>;\n /**\n * Carousel loop playback.\n * @default true\n */\n loop?: boolean;\n /**\n * Carousel Animated transitions.\n * @default 'default'\n */\n mode?: TMode;\n /**\n * Specified carousel container width.\n */\n width: number;\n /**\n * Specified carousel container height.\n * @default '100%'\n */\n height?: FlexStyle['height'];\n /**\n * Carousel items data set.\n */\n data: T[];\n /**\n * Default index\n * @default 0\n */\n defaultIndex?: number;\n /**\n * Auto play\n */\n autoPlay?: boolean;\n /**\n * Auto play\n * @description reverse playback\n */\n autoPlayReverse?: boolean;\n /**\n * Auto play\n * @description playback interval\n */\n autoPlayInterval?: number;\n /**\n * Carousel container style\n */\n style?: ViewStyle;\n /**\n * When use 'default' Layout props,this prop can be control prev/next item offset.\n * @default 100\n */\n parallaxScrollingOffset?: number;\n /**\n * When use 'default' Layout props,this prop can be control prev/next item offset.\n * @default 0.8\n */\n parallaxScrollingScale?: number;\n /**\n * Sping config of translation animated\n */\n springConfig?: Animated.WithSpringConfig;\n /**\n * PanGestureHandler props\n */\n panGestureHandlerProps?: Omit<\n Partial<PanGestureHandlerProps>,\n 'onHandlerStateChange'\n >;\n /**\n * Render carousel item.\n */\n renderItem: (data: T, index: number) => React.ReactNode;\n /**\n * Callback fired when navigating to an item\n */\n onSnapToItem?: (index: number) => void;\n /**\n * On scroll begin\n */\n onScrollBegin?: () => void;\n /**\n * On scroll end\n */\n onScrollEnd?: (previous: number, current: number) => void;\n /**\n * On progress change\n * @param offsetProgress Total of offset distance (0 390 780 ...)\n * @param absoluteProgress Convert to index (0 1 2 ...)\n */\n onProgressChange?: (\n offsetProgress: number,\n absoluteProgress: number\n ) => void;\n}\n\nexport interface ICarouselInstance {\n /**\n * Play the last one\n */\n prev: () => void;\n /**\n * Play the next one\n */\n next: () => void;\n /**\n * Get current item index\n */\n getCurrentIndex: () => number;\n /**\n * Go to index\n */\n goToIndex: (index: number, animated?: boolean) => void;\n}\n\nfunction Carousel<T extends unknown = any>(\n props: ICarouselProps<T>,\n ref: React.Ref<ICarouselInstance>\n) {\n const {\n defaultIndex = 0,\n height = '100%',\n data: _data = [],\n loop = true,\n mode = 'default',\n autoPlay,\n autoPlayReverse,\n autoPlayInterval = 1000,\n parallaxScrollingOffset,\n parallaxScrollingScale,\n style,\n panGestureHandlerProps = {},\n renderItem,\n onSnapToItem,\n onProgressChange,\n } = props;\n\n usePropsErrorBoundary({\n ...props,\n defaultIndex,\n height,\n data: _data,\n loop,\n mode,\n autoPlay,\n autoPlayReverse,\n autoPlayInterval,\n parallaxScrollingOffset,\n parallaxScrollingScale,\n style,\n panGestureHandlerProps,\n // @ts-ignore\n renderItem,\n onSnapToItem,\n onProgressChange,\n });\n\n const timingConfig = {\n ...defaultSpringConfig,\n ...props.springConfig,\n };\n const width = Math.round(props.width);\n const defaultHandlerOffsetX = -Math.abs(defaultIndex * width);\n const handlerOffsetX = useSharedValue<number>(defaultHandlerOffsetX);\n const data = React.useMemo<T[]>(() => {\n if (!loop) return _data;\n\n if (_data.length === 1) {\n return [_data[0], _data[0], _data[0]];\n }\n\n if (_data.length === 2) {\n return [_data[0], _data[1], _data[0], _data[1]];\n }\n\n return _data;\n }, [_data, loop]);\n\n const indexController = useIndexController({\n originalLength: _data.length,\n length: data.length,\n handlerOffsetX,\n width,\n loop,\n onChange: (i) => onSnapToItem && runOnJS(onSnapToItem)(i),\n });\n\n const carouselController = useCarouselController({\n loop,\n width,\n handlerOffsetX,\n indexController,\n disable: !data.length,\n onScrollBegin: () => runOnJS(onScrollBegin)(),\n onScrollEnd: () => runOnJS(onScrollEnd)(),\n });\n\n const { run, pause } = useAutoPlay({\n autoPlay,\n autoPlayInterval,\n autoPlayReverse,\n carouselController,\n });\n\n const { index, sharedPreIndex, sharedIndex, computedIndex } =\n indexController;\n\n const onScrollBegin = React.useCallback(() => {\n pause();\n props.onScrollBegin?.();\n }, [pause, props]);\n\n const onScrollEnd = React.useCallback(() => {\n run();\n computedIndex();\n props.onScrollEnd?.(sharedPreIndex.current, sharedIndex.current);\n }, [sharedPreIndex, sharedIndex, computedIndex, props, run]);\n\n const offsetX = useDerivedValue(() => {\n const totalWidth = width * data.length;\n const x = handlerOffsetX.value % totalWidth;\n\n if (!loop) {\n return handlerOffsetX.value;\n }\n return isNaN(x) ? 0 : x;\n }, [loop, width, data]);\n\n useAnimatedReaction(\n () => offsetX.value,\n (value) => {\n let absoluteProgress = Math.abs(value / width);\n if (value > 0) {\n absoluteProgress = data.length - absoluteProgress;\n }\n !!onProgressChange &&\n runOnJS(onProgressChange)(value, absoluteProgress);\n },\n [onProgressChange, data]\n );\n\n const next = React.useCallback(() => {\n return carouselController.next();\n }, [carouselController]);\n\n const prev = React.useCallback(() => {\n return carouselController.prev();\n }, [carouselController]);\n\n const getCurrentIndex = React.useCallback(() => {\n return index.value;\n }, [index]);\n\n const goToIndex = React.useCallback(\n (i: number, animated?: boolean) => {\n carouselController.to(i, animated);\n },\n [carouselController]\n );\n\n const animatedListScrollHandler =\n useAnimatedGestureHandler<PanGestureHandlerGestureEvent>(\n {\n onStart: (_, ctx: any) => {\n runOnJS(pause)();\n runOnJS(onScrollBegin)();\n cancelAnimation(handlerOffsetX);\n ctx.currentContentOffsetX = handlerOffsetX.value;\n ctx.start = true;\n },\n onActive: (e, ctx: any) => {\n const { translationX } = e;\n if (\n !loop &&\n (handlerOffsetX.value >= 0 ||\n handlerOffsetX.value <= -(data.length - 1) * width)\n ) {\n handlerOffsetX.value =\n ctx.currentContentOffsetX + translationX / 2;\n return;\n }\n handlerOffsetX.value =\n ctx.currentContentOffsetX + translationX;\n },\n onEnd: (e) => {\n function _withAnimationCallback(num: number) {\n return withSpring(\n num,\n Object.assign({}, timingConfig, {\n velocity: e.velocityX,\n }),\n (isFinished) => {\n if (isFinished) {\n runOnJS(onScrollEnd)();\n }\n }\n );\n }\n\n const page = Math.round(handlerOffsetX.value / width);\n\n const velocityPage = Math.round(\n (handlerOffsetX.value + e.velocityX) / width\n );\n\n let pageWithVelocity = Math.min(\n page + 1,\n Math.max(page - 1, velocityPage)\n );\n\n if (!loop) {\n pageWithVelocity = Math.max(\n -(data.length - 1),\n Math.min(0, pageWithVelocity)\n );\n }\n\n if (loop) {\n handlerOffsetX.value = _withAnimationCallback(\n pageWithVelocity * width\n );\n return;\n }\n if (handlerOffsetX.value >= 0) {\n handlerOffsetX.value = _withAnimationCallback(0);\n return;\n }\n\n if (handlerOffsetX.value <= -(data.length - 1) * width) {\n handlerOffsetX.value = _withAnimationCallback(\n -(data.length - 1) * width\n );\n return;\n }\n\n handlerOffsetX.value = _withAnimationCallback(\n pageWithVelocity * width\n );\n },\n },\n [loop, data, onScrollBegin, onScrollEnd]\n );\n\n React.useImperativeHandle(\n ref,\n () => ({\n next,\n prev,\n getCurrentIndex,\n goToIndex,\n }),\n [getCurrentIndex, goToIndex, next, prev]\n );\n\n const renderLayout = React.useCallback(\n (item: T, i: number) => {\n switch (mode) {\n case 'parallax':\n return (\n <ParallaxLayout\n parallaxScrollingOffset={parallaxScrollingOffset}\n parallaxScrollingScale={parallaxScrollingScale}\n data={data}\n width={width}\n handlerOffsetX={offsetX}\n index={i}\n key={i}\n loop={loop}\n >\n {renderItem(item, i)}\n </ParallaxLayout>\n );\n default:\n return (\n <CarouselItem\n data={data}\n width={width}\n height={height}\n handlerOffsetX={offsetX}\n index={i}\n key={i}\n loop={loop}\n >\n {renderItem(item, i)}\n </CarouselItem>\n );\n }\n },\n [\n loop,\n mode,\n data,\n height,\n offsetX,\n parallaxScrollingOffset,\n parallaxScrollingScale,\n width,\n renderItem,\n ]\n );\n\n return (\n <PanGestureHandler\n {...panGestureHandlerProps}\n onGestureEvent={animatedListScrollHandler}\n >\n <Animated.View\n // eslint-disable-next-line react-native/no-inline-styles\n style={{\n ...style,\n width,\n height,\n flexDirection: 'row',\n position: 'relative',\n }}\n >\n {data.map(renderLayout)}\n </Animated.View>\n </PanGestureHandler>\n );\n}\n\nexport default React.forwardRef(Carousel) as typeof Carousel;\n"]}
|
|
@@ -9,14 +9,14 @@ export const CarouselItem = props => {
|
|
|
9
9
|
children,
|
|
10
10
|
width,
|
|
11
11
|
height = '100%',
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
loop,
|
|
13
|
+
data
|
|
14
14
|
} = props;
|
|
15
15
|
const x = useOffsetX({
|
|
16
16
|
handlerOffsetX,
|
|
17
17
|
index,
|
|
18
18
|
width,
|
|
19
|
-
|
|
19
|
+
data,
|
|
20
20
|
loop
|
|
21
21
|
});
|
|
22
22
|
const offsetXStyle = useAnimatedStyle(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["CarouselItem.tsx"],"names":["React","View","Animated","useAnimatedStyle","useOffsetX","CarouselItem","props","handlerOffsetX","index","children","width","height","
|
|
1
|
+
{"version":3,"sources":["CarouselItem.tsx"],"names":["React","View","Animated","useAnimatedStyle","useOffsetX","CarouselItem","props","handlerOffsetX","index","children","width","height","loop","data","x","offsetXStyle","transform","translateX","value"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,SAAoBC,IAApB,QAAgC,cAAhC;AACA,OAAOC,QAAP,IAAmBC,gBAAnB,QAA2C,yBAA3C;AACA,SAASC,UAAT,QAA2B,oBAA3B;AAEA,OAAO,MAAMC,YAOX,GAAIC,KAAD,IAAW;AACZ,QAAM;AACFC,IAAAA,cADE;AAEFC,IAAAA,KAFE;AAGFC,IAAAA,QAHE;AAIFC,IAAAA,KAJE;AAKFC,IAAAA,MAAM,GAAG,MALP;AAMFC,IAAAA,IANE;AAOFC,IAAAA;AAPE,MAQFP,KARJ;AAUA,QAAMQ,CAAC,GAAGV,UAAU,CAAC;AACjBG,IAAAA,cADiB;AAEjBC,IAAAA,KAFiB;AAGjBE,IAAAA,KAHiB;AAIjBG,IAAAA,IAJiB;AAKjBD,IAAAA;AALiB,GAAD,CAApB;AAQA,QAAMG,YAAY,GAAGZ,gBAAgB,CAAC,MAAM;AACxC,WAAO;AACHa,MAAAA,SAAS,EAAE,CAAC;AAAEC,QAAAA,UAAU,EAAEH,CAAC,CAACI,KAAF,GAAUV,KAAK,GAAGE;AAAhC,OAAD;AADR,KAAP;AAGH,GAJoC,EAIlC,EAJkC,CAArC;AAMA,sBACI,oBAAC,QAAD,CAAU,IAAV;AAAe,IAAA,KAAK,EAAEK;AAAtB,kBACI,oBAAC,IAAD;AAAM,IAAA,KAAK,EAAE;AAAEL,MAAAA,KAAF;AAASC,MAAAA;AAAT;AAAb,KAAiCF,QAAjC,CADJ,CADJ;AAKH,CArCM","sourcesContent":["import React from 'react';\nimport { FlexStyle, View } from 'react-native';\nimport Animated, { useAnimatedStyle } from 'react-native-reanimated';\nimport { useOffsetX } from './hooks/useOffsetX';\n\nexport const CarouselItem: React.FC<{\n loop?: boolean;\n index: number;\n handlerOffsetX: Animated.SharedValue<number>;\n width: number;\n data: unknown[];\n height?: FlexStyle['height'];\n}> = (props) => {\n const {\n handlerOffsetX,\n index,\n children,\n width,\n height = '100%',\n loop,\n data,\n } = props;\n\n const x = useOffsetX({\n handlerOffsetX,\n index,\n width,\n data,\n loop,\n });\n\n const offsetXStyle = useAnimatedStyle(() => {\n return {\n transform: [{ translateX: x.value - index * width }],\n };\n }, []);\n\n return (\n <Animated.View style={offsetXStyle}>\n <View style={{ width, height }}>{children}</View>\n </Animated.View>\n );\n};\n"]}
|
|
@@ -4,28 +4,55 @@ export const useOffsetX = opts => {
|
|
|
4
4
|
handlerOffsetX,
|
|
5
5
|
index,
|
|
6
6
|
width,
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
loop,
|
|
8
|
+
data,
|
|
9
|
+
type = 'positive',
|
|
10
|
+
viewCount = Math.round((data.length - 1) / 2)
|
|
9
11
|
} = opts;
|
|
12
|
+
const ITEM_LENGTH = data.length;
|
|
13
|
+
const VALID_LENGTH = ITEM_LENGTH - 1;
|
|
14
|
+
const TOTAL_WIDTH = width * ITEM_LENGTH;
|
|
15
|
+
const HALF_WIDTH = 0.5 * width;
|
|
10
16
|
const x = useDerivedValue(() => {
|
|
11
|
-
const
|
|
12
|
-
MAX,
|
|
13
|
-
MIN,
|
|
14
|
-
TOTAL_WIDTH,
|
|
15
|
-
HALF_WIDTH
|
|
16
|
-
} = computedAnimResult;
|
|
17
|
+
const defaultPos = width * index;
|
|
17
18
|
|
|
18
19
|
if (loop) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
function getDefaultPos(_type, _count) {
|
|
21
|
+
let MAX = null;
|
|
22
|
+
let MIN = null;
|
|
23
|
+
let startPos = defaultPos;
|
|
24
|
+
|
|
25
|
+
if (_type === 'positive') {
|
|
26
|
+
MAX = _count * width;
|
|
27
|
+
MIN = -(VALID_LENGTH - _count) * width;
|
|
28
|
+
} else {
|
|
29
|
+
MAX = (VALID_LENGTH - _count) * width;
|
|
30
|
+
MIN = -_count * width;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (defaultPos > MAX) {
|
|
34
|
+
startPos = MAX - defaultPos;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return {
|
|
38
|
+
startPos,
|
|
39
|
+
MAX,
|
|
40
|
+
MIN
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const {
|
|
45
|
+
startPos,
|
|
46
|
+
MAX,
|
|
47
|
+
MIN
|
|
48
|
+
} = getDefaultPos(type, viewCount);
|
|
49
|
+
const inputRange = [-TOTAL_WIDTH, MIN - HALF_WIDTH - startPos - 1, MIN - HALF_WIDTH - startPos, 0, MAX + HALF_WIDTH - startPos, MAX + HALF_WIDTH - startPos + 1, TOTAL_WIDTH];
|
|
50
|
+
const outputRange = [startPos, MAX + HALF_WIDTH - 1, MIN - HALF_WIDTH, startPos, MAX + HALF_WIDTH, MIN - HALF_WIDTH + 1, startPos];
|
|
23
51
|
return interpolate(Math.round(handlerOffsetX.value), inputRange.map(Math.round), outputRange.map(Math.round), Extrapolate.CLAMP);
|
|
24
52
|
}
|
|
25
53
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}, [loop, computedAnimResult]);
|
|
54
|
+
return handlerOffsetX.value + defaultPos;
|
|
55
|
+
}, [loop, data, viewCount, type]);
|
|
29
56
|
return x;
|
|
30
57
|
};
|
|
31
58
|
//# sourceMappingURL=useOffsetX.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useOffsetX.ts"],"names":["Extrapolate","interpolate","useDerivedValue","useOffsetX","opts","handlerOffsetX","index","width","
|
|
1
|
+
{"version":3,"sources":["useOffsetX.ts"],"names":["Extrapolate","interpolate","useDerivedValue","useOffsetX","opts","handlerOffsetX","index","width","loop","data","type","viewCount","Math","round","length","ITEM_LENGTH","VALID_LENGTH","TOTAL_WIDTH","HALF_WIDTH","x","defaultPos","getDefaultPos","_type","_count","MAX","MIN","startPos","inputRange","outputRange","value","map","CLAMP"],"mappings":"AAAA,SACIA,WADJ,EAEIC,WAFJ,EAGIC,eAHJ,QAIO,yBAJP;AAgBA,OAAO,MAAMC,UAAU,GAAIC,IAAD,IAAiB;AACvC,QAAM;AACFC,IAAAA,cADE;AAEFC,IAAAA,KAFE;AAGFC,IAAAA,KAHE;AAIFC,IAAAA,IAJE;AAKFC,IAAAA,IALE;AAMFC,IAAAA,IAAI,GAAG,UANL;AAOFC,IAAAA,SAAS,GAAGC,IAAI,CAACC,KAAL,CAAW,CAACJ,IAAI,CAACK,MAAL,GAAc,CAAf,IAAoB,CAA/B;AAPV,MAQFV,IARJ;AASA,QAAMW,WAAW,GAAGN,IAAI,CAACK,MAAzB;AACA,QAAME,YAAY,GAAGD,WAAW,GAAG,CAAnC;AACA,QAAME,WAAW,GAAGV,KAAK,GAAGQ,WAA5B;AACA,QAAMG,UAAU,GAAG,MAAMX,KAAzB;AAEA,QAAMY,CAAC,GAAGjB,eAAe,CAAC,MAAM;AAC5B,UAAMkB,UAAU,GAAGb,KAAK,GAAGD,KAA3B;;AACA,QAAIE,IAAJ,EAAU;AACN,eAASa,aAAT,CACIC,KADJ,EAEIC,MAFJ,EAOE;AACE,YAAIC,GAAG,GAAG,IAAV;AACA,YAAIC,GAAG,GAAG,IAAV;AAEA,YAAIC,QAAgB,GAAGN,UAAvB;;AAEA,YAAIE,KAAK,KAAK,UAAd,EAA0B;AACtBE,UAAAA,GAAG,GAAGD,MAAM,GAAGhB,KAAf;AACAkB,UAAAA,GAAG,GAAG,EAAET,YAAY,GAAGO,MAAjB,IAA2BhB,KAAjC;AACH,SAHD,MAGO;AACHiB,UAAAA,GAAG,GAAG,CAACR,YAAY,GAAGO,MAAhB,IAA0BhB,KAAhC;AACAkB,UAAAA,GAAG,GAAG,CAACF,MAAD,GAAUhB,KAAhB;AACH;;AAED,YAAIa,UAAU,GAAGI,GAAjB,EAAsB;AAClBE,UAAAA,QAAQ,GAAGF,GAAG,GAAGJ,UAAjB;AACH;;AAED,eAAO;AACHM,UAAAA,QADG;AAEHF,UAAAA,GAFG;AAGHC,UAAAA;AAHG,SAAP;AAKH;;AAED,YAAM;AAAEC,QAAAA,QAAF;AAAYF,QAAAA,GAAZ;AAAiBC,QAAAA;AAAjB,UAAyBJ,aAAa,CAACX,IAAD,EAAOC,SAAP,CAA5C;AAEA,YAAMgB,UAAU,GAAG,CACf,CAACV,WADc,EAEfQ,GAAG,GAAGP,UAAN,GAAmBQ,QAAnB,GAA8B,CAFf,EAGfD,GAAG,GAAGP,UAAN,GAAmBQ,QAHJ,EAIf,CAJe,EAKfF,GAAG,GAAGN,UAAN,GAAmBQ,QALJ,EAMfF,GAAG,GAAGN,UAAN,GAAmBQ,QAAnB,GAA8B,CANf,EAOfT,WAPe,CAAnB;AAUA,YAAMW,WAAW,GAAG,CAChBF,QADgB,EAEhBF,GAAG,GAAGN,UAAN,GAAmB,CAFH,EAGhBO,GAAG,GAAGP,UAHU,EAIhBQ,QAJgB,EAKhBF,GAAG,GAAGN,UALU,EAMhBO,GAAG,GAAGP,UAAN,GAAmB,CANH,EAOhBQ,QAPgB,CAApB;AAUA,aAAOzB,WAAW,CACdW,IAAI,CAACC,KAAL,CAAWR,cAAc,CAACwB,KAA1B,CADc,EAEdF,UAAU,CAACG,GAAX,CAAelB,IAAI,CAACC,KAApB,CAFc,EAGde,WAAW,CAACE,GAAZ,CAAgBlB,IAAI,CAACC,KAArB,CAHc,EAIdb,WAAW,CAAC+B,KAJE,CAAlB;AAMH;;AAED,WAAO1B,cAAc,CAACwB,KAAf,GAAuBT,UAA9B;AACH,GAlEwB,EAkEtB,CAACZ,IAAD,EAAOC,IAAP,EAAaE,SAAb,EAAwBD,IAAxB,CAlEsB,CAAzB;AAoEA,SAAOS,CAAP;AACH,CApFM","sourcesContent":["import Animated, {\n Extrapolate,\n interpolate,\n useDerivedValue,\n} from 'react-native-reanimated';\n\ninterface IOpts {\n index: number;\n width: number;\n handlerOffsetX: Animated.SharedValue<number>;\n data: unknown[];\n type?: 'positive' | 'negative';\n viewCount?: number;\n loop?: boolean;\n}\n\nexport const useOffsetX = (opts: IOpts) => {\n const {\n handlerOffsetX,\n index,\n width,\n loop,\n data,\n type = 'positive',\n viewCount = Math.round((data.length - 1) / 2),\n } = opts;\n const ITEM_LENGTH = data.length;\n const VALID_LENGTH = ITEM_LENGTH - 1;\n const TOTAL_WIDTH = width * ITEM_LENGTH;\n const HALF_WIDTH = 0.5 * width;\n\n const x = useDerivedValue(() => {\n const defaultPos = width * index;\n if (loop) {\n function getDefaultPos(\n _type: 'positive' | 'negative',\n _count: number\n ): {\n MAX: number;\n MIN: number;\n startPos: number;\n } {\n let MAX = null;\n let MIN = null;\n\n let startPos: number = defaultPos;\n\n if (_type === 'positive') {\n MAX = _count * width;\n MIN = -(VALID_LENGTH - _count) * width;\n } else {\n MAX = (VALID_LENGTH - _count) * width;\n MIN = -_count * width;\n }\n\n if (defaultPos > MAX) {\n startPos = MAX - defaultPos;\n }\n\n return {\n startPos,\n MAX,\n MIN,\n };\n }\n\n const { startPos, MAX, MIN } = getDefaultPos(type, viewCount);\n\n const inputRange = [\n -TOTAL_WIDTH,\n MIN - HALF_WIDTH - startPos - 1,\n MIN - HALF_WIDTH - startPos,\n 0,\n MAX + HALF_WIDTH - startPos,\n MAX + HALF_WIDTH - startPos + 1,\n TOTAL_WIDTH,\n ];\n\n const outputRange = [\n startPos,\n MAX + HALF_WIDTH - 1,\n MIN - HALF_WIDTH,\n startPos,\n MAX + HALF_WIDTH,\n MIN - HALF_WIDTH + 1,\n startPos,\n ];\n\n return interpolate(\n Math.round(handlerOffsetX.value),\n inputRange.map(Math.round),\n outputRange.map(Math.round),\n Extrapolate.CLAMP\n );\n }\n\n return handlerOffsetX.value + defaultPos;\n }, [loop, data, viewCount, type]);\n\n return x;\n};\n"]}
|
|
@@ -11,14 +11,14 @@ export const ParallaxLayout = props => {
|
|
|
11
11
|
index,
|
|
12
12
|
width,
|
|
13
13
|
loop,
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
data,
|
|
15
|
+
children
|
|
16
16
|
} = props;
|
|
17
17
|
const x = useOffsetX({
|
|
18
18
|
handlerOffsetX,
|
|
19
19
|
index,
|
|
20
20
|
width,
|
|
21
|
-
|
|
21
|
+
data,
|
|
22
22
|
loop
|
|
23
23
|
});
|
|
24
24
|
const offsetXStyle = useAnimatedStyle(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["ParallaxLayout.tsx"],"names":["React","View","Animated","Extrapolate","interpolate","useAnimatedStyle","useOffsetX","ParallaxLayout","props","handlerOffsetX","parallaxScrollingOffset","parallaxScrollingScale","index","width","loop","
|
|
1
|
+
{"version":3,"sources":["ParallaxLayout.tsx"],"names":["React","View","Animated","Extrapolate","interpolate","useAnimatedStyle","useOffsetX","ParallaxLayout","props","handlerOffsetX","parallaxScrollingOffset","parallaxScrollingScale","index","width","loop","data","children","x","offsetXStyle","baseTranslateX","value","padding","extraOffset","zIndex","CLAMP","scale","relatedTranslateX","transform","translateX","height","alignSelf","flex"],"mappings":"AAAA;AACA,OAAOA,KAAP,MAAkB,OAAlB;AACA,SAASC,IAAT,QAAqB,cAArB;AACA,OAAOC,QAAP,IACIC,WADJ,EAEIC,WAFJ,EAGIC,gBAHJ,QAIO,yBAJP;AAKA,SAASC,UAAT,QAA2B,qBAA3B;AAEA,OAAO,MAAMC,cAQX,GAAIC,KAAD,IAAW;AACZ,QAAM;AACFC,IAAAA,cADE;AAEFC,IAAAA,uBAAuB,GAAG,GAFxB;AAGFC,IAAAA,sBAAsB,GAAG,GAHvB;AAIFC,IAAAA,KAJE;AAKFC,IAAAA,KALE;AAMFC,IAAAA,IANE;AAOFC,IAAAA,IAPE;AAQFC,IAAAA;AARE,MASFR,KATJ;AAWA,QAAMS,CAAC,GAAGX,UAAU,CAAC;AACjBG,IAAAA,cADiB;AAEjBG,IAAAA,KAFiB;AAGjBC,IAAAA,KAHiB;AAIjBE,IAAAA,IAJiB;AAKjBD,IAAAA;AALiB,GAAD,CAApB;AAQA,QAAMI,YAAY,GAAGb,gBAAgB,CAAC,MAAM;AACxC,UAAMc,cAAc,GAAGF,CAAC,CAACG,KAAF,GAAUR,KAAK,GAAGC,KAAzC;AACA,UAAMQ,OAAO,GAAG,CAAC,IAAIV,sBAAL,IAA+BE,KAA/C;AACA,UAAMS,WAAW,GAAGV,KAAK,GAAGS,OAAR,GAAkBA,OAAO,GAAG,CAAhD;AAEA,UAAME,MAAM,GAAGnB,WAAW,CACtBa,CAAC,CAACG,KADoB,EAEtB,CAAC,CAACP,KAAF,EAAS,CAAT,EAAYA,KAAZ,CAFsB,EAGtB,CAAC,CAAD,EAAIA,KAAJ,EAAW,CAAX,CAHsB,EAItBV,WAAW,CAACqB,KAJU,CAA1B;AAMA,UAAMC,KAAK,GAAGrB,WAAW,CACrBa,CAAC,CAACG,KADmB,EAErB,CAAC,CAACP,KAAF,EAAS,CAAT,EAAYA,KAAZ,CAFqB,EAGrB,CAACF,sBAAD,EAAyB,CAAzB,EAA4BA,sBAA5B,CAHqB,EAIrBR,WAAW,CAACqB,KAJS,CAAzB;AAMA,UAAME,iBAAiB,GAAGtB,WAAW,CACjCa,CAAC,CAACG,KAD+B,EAEjC,CAAC,CAACP,KAAF,EAAS,CAAT,EAAYA,KAAZ,CAFiC,EAGjC,CAACH,uBAAD,EAA0B,CAA1B,EAA6B,CAACA,uBAA9B,CAHiC,EAIjCP,WAAW,CAACqB,KAJqB,CAArC;AAMA,WAAO;AACHG,MAAAA,SAAS,EAAE,CACP;AACIC,QAAAA,UAAU,EACNT,cAAc,GAAGG,WAAjB,GAA+BI;AAFvC,OADO,EAKP;AAAED,QAAAA;AAAF,OALO,CADR;AAQHF,MAAAA;AARG,KAAP;AAUH,GAjCoC,EAiClC,CAACT,IAAD,CAjCkC,CAArC;AAmCA,sBACI,oBAAC,QAAD,CAAU,IAAV;AACI,IAAA,KAAK,EAAE,CACH;AACID,MAAAA,KAAK,EAAG,GAAEF,sBAAsB,GAAG,GAAI,GAD3C;AAEIkB,MAAAA,MAAM,EAAG,GAAElB,sBAAsB,GAAG,GAAI,GAF5C;AAGImB,MAAAA,SAAS,EAAE;AAHf,KADG,EAMHZ,YANG;AADX,kBAUI,oBAAC,IAAD;AAAM,IAAA,KAAK,EAAE;AAAEa,MAAAA,IAAI,EAAE;AAAR;AAAb,KAA2Bf,QAA3B,CAVJ,CADJ;AAcH,CA7EM","sourcesContent":["/* eslint-disable react-native/no-inline-styles */\nimport React from 'react';\nimport { View } from 'react-native';\nimport Animated, {\n Extrapolate,\n interpolate,\n useAnimatedStyle,\n} from 'react-native-reanimated';\nimport { useOffsetX } from '../hooks/useOffsetX';\n\nexport const ParallaxLayout: React.FC<{\n loop?: boolean;\n parallaxScrollingOffset?: number;\n parallaxScrollingScale?: number;\n handlerOffsetX: Animated.SharedValue<number>;\n index: number;\n width: number;\n data: unknown[];\n}> = (props) => {\n const {\n handlerOffsetX,\n parallaxScrollingOffset = 100,\n parallaxScrollingScale = 0.8,\n index,\n width,\n loop,\n data,\n children,\n } = props;\n\n const x = useOffsetX({\n handlerOffsetX,\n index,\n width,\n data,\n loop,\n });\n\n const offsetXStyle = useAnimatedStyle(() => {\n const baseTranslateX = x.value - index * width;\n const padding = (1 - parallaxScrollingScale) * width;\n const extraOffset = index * padding + padding / 2;\n\n const zIndex = interpolate(\n x.value,\n [-width, 0, width],\n [0, width, 0],\n Extrapolate.CLAMP\n );\n const scale = interpolate(\n x.value,\n [-width, 0, width],\n [parallaxScrollingScale, 1, parallaxScrollingScale],\n Extrapolate.CLAMP\n );\n const relatedTranslateX = interpolate(\n x.value,\n [-width, 0, width],\n [parallaxScrollingOffset, 0, -parallaxScrollingOffset],\n Extrapolate.CLAMP\n );\n return {\n transform: [\n {\n translateX:\n baseTranslateX + extraOffset + relatedTranslateX,\n },\n { scale },\n ],\n zIndex,\n };\n }, [loop]);\n\n return (\n <Animated.View\n style={[\n {\n width: `${parallaxScrollingScale * 100}%`,\n height: `${parallaxScrollingScale * 100}%`,\n alignSelf: 'center',\n },\n offsetXStyle,\n ]}\n >\n <View style={{ flex: 1 }}>{children}</View>\n </Animated.View>\n );\n};\n"]}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { FlexStyle } from 'react-native';
|
|
3
3
|
import Animated from 'react-native-reanimated';
|
|
4
|
-
import type { IComputedAnimResult } from './hooks/useComputedAnim';
|
|
5
4
|
export declare const CarouselItem: React.FC<{
|
|
6
5
|
loop?: boolean;
|
|
7
6
|
index: number;
|
|
8
7
|
handlerOffsetX: Animated.SharedValue<number>;
|
|
9
8
|
width: number;
|
|
9
|
+
data: unknown[];
|
|
10
10
|
height?: FlexStyle['height'];
|
|
11
|
-
computedAnimResult: IComputedAnimResult;
|
|
12
11
|
}>;
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import Animated from 'react-native-reanimated';
|
|
2
|
-
import type { IComputedAnimResult } from './useComputedAnim';
|
|
3
2
|
interface IOpts {
|
|
4
3
|
index: number;
|
|
5
4
|
width: number;
|
|
6
|
-
computedAnimResult: IComputedAnimResult;
|
|
7
5
|
handlerOffsetX: Animated.SharedValue<number>;
|
|
6
|
+
data: unknown[];
|
|
7
|
+
type?: 'positive' | 'negative';
|
|
8
|
+
viewCount?: number;
|
|
8
9
|
loop?: boolean;
|
|
9
10
|
}
|
|
10
11
|
export declare const useOffsetX: (opts: IOpts) => Readonly<Animated.SharedValue<number>>;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import Animated from 'react-native-reanimated';
|
|
3
|
-
import type { IComputedAnimResult } from 'src/hooks/useComputedAnim';
|
|
4
3
|
export declare const ParallaxLayout: React.FC<{
|
|
5
4
|
loop?: boolean;
|
|
6
5
|
parallaxScrollingOffset?: number;
|
|
@@ -8,5 +7,5 @@ export declare const ParallaxLayout: React.FC<{
|
|
|
8
7
|
handlerOffsetX: Animated.SharedValue<number>;
|
|
9
8
|
index: number;
|
|
10
9
|
width: number;
|
|
11
|
-
|
|
10
|
+
data: unknown[];
|
|
12
11
|
}>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-reanimated-carousel",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.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",
|
package/src/Carousel.tsx
CHANGED
|
@@ -18,7 +18,6 @@ import { CarouselItem } from './CarouselItem';
|
|
|
18
18
|
import type { TMode } from './layouts';
|
|
19
19
|
import { ParallaxLayout } from './layouts/index';
|
|
20
20
|
import { useCarouselController } from './hooks/useCarouselController';
|
|
21
|
-
import { useComputedAnim } from './hooks/useComputedAnim';
|
|
22
21
|
import { useAutoPlay } from './hooks/useAutoPlay';
|
|
23
22
|
import { useIndexController } from './hooks/useIndexController';
|
|
24
23
|
import { usePropsErrorBoundary } from './hooks/usePropsErrorBoundary';
|
|
@@ -204,8 +203,6 @@ function Carousel<T extends unknown = any>(
|
|
|
204
203
|
return _data;
|
|
205
204
|
}, [_data, loop]);
|
|
206
205
|
|
|
207
|
-
const computedAnimResult = useComputedAnim(width, data.length);
|
|
208
|
-
|
|
209
206
|
const indexController = useIndexController({
|
|
210
207
|
originalLength: _data.length,
|
|
211
208
|
length: data.length,
|
|
@@ -247,13 +244,14 @@ function Carousel<T extends unknown = any>(
|
|
|
247
244
|
}, [sharedPreIndex, sharedIndex, computedIndex, props, run]);
|
|
248
245
|
|
|
249
246
|
const offsetX = useDerivedValue(() => {
|
|
250
|
-
const
|
|
247
|
+
const totalWidth = width * data.length;
|
|
248
|
+
const x = handlerOffsetX.value % totalWidth;
|
|
251
249
|
|
|
252
250
|
if (!loop) {
|
|
253
251
|
return handlerOffsetX.value;
|
|
254
252
|
}
|
|
255
253
|
return isNaN(x) ? 0 : x;
|
|
256
|
-
}, [
|
|
254
|
+
}, [loop, width, data]);
|
|
257
255
|
|
|
258
256
|
useAnimatedReaction(
|
|
259
257
|
() => offsetX.value,
|
|
@@ -389,7 +387,7 @@ function Carousel<T extends unknown = any>(
|
|
|
389
387
|
<ParallaxLayout
|
|
390
388
|
parallaxScrollingOffset={parallaxScrollingOffset}
|
|
391
389
|
parallaxScrollingScale={parallaxScrollingScale}
|
|
392
|
-
|
|
390
|
+
data={data}
|
|
393
391
|
width={width}
|
|
394
392
|
handlerOffsetX={offsetX}
|
|
395
393
|
index={i}
|
|
@@ -402,7 +400,7 @@ function Carousel<T extends unknown = any>(
|
|
|
402
400
|
default:
|
|
403
401
|
return (
|
|
404
402
|
<CarouselItem
|
|
405
|
-
|
|
403
|
+
data={data}
|
|
406
404
|
width={width}
|
|
407
405
|
height={height}
|
|
408
406
|
handlerOffsetX={offsetX}
|
|
@@ -418,7 +416,7 @@ function Carousel<T extends unknown = any>(
|
|
|
418
416
|
[
|
|
419
417
|
loop,
|
|
420
418
|
mode,
|
|
421
|
-
|
|
419
|
+
data,
|
|
422
420
|
height,
|
|
423
421
|
offsetX,
|
|
424
422
|
parallaxScrollingOffset,
|
package/src/CarouselItem.tsx
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { FlexStyle, View } from 'react-native';
|
|
3
3
|
import Animated, { useAnimatedStyle } from 'react-native-reanimated';
|
|
4
|
-
import type { IComputedAnimResult } from './hooks/useComputedAnim';
|
|
5
4
|
import { useOffsetX } from './hooks/useOffsetX';
|
|
6
5
|
|
|
7
6
|
export const CarouselItem: React.FC<{
|
|
@@ -9,8 +8,8 @@ export const CarouselItem: React.FC<{
|
|
|
9
8
|
index: number;
|
|
10
9
|
handlerOffsetX: Animated.SharedValue<number>;
|
|
11
10
|
width: number;
|
|
11
|
+
data: unknown[];
|
|
12
12
|
height?: FlexStyle['height'];
|
|
13
|
-
computedAnimResult: IComputedAnimResult;
|
|
14
13
|
}> = (props) => {
|
|
15
14
|
const {
|
|
16
15
|
handlerOffsetX,
|
|
@@ -18,16 +17,18 @@ export const CarouselItem: React.FC<{
|
|
|
18
17
|
children,
|
|
19
18
|
width,
|
|
20
19
|
height = '100%',
|
|
21
|
-
computedAnimResult,
|
|
22
20
|
loop,
|
|
21
|
+
data,
|
|
23
22
|
} = props;
|
|
23
|
+
|
|
24
24
|
const x = useOffsetX({
|
|
25
25
|
handlerOffsetX,
|
|
26
26
|
index,
|
|
27
27
|
width,
|
|
28
|
-
|
|
28
|
+
data,
|
|
29
29
|
loop,
|
|
30
30
|
});
|
|
31
|
+
|
|
31
32
|
const offsetXStyle = useAnimatedStyle(() => {
|
|
32
33
|
return {
|
|
33
34
|
transform: [{ translateX: x.value - index * width }],
|
package/src/hooks/useOffsetX.ts
CHANGED
|
@@ -3,33 +3,73 @@ import Animated, {
|
|
|
3
3
|
interpolate,
|
|
4
4
|
useDerivedValue,
|
|
5
5
|
} from 'react-native-reanimated';
|
|
6
|
-
import type { IComputedAnimResult } from './useComputedAnim';
|
|
7
6
|
|
|
8
7
|
interface IOpts {
|
|
9
8
|
index: number;
|
|
10
9
|
width: number;
|
|
11
|
-
computedAnimResult: IComputedAnimResult;
|
|
12
10
|
handlerOffsetX: Animated.SharedValue<number>;
|
|
11
|
+
data: unknown[];
|
|
12
|
+
type?: 'positive' | 'negative';
|
|
13
|
+
viewCount?: number;
|
|
13
14
|
loop?: boolean;
|
|
14
15
|
}
|
|
15
16
|
|
|
16
17
|
export const useOffsetX = (opts: IOpts) => {
|
|
17
|
-
const {
|
|
18
|
+
const {
|
|
19
|
+
handlerOffsetX,
|
|
20
|
+
index,
|
|
21
|
+
width,
|
|
22
|
+
loop,
|
|
23
|
+
data,
|
|
24
|
+
type = 'positive',
|
|
25
|
+
viewCount = Math.round((data.length - 1) / 2),
|
|
26
|
+
} = opts;
|
|
27
|
+
const ITEM_LENGTH = data.length;
|
|
28
|
+
const VALID_LENGTH = ITEM_LENGTH - 1;
|
|
29
|
+
const TOTAL_WIDTH = width * ITEM_LENGTH;
|
|
30
|
+
const HALF_WIDTH = 0.5 * width;
|
|
31
|
+
|
|
18
32
|
const x = useDerivedValue(() => {
|
|
19
|
-
const
|
|
33
|
+
const defaultPos = width * index;
|
|
20
34
|
if (loop) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
35
|
+
function getDefaultPos(
|
|
36
|
+
_type: 'positive' | 'negative',
|
|
37
|
+
_count: number
|
|
38
|
+
): {
|
|
39
|
+
MAX: number;
|
|
40
|
+
MIN: number;
|
|
41
|
+
startPos: number;
|
|
42
|
+
} {
|
|
43
|
+
let MAX = null;
|
|
44
|
+
let MIN = null;
|
|
45
|
+
|
|
46
|
+
let startPos: number = defaultPos;
|
|
47
|
+
|
|
48
|
+
if (_type === 'positive') {
|
|
49
|
+
MAX = _count * width;
|
|
50
|
+
MIN = -(VALID_LENGTH - _count) * width;
|
|
51
|
+
} else {
|
|
52
|
+
MAX = (VALID_LENGTH - _count) * width;
|
|
53
|
+
MIN = -_count * width;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (defaultPos > MAX) {
|
|
57
|
+
startPos = MAX - defaultPos;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return {
|
|
61
|
+
startPos,
|
|
62
|
+
MAX,
|
|
63
|
+
MIN,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const { startPos, MAX, MIN } = getDefaultPos(type, viewCount);
|
|
28
68
|
|
|
29
69
|
const inputRange = [
|
|
30
70
|
-TOTAL_WIDTH,
|
|
31
|
-
-
|
|
32
|
-
-
|
|
71
|
+
MIN - HALF_WIDTH - startPos - 1,
|
|
72
|
+
MIN - HALF_WIDTH - startPos,
|
|
33
73
|
0,
|
|
34
74
|
MAX + HALF_WIDTH - startPos,
|
|
35
75
|
MAX + HALF_WIDTH - startPos + 1,
|
|
@@ -38,11 +78,11 @@ export const useOffsetX = (opts: IOpts) => {
|
|
|
38
78
|
|
|
39
79
|
const outputRange = [
|
|
40
80
|
startPos,
|
|
41
|
-
|
|
42
|
-
-
|
|
81
|
+
MAX + HALF_WIDTH - 1,
|
|
82
|
+
MIN - HALF_WIDTH,
|
|
43
83
|
startPos,
|
|
44
84
|
MAX + HALF_WIDTH,
|
|
45
|
-
-
|
|
85
|
+
MIN - HALF_WIDTH + 1,
|
|
46
86
|
startPos,
|
|
47
87
|
];
|
|
48
88
|
|
|
@@ -54,8 +94,8 @@ export const useOffsetX = (opts: IOpts) => {
|
|
|
54
94
|
);
|
|
55
95
|
}
|
|
56
96
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
97
|
+
return handlerOffsetX.value + defaultPos;
|
|
98
|
+
}, [loop, data, viewCount, type]);
|
|
99
|
+
|
|
60
100
|
return x;
|
|
61
101
|
};
|
|
@@ -6,7 +6,6 @@ import Animated, {
|
|
|
6
6
|
interpolate,
|
|
7
7
|
useAnimatedStyle,
|
|
8
8
|
} from 'react-native-reanimated';
|
|
9
|
-
import type { IComputedAnimResult } from 'src/hooks/useComputedAnim';
|
|
10
9
|
import { useOffsetX } from '../hooks/useOffsetX';
|
|
11
10
|
|
|
12
11
|
export const ParallaxLayout: React.FC<{
|
|
@@ -16,7 +15,7 @@ export const ParallaxLayout: React.FC<{
|
|
|
16
15
|
handlerOffsetX: Animated.SharedValue<number>;
|
|
17
16
|
index: number;
|
|
18
17
|
width: number;
|
|
19
|
-
|
|
18
|
+
data: unknown[];
|
|
20
19
|
}> = (props) => {
|
|
21
20
|
const {
|
|
22
21
|
handlerOffsetX,
|
|
@@ -25,15 +24,15 @@ export const ParallaxLayout: React.FC<{
|
|
|
25
24
|
index,
|
|
26
25
|
width,
|
|
27
26
|
loop,
|
|
27
|
+
data,
|
|
28
28
|
children,
|
|
29
|
-
computedAnimResult,
|
|
30
29
|
} = props;
|
|
31
30
|
|
|
32
31
|
const x = useOffsetX({
|
|
33
32
|
handlerOffsetX,
|
|
34
33
|
index,
|
|
35
34
|
width,
|
|
36
|
-
|
|
35
|
+
data,
|
|
37
36
|
loop,
|
|
38
37
|
});
|
|
39
38
|
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.useComputedAnim = useComputedAnim;
|
|
7
|
-
|
|
8
|
-
function useComputedAnim(width, ITEM_LENGTH) {
|
|
9
|
-
const MAX = (ITEM_LENGTH - 2) * width;
|
|
10
|
-
const MIN = -MAX;
|
|
11
|
-
const TOTAL_WIDTH = width * ITEM_LENGTH;
|
|
12
|
-
const HALF_WIDTH = 0.5 * width;
|
|
13
|
-
return {
|
|
14
|
-
MAX,
|
|
15
|
-
MIN,
|
|
16
|
-
TOTAL_WIDTH,
|
|
17
|
-
HALF_WIDTH
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
//# sourceMappingURL=useComputedAnim.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["useComputedAnim.ts"],"names":["useComputedAnim","width","ITEM_LENGTH","MAX","MIN","TOTAL_WIDTH","HALF_WIDTH"],"mappings":";;;;;;;AAOO,SAASA,eAAT,CACHC,KADG,EAEHC,WAFG,EAGgB;AACnB,QAAMC,GAAG,GAAG,CAACD,WAAW,GAAG,CAAf,IAAoBD,KAAhC;AACA,QAAMG,GAAG,GAAG,CAACD,GAAb;AACA,QAAME,WAAW,GAAGJ,KAAK,GAAGC,WAA5B;AACA,QAAMI,UAAU,GAAG,MAAML,KAAzB;AAEA,SAAO;AACHE,IAAAA,GADG;AAEHC,IAAAA,GAFG;AAGHC,IAAAA,WAHG;AAIHC,IAAAA;AAJG,GAAP;AAMH","sourcesContent":["export interface IComputedAnimResult {\n MAX: number;\n MIN: number;\n TOTAL_WIDTH: number;\n HALF_WIDTH: number;\n}\n\nexport function useComputedAnim(\n width: number,\n ITEM_LENGTH: number\n): IComputedAnimResult {\n const MAX = (ITEM_LENGTH - 2) * width;\n const MIN = -MAX;\n const TOTAL_WIDTH = width * ITEM_LENGTH;\n const HALF_WIDTH = 0.5 * width;\n\n return {\n MAX,\n MIN,\n TOTAL_WIDTH,\n HALF_WIDTH,\n };\n}\n"]}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export function useComputedAnim(width, ITEM_LENGTH) {
|
|
2
|
-
const MAX = (ITEM_LENGTH - 2) * width;
|
|
3
|
-
const MIN = -MAX;
|
|
4
|
-
const TOTAL_WIDTH = width * ITEM_LENGTH;
|
|
5
|
-
const HALF_WIDTH = 0.5 * width;
|
|
6
|
-
return {
|
|
7
|
-
MAX,
|
|
8
|
-
MIN,
|
|
9
|
-
TOTAL_WIDTH,
|
|
10
|
-
HALF_WIDTH
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
//# sourceMappingURL=useComputedAnim.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["useComputedAnim.ts"],"names":["useComputedAnim","width","ITEM_LENGTH","MAX","MIN","TOTAL_WIDTH","HALF_WIDTH"],"mappings":"AAOA,OAAO,SAASA,eAAT,CACHC,KADG,EAEHC,WAFG,EAGgB;AACnB,QAAMC,GAAG,GAAG,CAACD,WAAW,GAAG,CAAf,IAAoBD,KAAhC;AACA,QAAMG,GAAG,GAAG,CAACD,GAAb;AACA,QAAME,WAAW,GAAGJ,KAAK,GAAGC,WAA5B;AACA,QAAMI,UAAU,GAAG,MAAML,KAAzB;AAEA,SAAO;AACHE,IAAAA,GADG;AAEHC,IAAAA,GAFG;AAGHC,IAAAA,WAHG;AAIHC,IAAAA;AAJG,GAAP;AAMH","sourcesContent":["export interface IComputedAnimResult {\n MAX: number;\n MIN: number;\n TOTAL_WIDTH: number;\n HALF_WIDTH: number;\n}\n\nexport function useComputedAnim(\n width: number,\n ITEM_LENGTH: number\n): IComputedAnimResult {\n const MAX = (ITEM_LENGTH - 2) * width;\n const MIN = -MAX;\n const TOTAL_WIDTH = width * ITEM_LENGTH;\n const HALF_WIDTH = 0.5 * width;\n\n return {\n MAX,\n MIN,\n TOTAL_WIDTH,\n HALF_WIDTH,\n };\n}\n"]}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
export interface IComputedAnimResult {
|
|
2
|
-
MAX: number;
|
|
3
|
-
MIN: number;
|
|
4
|
-
TOTAL_WIDTH: number;
|
|
5
|
-
HALF_WIDTH: number;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export function useComputedAnim(
|
|
9
|
-
width: number,
|
|
10
|
-
ITEM_LENGTH: number
|
|
11
|
-
): IComputedAnimResult {
|
|
12
|
-
const MAX = (ITEM_LENGTH - 2) * width;
|
|
13
|
-
const MIN = -MAX;
|
|
14
|
-
const TOTAL_WIDTH = width * ITEM_LENGTH;
|
|
15
|
-
const HALF_WIDTH = 0.5 * width;
|
|
16
|
-
|
|
17
|
-
return {
|
|
18
|
-
MAX,
|
|
19
|
-
MIN,
|
|
20
|
-
TOTAL_WIDTH,
|
|
21
|
-
HALF_WIDTH,
|
|
22
|
-
};
|
|
23
|
-
}
|