react-native-reanimated-carousel 3.3.2 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -50,6 +50,8 @@ English | [简体中文](./README.zh-CN.md)
50
50
  | <a href="./exampleExpo/src/pages/cube-3d/index.tsx">cube-3d</a> | <a href="./exampleExpo/src/pages/blur-parallax/index.tsx">blur-parallax</a> | <a href="./exampleExpo/src/pages/curve/index.tsx">curve</a> |
51
51
  | <img src="assets/parallax-layers.gif"/> | <img src="assets/stack-cards.gif"/> | <img src="assets/flow.gif"/> |
52
52
  | <a href="./exampleExpo/src/pages/parallax-layers/index.tsx">parallax-layers</a> | <a href="./exampleExpo/src/stack-cards/index.tsx">stack-cards</a> | <a href="./exampleExpo/src/pages/flow/index.tsx">flow</a> |
53
+ | <img src="assets/blur-rotate.gif"/> | ||
54
+ | <a href="./exampleExpo/src/pages/blur-rotate/index.tsx">blur-rotate</a> | | |
53
55
 
54
56
  ## Table of contents
55
57
 
package/README.zh-CN.md CHANGED
@@ -49,6 +49,8 @@
49
49
  | <a href="./exampleExpo/src/pages/cube-3d/index.tsx">cube-3d</a> | <a href="./exampleExpo/src/pages/blur-parallax/index.tsx">blur-parallax</a> | <a href="./exampleExpo/src/pages/curve/index.tsx">curve</a> |
50
50
  | <img src="assets/parallax-layers.gif"/> | <img src="assets/stack-cards.gif"/> | <img src="assets/flow.gif"/> |
51
51
  | <a href="./exampleExpo/src/pages/parallax-layers/index.tsx">parallax-layers</a> | <a href="./exampleExpo/src/pages/stack-cards/index.tsx">stack-cards</a> | <a href="./exampleExpo/src/pages/flow/index.tsx">flow</a> |
52
+ | <img src="assets/blur-rotate.gif"/> | | |
53
+ | <a href="./exampleExpo/src/pages/blur-rotate/index.tsx">blur-rotate</a> | | |
52
54
 
53
55
  ## 目录
54
56
 
