react-native-reanimated-carousel 4.0.0-alpha.1 → 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 +2 -3
- package/lib/commonjs/{layouts → components}/BaseLayout.js +5 -21
- package/lib/commonjs/components/BaseLayout.js.map +1 -0
- package/lib/commonjs/components/Carousel.js +25 -46
- package/lib/commonjs/components/Carousel.js.map +1 -1
- package/lib/commonjs/components/ItemRenderer.js +80 -0
- package/lib/commonjs/components/ItemRenderer.js.map +1 -0
- package/lib/commonjs/components/ScrollViewGesture.js +51 -33
- package/lib/commonjs/components/ScrollViewGesture.js.map +1 -1
- package/lib/commonjs/components/rnr-demo.test.js +45 -0
- package/lib/commonjs/components/rnr-demo.test.js.map +1 -0
- package/lib/commonjs/hooks/useCarouselController.js +12 -11
- package/lib/commonjs/hooks/useCarouselController.js.map +1 -1
- package/lib/commonjs/hooks/useCommonVariables.js +38 -12
- package/lib/commonjs/hooks/useCommonVariables.js.map +1 -1
- package/lib/commonjs/hooks/useCommonVariables.test.js +38 -0
- package/lib/commonjs/hooks/useCommonVariables.test.js.map +1 -0
- package/lib/commonjs/hooks/useLayoutConfig.js.map +1 -1
- package/lib/commonjs/hooks/useOffsetX.js +9 -6
- package/lib/commonjs/hooks/useOffsetX.js.map +1 -1
- package/lib/commonjs/hooks/useOffsetX.test.js +53 -0
- package/lib/commonjs/hooks/useOffsetX.test.js.map +1 -0
- package/lib/commonjs/hooks/usePanGestureProxy.js +84 -0
- package/lib/commonjs/hooks/usePanGestureProxy.js.map +1 -0
- package/lib/commonjs/hooks/usePanGestureProxy.test.js +397 -0
- package/lib/commonjs/hooks/usePanGestureProxy.test.js.map +1 -0
- package/lib/commonjs/hooks/useUpdateGestureConfig.js.map +1 -1
- package/lib/commonjs/hooks/useVisibleRanges.js +48 -19
- package/lib/commonjs/hooks/useVisibleRanges.js.map +1 -1
- package/lib/commonjs/hooks/useVisibleRanges.test.js +162 -0
- package/lib/commonjs/hooks/useVisibleRanges.test.js.map +1 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/utils/{computeNewIndexWhenDataChanges.js → compute-offset-if-data-changed.js} +3 -3
- package/lib/commonjs/utils/compute-offset-if-data-changed.js.map +1 -0
- package/lib/commonjs/utils/compute-offset-if-data-changed.test.js +30 -0
- package/lib/commonjs/utils/compute-offset-if-data-changed.test.js.map +1 -0
- package/lib/commonjs/utils/compute-offset-if-size-changed.js +18 -0
- package/lib/commonjs/utils/compute-offset-if-size-changed.js.map +1 -0
- package/lib/commonjs/utils/compute-offset-if-size-changed.test.js +72 -0
- package/lib/commonjs/utils/compute-offset-if-size-changed.test.js.map +1 -0
- package/lib/commonjs/utils/handleroffset-direction.js +5 -5
- package/lib/commonjs/utils/handleroffset-direction.js.map +1 -1
- package/lib/commonjs/utils/handleroffset-direction.test.js +46 -0
- package/lib/commonjs/utils/handleroffset-direction.test.js.map +1 -0
- package/lib/commonjs/utils/index.test.js +6 -6
- package/lib/commonjs/utils/index.test.js.map +1 -1
- package/lib/module/{layouts → components}/BaseLayout.js +6 -16
- package/lib/module/components/BaseLayout.js.map +1 -0
- package/lib/module/components/Carousel.js +24 -42
- package/lib/module/components/Carousel.js.map +1 -1
- package/lib/module/components/ItemRenderer.js +62 -0
- package/lib/module/components/ItemRenderer.js.map +1 -0
- package/lib/module/components/ScrollViewGesture.js +53 -34
- package/lib/module/components/ScrollViewGesture.js.map +1 -1
- package/lib/module/components/rnr-demo.test.js +33 -0
- package/lib/module/components/rnr-demo.test.js.map +1 -0
- package/lib/module/hooks/useCarouselController.js +12 -11
- package/lib/module/hooks/useCarouselController.js.map +1 -1
- package/lib/module/hooks/useCommonVariables.js +38 -8
- package/lib/module/hooks/useCommonVariables.js.map +1 -1
- package/lib/module/hooks/useCommonVariables.test.js +34 -0
- package/lib/module/hooks/useCommonVariables.test.js.map +1 -0
- package/lib/module/hooks/useLayoutConfig.js.map +1 -1
- package/lib/module/hooks/useOffsetX.js +9 -6
- package/lib/module/hooks/useOffsetX.js.map +1 -1
- package/lib/module/hooks/useOffsetX.test.js +48 -0
- package/lib/module/hooks/useOffsetX.test.js.map +1 -0
- package/lib/module/hooks/usePanGestureProxy.js +71 -0
- package/lib/module/hooks/usePanGestureProxy.js.map +1 -0
- package/lib/module/hooks/usePanGestureProxy.test.js +383 -0
- package/lib/module/hooks/usePanGestureProxy.test.js.map +1 -0
- package/lib/module/hooks/useUpdateGestureConfig.js.map +1 -1
- package/lib/module/hooks/useVisibleRanges.js +47 -19
- package/lib/module/hooks/useVisibleRanges.js.map +1 -1
- package/lib/module/hooks/useVisibleRanges.test.js +157 -0
- package/lib/module/hooks/useVisibleRanges.test.js.map +1 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/utils/{computeNewIndexWhenDataChanges.js → compute-offset-if-data-changed.js} +2 -2
- package/lib/module/utils/compute-offset-if-data-changed.js.map +1 -0
- package/lib/module/utils/compute-offset-if-data-changed.test.js +27 -0
- package/lib/module/utils/compute-offset-if-data-changed.test.js.map +1 -0
- package/lib/module/utils/compute-offset-if-size-changed.js +11 -0
- package/lib/module/utils/compute-offset-if-size-changed.js.map +1 -0
- package/lib/module/utils/compute-offset-if-size-changed.test.js +69 -0
- package/lib/module/utils/compute-offset-if-size-changed.test.js.map +1 -0
- package/lib/module/utils/handleroffset-direction.js +5 -5
- package/lib/module/utils/handleroffset-direction.js.map +1 -1
- package/lib/module/utils/handleroffset-direction.test.js +41 -0
- package/lib/module/utils/handleroffset-direction.test.js.map +1 -0
- package/lib/module/utils/index.test.js +6 -6
- package/lib/module/utils/index.test.js.map +1 -1
- package/lib/typescript/components/ItemRenderer.d.ts +22 -0
- package/lib/typescript/components/ScrollViewGesture.d.ts +1 -1
- package/lib/typescript/components/rnr-demo.test.d.ts +1 -0
- package/lib/typescript/hooks/useCarouselController.d.ts +3 -2
- package/lib/typescript/hooks/useCommonVariables.test.d.ts +1 -0
- package/lib/typescript/hooks/useLayoutConfig.d.ts +1 -1
- package/lib/typescript/hooks/useOffsetX.test.d.ts +1 -0
- package/lib/typescript/hooks/usePanGestureProxy.d.ts +9 -0
- package/lib/typescript/hooks/usePanGestureProxy.test.d.ts +1 -0
- package/lib/typescript/hooks/useUpdateGestureConfig.d.ts +3 -2
- package/lib/typescript/hooks/useVisibleRanges.d.ts +8 -4
- package/lib/typescript/hooks/useVisibleRanges.test.d.ts +1 -0
- package/lib/typescript/index.d.ts +1 -0
- package/lib/typescript/types.d.ts +13 -4
- package/lib/typescript/utils/{computeNewIndexWhenDataChanges.d.ts → compute-offset-if-data-changed.d.ts} +1 -1
- package/lib/typescript/utils/compute-offset-if-data-changed.test.d.ts +1 -0
- package/lib/typescript/utils/compute-offset-if-size-changed.d.ts +5 -0
- package/lib/typescript/utils/compute-offset-if-size-changed.test.d.ts +1 -0
- package/lib/typescript/utils/handleroffset-direction.d.ts +2 -1
- package/lib/typescript/utils/handleroffset-direction.test.d.ts +1 -0
- package/package.json +16 -59
- package/src/{layouts → components}/BaseLayout.tsx +7 -35
- package/src/components/Carousel.tsx +24 -58
- package/src/components/ItemRenderer.tsx +105 -0
- package/src/components/ScrollViewGesture.tsx +74 -49
- package/src/components/rnr-demo.test.tsx +43 -0
- package/src/hooks/useCarouselController.tsx +24 -21
- package/src/hooks/useCommonVariables.test.tsx +41 -0
- package/src/hooks/useCommonVariables.ts +35 -10
- package/src/hooks/useLayoutConfig.ts +1 -1
- package/src/hooks/useOffsetX.test.ts +54 -0
- package/src/hooks/useOffsetX.ts +33 -31
- package/src/hooks/usePanGestureProxy.test.tsx +376 -0
- package/src/hooks/usePanGestureProxy.ts +110 -0
- package/src/hooks/useUpdateGestureConfig.ts +4 -2
- package/src/hooks/useVisibleRanges.test.tsx +179 -0
- package/src/hooks/useVisibleRanges.tsx +72 -24
- package/src/index.tsx +2 -0
- package/src/types.ts +13 -4
- package/src/utils/compute-offset-if-data-changed.test.ts +30 -0
- package/src/utils/{computeNewIndexWhenDataChanges.ts → compute-offset-if-data-changed.ts} +1 -1
- package/src/utils/compute-offset-if-size-changed.test.ts +78 -0
- package/src/utils/compute-offset-if-size-changed.ts +11 -0
- package/src/utils/handleroffset-direction.test.ts +52 -0
- package/src/utils/handleroffset-direction.ts +12 -9
- package/src/utils/index.test.ts +6 -6
- package/lib/commonjs/layouts/BaseLayout.js.map +0 -1
- package/lib/commonjs/layouts/ParallaxLayout.js +0 -84
- package/lib/commonjs/layouts/ParallaxLayout.js.map +0 -1
- package/lib/commonjs/utils/computeNewIndexWhenDataChanges.js.map +0 -1
- package/lib/module/layouts/BaseLayout.js.map +0 -1
- package/lib/module/layouts/ParallaxLayout.js +0 -61
- package/lib/module/layouts/ParallaxLayout.js.map +0 -1
- package/lib/module/utils/computeNewIndexWhenDataChanges.js.map +0 -1
- package/lib/typescript/layouts/ParallaxLayout.d.ts +0 -13
- package/src/layouts/ParallaxLayout.tsx +0 -141
- /package/lib/typescript/{layouts → components}/BaseLayout.d.ts +0 -0
package/README.md
CHANGED
|
@@ -32,9 +32,8 @@ Check out [the documentation website](https://reanimated-carousel.dev).
|
|
|
32
32
|
| <a href="./example/app/src/pages/parallax/index.tsx">parallax-vertical</a> | <a href="./example/app/src/pages/stack/index.tsx">stack-horizontal-left</a> | <a href="./example/app/src/pages/stack/index.tsx">stack-horizontal-right</a> |
|
|
33
33
|
| <img src="assets/stack-vertical-left.gif"/> | <img src="assets/stack-vertical-right.gif"/> | <img src="assets/stack-horizontal-right.gif"/> |
|
|
34
34
|
| <a href="./example/app/src/pages/stack/index.tsx">stack-vertical-left</a> | <a href="./example/app/src/pages/stack/index.tsx">stack-vertical-right</a> | <a href="./example/app/src/pages/stack/index.tsx">stack-horizontal-right</a> |
|
|
35
|
-
| <img src="assets/left-align.gif"/> |
|
|
36
|
-
| <a href="./example/app/src/pages/left-align/index.tsx">left-align</a> |
|
|
37
|
-
|
|
35
|
+
| <img src="assets/left-align.gif"/> | | <img src="assets/right-align.gif" > |
|
|
36
|
+
| <a href="./example/app/src/pages/left-align/index.tsx">left-align</a> | | <a href="./example/app/src/pages/right-align/index.tsx">right-align</a> |
|
|
38
37
|
|
|
39
38
|
> You can make cool animations with custom animation API [[Details]](https://reanimated-carousel.dev/custom-animations)
|
|
40
39
|
|
|
@@ -9,10 +9,6 @@ var _react = _interopRequireDefault(require("react"));
|
|
|
9
9
|
|
|
10
10
|
var _reactNativeReanimated = _interopRequireWildcard(require("react-native-reanimated"));
|
|
11
11
|
|
|
12
|
-
var _LazyView = require("../components/LazyView");
|
|
13
|
-
|
|
14
|
-
var _useCheckMounted = require("../hooks/useCheckMounted");
|
|
15
|
-
|
|
16
12
|
var _useOffsetX = require("../hooks/useOffsetX");
|
|
17
13
|
|
|
18
14
|
var _store = require("../store");
|
|
@@ -24,7 +20,6 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
|
|
|
24
20
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
25
21
|
|
|
26
22
|
const BaseLayout = props => {
|
|
27
|
-
const mounted = (0, _useCheckMounted.useCheckMounted)();
|
|
28
23
|
const {
|
|
29
24
|
handlerOffset,
|
|
30
25
|
index,
|
|
@@ -48,9 +43,6 @@ const BaseLayout = props => {
|
|
|
48
43
|
}
|
|
49
44
|
} = context;
|
|
50
45
|
const size = vertical ? height : width;
|
|
51
|
-
|
|
52
|
-
const [shouldUpdate, setShouldUpdate] = _react.default.useState(false);
|
|
53
|
-
|
|
54
46
|
let offsetXConfig = {
|
|
55
47
|
handlerOffset,
|
|
56
48
|
index,
|
|
@@ -78,15 +70,9 @@ const BaseLayout = props => {
|
|
|
78
70
|
|
|
79
71
|
const x = (0, _useOffsetX.useOffsetX)(offsetXConfig, visibleRanges);
|
|
80
72
|
const animationValue = (0, _reactNativeReanimated.useDerivedValue)(() => x.value / size, [x, size]);
|
|
81
|
-
const animatedStyle = (0, _reactNativeReanimated.useAnimatedStyle)(() =>
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
mounted.current && setShouldUpdate(index >= negativeRange[0] && index <= negativeRange[1] || index >= positiveRange[0] && index <= positiveRange[1]);
|
|
85
|
-
}, [index, mounted]);
|
|
86
|
-
|
|
87
|
-
(0, _reactNativeReanimated.useAnimatedReaction)(() => visibleRanges.value, () => {
|
|
88
|
-
(0, _reactNativeReanimated.runOnJS)(updateView)(visibleRanges.value.negativeRange, visibleRanges.value.positiveRange);
|
|
89
|
-
}, [visibleRanges.value]);
|
|
73
|
+
const animatedStyle = (0, _reactNativeReanimated.useAnimatedStyle)(() => {
|
|
74
|
+
return animationStyle(x.value / size);
|
|
75
|
+
}, [animationStyle]);
|
|
90
76
|
return /*#__PURE__*/_react.default.createElement(_reactNativeReanimated.default.View, {
|
|
91
77
|
style: [{
|
|
92
78
|
width: width || "100%",
|
|
@@ -99,12 +85,10 @@ const BaseLayout = props => {
|
|
|
99
85
|
* The testID of first item will be changed to __CAROUSEL_ITEM_0_READY__ from __CAROUSEL_ITEM_0_NOT_READY__ when the item is ready.
|
|
100
86
|
* */
|
|
101
87
|
,
|
|
102
|
-
testID: `__CAROUSEL_ITEM_${index}
|
|
103
|
-
}, /*#__PURE__*/_react.default.createElement(_LazyView.LazyView, {
|
|
104
|
-
shouldUpdate: shouldUpdate
|
|
88
|
+
testID: `__CAROUSEL_ITEM_${index}__`
|
|
105
89
|
}, children({
|
|
106
90
|
animationValue
|
|
107
|
-
}))
|
|
91
|
+
}));
|
|
108
92
|
};
|
|
109
93
|
|
|
110
94
|
exports.BaseLayout = BaseLayout;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["BaseLayout.tsx"],"names":["BaseLayout","props","handlerOffset","index","children","visibleRanges","animationStyle","context","React","useContext","CTX","loop","dataLength","width","height","vertical","customConfig","mode","modeConfig","size","offsetXConfig","snapDirection","showLength","type","viewCount","x","animationValue","value","animatedStyle","position"],"mappings":";;;;;;;AAAA;;AAGA;;AAMA;;AAGA;;;;;;;;AAIO,MAAMA,UAQX,GAAIC,KAAD,IAAW;AACd,QAAM;AAAEC,IAAAA,aAAF;AAAiBC,IAAAA,KAAjB;AAAwBC,IAAAA,QAAxB;AAAkCC,IAAAA,aAAlC;AAAiDC,IAAAA;AAAjD,MACFL,KADJ;;AAGA,QAAMM,OAAO,GAAGC,eAAMC,UAAN,CAAiBC,UAAjB,CAAhB;;AACA,QAAM;AACJT,IAAAA,KAAK,EAAE;AACLU,MAAAA,IADK;AAELC,MAAAA,UAFK;AAGLC,MAAAA,KAHK;AAILC,MAAAA,MAJK;AAKLC,MAAAA,QALK;AAMLC,MAAAA,YANK;AAOLC,MAAAA,IAPK;AAQLC,MAAAA;AARK;AADH,MAWFX,OAXJ;AAYA,QAAMY,IAAI,GAAGJ,QAAQ,GAAGD,MAAH,GAAYD,KAAjC;AAEA,MAAIO,aAAoB,GAAG;AACzBlB,IAAAA,aADyB;AAEzBC,IAAAA,KAFyB;AAGzBgB,IAAAA,IAHyB;AAIzBP,IAAAA,UAJyB;AAKzBD,IAAAA,IALyB;AAMzB,QAAI,OAAOK,YAAP,KAAwB,UAAxB,GAAqCA,YAAY,EAAjD,GAAsD,EAA1D;AANyB,GAA3B;;AASA,MAAIC,IAAI,KAAK,kBAAb,EAAiC;AAC/B,UAAM;AAAEI,MAAAA,aAAF;AAAiBC,MAAAA;AAAjB,QAAgCJ,UAAtC;AAEAE,IAAAA,aAAa,GAAG;AACdlB,MAAAA,aADc;AAEdC,MAAAA,KAFc;AAGdgB,MAAAA,IAHc;AAIdP,MAAAA,UAJc;AAKdD,MAAAA,IALc;AAMdY,MAAAA,IAAI,EAAEF,aAAa,KAAK,OAAlB,GAA4B,UAA5B,GAAyC,UANjC;AAOdG,MAAAA,SAAS,EAAEF;AAPG,KAAhB;AASD;;AAED,QAAMG,CAAC,GAAG,4BAAWL,aAAX,EAA0Bf,aAA1B,CAAV;AACA,QAAMqB,cAAc,GAAG,4CAAgB,MAAMD,CAAC,CAACE,KAAF,GAAUR,IAAhC,EAAsC,CAACM,CAAD,EAAIN,IAAJ,CAAtC,CAAvB;AACA,QAAMS,aAAa,GAAG,6CACpB,MAAM;AACJ,WAAOtB,cAAc,CAACmB,CAAC,CAACE,KAAF,GAAUR,IAAX,CAArB;AACD,GAHmB,EAIpB,CAACb,cAAD,CAJoB,CAAtB;AAOA,sBACE,6BAAC,8BAAD,CAAU,IAAV;AACE,IAAA,KAAK,EAAE,CACL;AACEO,MAAAA,KAAK,EAAEA,KAAK,IAAI,MADlB;AAEEC,MAAAA,MAAM,EAAEA,MAAM,IAAI,MAFpB;AAGEe,MAAAA,QAAQ,EAAE;AAHZ,KADK,EAMLD,aANK;AAQP;AACN;AACA;AACA;AACA;AAbI;AAcE,IAAA,MAAM,EAAG,mBAAkBzB,KAAM;AAdnC,KAgBGC,QAAQ,CAAC;AAAEsB,IAAAA;AAAF,GAAD,CAhBX,CADF;AAoBD,CA/EM","sourcesContent":["import React from \"react\";\nimport type { ViewStyle } from \"react-native\";\nimport type { AnimatedStyleProp } from \"react-native-reanimated\";\nimport Animated, {\n useAnimatedStyle,\n useDerivedValue,\n} from \"react-native-reanimated\";\n\nimport type { IOpts } from \"../hooks/useOffsetX\";\nimport { useOffsetX } from \"../hooks/useOffsetX\";\nimport type { IVisibleRanges } from \"../hooks/useVisibleRanges\";\nimport type { ILayoutConfig } from \"../layouts/stack\";\nimport { CTX } from \"../store\";\n\nexport type TAnimationStyle = (value: number) => AnimatedStyleProp<ViewStyle>;\n\nexport const BaseLayout: React.FC<{\n index: number\n handlerOffset: Animated.SharedValue<number>\n visibleRanges: IVisibleRanges\n animationStyle: TAnimationStyle\n children: (ctx: {\n animationValue: Animated.SharedValue<number>\n }) => React.ReactElement\n}> = (props) => {\n const { handlerOffset, index, children, visibleRanges, animationStyle }\n = props;\n\n const context = React.useContext(CTX);\n const {\n props: {\n loop,\n dataLength,\n width,\n height,\n vertical,\n customConfig,\n mode,\n modeConfig,\n },\n } = context;\n const size = vertical ? height : width;\n\n let offsetXConfig: IOpts = {\n handlerOffset,\n index,\n size,\n dataLength,\n loop,\n ...(typeof customConfig === \"function\" ? customConfig() : {}),\n };\n\n if (mode === \"horizontal-stack\") {\n const { snapDirection, showLength } = modeConfig as ILayoutConfig;\n\n offsetXConfig = {\n handlerOffset,\n index,\n size,\n dataLength,\n loop,\n type: snapDirection === \"right\" ? \"negative\" : \"positive\",\n viewCount: showLength,\n };\n }\n\n const x = useOffsetX(offsetXConfig, visibleRanges);\n const animationValue = useDerivedValue(() => x.value / size, [x, size]);\n const animatedStyle = useAnimatedStyle(\n () => {\n return animationStyle(x.value / size);\n },\n [animationStyle],\n );\n\n return (\n <Animated.View\n style={[\n {\n width: width || \"100%\",\n height: height || \"100%\",\n position: \"absolute\",\n },\n animatedStyle,\n ]}\n /**\n * We use this testID to know when the carousel item is ready to be tested in test.\n * e.g.\n * The testID of first item will be changed to __CAROUSEL_ITEM_0_READY__ from __CAROUSEL_ITEM_0_NOT_READY__ when the item is ready.\n * */\n testID={`__CAROUSEL_ITEM_${index}__`}\n >\n {children({ animationValue })}\n </Animated.View>\n );\n};\n"]}
|
|
@@ -13,6 +13,8 @@ var _reactNativeGestureHandler = require("react-native-gesture-handler");
|
|
|
13
13
|
|
|
14
14
|
var _reactNativeReanimated = require("react-native-reanimated");
|
|
15
15
|
|
|
16
|
+
var _ItemRenderer = require("./ItemRenderer");
|
|
17
|
+
|
|
16
18
|
var _ScrollViewGesture = require("./ScrollViewGesture");
|
|
17
19
|
|
|
18
20
|
var _useAutoPlay = require("../hooks/useAutoPlay");
|
|
@@ -29,10 +31,6 @@ var _useOnProgressChange = require("../hooks/useOnProgressChange");
|
|
|
29
31
|
|
|
30
32
|
var _usePropsErrorBoundary = require("../hooks/usePropsErrorBoundary");
|
|
31
33
|
|
|
32
|
-
var _useVisibleRanges = require("../hooks/useVisibleRanges");
|
|
33
|
-
|
|
34
|
-
var _BaseLayout = require("../layouts/BaseLayout");
|
|
35
|
-
|
|
36
34
|
var _store = require("../store");
|
|
37
35
|
|
|
38
36
|
var _computedWithAutoFillData = require("../utils/computed-with-auto-fill-data");
|
|
@@ -49,8 +47,6 @@ const Carousel = /*#__PURE__*/_react.default.forwardRef((_props, ref) => {
|
|
|
49
47
|
data,
|
|
50
48
|
// Length of fill data
|
|
51
49
|
dataLength,
|
|
52
|
-
// Raw data that has not been processed
|
|
53
|
-
rawData,
|
|
54
50
|
// Length of raw data
|
|
55
51
|
rawDataLength,
|
|
56
52
|
mode,
|
|
@@ -64,10 +60,11 @@ const Carousel = /*#__PURE__*/_react.default.forwardRef((_props, ref) => {
|
|
|
64
60
|
autoPlayInterval,
|
|
65
61
|
scrollAnimationDuration,
|
|
66
62
|
withAnimation,
|
|
63
|
+
fixedDirection,
|
|
67
64
|
renderItem,
|
|
68
65
|
onScrollEnd,
|
|
69
66
|
onSnapToItem,
|
|
70
|
-
|
|
67
|
+
onScrollStart,
|
|
71
68
|
onProgressChange,
|
|
72
69
|
customAnimation,
|
|
73
70
|
defaultIndex
|
|
@@ -102,9 +99,10 @@ const Carousel = /*#__PURE__*/_react.default.forwardRef((_props, ref) => {
|
|
|
102
99
|
handlerOffset,
|
|
103
100
|
withAnimation,
|
|
104
101
|
defaultIndex,
|
|
102
|
+
fixedDirection,
|
|
103
|
+
duration: scrollAnimationDuration,
|
|
105
104
|
onScrollEnd: () => (0, _reactNativeReanimated.runOnJS)(_onScrollEnd)(),
|
|
106
|
-
|
|
107
|
-
duration: scrollAnimationDuration
|
|
105
|
+
onScrollStart: () => !!onScrollStart && (0, _reactNativeReanimated.runOnJS)(onScrollStart)()
|
|
108
106
|
});
|
|
109
107
|
const {
|
|
110
108
|
next,
|
|
@@ -136,10 +134,10 @@ const Carousel = /*#__PURE__*/_react.default.forwardRef((_props, ref) => {
|
|
|
136
134
|
if (onScrollEnd) onScrollEnd(realIndex);
|
|
137
135
|
}, [loop, autoFillData, rawDataLength, getSharedIndex, onSnapToItem, onScrollEnd]);
|
|
138
136
|
|
|
139
|
-
const
|
|
137
|
+
const scrollViewGestureOnScrollStart = _react.default.useCallback(() => {
|
|
140
138
|
pauseAutoPlay();
|
|
141
|
-
|
|
142
|
-
}, [
|
|
139
|
+
onScrollStart === null || onScrollStart === void 0 ? void 0 : onScrollStart();
|
|
140
|
+
}, [onScrollStart, pauseAutoPlay]);
|
|
143
141
|
|
|
144
142
|
const scrollViewGestureOnScrollEnd = _react.default.useCallback(() => {
|
|
145
143
|
startAutoPlay();
|
|
@@ -158,41 +156,9 @@ const Carousel = /*#__PURE__*/_react.default.forwardRef((_props, ref) => {
|
|
|
158
156
|
scrollTo
|
|
159
157
|
}), [getCurrentIndex, next, prev, scrollTo]);
|
|
160
158
|
|
|
161
|
-
const visibleRanges = (0, _useVisibleRanges.useVisibleRanges)({
|
|
162
|
-
total: dataLength,
|
|
163
|
-
viewSize: size,
|
|
164
|
-
translation: handlerOffset,
|
|
165
|
-
windowSize
|
|
166
|
-
});
|
|
167
159
|
const layoutConfig = (0, _useLayoutConfig.useLayoutConfig)({ ...props,
|
|
168
160
|
size
|
|
169
161
|
});
|
|
170
|
-
|
|
171
|
-
const renderLayout = _react.default.useCallback((item, i) => {
|
|
172
|
-
const realIndex = (0, _computedWithAutoFillData.computedRealIndexWithAutoFillData)({
|
|
173
|
-
index: i,
|
|
174
|
-
dataLength: rawDataLength,
|
|
175
|
-
loop,
|
|
176
|
-
autoFillData
|
|
177
|
-
});
|
|
178
|
-
return /*#__PURE__*/_react.default.createElement(_BaseLayout.BaseLayout, {
|
|
179
|
-
key: i,
|
|
180
|
-
index: i,
|
|
181
|
-
handlerOffset: offsetX,
|
|
182
|
-
visibleRanges: visibleRanges,
|
|
183
|
-
animationStyle: customAnimation || layoutConfig
|
|
184
|
-
}, _ref => {
|
|
185
|
-
let {
|
|
186
|
-
animationValue
|
|
187
|
-
} = _ref;
|
|
188
|
-
return renderItem({
|
|
189
|
-
item,
|
|
190
|
-
index: realIndex,
|
|
191
|
-
animationValue
|
|
192
|
-
});
|
|
193
|
-
});
|
|
194
|
-
}, [loop, rawData, offsetX, visibleRanges, autoFillData, renderItem, layoutConfig, customAnimation]);
|
|
195
|
-
|
|
196
162
|
return /*#__PURE__*/_react.default.createElement(_reactNativeGestureHandler.GestureHandlerRootView, null, /*#__PURE__*/_react.default.createElement(_store.CTX.Provider, {
|
|
197
163
|
value: {
|
|
198
164
|
props,
|
|
@@ -207,11 +173,24 @@ const Carousel = /*#__PURE__*/_react.default.forwardRef((_props, ref) => {
|
|
|
207
173
|
height: height || "100%"
|
|
208
174
|
}, style, vertical ? styles.itemsVertical : styles.itemsHorizontal],
|
|
209
175
|
testID: testID,
|
|
210
|
-
|
|
176
|
+
onScrollStart: scrollViewGestureOnScrollStart,
|
|
211
177
|
onScrollEnd: scrollViewGestureOnScrollEnd,
|
|
212
178
|
onTouchBegin: scrollViewGestureOnTouchBegin,
|
|
213
179
|
onTouchEnd: scrollViewGestureOnTouchEnd
|
|
214
|
-
},
|
|
180
|
+
}, /*#__PURE__*/_react.default.createElement(_ItemRenderer.ItemRenderer, {
|
|
181
|
+
data: data,
|
|
182
|
+
dataLength: dataLength,
|
|
183
|
+
rawDataLength: rawDataLength,
|
|
184
|
+
loop: loop,
|
|
185
|
+
size: size,
|
|
186
|
+
windowSize: windowSize,
|
|
187
|
+
autoFillData: autoFillData,
|
|
188
|
+
offsetX: offsetX,
|
|
189
|
+
handlerOffset: handlerOffset,
|
|
190
|
+
layoutConfig: layoutConfig,
|
|
191
|
+
renderItem: renderItem,
|
|
192
|
+
customAnimation: customAnimation
|
|
193
|
+
}))));
|
|
215
194
|
});
|
|
216
195
|
|
|
217
196
|
var _default = Carousel;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["Carousel.tsx"],"names":["Carousel","React","forwardRef","_props","ref","props","testID","loop","autoFillData","data","dataLength","rawData","rawDataLength","mode","style","width","height","vertical","autoPlay","windowSize","autoPlayReverse","autoPlayInterval","scrollAnimationDuration","withAnimation","renderItem","onScrollEnd","onSnapToItem","onScrollBegin","onProgressChange","customAnimation","defaultIndex","commonVariables","size","handlerOffset","offsetX","totalSize","x","value","isNaN","carouselController","_onScrollEnd","duration","next","prev","scrollTo","getSharedIndex","getCurrentIndex","start","startAutoPlay","pause","pauseAutoPlay","useCallback","_sharedIndex","Math","round","realIndex","index","scrollViewGestureOnScrollBegin","scrollViewGestureOnScrollEnd","scrollViewGestureOnTouchBegin","scrollViewGestureOnTouchEnd","useImperativeHandle","visibleRanges","total","viewSize","translation","layoutConfig","renderLayout","item","i","animationValue","common","styles","container","itemsVertical","itemsHorizontal","map","StyleSheet","create","overflow","flexDirection"],"mappings":"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","sourcesContent":["import React from \"react\";\nimport { StyleSheet } from \"react-native\";\nimport { GestureHandlerRootView } from \"react-native-gesture-handler\";\nimport { runOnJS, useDerivedValue } from \"react-native-reanimated\";\n\nimport { ScrollViewGesture } from \"./ScrollViewGesture\";\n\nimport { useAutoPlay } from \"../hooks/useAutoPlay\";\nimport { useCarouselController } from \"../hooks/useCarouselController\";\nimport { useCommonVariables } from \"../hooks/useCommonVariables\";\nimport { useInitProps } from \"../hooks/useInitProps\";\nimport { useLayoutConfig } from \"../hooks/useLayoutConfig\";\nimport { useOnProgressChange } from \"../hooks/useOnProgressChange\";\nimport { usePropsErrorBoundary } from \"../hooks/usePropsErrorBoundary\";\nimport { useVisibleRanges } from \"../hooks/useVisibleRanges\";\nimport { BaseLayout } from \"../layouts/BaseLayout\";\nimport { CTX } from \"../store\";\nimport type { ICarouselInstance, TCarouselProps } from \"../types\";\nimport { computedRealIndexWithAutoFillData } from \"../utils/computed-with-auto-fill-data\";\n\nconst Carousel = React.forwardRef<ICarouselInstance, TCarouselProps<any>>(\n (_props, ref) => {\n const props = useInitProps(_props);\n\n const {\n testID,\n loop,\n autoFillData,\n // Fill data with autoFillData\n data,\n // Length of fill data\n dataLength,\n // Raw data that has not been processed\n rawData,\n // Length of raw data\n rawDataLength,\n mode,\n style,\n width,\n height,\n vertical,\n autoPlay,\n windowSize,\n autoPlayReverse,\n autoPlayInterval,\n scrollAnimationDuration,\n withAnimation,\n renderItem,\n onScrollEnd,\n onSnapToItem,\n onScrollBegin,\n onProgressChange,\n customAnimation,\n defaultIndex,\n } = props;\n\n const commonVariables = useCommonVariables(props);\n const { size, handlerOffset } = commonVariables;\n\n const offsetX = useDerivedValue(() => {\n const totalSize = size * dataLength;\n const x = handlerOffset.value % totalSize;\n\n if (!loop)\n return handlerOffset.value;\n\n return isNaN(x) ? 0 : x;\n }, [loop, size, dataLength]);\n\n usePropsErrorBoundary({ ...props, dataLength });\n useOnProgressChange({\n autoFillData,\n loop,\n size,\n offsetX,\n rawDataLength,\n onProgressChange,\n });\n\n const carouselController = useCarouselController({\n loop,\n size,\n dataLength,\n autoFillData,\n handlerOffset,\n withAnimation,\n defaultIndex,\n onScrollEnd: () => runOnJS(_onScrollEnd)(),\n onScrollBegin: () => !!onScrollBegin && runOnJS(onScrollBegin)(),\n duration: scrollAnimationDuration,\n });\n\n const { next, prev, scrollTo, getSharedIndex, getCurrentIndex }\n = carouselController;\n\n const { start: startAutoPlay, pause: pauseAutoPlay } = useAutoPlay({\n autoPlay,\n autoPlayInterval,\n autoPlayReverse,\n carouselController,\n });\n\n const _onScrollEnd = React.useCallback(() => {\n const _sharedIndex = Math.round(getSharedIndex());\n\n const realIndex = computedRealIndexWithAutoFillData({\n index: _sharedIndex,\n dataLength: rawDataLength,\n loop,\n autoFillData,\n });\n\n if (onSnapToItem)\n onSnapToItem(realIndex);\n\n if (onScrollEnd)\n onScrollEnd(realIndex);\n }, [\n loop,\n autoFillData,\n rawDataLength,\n getSharedIndex,\n onSnapToItem,\n onScrollEnd,\n ]);\n\n const scrollViewGestureOnScrollBegin = React.useCallback(() => {\n pauseAutoPlay();\n onScrollBegin?.();\n }, [onScrollBegin, pauseAutoPlay]);\n\n const scrollViewGestureOnScrollEnd = React.useCallback(() => {\n startAutoPlay();\n _onScrollEnd();\n }, [_onScrollEnd, startAutoPlay]);\n\n const scrollViewGestureOnTouchBegin = React.useCallback(pauseAutoPlay, [\n pauseAutoPlay,\n ]);\n\n const scrollViewGestureOnTouchEnd = React.useCallback(startAutoPlay, [\n startAutoPlay,\n ]);\n\n React.useImperativeHandle(\n ref,\n () => ({\n next,\n prev,\n getCurrentIndex,\n scrollTo,\n }),\n [getCurrentIndex, next, prev, scrollTo],\n );\n\n const visibleRanges = useVisibleRanges({\n total: dataLength,\n viewSize: size,\n translation: handlerOffset,\n windowSize,\n });\n\n const layoutConfig = useLayoutConfig({ ...props, size });\n\n const renderLayout = React.useCallback(\n (item: any, i: number) => {\n const realIndex = computedRealIndexWithAutoFillData({\n index: i,\n dataLength: rawDataLength,\n loop,\n autoFillData,\n });\n\n return (\n <BaseLayout\n key={i}\n index={i}\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 loop,\n rawData,\n offsetX,\n visibleRanges,\n autoFillData,\n renderItem,\n layoutConfig,\n customAnimation,\n ],\n );\n\n return (\n <GestureHandlerRootView>\n <CTX.Provider value={{ props, common: commonVariables }}>\n <ScrollViewGesture\n key={mode}\n size={size}\n translation={handlerOffset}\n style={[\n styles.container,\n {\n width: width || \"100%\",\n height: height || \"100%\",\n },\n style,\n vertical\n ? styles.itemsVertical\n : styles.itemsHorizontal,\n ]}\n testID={testID}\n onScrollBegin={scrollViewGestureOnScrollBegin}\n onScrollEnd={scrollViewGestureOnScrollEnd}\n onTouchBegin={scrollViewGestureOnTouchBegin}\n onTouchEnd={scrollViewGestureOnTouchEnd}\n >\n {data.map(renderLayout)}\n </ScrollViewGesture>\n </CTX.Provider>\n </GestureHandlerRootView>\n );\n },\n);\n\nexport default Carousel as <T extends any>(\n props: React.PropsWithChildren<TCarouselProps<T>>\n) => React.ReactElement;\n\nconst styles = StyleSheet.create({\n container: {\n overflow: \"hidden\",\n },\n itemsHorizontal: {\n flexDirection: \"row\",\n },\n itemsVertical: {\n flexDirection: \"column\",\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["Carousel.tsx"],"names":["Carousel","React","forwardRef","_props","ref","props","testID","loop","autoFillData","data","dataLength","rawDataLength","mode","style","width","height","vertical","autoPlay","windowSize","autoPlayReverse","autoPlayInterval","scrollAnimationDuration","withAnimation","fixedDirection","renderItem","onScrollEnd","onSnapToItem","onScrollStart","onProgressChange","customAnimation","defaultIndex","commonVariables","size","handlerOffset","offsetX","totalSize","x","value","isNaN","carouselController","duration","_onScrollEnd","next","prev","scrollTo","getSharedIndex","getCurrentIndex","start","startAutoPlay","pause","pauseAutoPlay","useCallback","_sharedIndex","Math","round","realIndex","index","scrollViewGestureOnScrollStart","scrollViewGestureOnScrollEnd","scrollViewGestureOnTouchBegin","scrollViewGestureOnTouchEnd","useImperativeHandle","layoutConfig","common","styles","container","itemsVertical","itemsHorizontal","StyleSheet","create","overflow","flexDirection"],"mappings":"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","sourcesContent":["import React from \"react\";\nimport { StyleSheet } from \"react-native\";\nimport { GestureHandlerRootView } from \"react-native-gesture-handler\";\nimport { runOnJS, useDerivedValue } from \"react-native-reanimated\";\n\nimport { ItemRenderer } from \"./ItemRenderer\";\nimport { ScrollViewGesture } from \"./ScrollViewGesture\";\n\nimport { useAutoPlay } from \"../hooks/useAutoPlay\";\nimport { useCarouselController } from \"../hooks/useCarouselController\";\nimport { useCommonVariables } from \"../hooks/useCommonVariables\";\nimport { useInitProps } from \"../hooks/useInitProps\";\nimport { useLayoutConfig } from \"../hooks/useLayoutConfig\";\nimport { useOnProgressChange } from \"../hooks/useOnProgressChange\";\nimport { usePropsErrorBoundary } from \"../hooks/usePropsErrorBoundary\";\nimport { CTX } from \"../store\";\nimport type { ICarouselInstance, TCarouselProps } from \"../types\";\nimport { computedRealIndexWithAutoFillData } from \"../utils/computed-with-auto-fill-data\";\n\nconst Carousel = React.forwardRef<ICarouselInstance, TCarouselProps<any>>(\n (_props, ref) => {\n const props = useInitProps(_props);\n\n const {\n testID,\n loop,\n autoFillData,\n // Fill data with autoFillData\n data,\n // Length of fill data\n dataLength,\n // Length of raw data\n rawDataLength,\n mode,\n style,\n width,\n height,\n vertical,\n autoPlay,\n windowSize,\n autoPlayReverse,\n autoPlayInterval,\n scrollAnimationDuration,\n withAnimation,\n fixedDirection,\n renderItem,\n onScrollEnd,\n onSnapToItem,\n onScrollStart,\n onProgressChange,\n customAnimation,\n defaultIndex,\n } = props;\n\n const commonVariables = useCommonVariables(props);\n const { size, handlerOffset } = commonVariables;\n\n const offsetX = useDerivedValue(() => {\n const totalSize = size * dataLength;\n const x = handlerOffset.value % totalSize;\n\n if (!loop)\n return handlerOffset.value;\n\n return isNaN(x) ? 0 : x;\n }, [loop, size, dataLength]);\n\n usePropsErrorBoundary({ ...props, dataLength });\n useOnProgressChange({\n autoFillData,\n loop,\n size,\n offsetX,\n rawDataLength,\n onProgressChange,\n });\n\n const carouselController = useCarouselController({\n loop,\n size,\n dataLength,\n autoFillData,\n handlerOffset,\n withAnimation,\n defaultIndex,\n fixedDirection,\n duration: scrollAnimationDuration,\n onScrollEnd: () => runOnJS(_onScrollEnd)(),\n onScrollStart: () => !!onScrollStart && runOnJS(onScrollStart)(),\n });\n\n const { next, prev, scrollTo, getSharedIndex, getCurrentIndex }\n = carouselController;\n\n const { start: startAutoPlay, pause: pauseAutoPlay } = useAutoPlay({\n autoPlay,\n autoPlayInterval,\n autoPlayReverse,\n carouselController,\n });\n\n const _onScrollEnd = React.useCallback(() => {\n const _sharedIndex = Math.round(getSharedIndex());\n\n const realIndex = computedRealIndexWithAutoFillData({\n index: _sharedIndex,\n dataLength: rawDataLength,\n loop,\n autoFillData,\n });\n\n if (onSnapToItem)\n onSnapToItem(realIndex);\n\n if (onScrollEnd)\n onScrollEnd(realIndex);\n }, [\n loop,\n autoFillData,\n rawDataLength,\n getSharedIndex,\n onSnapToItem,\n onScrollEnd,\n ]);\n\n const scrollViewGestureOnScrollStart = React.useCallback(() => {\n pauseAutoPlay();\n onScrollStart?.();\n }, [onScrollStart, pauseAutoPlay]);\n\n const scrollViewGestureOnScrollEnd = React.useCallback(() => {\n startAutoPlay();\n _onScrollEnd();\n }, [_onScrollEnd, startAutoPlay]);\n\n const scrollViewGestureOnTouchBegin = React.useCallback(pauseAutoPlay, [\n pauseAutoPlay,\n ]);\n\n const scrollViewGestureOnTouchEnd = React.useCallback(startAutoPlay, [\n startAutoPlay,\n ]);\n\n React.useImperativeHandle(\n ref,\n () => ({\n next,\n prev,\n getCurrentIndex,\n scrollTo,\n }),\n [getCurrentIndex, next, prev, scrollTo],\n );\n\n const layoutConfig = useLayoutConfig({ ...props, size });\n\n return (\n <GestureHandlerRootView>\n <CTX.Provider value={{ props, common: commonVariables }}>\n <ScrollViewGesture\n key={mode}\n size={size}\n translation={handlerOffset}\n style={[\n styles.container,\n {\n width: width || \"100%\",\n height: height || \"100%\",\n },\n style,\n vertical\n ? styles.itemsVertical\n : styles.itemsHorizontal,\n ]}\n testID={testID}\n onScrollStart={scrollViewGestureOnScrollStart}\n onScrollEnd={scrollViewGestureOnScrollEnd}\n onTouchBegin={scrollViewGestureOnTouchBegin}\n onTouchEnd={scrollViewGestureOnTouchEnd}\n >\n <ItemRenderer\n data={data}\n dataLength={dataLength}\n rawDataLength={rawDataLength}\n loop={loop}\n size={size}\n windowSize={windowSize}\n autoFillData={autoFillData}\n offsetX={offsetX}\n handlerOffset={handlerOffset}\n layoutConfig={layoutConfig}\n renderItem={renderItem}\n customAnimation={customAnimation}\n />\n </ScrollViewGesture>\n </CTX.Provider>\n </GestureHandlerRootView>\n );\n },\n);\n\nexport default Carousel as <T extends any>(\n props: React.PropsWithChildren<TCarouselProps<T>>\n) => React.ReactElement;\n\nconst styles = StyleSheet.create({\n container: {\n overflow: \"hidden\",\n },\n itemsHorizontal: {\n flexDirection: \"row\",\n },\n itemsVertical: {\n flexDirection: \"column\",\n },\n});\n"]}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ItemRenderer = void 0;
|
|
7
|
+
|
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
|
9
|
+
|
|
10
|
+
var _reactNativeReanimated = require("react-native-reanimated");
|
|
11
|
+
|
|
12
|
+
var _BaseLayout = require("./BaseLayout");
|
|
13
|
+
|
|
14
|
+
var _useVisibleRanges = require("../hooks/useVisibleRanges");
|
|
15
|
+
|
|
16
|
+
var _computedWithAutoFillData = require("../utils/computed-with-auto-fill-data");
|
|
17
|
+
|
|
18
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
19
|
+
|
|
20
|
+
const ItemRenderer = props => {
|
|
21
|
+
const {
|
|
22
|
+
data,
|
|
23
|
+
size,
|
|
24
|
+
windowSize,
|
|
25
|
+
handlerOffset,
|
|
26
|
+
offsetX,
|
|
27
|
+
dataLength,
|
|
28
|
+
rawDataLength,
|
|
29
|
+
loop,
|
|
30
|
+
autoFillData,
|
|
31
|
+
layoutConfig,
|
|
32
|
+
renderItem,
|
|
33
|
+
customAnimation
|
|
34
|
+
} = props;
|
|
35
|
+
const visibleRanges = (0, _useVisibleRanges.useVisibleRanges)({
|
|
36
|
+
total: dataLength,
|
|
37
|
+
viewSize: size,
|
|
38
|
+
translation: handlerOffset,
|
|
39
|
+
windowSize,
|
|
40
|
+
loop
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
const [displayedItems, setDisplayedItems] = _react.default.useState(null);
|
|
44
|
+
|
|
45
|
+
(0, _reactNativeReanimated.useAnimatedReaction)(() => visibleRanges.value, ranges => (0, _reactNativeReanimated.runOnJS)(setDisplayedItems)(ranges), [visibleRanges]);
|
|
46
|
+
if (!displayedItems) return null;
|
|
47
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, data.map((item, index) => {
|
|
48
|
+
const realIndex = (0, _computedWithAutoFillData.computedRealIndexWithAutoFillData)({
|
|
49
|
+
index,
|
|
50
|
+
dataLength: rawDataLength,
|
|
51
|
+
loop,
|
|
52
|
+
autoFillData
|
|
53
|
+
});
|
|
54
|
+
const {
|
|
55
|
+
negativeRange,
|
|
56
|
+
positiveRange
|
|
57
|
+
} = displayedItems;
|
|
58
|
+
const shouldRender = index >= negativeRange[0] && index <= negativeRange[1] || index >= positiveRange[0] && index <= positiveRange[1];
|
|
59
|
+
if (!shouldRender) return null;
|
|
60
|
+
return /*#__PURE__*/_react.default.createElement(_BaseLayout.BaseLayout, {
|
|
61
|
+
key: index,
|
|
62
|
+
index: index,
|
|
63
|
+
handlerOffset: offsetX,
|
|
64
|
+
visibleRanges: visibleRanges,
|
|
65
|
+
animationStyle: customAnimation || layoutConfig
|
|
66
|
+
}, _ref => {
|
|
67
|
+
let {
|
|
68
|
+
animationValue
|
|
69
|
+
} = _ref;
|
|
70
|
+
return renderItem({
|
|
71
|
+
item,
|
|
72
|
+
index: realIndex,
|
|
73
|
+
animationValue
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
}));
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
exports.ItemRenderer = ItemRenderer;
|
|
80
|
+
//# sourceMappingURL=ItemRenderer.js.map
|
|
@@ -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"]}
|
|
@@ -13,7 +13,7 @@ var _reactNativeReanimated = _interopRequireWildcard(require("react-native-reani
|
|
|
13
13
|
|
|
14
14
|
var _constants = require("../constants");
|
|
15
15
|
|
|
16
|
-
var
|
|
16
|
+
var _usePanGestureProxy = require("../hooks/usePanGestureProxy");
|
|
17
17
|
|
|
18
18
|
var _store = require("../store");
|
|
19
19
|
|
|
@@ -30,13 +30,15 @@ const IScrollViewGesture = props => {
|
|
|
30
30
|
vertical,
|
|
31
31
|
pagingEnabled,
|
|
32
32
|
snapEnabled,
|
|
33
|
-
loop
|
|
33
|
+
loop,
|
|
34
34
|
scrollAnimationDuration,
|
|
35
35
|
withAnimation,
|
|
36
36
|
enabled,
|
|
37
37
|
dataLength,
|
|
38
38
|
overscrollEnabled,
|
|
39
|
-
maxScrollDistancePerSwipe
|
|
39
|
+
maxScrollDistancePerSwipe,
|
|
40
|
+
minScrollDistancePerSwipe,
|
|
41
|
+
fixedDirection
|
|
40
42
|
}
|
|
41
43
|
} = _react.default.useContext(_store.CTX);
|
|
42
44
|
|
|
@@ -45,7 +47,7 @@ const IScrollViewGesture = props => {
|
|
|
45
47
|
translation,
|
|
46
48
|
testID,
|
|
47
49
|
style = {},
|
|
48
|
-
|
|
50
|
+
onScrollStart,
|
|
49
51
|
onScrollEnd,
|
|
50
52
|
onTouchBegin,
|
|
51
53
|
onTouchEnd
|
|
@@ -59,12 +61,13 @@ const IScrollViewGesture = props => {
|
|
|
59
61
|
const scrollEndTranslation = (0, _reactNativeReanimated.useSharedValue)(0);
|
|
60
62
|
const scrollEndVelocity = (0, _reactNativeReanimated.useSharedValue)(0);
|
|
61
63
|
const containerRef = (0, _reactNativeReanimated.useAnimatedRef)();
|
|
62
|
-
const maxScrollDistancePerSwipeIsSet = typeof maxScrollDistancePerSwipe === "number";
|
|
64
|
+
const maxScrollDistancePerSwipeIsSet = typeof maxScrollDistancePerSwipe === "number";
|
|
65
|
+
const minScrollDistancePerSwipeIsSet = typeof minScrollDistancePerSwipe === "number"; // Get the limit of the scroll.
|
|
63
66
|
|
|
64
67
|
const getLimit = _react.default.useCallback(() => {
|
|
65
68
|
"worklet";
|
|
66
69
|
|
|
67
|
-
if (!
|
|
70
|
+
if (!loop && !overscrollEnabled) {
|
|
68
71
|
const {
|
|
69
72
|
width: containerWidth = 0
|
|
70
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.
|
|
@@ -75,7 +78,7 @@ const IScrollViewGesture = props => {
|
|
|
75
78
|
}
|
|
76
79
|
|
|
77
80
|
return dataLength * size;
|
|
78
|
-
}, [
|
|
81
|
+
}, [loop, size, dataLength, overscrollEnabled]);
|
|
79
82
|
|
|
80
83
|
const withSpring = _react.default.useCallback((toValue, onFinished) => {
|
|
81
84
|
"worklet";
|
|
@@ -122,7 +125,7 @@ const IScrollViewGesture = props => {
|
|
|
122
125
|
const computed = offset < 0 ? Math.ceil : Math.floor;
|
|
123
126
|
const page = computed(-translation.value / size);
|
|
124
127
|
|
|
125
|
-
if (
|
|
128
|
+
if (loop) {
|
|
126
129
|
const finalPage = page + offset;
|
|
127
130
|
finalTranslation = withSpring(withProcessTranslation(-finalPage * size), onFinished);
|
|
128
131
|
} else {
|
|
@@ -141,7 +144,7 @@ const IScrollViewGesture = props => {
|
|
|
141
144
|
translation.value = finalTranslation;
|
|
142
145
|
|
|
143
146
|
function withProcessTranslation(translation) {
|
|
144
|
-
if (!
|
|
147
|
+
if (!loop && !overscrollEnabled) {
|
|
145
148
|
const limit = getLimit();
|
|
146
149
|
const sign = Math.sign(translation);
|
|
147
150
|
return sign * Math.max(0, Math.min(limit, Math.abs(translation)));
|
|
@@ -149,7 +152,7 @@ const IScrollViewGesture = props => {
|
|
|
149
152
|
|
|
150
153
|
return translation;
|
|
151
154
|
}
|
|
152
|
-
}, [withSpring, size, maxPage,
|
|
155
|
+
}, [withSpring, size, maxPage, loop, snapEnabled, translation, pagingEnabled, scrollEndVelocity.value, maxScrollDistancePerSwipe, scrollEndTranslation.value, maxScrollDistancePerSwipeIsSet]);
|
|
153
156
|
|
|
154
157
|
const onFinish = _react.default.useCallback(isFinished => {
|
|
155
158
|
"worklet";
|
|
@@ -180,7 +183,7 @@ const IScrollViewGesture = props => {
|
|
|
180
183
|
return;
|
|
181
184
|
}
|
|
182
185
|
|
|
183
|
-
if (!
|
|
186
|
+
if (!loop) {
|
|
184
187
|
translation.value = withSpring(0);
|
|
185
188
|
return;
|
|
186
189
|
}
|
|
@@ -192,9 +195,9 @@ const IScrollViewGesture = props => {
|
|
|
192
195
|
return;
|
|
193
196
|
}
|
|
194
197
|
|
|
195
|
-
if (!
|
|
198
|
+
if (!loop) translation.value = withSpring(-((maxPage - 1) * size));
|
|
196
199
|
}
|
|
197
|
-
}, [touching.value, translation, maxPage, size, scrollEndTranslation.value,
|
|
200
|
+
}, [touching.value, translation, maxPage, size, scrollEndTranslation.value, loop, activeDecay, withSpring]);
|
|
198
201
|
|
|
199
202
|
(0, _reactNativeReanimated.useAnimatedReaction)(() => translation.value, () => {
|
|
200
203
|
if (!pagingEnabled) resetBoundary();
|
|
@@ -203,7 +206,7 @@ const IScrollViewGesture = props => {
|
|
|
203
206
|
function withProcessTranslation(translation) {
|
|
204
207
|
"worklet";
|
|
205
208
|
|
|
206
|
-
if (!
|
|
209
|
+
if (!loop && !overscrollEnabled) {
|
|
207
210
|
const limit = getLimit();
|
|
208
211
|
const sign = Math.sign(translation);
|
|
209
212
|
return sign * Math.max(0, Math.min(limit, Math.abs(translation)));
|
|
@@ -212,16 +215,16 @@ const IScrollViewGesture = props => {
|
|
|
212
215
|
return translation;
|
|
213
216
|
}
|
|
214
217
|
|
|
215
|
-
const
|
|
218
|
+
const onGestureStart = (0, _react.useCallback)(_ => {
|
|
216
219
|
"worklet";
|
|
217
220
|
|
|
218
221
|
touching.value = true;
|
|
219
222
|
validStart.value = true;
|
|
220
|
-
|
|
223
|
+
onScrollStart && (0, _reactNativeReanimated.runOnJS)(onScrollStart)();
|
|
221
224
|
max.value = (maxPage - 1) * size;
|
|
222
|
-
if (!
|
|
225
|
+
if (!loop && !overscrollEnabled) max.value = getLimit();
|
|
223
226
|
panOffset.value = translation.value;
|
|
224
|
-
}, [max, size, maxPage,
|
|
227
|
+
}, [max, size, maxPage, loop, touching, panOffset, validStart, translation, overscrollEnabled, getLimit, onScrollStart]);
|
|
225
228
|
const onGestureUpdate = (0, _react.useCallback)(e => {
|
|
226
229
|
"worklet";
|
|
227
230
|
|
|
@@ -235,9 +238,10 @@ const IScrollViewGesture = props => {
|
|
|
235
238
|
translationX,
|
|
236
239
|
translationY
|
|
237
240
|
} = e;
|
|
238
|
-
|
|
241
|
+
let panTranslation = isHorizontal.value ? translationX : translationY;
|
|
242
|
+
if (fixedDirection === "negative") panTranslation = -Math.abs(panTranslation);else if (fixedDirection === "positive") panTranslation = +Math.abs(panTranslation);
|
|
239
243
|
|
|
240
|
-
if (!
|
|
244
|
+
if (!loop) {
|
|
241
245
|
if (translation.value > 0 || translation.value < -max.value) {
|
|
242
246
|
const boundary = translation.value > 0 ? 0 : -max.value;
|
|
243
247
|
const fixed = boundary - panOffset.value;
|
|
@@ -249,8 +253,8 @@ const IScrollViewGesture = props => {
|
|
|
249
253
|
|
|
250
254
|
const translationValue = panOffset.value + panTranslation;
|
|
251
255
|
translation.value = translationValue;
|
|
252
|
-
}, [isHorizontal, max, panOffset,
|
|
253
|
-
const
|
|
256
|
+
}, [isHorizontal, max, panOffset, loop, overscrollEnabled, fixedDirection, translation, validStart, touching]);
|
|
257
|
+
const onGestureEnd = (0, _react.useCallback)((e, _success) => {
|
|
254
258
|
"worklet";
|
|
255
259
|
|
|
256
260
|
const {
|
|
@@ -260,26 +264,40 @@ const IScrollViewGesture = props => {
|
|
|
260
264
|
translationY
|
|
261
265
|
} = e;
|
|
262
266
|
scrollEndVelocity.value = isHorizontal.value ? velocityX : velocityY;
|
|
263
|
-
|
|
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;
|
|
264
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
|
+
*/
|
|
265
275
|
|
|
266
276
|
if (maxScrollDistancePerSwipeIsSet && Math.abs(totalTranslation) > maxScrollDistancePerSwipe) {
|
|
267
277
|
const nextPage = Math.round((panOffset.value + maxScrollDistancePerSwipe * Math.sign(totalTranslation)) / size) * size;
|
|
268
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);
|
|
269
287
|
} else {
|
|
270
288
|
endWithSpring(onScrollEnd);
|
|
271
289
|
}
|
|
272
290
|
|
|
273
|
-
if (!
|
|
274
|
-
}, [size,
|
|
275
|
-
const gesture = (0,
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
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
|
+
}
|
|
283
301
|
});
|
|
284
302
|
return /*#__PURE__*/_react.default.createElement(_reactNativeGestureHandler.GestureDetector, {
|
|
285
303
|
gesture: gesture
|