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 +2 -0
- package/README.zh-CN.md +2 -0
- package/lib/commonjs/ScrollViewGesture.js +1 -1
- package/lib/commonjs/ScrollViewGesture.js.map +1 -1
- package/lib/module/ScrollViewGesture.js +67 -32
- package/lib/module/ScrollViewGesture.js.map +1 -1
- package/lib/typescript/types.d.ts +6 -0
- package/package.json +1 -1
- package/src/ScrollViewGesture.tsx +71 -33
- package/src/types.ts +6 -0
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":"6PAAA,oDAGA,uEAGA,uFAYA,sCACA,8BAEA,4D,soCAoBA,GAAMA,CAAAA,kBAAmC,CAAG,QAAtCA,CAAAA,kBAAsC,CAACC,KAAD,CAAW,CACrD,sBAcIC,eAAMC,UAAN,CAAiBC,UAAjB,CAdJ,yCACEH,KADF,CAEII,QAFJ,uBAEIA,QAFJ,CAGIC,aAHJ,uBAGIA,aAHJ,CAIIC,WAJJ,uBAIIA,WAJJ,CAKIC,sBALJ,uBAKIA,sBALJ,CAMUC,QANV,uBAMIC,IANJ,CAOIC,uBAPJ,uBAOIA,uBAPJ,CAQIC,aARJ,uBAQIA,aARJ,CASIC,OATJ,uBASIA,OATJ,CAUIC,UAVJ,uBAUIA,UAVJ,CAWIC,iBAXJ,uBAWIA,iBAXJ,CAYIC,yBAZJ,uBAYIA,yBAZJ,CAgBA,GACEC,CAAAA,IADF,CASIhB,KATJ,CACEgB,IADF,CAEEC,WAFF,CASIjB,KATJ,CAEEiB,WAFF,CAGEC,MAHF,CASIlB,KATJ,CAGEkB,MAHF,cASIlB,KATJ,CAIEmB,KAJF,CAIEA,KAJF,uBAIU,EAJV,cAKEC,aALF,CASIpB,KATJ,CAKEoB,aALF,CAMEC,WANF,CASIrB,KATJ,CAMEqB,WANF,CAOEC,YAPF,CASItB,KATJ,CAOEsB,YAPF,CAQEC,UARF,CASIvB,KATJ,CAQEuB,UARF,CAWA,GAAMC,CAAAA,OAAO,CAAGX,UAAhB,CACA,GAAMY,CAAAA,YAAY,CAAG,6DAAgB,oBAAM,CAACrB,QAAP,EAAhB,uBArEfA,QAqEe,sQAAiC,CAACA,QAAD,CAAjC,CAArB,CACA,GAAMsB,CAAAA,QAAQ,CAAG,0CAAe,KAAf,CAAjB,CACA,GAAMC,CAAAA,oBAAoB,CAAG,0CAAe,CAAf,CAA7B,CACA,GAAMC,CAAAA,iBAAiB,CAAG,0CAAe,CAAf,CAA1B,CACA,GAAMC,CAAAA,YAAY,CAAG,2CAArB,CAGA,GAAMC,CAAAA,QAAQ,CAAG7B,eAAM8B,WAAN,gCAAwB,CAGvC,GAAI,CAACvB,QAAD,EAAa,CAACM,iBAAlB,CAAqC,CACnC,aAAsC,mCAAQe,YAAR,CAAtC,yBAAQG,KAAR,CAAeC,cAAf,yBAAgC,CAAhC,gBAGA,GAAIpB,UAAU,CAAGG,IAAb,CAAoBiB,cAAxB,CACE,MAAO,EAAP,CAGF,MAAOpB,CAAAA,UAAU,CAAGG,IAAb,CAAoBiB,cAA3B,CACD,CAED,MAAOpB,CAAAA,UAAU,CAAGG,IAApB,CACD,CAfgB,uBA3EZR,QA2EY,mBA3ECM,iBA2ED,SAxEXoB,8BAwEW,cAxEHL,YAwEG,YAjEVhB,UAiEU,MAjEGG,IAiEH,4eAed,CAACR,QAAD,CAAWQ,IAAX,CAAiBH,UAAjB,CAA6BC,iBAA7B,CAfc,CAAjB,CAiBA,GAAMqB,CAAAA,UAAU,CAAGlC,eAAM8B,WAAN,+BAChBK,OADgB,CACCC,UADD,CAC6B,CAE5C,GAAMC,CAAAA,oBAAyC,CAAG,CAChDC,IAAI,CAAE,QAD0C,CAEhDC,MAAM,CAAE,CACNC,QAAQ,CAAE/B,uBAAuB,CAAG,GAD9B,CAENgC,MAAM,CAAEC,kBAAOC,YAFT,CAFwC,CAAlD,CAQA,MAAO,yCAAkBjC,aAAlB,OAAkBA,aAAlB,CAAmC2B,oBAAnC,EACLF,OADK,+BAEJS,UAFI,CAEoB,CAEvB,GAAIA,UAAJ,CACER,UAAU,EAAI,mCAAQA,UAAR,GAAd,CACH,CANI,yBAvG2BA,UAuG3B,SAvGmBS,8BAuGnB,yTAAP,CAQD,CAnBgB,sCAzFLpC,uBAyFK,sBAxFPiC,kBAAOC,YAwFA,oBArFZG,oCAqFY,eArFMpC,aAqFN,SAlFamC,8BAkFb,sqBAoBjB,CAACpC,uBAAD,CAA0BC,aAA1B,CApBiB,CAAnB,CAuBA,GAAMqC,CAAAA,aAAa,CAAG/C,eAAM8B,WAAN,+BACnBM,UADmB,CACS,CAE3B,GAAMY,CAAAA,MAAM,CAAGhC,WAAW,CAACiC,KAA3B,CACA,GAAMC,CAAAA,QAAQ,CAAGvB,iBAAiB,CAACsB,KAAnC,CAEA,GAAIE,CAAAA,gBAAwB,CAAG,qCAAU,CAAED,QAAQ,CAARA,QAAF,CAAYE,YAAY,CAAE,KAA1B,CAAV,CAA/B,CAGA,GAAI,MAAOtC,CAAAA,yBAAP,GAAqC,QAArC,EAAiDuC,IAAI,CAACC,GAAL,CAAS5B,oBAAoB,CAACuB,KAA9B,EAAuCnC,yBAA5F,CAAuH,CACrHqC,gBAAgB,CAAGH,MAAnB,CACD,CAFD,IAGK,CAQH,GAAI5C,aAAJ,CAAmB,CAEjB,GAAMmD,CAAAA,MAAM,CAAG,EAAE7B,oBAAoB,CAACuB,KAArB,EAA8B,CAA9B,CAAkC,CAAlC,CAAsC,CAAC,CAAzC,CAAf,CACA,GAAMO,CAAAA,QAAQ,CAAGD,MAAM,CAAG,CAAT,CAAaF,IAAI,CAACI,IAAlB,CAAyBJ,IAAI,CAACK,KAA/C,CACA,GAAMC,CAAAA,IAAI,CAAGH,QAAQ,CAAC,CAACxC,WAAW,CAACiC,KAAb,CAAqBlC,IAAtB,CAArB,CAEA,GAAIR,QAAJ,CAAc,CACZ,GAAMqD,CAAAA,SAAS,CAAGD,IAAI,CAAGJ,MAAzB,CACAJ,gBAAgB,CAAGjB,UAAU,CAAC2B,sBAAsB,CAAC,CAACD,SAAD,CAAa7C,IAAd,CAAvB,CAA4CqB,UAA5C,CAA7B,CACD,CAHD,IAIK,CACH,GAAMwB,CAAAA,UAAS,CAAGP,IAAI,CAACS,GAAL,CAASvC,OAAO,CAAG,CAAnB,CAAsB8B,IAAI,CAACU,GAAL,CAAS,CAAT,CAAYJ,IAAI,CAAGJ,MAAnB,CAAtB,CAAlB,CACAJ,gBAAgB,CAAGjB,UAAU,CAAC2B,sBAAsB,CAAC,CAACD,UAAD,CAAa7C,IAAd,CAAvB,CAA4CqB,UAA5C,CAA7B,CACD,CACF,CAED,GAAI,CAAChC,aAAD,EAAkBC,WAAtB,CAAmC,CAEjC,GAAM2D,CAAAA,QAAQ,CAAGX,IAAI,CAACY,KAAL,CAAW,CAACjB,MAAM,CAAGE,QAAQ,CAAG,GAArB,EAA4BnC,IAAvC,EAA+CA,IAAhE,CACAoC,gBAAgB,CAAGjB,UAAU,CAAC2B,sBAAsB,CAACG,QAAD,CAAvB,CAAmC5B,UAAnC,CAA7B,CACD,CACF,CAEDpB,WAAW,CAACiC,KAAZ,CAAoBE,gBAApB,CAEA,QAASU,CAAAA,sBAAT,CAAgC7C,WAAhC,CAAqD,CACnD,GAAI,CAACT,QAAD,EAAa,CAACM,iBAAlB,CAAqC,CACnC,GAAMqD,CAAAA,KAAK,CAAGrC,QAAQ,EAAtB,CACA,GAAMsC,CAAAA,IAAI,CAAGd,IAAI,CAACc,IAAL,CAAUnD,WAAV,CAAb,CACA,MAAOmD,CAAAA,IAAI,CAAGd,IAAI,CAACU,GAAL,CAAS,CAAT,CAAYV,IAAI,CAACS,GAAL,CAASI,KAAT,CAAgBb,IAAI,CAACC,GAAL,CAAStC,WAAT,CAAhB,CAAZ,CAAd,CACD,CAED,MAAOA,CAAAA,WAAP,CACD,CACF,CAtDmB,0BA1EtBA,WA0EsB,mBAlHLW,iBAkHK,WAhHSyC,gCAgHT,2BA3GsEtD,yBA2GtE,sBA/FDY,oBA+FC,eAjFftB,aAiFe,MA/E8CW,IA+E9C,UAvEfR,QAuEe,YA9EC2B,UA8ED,SAtFWX,OAsFX,aAjFElB,WAiFF,mBAvEFQ,iBAuEE,UAtEJgB,QAsEI,ghDAuDpB,CACEK,UADF,CAEEnB,IAFF,CAGEQ,OAHF,CAIEhB,QAJF,CAKEF,WALF,CAMEW,WANF,CAOEZ,aAPF,CAQEuB,iBAAiB,CAACsB,KARpB,CASEnC,yBATF,CAUEY,oBAAoB,CAACuB,KAVvB,CAvDoB,CAAtB,CAqEA,GAAMoB,CAAAA,QAAQ,CAAGrE,eAAM8B,WAAN,+BACdc,UADc,CACU,CAEvB,GAAIA,UAAJ,CAAgB,CACdnB,QAAQ,CAACwB,KAAT,CAAiB,KAAjB,CACA7B,WAAW,EAAI,mCAAQA,WAAR,GAAf,CACD,CACF,CAPc,uBAvLfK,QAuLe,aAtLQL,WAsLR,SAtLAyB,8BAsLA,6VAQf,CAACzB,WAAD,CAAcK,QAAd,CARe,CAAjB,CAWA,GAAM6C,CAAAA,WAAW,CAAGtE,eAAM8B,WAAN,gCAAwB,CAE1CL,QAAQ,CAACwB,KAAT,CAAiB,IAAjB,CACAjC,WAAW,CAACiC,KAAZ,CAAoB,qCAClB,CAAEC,QAAQ,CAAEvB,iBAAiB,CAACsB,KAA9B,CADkB,mBAElB,YAAAL,UAAU,QAAIyB,CAAAA,QAAQ,CAACzB,UAAD,CAAZ,EAFQ,uBAvMTyB,QAuMS,4RAApB,CAID,CAPmB,uBAnMpB5C,QAmMoB,aAlMpBT,WAkMoB,WAlMAoD,gCAkMA,mBAjMRzC,iBAiMQ,UAhMH0C,QAgMG,8aAOjB,CAACA,QAAD,CAAW1C,iBAAiB,CAACsB,KAA7B,CAAoCxB,QAApC,CAA8CT,WAA9C,CAPiB,CAApB,CASA,GAAMuD,CAAAA,aAAa,CAAGvE,eAAM8B,WAAN,gCAAwB,CAE5C,GAAIL,QAAQ,CAACwB,KAAb,CACE,OAEF,GAAIjC,WAAW,CAACiC,KAAZ,CAAoB,CAAxB,CAA2B,CACzB,GAAIvB,oBAAoB,CAACuB,KAArB,CAA6B,CAAjC,CAAoC,CAClCqB,WAAW,GACX,OACD,CACD,GAAI,CAAC/D,QAAL,CAAe,CACbS,WAAW,CAACiC,KAAZ,CAAoBf,UAAU,CAAC,CAAD,CAA9B,CACA,OACD,CACF,CAED,GAAIlB,WAAW,CAACiC,KAAZ,CAAoB,EAAE,CAAC1B,OAAO,CAAG,CAAX,EAAgBR,IAAlB,CAAxB,CAAiD,CAC/C,GAAIW,oBAAoB,CAACuB,KAArB,CAA6B,CAAjC,CAAoC,CAClCqB,WAAW,GACX,OACD,CACD,GAAI,CAAC/D,QAAL,CACES,WAAW,CAACiC,KAAZ,CAAoBf,UAAU,CAAC,EAAE,CAACX,OAAO,CAAG,CAAX,EAAgBR,IAAlB,CAAD,CAA9B,CACH,CACF,CAxBqB,uBA5MlBU,QA4MkB,aAxLLT,WAwLK,sBA7LhBU,oBA6LgB,aA5LlB4C,WA4LkB,UAxLf/D,QAwLe,YAxLe2B,UAwLf,SAxL6BX,OAwL7B,MAxL4CR,IAwL5C,ooBAwBnB,CACDU,QAAQ,CAACwB,KADR,CAEDjC,WAFC,CAGDO,OAHC,CAIDR,IAJC,CAKDW,oBAAoB,CAACuB,KALpB,CAMD1C,QANC,CAOD+D,WAPC,CAQDpC,UARC,CAxBmB,CAAtB,CAmCA,iEACE,oBAAMlB,CAAAA,WAAW,CAACiC,KAAlB,EADF,0BAhPKjC,WAgPL,gTAEQ,CACJ,GAAI,CAACZ,aAAL,CACEmE,aAAa,GAChB,CALH,4BA/OKnE,aA+OL,eA/OoBmE,aA+OpB,0SAME,CAACnE,aAAD,CAAgBmE,aAAhB,CANF,EAxMqD,GAiN5CV,CAAAA,sBAjN4C,+BAiNrB7C,WAjNqB,CAiNA,CAGnD,GAAI,CAACT,QAAD,EAAa,CAACM,iBAAlB,CAAqC,CACnC,GAAMqD,CAAAA,KAAK,CAAGrC,QAAQ,EAAtB,CACA,GAAMsC,CAAAA,IAAI,CAAGd,IAAI,CAACc,IAAL,CAAUnD,WAAV,CAAb,CACA,MAAOmD,CAAAA,IAAI,CAAGd,IAAI,CAACU,GAAL,CAAS,CAAT,CAAYV,IAAI,CAACS,GAAL,CAASI,KAAT,CAAgBb,IAAI,CAACC,GAAL,CAAStC,WAAT,CAAhB,CAAZ,CAAd,CACD,CAED,MAAOA,CAAAA,WAAP,CACD,CA3NoD,uBAvChDT,QAuCgD,mBAvCnCM,iBAuCmC,UAtCrCgB,QAsCqC,6dA6NrD,GAAM2C,CAAAA,sBAAsB,CAAG,qDAI7B,CACEC,OAAO,+BAAGC,CAAH,CAAMC,GAAN,CAAc,CACnBlD,QAAQ,CAACwB,KAAT,CAAiB,IAAjB,CACA0B,GAAG,CAACC,UAAJ,CAAiB,IAAjB,CACAzD,aAAa,EAAI,mCAAQA,aAAR,GAAjB,CAEAwD,GAAG,CAACZ,GAAJ,CAAU,CAACxC,OAAO,CAAG,CAAX,EAAgBR,IAA1B,CACA,GAAI,CAACR,QAAD,EAAa,CAACM,iBAAlB,CACE8D,GAAG,CAACZ,GAAJ,CAAUlC,QAAQ,EAAlB,CAEF8C,GAAG,CAACE,SAAJ,CAAgB7D,WAAW,CAACiC,KAA5B,CACD,CAVM,uBAzQXxB,QAyQW,eAvQcN,aAuQd,SAvQM0B,8BAuQN,SAtQAtB,OAsQA,MAtQeR,IAsQf,UArQNR,QAqQM,mBArQOM,iBAqQP,UArQoCgB,QAqQpC,aApQKb,WAoQL,0gBADT,CAYE8D,QAAQ,+BAAGC,CAAH,CAAMJ,GAAN,CAAc,CACpB,GAAIA,GAAG,CAACC,UAAR,CAAoB,CAClBD,GAAG,CAACC,UAAJ,CAAiB,KAAjB,CACA,2CAAgB5D,WAAhB,EACD,CACDS,QAAQ,CAACwB,KAAT,CAAiB,IAAjB,CACA,GAAM+B,CAAAA,YAAN,CAAqCD,CAArC,CAAMC,YAAN,CAAoBC,YAApB,CAAqCF,CAArC,CAAoBE,YAApB,CAEA,GAAMC,CAAAA,gBAAgB,CAAG1D,YAAY,CAACyB,KAAb,CAAqB+B,YAArB,CAAoCC,YAA7D,CAEA,GAAI,MAAOnE,CAAAA,yBAAP,GAAqC,QAArC,EAAiDuC,IAAI,CAACC,GAAL,CAAS4B,gBAAT,EAA6BpE,yBAAlF,CAA6G,CAC3G,GAAMqE,CAAAA,SAAS,CAAG9B,IAAI,CAACC,GAAL,CAAS4B,gBAAT,EAA6BpE,yBAA/C,CACA,GAAMsE,CAAAA,iBAAiB,CAAGtE,yBAAyB,CAAGqE,SAAS,CAAG,GAAlE,CAEAH,YAAY,CAAGxD,YAAY,CAACyB,KAAb,CAAqBmC,iBAAiB,CAAG/B,IAAI,CAACc,IAAL,CAAUa,YAAV,CAAzC,CAAmEA,YAAlF,CACAC,YAAY,CAAG,CAACzD,YAAY,CAACyB,KAAd,CAAsBmC,iBAAiB,CAAG/B,IAAI,CAACc,IAAL,CAAUc,YAAV,CAA1C,CAAoEA,YAAnF,CACD,CAED,GAAMI,CAAAA,cAAc,CAAG7D,YAAY,CAACyB,KAAb,CAAqB+B,YAArB,CAAoCC,YAA3D,CACA,GAAI,CAAC1E,QAAL,CAAe,CACb,GAAKS,WAAW,CAACiC,KAAZ,CAAoB,CAApB,EAAyBjC,WAAW,CAACiC,KAAZ,CAAoB,CAAC0B,GAAG,CAACZ,GAAvD,CAA6D,CAC3D,GAAMuB,CAAAA,QAAQ,CAAGtE,WAAW,CAACiC,KAAZ,CAAoB,CAApB,CAAwB,CAAxB,CAA4B,CAAC0B,GAAG,CAACZ,GAAlD,CACA,GAAMwB,CAAAA,KAAK,CAAGD,QAAQ,CAAGX,GAAG,CAACE,SAA7B,CACA,GAAMW,CAAAA,OAAO,CAAGH,cAAc,CAAGE,KAAjC,CACAvE,WAAW,CAACiC,KAAZ,CAAoBqC,QAAQ,CAAGE,OAAO,CAAG,GAAzC,CACA,OACD,CACF,CAED,GAAMC,CAAAA,gBAAgB,CAAGd,GAAG,CAACE,SAAJ,CAAgBQ,cAAzC,CAEArE,WAAW,CAACiC,KAAZ,CAAoBwC,gBAApB,CACD,CAhCO,8BAlRVC,sCAkRU,aApPZ1E,WAoPY,UA/QZS,QA+QY,cAjQWD,YAiQX,2BAtQgBV,yBAsQhB,UA/PPP,QA+PO,4zCAZV,CA6CEoF,KAAK,+BAAGZ,CAAH,CAAMJ,GAAN,CAAc,CACjB,GAAQiB,CAAAA,SAAR,CAA6Db,CAA7D,CAAQa,SAAR,CAAmBC,SAAnB,CAA6Dd,CAA7D,CAAmBc,SAAnB,CAA8Bb,YAA9B,CAA6DD,CAA7D,CAA8BC,YAA9B,CAA4CC,YAA5C,CAA6DF,CAA7D,CAA4CE,YAA5C,CACAtD,iBAAiB,CAACsB,KAAlB,CAA0BzB,YAAY,CAACyB,KAAb,CACtB2C,SADsB,CAEtBC,SAFJ,CAGAnE,oBAAoB,CAACuB,KAArB,CAA6BzB,YAAY,CAACyB,KAAb,CACzB+B,YADyB,CAEzBC,YAFJ,CAIA,GAAMC,CAAAA,gBAAgB,CAAG1D,YAAY,CAACyB,KAAb,CAAqB+B,YAArB,CAAoCC,YAA7D,CAEA,GAAI,MAAOnE,CAAAA,yBAAP,GAAqC,QAArC,EAAiDuC,IAAI,CAACC,GAAL,CAAS4B,gBAAT,EAA6BpE,yBAAlF,CAA6G,CAC3G,GAAMkD,CAAAA,QAAQ,CAAGX,IAAI,CAACY,KAAL,CAAW,CAACU,GAAG,CAACE,SAAJ,CAAgB/D,yBAAyB,CAAGuC,IAAI,CAACc,IAAL,CAAUe,gBAAV,CAA7C,EAA4EnE,IAAvF,EAA+FA,IAAhH,CACAC,WAAW,CAACiC,KAAZ,CAAoBf,UAAU,CAAC2B,sBAAsB,CAACG,QAAD,CAAvB,CAAmC5C,WAAnC,CAA9B,CACD,CAHD,IAIK,CACH2B,aAAa,CAAC3B,WAAD,CAAb,CACD,CAED,GAAI,CAACb,QAAL,CACEkB,QAAQ,CAACwB,KAAT,CAAiB,KAAjB,CACH,CArBI,gCA/STtB,iBA+SS,cA7SgBH,YA6ShB,sBA9STE,oBA8SS,2BA1SsCZ,yBA0StC,MA1SyGC,IA0SzG,aAzSPC,WAySO,YAzSakB,UAySb,wBAzSwB2B,sBAySxB,aAvSOzC,WAuSP,eAvSP2B,aAuSO,UApSJxC,QAoSI,UApSMkB,QAoSN,ijCA7CP,CAJ6B,CAwE7B,CACErB,aADF,CAEEoB,YAAY,CAACyB,KAFf,CAGE1C,QAHF,CAIEgB,OAJF,CAKER,IALF,CAMEV,WANF,CAOEc,aAPF,CAQEC,WARF,CAxE6B,CAA/B,CAoFA,MACE,8BAAC,4CAAD,0BACMd,sBADN,EAEE,OAAO,CAAEK,OAFX,CAGE,cAAc,CAAE6D,sBAHlB,+EAKE,6BAAC,8BAAD,CAAU,IAAV,EACE,GAAG,CAAE5C,YADP,CAEE,MAAM,CAAEX,MAFV,CAGE,KAAK,CAAEC,KAHT,CAIE,YAAY,CAAEG,YAJhB,CAKE,UAAU,CAAEC,UALd,8EAOGvB,KAAK,CAAC+F,QAPT,CALF,CADF,CAiBD,CAlUD,CAoUO,GAAMC,CAAAA,iBAAiB,CAAGjG,kBAA1B,C","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
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
const
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
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
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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
|
-
}, [
|
|
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
|
-
|
|
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
|
-
|
|
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":"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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"]}
|
|
@@ -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
|
+
"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
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
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
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
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
|
-
|
|
168
|
-
scrollEndVelocity.value,
|
|
169
|
-
pagingEnabled,
|
|
174
|
+
withSpring,
|
|
170
175
|
size,
|
|
171
|
-
|
|
176
|
+
maxPage,
|
|
172
177
|
infinite,
|
|
173
|
-
withSpring,
|
|
174
178
|
snapEnabled,
|
|
175
|
-
|
|
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
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
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
|
-
|
|
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
|
*/
|