@@ -1,2 +1,2 @@
1
- var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.ScrollViewGesture=void 0;var _extends2=_interopRequireDefault(require("@babel/runtime/helpers/extends"));var _react=_interopRequireDefault(require("react"));var _reactNativeGestureHandler=require("react-native-gesture-handler");var _reactNativeReanimated=_interopRequireWildcard(require("react-native-reanimated"));var _constants=require("./constants");var _store=require("./store");var _dealWithAnimation=require("./utils/dealWithAnimation");var _this=this,_jsxFileName="/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/ScrollViewGesture.tsx";function _getRequireWildcardCache(nodeInterop){if(typeof WeakMap!=="function")return null;var cacheBabelInterop=new WeakMap();var cacheNodeInterop=new WeakMap();return(_getRequireWildcardCache=function _getRequireWildcardCache(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop;})(nodeInterop);}function _interopRequireWildcard(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule){return obj;}if(obj===null||typeof obj!=="object"&&typeof obj!=="function"){return{default:obj};}var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj)){return cache.get(obj);}var newObj={};var hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj){if(key!=="default"&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;if(desc&&(desc.get||desc.set)){Object.defineProperty(newObj,key,desc);}else{newObj[key]=obj[key];}}}newObj.default=obj;if(cache){cache.set(obj,newObj);}return newObj;}var IScrollViewGesture=function IScrollViewGesture(props){var _React$useContext=_react.default.useContext(_store.CTX),_React$useContext$pro=_React$useContext.props,vertical=_React$useContext$pro.vertical,pagingEnabled=_React$useContext$pro.pagingEnabled,snapEnabled=_React$useContext$pro.snapEnabled,panGestureHandlerProps=_React$useContext$pro.panGestureHandlerProps,infinite=_React$useContext$pro.loop,scrollAnimationDuration=_React$useContext$pro.scrollAnimationDuration,withAnimation=_React$useContext$pro.withAnimation,enabled=_React$useContext$pro.enabled,dataLength=_React$useContext$pro.dataLength,overscrollEnabled=_React$useContext$pro.overscrollEnabled;var size=props.size,translation=props.translation,testID=props.testID,_props$style=props.style,style=_props$style===void 0?{}:_props$style,onScrollBegin=props.onScrollBegin,onScrollEnd=props.onScrollEnd,onTouchBegin=props.onTouchBegin,onTouchEnd=props.onTouchEnd;var maxPage=dataLength;var isHorizontal=(0,_reactNativeReanimated.useDerivedValue)(function(){var _f=function _f(){return!vertical;};_f._closure={vertical:vertical};_f.asString="function _f(){const{vertical}=jsThis._closure;{return!vertical;}}";_f.__workletHash=14495821007639;_f.__location="/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/ScrollViewGesture.tsx (70:39)";return _f;}(),[vertical]);var touching=(0,_reactNativeReanimated.useSharedValue)(false);var scrollEndTranslation=(0,_reactNativeReanimated.useSharedValue)(0);var scrollEndVelocity=(0,_reactNativeReanimated.useSharedValue)(0);var containerRef=(0,_reactNativeReanimated.useAnimatedRef)();var getLimit=_react.default.useCallback(function(){var _f=function _f(){if(!infinite&&!overscrollEnabled){var _measure=(0,_reactNativeReanimated.measure)(containerRef),_measure$width=_measure.width,containerWidth=_measure$width===void 0?0:_measure$width;if(dataLength*size<containerWidth)return 0;return dataLength*size-containerWidth;}return dataLength*size;};_f._closure={infinite:infinite,overscrollEnabled:overscrollEnabled,measure:_reactNativeReanimated.measure,containerRef:containerRef,dataLength:dataLength,size:size};_f.asString="function _f(){const{infinite,overscrollEnabled,measure,containerRef,dataLength,size}=jsThis._closure;{if(!infinite&&!overscrollEnabled){const{width:containerWidth=0}=measure(containerRef);if(dataLength*size<containerWidth)return 0;return dataLength*size-containerWidth;}return dataLength*size;}}";_f.__workletHash=11841077662563;_f.__location="/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/ScrollViewGesture.tsx (77:37)";return _f;}(),[infinite,size,dataLength,overscrollEnabled]);var withSpring=_react.default.useCallback(function(){var _f=function _f(toValue,onFinished){var defaultWithAnimation={type:"timing",config:{duration:scrollAnimationDuration+100,easing:_constants.Easing.easeOutQuart}};return(0,_dealWithAnimation.dealWithAnimation)(withAnimation!=null?withAnimation:defaultWithAnimation)(toValue,function(){var _f=function _f(isFinished){if(isFinished)onFinished&&(0,_reactNativeReanimated.runOnJS)(onFinished)();};_f._closure={onFinished:onFinished,runOnJS:_reactNativeReanimated.runOnJS};_f.asString="function _f(isFinished){const{onFinished,runOnJS}=jsThis._closure;{if(isFinished)onFinished&&runOnJS(onFinished)();}}";_f.__workletHash=3881957308013;_f.__location="/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/ScrollViewGesture.tsx (107:8)";return _f;}());};_f._closure={scrollAnimationDuration:scrollAnimationDuration,Easing:{easeOutQuart:_constants.Easing.easeOutQuart},dealWithAnimation:_dealWithAnimation.dealWithAnimation,withAnimation:withAnimation,runOnJS:_reactNativeReanimated.runOnJS};_f.asString="function _f(toValue,onFinished){const{scrollAnimationDuration,Easing,dealWithAnimation,withAnimation,runOnJS}=jsThis._closure;{var _withAnimation;const defaultWithAnimation={type:\"timing\",config:{duration:scrollAnimationDuration+100,easing:Easing.easeOutQuart}};return dealWithAnimation((_withAnimation=withAnimation)!==null&&_withAnimation!==void 0?_withAnimation:defaultWithAnimation)(toValue,function(isFinished){\"worklet\";if(isFinished)onFinished&&runOnJS(onFinished)();});}}";_f.__workletHash=4492029393801;_f.__location="/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/ScrollViewGesture.tsx (95:4)";return _f;}(),[scrollAnimationDuration,withAnimation]);var endWithSpring=_react.default.useCallback(function(){var _f=function _f(onFinished){var origin=translation.value;var velocity=scrollEndVelocity.value;var finalTranslation=(0,_reactNativeReanimated.withDecay)({velocity:velocity,deceleration:0.999});if(pagingEnabled){var offset=-(scrollEndTranslation.value>=0?1:-1);var computed=offset<0?Math.ceil:Math.floor;var page=computed(-translation.value/size);if(infinite){var finalPage=page+offset;finalTranslation=withSpring(withProcessTranslation(-finalPage*size),onFinished);}else{var _finalPage=Math.min(maxPage-1,Math.max(0,page+offset));finalTranslation=withSpring(withProcessTranslation(-_finalPage*size),onFinished);}}if(!pagingEnabled&&snapEnabled){var nextPage=Math.round((origin+velocity*0.4)/size)*size;finalTranslation=withSpring(withProcessTranslation(nextPage),onFinished);}translation.value=finalTranslation;function withProcessTranslation(translation){if(!infinite&&!overscrollEnabled){var limit=getLimit();var sign=Math.sign(translation);return sign*Math.max(0,Math.min(limit,Math.abs(translation)));}return translation;}};_f._closure={translation:translation,scrollEndVelocity:scrollEndVelocity,withDecay:_reactNativeReanimated.withDecay,pagingEnabled:pagingEnabled,scrollEndTranslation:scrollEndTranslation,size:size,infinite:infinite,withSpring:withSpring,maxPage:maxPage,snapEnabled:snapEnabled,overscrollEnabled:overscrollEnabled,getLimit:getLimit};_f.asString="function _f(onFinished){const{translation,scrollEndVelocity,withDecay,pagingEnabled,scrollEndTranslation,size,infinite,withSpring,maxPage,snapEnabled,overscrollEnabled,getLimit}=jsThis._closure;{const origin=translation.value;const velocity=scrollEndVelocity.value;let finalTranslation=withDecay({velocity:velocity,deceleration:0.999});if(pagingEnabled){const offset=-(scrollEndTranslation.value>=0?1:-1);const computed=offset<0?Math.ceil:Math.floor;const page=computed(-translation.value/size);if(infinite){const finalPage=page+offset;finalTranslation=withSpring(withProcessTranslation(-finalPage*size),onFinished);}else{const finalPage=Math.min(maxPage-1,Math.max(0,page+offset));finalTranslation=withSpring(withProcessTranslation(-finalPage*size),onFinished);}}if(!pagingEnabled&&snapEnabled){const nextPage=Math.round((origin+velocity*0.4)/size)*size;finalTranslation=withSpring(withProcessTranslation(nextPage),onFinished);}translation.value=finalTranslation;function withProcessTranslation(translation){if(!infinite&&!overscrollEnabled){const limit=getLimit();const sign=Math.sign(translation);return sign*Math.max(0,Math.min(limit,Math.abs(translation)));}return translation;}}}";_f.__workletHash=17058811688208;_f.__location="/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/ScrollViewGesture.tsx (118:4)";return _f;}(),[translation,scrollEndVelocity.value,pagingEnabled,size,scrollEndTranslation.value,infinite,withSpring,snapEnabled,maxPage]);var onFinish=_react.default.useCallback(function(){var _f=function _f(isFinished){if(isFinished){touching.value=false;onScrollEnd&&(0,_reactNativeReanimated.runOnJS)(onScrollEnd)();}};_f._closure={touching:touching,onScrollEnd:onScrollEnd,runOnJS:_reactNativeReanimated.runOnJS};_f.asString="function _f(isFinished){const{touching,onScrollEnd,runOnJS}=jsThis._closure;{if(isFinished){touching.value=false;onScrollEnd&&runOnJS(onScrollEnd)();}}}";_f.__workletHash=12308424749737;_f.__location="/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/ScrollViewGesture.tsx (180:4)";return _f;}(),[onScrollEnd,touching]);var activeDecay=_react.default.useCallback(function(){var _f=function _f(){touching.value=true;translation.value=(0,_reactNativeReanimated.withDecay)({velocity:scrollEndVelocity.value},function(){var _f=function _f(isFinished){return onFinish(isFinished);};_f._closure={onFinish:onFinish};_f.asString="function _f(isFinished){const{onFinish}=jsThis._closure;{return onFinish(isFinished);}}";_f.__workletHash=12004837605207;_f.__location="/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/ScrollViewGesture.tsx (195:6)";return _f;}());};_f._closure={touching:touching,translation:translation,withDecay:_reactNativeReanimated.withDecay,scrollEndVelocity:scrollEndVelocity,onFinish:onFinish};_f.asString="function _f(){const{touching,translation,withDecay,scrollEndVelocity,onFinish}=jsThis._closure;{touching.value=true;translation.value=withDecay({velocity:scrollEndVelocity.value},function(isFinished){return onFinish(isFinished);});}}";_f.__workletHash=1701548878343;_f.__location="/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/ScrollViewGesture.tsx (190:40)";return _f;}(),[onFinish,scrollEndVelocity.value,touching,translation]);var resetBoundary=_react.default.useCallback(function(){var _f=function _f(){if(touching.value)return;if(translation.value>0){if(scrollEndTranslation.value<0){activeDecay();return;}if(!infinite){translation.value=withSpring(0);return;}}if(translation.value<-((maxPage-1)*size)){if(scrollEndTranslation.value>0){activeDecay();return;}if(!infinite)translation.value=withSpring(-((maxPage-1)*size));}};_f._closure={touching:touching,translation:translation,scrollEndTranslation:scrollEndTranslation,activeDecay:activeDecay,infinite:infinite,withSpring:withSpring,maxPage:maxPage,size:size};_f.asString="function _f(){const{touching,translation,scrollEndTranslation,activeDecay,infinite,withSpring,maxPage,size}=jsThis._closure;{if(touching.value)return;if(translation.value>0){if(scrollEndTranslation.value<0){activeDecay();return;}if(!infinite){translation.value=withSpring(0);return;}}if(translation.value<-((maxPage-1)*size)){if(scrollEndTranslation.value>0){activeDecay();return;}if(!infinite)translation.value=withSpring(-((maxPage-1)*size));}}}";_f.__workletHash=5584514378333;_f.__location="/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/ScrollViewGesture.tsx (199:42)";return _f;}(),[touching.value,translation,maxPage,size,scrollEndTranslation.value,infinite,activeDecay,withSpring]);(0,_reactNativeReanimated.useAnimatedReaction)(function(){var _f=function _f(){return translation.value;};_f._closure={translation:translation};_f.asString="function _f(){const{translation}=jsThis._closure;{return translation.value;}}";_f.__workletHash=9829368032147;_f.__location="/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/ScrollViewGesture.tsx (235:4)";return _f;}(),function(){var _f=function _f(){if(!pagingEnabled)resetBoundary();};_f._closure={pagingEnabled:pagingEnabled,resetBoundary:resetBoundary};_f.asString="function _f(){const{pagingEnabled,resetBoundary}=jsThis._closure;{if(!pagingEnabled)resetBoundary();}}";_f.__workletHash=3586615076030;_f.__location="/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/ScrollViewGesture.tsx (236:4)";return _f;}(),[pagingEnabled,resetBoundary]);var panGestureEventHandler=(0,_reactNativeReanimated.useAnimatedGestureHandler)({onStart:function(){var _f=function _f(_,ctx){touching.value=true;ctx.validStart=true;onScrollBegin&&(0,_reactNativeReanimated.runOnJS)(onScrollBegin)();ctx.max=(maxPage-1)*size;if(!infinite&&!overscrollEnabled)ctx.max=getLimit();ctx.panOffset=translation.value;};_f._closure={touching:touching,onScrollBegin:onScrollBegin,runOnJS:_reactNativeReanimated.runOnJS,maxPage:maxPage,size:size,infinite:infinite,overscrollEnabled:overscrollEnabled,getLimit:getLimit,translation:translation};_f.asString="function _f(_,ctx){const{touching,onScrollBegin,runOnJS,maxPage,size,infinite,overscrollEnabled,getLimit,translation}=jsThis._closure;{touching.value=true;ctx.validStart=true;onScrollBegin&&runOnJS(onScrollBegin)();ctx.max=(maxPage-1)*size;if(!infinite&&!overscrollEnabled)ctx.max=getLimit();ctx.panOffset=translation.value;}}";_f.__workletHash=3619428160497;_f.__location="/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/ScrollViewGesture.tsx (248:15)";return _f;}(),onActive:function(){var _f=function _f(e,ctx){if(ctx.validStart){ctx.validStart=false;(0,_reactNativeReanimated.cancelAnimation)(translation);}touching.value=true;var translationX=e.translationX,translationY=e.translationY;var panTranslation=isHorizontal.value?translationX:translationY;if(!infinite){if(translation.value>0||translation.value<-ctx.max){var boundary=translation.value>0?0:-ctx.max;var fixed=boundary-ctx.panOffset;var dynamic=panTranslation-fixed;translation.value=boundary+dynamic*0.5;return;}}var translationValue=ctx.panOffset+panTranslation;translation.value=translationValue;};_f._closure={cancelAnimation:_reactNativeReanimated.cancelAnimation,translation:translation,touching:touching,isHorizontal:isHorizontal,infinite:infinite};_f.asString="function _f(e,ctx){const{cancelAnimation,translation,touching,isHorizontal,infinite}=jsThis._closure;{if(ctx.validStart){ctx.validStart=false;cancelAnimation(translation);}touching.value=true;const{translationX:translationX,translationY:translationY}=e;const panTranslation=isHorizontal.value?translationX:translationY;if(!infinite){if(translation.value>0||translation.value<-ctx.max){const boundary=translation.value>0?0:-ctx.max;const fixed=boundary-ctx.panOffset;const dynamic=panTranslation-fixed;translation.value=boundary+dynamic*0.5;return;}}const translationValue=ctx.panOffset+panTranslation;translation.value=translationValue;}}";_f.__workletHash=11300048714025;_f.__location="/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/ScrollViewGesture.tsx (259:16)";return _f;}(),onEnd:function(){var _f=function _f(e){var velocityX=e.velocityX,velocityY=e.velocityY,translationX=e.translationX,translationY=e.translationY;scrollEndVelocity.value=isHorizontal.value?velocityX:velocityY;scrollEndTranslation.value=isHorizontal.value?translationX:translationY;endWithSpring(onScrollEnd);if(!infinite)touching.value=false;};_f._closure={scrollEndVelocity:scrollEndVelocity,isHorizontal:isHorizontal,scrollEndTranslation:scrollEndTranslation,endWithSpring:endWithSpring,onScrollEnd:onScrollEnd,infinite:infinite,touching:touching};_f.asString="function _f(e){const{scrollEndVelocity,isHorizontal,scrollEndTranslation,endWithSpring,onScrollEnd,infinite,touching}=jsThis._closure;{const{velocityX:velocityX,velocityY:velocityY,translationX:translationX,translationY:translationY}=e;scrollEndVelocity.value=isHorizontal.value?velocityX:velocityY;scrollEndTranslation.value=isHorizontal.value?translationX:translationY;endWithSpring(onScrollEnd);if(!infinite)touching.value=false;}}";_f.__workletHash=10638018947905;_f.__location="/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/ScrollViewGesture.tsx (282:13)";return _f;}()},[pagingEnabled,isHorizontal.value,infinite,maxPage,size,snapEnabled,onScrollBegin,onScrollEnd]);return _react.default.createElement(_reactNativeGestureHandler.PanGestureHandler,(0,_extends2.default)({},panGestureHandlerProps,{enabled:enabled,onGestureEvent:panGestureEventHandler,__self:_this,__source:{fileName:_jsxFileName,lineNumber:310,columnNumber:5}}),_react.default.createElement(_reactNativeReanimated.default.View,{ref:containerRef,testID:testID,style:style,onTouchStart:onTouchBegin,onTouchEnd:onTouchEnd,__self:_this,__source:{fileName:_jsxFileName,lineNumber:315,columnNumber:7}},props.children));};var ScrollViewGesture=IScrollViewGesture;exports.ScrollViewGesture=ScrollViewGesture;
1
+ var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.ScrollViewGesture=void 0;var _extends2=_interopRequireDefault(require("@babel/runtime/helpers/extends"));var _react=_interopRequireDefault(require("react"));var _reactNativeGestureHandler=require("react-native-gesture-handler");var _reactNativeReanimated=_interopRequireWildcard(require("react-native-reanimated"));var _constants=require("./constants");var _store=require("./store");var _dealWithAnimation=require("./utils/dealWithAnimation");var _this=this,_jsxFileName="/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/ScrollViewGesture.tsx";function _getRequireWildcardCache(nodeInterop){if(typeof WeakMap!=="function")return null;var cacheBabelInterop=new WeakMap();var cacheNodeInterop=new WeakMap();return(_getRequireWildcardCache=function _getRequireWildcardCache(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop;})(nodeInterop);}function _interopRequireWildcard(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule){return obj;}if(obj===null||typeof obj!=="object"&&typeof obj!=="function"){return{default:obj};}var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj)){return cache.get(obj);}var newObj={};var hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj){if(key!=="default"&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;if(desc&&(desc.get||desc.set)){Object.defineProperty(newObj,key,desc);}else{newObj[key]=obj[key];}}}newObj.default=obj;if(cache){cache.set(obj,newObj);}return newObj;}var IScrollViewGesture=function IScrollViewGesture(props){var _React$useContext=_react.default.useContext(_store.CTX),_React$useContext$pro=_React$useContext.props,vertical=_React$useContext$pro.vertical,pagingEnabled=_React$useContext$pro.pagingEnabled,snapEnabled=_React$useContext$pro.snapEnabled,panGestureHandlerProps=_React$useContext$pro.panGestureHandlerProps,infinite=_React$useContext$pro.loop,scrollAnimationDuration=_React$useContext$pro.scrollAnimationDuration,withAnimation=_React$useContext$pro.withAnimation,enabled=_React$useContext$pro.enabled,dataLength=_React$useContext$pro.dataLength,overscrollEnabled=_React$useContext$pro.overscrollEnabled,maxScrollDistancePerSwipe=_React$useContext$pro.maxScrollDistancePerSwipe;var size=props.size,translation=props.translation,testID=props.testID,_props$style=props.style,style=_props$style===void 0?{}:_props$style,onScrollBegin=props.onScrollBegin,onScrollEnd=props.onScrollEnd,onTouchBegin=props.onTouchBegin,onTouchEnd=props.onTouchEnd;var maxPage=dataLength;var isHorizontal=(0,_reactNativeReanimated.useDerivedValue)(function(){var _f=function _f(){return!vertical;};_f._closure={vertical:vertical};_f.asString="function _f(){const{vertical}=jsThis._closure;{return!vertical;}}";_f.__workletHash=14495821007639;_f.__location="/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/ScrollViewGesture.tsx (71:39)";return _f;}(),[vertical]);var touching=(0,_reactNativeReanimated.useSharedValue)(false);var scrollEndTranslation=(0,_reactNativeReanimated.useSharedValue)(0);var scrollEndVelocity=(0,_reactNativeReanimated.useSharedValue)(0);var containerRef=(0,_reactNativeReanimated.useAnimatedRef)();var getLimit=_react.default.useCallback(function(){var _f=function _f(){if(!infinite&&!overscrollEnabled){var _measure=(0,_reactNativeReanimated.measure)(containerRef),_measure$width=_measure.width,containerWidth=_measure$width===void 0?0:_measure$width;if(dataLength*size<containerWidth)return 0;return dataLength*size-containerWidth;}return dataLength*size;};_f._closure={infinite:infinite,overscrollEnabled:overscrollEnabled,measure:_reactNativeReanimated.measure,containerRef:containerRef,dataLength:dataLength,size:size};_f.asString="function _f(){const{infinite,overscrollEnabled,measure,containerRef,dataLength,size}=jsThis._closure;{if(!infinite&&!overscrollEnabled){const{width:containerWidth=0}=measure(containerRef);if(dataLength*size<containerWidth)return 0;return dataLength*size-containerWidth;}return dataLength*size;}}";_f.__workletHash=11841077662563;_f.__location="/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/ScrollViewGesture.tsx (78:37)";return _f;}(),[infinite,size,dataLength,overscrollEnabled]);var withSpring=_react.default.useCallback(function(){var _f=function _f(toValue,onFinished){var defaultWithAnimation={type:"timing",config:{duration:scrollAnimationDuration+100,easing:_constants.Easing.easeOutQuart}};return(0,_dealWithAnimation.dealWithAnimation)(withAnimation!=null?withAnimation:defaultWithAnimation)(toValue,function(){var _f=function _f(isFinished){if(isFinished)onFinished&&(0,_reactNativeReanimated.runOnJS)(onFinished)();};_f._closure={onFinished:onFinished,runOnJS:_reactNativeReanimated.runOnJS};_f.asString="function _f(isFinished){const{onFinished,runOnJS}=jsThis._closure;{if(isFinished)onFinished&&runOnJS(onFinished)();}}";_f.__workletHash=3881957308013;_f.__location="/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/ScrollViewGesture.tsx (108:8)";return _f;}());};_f._closure={scrollAnimationDuration:scrollAnimationDuration,Easing:{easeOutQuart:_constants.Easing.easeOutQuart},dealWithAnimation:_dealWithAnimation.dealWithAnimation,withAnimation:withAnimation,runOnJS:_reactNativeReanimated.runOnJS};_f.asString="function _f(toValue,onFinished){const{scrollAnimationDuration,Easing,dealWithAnimation,withAnimation,runOnJS}=jsThis._closure;{var _withAnimation;const defaultWithAnimation={type:\"timing\",config:{duration:scrollAnimationDuration+100,easing:Easing.easeOutQuart}};return dealWithAnimation((_withAnimation=withAnimation)!==null&&_withAnimation!==void 0?_withAnimation:defaultWithAnimation)(toValue,function(isFinished){\"worklet\";if(isFinished)onFinished&&runOnJS(onFinished)();});}}";_f.__workletHash=4492029393801;_f.__location="/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/ScrollViewGesture.tsx (96:4)";return _f;}(),[scrollAnimationDuration,withAnimation]);var endWithSpring=_react.default.useCallback(function(){var _f=function _f(onFinished){var origin=translation.value;var velocity=scrollEndVelocity.value;var finalTranslation=(0,_reactNativeReanimated.withDecay)({velocity:velocity,deceleration:0.999});if(typeof maxScrollDistancePerSwipe==="number"&&Math.abs(scrollEndTranslation.value)>maxScrollDistancePerSwipe){finalTranslation=origin;}else{if(pagingEnabled){var offset=-(scrollEndTranslation.value>=0?1:-1);var computed=offset<0?Math.ceil:Math.floor;var page=computed(-translation.value/size);if(infinite){var finalPage=page+offset;finalTranslation=withSpring(withProcessTranslation(-finalPage*size),onFinished);}else{var _finalPage=Math.min(maxPage-1,Math.max(0,page+offset));finalTranslation=withSpring(withProcessTranslation(-_finalPage*size),onFinished);}}if(!pagingEnabled&&snapEnabled){var nextPage=Math.round((origin+velocity*0.4)/size)*size;finalTranslation=withSpring(withProcessTranslation(nextPage),onFinished);}}translation.value=finalTranslation;function withProcessTranslation(translation){if(!infinite&&!overscrollEnabled){var limit=getLimit();var sign=Math.sign(translation);return sign*Math.max(0,Math.min(limit,Math.abs(translation)));}return translation;}};_f._closure={translation:translation,scrollEndVelocity:scrollEndVelocity,withDecay:_reactNativeReanimated.withDecay,maxScrollDistancePerSwipe:maxScrollDistancePerSwipe,scrollEndTranslation:scrollEndTranslation,pagingEnabled:pagingEnabled,size:size,infinite:infinite,withSpring:withSpring,maxPage:maxPage,snapEnabled:snapEnabled,overscrollEnabled:overscrollEnabled,getLimit:getLimit};_f.asString="function _f(onFinished){const{translation,scrollEndVelocity,withDecay,maxScrollDistancePerSwipe,scrollEndTranslation,pagingEnabled,size,infinite,withSpring,maxPage,snapEnabled,overscrollEnabled,getLimit}=jsThis._closure;{const origin=translation.value;const velocity=scrollEndVelocity.value;let finalTranslation=withDecay({velocity:velocity,deceleration:0.999});if(typeof maxScrollDistancePerSwipe===\"number\"&&Math.abs(scrollEndTranslation.value)>maxScrollDistancePerSwipe){finalTranslation=origin;}else{if(pagingEnabled){const offset=-(scrollEndTranslation.value>=0?1:-1);const computed=offset<0?Math.ceil:Math.floor;const page=computed(-translation.value/size);if(infinite){const finalPage=page+offset;finalTranslation=withSpring(withProcessTranslation(-finalPage*size),onFinished);}else{const finalPage=Math.min(maxPage-1,Math.max(0,page+offset));finalTranslation=withSpring(withProcessTranslation(-finalPage*size),onFinished);}}if(!pagingEnabled&&snapEnabled){const nextPage=Math.round((origin+velocity*0.4)/size)*size;finalTranslation=withSpring(withProcessTranslation(nextPage),onFinished);}}translation.value=finalTranslation;function withProcessTranslation(translation){if(!infinite&&!overscrollEnabled){const limit=getLimit();const sign=Math.sign(translation);return sign*Math.max(0,Math.min(limit,Math.abs(translation)));}return translation;}}}";_f.__workletHash=2338154080975;_f.__location="/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/ScrollViewGesture.tsx (119:4)";return _f;}(),[withSpring,size,maxPage,infinite,snapEnabled,translation,pagingEnabled,scrollEndVelocity.value,maxScrollDistancePerSwipe,scrollEndTranslation.value]);var onFinish=_react.default.useCallback(function(){var _f=function _f(isFinished){if(isFinished){touching.value=false;onScrollEnd&&(0,_reactNativeReanimated.runOnJS)(onScrollEnd)();}};_f._closure={touching:touching,onScrollEnd:onScrollEnd,runOnJS:_reactNativeReanimated.runOnJS};_f.asString="function _f(isFinished){const{touching,onScrollEnd,runOnJS}=jsThis._closure;{if(isFinished){touching.value=false;onScrollEnd&&runOnJS(onScrollEnd)();}}}";_f.__workletHash=12308424749737;_f.__location="/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/ScrollViewGesture.tsx (188:4)";return _f;}(),[onScrollEnd,touching]);var activeDecay=_react.default.useCallback(function(){var _f=function _f(){touching.value=true;translation.value=(0,_reactNativeReanimated.withDecay)({velocity:scrollEndVelocity.value},function(){var _f=function _f(isFinished){return onFinish(isFinished);};_f._closure={onFinish:onFinish};_f.asString="function _f(isFinished){const{onFinish}=jsThis._closure;{return onFinish(isFinished);}}";_f.__workletHash=12004837605207;_f.__location="/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/ScrollViewGesture.tsx (203:6)";return _f;}());};_f._closure={touching:touching,translation:translation,withDecay:_reactNativeReanimated.withDecay,scrollEndVelocity:scrollEndVelocity,onFinish:onFinish};_f.asString="function _f(){const{touching,translation,withDecay,scrollEndVelocity,onFinish}=jsThis._closure;{touching.value=true;translation.value=withDecay({velocity:scrollEndVelocity.value},function(isFinished){return onFinish(isFinished);});}}";_f.__workletHash=1701548878343;_f.__location="/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/ScrollViewGesture.tsx (198:40)";return _f;}(),[onFinish,scrollEndVelocity.value,touching,translation]);var resetBoundary=_react.default.useCallback(function(){var _f=function _f(){if(touching.value)return;if(translation.value>0){if(scrollEndTranslation.value<0){activeDecay();return;}if(!infinite){translation.value=withSpring(0);return;}}if(translation.value<-((maxPage-1)*size)){if(scrollEndTranslation.value>0){activeDecay();return;}if(!infinite)translation.value=withSpring(-((maxPage-1)*size));}};_f._closure={touching:touching,translation:translation,scrollEndTranslation:scrollEndTranslation,activeDecay:activeDecay,infinite:infinite,withSpring:withSpring,maxPage:maxPage,size:size};_f.asString="function _f(){const{touching,translation,scrollEndTranslation,activeDecay,infinite,withSpring,maxPage,size}=jsThis._closure;{if(touching.value)return;if(translation.value>0){if(scrollEndTranslation.value<0){activeDecay();return;}if(!infinite){translation.value=withSpring(0);return;}}if(translation.value<-((maxPage-1)*size)){if(scrollEndTranslation.value>0){activeDecay();return;}if(!infinite)translation.value=withSpring(-((maxPage-1)*size));}}}";_f.__workletHash=5584514378333;_f.__location="/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/ScrollViewGesture.tsx (207:42)";return _f;}(),[touching.value,translation,maxPage,size,scrollEndTranslation.value,infinite,activeDecay,withSpring]);(0,_reactNativeReanimated.useAnimatedReaction)(function(){var _f=function _f(){return translation.value;};_f._closure={translation:translation};_f.asString="function _f(){const{translation}=jsThis._closure;{return translation.value;}}";_f.__workletHash=9829368032147;_f.__location="/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/ScrollViewGesture.tsx (243:4)";return _f;}(),function(){var _f=function _f(){if(!pagingEnabled)resetBoundary();};_f._closure={pagingEnabled:pagingEnabled,resetBoundary:resetBoundary};_f.asString="function _f(){const{pagingEnabled,resetBoundary}=jsThis._closure;{if(!pagingEnabled)resetBoundary();}}";_f.__workletHash=3586615076030;_f.__location="/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/ScrollViewGesture.tsx (244:4)";return _f;}(),[pagingEnabled,resetBoundary]);var withProcessTranslation=function(){var _f=function _f(translation){if(!infinite&&!overscrollEnabled){var limit=getLimit();var sign=Math.sign(translation);return sign*Math.max(0,Math.min(limit,Math.abs(translation)));}return translation;};_f._closure={infinite:infinite,overscrollEnabled:overscrollEnabled,getLimit:getLimit};_f.asString="function withProcessTranslation(translation){const{infinite,overscrollEnabled,getLimit}=jsThis._closure;{if(!infinite&&!overscrollEnabled){const limit=getLimit();const sign=Math.sign(translation);return sign*Math.max(0,Math.min(limit,Math.abs(translation)));}return translation;}}";_f.__workletHash=16243654224178;_f.__location="/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/ScrollViewGesture.tsx (251:2)";return _f;}();var panGestureEventHandler=(0,_reactNativeReanimated.useAnimatedGestureHandler)({onStart:function(){var _f=function _f(_,ctx){touching.value=true;ctx.validStart=true;onScrollBegin&&(0,_reactNativeReanimated.runOnJS)(onScrollBegin)();ctx.max=(maxPage-1)*size;if(!infinite&&!overscrollEnabled)ctx.max=getLimit();ctx.panOffset=translation.value;};_f._closure={touching:touching,onScrollBegin:onScrollBegin,runOnJS:_reactNativeReanimated.runOnJS,maxPage:maxPage,size:size,infinite:infinite,overscrollEnabled:overscrollEnabled,getLimit:getLimit,translation:translation};_f.asString="function _f(_,ctx){const{touching,onScrollBegin,runOnJS,maxPage,size,infinite,overscrollEnabled,getLimit,translation}=jsThis._closure;{touching.value=true;ctx.validStart=true;onScrollBegin&&runOnJS(onScrollBegin)();ctx.max=(maxPage-1)*size;if(!infinite&&!overscrollEnabled)ctx.max=getLimit();ctx.panOffset=translation.value;}}";_f.__workletHash=3619428160497;_f.__location="/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/ScrollViewGesture.tsx (268:15)";return _f;}(),onActive:function(){var _f=function _f(e,ctx){if(ctx.validStart){ctx.validStart=false;(0,_reactNativeReanimated.cancelAnimation)(translation);}touching.value=true;var translationX=e.translationX,translationY=e.translationY;var totalTranslation=isHorizontal.value?translationX:translationY;if(typeof maxScrollDistancePerSwipe==="number"&&Math.abs(totalTranslation)>maxScrollDistancePerSwipe){var overSwipe=Math.abs(totalTranslation)-maxScrollDistancePerSwipe;var dampedTranslation=maxScrollDistancePerSwipe+overSwipe*0.5;translationX=isHorizontal.value?dampedTranslation*Math.sign(translationX):translationX;translationY=!isHorizontal.value?dampedTranslation*Math.sign(translationY):translationY;}var panTranslation=isHorizontal.value?translationX:translationY;if(!infinite){if(translation.value>0||translation.value<-ctx.max){var boundary=translation.value>0?0:-ctx.max;var fixed=boundary-ctx.panOffset;var dynamic=panTranslation-fixed;translation.value=boundary+dynamic*0.5;return;}}var translationValue=ctx.panOffset+panTranslation;translation.value=translationValue;};_f._closure={cancelAnimation:_reactNativeReanimated.cancelAnimation,translation:translation,touching:touching,isHorizontal:isHorizontal,maxScrollDistancePerSwipe:maxScrollDistancePerSwipe,infinite:infinite};_f.asString="function _f(e,ctx){const{cancelAnimation,translation,touching,isHorizontal,maxScrollDistancePerSwipe,infinite}=jsThis._closure;{if(ctx.validStart){ctx.validStart=false;cancelAnimation(translation);}touching.value=true;let{translationX:translationX,translationY:translationY}=e;const totalTranslation=isHorizontal.value?translationX:translationY;if(typeof maxScrollDistancePerSwipe===\"number\"&&Math.abs(totalTranslation)>maxScrollDistancePerSwipe){const overSwipe=Math.abs(totalTranslation)-maxScrollDistancePerSwipe;const dampedTranslation=maxScrollDistancePerSwipe+overSwipe*0.5;translationX=isHorizontal.value?dampedTranslation*Math.sign(translationX):translationX;translationY=!isHorizontal.value?dampedTranslation*Math.sign(translationY):translationY;}const panTranslation=isHorizontal.value?translationX:translationY;if(!infinite){if(translation.value>0||translation.value<-ctx.max){const boundary=translation.value>0?0:-ctx.max;const fixed=boundary-ctx.panOffset;const dynamic=panTranslation-fixed;translation.value=boundary+dynamic*0.5;return;}}const translationValue=ctx.panOffset+panTranslation;translation.value=translationValue;}}";_f.__workletHash=17495006252827;_f.__location="/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/ScrollViewGesture.tsx (279:16)";return _f;}(),onEnd:function(){var _f=function _f(e,ctx){var velocityX=e.velocityX,velocityY=e.velocityY,translationX=e.translationX,translationY=e.translationY;scrollEndVelocity.value=isHorizontal.value?velocityX:velocityY;scrollEndTranslation.value=isHorizontal.value?translationX:translationY;var totalTranslation=isHorizontal.value?translationX:translationY;if(typeof maxScrollDistancePerSwipe==="number"&&Math.abs(totalTranslation)>maxScrollDistancePerSwipe){var nextPage=Math.round((ctx.panOffset+maxScrollDistancePerSwipe*Math.sign(totalTranslation))/size)*size;translation.value=withSpring(withProcessTranslation(nextPage),onScrollEnd);}else{endWithSpring(onScrollEnd);}if(!infinite)touching.value=false;};_f._closure={scrollEndVelocity:scrollEndVelocity,isHorizontal:isHorizontal,scrollEndTranslation:scrollEndTranslation,maxScrollDistancePerSwipe:maxScrollDistancePerSwipe,size:size,translation:translation,withSpring:withSpring,withProcessTranslation:withProcessTranslation,onScrollEnd:onScrollEnd,endWithSpring:endWithSpring,infinite:infinite,touching:touching};_f.asString="function _f(e,ctx){const{scrollEndVelocity,isHorizontal,scrollEndTranslation,maxScrollDistancePerSwipe,size,translation,withSpring,withProcessTranslation,onScrollEnd,endWithSpring,infinite,touching}=jsThis._closure;{const{velocityX:velocityX,velocityY:velocityY,translationX:translationX,translationY:translationY}=e;scrollEndVelocity.value=isHorizontal.value?velocityX:velocityY;scrollEndTranslation.value=isHorizontal.value?translationX:translationY;const totalTranslation=isHorizontal.value?translationX:translationY;if(typeof maxScrollDistancePerSwipe===\"number\"&&Math.abs(totalTranslation)>maxScrollDistancePerSwipe){const nextPage=Math.round((ctx.panOffset+maxScrollDistancePerSwipe*Math.sign(totalTranslation))/size)*size;translation.value=withSpring(withProcessTranslation(nextPage),onScrollEnd);}else{endWithSpring(onScrollEnd);}if(!infinite)touching.value=false;}}";_f.__workletHash=10105406885731;_f.__location="/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/ScrollViewGesture.tsx (312:13)";return _f;}()},[pagingEnabled,isHorizontal.value,infinite,maxPage,size,snapEnabled,onScrollBegin,onScrollEnd]);return _react.default.createElement(_reactNativeGestureHandler.PanGestureHandler,(0,_extends2.default)({},panGestureHandlerProps,{enabled:enabled,onGestureEvent:panGestureEventHandler,__self:_this,__source:{fileName:_jsxFileName,lineNumber:348,columnNumber:5}}),_react.default.createElement(_reactNativeReanimated.default.View,{ref:containerRef,testID:testID,style:style,onTouchStart:onTouchBegin,onTouchEnd:onTouchEnd,__self:_this,__source:{fileName:_jsxFileName,lineNumber:353,columnNumber:7}},props.children));};var ScrollViewGesture=IScrollViewGesture;exports.ScrollViewGesture=ScrollViewGesture;
2
2
  //# sourceMappingURL=ScrollViewGesture.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["ScrollViewGesture.tsx"],"names":["IScrollViewGesture","props","React","useContext","CTX","vertical","pagingEnabled","snapEnabled","panGestureHandlerProps","infinite","loop","scrollAnimationDuration","withAnimation","enabled","dataLength","overscrollEnabled","size","translation","testID","style","onScrollBegin","onScrollEnd","onTouchBegin","onTouchEnd","maxPage","isHorizontal","touching","scrollEndTranslation","scrollEndVelocity","containerRef","getLimit","useCallback","width","containerWidth","measure","withSpring","toValue","onFinished","defaultWithAnimation","type","config","duration","easing","Easing","easeOutQuart","isFinished","runOnJS","dealWithAnimation","endWithSpring","origin","value","velocity","finalTranslation","deceleration","offset","computed","Math","ceil","floor","page","finalPage","withProcessTranslation","min","max","nextPage","round","limit","sign","abs","withDecay","onFinish","activeDecay","resetBoundary","panGestureEventHandler","onStart","_","ctx","validStart","panOffset","onActive","e","translationX","translationY","panTranslation","boundary","fixed","dynamic","translationValue","cancelAnimation","onEnd","velocityX","velocityY","children","ScrollViewGesture"],"mappings":"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","sourcesContent":["import React from \"react\";\nimport type { StyleProp, ViewStyle } from \"react-native\";\nimport type { PanGestureHandlerGestureEvent } from \"react-native-gesture-handler\";\nimport {\n PanGestureHandler,\n} from \"react-native-gesture-handler\";\nimport Animated, {\n cancelAnimation,\n measure,\n runOnJS,\n useAnimatedGestureHandler,\n useAnimatedReaction,\n useAnimatedRef,\n useDerivedValue,\n useSharedValue,\n withDecay,\n} from \"react-native-reanimated\";\n\nimport { Easing } from \"./constants\";\nimport { CTX } from \"./store\";\nimport type { WithTimingAnimation } from \"./types\";\nimport { dealWithAnimation } from \"./utils/dealWithAnimation\";\n\ninterface GestureContext extends Record<string, unknown> {\n validStart: boolean\n panOffset: number\n max: number\n}\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<Props> = (props) => {\n const {\n props: {\n vertical,\n pagingEnabled,\n snapEnabled,\n panGestureHandlerProps,\n loop: infinite,\n scrollAnimationDuration,\n withAnimation,\n enabled,\n dataLength,\n overscrollEnabled,\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 touching = useSharedValue(false);\n const scrollEndTranslation = useSharedValue(0);\n const scrollEndVelocity = useSharedValue(0);\n const containerRef = useAnimatedRef<Animated.View>();\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 /**\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 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 translation,\n scrollEndVelocity.value,\n pagingEnabled,\n size,\n scrollEndTranslation.value,\n infinite,\n withSpring,\n snapEnabled,\n maxPage,\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 const panGestureEventHandler = useAnimatedGestureHandler<\n PanGestureHandlerGestureEvent,\n GestureContext\n >(\n {\n onStart: (_, ctx) => {\n touching.value = true;\n ctx.validStart = true;\n onScrollBegin && runOnJS(onScrollBegin)();\n\n ctx.max = (maxPage - 1) * size;\n if (!infinite && !overscrollEnabled)\n ctx.max = getLimit();\n\n ctx.panOffset = translation.value;\n },\n onActive: (e, ctx) => {\n if (ctx.validStart) {\n ctx.validStart = 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 < -ctx.max)) {\n const boundary = translation.value > 0 ? 0 : -ctx.max;\n const fixed = boundary - ctx.panOffset;\n const dynamic = panTranslation - fixed;\n translation.value = boundary + dynamic * 0.5;\n return;\n }\n }\n\n const translationValue = ctx.panOffset + panTranslation;\n translation.value = translationValue;\n },\n onEnd: (e) => {\n const { velocityX, velocityY, translationX, translationY } = e;\n scrollEndVelocity.value = isHorizontal.value\n ? velocityX\n : velocityY;\n scrollEndTranslation.value = isHorizontal.value\n ? translationX\n : translationY;\n\n endWithSpring(onScrollEnd);\n\n if (!infinite)\n touching.value = false;\n },\n },\n [\n pagingEnabled,\n isHorizontal.value,\n infinite,\n maxPage,\n size,\n snapEnabled,\n onScrollBegin,\n onScrollEnd,\n ],\n );\n\n return (\n <PanGestureHandler\n {...panGestureHandlerProps}\n enabled={enabled}\n onGestureEvent={panGestureEventHandler}\n >\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 </PanGestureHandler>\n );\n};\n\nexport const ScrollViewGesture = IScrollViewGesture;\n"]}
