react-native-reanimated-carousel 4.0.0-alpha.1 → 4.0.0-alpha.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -3
- package/lib/commonjs/{layouts → components}/BaseLayout.js +5 -21
- package/lib/commonjs/components/BaseLayout.js.map +1 -0
- package/lib/commonjs/components/Carousel.js +28 -48
- package/lib/commonjs/components/Carousel.js.map +1 -1
- package/lib/commonjs/components/ItemRenderer.js +80 -0
- package/lib/commonjs/components/ItemRenderer.js.map +1 -0
- package/lib/commonjs/components/Pagination/Basic/PaginationItem.js +81 -0
- package/lib/commonjs/components/Pagination/Basic/PaginationItem.js.map +1 -0
- package/lib/commonjs/components/Pagination/Basic/index.js +57 -0
- package/lib/commonjs/components/Pagination/Basic/index.js.map +1 -0
- package/lib/commonjs/components/Pagination/index.js +14 -0
- package/lib/commonjs/components/Pagination/index.js.map +1 -0
- package/lib/commonjs/components/ScrollViewGesture.js +51 -33
- package/lib/commonjs/components/ScrollViewGesture.js.map +1 -1
- package/lib/commonjs/components/rnr-demo.test.js +45 -0
- package/lib/commonjs/components/rnr-demo.test.js.map +1 -0
- package/lib/commonjs/hooks/useCarouselController.js +12 -11
- package/lib/commonjs/hooks/useCarouselController.js.map +1 -1
- package/lib/commonjs/hooks/useCommonVariables.js +38 -12
- package/lib/commonjs/hooks/useCommonVariables.js.map +1 -1
- package/lib/commonjs/hooks/useCommonVariables.test.js +38 -0
- package/lib/commonjs/hooks/useCommonVariables.test.js.map +1 -0
- package/lib/commonjs/hooks/useLayoutConfig.js.map +1 -1
- package/lib/commonjs/hooks/useOffsetX.js +9 -6
- package/lib/commonjs/hooks/useOffsetX.js.map +1 -1
- package/lib/commonjs/hooks/useOffsetX.test.js +53 -0
- package/lib/commonjs/hooks/useOffsetX.test.js.map +1 -0
- package/lib/commonjs/hooks/useOnProgressChange.js +4 -1
- package/lib/commonjs/hooks/useOnProgressChange.js.map +1 -1
- package/lib/commonjs/hooks/usePanGestureProxy.js +84 -0
- package/lib/commonjs/hooks/usePanGestureProxy.js.map +1 -0
- package/lib/commonjs/hooks/usePanGestureProxy.test.js +397 -0
- package/lib/commonjs/hooks/usePanGestureProxy.test.js.map +1 -0
- package/lib/commonjs/hooks/useUpdateGestureConfig.js.map +1 -1
- package/lib/commonjs/hooks/useVisibleRanges.js +48 -19
- package/lib/commonjs/hooks/useVisibleRanges.js.map +1 -1
- package/lib/commonjs/hooks/useVisibleRanges.test.js +162 -0
- package/lib/commonjs/hooks/useVisibleRanges.test.js.map +1 -0
- package/lib/commonjs/index.js +8 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/utils/{computeNewIndexWhenDataChanges.js → compute-offset-if-data-changed.js} +3 -3
- package/lib/commonjs/utils/compute-offset-if-data-changed.js.map +1 -0
- package/lib/commonjs/utils/compute-offset-if-data-changed.test.js +30 -0
- package/lib/commonjs/utils/compute-offset-if-data-changed.test.js.map +1 -0
- package/lib/commonjs/utils/compute-offset-if-size-changed.js +18 -0
- package/lib/commonjs/utils/compute-offset-if-size-changed.js.map +1 -0
- package/lib/commonjs/utils/compute-offset-if-size-changed.test.js +72 -0
- package/lib/commonjs/utils/compute-offset-if-size-changed.test.js.map +1 -0
- package/lib/commonjs/utils/handleroffset-direction.js +5 -5
- package/lib/commonjs/utils/handleroffset-direction.js.map +1 -1
- package/lib/commonjs/utils/handleroffset-direction.test.js +46 -0
- package/lib/commonjs/utils/handleroffset-direction.test.js.map +1 -0
- package/lib/commonjs/utils/index.test.js +6 -6
- package/lib/commonjs/utils/index.test.js.map +1 -1
- package/lib/module/{layouts → components}/BaseLayout.js +6 -16
- package/lib/module/components/BaseLayout.js.map +1 -0
- package/lib/module/components/Carousel.js +27 -44
- package/lib/module/components/Carousel.js.map +1 -1
- package/lib/module/components/ItemRenderer.js +62 -0
- package/lib/module/components/ItemRenderer.js.map +1 -0
- package/lib/module/components/Pagination/Basic/PaginationItem.js +63 -0
- package/lib/module/components/Pagination/Basic/PaginationItem.js.map +1 -0
- package/lib/module/components/Pagination/Basic/index.js +42 -0
- package/lib/module/components/Pagination/Basic/index.js.map +1 -0
- package/lib/module/components/Pagination/index.js +5 -0
- package/lib/module/components/Pagination/index.js.map +1 -0
- package/lib/module/components/ScrollViewGesture.js +53 -34
- package/lib/module/components/ScrollViewGesture.js.map +1 -1
- package/lib/module/components/rnr-demo.test.js +33 -0
- package/lib/module/components/rnr-demo.test.js.map +1 -0
- package/lib/module/hooks/useCarouselController.js +12 -11
- package/lib/module/hooks/useCarouselController.js.map +1 -1
- package/lib/module/hooks/useCommonVariables.js +38 -8
- package/lib/module/hooks/useCommonVariables.js.map +1 -1
- package/lib/module/hooks/useCommonVariables.test.js +34 -0
- package/lib/module/hooks/useCommonVariables.test.js.map +1 -0
- package/lib/module/hooks/useLayoutConfig.js.map +1 -1
- package/lib/module/hooks/useOffsetX.js +9 -6
- package/lib/module/hooks/useOffsetX.js.map +1 -1
- package/lib/module/hooks/useOffsetX.test.js +48 -0
- package/lib/module/hooks/useOffsetX.test.js.map +1 -0
- package/lib/module/hooks/useOnProgressChange.js +4 -1
- package/lib/module/hooks/useOnProgressChange.js.map +1 -1
- package/lib/module/hooks/usePanGestureProxy.js +71 -0
- package/lib/module/hooks/usePanGestureProxy.js.map +1 -0
- package/lib/module/hooks/usePanGestureProxy.test.js +383 -0
- package/lib/module/hooks/usePanGestureProxy.test.js.map +1 -0
- package/lib/module/hooks/useUpdateGestureConfig.js.map +1 -1
- package/lib/module/hooks/useVisibleRanges.js +47 -19
- package/lib/module/hooks/useVisibleRanges.js.map +1 -1
- package/lib/module/hooks/useVisibleRanges.test.js +157 -0
- package/lib/module/hooks/useVisibleRanges.test.js.map +1 -0
- package/lib/module/index.js +1 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/utils/{computeNewIndexWhenDataChanges.js → compute-offset-if-data-changed.js} +2 -2
- package/lib/module/utils/compute-offset-if-data-changed.js.map +1 -0
- package/lib/module/utils/compute-offset-if-data-changed.test.js +27 -0
- package/lib/module/utils/compute-offset-if-data-changed.test.js.map +1 -0
- package/lib/module/utils/compute-offset-if-size-changed.js +11 -0
- package/lib/module/utils/compute-offset-if-size-changed.js.map +1 -0
- package/lib/module/utils/compute-offset-if-size-changed.test.js +69 -0
- package/lib/module/utils/compute-offset-if-size-changed.test.js.map +1 -0
- package/lib/module/utils/handleroffset-direction.js +5 -5
- package/lib/module/utils/handleroffset-direction.js.map +1 -1
- package/lib/module/utils/handleroffset-direction.test.js +41 -0
- package/lib/module/utils/handleroffset-direction.test.js.map +1 -0
- package/lib/module/utils/index.test.js +6 -6
- package/lib/module/utils/index.test.js.map +1 -1
- package/lib/typescript/components/ItemRenderer.d.ts +22 -0
- package/lib/typescript/components/Pagination/Basic/PaginationItem.d.ts +17 -0
- package/lib/typescript/components/Pagination/Basic/index.d.ts +16 -0
- package/lib/typescript/components/Pagination/index.d.ts +3 -0
- package/lib/typescript/components/ScrollViewGesture.d.ts +1 -1
- package/lib/typescript/components/rnr-demo.test.d.ts +1 -0
- package/lib/typescript/hooks/useCarouselController.d.ts +3 -2
- package/lib/typescript/hooks/useCommonVariables.test.d.ts +1 -0
- package/lib/typescript/hooks/useLayoutConfig.d.ts +1 -1
- package/lib/typescript/hooks/useOffsetX.test.d.ts +1 -0
- package/lib/typescript/hooks/usePanGestureProxy.d.ts +9 -0
- package/lib/typescript/hooks/usePanGestureProxy.test.d.ts +1 -0
- package/lib/typescript/hooks/useUpdateGestureConfig.d.ts +3 -2
- package/lib/typescript/hooks/useVisibleRanges.d.ts +8 -4
- package/lib/typescript/hooks/useVisibleRanges.test.d.ts +1 -0
- package/lib/typescript/index.d.ts +2 -0
- package/lib/typescript/types.d.ts +27 -16
- package/lib/typescript/utils/{computeNewIndexWhenDataChanges.d.ts → compute-offset-if-data-changed.d.ts} +1 -1
- package/lib/typescript/utils/compute-offset-if-data-changed.test.d.ts +1 -0
- package/lib/typescript/utils/compute-offset-if-size-changed.d.ts +5 -0
- package/lib/typescript/utils/compute-offset-if-size-changed.test.d.ts +1 -0
- package/lib/typescript/utils/handleroffset-direction.d.ts +2 -1
- package/lib/typescript/utils/handleroffset-direction.test.d.ts +1 -0
- package/package.json +18 -60
- package/src/{layouts → components}/BaseLayout.tsx +7 -35
- package/src/components/Carousel.tsx +33 -71
- package/src/components/ItemRenderer.tsx +105 -0
- package/src/components/Pagination/Basic/PaginationItem.tsx +111 -0
- package/src/components/Pagination/Basic/index.tsx +81 -0
- package/src/components/Pagination/index.tsx +5 -0
- package/src/components/ScrollViewGesture.tsx +74 -49
- package/src/components/rnr-demo.test.tsx +43 -0
- package/src/hooks/useCarouselController.tsx +24 -21
- package/src/hooks/useCommonVariables.test.tsx +41 -0
- package/src/hooks/useCommonVariables.ts +35 -10
- package/src/hooks/useLayoutConfig.ts +1 -1
- package/src/hooks/useOffsetX.test.ts +54 -0
- package/src/hooks/useOffsetX.ts +33 -31
- package/src/hooks/useOnProgressChange.ts +7 -2
- package/src/hooks/usePanGestureProxy.test.tsx +376 -0
- package/src/hooks/usePanGestureProxy.ts +110 -0
- package/src/hooks/useUpdateGestureConfig.ts +4 -2
- package/src/hooks/useVisibleRanges.test.tsx +179 -0
- package/src/hooks/useVisibleRanges.tsx +72 -24
- package/src/index.tsx +3 -0
- package/src/types.ts +28 -17
- package/src/utils/compute-offset-if-data-changed.test.ts +30 -0
- package/src/utils/{computeNewIndexWhenDataChanges.ts → compute-offset-if-data-changed.ts} +1 -1
- package/src/utils/compute-offset-if-size-changed.test.ts +78 -0
- package/src/utils/compute-offset-if-size-changed.ts +11 -0
- package/src/utils/handleroffset-direction.test.ts +52 -0
- package/src/utils/handleroffset-direction.ts +12 -9
- package/src/utils/index.test.ts +6 -6
- package/lib/commonjs/layouts/BaseLayout.js.map +0 -1
- package/lib/commonjs/layouts/ParallaxLayout.js +0 -84
- package/lib/commonjs/layouts/ParallaxLayout.js.map +0 -1
- package/lib/commonjs/utils/computeNewIndexWhenDataChanges.js.map +0 -1
- package/lib/module/layouts/BaseLayout.js.map +0 -1
- package/lib/module/layouts/ParallaxLayout.js +0 -61
- package/lib/module/layouts/ParallaxLayout.js.map +0 -1
- package/lib/module/utils/computeNewIndexWhenDataChanges.js.map +0 -1
- package/lib/typescript/layouts/ParallaxLayout.d.ts +0 -13
- package/src/layouts/ParallaxLayout.tsx +0 -141
- /package/lib/typescript/{layouts → components}/BaseLayout.d.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["ScrollViewGesture.tsx"],"names":["React","useCallback","useMemo","Gesture","GestureDetector","Animated","cancelAnimation","measure","runOnJS","useAnimatedReaction","useAnimatedRef","useDerivedValue","useSharedValue","withDecay","Easing","useUpdateGestureConfig","CTX","dealWithAnimation","IScrollViewGesture","props","onConfigurePanGesture","vertical","pagingEnabled","snapEnabled","loop","infinite","scrollAnimationDuration","withAnimation","enabled","dataLength","overscrollEnabled","maxScrollDistancePerSwipe","useContext","size","translation","testID","style","onScrollBegin","onScrollEnd","onTouchBegin","onTouchEnd","maxPage","isHorizontal","max","panOffset","touching","validStart","scrollEndTranslation","scrollEndVelocity","containerRef","maxScrollDistancePerSwipeIsSet","getLimit","width","containerWidth","withSpring","toValue","onFinished","defaultWithAnimation","type","config","duration","easing","easeOutQuart","isFinished","endWithSpring","origin","value","velocity","finalTranslation","deceleration","Math","abs","offset","computed","ceil","floor","page","finalPage","withProcessTranslation","min","nextPage","round","limit","sign","onFinish","activeDecay","resetBoundary","onGestureBegin","onGestureUpdate","e","translationX","translationY","panTranslation","boundary","fixed","dynamic","translationValue","onGestureFinish","velocityX","velocityY","totalTranslation","gesture","Pan","onBegin","onUpdate","onEnd","children","ScrollViewGesture"],"mappings":"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","sourcesContent":["import type { PropsWithChildren } from \"react\";\nimport React, { useCallback, useMemo } from \"react\";\nimport type { StyleProp, ViewStyle } from \"react-native\";\nimport type { GestureStateChangeEvent, PanGestureHandlerEventPayload } from \"react-native-gesture-handler\";\nimport {\n Gesture,\n GestureDetector,\n} from \"react-native-gesture-handler\";\nimport Animated, {\n cancelAnimation,\n measure,\n runOnJS,\n useAnimatedReaction,\n useAnimatedRef,\n useDerivedValue,\n useSharedValue,\n withDecay,\n} from \"react-native-reanimated\";\n\nimport { Easing } from \"../constants\";\nimport { useUpdateGestureConfig } from \"../hooks/useUpdateGestureConfig\";\nimport { CTX } from \"../store\";\nimport type { WithTimingAnimation } from \"../types\";\nimport { dealWithAnimation } from \"../utils/deal-with-animation\";\n\ninterface Props {\n size: number\n infinite?: boolean\n testID?: string\n style?: StyleProp<ViewStyle>\n onScrollBegin?: () => void\n onScrollEnd?: () => void\n onTouchBegin?: () => void\n onTouchEnd?: () => void\n translation: Animated.SharedValue<number>\n}\n\nconst IScrollViewGesture: React.FC<PropsWithChildren<Props>> = (props) => {\n const {\n props: {\n onConfigurePanGesture,\n vertical,\n pagingEnabled,\n snapEnabled,\n loop: infinite,\n scrollAnimationDuration,\n withAnimation,\n enabled,\n dataLength,\n overscrollEnabled,\n maxScrollDistancePerSwipe,\n },\n } = React.useContext(CTX);\n\n const {\n size,\n translation,\n testID,\n style = {},\n onScrollBegin,\n onScrollEnd,\n onTouchBegin,\n onTouchEnd,\n } = props;\n\n const maxPage = dataLength;\n const isHorizontal = useDerivedValue(() => !vertical, [vertical]);\n const max = useSharedValue(0);\n const panOffset = useSharedValue(0);\n const touching = useSharedValue(false);\n const validStart = useSharedValue(false);\n const scrollEndTranslation = useSharedValue(0);\n const scrollEndVelocity = useSharedValue(0);\n const containerRef = useAnimatedRef<Animated.View>();\n const maxScrollDistancePerSwipeIsSet = typeof maxScrollDistancePerSwipe === \"number\";\n\n // Get the limit of the scroll.\n const getLimit = React.useCallback(() => {\n \"worklet\";\n\n if (!infinite && !overscrollEnabled) {\n const { width: containerWidth = 0 } = measure(containerRef);\n\n // If the item's total width is less than the container's width, then there is no need to scroll.\n if (dataLength * size < containerWidth)\n return 0;\n\n // Disable the \"overscroll\" effect\n return dataLength * size - containerWidth;\n }\n\n return dataLength * size;\n }, [infinite, size, dataLength, overscrollEnabled]);\n\n const withSpring = React.useCallback(\n (toValue: number, onFinished?: () => void) => {\n \"worklet\";\n const defaultWithAnimation: WithTimingAnimation = {\n type: \"timing\",\n config: {\n duration: scrollAnimationDuration + 100,\n easing: Easing.easeOutQuart,\n },\n };\n\n return dealWithAnimation(withAnimation ?? defaultWithAnimation)(\n toValue,\n (isFinished: boolean) => {\n \"worklet\";\n if (isFinished)\n onFinished && runOnJS(onFinished)();\n },\n );\n },\n [scrollAnimationDuration, withAnimation],\n );\n\n const endWithSpring = React.useCallback(\n (onFinished?: () => void) => {\n \"worklet\";\n const origin = translation.value;\n const velocity = scrollEndVelocity.value;\n // Default to scroll in the direction of the slide (with deceleration)\n let finalTranslation: number = withDecay({ velocity, deceleration: 0.999 });\n\n // If the distance of the swipe exceeds the max scroll distance, keep the view at the current position\n if (maxScrollDistancePerSwipeIsSet && Math.abs(scrollEndTranslation.value) > maxScrollDistancePerSwipe) {\n finalTranslation = origin;\n }\n else {\n /**\n * The page size is the same as the item size.\n * If direction is vertical, the page size is the height of the item.\n * If direction is horizontal, the page size is the width of the item.\n *\n * `page size` equals to `size` variable.\n * */\n if (pagingEnabled) {\n // distance with direction\n const offset = -(scrollEndTranslation.value >= 0 ? 1 : -1); // 1 or -1\n const computed = offset < 0 ? Math.ceil : Math.floor;\n const page = computed(-translation.value / size);\n\n if (infinite) {\n const finalPage = page + offset;\n finalTranslation = withSpring(withProcessTranslation(-finalPage * size), onFinished);\n }\n else {\n const finalPage = Math.min(maxPage - 1, Math.max(0, page + offset));\n finalTranslation = withSpring(withProcessTranslation(-finalPage * size), onFinished);\n }\n }\n\n if (!pagingEnabled && snapEnabled) {\n // scroll to the nearest item\n const nextPage = Math.round((origin + velocity * 0.4) / size) * size;\n finalTranslation = withSpring(withProcessTranslation(nextPage), onFinished);\n }\n }\n\n translation.value = finalTranslation;\n\n function withProcessTranslation(translation: number) {\n if (!infinite && !overscrollEnabled) {\n const limit = getLimit();\n const sign = Math.sign(translation);\n return sign * Math.max(0, Math.min(limit, Math.abs(translation)));\n }\n\n return translation;\n }\n },\n [\n withSpring,\n size,\n maxPage,\n infinite,\n snapEnabled,\n translation,\n pagingEnabled,\n scrollEndVelocity.value,\n maxScrollDistancePerSwipe,\n scrollEndTranslation.value,\n maxScrollDistancePerSwipeIsSet,\n ],\n );\n\n const onFinish = React.useCallback(\n (isFinished: boolean) => {\n \"worklet\";\n if (isFinished) {\n touching.value = false;\n onScrollEnd && runOnJS(onScrollEnd)();\n }\n },\n [onScrollEnd, touching],\n );\n\n const activeDecay = React.useCallback(() => {\n \"worklet\";\n touching.value = true;\n translation.value = withDecay(\n { velocity: scrollEndVelocity.value },\n isFinished => onFinish(isFinished as boolean),\n );\n }, [onFinish, scrollEndVelocity.value, touching, translation]);\n\n const resetBoundary = React.useCallback(() => {\n \"worklet\";\n if (touching.value)\n return;\n\n if (translation.value > 0) {\n if (scrollEndTranslation.value < 0) {\n activeDecay();\n return;\n }\n if (!infinite) {\n translation.value = withSpring(0);\n return;\n }\n }\n\n if (translation.value < -((maxPage - 1) * size)) {\n if (scrollEndTranslation.value > 0) {\n activeDecay();\n return;\n }\n if (!infinite)\n translation.value = withSpring(-((maxPage - 1) * size));\n }\n }, [\n touching.value,\n translation,\n maxPage,\n size,\n scrollEndTranslation.value,\n infinite,\n activeDecay,\n withSpring,\n ]);\n\n useAnimatedReaction(\n () => translation.value,\n () => {\n if (!pagingEnabled)\n resetBoundary();\n },\n [pagingEnabled, resetBoundary],\n );\n\n function withProcessTranslation(translation: number) {\n \"worklet\";\n\n if (!infinite && !overscrollEnabled) {\n const limit = getLimit();\n const sign = Math.sign(translation);\n return sign * Math.max(0, Math.min(limit, Math.abs(translation)));\n }\n\n return translation;\n }\n\n const onGestureBegin = useCallback(() => {\n \"worklet\";\n\n touching.value = true;\n validStart.value = true;\n onScrollBegin && runOnJS(onScrollBegin)();\n\n max.value = (maxPage - 1) * size;\n if (!infinite && !overscrollEnabled)\n max.value = getLimit();\n\n panOffset.value = translation.value;\n }, [\n max,\n size,\n maxPage,\n infinite,\n touching,\n panOffset,\n validStart,\n translation,\n overscrollEnabled,\n getLimit,\n onScrollBegin,\n ]);\n\n const onGestureUpdate = useCallback((e: PanGestureHandlerEventPayload) => {\n \"worklet\";\n\n if (validStart.value) {\n validStart.value = false;\n cancelAnimation(translation);\n }\n touching.value = true;\n const { translationX, translationY } = e;\n const panTranslation = isHorizontal.value\n ? translationX\n : translationY;\n if (!infinite) {\n if ((translation.value > 0 || translation.value < -max.value)) {\n const boundary = translation.value > 0 ? 0 : -max.value;\n const fixed = boundary - panOffset.value;\n const dynamic = panTranslation - fixed;\n translation.value = boundary + dynamic * 0.5;\n return;\n }\n }\n\n const translationValue = panOffset.value + panTranslation;\n translation.value = translationValue;\n }, [\n isHorizontal,\n max,\n panOffset,\n infinite,\n overscrollEnabled,\n translation,\n validStart,\n touching,\n ]);\n\n const onGestureFinish = useCallback((e: GestureStateChangeEvent<PanGestureHandlerEventPayload>) => {\n \"worklet\";\n\n const { velocityX, velocityY, translationX, translationY } = e;\n scrollEndVelocity.value = isHorizontal.value\n ? velocityX\n : velocityY;\n scrollEndTranslation.value = isHorizontal.value\n ? translationX\n : translationY;\n\n const totalTranslation = scrollEndVelocity.value + scrollEndTranslation.value;\n\n if (maxScrollDistancePerSwipeIsSet && Math.abs(totalTranslation) > maxScrollDistancePerSwipe) {\n const nextPage = Math.round((panOffset.value + maxScrollDistancePerSwipe * Math.sign(totalTranslation)) / size) * size;\n translation.value = withSpring(withProcessTranslation(nextPage), onScrollEnd);\n }\n else {\n endWithSpring(onScrollEnd);\n }\n\n if (!infinite)\n touching.value = false;\n }, [\n size,\n infinite,\n touching,\n panOffset,\n translation,\n isHorizontal,\n scrollEndVelocity,\n scrollEndTranslation,\n maxScrollDistancePerSwipeIsSet,\n maxScrollDistancePerSwipe,\n endWithSpring,\n withSpring,\n onScrollEnd,\n ]);\n\n const gesture = useMemo(() => {\n const gesture = Gesture.Pan()\n .onBegin(onGestureBegin)\n .onUpdate(onGestureUpdate)\n .onEnd(onGestureFinish);\n\n if (onConfigurePanGesture)\n onConfigurePanGesture(gesture);\n\n return gesture;\n },\n [\n onGestureBegin,\n onGestureUpdate,\n onGestureFinish,\n onConfigurePanGesture,\n ]);\n\n useUpdateGestureConfig(gesture, { enabled });\n\n return (\n <GestureDetector gesture={gesture}>\n <Animated.View\n ref={containerRef}\n testID={testID}\n style={style}\n onTouchStart={onTouchBegin}\n onTouchEnd={onTouchEnd}\n >\n {props.children}\n </Animated.View>\n </GestureDetector>\n );\n};\n\nexport const ScrollViewGesture = IScrollViewGesture;\n"]}
|
|
1
|
+
{"version":3,"sources":["ScrollViewGesture.tsx"],"names":["React","useCallback","GestureDetector","Animated","cancelAnimation","measure","runOnJS","useAnimatedReaction","useAnimatedRef","useDerivedValue","useSharedValue","withDecay","Easing","usePanGestureProxy","CTX","dealWithAnimation","IScrollViewGesture","props","onConfigurePanGesture","vertical","pagingEnabled","snapEnabled","loop","scrollAnimationDuration","withAnimation","enabled","dataLength","overscrollEnabled","maxScrollDistancePerSwipe","minScrollDistancePerSwipe","fixedDirection","useContext","size","translation","testID","style","onScrollStart","onScrollEnd","onTouchBegin","onTouchEnd","maxPage","isHorizontal","max","panOffset","touching","validStart","scrollEndTranslation","scrollEndVelocity","containerRef","maxScrollDistancePerSwipeIsSet","minScrollDistancePerSwipeIsSet","getLimit","width","containerWidth","withSpring","toValue","onFinished","defaultWithAnimation","type","config","duration","easing","easeOutQuart","isFinished","endWithSpring","origin","value","velocity","finalTranslation","deceleration","Math","abs","offset","computed","ceil","floor","page","finalPage","withProcessTranslation","min","nextPage","round","limit","sign","onFinish","activeDecay","resetBoundary","onGestureStart","_","onGestureUpdate","e","translationX","translationY","panTranslation","boundary","fixed","dynamic","translationValue","onGestureEnd","_success","velocityX","velocityY","totalTranslation","gesture","options","children","ScrollViewGesture"],"mappings":"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","sourcesContent":["import type { PropsWithChildren } from \"react\";\nimport React, { useCallback } from \"react\";\nimport type { StyleProp, ViewStyle } from \"react-native\";\nimport type { GestureStateChangeEvent, PanGestureHandlerEventPayload } from \"react-native-gesture-handler\";\nimport { GestureDetector } from \"react-native-gesture-handler\";\nimport Animated, {\n cancelAnimation,\n measure,\n runOnJS,\n useAnimatedReaction,\n useAnimatedRef,\n useDerivedValue,\n useSharedValue,\n withDecay,\n} from \"react-native-reanimated\";\n\nimport { Easing } from \"../constants\";\nimport { usePanGestureProxy } from \"../hooks/usePanGestureProxy\";\nimport { CTX } from \"../store\";\nimport type { WithTimingAnimation } from \"../types\";\nimport { dealWithAnimation } from \"../utils/deal-with-animation\";\n\ninterface Props {\n size: number\n infinite?: boolean\n testID?: string\n style?: StyleProp<ViewStyle>\n onScrollStart?: () => void\n onScrollEnd?: () => void\n onTouchBegin?: () => void\n onTouchEnd?: () => void\n translation: Animated.SharedValue<number>\n}\n\nconst IScrollViewGesture: React.FC<PropsWithChildren<Props>> = (props) => {\n const {\n props: {\n onConfigurePanGesture,\n vertical,\n pagingEnabled,\n snapEnabled,\n loop,\n scrollAnimationDuration,\n withAnimation,\n enabled,\n dataLength,\n overscrollEnabled,\n maxScrollDistancePerSwipe,\n minScrollDistancePerSwipe,\n fixedDirection,\n },\n } = React.useContext(CTX);\n\n const {\n size,\n translation,\n testID,\n style = {},\n onScrollStart,\n onScrollEnd,\n onTouchBegin,\n onTouchEnd,\n } = props;\n\n const maxPage = dataLength;\n const isHorizontal = useDerivedValue(() => !vertical, [vertical]);\n const max = useSharedValue(0);\n const panOffset = useSharedValue(0);\n const touching = useSharedValue(false);\n const validStart = useSharedValue(false);\n const scrollEndTranslation = useSharedValue(0);\n const scrollEndVelocity = useSharedValue(0);\n const containerRef = useAnimatedRef<Animated.View>();\n const maxScrollDistancePerSwipeIsSet = typeof maxScrollDistancePerSwipe === \"number\";\n const minScrollDistancePerSwipeIsSet = typeof minScrollDistancePerSwipe === \"number\";\n\n // Get the limit of the scroll.\n const getLimit = React.useCallback(() => {\n \"worklet\";\n\n if (!loop && !overscrollEnabled) {\n const { width: containerWidth = 0 } = measure(containerRef);\n\n // If the item's total width is less than the container's width, then there is no need to scroll.\n if (dataLength * size < containerWidth)\n return 0;\n\n // Disable the \"overscroll\" effect\n return dataLength * size - containerWidth;\n }\n\n return dataLength * size;\n }, [loop, size, dataLength, overscrollEnabled]);\n\n const withSpring = React.useCallback(\n (toValue: number, onFinished?: () => void) => {\n \"worklet\";\n const defaultWithAnimation: WithTimingAnimation = {\n type: \"timing\",\n config: {\n duration: scrollAnimationDuration + 100,\n easing: Easing.easeOutQuart,\n },\n };\n\n return dealWithAnimation(withAnimation ?? defaultWithAnimation)(\n toValue,\n (isFinished: boolean) => {\n \"worklet\";\n if (isFinished)\n onFinished && runOnJS(onFinished)();\n },\n );\n },\n [scrollAnimationDuration, withAnimation],\n );\n\n const endWithSpring = React.useCallback(\n (onFinished?: () => void) => {\n \"worklet\";\n const origin = translation.value;\n const velocity = scrollEndVelocity.value;\n // Default to scroll in the direction of the slide (with deceleration)\n let finalTranslation: number = withDecay({ velocity, deceleration: 0.999 });\n\n // If the distance of the swipe exceeds the max scroll distance, keep the view at the current position\n if (maxScrollDistancePerSwipeIsSet && Math.abs(scrollEndTranslation.value) > maxScrollDistancePerSwipe) {\n finalTranslation = origin;\n }\n else {\n /**\n * The page size is the same as the item size.\n * If direction is vertical, the page size is the height of the item.\n * If direction is horizontal, the page size is the width of the item.\n *\n * `page size` equals to `size` variable.\n * */\n if (pagingEnabled) {\n // distance with direction\n const offset = -(scrollEndTranslation.value >= 0 ? 1 : -1); // 1 or -1\n const computed = offset < 0 ? Math.ceil : Math.floor;\n const page = computed(-translation.value / size);\n\n if (loop) {\n const finalPage = page + offset;\n finalTranslation = withSpring(withProcessTranslation(-finalPage * size), onFinished);\n }\n else {\n const finalPage = Math.min(maxPage - 1, Math.max(0, page + offset));\n finalTranslation = withSpring(withProcessTranslation(-finalPage * size), onFinished);\n }\n }\n\n if (!pagingEnabled && snapEnabled) {\n // scroll to the nearest item\n const nextPage = Math.round((origin + velocity * 0.4) / size) * size;\n finalTranslation = withSpring(withProcessTranslation(nextPage), onFinished);\n }\n }\n\n translation.value = finalTranslation;\n\n function withProcessTranslation(translation: number) {\n if (!loop && !overscrollEnabled) {\n const limit = getLimit();\n const sign = Math.sign(translation);\n return sign * Math.max(0, Math.min(limit, Math.abs(translation)));\n }\n\n return translation;\n }\n },\n [\n withSpring,\n size,\n maxPage,\n loop,\n snapEnabled,\n translation,\n pagingEnabled,\n scrollEndVelocity.value,\n maxScrollDistancePerSwipe,\n scrollEndTranslation.value,\n maxScrollDistancePerSwipeIsSet,\n ],\n );\n\n const onFinish = React.useCallback(\n (isFinished: boolean) => {\n \"worklet\";\n if (isFinished) {\n touching.value = false;\n onScrollEnd && runOnJS(onScrollEnd)();\n }\n },\n [onScrollEnd, touching],\n );\n\n const activeDecay = React.useCallback(() => {\n \"worklet\";\n touching.value = true;\n translation.value = withDecay(\n { velocity: scrollEndVelocity.value },\n isFinished => onFinish(isFinished as boolean),\n );\n }, [onFinish, scrollEndVelocity.value, touching, translation]);\n\n const resetBoundary = React.useCallback(() => {\n \"worklet\";\n if (touching.value)\n return;\n\n if (translation.value > 0) {\n if (scrollEndTranslation.value < 0) {\n activeDecay();\n return;\n }\n if (!loop) {\n translation.value = withSpring(0);\n return;\n }\n }\n\n if (translation.value < -((maxPage - 1) * size)) {\n if (scrollEndTranslation.value > 0) {\n activeDecay();\n return;\n }\n if (!loop)\n translation.value = withSpring(-((maxPage - 1) * size));\n }\n }, [\n touching.value,\n translation,\n maxPage,\n size,\n scrollEndTranslation.value,\n loop,\n activeDecay,\n withSpring,\n ]);\n\n useAnimatedReaction(\n () => translation.value,\n () => {\n if (!pagingEnabled)\n resetBoundary();\n },\n [pagingEnabled, resetBoundary],\n );\n\n function withProcessTranslation(translation: number) {\n \"worklet\";\n\n if (!loop && !overscrollEnabled) {\n const limit = getLimit();\n const sign = Math.sign(translation);\n return sign * Math.max(0, Math.min(limit, Math.abs(translation)));\n }\n\n return translation;\n }\n\n const onGestureStart = useCallback((_: PanGestureHandlerEventPayload) => {\n \"worklet\";\n\n touching.value = true;\n validStart.value = true;\n onScrollStart && runOnJS(onScrollStart)();\n\n max.value = (maxPage - 1) * size;\n if (!loop && !overscrollEnabled)\n max.value = getLimit();\n\n panOffset.value = translation.value;\n }, [\n max,\n size,\n maxPage,\n loop,\n touching,\n panOffset,\n validStart,\n translation,\n overscrollEnabled,\n getLimit,\n onScrollStart,\n ]);\n\n const onGestureUpdate = useCallback((e: PanGestureHandlerEventPayload) => {\n \"worklet\";\n\n if (validStart.value) {\n validStart.value = false;\n cancelAnimation(translation);\n }\n touching.value = true;\n const { translationX, translationY } = e;\n\n let panTranslation = isHorizontal.value\n ? translationX\n : translationY;\n\n if (fixedDirection === \"negative\")\n panTranslation = -Math.abs(panTranslation);\n\n else if (fixedDirection === \"positive\")\n panTranslation = +Math.abs(panTranslation);\n\n if (!loop) {\n if ((translation.value > 0 || translation.value < -max.value)) {\n const boundary = translation.value > 0 ? 0 : -max.value;\n const fixed = boundary - panOffset.value;\n const dynamic = panTranslation - fixed;\n translation.value = boundary + dynamic * 0.5;\n return;\n }\n }\n\n const translationValue = panOffset.value + panTranslation;\n translation.value = translationValue;\n }, [\n isHorizontal,\n max,\n panOffset,\n loop,\n overscrollEnabled,\n fixedDirection,\n translation,\n validStart,\n touching,\n ]);\n\n const onGestureEnd = useCallback((e: GestureStateChangeEvent<PanGestureHandlerEventPayload>, _success: boolean) => {\n \"worklet\";\n\n const { velocityX, velocityY, translationX, translationY } = e;\n scrollEndVelocity.value = isHorizontal.value\n ? velocityX\n : velocityY;\n\n let panTranslation = isHorizontal.value\n ? translationX\n : translationY;\n\n if (fixedDirection === \"negative\")\n panTranslation = -Math.abs(panTranslation);\n\n else if (fixedDirection === \"positive\")\n panTranslation = +Math.abs(panTranslation);\n\n scrollEndTranslation.value = panTranslation;\n\n const totalTranslation = scrollEndVelocity.value + scrollEndTranslation.value;\n\n /**\n * If the maximum scroll distance is set and the translation `exceeds the maximum scroll distance`,\n * the carousel will keep the view at the current position.\n */\n if (\n maxScrollDistancePerSwipeIsSet && Math.abs(totalTranslation) > maxScrollDistancePerSwipe\n ) {\n const nextPage = Math.round((panOffset.value + maxScrollDistancePerSwipe * Math.sign(totalTranslation)) / size) * size;\n translation.value = withSpring(withProcessTranslation(nextPage), onScrollEnd);\n }\n /**\n * If the minimum scroll distance is set and the translation `didn't exceeds the minimum scroll distance`,\n * the carousel will keep the view at the current position.\n */\n else if (\n minScrollDistancePerSwipeIsSet && Math.abs(totalTranslation) < minScrollDistancePerSwipe\n ) {\n const nextPage = Math.round((panOffset.value + minScrollDistancePerSwipe * Math.sign(totalTranslation)) / size) * size;\n translation.value = withSpring(withProcessTranslation(nextPage), onScrollEnd);\n }\n else {\n endWithSpring(onScrollEnd);\n }\n\n if (!loop)\n touching.value = false;\n }, [\n size,\n loop,\n touching,\n panOffset,\n translation,\n isHorizontal,\n scrollEndVelocity,\n scrollEndTranslation,\n fixedDirection,\n maxScrollDistancePerSwipeIsSet,\n maxScrollDistancePerSwipe,\n maxScrollDistancePerSwipeIsSet,\n minScrollDistancePerSwipe,\n endWithSpring,\n withSpring,\n onScrollEnd,\n ]);\n\n const gesture = usePanGestureProxy({\n onConfigurePanGesture,\n onGestureStart,\n onGestureUpdate,\n onGestureEnd,\n options: { enabled },\n });\n\n return (\n <GestureDetector gesture={gesture}>\n <Animated.View\n ref={containerRef}\n testID={testID}\n style={style}\n onTouchStart={onTouchBegin}\n onTouchEnd={onTouchEnd}\n >\n {props.children}\n </Animated.View>\n </GestureDetector>\n );\n};\n\nexport const ScrollViewGesture = IScrollViewGesture;\n"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import Animated, { useAnimatedStyle, useDerivedValue } from "react-native-reanimated";
|
|
3
|
+
import renderer from "react-test-renderer";
|
|
4
|
+
describe("useSharedValue", () => {
|
|
5
|
+
it("retains value on rerender", () => {
|
|
6
|
+
const initialValue = 0;
|
|
7
|
+
const updatedValue = 1;
|
|
8
|
+
|
|
9
|
+
const TestComponent = props => {
|
|
10
|
+
const opacity = useDerivedValue(() => props.value, [props.value]);
|
|
11
|
+
const animatedStyle = useAnimatedStyle(() => ({
|
|
12
|
+
opacity: opacity.value
|
|
13
|
+
}), [opacity]);
|
|
14
|
+
return /*#__PURE__*/React.createElement(Animated.View, {
|
|
15
|
+
style: animatedStyle
|
|
16
|
+
});
|
|
17
|
+
}; // When rendering with initial value
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
const wrapper = renderer.create( /*#__PURE__*/React.createElement(TestComponent, {
|
|
21
|
+
key: "box",
|
|
22
|
+
value: initialValue
|
|
23
|
+
}));
|
|
24
|
+
expect(typeof wrapper.root.children[0] !== "string" ? wrapper.root.children[0].props.style.animatedStyle.current.value.opacity : false).toBe(initialValue); // When rendering with updated value
|
|
25
|
+
|
|
26
|
+
wrapper.update( /*#__PURE__*/React.createElement(TestComponent, {
|
|
27
|
+
key: "box",
|
|
28
|
+
value: updatedValue
|
|
29
|
+
}));
|
|
30
|
+
expect(typeof wrapper.root.children[0] !== "string" ? wrapper.root.children[0].props.style.animatedStyle.current.value.opacity : false).toBe(initialValue);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
//# sourceMappingURL=rnr-demo.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["rnr-demo.test.tsx"],"names":["React","Animated","useAnimatedStyle","useDerivedValue","renderer","describe","it","initialValue","updatedValue","TestComponent","props","opacity","value","animatedStyle","wrapper","create","expect","root","children","style","current","toBe","update"],"mappings":"AACA,OAAOA,KAAP,MAAkB,OAAlB;AACA,OAAOC,QAAP,IAAmBC,gBAAnB,EAAqCC,eAArC,QAA4D,yBAA5D;AACA,OAAOC,QAAP,MAAqB,qBAArB;AAEAC,QAAQ,CAAC,gBAAD,EAAmB,MAAM;AAC/BC,EAAAA,EAAE,CAAC,2BAAD,EAA8B,MAAM;AACpC,UAAMC,YAAY,GAAG,CAArB;AACA,UAAMC,YAAY,GAAG,CAArB;;AAOA,UAAMC,aAAwB,GAAIC,KAAD,IAAW;AAC1C,YAAMC,OAAO,GAAGR,eAAe,CAAC,MAAMO,KAAK,CAACE,KAAb,EAAoB,CAACF,KAAK,CAACE,KAAP,CAApB,CAA/B;AACA,YAAMC,aAAa,GAAGX,gBAAgB,CAAC,OAAO;AAC5CS,QAAAA,OAAO,EAAEA,OAAO,CAACC;AAD2B,OAAP,CAAD,EAElC,CAACD,OAAD,CAFkC,CAAtC;AAIA,0BAAO,oBAAC,QAAD,CAAU,IAAV;AAAe,QAAA,KAAK,EAAEE;AAAtB,QAAP;AACD,KAPD,CAToC,CAkBpC;;;AACA,UAAMC,OAAO,GAAGV,QAAQ,CAACW,MAAT,eAAgB,oBAAC,aAAD;AAAe,MAAA,GAAG,EAAC,KAAnB;AAAyB,MAAA,KAAK,EAAER;AAAhC,MAAhB,CAAhB;AAEAS,IAAAA,MAAM,CACJ,OAAOF,OAAO,CAACG,IAAR,CAAaC,QAAb,CAAsB,CAAtB,CAAP,KAAoC,QAApC,GACIJ,OAAO,CAACG,IAAR,CAAaC,QAAb,CAAsB,CAAtB,EAAyBR,KAAzB,CAA+BS,KAA/B,CAAqCN,aAArC,CAAmDO,OAAnD,CAA2DR,KAA3D,CAAiED,OADrE,GAEI,KAHA,CAAN,CAIEU,IAJF,CAIOd,YAJP,EArBoC,CA2BpC;;AACAO,IAAAA,OAAO,CAACQ,MAAR,eAAe,oBAAC,aAAD;AAAe,MAAA,GAAG,EAAC,KAAnB;AAAyB,MAAA,KAAK,EAAEd;AAAhC,MAAf;AAEAQ,IAAAA,MAAM,CACJ,OAAOF,OAAO,CAACG,IAAR,CAAaC,QAAb,CAAsB,CAAtB,CAAP,KAAoC,QAApC,GACIJ,OAAO,CAACG,IAAR,CAAaC,QAAb,CAAsB,CAAtB,EAAyBR,KAAzB,CAA+BS,KAA/B,CAAqCN,aAArC,CAAmDO,OAAnD,CAA2DR,KAA3D,CAAiED,OADrE,GAEI,KAHA,CAAN,CAIEU,IAJF,CAIOd,YAJP;AAKD,GAnCC,CAAF;AAoCD,CArCO,CAAR","sourcesContent":["import type { FC } from \"react\";\nimport React from \"react\";\nimport Animated, { useAnimatedStyle, useDerivedValue } from \"react-native-reanimated\";\nimport renderer from \"react-test-renderer\";\n\ndescribe(\"useSharedValue\", () => {\n it(\"retains value on rerender\", () => {\n const initialValue = 0;\n const updatedValue = 1;\n\n interface Props {\n key: string\n value: number\n }\n\n const TestComponent: FC<Props> = (props) => {\n const opacity = useDerivedValue(() => props.value, [props.value]);\n const animatedStyle = useAnimatedStyle(() => ({\n opacity: opacity.value,\n }), [opacity]);\n\n return <Animated.View style={animatedStyle} />;\n };\n\n // When rendering with initial value\n const wrapper = renderer.create(<TestComponent key=\"box\" value={initialValue} />);\n\n expect(\n typeof wrapper.root.children[0] !== \"string\"\n ? wrapper.root.children[0].props.style.animatedStyle.current.value.opacity\n : false,\n ).toBe(initialValue);\n\n // When rendering with updated value\n wrapper.update(<TestComponent key=\"box\" value={updatedValue} />);\n\n expect(\n typeof wrapper.root.children[0] !== \"string\"\n ? wrapper.root.children[0].props.style.animatedStyle.current.value.opacity\n : false,\n ).toBe(initialValue);\n });\n});\n"]}
|
|
@@ -14,7 +14,8 @@ export function useCarouselController(options) {
|
|
|
14
14
|
withAnimation,
|
|
15
15
|
defaultIndex = 0,
|
|
16
16
|
duration,
|
|
17
|
-
autoFillData
|
|
17
|
+
autoFillData,
|
|
18
|
+
fixedDirection
|
|
18
19
|
} = options;
|
|
19
20
|
const dataInfo = React.useMemo(() => ({
|
|
20
21
|
length: dataLength,
|
|
@@ -75,10 +76,10 @@ export function useCarouselController(options) {
|
|
|
75
76
|
|
|
76
77
|
(_options$onScrollEnd = options.onScrollEnd) === null || _options$onScrollEnd === void 0 ? void 0 : _options$onScrollEnd.call(options);
|
|
77
78
|
}, [options]);
|
|
78
|
-
const
|
|
79
|
-
var _options$
|
|
79
|
+
const onScrollStart = React.useCallback(() => {
|
|
80
|
+
var _options$onScrollStar;
|
|
80
81
|
|
|
81
|
-
(_options$
|
|
82
|
+
(_options$onScrollStar = options.onScrollStart) === null || _options$onScrollStar === void 0 ? void 0 : _options$onScrollStar.call(options);
|
|
82
83
|
}, [options]);
|
|
83
84
|
const scrollWithTiming = React.useCallback((toValue, onFinished) => {
|
|
84
85
|
"worklet";
|
|
@@ -111,7 +112,7 @@ export function useCarouselController(options) {
|
|
|
111
112
|
onFinished
|
|
112
113
|
} = opts;
|
|
113
114
|
if (!canSliding() || !loop && index.value >= dataInfo.length - 1) return;
|
|
114
|
-
|
|
115
|
+
onScrollStart === null || onScrollStart === void 0 ? void 0 : onScrollStart();
|
|
115
116
|
const nextPage = currentFixedPage() + count;
|
|
116
117
|
index.value = nextPage;
|
|
117
118
|
|
|
@@ -121,7 +122,7 @@ export function useCarouselController(options) {
|
|
|
121
122
|
handlerOffset.value = -nextPage * size;
|
|
122
123
|
onFinished === null || onFinished === void 0 ? void 0 : onFinished();
|
|
123
124
|
}
|
|
124
|
-
}, [canSliding, loop, index, dataInfo,
|
|
125
|
+
}, [canSliding, loop, index, dataInfo, onScrollStart, handlerOffset, size, scrollWithTiming, currentFixedPage]);
|
|
125
126
|
const prev = React.useCallback(function () {
|
|
126
127
|
let opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
127
128
|
const {
|
|
@@ -130,7 +131,7 @@ export function useCarouselController(options) {
|
|
|
130
131
|
onFinished
|
|
131
132
|
} = opts;
|
|
132
133
|
if (!canSliding() || !loop && index.value <= 0) return;
|
|
133
|
-
|
|
134
|
+
onScrollStart === null || onScrollStart === void 0 ? void 0 : onScrollStart();
|
|
134
135
|
const prevPage = currentFixedPage() - count;
|
|
135
136
|
index.value = prevPage;
|
|
136
137
|
|
|
@@ -140,7 +141,7 @@ export function useCarouselController(options) {
|
|
|
140
141
|
handlerOffset.value = -prevPage * size;
|
|
141
142
|
onFinished === null || onFinished === void 0 ? void 0 : onFinished();
|
|
142
143
|
}
|
|
143
|
-
}, [canSliding, loop, index,
|
|
144
|
+
}, [canSliding, loop, index, onScrollStart, handlerOffset, size, scrollWithTiming, currentFixedPage]);
|
|
144
145
|
const to = React.useCallback(opts => {
|
|
145
146
|
const {
|
|
146
147
|
i,
|
|
@@ -149,9 +150,9 @@ export function useCarouselController(options) {
|
|
|
149
150
|
} = opts;
|
|
150
151
|
if (i === index.value) return;
|
|
151
152
|
if (!canSliding()) return;
|
|
152
|
-
|
|
153
|
+
onScrollStart === null || onScrollStart === void 0 ? void 0 : onScrollStart(); // direction -> 1 | -1
|
|
153
154
|
|
|
154
|
-
const direction = handlerOffsetDirection(handlerOffset); // target offset
|
|
155
|
+
const direction = handlerOffsetDirection(handlerOffset, fixedDirection); // target offset
|
|
155
156
|
|
|
156
157
|
const offset = i * size * direction; // page width size * page count
|
|
157
158
|
|
|
@@ -172,7 +173,7 @@ export function useCarouselController(options) {
|
|
|
172
173
|
index.value = i;
|
|
173
174
|
onFinished === null || onFinished === void 0 ? void 0 : onFinished();
|
|
174
175
|
}
|
|
175
|
-
}, [
|
|
176
|
+
}, [size, loop, index, fixedDirection, handlerOffset, dataInfo.length, canSliding, onScrollStart, scrollWithTiming]);
|
|
176
177
|
const scrollTo = React.useCallback(function () {
|
|
177
178
|
let opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
178
179
|
const {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useCarouselController.tsx"],"names":["React","useRef","runOnJS","useAnimatedReaction","useSharedValue","Easing","computedRealIndexWithAutoFillData","convertToSharedIndex","dealWithAnimation","handlerOffsetDirection","round","useCarouselController","options","size","loop","dataLength","handlerOffset","withAnimation","defaultIndex","duration","autoFillData","dataInfo","useMemo","length","disable","originalLength","index","sharedIndex","sharedPreIndex","currentFixedPage","useCallback","Math","value","fixed","abs","setSharedIndex","newSharedIndex","current","handlerOffsetValue","toInt","isPositive","i","newSharedIndexValue","rawDataLength","getCurrentIndex","realIndex","canSliding","onScrollEnd","onScrollBegin","scrollWithTiming","toValue","onFinished","callback","isFinished","defaultWithAnimation","type","config","easing","easeOutQuart","next","opts","count","animated","nextPage","prev","prevPage","to","direction","offset","totalSize","isCloseToNextLoop","finalOffset","floor","scrollTo","n","getSharedIndex"],"mappings":"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","sourcesContent":["import React, { useRef } from \"react\";\nimport type Animated from \"react-native-reanimated\";\nimport {\n runOnJS,\n useAnimatedReaction,\n useSharedValue,\n} from \"react-native-reanimated\";\n\nimport { Easing } from \"../constants\";\nimport type {\n TCarouselActionOptions,\n TCarouselProps,\n WithTimingAnimation,\n} from \"../types\";\nimport { computedRealIndexWithAutoFillData, convertToSharedIndex } from \"../utils/computed-with-auto-fill-data\";\nimport { dealWithAnimation } from \"../utils/deal-with-animation\";\nimport { handlerOffsetDirection } from \"../utils/handleroffset-direction\";\nimport { round } from \"../utils/log\";\n\ninterface IOpts {\n loop: boolean\n size: number\n dataLength: number\n autoFillData: TCarouselProps[\"autoFillData\"]\n handlerOffset: Animated.SharedValue<number>\n withAnimation?: TCarouselProps[\"withAnimation\"]\n duration?: number\n defaultIndex?: number\n onScrollBegin?: () => void\n onScrollEnd?: () => void\n}\n\nexport interface ICarouselController {\n getSharedIndex: () => number\n prev: (opts?: TCarouselActionOptions) => void\n next: (opts?: TCarouselActionOptions) => void\n getCurrentIndex: () => number\n scrollTo: (opts?: TCarouselActionOptions) => void\n}\n\nexport function useCarouselController(options: IOpts): ICarouselController {\n const {\n size,\n loop,\n dataLength,\n handlerOffset,\n withAnimation,\n defaultIndex = 0,\n duration,\n autoFillData,\n } = options;\n\n const dataInfo = React.useMemo(\n () => ({\n length: dataLength,\n disable: !dataLength,\n originalLength: dataLength,\n }),\n [dataLength],\n );\n\n const index = useSharedValue<number>(defaultIndex);\n // The Index displayed to the user\n const sharedIndex = useRef<number>(defaultIndex);\n const sharedPreIndex = useRef<number>(defaultIndex);\n\n const currentFixedPage = React.useCallback(() => {\n if (loop)\n return -Math.round(handlerOffset.value / size);\n\n const fixed = (handlerOffset.value / size) % dataInfo.length;\n return Math.round(\n handlerOffset.value <= 0\n ? Math.abs(fixed)\n : Math.abs(fixed > 0 ? dataInfo.length - fixed : 0),\n );\n }, [handlerOffset, dataInfo, size, loop]);\n\n function setSharedIndex(newSharedIndex: number) {\n sharedIndex.current = newSharedIndex;\n }\n\n useAnimatedReaction(\n () => {\n const handlerOffsetValue = handlerOffset.value;\n const toInt = round(handlerOffsetValue / size) % dataInfo.length;\n const isPositive = handlerOffsetValue <= 0;\n const i = isPositive\n ? Math.abs(toInt)\n : Math.abs(toInt > 0 ? dataInfo.length - toInt : 0);\n\n const newSharedIndexValue = convertToSharedIndex({\n loop,\n rawDataLength: dataInfo.originalLength,\n autoFillData: autoFillData!,\n index: i,\n });\n\n return {\n i,\n newSharedIndexValue,\n };\n },\n ({ i, newSharedIndexValue }) => {\n index.value = i;\n runOnJS(setSharedIndex)(newSharedIndexValue);\n },\n [\n sharedPreIndex,\n sharedIndex,\n size,\n dataInfo,\n index,\n loop,\n autoFillData,\n handlerOffset,\n ],\n );\n\n const getCurrentIndex = React.useCallback(() => {\n const realIndex = computedRealIndexWithAutoFillData({\n index: index.value,\n dataLength: dataInfo.originalLength,\n loop,\n autoFillData: autoFillData!,\n });\n\n return realIndex;\n }, [index, autoFillData, dataInfo, loop]);\n\n const canSliding = React.useCallback(() => {\n return !dataInfo.disable;\n }, [dataInfo]);\n\n const onScrollEnd = React.useCallback(() => {\n options.onScrollEnd?.();\n }, [options]);\n\n const onScrollBegin = React.useCallback(() => {\n options.onScrollBegin?.();\n }, [options]);\n\n const scrollWithTiming = React.useCallback(\n (toValue: number, onFinished?: () => void) => {\n \"worklet\";\n const callback = (isFinished: boolean) => {\n \"worklet\";\n if (isFinished) {\n runOnJS(onScrollEnd)();\n onFinished && runOnJS(onFinished)();\n }\n };\n\n const defaultWithAnimation: WithTimingAnimation = {\n type: \"timing\",\n config: { duration, easing: Easing.easeOutQuart },\n };\n\n return dealWithAnimation(withAnimation ?? defaultWithAnimation)(\n toValue,\n callback,\n );\n },\n [duration, withAnimation, onScrollEnd],\n );\n\n const next = React.useCallback(\n (opts: TCarouselActionOptions = {}) => {\n \"worklet\";\n const { count = 1, animated = true, onFinished } = opts;\n if (!canSliding() || (!loop && index.value >= dataInfo.length - 1))\n return;\n\n onScrollBegin?.();\n\n const nextPage = currentFixedPage() + count;\n index.value = nextPage;\n\n if (animated) {\n handlerOffset.value = scrollWithTiming(\n -nextPage * size,\n onFinished,\n ) as any;\n }\n else {\n handlerOffset.value = -nextPage * size;\n onFinished?.();\n }\n },\n [\n canSliding,\n loop,\n index,\n dataInfo,\n onScrollBegin,\n handlerOffset,\n size,\n scrollWithTiming,\n currentFixedPage,\n ],\n );\n\n const prev = React.useCallback(\n (opts: TCarouselActionOptions = {}) => {\n const { count = 1, animated = true, onFinished } = opts;\n if (!canSliding() || (!loop && index.value <= 0)) return;\n\n onScrollBegin?.();\n\n const prevPage = currentFixedPage() - count;\n index.value = prevPage;\n\n if (animated) {\n handlerOffset.value = scrollWithTiming(\n -prevPage * size,\n onFinished,\n );\n }\n else {\n handlerOffset.value = -prevPage * size;\n onFinished?.();\n }\n },\n [\n canSliding,\n loop,\n index,\n onScrollBegin,\n handlerOffset,\n size,\n scrollWithTiming,\n currentFixedPage,\n ],\n );\n\n const to = React.useCallback(\n (opts: { i: number; animated: boolean; onFinished?: () => void }) => {\n const { i, animated = false, onFinished } = opts;\n if (i === index.value) return;\n if (!canSliding()) return;\n\n onScrollBegin?.();\n // direction -> 1 | -1\n const direction = handlerOffsetDirection(handlerOffset);\n\n // target offset\n const offset = i * size * direction;\n // page width size * page count\n const totalSize = dataInfo.length * size;\n\n let isCloseToNextLoop = false;\n\n if (loop) {\n isCloseToNextLoop\n = Math.abs(handlerOffset.value % totalSize) / totalSize\n >= 0.5;\n }\n\n const finalOffset\n = (Math.floor(Math.abs(handlerOffset.value / totalSize))\n + (isCloseToNextLoop ? 1 : 0))\n * totalSize\n * direction\n + offset;\n\n if (animated) {\n index.value = i;\n handlerOffset.value = scrollWithTiming(finalOffset, onFinished);\n }\n else {\n handlerOffset.value = finalOffset;\n index.value = i;\n onFinished?.();\n }\n },\n [\n index,\n canSliding,\n onScrollBegin,\n handlerOffset,\n size,\n dataInfo.length,\n loop,\n scrollWithTiming,\n ],\n );\n\n const scrollTo = React.useCallback(\n (opts: TCarouselActionOptions = {}) => {\n const { index: i, count, animated = false, onFinished } = opts;\n if (typeof i === \"number\" && i > -1) {\n to({ i, animated, onFinished });\n return;\n }\n\n if (!count)\n return;\n\n const n = Math.round(count);\n\n if (n < 0)\n prev({ count: Math.abs(n), animated, onFinished });\n\n else\n next({ count: n, animated, onFinished });\n },\n [prev, next, to],\n );\n\n return {\n next,\n prev,\n scrollTo,\n getCurrentIndex,\n getSharedIndex: () => sharedIndex.current,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["useCarouselController.tsx"],"names":["React","useRef","runOnJS","useAnimatedReaction","useSharedValue","Easing","computedRealIndexWithAutoFillData","convertToSharedIndex","dealWithAnimation","handlerOffsetDirection","round","useCarouselController","options","size","loop","dataLength","handlerOffset","withAnimation","defaultIndex","duration","autoFillData","fixedDirection","dataInfo","useMemo","length","disable","originalLength","index","sharedIndex","sharedPreIndex","currentFixedPage","useCallback","Math","value","fixed","abs","setSharedIndex","newSharedIndex","current","handlerOffsetValue","toInt","isPositive","i","newSharedIndexValue","rawDataLength","getCurrentIndex","realIndex","canSliding","onScrollEnd","onScrollStart","scrollWithTiming","toValue","onFinished","callback","isFinished","defaultWithAnimation","type","config","easing","easeOutQuart","next","opts","count","animated","nextPage","prev","prevPage","to","direction","offset","totalSize","isCloseToNextLoop","finalOffset","floor","scrollTo","n","getSharedIndex"],"mappings":"AAAA,OAAOA,KAAP,IAAgBC,MAAhB,QAA8B,OAA9B;AAEA,SACEC,OADF,EAEEC,mBAFF,EAGEC,cAHF,QAIO,yBAJP;AAMA,SAASC,MAAT,QAAuB,cAAvB;AAMA,SAASC,iCAAT,EAA4CC,oBAA5C,QAAwE,uCAAxE;AACA,SAASC,iBAAT,QAAkC,8BAAlC;AACA,SAASC,sBAAT,QAAuC,kCAAvC;AACA,SAASC,KAAT,QAAsB,cAAtB;AAwBA,OAAO,SAASC,qBAAT,CAA+BC,OAA/B,EAAoE;AACzE,QAAM;AACJC,IAAAA,IADI;AAEJC,IAAAA,IAFI;AAGJC,IAAAA,UAHI;AAIJC,IAAAA,aAJI;AAKJC,IAAAA,aALI;AAMJC,IAAAA,YAAY,GAAG,CANX;AAOJC,IAAAA,QAPI;AAQJC,IAAAA,YARI;AASJC,IAAAA;AATI,MAUFT,OAVJ;AAYA,QAAMU,QAAQ,GAAGtB,KAAK,CAACuB,OAAN,CACf,OAAO;AACLC,IAAAA,MAAM,EAAET,UADH;AAELU,IAAAA,OAAO,EAAE,CAACV,UAFL;AAGLW,IAAAA,cAAc,EAAEX;AAHX,GAAP,CADe,EAMf,CAACA,UAAD,CANe,CAAjB;AASA,QAAMY,KAAK,GAAGvB,cAAc,CAASc,YAAT,CAA5B,CAtByE,CAuBzE;;AACA,QAAMU,WAAW,GAAG3B,MAAM,CAASiB,YAAT,CAA1B;AACA,QAAMW,cAAc,GAAG5B,MAAM,CAASiB,YAAT,CAA7B;AAEA,QAAMY,gBAAgB,GAAG9B,KAAK,CAAC+B,WAAN,CAAkB,MAAM;AAC/C,QAAIjB,IAAJ,EACE,OAAO,CAACkB,IAAI,CAACtB,KAAL,CAAWM,aAAa,CAACiB,KAAd,GAAsBpB,IAAjC,CAAR;AAEF,UAAMqB,KAAK,GAAIlB,aAAa,CAACiB,KAAd,GAAsBpB,IAAvB,GAA+BS,QAAQ,CAACE,MAAtD;AACA,WAAOQ,IAAI,CAACtB,KAAL,CACLM,aAAa,CAACiB,KAAd,IAAuB,CAAvB,GACID,IAAI,CAACG,GAAL,CAASD,KAAT,CADJ,GAEIF,IAAI,CAACG,GAAL,CAASD,KAAK,GAAG,CAAR,GAAYZ,QAAQ,CAACE,MAAT,GAAkBU,KAA9B,GAAsC,CAA/C,CAHC,CAAP;AAKD,GAVwB,EAUtB,CAAClB,aAAD,EAAgBM,QAAhB,EAA0BT,IAA1B,EAAgCC,IAAhC,CAVsB,CAAzB;;AAYA,WAASsB,cAAT,CAAwBC,cAAxB,EAAgD;AAC9CT,IAAAA,WAAW,CAACU,OAAZ,GAAsBD,cAAtB;AACD;;AAEDlC,EAAAA,mBAAmB,CACjB,MAAM;AACJ,UAAMoC,kBAAkB,GAAGvB,aAAa,CAACiB,KAAzC;AACA,UAAMO,KAAK,GAAG9B,KAAK,CAAC6B,kBAAkB,GAAG1B,IAAtB,CAAL,GAAmCS,QAAQ,CAACE,MAA1D;AACA,UAAMiB,UAAU,GAAGF,kBAAkB,IAAI,CAAzC;AACA,UAAMG,CAAC,GAAGD,UAAU,GAChBT,IAAI,CAACG,GAAL,CAASK,KAAT,CADgB,GAEhBR,IAAI,CAACG,GAAL,CAASK,KAAK,GAAG,CAAR,GAAYlB,QAAQ,CAACE,MAAT,GAAkBgB,KAA9B,GAAsC,CAA/C,CAFJ;AAIA,UAAMG,mBAAmB,GAAGpC,oBAAoB,CAAC;AAC/CO,MAAAA,IAD+C;AAE/C8B,MAAAA,aAAa,EAAEtB,QAAQ,CAACI,cAFuB;AAG/CN,MAAAA,YAAY,EAAEA,YAHiC;AAI/CO,MAAAA,KAAK,EAAEe;AAJwC,KAAD,CAAhD;AAOA,WAAO;AACLA,MAAAA,CADK;AAELC,MAAAA;AAFK,KAAP;AAID,GApBgB,EAqBjB,QAAgC;AAAA,QAA/B;AAAED,MAAAA,CAAF;AAAKC,MAAAA;AAAL,KAA+B;AAC9BhB,IAAAA,KAAK,CAACM,KAAN,GAAcS,CAAd;AACAxC,IAAAA,OAAO,CAACkC,cAAD,CAAP,CAAwBO,mBAAxB;AACD,GAxBgB,EAyBjB,CACEd,cADF,EAEED,WAFF,EAGEf,IAHF,EAIES,QAJF,EAKEK,KALF,EAMEb,IANF,EAOEM,YAPF,EAQEJ,aARF,CAzBiB,CAAnB;AAqCA,QAAM6B,eAAe,GAAG7C,KAAK,CAAC+B,WAAN,CAAkB,MAAM;AAC9C,UAAMe,SAAS,GAAGxC,iCAAiC,CAAC;AAClDqB,MAAAA,KAAK,EAAEA,KAAK,CAACM,KADqC;AAElDlB,MAAAA,UAAU,EAAEO,QAAQ,CAACI,cAF6B;AAGlDZ,MAAAA,IAHkD;AAIlDM,MAAAA,YAAY,EAAEA;AAJoC,KAAD,CAAnD;AAOA,WAAO0B,SAAP;AACD,GATuB,EASrB,CAACnB,KAAD,EAAQP,YAAR,EAAsBE,QAAtB,EAAgCR,IAAhC,CATqB,CAAxB;AAWA,QAAMiC,UAAU,GAAG/C,KAAK,CAAC+B,WAAN,CAAkB,MAAM;AACzC,WAAO,CAACT,QAAQ,CAACG,OAAjB;AACD,GAFkB,EAEhB,CAACH,QAAD,CAFgB,CAAnB;AAIA,QAAM0B,WAAW,GAAGhD,KAAK,CAAC+B,WAAN,CAAkB,MAAM;AAAA;;AAC1C,4BAAAnB,OAAO,CAACoC,WAAR,mFAAApC,OAAO;AACR,GAFmB,EAEjB,CAACA,OAAD,CAFiB,CAApB;AAIA,QAAMqC,aAAa,GAAGjD,KAAK,CAAC+B,WAAN,CAAkB,MAAM;AAAA;;AAC5C,6BAAAnB,OAAO,CAACqC,aAAR,qFAAArC,OAAO;AACR,GAFqB,EAEnB,CAACA,OAAD,CAFmB,CAAtB;AAIA,QAAMsC,gBAAgB,GAAGlD,KAAK,CAAC+B,WAAN,CACvB,CAACoB,OAAD,EAAkBC,UAAlB,KAA8C;AAC5C;;AACA,UAAMC,QAAQ,GAAIC,UAAD,IAAyB;AACxC;;AACA,UAAIA,UAAJ,EAAgB;AACdpD,QAAAA,OAAO,CAAC8C,WAAD,CAAP;AACAI,QAAAA,UAAU,IAAIlD,OAAO,CAACkD,UAAD,CAAP,EAAd;AACD;AACF,KAND;;AAQA,UAAMG,oBAAyC,GAAG;AAChDC,MAAAA,IAAI,EAAE,QAD0C;AAEhDC,MAAAA,MAAM,EAAE;AAAEtC,QAAAA,QAAF;AAAYuC,QAAAA,MAAM,EAAErD,MAAM,CAACsD;AAA3B;AAFwC,KAAlD;AAKA,WAAOnD,iBAAiB,CAACS,aAAD,aAACA,aAAD,cAACA,aAAD,GAAkBsC,oBAAlB,CAAjB,CACLJ,OADK,EAELE,QAFK,CAAP;AAID,GApBsB,EAqBvB,CAAClC,QAAD,EAAWF,aAAX,EAA0B+B,WAA1B,CArBuB,CAAzB;AAwBA,QAAMY,IAAI,GAAG5D,KAAK,CAAC+B,WAAN,CACX,YAAuC;AACrC;;AADqC,QAAtC8B,IAAsC,uEAAP,EAAO;AAErC,UAAM;AAAEC,MAAAA,KAAK,GAAG,CAAV;AAAaC,MAAAA,QAAQ,GAAG,IAAxB;AAA8BX,MAAAA;AAA9B,QAA6CS,IAAnD;AACA,QAAI,CAACd,UAAU,EAAX,IAAkB,CAACjC,IAAD,IAASa,KAAK,CAACM,KAAN,IAAeX,QAAQ,CAACE,MAAT,GAAkB,CAAhE,EACE;AAEFyB,IAAAA,aAAa,SAAb,IAAAA,aAAa,WAAb,YAAAA,aAAa;AAEb,UAAMe,QAAQ,GAAGlC,gBAAgB,KAAKgC,KAAtC;AACAnC,IAAAA,KAAK,CAACM,KAAN,GAAc+B,QAAd;;AAEA,QAAID,QAAJ,EAAc;AACZ/C,MAAAA,aAAa,CAACiB,KAAd,GAAsBiB,gBAAgB,CACpC,CAACc,QAAD,GAAYnD,IADwB,EAEpCuC,UAFoC,CAAtC;AAID,KALD,MAMK;AACHpC,MAAAA,aAAa,CAACiB,KAAd,GAAsB,CAAC+B,QAAD,GAAYnD,IAAlC;AACAuC,MAAAA,UAAU,SAAV,IAAAA,UAAU,WAAV,YAAAA,UAAU;AACX;AACF,GAtBU,EAuBX,CACEL,UADF,EAEEjC,IAFF,EAGEa,KAHF,EAIEL,QAJF,EAKE2B,aALF,EAMEjC,aANF,EAOEH,IAPF,EAQEqC,gBARF,EASEpB,gBATF,CAvBW,CAAb;AAoCA,QAAMmC,IAAI,GAAGjE,KAAK,CAAC+B,WAAN,CACX,YAAuC;AAAA,QAAtC8B,IAAsC,uEAAP,EAAO;AACrC,UAAM;AAAEC,MAAAA,KAAK,GAAG,CAAV;AAAaC,MAAAA,QAAQ,GAAG,IAAxB;AAA8BX,MAAAA;AAA9B,QAA6CS,IAAnD;AACA,QAAI,CAACd,UAAU,EAAX,IAAkB,CAACjC,IAAD,IAASa,KAAK,CAACM,KAAN,IAAe,CAA9C,EAAkD;AAElDgB,IAAAA,aAAa,SAAb,IAAAA,aAAa,WAAb,YAAAA,aAAa;AAEb,UAAMiB,QAAQ,GAAGpC,gBAAgB,KAAKgC,KAAtC;AACAnC,IAAAA,KAAK,CAACM,KAAN,GAAciC,QAAd;;AAEA,QAAIH,QAAJ,EAAc;AACZ/C,MAAAA,aAAa,CAACiB,KAAd,GAAsBiB,gBAAgB,CACpC,CAACgB,QAAD,GAAYrD,IADwB,EAEpCuC,UAFoC,CAAtC;AAID,KALD,MAMK;AACHpC,MAAAA,aAAa,CAACiB,KAAd,GAAsB,CAACiC,QAAD,GAAYrD,IAAlC;AACAuC,MAAAA,UAAU,SAAV,IAAAA,UAAU,WAAV,YAAAA,UAAU;AACX;AACF,GApBU,EAqBX,CACEL,UADF,EAEEjC,IAFF,EAGEa,KAHF,EAIEsB,aAJF,EAKEjC,aALF,EAMEH,IANF,EAOEqC,gBAPF,EAQEpB,gBARF,CArBW,CAAb;AAiCA,QAAMqC,EAAE,GAAGnE,KAAK,CAAC+B,WAAN,CACR8B,IAAD,IAAqE;AACnE,UAAM;AAAEnB,MAAAA,CAAF;AAAKqB,MAAAA,QAAQ,GAAG,KAAhB;AAAuBX,MAAAA;AAAvB,QAAsCS,IAA5C;AACA,QAAInB,CAAC,KAAKf,KAAK,CAACM,KAAhB,EAAuB;AACvB,QAAI,CAACc,UAAU,EAAf,EAAmB;AAEnBE,IAAAA,aAAa,SAAb,IAAAA,aAAa,WAAb,YAAAA,aAAa,GALsD,CAMnE;;AACA,UAAMmB,SAAS,GAAG3D,sBAAsB,CAACO,aAAD,EAAgBK,cAAhB,CAAxC,CAPmE,CASnE;;AACA,UAAMgD,MAAM,GAAG3B,CAAC,GAAG7B,IAAJ,GAAWuD,SAA1B,CAVmE,CAWnE;;AACA,UAAME,SAAS,GAAGhD,QAAQ,CAACE,MAAT,GAAkBX,IAApC;AAEA,QAAI0D,iBAAiB,GAAG,KAAxB;;AAEA,QAAIzD,IAAJ,EAAU;AACRyD,MAAAA,iBAAiB,GACbvC,IAAI,CAACG,GAAL,CAASnB,aAAa,CAACiB,KAAd,GAAsBqC,SAA/B,IAA4CA,SAA5C,IACC,GAFL;AAGD;;AAED,UAAME,WAAW,GACb,CAACxC,IAAI,CAACyC,KAAL,CAAWzC,IAAI,CAACG,GAAL,CAASnB,aAAa,CAACiB,KAAd,GAAsBqC,SAA/B,CAAX,KACEC,iBAAiB,GAAG,CAAH,GAAO,CAD1B,CAAD,IAEAD,SAFA,GAGAF,SAHA,GAIAC,MALJ;;AAOA,QAAIN,QAAJ,EAAc;AACZpC,MAAAA,KAAK,CAACM,KAAN,GAAcS,CAAd;AACA1B,MAAAA,aAAa,CAACiB,KAAd,GAAsBiB,gBAAgB,CAACsB,WAAD,EAAcpB,UAAd,CAAtC;AACD,KAHD,MAIK;AACHpC,MAAAA,aAAa,CAACiB,KAAd,GAAsBuC,WAAtB;AACA7C,MAAAA,KAAK,CAACM,KAAN,GAAcS,CAAd;AACAU,MAAAA,UAAU,SAAV,IAAAA,UAAU,WAAV,YAAAA,UAAU;AACX;AACF,GAvCQ,EAwCT,CACEvC,IADF,EAEEC,IAFF,EAGEa,KAHF,EAIEN,cAJF,EAKEL,aALF,EAMEM,QAAQ,CAACE,MANX,EAOEuB,UAPF,EAQEE,aARF,EASEC,gBATF,CAxCS,CAAX;AAqDA,QAAMwB,QAAQ,GAAG1E,KAAK,CAAC+B,WAAN,CACf,YAAuC;AAAA,QAAtC8B,IAAsC,uEAAP,EAAO;AACrC,UAAM;AAAElC,MAAAA,KAAK,EAAEe,CAAT;AAAYoB,MAAAA,KAAZ;AAAmBC,MAAAA,QAAQ,GAAG,KAA9B;AAAqCX,MAAAA;AAArC,QAAoDS,IAA1D;;AACA,QAAI,OAAOnB,CAAP,KAAa,QAAb,IAAyBA,CAAC,GAAG,CAAC,CAAlC,EAAqC;AACnCyB,MAAAA,EAAE,CAAC;AAAEzB,QAAAA,CAAF;AAAKqB,QAAAA,QAAL;AAAeX,QAAAA;AAAf,OAAD,CAAF;AACA;AACD;;AAED,QAAI,CAACU,KAAL,EACE;AAEF,UAAMa,CAAC,GAAG3C,IAAI,CAACtB,KAAL,CAAWoD,KAAX,CAAV;AAEA,QAAIa,CAAC,GAAG,CAAR,EACEV,IAAI,CAAC;AAAEH,MAAAA,KAAK,EAAE9B,IAAI,CAACG,GAAL,CAASwC,CAAT,CAAT;AAAsBZ,MAAAA,QAAtB;AAAgCX,MAAAA;AAAhC,KAAD,CAAJ,CADF,KAIEQ,IAAI,CAAC;AAAEE,MAAAA,KAAK,EAAEa,CAAT;AAAYZ,MAAAA,QAAZ;AAAsBX,MAAAA;AAAtB,KAAD,CAAJ;AACH,GAlBc,EAmBf,CAACa,IAAD,EAAOL,IAAP,EAAaO,EAAb,CAnBe,CAAjB;AAsBA,SAAO;AACLP,IAAAA,IADK;AAELK,IAAAA,IAFK;AAGLS,IAAAA,QAHK;AAIL7B,IAAAA,eAJK;AAKL+B,IAAAA,cAAc,EAAE,MAAMhD,WAAW,CAACU;AAL7B,GAAP;AAOD","sourcesContent":["import React, { useRef } from \"react\";\nimport type Animated from \"react-native-reanimated\";\nimport {\n runOnJS,\n useAnimatedReaction,\n useSharedValue,\n} from \"react-native-reanimated\";\n\nimport { Easing } from \"../constants\";\nimport type {\n TCarouselActionOptions,\n TCarouselProps,\n WithTimingAnimation,\n} from \"../types\";\nimport { computedRealIndexWithAutoFillData, convertToSharedIndex } from \"../utils/computed-with-auto-fill-data\";\nimport { dealWithAnimation } from \"../utils/deal-with-animation\";\nimport { handlerOffsetDirection } from \"../utils/handleroffset-direction\";\nimport { round } from \"../utils/log\";\n\ninterface IOpts {\n loop: boolean\n size: number\n dataLength: number\n handlerOffset: Animated.SharedValue<number>\n autoFillData: TCarouselProps[\"autoFillData\"]\n withAnimation?: TCarouselProps[\"withAnimation\"]\n fixedDirection?: TCarouselProps[\"fixedDirection\"]\n duration?: number\n defaultIndex?: number\n onScrollStart?: () => void\n onScrollEnd?: () => void\n}\n\nexport interface ICarouselController {\n getSharedIndex: () => number\n prev: (opts?: TCarouselActionOptions) => void\n next: (opts?: TCarouselActionOptions) => void\n getCurrentIndex: () => number\n scrollTo: (opts?: TCarouselActionOptions) => void\n}\n\nexport function useCarouselController(options: IOpts): ICarouselController {\n const {\n size,\n loop,\n dataLength,\n handlerOffset,\n withAnimation,\n defaultIndex = 0,\n duration,\n autoFillData,\n fixedDirection,\n } = options;\n\n const dataInfo = React.useMemo(\n () => ({\n length: dataLength,\n disable: !dataLength,\n originalLength: dataLength,\n }),\n [dataLength],\n );\n\n const index = useSharedValue<number>(defaultIndex);\n // The Index displayed to the user\n const sharedIndex = useRef<number>(defaultIndex);\n const sharedPreIndex = useRef<number>(defaultIndex);\n\n const currentFixedPage = React.useCallback(() => {\n if (loop)\n return -Math.round(handlerOffset.value / size);\n\n const fixed = (handlerOffset.value / size) % dataInfo.length;\n return Math.round(\n handlerOffset.value <= 0\n ? Math.abs(fixed)\n : Math.abs(fixed > 0 ? dataInfo.length - fixed : 0),\n );\n }, [handlerOffset, dataInfo, size, loop]);\n\n function setSharedIndex(newSharedIndex: number) {\n sharedIndex.current = newSharedIndex;\n }\n\n useAnimatedReaction(\n () => {\n const handlerOffsetValue = handlerOffset.value;\n const toInt = round(handlerOffsetValue / size) % dataInfo.length;\n const isPositive = handlerOffsetValue <= 0;\n const i = isPositive\n ? Math.abs(toInt)\n : Math.abs(toInt > 0 ? dataInfo.length - toInt : 0);\n\n const newSharedIndexValue = convertToSharedIndex({\n loop,\n rawDataLength: dataInfo.originalLength,\n autoFillData: autoFillData!,\n index: i,\n });\n\n return {\n i,\n newSharedIndexValue,\n };\n },\n ({ i, newSharedIndexValue }) => {\n index.value = i;\n runOnJS(setSharedIndex)(newSharedIndexValue);\n },\n [\n sharedPreIndex,\n sharedIndex,\n size,\n dataInfo,\n index,\n loop,\n autoFillData,\n handlerOffset,\n ],\n );\n\n const getCurrentIndex = React.useCallback(() => {\n const realIndex = computedRealIndexWithAutoFillData({\n index: index.value,\n dataLength: dataInfo.originalLength,\n loop,\n autoFillData: autoFillData!,\n });\n\n return realIndex;\n }, [index, autoFillData, dataInfo, loop]);\n\n const canSliding = React.useCallback(() => {\n return !dataInfo.disable;\n }, [dataInfo]);\n\n const onScrollEnd = React.useCallback(() => {\n options.onScrollEnd?.();\n }, [options]);\n\n const onScrollStart = React.useCallback(() => {\n options.onScrollStart?.();\n }, [options]);\n\n const scrollWithTiming = React.useCallback(\n (toValue: number, onFinished?: () => void) => {\n \"worklet\";\n const callback = (isFinished: boolean) => {\n \"worklet\";\n if (isFinished) {\n runOnJS(onScrollEnd)();\n onFinished && runOnJS(onFinished)();\n }\n };\n\n const defaultWithAnimation: WithTimingAnimation = {\n type: \"timing\",\n config: { duration, easing: Easing.easeOutQuart },\n };\n\n return dealWithAnimation(withAnimation ?? defaultWithAnimation)(\n toValue,\n callback,\n );\n },\n [duration, withAnimation, onScrollEnd],\n );\n\n const next = React.useCallback(\n (opts: TCarouselActionOptions = {}) => {\n \"worklet\";\n const { count = 1, animated = true, onFinished } = opts;\n if (!canSliding() || (!loop && index.value >= dataInfo.length - 1))\n return;\n\n onScrollStart?.();\n\n const nextPage = currentFixedPage() + count;\n index.value = nextPage;\n\n if (animated) {\n handlerOffset.value = scrollWithTiming(\n -nextPage * size,\n onFinished,\n ) as any;\n }\n else {\n handlerOffset.value = -nextPage * size;\n onFinished?.();\n }\n },\n [\n canSliding,\n loop,\n index,\n dataInfo,\n onScrollStart,\n handlerOffset,\n size,\n scrollWithTiming,\n currentFixedPage,\n ],\n );\n\n const prev = React.useCallback(\n (opts: TCarouselActionOptions = {}) => {\n const { count = 1, animated = true, onFinished } = opts;\n if (!canSliding() || (!loop && index.value <= 0)) return;\n\n onScrollStart?.();\n\n const prevPage = currentFixedPage() - count;\n index.value = prevPage;\n\n if (animated) {\n handlerOffset.value = scrollWithTiming(\n -prevPage * size,\n onFinished,\n );\n }\n else {\n handlerOffset.value = -prevPage * size;\n onFinished?.();\n }\n },\n [\n canSliding,\n loop,\n index,\n onScrollStart,\n handlerOffset,\n size,\n scrollWithTiming,\n currentFixedPage,\n ],\n );\n\n const to = React.useCallback(\n (opts: { i: number; animated: boolean; onFinished?: () => void }) => {\n const { i, animated = false, onFinished } = opts;\n if (i === index.value) return;\n if (!canSliding()) return;\n\n onScrollStart?.();\n // direction -> 1 | -1\n const direction = handlerOffsetDirection(handlerOffset, fixedDirection);\n\n // target offset\n const offset = i * size * direction;\n // page width size * page count\n const totalSize = dataInfo.length * size;\n\n let isCloseToNextLoop = false;\n\n if (loop) {\n isCloseToNextLoop\n = Math.abs(handlerOffset.value % totalSize) / totalSize\n >= 0.5;\n }\n\n const finalOffset\n = (Math.floor(Math.abs(handlerOffset.value / totalSize))\n + (isCloseToNextLoop ? 1 : 0))\n * totalSize\n * direction\n + offset;\n\n if (animated) {\n index.value = i;\n handlerOffset.value = scrollWithTiming(finalOffset, onFinished);\n }\n else {\n handlerOffset.value = finalOffset;\n index.value = i;\n onFinished?.();\n }\n },\n [\n size,\n loop,\n index,\n fixedDirection,\n handlerOffset,\n dataInfo.length,\n canSliding,\n onScrollStart,\n scrollWithTiming,\n ],\n );\n\n const scrollTo = React.useCallback(\n (opts: TCarouselActionOptions = {}) => {\n const { index: i, count, animated = false, onFinished } = opts;\n if (typeof i === \"number\" && i > -1) {\n to({ i, animated, onFinished });\n return;\n }\n\n if (!count)\n return;\n\n const n = Math.round(count);\n\n if (n < 0)\n prev({ count: Math.abs(n), animated, onFinished });\n\n else\n next({ count: n, animated, onFinished });\n },\n [prev, next, to],\n );\n\n return {\n next,\n prev,\n scrollTo,\n getCurrentIndex,\n getSharedIndex: () => sharedIndex.current,\n };\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import React from "react";
|
|
2
1
|
import { useSharedValue, useAnimatedReaction } from "react-native-reanimated";
|
|
3
|
-
import {
|
|
2
|
+
import { computeOffsetIfDataChanged } from "../utils/compute-offset-if-data-changed";
|
|
3
|
+
import { computeOffsetIfSizeChanged } from "../utils/compute-offset-if-size-changed";
|
|
4
4
|
import { handlerOffsetDirection } from "../utils/handleroffset-direction";
|
|
5
5
|
export function useCommonVariables(props) {
|
|
6
6
|
const {
|
|
@@ -13,16 +13,17 @@ export function useCommonVariables(props) {
|
|
|
13
13
|
loop
|
|
14
14
|
} = props;
|
|
15
15
|
const size = vertical ? height : width;
|
|
16
|
-
const validLength = dataLength - 1;
|
|
17
16
|
const defaultHandlerOffsetValue = -Math.abs(defaultIndex * size);
|
|
18
17
|
|
|
19
18
|
const _handlerOffset = useSharedValue(defaultHandlerOffsetValue);
|
|
20
19
|
|
|
21
20
|
const handlerOffset = defaultScrollOffsetValue !== null && defaultScrollOffsetValue !== void 0 ? defaultScrollOffsetValue : _handlerOffset;
|
|
22
21
|
const prevDataLength = useSharedValue(dataLength);
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
const prevSize = useSharedValue(size);
|
|
23
|
+
/**
|
|
24
|
+
* When data changes, we need to compute new index for handlerOffset
|
|
25
|
+
*/
|
|
26
|
+
|
|
26
27
|
useAnimatedReaction(() => {
|
|
27
28
|
const previousLength = prevDataLength.value;
|
|
28
29
|
const currentLength = dataLength;
|
|
@@ -44,7 +45,7 @@ export function useCommonVariables(props) {
|
|
|
44
45
|
if (shouldComputed) {
|
|
45
46
|
// direction -> 1 | -1
|
|
46
47
|
const direction = handlerOffsetDirection(handlerOffset);
|
|
47
|
-
handlerOffset.value =
|
|
48
|
+
handlerOffset.value = computeOffsetIfDataChanged({
|
|
48
49
|
direction,
|
|
49
50
|
previousLength,
|
|
50
51
|
currentLength,
|
|
@@ -53,9 +54,38 @@ export function useCommonVariables(props) {
|
|
|
53
54
|
});
|
|
54
55
|
}
|
|
55
56
|
}, [dataLength, loop]);
|
|
57
|
+
/**
|
|
58
|
+
* When size changes, we need to compute new index for handlerOffset
|
|
59
|
+
*/
|
|
60
|
+
|
|
61
|
+
useAnimatedReaction(() => {
|
|
62
|
+
const previousSize = prevSize.value;
|
|
63
|
+
const isSizeChanged = previousSize !== size;
|
|
64
|
+
const shouldComputed = isSizeChanged;
|
|
65
|
+
if (shouldComputed) prevSize.value = size;
|
|
66
|
+
return {
|
|
67
|
+
shouldComputed,
|
|
68
|
+
previousSize,
|
|
69
|
+
size
|
|
70
|
+
};
|
|
71
|
+
}, _ref2 => {
|
|
72
|
+
let {
|
|
73
|
+
shouldComputed,
|
|
74
|
+
previousSize,
|
|
75
|
+
size
|
|
76
|
+
} = _ref2;
|
|
77
|
+
|
|
78
|
+
if (shouldComputed) {
|
|
79
|
+
handlerOffset.value = computeOffsetIfSizeChanged({
|
|
80
|
+
handlerOffset: handlerOffset.value,
|
|
81
|
+
prevSize: previousSize,
|
|
82
|
+
size
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}, [size]);
|
|
56
86
|
return {
|
|
57
87
|
size,
|
|
58
|
-
validLength,
|
|
88
|
+
validLength: dataLength - 1,
|
|
59
89
|
handlerOffset
|
|
60
90
|
};
|
|
61
91
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useCommonVariables.ts"],"names":["
|
|
1
|
+
{"version":3,"sources":["useCommonVariables.ts"],"names":["useSharedValue","useAnimatedReaction","computeOffsetIfDataChanged","computeOffsetIfSizeChanged","handlerOffsetDirection","useCommonVariables","props","vertical","height","width","dataLength","defaultIndex","defaultScrollOffsetValue","loop","size","defaultHandlerOffsetValue","Math","abs","_handlerOffset","handlerOffset","prevDataLength","prevSize","previousLength","value","currentLength","isLengthChanged","shouldComputed","direction","previousSize","isSizeChanged","validLength"],"mappings":"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","sourcesContent":["import type Animated from \"react-native-reanimated\";\nimport { useSharedValue, useAnimatedReaction } from \"react-native-reanimated\";\n\nimport type { TInitializeCarouselProps } from \"./useInitProps\";\n\nimport { computeOffsetIfDataChanged } from \"../utils/compute-offset-if-data-changed\";\nimport { computeOffsetIfSizeChanged } from \"../utils/compute-offset-if-size-changed\";\nimport { handlerOffsetDirection } from \"../utils/handleroffset-direction\";\n\ninterface ICommonVariables {\n size: number\n validLength: number\n handlerOffset: Animated.SharedValue<number>\n}\n\nexport function useCommonVariables(\n props: TInitializeCarouselProps<any>,\n): ICommonVariables {\n const {\n vertical,\n height,\n width,\n dataLength,\n defaultIndex,\n defaultScrollOffsetValue,\n loop,\n } = props;\n const size = vertical ? height : width;\n const defaultHandlerOffsetValue = -Math.abs(defaultIndex * size);\n const _handlerOffset = useSharedValue<number>(defaultHandlerOffsetValue);\n const handlerOffset = defaultScrollOffsetValue ?? _handlerOffset;\n const prevDataLength = useSharedValue(dataLength);\n const prevSize = useSharedValue(size);\n\n /**\n * When data changes, we need to compute new index for handlerOffset\n */\n useAnimatedReaction(() => {\n const previousLength = prevDataLength.value;\n const currentLength = dataLength;\n const isLengthChanged = previousLength !== currentLength;\n const shouldComputed = (isLengthChanged && loop);\n\n if (shouldComputed)\n prevDataLength.value = dataLength;\n\n return {\n shouldComputed,\n previousLength,\n currentLength,\n };\n }, ({ shouldComputed, previousLength, currentLength }) => {\n if (shouldComputed) {\n // direction -> 1 | -1\n const direction = handlerOffsetDirection(handlerOffset);\n\n handlerOffset.value = computeOffsetIfDataChanged({\n direction,\n previousLength,\n currentLength,\n size,\n handlerOffset: handlerOffset.value,\n });\n }\n }, [dataLength, loop]);\n\n /**\n * When size changes, we need to compute new index for handlerOffset\n */\n useAnimatedReaction(() => {\n const previousSize = prevSize.value;\n const isSizeChanged = previousSize !== size;\n const shouldComputed = isSizeChanged;\n\n if (shouldComputed)\n prevSize.value = size;\n\n return {\n shouldComputed,\n previousSize,\n size,\n };\n }, ({ shouldComputed, previousSize, size }) => {\n if (shouldComputed) {\n handlerOffset.value = computeOffsetIfSizeChanged({\n handlerOffset: handlerOffset.value,\n prevSize: previousSize,\n size,\n });\n }\n }, [size]);\n\n return {\n size,\n validLength: dataLength - 1,\n handlerOffset,\n };\n}\n"]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { renderHook } from "@testing-library/react-hooks";
|
|
2
|
+
import { useCommonVariables } from "./useCommonVariables";
|
|
3
|
+
const input = {
|
|
4
|
+
vertical: false,
|
|
5
|
+
width: 700,
|
|
6
|
+
height: 350,
|
|
7
|
+
loop: true,
|
|
8
|
+
enabled: true,
|
|
9
|
+
testID: "xxx",
|
|
10
|
+
style: {
|
|
11
|
+
width: "100%"
|
|
12
|
+
},
|
|
13
|
+
autoPlay: false,
|
|
14
|
+
autoPlayInterval: 2000,
|
|
15
|
+
data: [0, 1, 2, 3],
|
|
16
|
+
pagingEnabled: true,
|
|
17
|
+
defaultIndex: 0,
|
|
18
|
+
autoFillData: true,
|
|
19
|
+
dataLength: 4,
|
|
20
|
+
rawData: [0, 1, 2, 3],
|
|
21
|
+
rawDataLength: 4,
|
|
22
|
+
scrollAnimationDuration: 500,
|
|
23
|
+
snapEnabled: true,
|
|
24
|
+
overscrollEnabled: true
|
|
25
|
+
};
|
|
26
|
+
describe("useCommonVariables", () => {
|
|
27
|
+
it("should return the correct values", async () => {
|
|
28
|
+
const hook = renderHook(() => useCommonVariables(input));
|
|
29
|
+
expect(hook.result.current.size).toMatchInlineSnapshot("700");
|
|
30
|
+
expect(hook.result.current.validLength).toMatchInlineSnapshot("3");
|
|
31
|
+
expect(hook.result.current.handlerOffset.value).toMatchInlineSnapshot("-0");
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=useCommonVariables.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["useCommonVariables.test.tsx"],"names":["renderHook","useCommonVariables","input","vertical","width","height","loop","enabled","testID","style","autoPlay","autoPlayInterval","data","pagingEnabled","defaultIndex","autoFillData","dataLength","rawData","rawDataLength","scrollAnimationDuration","snapEnabled","overscrollEnabled","describe","it","hook","expect","result","current","size","toMatchInlineSnapshot","validLength","handlerOffset","value"],"mappings":"AAAA,SAASA,UAAT,QAA2B,8BAA3B;AAEA,SAASC,kBAAT,QAAmC,sBAAnC;AAIA,MAAMC,KAAK,GAAG;AACZC,EAAAA,QAAQ,EAAE,KADE;AAEZC,EAAAA,KAAK,EAAE,GAFK;AAGZC,EAAAA,MAAM,EAAE,GAHI;AAIZC,EAAAA,IAAI,EAAE,IAJM;AAKZC,EAAAA,OAAO,EAAE,IALG;AAMZC,EAAAA,MAAM,EAAE,KANI;AAOZC,EAAAA,KAAK,EAAE;AACLL,IAAAA,KAAK,EAAE;AADF,GAPK;AAUZM,EAAAA,QAAQ,EAAE,KAVE;AAWZC,EAAAA,gBAAgB,EAAE,IAXN;AAYZC,EAAAA,IAAI,EAAE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CAZM;AAaZC,EAAAA,aAAa,EAAE,IAbH;AAcZC,EAAAA,YAAY,EAAE,CAdF;AAeZC,EAAAA,YAAY,EAAE,IAfF;AAgBZC,EAAAA,UAAU,EAAE,CAhBA;AAiBZC,EAAAA,OAAO,EAAE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CAjBG;AAkBZC,EAAAA,aAAa,EAAE,CAlBH;AAmBZC,EAAAA,uBAAuB,EAAE,GAnBb;AAoBZC,EAAAA,WAAW,EAAE,IApBD;AAqBZC,EAAAA,iBAAiB,EAAE;AArBP,CAAd;AAwBAC,QAAQ,CAAC,oBAAD,EAAuB,MAAM;AACnCC,EAAAA,EAAE,CAAC,kCAAD,EAAqC,YAAY;AACjD,UAAMC,IAAI,GAAGxB,UAAU,CAAC,MAAMC,kBAAkB,CAACC,KAAD,CAAzB,CAAvB;AAEAuB,IAAAA,MAAM,CAACD,IAAI,CAACE,MAAL,CAAYC,OAAZ,CAAoBC,IAArB,CAAN,CAAiCC,qBAAjC,CAAuD,KAAvD;AACAJ,IAAAA,MAAM,CAACD,IAAI,CAACE,MAAL,CAAYC,OAAZ,CAAoBG,WAArB,CAAN,CAAwCD,qBAAxC,CAA8D,GAA9D;AACAJ,IAAAA,MAAM,CAACD,IAAI,CAACE,MAAL,CAAYC,OAAZ,CAAoBI,aAApB,CAAkCC,KAAnC,CAAN,CAAgDH,qBAAhD,CACE,IADF;AAGD,GARC,CAAF;AASD,CAVO,CAAR","sourcesContent":["import { renderHook } from \"@testing-library/react-hooks\";\n\nimport { useCommonVariables } from \"./useCommonVariables\";\n\ntype UseCommonVariablesInput = Parameters<typeof useCommonVariables>[0];\n\nconst input = {\n vertical: false,\n width: 700,\n height: 350,\n loop: true,\n enabled: true,\n testID: \"xxx\",\n style: {\n width: \"100%\",\n },\n autoPlay: false,\n autoPlayInterval: 2000,\n data: [0, 1, 2, 3],\n pagingEnabled: true,\n defaultIndex: 0,\n autoFillData: true,\n dataLength: 4,\n rawData: [0, 1, 2, 3],\n rawDataLength: 4,\n scrollAnimationDuration: 500,\n snapEnabled: true,\n overscrollEnabled: true,\n} as unknown as UseCommonVariablesInput;\n\ndescribe(\"useCommonVariables\", () => {\n it(\"should return the correct values\", async () => {\n const hook = renderHook(() => useCommonVariables(input));\n\n expect(hook.result.current.size).toMatchInlineSnapshot(\"700\");\n expect(hook.result.current.validLength).toMatchInlineSnapshot(\"3\");\n expect(hook.result.current.handlerOffset.value).toMatchInlineSnapshot(\n \"-0\",\n );\n });\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useLayoutConfig.ts"],"names":["React","Layouts","useLayoutConfig","opts","size","vertical","useMemo","baseConfig","mode","parallax","modeConfig","horizontalStack","verticalStack","normal"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;
|
|
1
|
+
{"version":3,"sources":["useLayoutConfig.ts"],"names":["React","Layouts","useLayoutConfig","opts","size","vertical","useMemo","baseConfig","mode","parallax","modeConfig","horizontalStack","verticalStack","normal"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AAKA,SAASC,OAAT,QAAwB,YAAxB;AAIA,OAAO,SAASC,eAAT,CACLC,IADK,EAEY;AACjB,QAAM;AAAEC,IAAAA,IAAF;AAAQC,IAAAA;AAAR,MAAqBF,IAA3B;AAEA,SAAOH,KAAK,CAACM,OAAN,CAAc,MAAM;AACzB,UAAMC,UAAU,GAAG;AAAEH,MAAAA,IAAF;AAAQC,MAAAA;AAAR,KAAnB;;AACA,YAAQF,IAAI,CAACK,IAAb;AACE,WAAK,UAAL;AACE,eAAOP,OAAO,CAACQ,QAAR,CAAiBF,UAAjB,EAA6BJ,IAAI,CAACO,UAAlC,CAAP;;AACF,WAAK,kBAAL;AACE,eAAOT,OAAO,CAACU,eAAR,CAAwBR,IAAI,CAACO,UAA7B,CAAP;;AACF,WAAK,gBAAL;AACE,eAAOT,OAAO,CAACW,aAAR,CAAsBT,IAAI,CAACO,UAA3B,CAAP;;AACF;AACE,eAAOT,OAAO,CAACY,MAAR,CAAeN,UAAf,CAAP;AARJ;AAUD,GAZM,EAYJ,CAACJ,IAAI,CAACK,IAAN,EAAYL,IAAI,CAACO,UAAjB,EAA6BN,IAA7B,EAAmCC,QAAnC,CAZI,CAAP;AAaD","sourcesContent":["import React from \"react\";\n\nimport type { TInitializeCarouselProps } from \"./useInitProps\";\n\nimport type { TAnimationStyle } from \"../components/BaseLayout\";\nimport { Layouts } from \"../layouts\";\n\ntype TLayoutConfigOpts<T> = TInitializeCarouselProps<T> & { size: number };\n\nexport function useLayoutConfig<T>(\n opts: TLayoutConfigOpts<T>,\n): TAnimationStyle {\n const { size, vertical } = opts as Required<TLayoutConfigOpts<T>>;\n\n return React.useMemo(() => {\n const baseConfig = { size, vertical };\n switch (opts.mode) {\n case \"parallax\":\n return Layouts.parallax(baseConfig, opts.modeConfig);\n case \"horizontal-stack\":\n return Layouts.horizontalStack(opts.modeConfig);\n case \"vertical-stack\":\n return Layouts.verticalStack(opts.modeConfig);\n default:\n return Layouts.normal(baseConfig);\n }\n }, [opts.mode, opts.modeConfig, size, vertical]);\n}\n"]}
|
|
@@ -24,15 +24,18 @@ export const useOffsetX = (opts, visibleRanges) => {
|
|
|
24
24
|
negativeRange,
|
|
25
25
|
positiveRange
|
|
26
26
|
} = visibleRanges.value;
|
|
27
|
-
if ((index < negativeRange[0] || index > negativeRange[1]) && (index < positiveRange[0] || index > positiveRange[1])) return Number.MAX_SAFE_INTEGER;
|
|
28
27
|
|
|
29
|
-
if (
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
28
|
+
if (index >= negativeRange[0] && index <= negativeRange[1] || index >= positiveRange[0] && index <= positiveRange[1]) {
|
|
29
|
+
if (loop) {
|
|
30
|
+
const inputRange = [-TOTAL_WIDTH, MIN - HALF_WIDTH - startPos - Number.MIN_VALUE, MIN - HALF_WIDTH - startPos, 0, MAX + HALF_WIDTH - startPos, MAX + HALF_WIDTH - startPos + Number.MIN_VALUE, TOTAL_WIDTH];
|
|
31
|
+
const outputRange = [startPos, MAX + HALF_WIDTH - Number.MIN_VALUE, MIN - HALF_WIDTH, startPos, MAX + HALF_WIDTH, MIN - HALF_WIDTH + Number.MIN_VALUE, startPos];
|
|
32
|
+
return interpolate(handlerOffset.value, inputRange, outputRange, Extrapolate.CLAMP);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return handlerOffset.value + size * index;
|
|
33
36
|
}
|
|
34
37
|
|
|
35
|
-
return
|
|
38
|
+
return Number.MAX_SAFE_INTEGER;
|
|
36
39
|
}, [loop, dataLength, viewCount, type, size, visibleRanges]);
|
|
37
40
|
return x;
|
|
38
41
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useOffsetX.ts"],"names":["Extrapolate","interpolate","useDerivedValue","useOffsetX","opts","visibleRanges","handlerOffset","index","size","loop","dataLength","type","viewCount","_viewCount","ITEM_LENGTH","VALID_LENGTH","TOTAL_WIDTH","HALF_WIDTH","Math","round","positiveCount","startPos","MAX","MIN","x","negativeRange","positiveRange","value","
|
|
1
|
+
{"version":3,"sources":["useOffsetX.ts"],"names":["Extrapolate","interpolate","useDerivedValue","useOffsetX","opts","visibleRanges","handlerOffset","index","size","loop","dataLength","type","viewCount","_viewCount","ITEM_LENGTH","VALID_LENGTH","TOTAL_WIDTH","HALF_WIDTH","Math","round","positiveCount","startPos","MAX","MIN","x","negativeRange","positiveRange","value","inputRange","Number","MIN_VALUE","outputRange","CLAMP","MAX_SAFE_INTEGER"],"mappings":"AACA,SACEA,WADF,EAEEC,WAFF,EAGEC,eAHF,QAIO,yBAJP;AAkBA,OAAO,MAAMC,UAAU,GAAG,CAACC,IAAD,EAAcC,aAAd,KAAgD;AACxE,QAAM;AACJC,IAAAA,aADI;AAEJC,IAAAA,KAFI;AAGJC,IAAAA,IAHI;AAIJC,IAAAA,IAJI;AAKJC,IAAAA,UALI;AAMJC,IAAAA,IAAI,GAAG,UANH;AAOJC,IAAAA,SAAS,EAAEC;AAPP,MAQFT,IARJ;AAUA,QAAMU,WAAW,GAAGJ,UAApB;AACA,QAAMK,YAAY,GAAGD,WAAW,GAAG,CAAnC;AACA,QAAME,WAAW,GAAGR,IAAI,GAAGM,WAA3B;AACA,QAAMG,UAAU,GAAG,MAAMT,IAAzB;AAEA,QAAMI,SAAS,GAAGC,UAAH,aAAGA,UAAH,cAAGA,UAAH,GAAiBK,IAAI,CAACC,KAAL,CAAW,CAACL,WAAW,GAAG,CAAf,IAAoB,CAA/B,CAAhC;AACA,QAAMM,aAAa,GACfT,IAAI,KAAK,UAAT,GAAsBC,SAAtB,GAAkCG,YAAY,GAAGH,SADrD;AAGA,MAAIS,QAAQ,GAAGb,IAAI,GAAGD,KAAtB;AACA,MAAIA,KAAK,GAAGa,aAAZ,EACEC,QAAQ,GAAG,CAACd,KAAK,GAAGO,WAAT,IAAwBN,IAAnC;AAEF,QAAMc,GAAG,GAAGF,aAAa,GAAGZ,IAA5B;AACA,QAAMe,GAAG,GAAG,EAAE,CAACR,YAAY,GAAGK,aAAhB,IAAiCZ,IAAnC,CAAZ;AAEA,QAAMgB,CAAC,GAAGtB,eAAe,CAAC,MAAM;AAC9B,UAAM;AAAEuB,MAAAA,aAAF;AAAiBC,MAAAA;AAAjB,QAAmCrB,aAAa,CAACsB,KAAvD;;AAEA,QACGpB,KAAK,IAAIkB,aAAa,CAAC,CAAD,CAAtB,IAA6BlB,KAAK,IAAIkB,aAAa,CAAC,CAAD,CAApD,IACIlB,KAAK,IAAImB,aAAa,CAAC,CAAD,CAAtB,IAA6BnB,KAAK,IAAImB,aAAa,CAAC,CAAD,CAFzD,EAGE;AACA,UAAIjB,IAAJ,EAAU;AACR,cAAMmB,UAAU,GAAG,CACjB,CAACZ,WADgB,EAEjBO,GAAG,GAAGN,UAAN,GAAmBI,QAAnB,GAA8BQ,MAAM,CAACC,SAFpB,EAGjBP,GAAG,GAAGN,UAAN,GAAmBI,QAHF,EAIjB,CAJiB,EAKjBC,GAAG,GAAGL,UAAN,GAAmBI,QALF,EAMjBC,GAAG,GAAGL,UAAN,GAAmBI,QAAnB,GAA8BQ,MAAM,CAACC,SANpB,EAOjBd,WAPiB,CAAnB;AAUA,cAAMe,WAAW,GAAG,CAClBV,QADkB,EAElBC,GAAG,GAAGL,UAAN,GAAmBY,MAAM,CAACC,SAFR,EAGlBP,GAAG,GAAGN,UAHY,EAIlBI,QAJkB,EAKlBC,GAAG,GAAGL,UALY,EAMlBM,GAAG,GAAGN,UAAN,GAAmBY,MAAM,CAACC,SANR,EAOlBT,QAPkB,CAApB;AAUA,eAAOpB,WAAW,CAChBK,aAAa,CAACqB,KADE,EAEhBC,UAFgB,EAGhBG,WAHgB,EAIhB/B,WAAW,CAACgC,KAJI,CAAlB;AAMD;;AAED,aAAO1B,aAAa,CAACqB,KAAd,GAAsBnB,IAAI,GAAGD,KAApC;AACD;;AAED,WAAOsB,MAAM,CAACI,gBAAd;AACD,GAxCwB,EAwCtB,CAACxB,IAAD,EAAOC,UAAP,EAAmBE,SAAnB,EAA8BD,IAA9B,EAAoCH,IAApC,EAA0CH,aAA1C,CAxCsB,CAAzB;AA0CA,SAAOmB,CAAP;AACD,CAtEM","sourcesContent":["import type Animated from \"react-native-reanimated\";\nimport {\n Extrapolate,\n interpolate,\n useDerivedValue,\n} from \"react-native-reanimated\";\n\nimport type { IVisibleRanges } from \"./useVisibleRanges\";\n\nexport interface IOpts {\n index: number\n size: number\n handlerOffset: Animated.SharedValue<number>\n dataLength: number\n type?: \"positive\" | \"negative\"\n viewCount?: number\n loop?: boolean\n}\n\nexport const useOffsetX = (opts: IOpts, visibleRanges: IVisibleRanges) => {\n const {\n handlerOffset,\n index,\n size,\n loop,\n dataLength,\n type = \"positive\",\n viewCount: _viewCount,\n } = opts;\n\n const ITEM_LENGTH = dataLength;\n const VALID_LENGTH = ITEM_LENGTH - 1;\n const TOTAL_WIDTH = size * ITEM_LENGTH;\n const HALF_WIDTH = 0.5 * size;\n\n const viewCount = _viewCount ?? Math.round((ITEM_LENGTH - 1) / 2);\n const positiveCount\n = type === \"positive\" ? viewCount : VALID_LENGTH - viewCount;\n\n let startPos = size * index;\n if (index > positiveCount)\n startPos = (index - ITEM_LENGTH) * size;\n\n const MAX = positiveCount * size;\n const MIN = -((VALID_LENGTH - positiveCount) * size);\n\n const x = useDerivedValue(() => {\n const { negativeRange, positiveRange } = visibleRanges.value;\n\n if (\n (index >= negativeRange[0] && index <= negativeRange[1])\n || (index >= positiveRange[0] && index <= positiveRange[1])\n ) {\n if (loop) {\n const inputRange = [\n -TOTAL_WIDTH,\n MIN - HALF_WIDTH - startPos - Number.MIN_VALUE,\n MIN - HALF_WIDTH - startPos,\n 0,\n MAX + HALF_WIDTH - startPos,\n MAX + HALF_WIDTH - startPos + Number.MIN_VALUE,\n TOTAL_WIDTH,\n ];\n\n const outputRange = [\n startPos,\n MAX + HALF_WIDTH - Number.MIN_VALUE,\n MIN - HALF_WIDTH,\n startPos,\n MAX + HALF_WIDTH,\n MIN - HALF_WIDTH + Number.MIN_VALUE,\n startPos,\n ];\n\n return interpolate(\n handlerOffset.value,\n inputRange,\n outputRange,\n Extrapolate.CLAMP,\n );\n }\n\n return handlerOffset.value + size * index;\n }\n\n return Number.MAX_SAFE_INTEGER;\n }, [loop, dataLength, viewCount, type, size, visibleRanges]);\n\n return x;\n};\n"]}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { useSharedValue } from "react-native-reanimated";
|
|
2
|
+
import { renderHook } from "@testing-library/react-hooks";
|
|
3
|
+
import { useOffsetX } from "./useOffsetX";
|
|
4
|
+
describe("useSharedValue", () => {
|
|
5
|
+
it("should return the correct values", async () => {
|
|
6
|
+
const hook = renderHook(() => {
|
|
7
|
+
const range = useSharedValue({
|
|
8
|
+
negativeRange: [7, 9],
|
|
9
|
+
positiveRange: [0, 3]
|
|
10
|
+
});
|
|
11
|
+
const inputs = Array.from({
|
|
12
|
+
length: 10
|
|
13
|
+
}).map((_, index) => ({
|
|
14
|
+
config: {
|
|
15
|
+
dataLength: 10,
|
|
16
|
+
handlerOffset: useSharedValue(-0),
|
|
17
|
+
index,
|
|
18
|
+
loop: false,
|
|
19
|
+
size: 393
|
|
20
|
+
},
|
|
21
|
+
range
|
|
22
|
+
}));
|
|
23
|
+
return inputs.map(input => {
|
|
24
|
+
const {
|
|
25
|
+
config,
|
|
26
|
+
range
|
|
27
|
+
} = input;
|
|
28
|
+
return useOffsetX(config, range);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
const expected = hook.result.current.map(v => v.value).slice();
|
|
32
|
+
expect(expected).toMatchInlineSnapshot(`
|
|
33
|
+
[
|
|
34
|
+
0,
|
|
35
|
+
393,
|
|
36
|
+
786,
|
|
37
|
+
1179,
|
|
38
|
+
9007199254740991,
|
|
39
|
+
9007199254740991,
|
|
40
|
+
9007199254740991,
|
|
41
|
+
2751,
|
|
42
|
+
3144,
|
|
43
|
+
3537,
|
|
44
|
+
]
|
|
45
|
+
`);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=useOffsetX.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["useOffsetX.test.ts"],"names":["useSharedValue","renderHook","useOffsetX","describe","it","hook","range","negativeRange","positiveRange","inputs","Array","from","length","map","_","index","config","dataLength","handlerOffset","loop","size","input","expected","result","current","v","value","slice","expect","toMatchInlineSnapshot"],"mappings":"AAAA,SAASA,cAAT,QAA+B,yBAA/B;AAEA,SAASC,UAAT,QAA2B,8BAA3B;AAGA,SAASC,UAAT,QAA2B,cAA3B;AAGAC,QAAQ,CAAC,gBAAD,EAAmB,MAAM;AAC/BC,EAAAA,EAAE,CAAC,kCAAD,EAAqC,YAAY;AACjD,UAAMC,IAAI,GAAGJ,UAAU,CAAC,MAAM;AAC5B,YAAMK,KAAK,GAAGN,cAAc,CAAC;AAC3BO,QAAAA,aAAa,EAAE,CAAC,CAAD,EAAI,CAAJ,CADY;AAE3BC,QAAAA,aAAa,EAAE,CAAC,CAAD,EAAI,CAAJ;AAFY,OAAD,CAA5B;AAIA,YAAMC,MAGJ,GAAGC,KAAK,CAACC,IAAN,CAAW;AAAEC,QAAAA,MAAM,EAAE;AAAV,OAAX,EAA2BC,GAA3B,CAA+B,CAACC,CAAD,EAAIC,KAAJ,MAAe;AACjDC,QAAAA,MAAM,EAAE;AACNC,UAAAA,UAAU,EAAE,EADN;AAENC,UAAAA,aAAa,EAAElB,cAAc,CAAC,CAAC,CAAF,CAFvB;AAGNe,UAAAA,KAHM;AAINI,UAAAA,IAAI,EAAE,KAJA;AAKNC,UAAAA,IAAI,EAAE;AALA,SADyC;AAQjDd,QAAAA;AARiD,OAAf,CAA/B,CAHL;AAcA,aAAOG,MAAM,CAACI,GAAP,CAAYQ,KAAD,IAAW;AAC3B,cAAM;AAAEL,UAAAA,MAAF;AAAUV,UAAAA;AAAV,YAAoBe,KAA1B;AAEA,eAAOnB,UAAU,CAACc,MAAD,EAASV,KAAT,CAAjB;AACD,OAJM,CAAP;AAKD,KAxBsB,CAAvB;AA0BA,UAAMgB,QAAQ,GAAGjB,IAAI,CAACkB,MAAL,CAAYC,OAAZ,CAAoBX,GAApB,CAAwBY,CAAC,IAAIA,CAAC,CAACC,KAA/B,EAAsCC,KAAtC,EAAjB;AAEAC,IAAAA,MAAM,CAACN,QAAD,CAAN,CAAiBO,qBAAjB,CAAwC;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAbI;AAcD,GA3CC,CAAF;AA4CD,CA7CO,CAAR","sourcesContent":["import { useSharedValue } from \"react-native-reanimated\";\n\nimport { renderHook } from \"@testing-library/react-hooks\";\n\nimport type { IOpts } from \"./useOffsetX\";\nimport { useOffsetX } from \"./useOffsetX\";\nimport type { IVisibleRanges } from \"./useVisibleRanges\";\n\ndescribe(\"useSharedValue\", () => {\n it(\"should return the correct values\", async () => {\n const hook = renderHook(() => {\n const range = useSharedValue({\n negativeRange: [7, 9],\n positiveRange: [0, 3],\n }) as IVisibleRanges;\n const inputs: Array<{\n config: IOpts\n range: IVisibleRanges\n }> = Array.from({ length: 10 }).map((_, index) => ({\n config: {\n dataLength: 10,\n handlerOffset: useSharedValue(-0),\n index,\n loop: false,\n size: 393,\n },\n range,\n }));\n\n return inputs.map((input) => {\n const { config, range } = input;\n\n return useOffsetX(config, range);\n });\n });\n\n const expected = hook.result.current.map(v => v.value).slice();\n\n expect(expected).toMatchInlineSnapshot(`\n [\n 0,\n 393,\n 786,\n 1179,\n 9007199254740991,\n 9007199254740991,\n 9007199254740991,\n 2751,\n 3144,\n 3537,\n ]\n `);\n });\n});\n"]}
|