react-native-reanimated-carousel 4.0.0-alpha.0 → 4.0.0-alpha.10
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 +22 -162
- package/lib/commonjs/components/BaseLayout.js +95 -0
- package/lib/commonjs/components/BaseLayout.js.map +1 -0
- package/lib/commonjs/components/Carousel.js +210 -0
- package/lib/commonjs/components/Carousel.js.map +1 -0
- package/lib/commonjs/components/ItemRenderer.js +80 -0
- package/lib/commonjs/components/ItemRenderer.js.map +1 -0
- package/lib/commonjs/components/LazyView.js +22 -0
- package/lib/commonjs/components/LazyView.js.map +1 -0
- package/lib/commonjs/components/ScrollViewGesture.js +315 -0
- package/lib/commonjs/components/ScrollViewGesture.js.map +1 -0
- package/lib/commonjs/components/rnr-demo.test.js +45 -0
- package/lib/commonjs/components/rnr-demo.test.js.map +1 -0
- package/lib/commonjs/constants/index.js +21 -1
- package/lib/commonjs/constants/index.js.map +1 -1
- package/lib/commonjs/hooks/useAutoPlay.js +56 -1
- package/lib/commonjs/hooks/useAutoPlay.js.map +1 -1
- package/lib/commonjs/hooks/useCarouselController.js +245 -1
- package/lib/commonjs/hooks/useCarouselController.js.map +1 -1
- package/lib/commonjs/hooks/useCheckMounted.js +23 -1
- package/lib/commonjs/hooks/useCheckMounted.js.map +1 -1
- package/lib/commonjs/hooks/useCommonVariables.js +102 -1
- package/lib/commonjs/hooks/useCommonVariables.js.map +1 -1
- package/lib/commonjs/hooks/useCommonVariables.test.js +38 -0
- package/lib/commonjs/hooks/useCommonVariables.test.js.map +1 -0
- package/lib/commonjs/hooks/useInitProps.js +78 -1
- package/lib/commonjs/hooks/useInitProps.js.map +1 -1
- package/lib/commonjs/hooks/useLayoutConfig.js +39 -1
- package/lib/commonjs/hooks/useLayoutConfig.js.map +1 -1
- package/lib/commonjs/hooks/useOffsetX.js +51 -1
- package/lib/commonjs/hooks/useOffsetX.js.map +1 -1
- package/lib/commonjs/hooks/useOffsetX.test.js +53 -0
- package/lib/commonjs/hooks/useOffsetX.test.js.map +1 -0
- package/lib/commonjs/hooks/useOnProgressChange.js +38 -1
- package/lib/commonjs/hooks/useOnProgressChange.js.map +1 -1
- package/lib/commonjs/hooks/usePanGestureProxy.js +84 -0
- package/lib/commonjs/hooks/usePanGestureProxy.js.map +1 -0
- package/lib/commonjs/hooks/usePanGestureProxy.test.js +397 -0
- package/lib/commonjs/hooks/usePanGestureProxy.test.js.map +1 -0
- package/lib/commonjs/hooks/usePropsErrorBoundary.js +36 -1
- package/lib/commonjs/hooks/usePropsErrorBoundary.js.map +1 -1
- package/lib/commonjs/hooks/useUpdateGestureConfig.js +20 -0
- package/lib/commonjs/hooks/useUpdateGestureConfig.js.map +1 -0
- package/lib/commonjs/hooks/useVisibleRanges.js +71 -1
- package/lib/commonjs/hooks/useVisibleRanges.js.map +1 -1
- package/lib/commonjs/hooks/useVisibleRanges.test.js +162 -0
- package/lib/commonjs/hooks/useVisibleRanges.test.js.map +1 -0
- package/lib/commonjs/index.js +13 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/layouts/index.js +20 -1
- package/lib/commonjs/layouts/index.js.map +1 -1
- package/lib/commonjs/layouts/normal.js +27 -1
- package/lib/commonjs/layouts/normal.js.map +1 -1
- package/lib/commonjs/layouts/parallax.js +38 -1
- package/lib/commonjs/layouts/parallax.js.map +1 -1
- package/lib/commonjs/layouts/stack.js +215 -1
- package/lib/commonjs/layouts/stack.js.map +1 -1
- package/lib/commonjs/store/index.js +14 -1
- package/lib/commonjs/store/index.js.map +1 -1
- package/lib/commonjs/types.js +5 -1
- package/lib/commonjs/utils/compute-offset-if-data-changed.js +52 -0
- package/lib/commonjs/utils/compute-offset-if-data-changed.js.map +1 -0
- package/lib/commonjs/utils/compute-offset-if-data-changed.test.js +30 -0
- package/lib/commonjs/utils/compute-offset-if-data-changed.test.js.map +1 -0
- package/lib/commonjs/utils/compute-offset-if-size-changed.js +18 -0
- package/lib/commonjs/utils/compute-offset-if-size-changed.js.map +1 -0
- package/lib/commonjs/utils/compute-offset-if-size-changed.test.js +72 -0
- package/lib/commonjs/utils/compute-offset-if-size-changed.test.js.map +1 -0
- package/lib/commonjs/utils/computed-with-auto-fill-data.js +124 -0
- package/lib/commonjs/utils/computed-with-auto-fill-data.js.map +1 -0
- package/lib/commonjs/utils/deal-with-animation.js +21 -0
- package/lib/commonjs/utils/deal-with-animation.js.map +1 -0
- package/lib/commonjs/utils/handleroffset-direction.js +16 -0
- package/lib/commonjs/utils/handleroffset-direction.js.map +1 -0
- package/lib/commonjs/utils/handleroffset-direction.test.js +46 -0
- package/lib/commonjs/utils/handleroffset-direction.test.js.map +1 -0
- package/lib/commonjs/utils/index.test.js +74 -0
- package/lib/commonjs/utils/index.test.js.map +1 -0
- package/lib/commonjs/utils/log.js +22 -1
- package/lib/commonjs/utils/log.js.map +1 -1
- package/lib/module/{layouts → components}/BaseLayout.js +6 -16
- package/lib/module/components/BaseLayout.js.map +1 -0
- package/lib/module/{Carousel.js → components/Carousel.js} +33 -52
- package/lib/module/components/Carousel.js.map +1 -0
- package/lib/module/components/ItemRenderer.js +62 -0
- package/lib/module/components/ItemRenderer.js.map +1 -0
- package/lib/module/{ScrollViewGesture.js → components/ScrollViewGesture.js} +59 -32
- package/lib/module/components/ScrollViewGesture.js.map +1 -0
- package/lib/module/components/rnr-demo.test.js +33 -0
- package/lib/module/components/rnr-demo.test.js.map +1 -0
- package/lib/module/hooks/useCarouselController.js +15 -14
- package/lib/module/hooks/useCarouselController.js.map +1 -1
- package/lib/module/hooks/useCommonVariables.js +39 -9
- package/lib/module/hooks/useCommonVariables.js.map +1 -1
- package/lib/module/hooks/useCommonVariables.test.js +34 -0
- package/lib/module/hooks/useCommonVariables.test.js.map +1 -0
- package/lib/module/hooks/useInitProps.js +1 -3
- package/lib/module/hooks/useInitProps.js.map +1 -1
- package/lib/module/hooks/useLayoutConfig.js.map +1 -1
- package/lib/module/hooks/useOffsetX.js +9 -6
- package/lib/module/hooks/useOffsetX.js.map +1 -1
- package/lib/module/hooks/useOffsetX.test.js +48 -0
- package/lib/module/hooks/useOffsetX.test.js.map +1 -0
- package/lib/module/hooks/useOnProgressChange.js +1 -1
- package/lib/module/hooks/useOnProgressChange.js.map +1 -1
- package/lib/module/hooks/usePanGestureProxy.js +71 -0
- package/lib/module/hooks/usePanGestureProxy.js.map +1 -0
- package/lib/module/hooks/usePanGestureProxy.test.js +383 -0
- package/lib/module/hooks/usePanGestureProxy.test.js.map +1 -0
- package/lib/module/hooks/useUpdateGestureConfig.js +10 -0
- package/lib/module/hooks/useUpdateGestureConfig.js.map +1 -0
- package/lib/module/hooks/useVisibleRanges.js +47 -19
- package/lib/module/hooks/useVisibleRanges.js.map +1 -1
- package/lib/module/hooks/useVisibleRanges.test.js +157 -0
- package/lib/module/hooks/useVisibleRanges.test.js.map +1 -0
- package/lib/module/index.js +1 -2
- package/lib/module/index.js.map +1 -1
- package/lib/module/{hooks/computeNewIndexWhenDataChanges.js → utils/compute-offset-if-data-changed.js} +2 -2
- package/lib/module/utils/compute-offset-if-data-changed.js.map +1 -0
- package/lib/module/utils/compute-offset-if-data-changed.test.js +27 -0
- package/lib/module/utils/compute-offset-if-data-changed.test.js.map +1 -0
- package/lib/module/utils/compute-offset-if-size-changed.js +11 -0
- package/lib/module/utils/compute-offset-if-size-changed.js.map +1 -0
- package/lib/module/utils/compute-offset-if-size-changed.test.js +69 -0
- package/lib/module/utils/compute-offset-if-size-changed.test.js.map +1 -0
- package/lib/module/utils/{computedWithAutoFillData.js → computed-with-auto-fill-data.js} +1 -1
- package/lib/module/utils/computed-with-auto-fill-data.js.map +1 -0
- package/lib/module/utils/{dealWithAnimation.js → deal-with-animation.js} +1 -1
- package/lib/module/utils/deal-with-animation.js.map +1 -0
- package/lib/module/utils/handleroffset-direction.js +9 -0
- package/lib/module/utils/handleroffset-direction.js.map +1 -0
- package/lib/module/utils/handleroffset-direction.test.js +41 -0
- package/lib/module/utils/handleroffset-direction.test.js.map +1 -0
- package/lib/module/{hooks → utils}/index.test.js +6 -6
- package/lib/module/utils/index.test.js.map +1 -0
- package/lib/typescript/{Carousel.d.ts → components/Carousel.d.ts} +1 -1
- package/lib/typescript/components/ItemRenderer.d.ts +22 -0
- package/lib/typescript/{ScrollViewGesture.d.ts → components/ScrollViewGesture.d.ts} +1 -1
- package/lib/typescript/hooks/useCarouselController.d.ts +3 -2
- package/lib/typescript/hooks/useCommonVariables.test.d.ts +1 -0
- package/lib/typescript/hooks/useLayoutConfig.d.ts +1 -1
- package/lib/typescript/hooks/useOffsetX.test.d.ts +1 -0
- package/lib/typescript/hooks/usePanGestureProxy.d.ts +9 -0
- package/lib/typescript/hooks/usePanGestureProxy.test.d.ts +1 -0
- package/lib/typescript/hooks/useUpdateGestureConfig.d.ts +5 -0
- package/lib/typescript/hooks/useVisibleRanges.d.ts +8 -4
- package/lib/typescript/hooks/useVisibleRanges.test.d.ts +1 -0
- package/lib/typescript/index.d.ts +3 -2
- package/lib/typescript/types.d.ts +113 -104
- package/lib/typescript/{hooks/computeNewIndexWhenDataChanges.d.ts → utils/compute-offset-if-data-changed.d.ts} +1 -1
- package/lib/typescript/utils/compute-offset-if-data-changed.test.d.ts +1 -0
- package/lib/typescript/utils/compute-offset-if-size-changed.d.ts +5 -0
- package/lib/typescript/utils/compute-offset-if-size-changed.test.d.ts +1 -0
- package/lib/typescript/utils/handleroffset-direction.d.ts +3 -0
- package/lib/typescript/utils/handleroffset-direction.test.d.ts +1 -0
- package/lib/typescript/utils/index.test.d.ts +1 -0
- package/package.json +32 -73
- package/src/{layouts → components}/BaseLayout.tsx +7 -35
- package/src/{Carousel.tsx → components/Carousel.tsx} +35 -69
- package/src/components/ItemRenderer.tsx +105 -0
- package/src/{ScrollViewGesture.tsx → components/ScrollViewGesture.tsx} +88 -48
- package/src/components/rnr-demo.test.tsx +43 -0
- package/src/hooks/useCarouselController.tsx +27 -24
- package/src/hooks/useCommonVariables.test.tsx +41 -0
- package/src/hooks/useCommonVariables.ts +36 -11
- package/src/hooks/useInitProps.ts +1 -3
- package/src/hooks/useLayoutConfig.ts +1 -1
- package/src/hooks/useOffsetX.test.ts +54 -0
- package/src/hooks/useOffsetX.ts +33 -31
- package/src/hooks/useOnProgressChange.ts +1 -1
- package/src/hooks/usePanGestureProxy.test.tsx +376 -0
- package/src/hooks/usePanGestureProxy.ts +110 -0
- package/src/hooks/useUpdateGestureConfig.ts +15 -0
- package/src/hooks/useVisibleRanges.test.tsx +179 -0
- package/src/hooks/useVisibleRanges.tsx +72 -24
- package/src/index.tsx +4 -2
- package/src/types.ts +132 -125
- package/src/utils/compute-offset-if-data-changed.test.ts +30 -0
- package/src/{hooks/computeNewIndexWhenDataChanges.ts → utils/compute-offset-if-data-changed.ts} +1 -1
- package/src/utils/compute-offset-if-size-changed.test.ts +78 -0
- package/src/utils/compute-offset-if-size-changed.ts +11 -0
- package/src/utils/handleroffset-direction.test.ts +52 -0
- package/src/utils/handleroffset-direction.ts +18 -0
- package/src/{hooks → utils}/index.test.ts +6 -6
- package/README.zh-CN.md +0 -202
- package/lib/commonjs/Carousel.js +0 -2
- package/lib/commonjs/Carousel.js.map +0 -1
- package/lib/commonjs/LazyView.js +0 -2
- package/lib/commonjs/LazyView.js.map +0 -1
- package/lib/commonjs/ScrollViewGesture.js +0 -2
- package/lib/commonjs/ScrollViewGesture.js.map +0 -1
- package/lib/commonjs/hooks/computeNewIndexWhenDataChanges.js +0 -2
- package/lib/commonjs/hooks/computeNewIndexWhenDataChanges.js.map +0 -1
- package/lib/commonjs/hooks/index.test.js +0 -2
- package/lib/commonjs/hooks/index.test.js.map +0 -1
- package/lib/commonjs/layouts/BaseLayout.js +0 -2
- package/lib/commonjs/layouts/BaseLayout.js.map +0 -1
- package/lib/commonjs/layouts/ParallaxLayout.js +0 -2
- package/lib/commonjs/layouts/ParallaxLayout.js.map +0 -1
- package/lib/commonjs/utils/computedWithAutoFillData.js +0 -2
- package/lib/commonjs/utils/computedWithAutoFillData.js.map +0 -1
- package/lib/commonjs/utils/dealWithAnimation.js +0 -2
- package/lib/commonjs/utils/dealWithAnimation.js.map +0 -1
- package/lib/commonjs/utils/handlerOffsetDirection.js +0 -2
- package/lib/commonjs/utils/handlerOffsetDirection.js.map +0 -1
- package/lib/module/Carousel.js.map +0 -1
- package/lib/module/ScrollViewGesture.js.map +0 -1
- package/lib/module/hooks/computeNewIndexWhenDataChanges.js.map +0 -1
- package/lib/module/hooks/index.test.js.map +0 -1
- package/lib/module/layouts/BaseLayout.js.map +0 -1
- package/lib/module/layouts/ParallaxLayout.js +0 -61
- package/lib/module/layouts/ParallaxLayout.js.map +0 -1
- package/lib/module/utils/computedWithAutoFillData.js.map +0 -1
- package/lib/module/utils/dealWithAnimation.js.map +0 -1
- package/lib/module/utils/handlerOffsetDirection.js +0 -9
- package/lib/module/utils/handlerOffsetDirection.js.map +0 -1
- package/lib/typescript/layouts/ParallaxLayout.d.ts +0 -13
- package/lib/typescript/utils/handlerOffsetDirection.d.ts +0 -2
- package/src/layouts/ParallaxLayout.tsx +0 -141
- package/src/utils/handlerOffsetDirection.ts +0 -15
- /package/lib/module/{LazyView.js → components/LazyView.js} +0 -0
- /package/lib/module/{LazyView.js.map → components/LazyView.js.map} +0 -0
- /package/lib/typescript/{layouts → components}/BaseLayout.d.ts +0 -0
- /package/lib/typescript/{LazyView.d.ts → components/LazyView.d.ts} +0 -0
- /package/lib/typescript/{hooks/index.test.d.ts → components/rnr-demo.test.d.ts} +0 -0
- /package/lib/typescript/utils/{computedWithAutoFillData.d.ts → computed-with-auto-fill-data.d.ts} +0 -0
- /package/lib/typescript/utils/{dealWithAnimation.d.ts → deal-with-animation.d.ts} +0 -0
- /package/src/{LazyView.tsx → components/LazyView.tsx} +0 -0
- /package/src/utils/{computedWithAutoFillData.ts → computed-with-auto-fill-data.ts} +0 -0
- /package/src/utils/{dealWithAnimation.ts → deal-with-animation.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["ItemRenderer.tsx"],"names":["ItemRenderer","props","data","size","windowSize","handlerOffset","offsetX","dataLength","rawDataLength","loop","autoFillData","layoutConfig","renderItem","customAnimation","visibleRanges","total","viewSize","translation","displayedItems","setDisplayedItems","React","useState","value","ranges","map","item","index","realIndex","negativeRange","positiveRange","shouldRender","animationValue"],"mappings":";;;;;;;AAAA;;AAIA;;AAGA;;AAGA;;AAEA;;;;AAiBO,MAAMA,YAAuB,GAAIC,KAAD,IAAW;AAChD,QAAM;AACJC,IAAAA,IADI;AAEJC,IAAAA,IAFI;AAGJC,IAAAA,UAHI;AAIJC,IAAAA,aAJI;AAKJC,IAAAA,OALI;AAMJC,IAAAA,UANI;AAOJC,IAAAA,aAPI;AAQJC,IAAAA,IARI;AASJC,IAAAA,YATI;AAUJC,IAAAA,YAVI;AAWJC,IAAAA,UAXI;AAYJC,IAAAA;AAZI,MAaFZ,KAbJ;AAeA,QAAMa,aAAa,GAAG,wCAAiB;AACrCC,IAAAA,KAAK,EAAER,UAD8B;AAErCS,IAAAA,QAAQ,EAAEb,IAF2B;AAGrCc,IAAAA,WAAW,EAAEZ,aAHwB;AAIrCD,IAAAA,UAJqC;AAKrCK,IAAAA;AALqC,GAAjB,CAAtB;;AAQA,QAAM,CAACS,cAAD,EAAiBC,iBAAjB,IAAsCC,eAAMC,QAAN,CAA8B,IAA9B,CAA5C;;AAEA,kDACE,MAAMP,aAAa,CAACQ,KADtB,EAEEC,MAAM,IAAI,oCAAQJ,iBAAR,EAA2BI,MAA3B,CAFZ,EAGE,CAACT,aAAD,CAHF;AAMA,MAAI,CAACI,cAAL,EACE,OAAO,IAAP;AAEF,sBACE,4DAEIhB,IAAI,CAACsB,GAAL,CAAS,CAACC,IAAD,EAAOC,KAAP,KAAiB;AACxB,UAAMC,SAAS,GAAG,iEAAkC;AAClDD,MAAAA,KADkD;AAElDnB,MAAAA,UAAU,EAAEC,aAFsC;AAGlDC,MAAAA,IAHkD;AAIlDC,MAAAA;AAJkD,KAAlC,CAAlB;AAOA,UAAM;AAAEkB,MAAAA,aAAF;AAAiBC,MAAAA;AAAjB,QAAmCX,cAAzC;AAEA,UAAMY,YAAY,GAAIJ,KAAK,IAAIE,aAAa,CAAC,CAAD,CAAtB,IAA6BF,KAAK,IAAIE,aAAa,CAAC,CAAD,CAApD,IACjBF,KAAK,IAAIG,aAAa,CAAC,CAAD,CAAtB,IAA6BH,KAAK,IAAIG,aAAa,CAAC,CAAD,CADvD;AAGA,QAAI,CAACC,YAAL,EACE,OAAO,IAAP;AAEF,wBACE,6BAAC,sBAAD;AACE,MAAA,GAAG,EAAEJ,KADP;AAEE,MAAA,KAAK,EAAEA,KAFT;AAGE,MAAA,aAAa,EAAEpB,OAHjB;AAIE,MAAA,aAAa,EAAEQ,aAJjB;AAKE,MAAA,cAAc,EAAED,eAAe,IAAIF;AALrC,OAOG;AAAA,UAAC;AAAEoB,QAAAA;AAAF,OAAD;AAAA,aACCnB,UAAU,CAAC;AACTa,QAAAA,IADS;AAETC,QAAAA,KAAK,EAAEC,SAFE;AAGTI,QAAAA;AAHS,OAAD,CADX;AAAA,KAPH,CADF;AAiBD,GAjCD,CAFJ,CADF;AAwCD,CA3EM","sourcesContent":["import React from \"react\";\nimport type { FC } from \"react\";\nimport type { ViewStyle } from \"react-native\";\nimport type Animated from \"react-native-reanimated\";\nimport { useAnimatedReaction, type AnimatedStyleProp, runOnJS } from \"react-native-reanimated\";\n\nimport type { TAnimationStyle } from \"./BaseLayout\";\nimport { BaseLayout } from \"./BaseLayout\";\n\nimport type { VisibleRanges } from \"../hooks/useVisibleRanges\";\nimport { useVisibleRanges } from \"../hooks/useVisibleRanges\";\nimport type { CarouselRenderItem } from \"../types\";\nimport { computedRealIndexWithAutoFillData } from \"../utils/computed-with-auto-fill-data\";\n\ninterface Props {\n data: any[]\n dataLength: number\n rawDataLength: number\n loop: boolean\n size: number\n windowSize?: number\n autoFillData: boolean\n offsetX: Animated.SharedValue<number>\n handlerOffset: Animated.SharedValue<number>\n layoutConfig: TAnimationStyle\n renderItem: CarouselRenderItem<any>\n customAnimation?: ((value: number) => AnimatedStyleProp<ViewStyle>)\n}\n\nexport const ItemRenderer: FC<Props> = (props) => {\n const {\n data,\n size,\n windowSize,\n handlerOffset,\n offsetX,\n dataLength,\n rawDataLength,\n loop,\n autoFillData,\n layoutConfig,\n renderItem,\n customAnimation,\n } = props;\n\n const visibleRanges = useVisibleRanges({\n total: dataLength,\n viewSize: size,\n translation: handlerOffset,\n windowSize,\n loop,\n });\n\n const [displayedItems, setDisplayedItems] = React.useState<VisibleRanges>(null!);\n\n useAnimatedReaction(\n () => visibleRanges.value,\n ranges => runOnJS(setDisplayedItems)(ranges),\n [visibleRanges],\n );\n\n if (!displayedItems)\n return null;\n\n return (\n <>\n {\n data.map((item, index) => {\n const realIndex = computedRealIndexWithAutoFillData({\n index,\n dataLength: rawDataLength,\n loop,\n autoFillData,\n });\n\n const { negativeRange, positiveRange } = displayedItems;\n\n const shouldRender = (index >= negativeRange[0] && index <= negativeRange[1])\n || (index >= positiveRange[0] && index <= positiveRange[1]);\n\n if (!shouldRender)\n return null;\n\n return (\n <BaseLayout\n key={index}\n index={index}\n handlerOffset={offsetX}\n visibleRanges={visibleRanges}\n animationStyle={customAnimation || layoutConfig}\n >\n {({ animationValue }) =>\n renderItem({\n item,\n index: realIndex,\n animationValue,\n })\n }\n </BaseLayout>\n );\n })\n }\n </>\n );\n};\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.LazyView = void 0;
|
|
7
|
+
|
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
|
9
|
+
|
|
10
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
+
|
|
12
|
+
const LazyView = props => {
|
|
13
|
+
const {
|
|
14
|
+
shouldUpdate,
|
|
15
|
+
children
|
|
16
|
+
} = props;
|
|
17
|
+
if (!shouldUpdate) return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null);
|
|
18
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, children);
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
exports.LazyView = LazyView;
|
|
22
|
+
//# sourceMappingURL=LazyView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["LazyView.tsx"],"names":["LazyView","props","shouldUpdate","children"],"mappings":";;;;;;;AACA;;;;AAMO,MAAMA,QAA4C,GAAIC,KAAD,IAAW;AACrE,QAAM;AAAEC,IAAAA,YAAF;AAAgBC,IAAAA;AAAhB,MAA6BF,KAAnC;AAEA,MAAI,CAACC,YAAL,EACE,oBAAO,2DAAP;AAEF,sBAAO,4DAAGC,QAAH,CAAP;AACD,CAPM","sourcesContent":["import type { PropsWithChildren } from \"react\";\nimport React from \"react\";\n\ninterface Props {\n shouldUpdate: boolean\n}\n\nexport const LazyView: React.FC<PropsWithChildren<Props>> = (props) => {\n const { shouldUpdate, children } = props;\n\n if (!shouldUpdate)\n return <></>;\n\n return <>{children}</>;\n};\n"]}
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ScrollViewGesture = void 0;
|
|
7
|
+
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
|
|
10
|
+
var _reactNativeGestureHandler = require("react-native-gesture-handler");
|
|
11
|
+
|
|
12
|
+
var _reactNativeReanimated = _interopRequireWildcard(require("react-native-reanimated"));
|
|
13
|
+
|
|
14
|
+
var _constants = require("../constants");
|
|
15
|
+
|
|
16
|
+
var _usePanGestureProxy = require("../hooks/usePanGestureProxy");
|
|
17
|
+
|
|
18
|
+
var _store = require("../store");
|
|
19
|
+
|
|
20
|
+
var _dealWithAnimation = require("../utils/deal-with-animation");
|
|
21
|
+
|
|
22
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
23
|
+
|
|
24
|
+
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; }
|
|
25
|
+
|
|
26
|
+
const IScrollViewGesture = props => {
|
|
27
|
+
const {
|
|
28
|
+
props: {
|
|
29
|
+
onConfigurePanGesture,
|
|
30
|
+
vertical,
|
|
31
|
+
pagingEnabled,
|
|
32
|
+
snapEnabled,
|
|
33
|
+
loop,
|
|
34
|
+
scrollAnimationDuration,
|
|
35
|
+
withAnimation,
|
|
36
|
+
enabled,
|
|
37
|
+
dataLength,
|
|
38
|
+
overscrollEnabled,
|
|
39
|
+
maxScrollDistancePerSwipe,
|
|
40
|
+
minScrollDistancePerSwipe,
|
|
41
|
+
fixedDirection
|
|
42
|
+
}
|
|
43
|
+
} = _react.default.useContext(_store.CTX);
|
|
44
|
+
|
|
45
|
+
const {
|
|
46
|
+
size,
|
|
47
|
+
translation,
|
|
48
|
+
testID,
|
|
49
|
+
style = {},
|
|
50
|
+
onScrollStart,
|
|
51
|
+
onScrollEnd,
|
|
52
|
+
onTouchBegin,
|
|
53
|
+
onTouchEnd
|
|
54
|
+
} = props;
|
|
55
|
+
const maxPage = dataLength;
|
|
56
|
+
const isHorizontal = (0, _reactNativeReanimated.useDerivedValue)(() => !vertical, [vertical]);
|
|
57
|
+
const max = (0, _reactNativeReanimated.useSharedValue)(0);
|
|
58
|
+
const panOffset = (0, _reactNativeReanimated.useSharedValue)(0);
|
|
59
|
+
const touching = (0, _reactNativeReanimated.useSharedValue)(false);
|
|
60
|
+
const validStart = (0, _reactNativeReanimated.useSharedValue)(false);
|
|
61
|
+
const scrollEndTranslation = (0, _reactNativeReanimated.useSharedValue)(0);
|
|
62
|
+
const scrollEndVelocity = (0, _reactNativeReanimated.useSharedValue)(0);
|
|
63
|
+
const containerRef = (0, _reactNativeReanimated.useAnimatedRef)();
|
|
64
|
+
const maxScrollDistancePerSwipeIsSet = typeof maxScrollDistancePerSwipe === "number";
|
|
65
|
+
const minScrollDistancePerSwipeIsSet = typeof minScrollDistancePerSwipe === "number"; // Get the limit of the scroll.
|
|
66
|
+
|
|
67
|
+
const getLimit = _react.default.useCallback(() => {
|
|
68
|
+
"worklet";
|
|
69
|
+
|
|
70
|
+
if (!loop && !overscrollEnabled) {
|
|
71
|
+
const {
|
|
72
|
+
width: containerWidth = 0
|
|
73
|
+
} = (0, _reactNativeReanimated.measure)(containerRef); // If the item's total width is less than the container's width, then there is no need to scroll.
|
|
74
|
+
|
|
75
|
+
if (dataLength * size < containerWidth) return 0; // Disable the "overscroll" effect
|
|
76
|
+
|
|
77
|
+
return dataLength * size - containerWidth;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return dataLength * size;
|
|
81
|
+
}, [loop, size, dataLength, overscrollEnabled]);
|
|
82
|
+
|
|
83
|
+
const withSpring = _react.default.useCallback((toValue, onFinished) => {
|
|
84
|
+
"worklet";
|
|
85
|
+
|
|
86
|
+
const defaultWithAnimation = {
|
|
87
|
+
type: "timing",
|
|
88
|
+
config: {
|
|
89
|
+
duration: scrollAnimationDuration + 100,
|
|
90
|
+
easing: _constants.Easing.easeOutQuart
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
return (0, _dealWithAnimation.dealWithAnimation)(withAnimation !== null && withAnimation !== void 0 ? withAnimation : defaultWithAnimation)(toValue, isFinished => {
|
|
94
|
+
"worklet";
|
|
95
|
+
|
|
96
|
+
if (isFinished) onFinished && (0, _reactNativeReanimated.runOnJS)(onFinished)();
|
|
97
|
+
});
|
|
98
|
+
}, [scrollAnimationDuration, withAnimation]);
|
|
99
|
+
|
|
100
|
+
const endWithSpring = _react.default.useCallback(onFinished => {
|
|
101
|
+
"worklet";
|
|
102
|
+
|
|
103
|
+
const origin = translation.value;
|
|
104
|
+
const velocity = scrollEndVelocity.value; // Default to scroll in the direction of the slide (with deceleration)
|
|
105
|
+
|
|
106
|
+
let finalTranslation = (0, _reactNativeReanimated.withDecay)({
|
|
107
|
+
velocity,
|
|
108
|
+
deceleration: 0.999
|
|
109
|
+
}); // If the distance of the swipe exceeds the max scroll distance, keep the view at the current position
|
|
110
|
+
|
|
111
|
+
if (maxScrollDistancePerSwipeIsSet && Math.abs(scrollEndTranslation.value) > maxScrollDistancePerSwipe) {
|
|
112
|
+
finalTranslation = origin;
|
|
113
|
+
} else {
|
|
114
|
+
/**
|
|
115
|
+
* The page size is the same as the item size.
|
|
116
|
+
* If direction is vertical, the page size is the height of the item.
|
|
117
|
+
* If direction is horizontal, the page size is the width of the item.
|
|
118
|
+
*
|
|
119
|
+
* `page size` equals to `size` variable.
|
|
120
|
+
* */
|
|
121
|
+
if (pagingEnabled) {
|
|
122
|
+
// distance with direction
|
|
123
|
+
const offset = -(scrollEndTranslation.value >= 0 ? 1 : -1); // 1 or -1
|
|
124
|
+
|
|
125
|
+
const computed = offset < 0 ? Math.ceil : Math.floor;
|
|
126
|
+
const page = computed(-translation.value / size);
|
|
127
|
+
|
|
128
|
+
if (loop) {
|
|
129
|
+
const finalPage = page + offset;
|
|
130
|
+
finalTranslation = withSpring(withProcessTranslation(-finalPage * size), onFinished);
|
|
131
|
+
} else {
|
|
132
|
+
const finalPage = Math.min(maxPage - 1, Math.max(0, page + offset));
|
|
133
|
+
finalTranslation = withSpring(withProcessTranslation(-finalPage * size), onFinished);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (!pagingEnabled && snapEnabled) {
|
|
138
|
+
// scroll to the nearest item
|
|
139
|
+
const nextPage = Math.round((origin + velocity * 0.4) / size) * size;
|
|
140
|
+
finalTranslation = withSpring(withProcessTranslation(nextPage), onFinished);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
translation.value = finalTranslation;
|
|
145
|
+
|
|
146
|
+
function withProcessTranslation(translation) {
|
|
147
|
+
if (!loop && !overscrollEnabled) {
|
|
148
|
+
const limit = getLimit();
|
|
149
|
+
const sign = Math.sign(translation);
|
|
150
|
+
return sign * Math.max(0, Math.min(limit, Math.abs(translation)));
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
return translation;
|
|
154
|
+
}
|
|
155
|
+
}, [withSpring, size, maxPage, loop, snapEnabled, translation, pagingEnabled, scrollEndVelocity.value, maxScrollDistancePerSwipe, scrollEndTranslation.value, maxScrollDistancePerSwipeIsSet]);
|
|
156
|
+
|
|
157
|
+
const onFinish = _react.default.useCallback(isFinished => {
|
|
158
|
+
"worklet";
|
|
159
|
+
|
|
160
|
+
if (isFinished) {
|
|
161
|
+
touching.value = false;
|
|
162
|
+
onScrollEnd && (0, _reactNativeReanimated.runOnJS)(onScrollEnd)();
|
|
163
|
+
}
|
|
164
|
+
}, [onScrollEnd, touching]);
|
|
165
|
+
|
|
166
|
+
const activeDecay = _react.default.useCallback(() => {
|
|
167
|
+
"worklet";
|
|
168
|
+
|
|
169
|
+
touching.value = true;
|
|
170
|
+
translation.value = (0, _reactNativeReanimated.withDecay)({
|
|
171
|
+
velocity: scrollEndVelocity.value
|
|
172
|
+
}, isFinished => onFinish(isFinished));
|
|
173
|
+
}, [onFinish, scrollEndVelocity.value, touching, translation]);
|
|
174
|
+
|
|
175
|
+
const resetBoundary = _react.default.useCallback(() => {
|
|
176
|
+
"worklet";
|
|
177
|
+
|
|
178
|
+
if (touching.value) return;
|
|
179
|
+
|
|
180
|
+
if (translation.value > 0) {
|
|
181
|
+
if (scrollEndTranslation.value < 0) {
|
|
182
|
+
activeDecay();
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
if (!loop) {
|
|
187
|
+
translation.value = withSpring(0);
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
if (translation.value < -((maxPage - 1) * size)) {
|
|
193
|
+
if (scrollEndTranslation.value > 0) {
|
|
194
|
+
activeDecay();
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
if (!loop) translation.value = withSpring(-((maxPage - 1) * size));
|
|
199
|
+
}
|
|
200
|
+
}, [touching.value, translation, maxPage, size, scrollEndTranslation.value, loop, activeDecay, withSpring]);
|
|
201
|
+
|
|
202
|
+
(0, _reactNativeReanimated.useAnimatedReaction)(() => translation.value, () => {
|
|
203
|
+
if (!pagingEnabled) resetBoundary();
|
|
204
|
+
}, [pagingEnabled, resetBoundary]);
|
|
205
|
+
|
|
206
|
+
function withProcessTranslation(translation) {
|
|
207
|
+
"worklet";
|
|
208
|
+
|
|
209
|
+
if (!loop && !overscrollEnabled) {
|
|
210
|
+
const limit = getLimit();
|
|
211
|
+
const sign = Math.sign(translation);
|
|
212
|
+
return sign * Math.max(0, Math.min(limit, Math.abs(translation)));
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
return translation;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
const onGestureStart = (0, _react.useCallback)(_ => {
|
|
219
|
+
"worklet";
|
|
220
|
+
|
|
221
|
+
touching.value = true;
|
|
222
|
+
validStart.value = true;
|
|
223
|
+
onScrollStart && (0, _reactNativeReanimated.runOnJS)(onScrollStart)();
|
|
224
|
+
max.value = (maxPage - 1) * size;
|
|
225
|
+
if (!loop && !overscrollEnabled) max.value = getLimit();
|
|
226
|
+
panOffset.value = translation.value;
|
|
227
|
+
}, [max, size, maxPage, loop, touching, panOffset, validStart, translation, overscrollEnabled, getLimit, onScrollStart]);
|
|
228
|
+
const onGestureUpdate = (0, _react.useCallback)(e => {
|
|
229
|
+
"worklet";
|
|
230
|
+
|
|
231
|
+
if (validStart.value) {
|
|
232
|
+
validStart.value = false;
|
|
233
|
+
(0, _reactNativeReanimated.cancelAnimation)(translation);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
touching.value = true;
|
|
237
|
+
const {
|
|
238
|
+
translationX,
|
|
239
|
+
translationY
|
|
240
|
+
} = e;
|
|
241
|
+
let panTranslation = isHorizontal.value ? translationX : translationY;
|
|
242
|
+
if (fixedDirection === "negative") panTranslation = -Math.abs(panTranslation);else if (fixedDirection === "positive") panTranslation = +Math.abs(panTranslation);
|
|
243
|
+
|
|
244
|
+
if (!loop) {
|
|
245
|
+
if (translation.value > 0 || translation.value < -max.value) {
|
|
246
|
+
const boundary = translation.value > 0 ? 0 : -max.value;
|
|
247
|
+
const fixed = boundary - panOffset.value;
|
|
248
|
+
const dynamic = panTranslation - fixed;
|
|
249
|
+
translation.value = boundary + dynamic * 0.5;
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
const translationValue = panOffset.value + panTranslation;
|
|
255
|
+
translation.value = translationValue;
|
|
256
|
+
}, [isHorizontal, max, panOffset, loop, overscrollEnabled, fixedDirection, translation, validStart, touching]);
|
|
257
|
+
const onGestureEnd = (0, _react.useCallback)((e, _success) => {
|
|
258
|
+
"worklet";
|
|
259
|
+
|
|
260
|
+
const {
|
|
261
|
+
velocityX,
|
|
262
|
+
velocityY,
|
|
263
|
+
translationX,
|
|
264
|
+
translationY
|
|
265
|
+
} = e;
|
|
266
|
+
scrollEndVelocity.value = isHorizontal.value ? velocityX : velocityY;
|
|
267
|
+
let panTranslation = isHorizontal.value ? translationX : translationY;
|
|
268
|
+
if (fixedDirection === "negative") panTranslation = -Math.abs(panTranslation);else if (fixedDirection === "positive") panTranslation = +Math.abs(panTranslation);
|
|
269
|
+
scrollEndTranslation.value = panTranslation;
|
|
270
|
+
const totalTranslation = scrollEndVelocity.value + scrollEndTranslation.value;
|
|
271
|
+
/**
|
|
272
|
+
* If the maximum scroll distance is set and the translation `exceeds the maximum scroll distance`,
|
|
273
|
+
* the carousel will keep the view at the current position.
|
|
274
|
+
*/
|
|
275
|
+
|
|
276
|
+
if (maxScrollDistancePerSwipeIsSet && Math.abs(totalTranslation) > maxScrollDistancePerSwipe) {
|
|
277
|
+
const nextPage = Math.round((panOffset.value + maxScrollDistancePerSwipe * Math.sign(totalTranslation)) / size) * size;
|
|
278
|
+
translation.value = withSpring(withProcessTranslation(nextPage), onScrollEnd);
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* If the minimum scroll distance is set and the translation `didn't exceeds the minimum scroll distance`,
|
|
282
|
+
* the carousel will keep the view at the current position.
|
|
283
|
+
*/
|
|
284
|
+
else if (minScrollDistancePerSwipeIsSet && Math.abs(totalTranslation) < minScrollDistancePerSwipe) {
|
|
285
|
+
const nextPage = Math.round((panOffset.value + minScrollDistancePerSwipe * Math.sign(totalTranslation)) / size) * size;
|
|
286
|
+
translation.value = withSpring(withProcessTranslation(nextPage), onScrollEnd);
|
|
287
|
+
} else {
|
|
288
|
+
endWithSpring(onScrollEnd);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
if (!loop) touching.value = false;
|
|
292
|
+
}, [size, loop, touching, panOffset, translation, isHorizontal, scrollEndVelocity, scrollEndTranslation, fixedDirection, maxScrollDistancePerSwipeIsSet, maxScrollDistancePerSwipe, maxScrollDistancePerSwipeIsSet, minScrollDistancePerSwipe, endWithSpring, withSpring, onScrollEnd]);
|
|
293
|
+
const gesture = (0, _usePanGestureProxy.usePanGestureProxy)({
|
|
294
|
+
onConfigurePanGesture,
|
|
295
|
+
onGestureStart,
|
|
296
|
+
onGestureUpdate,
|
|
297
|
+
onGestureEnd,
|
|
298
|
+
options: {
|
|
299
|
+
enabled
|
|
300
|
+
}
|
|
301
|
+
});
|
|
302
|
+
return /*#__PURE__*/_react.default.createElement(_reactNativeGestureHandler.GestureDetector, {
|
|
303
|
+
gesture: gesture
|
|
304
|
+
}, /*#__PURE__*/_react.default.createElement(_reactNativeReanimated.default.View, {
|
|
305
|
+
ref: containerRef,
|
|
306
|
+
testID: testID,
|
|
307
|
+
style: style,
|
|
308
|
+
onTouchStart: onTouchBegin,
|
|
309
|
+
onTouchEnd: onTouchEnd
|
|
310
|
+
}, props.children));
|
|
311
|
+
};
|
|
312
|
+
|
|
313
|
+
const ScrollViewGesture = IScrollViewGesture;
|
|
314
|
+
exports.ScrollViewGesture = ScrollViewGesture;
|
|
315
|
+
//# sourceMappingURL=ScrollViewGesture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["ScrollViewGesture.tsx"],"names":["IScrollViewGesture","props","onConfigurePanGesture","vertical","pagingEnabled","snapEnabled","loop","scrollAnimationDuration","withAnimation","enabled","dataLength","overscrollEnabled","maxScrollDistancePerSwipe","minScrollDistancePerSwipe","fixedDirection","React","useContext","CTX","size","translation","testID","style","onScrollStart","onScrollEnd","onTouchBegin","onTouchEnd","maxPage","isHorizontal","max","panOffset","touching","validStart","scrollEndTranslation","scrollEndVelocity","containerRef","maxScrollDistancePerSwipeIsSet","minScrollDistancePerSwipeIsSet","getLimit","useCallback","width","containerWidth","withSpring","toValue","onFinished","defaultWithAnimation","type","config","duration","easing","Easing","easeOutQuart","isFinished","endWithSpring","origin","value","velocity","finalTranslation","deceleration","Math","abs","offset","computed","ceil","floor","page","finalPage","withProcessTranslation","min","nextPage","round","limit","sign","onFinish","activeDecay","resetBoundary","onGestureStart","_","onGestureUpdate","e","translationX","translationY","panTranslation","boundary","fixed","dynamic","translationValue","onGestureEnd","_success","velocityX","velocityY","totalTranslation","gesture","options","children","ScrollViewGesture"],"mappings":"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","sourcesContent":["import type { PropsWithChildren } from \"react\";\nimport React, { useCallback } from \"react\";\nimport type { StyleProp, ViewStyle } from \"react-native\";\nimport type { GestureStateChangeEvent, PanGestureHandlerEventPayload } from \"react-native-gesture-handler\";\nimport { GestureDetector } from \"react-native-gesture-handler\";\nimport Animated, {\n cancelAnimation,\n measure,\n runOnJS,\n useAnimatedReaction,\n useAnimatedRef,\n useDerivedValue,\n useSharedValue,\n withDecay,\n} from \"react-native-reanimated\";\n\nimport { Easing } from \"../constants\";\nimport { usePanGestureProxy } from \"../hooks/usePanGestureProxy\";\nimport { CTX } from \"../store\";\nimport type { WithTimingAnimation } from \"../types\";\nimport { dealWithAnimation } from \"../utils/deal-with-animation\";\n\ninterface Props {\n size: number\n infinite?: boolean\n testID?: string\n style?: StyleProp<ViewStyle>\n onScrollStart?: () => void\n onScrollEnd?: () => void\n onTouchBegin?: () => void\n onTouchEnd?: () => void\n translation: Animated.SharedValue<number>\n}\n\nconst IScrollViewGesture: React.FC<PropsWithChildren<Props>> = (props) => {\n const {\n props: {\n onConfigurePanGesture,\n vertical,\n pagingEnabled,\n snapEnabled,\n loop,\n scrollAnimationDuration,\n withAnimation,\n enabled,\n dataLength,\n overscrollEnabled,\n maxScrollDistancePerSwipe,\n minScrollDistancePerSwipe,\n fixedDirection,\n },\n } = React.useContext(CTX);\n\n const {\n size,\n translation,\n testID,\n style = {},\n onScrollStart,\n onScrollEnd,\n onTouchBegin,\n onTouchEnd,\n } = props;\n\n const maxPage = dataLength;\n const isHorizontal = useDerivedValue(() => !vertical, [vertical]);\n const max = useSharedValue(0);\n const panOffset = useSharedValue(0);\n const touching = useSharedValue(false);\n const validStart = useSharedValue(false);\n const scrollEndTranslation = useSharedValue(0);\n const scrollEndVelocity = useSharedValue(0);\n const containerRef = useAnimatedRef<Animated.View>();\n const maxScrollDistancePerSwipeIsSet = typeof maxScrollDistancePerSwipe === \"number\";\n const minScrollDistancePerSwipeIsSet = typeof minScrollDistancePerSwipe === \"number\";\n\n // Get the limit of the scroll.\n const getLimit = React.useCallback(() => {\n \"worklet\";\n\n if (!loop && !overscrollEnabled) {\n const { width: containerWidth = 0 } = measure(containerRef);\n\n // If the item's total width is less than the container's width, then there is no need to scroll.\n if (dataLength * size < containerWidth)\n return 0;\n\n // Disable the \"overscroll\" effect\n return dataLength * size - containerWidth;\n }\n\n return dataLength * size;\n }, [loop, size, dataLength, overscrollEnabled]);\n\n const withSpring = React.useCallback(\n (toValue: number, onFinished?: () => void) => {\n \"worklet\";\n const defaultWithAnimation: WithTimingAnimation = {\n type: \"timing\",\n config: {\n duration: scrollAnimationDuration + 100,\n easing: Easing.easeOutQuart,\n },\n };\n\n return dealWithAnimation(withAnimation ?? defaultWithAnimation)(\n toValue,\n (isFinished: boolean) => {\n \"worklet\";\n if (isFinished)\n onFinished && runOnJS(onFinished)();\n },\n );\n },\n [scrollAnimationDuration, withAnimation],\n );\n\n const endWithSpring = React.useCallback(\n (onFinished?: () => void) => {\n \"worklet\";\n const origin = translation.value;\n const velocity = scrollEndVelocity.value;\n // Default to scroll in the direction of the slide (with deceleration)\n let finalTranslation: number = withDecay({ velocity, deceleration: 0.999 });\n\n // If the distance of the swipe exceeds the max scroll distance, keep the view at the current position\n if (maxScrollDistancePerSwipeIsSet && Math.abs(scrollEndTranslation.value) > maxScrollDistancePerSwipe) {\n finalTranslation = origin;\n }\n else {\n /**\n * The page size is the same as the item size.\n * If direction is vertical, the page size is the height of the item.\n * If direction is horizontal, the page size is the width of the item.\n *\n * `page size` equals to `size` variable.\n * */\n if (pagingEnabled) {\n // distance with direction\n const offset = -(scrollEndTranslation.value >= 0 ? 1 : -1); // 1 or -1\n const computed = offset < 0 ? Math.ceil : Math.floor;\n const page = computed(-translation.value / size);\n\n if (loop) {\n const finalPage = page + offset;\n finalTranslation = withSpring(withProcessTranslation(-finalPage * size), onFinished);\n }\n else {\n const finalPage = Math.min(maxPage - 1, Math.max(0, page + offset));\n finalTranslation = withSpring(withProcessTranslation(-finalPage * size), onFinished);\n }\n }\n\n if (!pagingEnabled && snapEnabled) {\n // scroll to the nearest item\n const nextPage = Math.round((origin + velocity * 0.4) / size) * size;\n finalTranslation = withSpring(withProcessTranslation(nextPage), onFinished);\n }\n }\n\n translation.value = finalTranslation;\n\n function withProcessTranslation(translation: number) {\n if (!loop && !overscrollEnabled) {\n const limit = getLimit();\n const sign = Math.sign(translation);\n return sign * Math.max(0, Math.min(limit, Math.abs(translation)));\n }\n\n return translation;\n }\n },\n [\n withSpring,\n size,\n maxPage,\n loop,\n snapEnabled,\n translation,\n pagingEnabled,\n scrollEndVelocity.value,\n maxScrollDistancePerSwipe,\n scrollEndTranslation.value,\n maxScrollDistancePerSwipeIsSet,\n ],\n );\n\n const onFinish = React.useCallback(\n (isFinished: boolean) => {\n \"worklet\";\n if (isFinished) {\n touching.value = false;\n onScrollEnd && runOnJS(onScrollEnd)();\n }\n },\n [onScrollEnd, touching],\n );\n\n const activeDecay = React.useCallback(() => {\n \"worklet\";\n touching.value = true;\n translation.value = withDecay(\n { velocity: scrollEndVelocity.value },\n isFinished => onFinish(isFinished as boolean),\n );\n }, [onFinish, scrollEndVelocity.value, touching, translation]);\n\n const resetBoundary = React.useCallback(() => {\n \"worklet\";\n if (touching.value)\n return;\n\n if (translation.value > 0) {\n if (scrollEndTranslation.value < 0) {\n activeDecay();\n return;\n }\n if (!loop) {\n translation.value = withSpring(0);\n return;\n }\n }\n\n if (translation.value < -((maxPage - 1) * size)) {\n if (scrollEndTranslation.value > 0) {\n activeDecay();\n return;\n }\n if (!loop)\n translation.value = withSpring(-((maxPage - 1) * size));\n }\n }, [\n touching.value,\n translation,\n maxPage,\n size,\n scrollEndTranslation.value,\n loop,\n activeDecay,\n withSpring,\n ]);\n\n useAnimatedReaction(\n () => translation.value,\n () => {\n if (!pagingEnabled)\n resetBoundary();\n },\n [pagingEnabled, resetBoundary],\n );\n\n function withProcessTranslation(translation: number) {\n \"worklet\";\n\n if (!loop && !overscrollEnabled) {\n const limit = getLimit();\n const sign = Math.sign(translation);\n return sign * Math.max(0, Math.min(limit, Math.abs(translation)));\n }\n\n return translation;\n }\n\n const onGestureStart = useCallback((_: PanGestureHandlerEventPayload) => {\n \"worklet\";\n\n touching.value = true;\n validStart.value = true;\n onScrollStart && runOnJS(onScrollStart)();\n\n max.value = (maxPage - 1) * size;\n if (!loop && !overscrollEnabled)\n max.value = getLimit();\n\n panOffset.value = translation.value;\n }, [\n max,\n size,\n maxPage,\n loop,\n touching,\n panOffset,\n validStart,\n translation,\n overscrollEnabled,\n getLimit,\n onScrollStart,\n ]);\n\n const onGestureUpdate = useCallback((e: PanGestureHandlerEventPayload) => {\n \"worklet\";\n\n if (validStart.value) {\n validStart.value = false;\n cancelAnimation(translation);\n }\n touching.value = true;\n const { translationX, translationY } = e;\n\n let panTranslation = isHorizontal.value\n ? translationX\n : translationY;\n\n if (fixedDirection === \"negative\")\n panTranslation = -Math.abs(panTranslation);\n\n else if (fixedDirection === \"positive\")\n panTranslation = +Math.abs(panTranslation);\n\n if (!loop) {\n if ((translation.value > 0 || translation.value < -max.value)) {\n const boundary = translation.value > 0 ? 0 : -max.value;\n const fixed = boundary - panOffset.value;\n const dynamic = panTranslation - fixed;\n translation.value = boundary + dynamic * 0.5;\n return;\n }\n }\n\n const translationValue = panOffset.value + panTranslation;\n translation.value = translationValue;\n }, [\n isHorizontal,\n max,\n panOffset,\n loop,\n overscrollEnabled,\n fixedDirection,\n translation,\n validStart,\n touching,\n ]);\n\n const onGestureEnd = useCallback((e: GestureStateChangeEvent<PanGestureHandlerEventPayload>, _success: boolean) => {\n \"worklet\";\n\n const { velocityX, velocityY, translationX, translationY } = e;\n scrollEndVelocity.value = isHorizontal.value\n ? velocityX\n : velocityY;\n\n let panTranslation = isHorizontal.value\n ? translationX\n : translationY;\n\n if (fixedDirection === \"negative\")\n panTranslation = -Math.abs(panTranslation);\n\n else if (fixedDirection === \"positive\")\n panTranslation = +Math.abs(panTranslation);\n\n scrollEndTranslation.value = panTranslation;\n\n const totalTranslation = scrollEndVelocity.value + scrollEndTranslation.value;\n\n /**\n * If the maximum scroll distance is set and the translation `exceeds the maximum scroll distance`,\n * the carousel will keep the view at the current position.\n */\n if (\n maxScrollDistancePerSwipeIsSet && Math.abs(totalTranslation) > maxScrollDistancePerSwipe\n ) {\n const nextPage = Math.round((panOffset.value + maxScrollDistancePerSwipe * Math.sign(totalTranslation)) / size) * size;\n translation.value = withSpring(withProcessTranslation(nextPage), onScrollEnd);\n }\n /**\n * If the minimum scroll distance is set and the translation `didn't exceeds the minimum scroll distance`,\n * the carousel will keep the view at the current position.\n */\n else if (\n minScrollDistancePerSwipeIsSet && Math.abs(totalTranslation) < minScrollDistancePerSwipe\n ) {\n const nextPage = Math.round((panOffset.value + minScrollDistancePerSwipe * Math.sign(totalTranslation)) / size) * size;\n translation.value = withSpring(withProcessTranslation(nextPage), onScrollEnd);\n }\n else {\n endWithSpring(onScrollEnd);\n }\n\n if (!loop)\n touching.value = false;\n }, [\n size,\n loop,\n touching,\n panOffset,\n translation,\n isHorizontal,\n scrollEndVelocity,\n scrollEndTranslation,\n fixedDirection,\n maxScrollDistancePerSwipeIsSet,\n maxScrollDistancePerSwipe,\n maxScrollDistancePerSwipeIsSet,\n minScrollDistancePerSwipe,\n endWithSpring,\n withSpring,\n onScrollEnd,\n ]);\n\n const gesture = usePanGestureProxy({\n onConfigurePanGesture,\n onGestureStart,\n onGestureUpdate,\n onGestureEnd,\n options: { enabled },\n });\n\n return (\n <GestureDetector gesture={gesture}>\n <Animated.View\n ref={containerRef}\n testID={testID}\n style={style}\n onTouchStart={onTouchBegin}\n onTouchEnd={onTouchEnd}\n >\n {props.children}\n </Animated.View>\n </GestureDetector>\n );\n};\n\nexport const ScrollViewGesture = IScrollViewGesture;\n"]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _react = _interopRequireDefault(require("react"));
|
|
4
|
+
|
|
5
|
+
var _reactNativeReanimated = _interopRequireWildcard(require("react-native-reanimated"));
|
|
6
|
+
|
|
7
|
+
var _reactTestRenderer = _interopRequireDefault(require("react-test-renderer"));
|
|
8
|
+
|
|
9
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
10
|
+
|
|
11
|
+
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; }
|
|
12
|
+
|
|
13
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
14
|
+
|
|
15
|
+
describe("useSharedValue", () => {
|
|
16
|
+
it("retains value on rerender", () => {
|
|
17
|
+
const initialValue = 0;
|
|
18
|
+
const updatedValue = 1;
|
|
19
|
+
|
|
20
|
+
const TestComponent = props => {
|
|
21
|
+
const opacity = (0, _reactNativeReanimated.useDerivedValue)(() => props.value, [props.value]);
|
|
22
|
+
const animatedStyle = (0, _reactNativeReanimated.useAnimatedStyle)(() => ({
|
|
23
|
+
opacity: opacity.value
|
|
24
|
+
}), [opacity]);
|
|
25
|
+
return /*#__PURE__*/_react.default.createElement(_reactNativeReanimated.default.View, {
|
|
26
|
+
style: animatedStyle
|
|
27
|
+
});
|
|
28
|
+
}; // When rendering with initial value
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
const wrapper = _reactTestRenderer.default.create( /*#__PURE__*/_react.default.createElement(TestComponent, {
|
|
32
|
+
key: "box",
|
|
33
|
+
value: initialValue
|
|
34
|
+
}));
|
|
35
|
+
|
|
36
|
+
expect(typeof wrapper.root.children[0] !== "string" ? wrapper.root.children[0].props.style.animatedStyle.current.value.opacity : false).toBe(initialValue); // When rendering with updated value
|
|
37
|
+
|
|
38
|
+
wrapper.update( /*#__PURE__*/_react.default.createElement(TestComponent, {
|
|
39
|
+
key: "box",
|
|
40
|
+
value: updatedValue
|
|
41
|
+
}));
|
|
42
|
+
expect(typeof wrapper.root.children[0] !== "string" ? wrapper.root.children[0].props.style.animatedStyle.current.value.opacity : false).toBe(initialValue);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
//# sourceMappingURL=rnr-demo.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["rnr-demo.test.tsx"],"names":["describe","it","initialValue","updatedValue","TestComponent","props","opacity","value","animatedStyle","wrapper","renderer","create","expect","root","children","style","current","toBe","update"],"mappings":";;AACA;;AACA;;AACA;;;;;;;;AAEAA,QAAQ,CAAC,gBAAD,EAAmB,MAAM;AAC/BC,EAAAA,EAAE,CAAC,2BAAD,EAA8B,MAAM;AACpC,UAAMC,YAAY,GAAG,CAArB;AACA,UAAMC,YAAY,GAAG,CAArB;;AAOA,UAAMC,aAAwB,GAAIC,KAAD,IAAW;AAC1C,YAAMC,OAAO,GAAG,4CAAgB,MAAMD,KAAK,CAACE,KAA5B,EAAmC,CAACF,KAAK,CAACE,KAAP,CAAnC,CAAhB;AACA,YAAMC,aAAa,GAAG,6CAAiB,OAAO;AAC5CF,QAAAA,OAAO,EAAEA,OAAO,CAACC;AAD2B,OAAP,CAAjB,EAElB,CAACD,OAAD,CAFkB,CAAtB;AAIA,0BAAO,6BAAC,8BAAD,CAAU,IAAV;AAAe,QAAA,KAAK,EAAEE;AAAtB,QAAP;AACD,KAPD,CAToC,CAkBpC;;;AACA,UAAMC,OAAO,GAAGC,2BAASC,MAAT,eAAgB,6BAAC,aAAD;AAAe,MAAA,GAAG,EAAC,KAAnB;AAAyB,MAAA,KAAK,EAAET;AAAhC,MAAhB,CAAhB;;AAEAU,IAAAA,MAAM,CACJ,OAAOH,OAAO,CAACI,IAAR,CAAaC,QAAb,CAAsB,CAAtB,CAAP,KAAoC,QAApC,GACIL,OAAO,CAACI,IAAR,CAAaC,QAAb,CAAsB,CAAtB,EAAyBT,KAAzB,CAA+BU,KAA/B,CAAqCP,aAArC,CAAmDQ,OAAnD,CAA2DT,KAA3D,CAAiED,OADrE,GAEI,KAHA,CAAN,CAIEW,IAJF,CAIOf,YAJP,EArBoC,CA2BpC;;AACAO,IAAAA,OAAO,CAACS,MAAR,eAAe,6BAAC,aAAD;AAAe,MAAA,GAAG,EAAC,KAAnB;AAAyB,MAAA,KAAK,EAAEf;AAAhC,MAAf;AAEAS,IAAAA,MAAM,CACJ,OAAOH,OAAO,CAACI,IAAR,CAAaC,QAAb,CAAsB,CAAtB,CAAP,KAAoC,QAApC,GACIL,OAAO,CAACI,IAAR,CAAaC,QAAb,CAAsB,CAAtB,EAAyBT,KAAzB,CAA+BU,KAA/B,CAAqCP,aAArC,CAAmDQ,OAAnD,CAA2DT,KAA3D,CAAiED,OADrE,GAEI,KAHA,CAAN,CAIEW,IAJF,CAIOf,YAJP;AAKD,GAnCC,CAAF;AAoCD,CArCO,CAAR","sourcesContent":["import type { FC } from \"react\";\nimport React from \"react\";\nimport Animated, { useAnimatedStyle, useDerivedValue } from \"react-native-reanimated\";\nimport renderer from \"react-test-renderer\";\n\ndescribe(\"useSharedValue\", () => {\n it(\"retains value on rerender\", () => {\n const initialValue = 0;\n const updatedValue = 1;\n\n interface Props {\n key: string\n value: number\n }\n\n const TestComponent: FC<Props> = (props) => {\n const opacity = useDerivedValue(() => props.value, [props.value]);\n const animatedStyle = useAnimatedStyle(() => ({\n opacity: opacity.value,\n }), [opacity]);\n\n return <Animated.View style={animatedStyle} />;\n };\n\n // When rendering with initial value\n const wrapper = renderer.create(<TestComponent key=\"box\" value={initialValue} />);\n\n expect(\n typeof wrapper.root.children[0] !== \"string\"\n ? wrapper.root.children[0].props.style.animatedStyle.current.value.opacity\n : false,\n ).toBe(initialValue);\n\n // When rendering with updated value\n wrapper.update(<TestComponent key=\"box\" value={updatedValue} />);\n\n expect(\n typeof wrapper.root.children[0] !== \"string\"\n ? wrapper.root.children[0].props.style.animatedStyle.current.value.opacity\n : false,\n ).toBe(initialValue);\n });\n});\n"]}
|
|
@@ -1,2 +1,22 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.Easing = exports.DATA_LENGTH = void 0;
|
|
7
|
+
|
|
8
|
+
var _reactNativeReanimated = require("react-native-reanimated");
|
|
9
|
+
|
|
10
|
+
let DATA_LENGTH;
|
|
11
|
+
exports.DATA_LENGTH = DATA_LENGTH;
|
|
12
|
+
|
|
13
|
+
(function (DATA_LENGTH) {
|
|
14
|
+
DATA_LENGTH[DATA_LENGTH["SINGLE_ITEM"] = 1] = "SINGLE_ITEM";
|
|
15
|
+
DATA_LENGTH[DATA_LENGTH["DOUBLE_ITEM"] = 2] = "DOUBLE_ITEM";
|
|
16
|
+
})(DATA_LENGTH || (exports.DATA_LENGTH = DATA_LENGTH = {}));
|
|
17
|
+
|
|
18
|
+
const Easing = {
|
|
19
|
+
easeOutQuart: _reactNativeReanimated.Easing.bezier(0.25, 1, 0.5, 1)
|
|
20
|
+
};
|
|
21
|
+
exports.Easing = Easing;
|
|
2
22
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["index.ts"],"names":["DATA_LENGTH","Easing","easeOutQuart","_Easing","bezier"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["index.ts"],"names":["DATA_LENGTH","Easing","easeOutQuart","_Easing","bezier"],"mappings":";;;;;;;AACA;;IAEYA,W;;;WAAAA,W;AAAAA,EAAAA,W,CAAAA,W;AAAAA,EAAAA,W,CAAAA,W;GAAAA,W,2BAAAA,W;;AAKL,MAAMC,MAAM,GAAG;AACpBC,EAAAA,YAAY,EAAEC,8BAAQC,MAAR,CACZ,IADY,EAEZ,CAFY,EAGZ,GAHY,EAIZ,CAJY;AADM,CAAf","sourcesContent":["import type Animated from \"react-native-reanimated\";\nimport { Easing as _Easing } from \"react-native-reanimated\";\n\nexport enum DATA_LENGTH {\n SINGLE_ITEM = 1,\n DOUBLE_ITEM = 2,\n}\n\nexport const Easing = {\n easeOutQuart: _Easing.bezier(\n 0.25,\n 1,\n 0.5,\n 1,\n ) as unknown as Animated.EasingFunction,\n};\n"]}
|
|
@@ -1,2 +1,57 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useAutoPlay = useAutoPlay;
|
|
7
|
+
|
|
8
|
+
var React = _interopRequireWildcard(require("react"));
|
|
9
|
+
|
|
10
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
11
|
+
|
|
12
|
+
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; }
|
|
13
|
+
|
|
14
|
+
function useAutoPlay(opts) {
|
|
15
|
+
const {
|
|
16
|
+
autoPlay = false,
|
|
17
|
+
autoPlayReverse = false,
|
|
18
|
+
autoPlayInterval,
|
|
19
|
+
carouselController
|
|
20
|
+
} = opts;
|
|
21
|
+
const {
|
|
22
|
+
prev,
|
|
23
|
+
next
|
|
24
|
+
} = carouselController;
|
|
25
|
+
const timer = React.useRef();
|
|
26
|
+
const stopped = React.useRef(!autoPlay);
|
|
27
|
+
const play = React.useCallback(() => {
|
|
28
|
+
if (stopped.current) return;
|
|
29
|
+
timer.current && clearTimeout(timer.current);
|
|
30
|
+
timer.current = setTimeout(() => {
|
|
31
|
+
autoPlayReverse ? prev({
|
|
32
|
+
onFinished: play
|
|
33
|
+
}) : next({
|
|
34
|
+
onFinished: play
|
|
35
|
+
});
|
|
36
|
+
}, autoPlayInterval);
|
|
37
|
+
}, [autoPlayReverse, autoPlayInterval, prev, next]);
|
|
38
|
+
const pause = React.useCallback(() => {
|
|
39
|
+
if (!autoPlay) return;
|
|
40
|
+
timer.current && clearTimeout(timer.current);
|
|
41
|
+
stopped.current = true;
|
|
42
|
+
}, [autoPlay]);
|
|
43
|
+
const start = React.useCallback(() => {
|
|
44
|
+
if (!autoPlay) return;
|
|
45
|
+
stopped.current = false;
|
|
46
|
+
play();
|
|
47
|
+
}, [play, autoPlay]);
|
|
48
|
+
React.useEffect(() => {
|
|
49
|
+
if (autoPlay) start();else pause();
|
|
50
|
+
return pause;
|
|
51
|
+
}, [pause, start, autoPlay]);
|
|
52
|
+
return {
|
|
53
|
+
pause,
|
|
54
|
+
start
|
|
55
|
+
};
|
|
56
|
+
}
|
|
2
57
|
//# sourceMappingURL=useAutoPlay.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useAutoPlay.ts"],"names":["useAutoPlay","opts","autoPlay","autoPlayReverse","autoPlayInterval","carouselController","prev","next","timer","React","useRef","stopped","play","useCallback","current","clearTimeout","setTimeout","onFinished","pause","start","useEffect"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["useAutoPlay.ts"],"names":["useAutoPlay","opts","autoPlay","autoPlayReverse","autoPlayInterval","carouselController","prev","next","timer","React","useRef","stopped","play","useCallback","current","clearTimeout","setTimeout","onFinished","pause","start","useEffect"],"mappings":";;;;;;;AAAA;;;;;;AAIO,SAASA,WAAT,CAAqBC,IAArB,EAKJ;AACD,QAAM;AACJC,IAAAA,QAAQ,GAAG,KADP;AAEJC,IAAAA,eAAe,GAAG,KAFd;AAGJC,IAAAA,gBAHI;AAIJC,IAAAA;AAJI,MAKFJ,IALJ;AAOA,QAAM;AAAEK,IAAAA,IAAF;AAAQC,IAAAA;AAAR,MAAiBF,kBAAvB;AACA,QAAMG,KAAK,GAAGC,KAAK,CAACC,MAAN,EAAd;AACA,QAAMC,OAAO,GAAGF,KAAK,CAACC,MAAN,CAAsB,CAACR,QAAvB,CAAhB;AAEA,QAAMU,IAAI,GAAGH,KAAK,CAACI,WAAN,CAAkB,MAAM;AACnC,QAAIF,OAAO,CAACG,OAAZ,EACE;AAEFN,IAAAA,KAAK,CAACM,OAAN,IAAiBC,YAAY,CAACP,KAAK,CAACM,OAAP,CAA7B;AACAN,IAAAA,KAAK,CAACM,OAAN,GAAgBE,UAAU,CAAC,MAAM;AAC/Bb,MAAAA,eAAe,GACXG,IAAI,CAAC;AAAEW,QAAAA,UAAU,EAAEL;AAAd,OAAD,CADO,GAEXL,IAAI,CAAC;AAAEU,QAAAA,UAAU,EAAEL;AAAd,OAAD,CAFR;AAGD,KAJyB,EAIvBR,gBAJuB,CAA1B;AAKD,GAVY,EAUV,CAACD,eAAD,EAAkBC,gBAAlB,EAAoCE,IAApC,EAA0CC,IAA1C,CAVU,CAAb;AAYA,QAAMW,KAAK,GAAGT,KAAK,CAACI,WAAN,CAAkB,MAAM;AACpC,QAAI,CAACX,QAAL,EACE;AAEFM,IAAAA,KAAK,CAACM,OAAN,IAAiBC,YAAY,CAACP,KAAK,CAACM,OAAP,CAA7B;AACAH,IAAAA,OAAO,CAACG,OAAR,GAAkB,IAAlB;AACD,GANa,EAMX,CAACZ,QAAD,CANW,CAAd;AAQA,QAAMiB,KAAK,GAAGV,KAAK,CAACI,WAAN,CAAkB,MAAM;AACpC,QAAI,CAACX,QAAL,EACE;AAEFS,IAAAA,OAAO,CAACG,OAAR,GAAkB,KAAlB;AACAF,IAAAA,IAAI;AACL,GANa,EAMX,CAACA,IAAD,EAAOV,QAAP,CANW,CAAd;AAQAO,EAAAA,KAAK,CAACW,SAAN,CAAgB,MAAM;AACpB,QAAIlB,QAAJ,EACEiB,KAAK,GADP,KAGED,KAAK;AAEP,WAAOA,KAAP;AACD,GAPD,EAOG,CAACA,KAAD,EAAQC,KAAR,EAAejB,QAAf,CAPH;AASA,SAAO;AACLgB,IAAAA,KADK;AAELC,IAAAA;AAFK,GAAP;AAID","sourcesContent":["import * as React from \"react\";\n\nimport type { ICarouselController } from \"./useCarouselController\";\n\nexport function useAutoPlay(opts: {\n autoPlay?: boolean\n autoPlayInterval?: number\n autoPlayReverse?: boolean\n carouselController: ICarouselController\n}) {\n const {\n autoPlay = false,\n autoPlayReverse = false,\n autoPlayInterval,\n carouselController,\n } = opts;\n\n const { prev, next } = carouselController;\n const timer = React.useRef<ReturnType<typeof setTimeout>>();\n const stopped = React.useRef<boolean>(!autoPlay);\n\n const play = React.useCallback(() => {\n if (stopped.current)\n return;\n\n timer.current && clearTimeout(timer.current);\n timer.current = setTimeout(() => {\n autoPlayReverse\n ? prev({ onFinished: play })\n : next({ onFinished: play });\n }, autoPlayInterval);\n }, [autoPlayReverse, autoPlayInterval, prev, next]);\n\n const pause = React.useCallback(() => {\n if (!autoPlay)\n return;\n\n timer.current && clearTimeout(timer.current);\n stopped.current = true;\n }, [autoPlay]);\n\n const start = React.useCallback(() => {\n if (!autoPlay)\n return;\n\n stopped.current = false;\n play();\n }, [play, autoPlay]);\n\n React.useEffect(() => {\n if (autoPlay)\n start();\n else\n pause();\n\n return pause;\n }, [pause, start, autoPlay]);\n\n return {\n pause,\n start,\n };\n}\n"]}
|