1
+ {"version":3,"sources":["ScrollViewGesture.tsx"],"names":["IScrollViewGesture","props","React","useContext","CTX","vertical","pagingEnabled","snapEnabled","panGestureHandlerProps","infinite","loop","scrollAnimationDuration","withAnimation","enabled","dataLength","overscrollEnabled","maxScrollDistancePerSwipe","size","translation","testID","style","onScrollBegin","onScrollEnd","onTouchBegin","onTouchEnd","maxPage","isHorizontal","touching","scrollEndTranslation","scrollEndVelocity","containerRef","getLimit","useCallback","width","containerWidth","measure","withSpring","toValue","onFinished","defaultWithAnimation","type","config","duration","easing","Easing","easeOutQuart","isFinished","runOnJS","dealWithAnimation","endWithSpring","origin","value","velocity","finalTranslation","deceleration","Math","abs","offset","computed","ceil","floor","page","finalPage","withProcessTranslation","min","max","nextPage","round","limit","sign","withDecay","onFinish","activeDecay","resetBoundary","panGestureEventHandler","onStart","_","ctx","validStart","panOffset","onActive","e","translationX","translationY","totalTranslation","overSwipe","dampedTranslation","panTranslation","boundary","fixed","dynamic","translationValue","cancelAnimation","onEnd","velocityX","velocityY","children","ScrollViewGesture"],"mappings":"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","sourcesContent":["import React from \"react\";\nimport type { StyleProp, ViewStyle } from \"react-native\";\nimport type { PanGestureHandlerGestureEvent } from \"react-native-gesture-handler\";\nimport {\n PanGestureHandler,\n} from \"react-native-gesture-handler\";\nimport Animated, {\n cancelAnimation,\n measure,\n runOnJS,\n useAnimatedGestureHandler,\n useAnimatedReaction,\n useAnimatedRef,\n useDerivedValue,\n useSharedValue,\n withDecay,\n} from \"react-native-reanimated\";\n\nimport { Easing } from \"./constants\";\nimport { CTX } from \"./store\";\nimport type { WithTimingAnimation } from \"./types\";\nimport { dealWithAnimation } from \"./utils/dealWithAnimation\";\n\ninterface GestureContext extends Record<string, unknown> {\n validStart: boolean\n panOffset: number\n max: number\n}\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<Props> = (props) => {\n const {\n props: {\n vertical,\n pagingEnabled,\n snapEnabled,\n panGestureHandlerProps,\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 touching = useSharedValue(false);\n const scrollEndTranslation = useSharedValue(0);\n const scrollEndVelocity = useSharedValue(0);\n const containerRef = useAnimatedRef<Animated.View>();\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 (typeof maxScrollDistancePerSwipe === \"number\" && 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 ],\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 panGestureEventHandler = useAnimatedGestureHandler<\n PanGestureHandlerGestureEvent,\n GestureContext\n >(\n {\n onStart: (_, ctx) => {\n touching.value = true;\n ctx.validStart = true;\n onScrollBegin && runOnJS(onScrollBegin)();\n\n ctx.max = (maxPage - 1) * size;\n if (!infinite && !overscrollEnabled)\n ctx.max = getLimit();\n\n ctx.panOffset = translation.value;\n },\n onActive: (e, ctx) => {\n if (ctx.validStart) {\n ctx.validStart = false;\n cancelAnimation(translation);\n }\n touching.value = true;\n let { translationX, translationY } = e;\n\n const totalTranslation = isHorizontal.value ? translationX : translationY;\n\n if (typeof maxScrollDistancePerSwipe === \"number\" && Math.abs(totalTranslation) > maxScrollDistancePerSwipe) {\n const overSwipe = Math.abs(totalTranslation) - maxScrollDistancePerSwipe;\n const dampedTranslation = maxScrollDistancePerSwipe + overSwipe * 0.5;\n\n translationX = isHorizontal.value ? dampedTranslation * Math.sign(translationX) : translationX;\n translationY = !isHorizontal.value ? dampedTranslation * Math.sign(translationY) : translationY;\n }\n\n const panTranslation = isHorizontal.value ? translationX : translationY;\n if (!infinite) {\n if ((translation.value > 0 || translation.value < -ctx.max)) {\n const boundary = translation.value > 0 ? 0 : -ctx.max;\n const fixed = boundary - ctx.panOffset;\n const dynamic = panTranslation - fixed;\n translation.value = boundary + dynamic * 0.5;\n return;\n }\n }\n\n const translationValue = ctx.panOffset + panTranslation;\n\n translation.value = translationValue;\n },\n onEnd: (e, ctx) => {\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 = isHorizontal.value ? translationX : translationY;\n\n if (typeof maxScrollDistancePerSwipe === \"number\" && Math.abs(totalTranslation) > maxScrollDistancePerSwipe) {\n const nextPage = Math.round((ctx.panOffset + 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 },\n [\n pagingEnabled,\n isHorizontal.value,\n infinite,\n maxPage,\n size,\n snapEnabled,\n onScrollBegin,\n onScrollEnd,\n ],\n );\n\n return (\n <PanGestureHandler\n {...panGestureHandlerProps}\n enabled={enabled}\n onGestureEvent={panGestureEventHandler}\n >\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 </PanGestureHandler>\n );\n};\n\nexport const ScrollViewGesture = IScrollViewGesture;\n"]}
@@ -19,7 +19,8 @@ const IScrollViewGesture = props => {
19
19
  withAnimation,
20
20
  enabled,
21
21
  dataLength,
22
- overscrollEnabled
22
+ overscrollEnabled,
23
+ maxScrollDistancePerSwipe
23
24
  }
24
25
  } = React.useContext(CTX);
25
26
  const {
@@ -79,35 +80,39 @@ const IScrollViewGesture = props => {
79
80
  let finalTranslation = withDecay({
80
81
  velocity,
81
82
  deceleration: 0.999
82
- });
83
- /**
84
- * The page size is the same as the item size.
85
- * If direction is vertical, the page size is the height of the item.
86
- * If direction is horizontal, the page size is the width of the item.
87
- *
88
- * `page size` equals to `size` variable.
89
- * */
90
-
91
- if (pagingEnabled) {
92
- // distance with direction
93
- const offset = -(scrollEndTranslation.value >= 0 ? 1 : -1); // 1 or -1
94
-
95
- const computed = offset < 0 ? Math.ceil : Math.floor;
96
- const page = computed(-translation.value / size);
97
-
98
- if (infinite) {
99
- const finalPage = page + offset;
100
- finalTranslation = withSpring(withProcessTranslation(-finalPage * size), onFinished);
101
- } else {
102
- const finalPage = Math.min(maxPage - 1, Math.max(0, page + offset));
103
- finalTranslation = withSpring(withProcessTranslation(-finalPage * size), onFinished);
83
+ }); // If the distance of the swipe exceeds the max scroll distance, keep the view at the current position
84
+
85
+ if (typeof maxScrollDistancePerSwipe === "number" && Math.abs(scrollEndTranslation.value) > maxScrollDistancePerSwipe) {
86
+ finalTranslation = origin;
87
+ } else {
88
+ /**
89
+ * The page size is the same as the item size.
90
+ * If direction is vertical, the page size is the height of the item.
91
+ * If direction is horizontal, the page size is the width of the item.
92
+ *
93
+ * `page size` equals to `size` variable.
94
+ * */
95
+ if (pagingEnabled) {
96
+ // distance with direction
97
+ const offset = -(scrollEndTranslation.value >= 0 ? 1 : -1); // 1 or -1
98
+
99
+ const computed = offset < 0 ? Math.ceil : Math.floor;
100
+ const page = computed(-translation.value / size);
101
+
102
+ if (infinite) {
103
+ const finalPage = page + offset;
104
+ finalTranslation = withSpring(withProcessTranslation(-finalPage * size), onFinished);
105
+ } else {
106
+ const finalPage = Math.min(maxPage - 1, Math.max(0, page + offset));
107
+ finalTranslation = withSpring(withProcessTranslation(-finalPage * size), onFinished);
108
+ }
104
109
  }
105
- }
106
110
 
107
- if (!pagingEnabled && snapEnabled) {
108
- // scroll to the nearest item
109
- const nextPage = Math.round((origin + velocity * 0.4) / size) * size;
110
- finalTranslation = withSpring(withProcessTranslation(nextPage), onFinished);
111
+ if (!pagingEnabled && snapEnabled) {
112
+ // scroll to the nearest item
113
+ const nextPage = Math.round((origin + velocity * 0.4) / size) * size;
114
+ finalTranslation = withSpring(withProcessTranslation(nextPage), onFinished);
115
+ }
111
116
  }
112
117
 
113
118
  translation.value = finalTranslation;
@@ -121,7 +126,7 @@ const IScrollViewGesture = props => {
121
126
 
122
127
  return translation;
123
128
  }
124
- }, [translation, scrollEndVelocity.value, pagingEnabled, size, scrollEndTranslation.value, infinite, withSpring, snapEnabled, maxPage]);
129
+ }, [withSpring, size, maxPage, infinite, snapEnabled, translation, pagingEnabled, scrollEndVelocity.value, maxScrollDistancePerSwipe, scrollEndTranslation.value]);
125
130
  const onFinish = React.useCallback(isFinished => {
126
131
  "worklet";
127
132
 
@@ -167,6 +172,19 @@ const IScrollViewGesture = props => {
167
172
  useAnimatedReaction(() => translation.value, () => {
168
173
  if (!pagingEnabled) resetBoundary();
169
174
  }, [pagingEnabled, resetBoundary]);
175
+
176
+ function withProcessTranslation(translation) {
177
+ "worklet";
178
+
179
+ if (!infinite && !overscrollEnabled) {
180
+ const limit = getLimit();
181
+ const sign = Math.sign(translation);
182
+ return sign * Math.max(0, Math.min(limit, Math.abs(translation)));
183
+ }
184
+
185
+ return translation;
186
+ }
187
+
170
188
  const panGestureEventHandler = useAnimatedGestureHandler({
171
189
  onStart: (_, ctx) => {
172
190
  touching.value = true;
@@ -183,10 +201,19 @@ const IScrollViewGesture = props => {
183
201
  }
184
202
 
185
203
  touching.value = true;
186
- const {
204
+ let {
187
205
  translationX,
188
206
  translationY
189
207
  } = e;
208
+ const totalTranslation = isHorizontal.value ? translationX : translationY;
209
+
210
+ if (typeof maxScrollDistancePerSwipe === "number" && Math.abs(totalTranslation) > maxScrollDistancePerSwipe) {
211
+ const overSwipe = Math.abs(totalTranslation) - maxScrollDistancePerSwipe;
212
+ const dampedTranslation = maxScrollDistancePerSwipe + overSwipe * 0.5;
213
+ translationX = isHorizontal.value ? dampedTranslation * Math.sign(translationX) : translationX;
214
+ translationY = !isHorizontal.value ? dampedTranslation * Math.sign(translationY) : translationY;
215
+ }
216
+
190
217
  const panTranslation = isHorizontal.value ? translationX : translationY;
191
218
 
192
219
  if (!infinite) {
@@ -202,7 +229,7 @@ const IScrollViewGesture = props => {
202
229
  const translationValue = ctx.panOffset + panTranslation;
203
230
  translation.value = translationValue;
204
231
  },
205
- onEnd: e => {
232
+ onEnd: (e, ctx) => {
206
233
  const {
207
234
  velocityX,
208
235
  velocityY,
@@ -211,7 +238,15 @@ const IScrollViewGesture = props => {
211
238
  } = e;
212
239
  scrollEndVelocity.value = isHorizontal.value ? velocityX : velocityY;
213
240
  scrollEndTranslation.value = isHorizontal.value ? translationX : translationY;
214
- endWithSpring(onScrollEnd);
241
+ const totalTranslation = isHorizontal.value ? translationX : translationY;
242
+
243
+ if (typeof maxScrollDistancePerSwipe === "number" && Math.abs(totalTranslation) > maxScrollDistancePerSwipe) {
244
+ const nextPage = Math.round((ctx.panOffset + maxScrollDistancePerSwipe * Math.sign(totalTranslation)) / size) * size;
245
+ translation.value = withSpring(withProcessTranslation(nextPage), onScrollEnd);
246
+ } else {
247
+ endWithSpring(onScrollEnd);
248
+ }
249
+
215
250
  if (!infinite) touching.value = false;
216
251
  }
217
252
  }, [pagingEnabled, isHorizontal.value, infinite, maxPage, size, snapEnabled, onScrollBegin, onScrollEnd]);
@@ -1 +1 @@
1
- {"version":3,"sources":["ScrollViewGesture.tsx"],"names":["React","PanGestureHandler","Animated","cancelAnimation","measure","runOnJS","useAnimatedGestureHandler","useAnimatedReaction","useAnimatedRef","useDerivedValue","useSharedValue","withDecay","Easing","CTX","dealWithAnimation","IScrollViewGesture","props","vertical","pagingEnabled","snapEnabled","panGestureHandlerProps","loop","infinite","scrollAnimationDuration","withAnimation","enabled","dataLength","overscrollEnabled","useContext","size","translation","testID","style","onScrollBegin","onScrollEnd","onTouchBegin","onTouchEnd","maxPage","isHorizontal","touching","scrollEndTranslation","scrollEndVelocity","containerRef","getLimit","useCallback","width","containerWidth","withSpring","toValue","onFinished","defaultWithAnimation","type","config","duration","easing","easeOutQuart","isFinished","endWithSpring","origin","value","velocity","finalTranslation","deceleration","offset","computed","Math","ceil","floor","page","finalPage","withProcessTranslation","min","max","nextPage","round","limit","sign","abs","onFinish","activeDecay","resetBoundary","panGestureEventHandler","onStart","_","ctx","validStart","panOffset","onActive","e","translationX","translationY","panTranslation","boundary","fixed","dynamic","translationValue","onEnd","velocityX","velocityY","children","ScrollViewGesture"],"mappings":"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","sourcesContent":["import React from \"react\";\nimport type { StyleProp, ViewStyle } from \"react-native\";\nimport type { PanGestureHandlerGestureEvent } from \"react-native-gesture-handler\";\nimport {\n PanGestureHandler,\n} from \"react-native-gesture-handler\";\nimport Animated, {\n cancelAnimation,\n measure,\n runOnJS,\n useAnimatedGestureHandler,\n useAnimatedReaction,\n useAnimatedRef,\n useDerivedValue,\n useSharedValue,\n withDecay,\n} from \"react-native-reanimated\";\n\nimport { Easing } from \"./constants\";\nimport { CTX } from \"./store\";\nimport type { WithTimingAnimation } from \"./types\";\nimport { dealWithAnimation } from \"./utils/dealWithAnimation\";\n\ninterface GestureContext extends Record<string, unknown> {\n validStart: boolean\n panOffset: number\n max: number\n}\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<Props> = (props) => {\n const {\n props: {\n vertical,\n pagingEnabled,\n snapEnabled,\n panGestureHandlerProps,\n loop: infinite,\n scrollAnimationDuration,\n withAnimation,\n enabled,\n dataLength,\n overscrollEnabled,\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 touching = useSharedValue(false);\n const scrollEndTranslation = useSharedValue(0);\n const scrollEndVelocity = useSharedValue(0);\n const containerRef = useAnimatedRef<Animated.View>();\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 /**\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 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 translation,\n scrollEndVelocity.value,\n pagingEnabled,\n size,\n scrollEndTranslation.value,\n infinite,\n withSpring,\n snapEnabled,\n maxPage,\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 const panGestureEventHandler = useAnimatedGestureHandler<\n PanGestureHandlerGestureEvent,\n GestureContext\n >(\n {\n onStart: (_, ctx) => {\n touching.value = true;\n ctx.validStart = true;\n onScrollBegin && runOnJS(onScrollBegin)();\n\n ctx.max = (maxPage - 1) * size;\n if (!infinite && !overscrollEnabled)\n ctx.max = getLimit();\n\n ctx.panOffset = translation.value;\n },\n onActive: (e, ctx) => {\n if (ctx.validStart) {\n ctx.validStart = 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 < -ctx.max)) {\n const boundary = translation.value > 0 ? 0 : -ctx.max;\n const fixed = boundary - ctx.panOffset;\n const dynamic = panTranslation - fixed;\n translation.value = boundary + dynamic * 0.5;\n return;\n }\n }\n\n const translationValue = ctx.panOffset + panTranslation;\n translation.value = translationValue;\n },\n onEnd: (e) => {\n const { velocityX, velocityY, translationX, translationY } = e;\n scrollEndVelocity.value = isHorizontal.value\n ? velocityX\n : velocityY;\n scrollEndTranslation.value = isHorizontal.value\n ? translationX\n : translationY;\n\n endWithSpring(onScrollEnd);\n\n if (!infinite)\n touching.value = false;\n },\n },\n [\n pagingEnabled,\n isHorizontal.value,\n infinite,\n maxPage,\n size,\n snapEnabled,\n onScrollBegin,\n onScrollEnd,\n ],\n );\n\n return (\n <PanGestureHandler\n {...panGestureHandlerProps}\n enabled={enabled}\n onGestureEvent={panGestureEventHandler}\n >\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 </PanGestureHandler>\n );\n};\n\nexport const ScrollViewGesture = IScrollViewGesture;\n"]}
1
+ {"version":3,"sources":["ScrollViewGesture.tsx"],"names":["React","PanGestureHandler","Animated","cancelAnimation","measure","runOnJS","useAnimatedGestureHandler","useAnimatedReaction","useAnimatedRef","useDerivedValue","useSharedValue","withDecay","Easing","CTX","dealWithAnimation","IScrollViewGesture","props","vertical","pagingEnabled","snapEnabled","panGestureHandlerProps","loop","infinite","scrollAnimationDuration","withAnimation","enabled","dataLength","overscrollEnabled","maxScrollDistancePerSwipe","useContext","size","translation","testID","style","onScrollBegin","onScrollEnd","onTouchBegin","onTouchEnd","maxPage","isHorizontal","touching","scrollEndTranslation","scrollEndVelocity","containerRef","getLimit","useCallback","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","max","nextPage","round","limit","sign","onFinish","activeDecay","resetBoundary","panGestureEventHandler","onStart","_","ctx","validStart","panOffset","onActive","e","translationX","translationY","totalTranslation","overSwipe","dampedTranslation","panTranslation","boundary","fixed","dynamic","translationValue","onEnd","velocityX","velocityY","children","ScrollViewGesture"],"mappings":";;AAAA,OAAOA,KAAP,MAAkB,OAAlB;AAGA,SACEC,iBADF,QAEO,8BAFP;AAGA,OAAOC,QAAP,IACEC,eADF,EAEEC,OAFF,EAGEC,OAHF,EAIEC,yBAJF,EAKEC,mBALF,EAMEC,cANF,EAOEC,eAPF,EAQEC,cARF,EASEC,SATF,QAUO,yBAVP;AAYA,SAASC,MAAT,QAAuB,aAAvB;AACA,SAASC,GAAT,QAAoB,SAApB;AAEA,SAASC,iBAAT,QAAkC,2BAAlC;;AAoBA,MAAMC,kBAAmC,GAAIC,KAAD,IAAW;AACrD,QAAM;AACJA,IAAAA,KAAK,EAAE;AACLC,MAAAA,QADK;AAELC,MAAAA,aAFK;AAGLC,MAAAA,WAHK;AAILC,MAAAA,sBAJK;AAKLC,MAAAA,IAAI,EAAEC,QALD;AAMLC,MAAAA,uBANK;AAOLC,MAAAA,aAPK;AAQLC,MAAAA,OARK;AASLC,MAAAA,UATK;AAULC,MAAAA,iBAVK;AAWLC,MAAAA;AAXK;AADH,MAcF5B,KAAK,CAAC6B,UAAN,CAAiBhB,GAAjB,CAdJ;AAgBA,QAAM;AACJiB,IAAAA,IADI;AAEJC,IAAAA,WAFI;AAGJC,IAAAA,MAHI;AAIJC,IAAAA,KAAK,GAAG,EAJJ;AAKJC,IAAAA,aALI;AAMJC,IAAAA,WANI;AAOJC,IAAAA,YAPI;AAQJC,IAAAA;AARI,MASFrB,KATJ;AAWA,QAAMsB,OAAO,GAAGZ,UAAhB;AACA,QAAMa,YAAY,GAAG9B,eAAe,CAAC,MAAM,CAACQ,QAAR,EAAkB,CAACA,QAAD,CAAlB,CAApC;AACA,QAAMuB,QAAQ,GAAG9B,cAAc,CAAC,KAAD,CAA/B;AACA,QAAM+B,oBAAoB,GAAG/B,cAAc,CAAC,CAAD,CAA3C;AACA,QAAMgC,iBAAiB,GAAGhC,cAAc,CAAC,CAAD,CAAxC;AACA,QAAMiC,YAAY,GAAGnC,cAAc,EAAnC,CAjCqD,CAmCrD;;AACA,QAAMoC,QAAQ,GAAG5C,KAAK,CAAC6C,WAAN,CAAkB,MAAM;AACvC;;AAEA,QAAI,CAACvB,QAAD,IAAa,CAACK,iBAAlB,EAAqC;AACnC,YAAM;AAAEmB,QAAAA,KAAK,EAAEC,cAAc,GAAG;AAA1B,UAAgC3C,OAAO,CAACuC,YAAD,CAA7C,CADmC,CAGnC;;AACA,UAAIjB,UAAU,GAAGI,IAAb,GAAoBiB,cAAxB,EACE,OAAO,CAAP,CALiC,CAOnC;;AACA,aAAOrB,UAAU,GAAGI,IAAb,GAAoBiB,cAA3B;AACD;;AAED,WAAOrB,UAAU,GAAGI,IAApB;AACD,GAfgB,EAed,CAACR,QAAD,EAAWQ,IAAX,EAAiBJ,UAAjB,EAA6BC,iBAA7B,CAfc,CAAjB;AAiBA,QAAMqB,UAAU,GAAGhD,KAAK,CAAC6C,WAAN,CACjB,CAACI,OAAD,EAAkBC,UAAlB,KAA8C;AAC5C;;AACA,UAAMC,oBAAyC,GAAG;AAChDC,MAAAA,IAAI,EAAE,QAD0C;AAEhDC,MAAAA,MAAM,EAAE;AACNC,QAAAA,QAAQ,EAAE/B,uBAAuB,GAAG,GAD9B;AAENgC,QAAAA,MAAM,EAAE3C,MAAM,CAAC4C;AAFT;AAFwC,KAAlD;AAQA,WAAO1C,iBAAiB,CAACU,aAAD,aAACA,aAAD,cAACA,aAAD,GAAkB2B,oBAAlB,CAAjB,CACLF,OADK,EAEJQ,UAAD,IAAyB;AACvB;;AACA,UAAIA,UAAJ,EACEP,UAAU,IAAI7C,OAAO,CAAC6C,UAAD,CAAP,EAAd;AACH,KANI,CAAP;AAQD,GAnBgB,EAoBjB,CAAC3B,uBAAD,EAA0BC,aAA1B,CApBiB,CAAnB;AAuBA,QAAMkC,aAAa,GAAG1D,KAAK,CAAC6C,WAAN,CACnBK,UAAD,IAA6B;AAC3B;;AACA,UAAMS,MAAM,GAAG5B,WAAW,CAAC6B,KAA3B;AACA,UAAMC,QAAQ,GAAGnB,iBAAiB,CAACkB,KAAnC,CAH2B,CAI3B;;AACA,QAAIE,gBAAwB,GAAGnD,SAAS,CAAC;AAAEkD,MAAAA,QAAF;AAAYE,MAAAA,YAAY,EAAE;AAA1B,KAAD,CAAxC,CAL2B,CAO3B;;AACA,QAAI,OAAOnC,yBAAP,KAAqC,QAArC,IAAiDoC,IAAI,CAACC,GAAL,CAASxB,oBAAoB,CAACmB,KAA9B,IAAuChC,yBAA5F,EAAuH;AACrHkC,MAAAA,gBAAgB,GAAGH,MAAnB;AACD,KAFD,MAGK;AACL;AACN;AACA;AACA;AACA;AACA;AACA;AACQ,UAAIzC,aAAJ,EAAmB;AACjB;AACA,cAAMgD,MAAM,GAAG,EAAEzB,oBAAoB,CAACmB,KAArB,IAA8B,CAA9B,GAAkC,CAAlC,GAAsC,CAAC,CAAzC,CAAf,CAFiB,CAE2C;;AAC5D,cAAMO,QAAQ,GAAGD,MAAM,GAAG,CAAT,GAAaF,IAAI,CAACI,IAAlB,GAAyBJ,IAAI,CAACK,KAA/C;AACA,cAAMC,IAAI,GAAGH,QAAQ,CAAC,CAACpC,WAAW,CAAC6B,KAAb,GAAqB9B,IAAtB,CAArB;;AAEA,YAAIR,QAAJ,EAAc;AACZ,gBAAMiD,SAAS,GAAGD,IAAI,GAAGJ,MAAzB;AACAJ,UAAAA,gBAAgB,GAAGd,UAAU,CAACwB,sBAAsB,CAAC,CAACD,SAAD,GAAazC,IAAd,CAAvB,EAA4CoB,UAA5C,CAA7B;AACD,SAHD,MAIK;AACH,gBAAMqB,SAAS,GAAGP,IAAI,CAACS,GAAL,CAASnC,OAAO,GAAG,CAAnB,EAAsB0B,IAAI,CAACU,GAAL,CAAS,CAAT,EAAYJ,IAAI,GAAGJ,MAAnB,CAAtB,CAAlB;AACAJ,UAAAA,gBAAgB,GAAGd,UAAU,CAACwB,sBAAsB,CAAC,CAACD,SAAD,GAAazC,IAAd,CAAvB,EAA4CoB,UAA5C,CAA7B;AACD;AACF;;AAED,UAAI,CAAChC,aAAD,IAAkBC,WAAtB,EAAmC;AACjC;AACA,cAAMwD,QAAQ,GAAGX,IAAI,CAACY,KAAL,CAAW,CAACjB,MAAM,GAAGE,QAAQ,GAAG,GAArB,IAA4B/B,IAAvC,IAA+CA,IAAhE;AACAgC,QAAAA,gBAAgB,GAAGd,UAAU,CAACwB,sBAAsB,CAACG,QAAD,CAAvB,EAAmCzB,UAAnC,CAA7B;AACD;AACF;;AAEDnB,IAAAA,WAAW,CAAC6B,KAAZ,GAAoBE,gBAApB;;AAEA,aAASU,sBAAT,CAAgCzC,WAAhC,EAAqD;AACnD,UAAI,CAACT,QAAD,IAAa,CAACK,iBAAlB,EAAqC;AACnC,cAAMkD,KAAK,GAAGjC,QAAQ,EAAtB;AACA,cAAMkC,IAAI,GAAGd,IAAI,CAACc,IAAL,CAAU/C,WAAV,CAAb;AACA,eAAO+C,IAAI,GAAGd,IAAI,CAACU,GAAL,CAAS,CAAT,EAAYV,IAAI,CAACS,GAAL,CAASI,KAAT,EAAgBb,IAAI,CAACC,GAAL,CAASlC,WAAT,CAAhB,CAAZ,CAAd;AACD;;AAED,aAAOA,WAAP;AACD;AACF,GAtDmB,EAuDpB,CACEiB,UADF,EAEElB,IAFF,EAGEQ,OAHF,EAIEhB,QAJF,EAKEH,WALF,EAMEY,WANF,EAOEb,aAPF,EAQEwB,iBAAiB,CAACkB,KARpB,EASEhC,yBATF,EAUEa,oBAAoB,CAACmB,KAVvB,CAvDoB,CAAtB;AAqEA,QAAMmB,QAAQ,GAAG/E,KAAK,CAAC6C,WAAN,CACdY,UAAD,IAAyB;AACvB;;AACA,QAAIA,UAAJ,EAAgB;AACdjB,MAAAA,QAAQ,CAACoB,KAAT,GAAiB,KAAjB;AACAzB,MAAAA,WAAW,IAAI9B,OAAO,CAAC8B,WAAD,CAAP,EAAf;AACD;AACF,GAPc,EAQf,CAACA,WAAD,EAAcK,QAAd,CARe,CAAjB;AAWA,QAAMwC,WAAW,GAAGhF,KAAK,CAAC6C,WAAN,CAAkB,MAAM;AAC1C;;AACAL,IAAAA,QAAQ,CAACoB,KAAT,GAAiB,IAAjB;AACA7B,IAAAA,WAAW,CAAC6B,KAAZ,GAAoBjD,SAAS,CAC3B;AAAEkD,MAAAA,QAAQ,EAAEnB,iBAAiB,CAACkB;AAA9B,KAD2B,EAE3BH,UAAU,IAAIsB,QAAQ,CAACtB,UAAD,CAFK,CAA7B;AAID,GAPmB,EAOjB,CAACsB,QAAD,EAAWrC,iBAAiB,CAACkB,KAA7B,EAAoCpB,QAApC,EAA8CT,WAA9C,CAPiB,CAApB;AASA,QAAMkD,aAAa,GAAGjF,KAAK,CAAC6C,WAAN,CAAkB,MAAM;AAC5C;;AACA,QAAIL,QAAQ,CAACoB,KAAb,EACE;;AAEF,QAAI7B,WAAW,CAAC6B,KAAZ,GAAoB,CAAxB,EAA2B;AACzB,UAAInB,oBAAoB,CAACmB,KAArB,GAA6B,CAAjC,EAAoC;AAClCoB,QAAAA,WAAW;AACX;AACD;;AACD,UAAI,CAAC1D,QAAL,EAAe;AACbS,QAAAA,WAAW,CAAC6B,KAAZ,GAAoBZ,UAAU,CAAC,CAAD,CAA9B;AACA;AACD;AACF;;AAED,QAAIjB,WAAW,CAAC6B,KAAZ,GAAoB,EAAE,CAACtB,OAAO,GAAG,CAAX,IAAgBR,IAAlB,CAAxB,EAAiD;AAC/C,UAAIW,oBAAoB,CAACmB,KAArB,GAA6B,CAAjC,EAAoC;AAClCoB,QAAAA,WAAW;AACX;AACD;;AACD,UAAI,CAAC1D,QAAL,EACES,WAAW,CAAC6B,KAAZ,GAAoBZ,UAAU,CAAC,EAAE,CAACV,OAAO,GAAG,CAAX,IAAgBR,IAAlB,CAAD,CAA9B;AACH;AACF,GAxBqB,EAwBnB,CACDU,QAAQ,CAACoB,KADR,EAED7B,WAFC,EAGDO,OAHC,EAIDR,IAJC,EAKDW,oBAAoB,CAACmB,KALpB,EAMDtC,QANC,EAOD0D,WAPC,EAQDhC,UARC,CAxBmB,CAAtB;AAmCAzC,EAAAA,mBAAmB,CACjB,MAAMwB,WAAW,CAAC6B,KADD,EAEjB,MAAM;AACJ,QAAI,CAAC1C,aAAL,EACE+D,aAAa;AAChB,GALgB,EAMjB,CAAC/D,aAAD,EAAgB+D,aAAhB,CANiB,CAAnB;;AASA,WAAST,sBAAT,CAAgCzC,WAAhC,EAAqD;AACnD;;AAEA,QAAI,CAACT,QAAD,IAAa,CAACK,iBAAlB,EAAqC;AACnC,YAAMkD,KAAK,GAAGjC,QAAQ,EAAtB;AACA,YAAMkC,IAAI,GAAGd,IAAI,CAACc,IAAL,CAAU/C,WAAV,CAAb;AACA,aAAO+C,IAAI,GAAGd,IAAI,CAACU,GAAL,CAAS,CAAT,EAAYV,IAAI,CAACS,GAAL,CAASI,KAAT,EAAgBb,IAAI,CAACC,GAAL,CAASlC,WAAT,CAAhB,CAAZ,CAAd;AACD;;AAED,WAAOA,WAAP;AACD;;AAED,QAAMmD,sBAAsB,GAAG5E,yBAAyB,CAItD;AACE6E,IAAAA,OAAO,EAAE,CAACC,CAAD,EAAIC,GAAJ,KAAY;AACnB7C,MAAAA,QAAQ,CAACoB,KAAT,GAAiB,IAAjB;AACAyB,MAAAA,GAAG,CAACC,UAAJ,GAAiB,IAAjB;AACApD,MAAAA,aAAa,IAAI7B,OAAO,CAAC6B,aAAD,CAAP,EAAjB;AAEAmD,MAAAA,GAAG,CAACX,GAAJ,GAAU,CAACpC,OAAO,GAAG,CAAX,IAAgBR,IAA1B;AACA,UAAI,CAACR,QAAD,IAAa,CAACK,iBAAlB,EACE0D,GAAG,CAACX,GAAJ,GAAU9B,QAAQ,EAAlB;AAEFyC,MAAAA,GAAG,CAACE,SAAJ,GAAgBxD,WAAW,CAAC6B,KAA5B;AACD,KAXH;AAYE4B,IAAAA,QAAQ,EAAE,CAACC,CAAD,EAAIJ,GAAJ,KAAY;AACpB,UAAIA,GAAG,CAACC,UAAR,EAAoB;AAClBD,QAAAA,GAAG,CAACC,UAAJ,GAAiB,KAAjB;AACAnF,QAAAA,eAAe,CAAC4B,WAAD,CAAf;AACD;;AACDS,MAAAA,QAAQ,CAACoB,KAAT,GAAiB,IAAjB;AACA,UAAI;AAAE8B,QAAAA,YAAF;AAAgBC,QAAAA;AAAhB,UAAiCF,CAArC;AAEA,YAAMG,gBAAgB,GAAGrD,YAAY,CAACqB,KAAb,GAAqB8B,YAArB,GAAoCC,YAA7D;;AAEA,UAAI,OAAO/D,yBAAP,KAAqC,QAArC,IAAiDoC,IAAI,CAACC,GAAL,CAAS2B,gBAAT,IAA6BhE,yBAAlF,EAA6G;AAC3G,cAAMiE,SAAS,GAAG7B,IAAI,CAACC,GAAL,CAAS2B,gBAAT,IAA6BhE,yBAA/C;AACA,cAAMkE,iBAAiB,GAAGlE,yBAAyB,GAAGiE,SAAS,GAAG,GAAlE;AAEAH,QAAAA,YAAY,GAAGnD,YAAY,CAACqB,KAAb,GAAqBkC,iBAAiB,GAAG9B,IAAI,CAACc,IAAL,CAAUY,YAAV,CAAzC,GAAmEA,YAAlF;AACAC,QAAAA,YAAY,GAAG,CAACpD,YAAY,CAACqB,KAAd,GAAsBkC,iBAAiB,GAAG9B,IAAI,CAACc,IAAL,CAAUa,YAAV,CAA1C,GAAoEA,YAAnF;AACD;;AAED,YAAMI,cAAc,GAAGxD,YAAY,CAACqB,KAAb,GAAqB8B,YAArB,GAAoCC,YAA3D;;AACA,UAAI,CAACrE,QAAL,EAAe;AACb,YAAKS,WAAW,CAAC6B,KAAZ,GAAoB,CAApB,IAAyB7B,WAAW,CAAC6B,KAAZ,GAAoB,CAACyB,GAAG,CAACX,GAAvD,EAA6D;AAC3D,gBAAMsB,QAAQ,GAAGjE,WAAW,CAAC6B,KAAZ,GAAoB,CAApB,GAAwB,CAAxB,GAA4B,CAACyB,GAAG,CAACX,GAAlD;AACA,gBAAMuB,KAAK,GAAGD,QAAQ,GAAGX,GAAG,CAACE,SAA7B;AACA,gBAAMW,OAAO,GAAGH,cAAc,GAAGE,KAAjC;AACAlE,UAAAA,WAAW,CAAC6B,KAAZ,GAAoBoC,QAAQ,GAAGE,OAAO,GAAG,GAAzC;AACA;AACD;AACF;;AAED,YAAMC,gBAAgB,GAAGd,GAAG,CAACE,SAAJ,GAAgBQ,cAAzC;AAEAhE,MAAAA,WAAW,CAAC6B,KAAZ,GAAoBuC,gBAApB;AACD,KA5CH;AA6CEC,IAAAA,KAAK,EAAE,CAACX,CAAD,EAAIJ,GAAJ,KAAY;AACjB,YAAM;AAAEgB,QAAAA,SAAF;AAAaC,QAAAA,SAAb;AAAwBZ,QAAAA,YAAxB;AAAsCC,QAAAA;AAAtC,UAAuDF,CAA7D;AACA/C,MAAAA,iBAAiB,CAACkB,KAAlB,GAA0BrB,YAAY,CAACqB,KAAb,GACtByC,SADsB,GAEtBC,SAFJ;AAGA7D,MAAAA,oBAAoB,CAACmB,KAArB,GAA6BrB,YAAY,CAACqB,KAAb,GACzB8B,YADyB,GAEzBC,YAFJ;AAIA,YAAMC,gBAAgB,GAAGrD,YAAY,CAACqB,KAAb,GAAqB8B,YAArB,GAAoCC,YAA7D;;AAEA,UAAI,OAAO/D,yBAAP,KAAqC,QAArC,IAAiDoC,IAAI,CAACC,GAAL,CAAS2B,gBAAT,IAA6BhE,yBAAlF,EAA6G;AAC3G,cAAM+C,QAAQ,GAAGX,IAAI,CAACY,KAAL,CAAW,CAACS,GAAG,CAACE,SAAJ,GAAgB3D,yBAAyB,GAAGoC,IAAI,CAACc,IAAL,CAAUc,gBAAV,CAA7C,IAA4E9D,IAAvF,IAA+FA,IAAhH;AACAC,QAAAA,WAAW,CAAC6B,KAAZ,GAAoBZ,UAAU,CAACwB,sBAAsB,CAACG,QAAD,CAAvB,EAAmCxC,WAAnC,CAA9B;AACD,OAHD,MAIK;AACHuB,QAAAA,aAAa,CAACvB,WAAD,CAAb;AACD;;AAED,UAAI,CAACb,QAAL,EACEkB,QAAQ,CAACoB,KAAT,GAAiB,KAAjB;AACH;AAlEH,GAJsD,EAwEtD,CACE1C,aADF,EAEEqB,YAAY,CAACqB,KAFf,EAGEtC,QAHF,EAIEgB,OAJF,EAKER,IALF,EAMEX,WANF,EAOEe,aAPF,EAQEC,WARF,CAxEsD,CAAxD;AAoFA,sBACE,oBAAC,iBAAD,eACMf,sBADN;AAEE,IAAA,OAAO,EAAEK,OAFX;AAGE,IAAA,cAAc,EAAEyD;AAHlB,mBAKE,oBAAC,QAAD,CAAU,IAAV;AACE,IAAA,GAAG,EAAEvC,YADP;AAEE,IAAA,MAAM,EAAEX,MAFV;AAGE,IAAA,KAAK,EAAEC,KAHT;AAIE,IAAA,YAAY,EAAEG,YAJhB;AAKE,IAAA,UAAU,EAAEC;AALd,KAOGrB,KAAK,CAACuF,QAPT,CALF,CADF;AAiBD,CAlUD;;AAoUA,OAAO,MAAMC,iBAAiB,GAAGzF,kBAA1B","sourcesContent":["import React from \"react\";\nimport type { StyleProp, ViewStyle } from \"react-native\";\nimport type { PanGestureHandlerGestureEvent } from \"react-native-gesture-handler\";\nimport {\n PanGestureHandler,\n} from \"react-native-gesture-handler\";\nimport Animated, {\n cancelAnimation,\n measure,\n runOnJS,\n useAnimatedGestureHandler,\n useAnimatedReaction,\n useAnimatedRef,\n useDerivedValue,\n useSharedValue,\n withDecay,\n} from \"react-native-reanimated\";\n\nimport { Easing } from \"./constants\";\nimport { CTX } from \"./store\";\nimport type { WithTimingAnimation } from \"./types\";\nimport { dealWithAnimation } from \"./utils/dealWithAnimation\";\n\ninterface GestureContext extends Record<string, unknown> {\n validStart: boolean\n panOffset: number\n max: number\n}\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<Props> = (props) => {\n const {\n props: {\n vertical,\n pagingEnabled,\n snapEnabled,\n panGestureHandlerProps,\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 touching = useSharedValue(false);\n const scrollEndTranslation = useSharedValue(0);\n const scrollEndVelocity = useSharedValue(0);\n const containerRef = useAnimatedRef<Animated.View>();\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 (typeof maxScrollDistancePerSwipe === \"number\" && 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 ],\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 panGestureEventHandler = useAnimatedGestureHandler<\n PanGestureHandlerGestureEvent,\n GestureContext\n >(\n {\n onStart: (_, ctx) => {\n touching.value = true;\n ctx.validStart = true;\n onScrollBegin && runOnJS(onScrollBegin)();\n\n ctx.max = (maxPage - 1) * size;\n if (!infinite && !overscrollEnabled)\n ctx.max = getLimit();\n\n ctx.panOffset = translation.value;\n },\n onActive: (e, ctx) => {\n if (ctx.validStart) {\n ctx.validStart = false;\n cancelAnimation(translation);\n }\n touching.value = true;\n let { translationX, translationY } = e;\n\n const totalTranslation = isHorizontal.value ? translationX : translationY;\n\n if (typeof maxScrollDistancePerSwipe === \"number\" && Math.abs(totalTranslation) > maxScrollDistancePerSwipe) {\n const overSwipe = Math.abs(totalTranslation) - maxScrollDistancePerSwipe;\n const dampedTranslation = maxScrollDistancePerSwipe + overSwipe * 0.5;\n\n translationX = isHorizontal.value ? dampedTranslation * Math.sign(translationX) : translationX;\n translationY = !isHorizontal.value ? dampedTranslation * Math.sign(translationY) : translationY;\n }\n\n const panTranslation = isHorizontal.value ? translationX : translationY;\n if (!infinite) {\n if ((translation.value > 0 || translation.value < -ctx.max)) {\n const boundary = translation.value > 0 ? 0 : -ctx.max;\n const fixed = boundary - ctx.panOffset;\n const dynamic = panTranslation - fixed;\n translation.value = boundary + dynamic * 0.5;\n return;\n }\n }\n\n const translationValue = ctx.panOffset + panTranslation;\n\n translation.value = translationValue;\n },\n onEnd: (e, ctx) => {\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 = isHorizontal.value ? translationX : translationY;\n\n if (typeof maxScrollDistancePerSwipe === \"number\" && Math.abs(totalTranslation) > maxScrollDistancePerSwipe) {\n const nextPage = Math.round((ctx.panOffset + 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 },\n [\n pagingEnabled,\n isHorizontal.value,\n infinite,\n maxPage,\n size,\n snapEnabled,\n onScrollBegin,\n onScrollEnd,\n ],\n );\n\n return (\n <PanGestureHandler\n {...panGestureHandlerProps}\n enabled={enabled}\n onGestureEvent={panGestureEventHandler}\n >\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 </PanGestureHandler>\n );\n};\n\nexport const ScrollViewGesture = IScrollViewGesture;\n"]}
@@ -136,6 +136,12 @@ export declare type TCarouselProps<T = any> = {
136
136
  * Used to locate this view in end-to-end tests.
137
137
  */
138
138
  testID?: string;
139
+ /**
140
+ * Maximum offset value for once scroll.
141
+ * props.vertical = true => maxScrollDistancePerSwipeY
142
+ * props.vertical = false => maxScrollDistancePerSwipeX
143
+ * */
144
+ maxScrollDistancePerSwipe?: number;
139
145
  /**
140
146
  * Custom carousel config.
141
147
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-reanimated-carousel",
3
- "version": "3.3.2",
3
+ "version": "3.4.0",
4
4
  "description": "Simple carousel component.fully implemented using Reanimated 2.Infinitely scrolling, very smooth.",
5
5
  "main": "lib/commonjs/index",
6
6
  "react-native": "src/index.tsx",
@@ -52,6 +52,7 @@ const IScrollViewGesture: React.FC<Props> = (props) => {
52
52
  enabled,
53
53
  dataLength,
54
54
  overscrollEnabled,
55
+ maxScrollDistancePerSwipe,
55
56
  },
56
57
  } = React.useContext(CTX);
57
58
 
@@ -122,33 +123,39 @@ const IScrollViewGesture: React.FC<Props> = (props) => {
122
123
  // Default to scroll in the direction of the slide (with deceleration)
123
124
  let finalTranslation: number = withDecay({ velocity, deceleration: 0.999 });
124
125
 
126
+ // If the distance of the swipe exceeds the max scroll distance, keep the view at the current position
127
+ if (typeof maxScrollDistancePerSwipe === "number" && Math.abs(scrollEndTranslation.value) > maxScrollDistancePerSwipe) {
128
+ finalTranslation = origin;
129
+ }
130
+ else {
125
131
  /**
126
132
  * The page size is the same as the item size.
127
133
  * If direction is vertical, the page size is the height of the item.
128
134
  * If direction is horizontal, the page size is the width of the item.
129
- *
130
- * `page size` equals to `size` variable.
131
- * */
132
- if (pagingEnabled) {
133
- // distance with direction
134
- const offset = -(scrollEndTranslation.value >= 0 ? 1 : -1); // 1 or -1
135
- const computed = offset < 0 ? Math.ceil : Math.floor;
136
- const page = computed(-translation.value / size);
137
-
138
- if (infinite) {
139
- const finalPage = page + offset;
140
- finalTranslation = withSpring(withProcessTranslation(-finalPage * size), onFinished);
141
- }
142
- else {
143
- const finalPage = Math.min(maxPage - 1, Math.max(0, page + offset));
144
- finalTranslation = withSpring(withProcessTranslation(-finalPage * size), onFinished);
135
+ *
136
+ * `page size` equals to `size` variable.
137
+ * */
138
+ if (pagingEnabled) {
139
+ // distance with direction
140
+ const offset = -(scrollEndTranslation.value >= 0 ? 1 : -1); // 1 or -1
141
+ const computed = offset < 0 ? Math.ceil : Math.floor;
142
+ const page = computed(-translation.value / size);
143
+
144
+ if (infinite) {
145
+ const finalPage = page + offset;
146
+ finalTranslation = withSpring(withProcessTranslation(-finalPage * size), onFinished);
147
+ }
148
+ else {
149
+ const finalPage = Math.min(maxPage - 1, Math.max(0, page + offset));
150
+ finalTranslation = withSpring(withProcessTranslation(-finalPage * size), onFinished);
151
+ }
145
152
  }
146
- }
147
153
 
148
- if (!pagingEnabled && snapEnabled) {
149
- // scroll to the nearest item
150
- const nextPage = Math.round((origin + velocity * 0.4) / size) * size;
151
- finalTranslation = withSpring(withProcessTranslation(nextPage), onFinished);
154
+ if (!pagingEnabled && snapEnabled) {
155
+ // scroll to the nearest item
156
+ const nextPage = Math.round((origin + velocity * 0.4) / size) * size;
157
+ finalTranslation = withSpring(withProcessTranslation(nextPage), onFinished);
158
+ }
152
159
  }
153
160
 
154
161
  translation.value = finalTranslation;
@@ -164,15 +171,16 @@ const IScrollViewGesture: React.FC<Props> = (props) => {
164
171
  }
165
172
  },
166
173
  [
167
- translation,
168
- scrollEndVelocity.value,
169
- pagingEnabled,
174
+ withSpring,
170
175
  size,
171
- scrollEndTranslation.value,
176
+ maxPage,
172
177
  infinite,
173
- withSpring,
174
178
  snapEnabled,
175
- maxPage,
179
+ translation,
180
+ pagingEnabled,
181
+ scrollEndVelocity.value,
182
+ maxScrollDistancePerSwipe,
183
+ scrollEndTranslation.value,
176
184
  ],
177
185
  );
178
186
 
@@ -240,6 +248,18 @@ const IScrollViewGesture: React.FC<Props> = (props) => {
240
248
  [pagingEnabled, resetBoundary],
241
249
  );
242
250
 
251
+ function withProcessTranslation(translation: number) {
252
+ "worklet";
253
+
254
+ if (!infinite && !overscrollEnabled) {
255
+ const limit = getLimit();
256
+ const sign = Math.sign(translation);
257
+ return sign * Math.max(0, Math.min(limit, Math.abs(translation)));
258
+ }
259
+
260
+ return translation;
261
+ }
262
+
243
263
  const panGestureEventHandler = useAnimatedGestureHandler<
244
264
  PanGestureHandlerGestureEvent,
245
265
  GestureContext
@@ -262,10 +282,19 @@ const IScrollViewGesture: React.FC<Props> = (props) => {
262
282
  cancelAnimation(translation);
263
283
  }
264
284
  touching.value = true;
265
- const { translationX, translationY } = e;
266
- const panTranslation = isHorizontal.value
267
- ? translationX
268
- : translationY;
285
+ let { translationX, translationY } = e;
286
+
287
+ const totalTranslation = isHorizontal.value ? translationX : translationY;
288
+
289
+ if (typeof maxScrollDistancePerSwipe === "number" && Math.abs(totalTranslation) > maxScrollDistancePerSwipe) {
290
+ const overSwipe = Math.abs(totalTranslation) - maxScrollDistancePerSwipe;
291
+ const dampedTranslation = maxScrollDistancePerSwipe + overSwipe * 0.5;
292
+
293
+ translationX = isHorizontal.value ? dampedTranslation * Math.sign(translationX) : translationX;
294
+ translationY = !isHorizontal.value ? dampedTranslation * Math.sign(translationY) : translationY;
295
+ }
296
+
297
+ const panTranslation = isHorizontal.value ? translationX : translationY;
269
298
  if (!infinite) {
270
299
  if ((translation.value > 0 || translation.value < -ctx.max)) {
271
300
  const boundary = translation.value > 0 ? 0 : -ctx.max;
@@ -277,9 +306,10 @@ const IScrollViewGesture: React.FC<Props> = (props) => {
277
306
  }
278
307
 
279
308
  const translationValue = ctx.panOffset + panTranslation;
309
+
280
310
  translation.value = translationValue;
281
311
  },
282
- onEnd: (e) => {
312
+ onEnd: (e, ctx) => {
283
313
  const { velocityX, velocityY, translationX, translationY } = e;
284
314
  scrollEndVelocity.value = isHorizontal.value
285
315
  ? velocityX
@@ -288,7 +318,15 @@ const IScrollViewGesture: React.FC<Props> = (props) => {
288
318
  ? translationX
289
319
  : translationY;
290
320
 
291
- endWithSpring(onScrollEnd);
321
+ const totalTranslation = isHorizontal.value ? translationX : translationY;
322
+
323
+ if (typeof maxScrollDistancePerSwipe === "number" && Math.abs(totalTranslation) > maxScrollDistancePerSwipe) {
324
+ const nextPage = Math.round((ctx.panOffset + maxScrollDistancePerSwipe * Math.sign(totalTranslation)) / size) * size;
325
+ translation.value = withSpring(withProcessTranslation(nextPage), onScrollEnd);
326
+ }
327
+ else {
328
+ endWithSpring(onScrollEnd);
329
+ }
292
330
 
293
331
  if (!infinite)
294
332
  touching.value = false;
package/src/types.ts CHANGED
@@ -153,6 +153,12 @@ export type TCarouselProps<T = any> = {
153
153
  * Used to locate this view in end-to-end tests.
154
154
  */
155
155
  testID?: string
156
+ /**
157
+ * Maximum offset value for once scroll.
158
+ * props.vertical = true => maxScrollDistancePerSwipeY
159
+ * props.vertical = false => maxScrollDistancePerSwipeX
160
+ * */
161
+ maxScrollDistancePerSwipe?: number
156
162
  /**
157
163
  * Custom carousel config.
158
164
  */