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.
Files changed (148) hide show
  1. package/README.md +2 -3
  2. package/lib/commonjs/{layouts → components}/BaseLayout.js +5 -21
  3. package/lib/commonjs/components/BaseLayout.js.map +1 -0
  4. package/lib/commonjs/components/Carousel.js +25 -46
  5. package/lib/commonjs/components/Carousel.js.map +1 -1
  6. package/lib/commonjs/components/ItemRenderer.js +80 -0
  7. package/lib/commonjs/components/ItemRenderer.js.map +1 -0
  8. package/lib/commonjs/components/ScrollViewGesture.js +51 -33
  9. package/lib/commonjs/components/ScrollViewGesture.js.map +1 -1
  10. package/lib/commonjs/components/rnr-demo.test.js +45 -0
  11. package/lib/commonjs/components/rnr-demo.test.js.map +1 -0
  12. package/lib/commonjs/hooks/useCarouselController.js +12 -11
  13. package/lib/commonjs/hooks/useCarouselController.js.map +1 -1
  14. package/lib/commonjs/hooks/useCommonVariables.js +38 -12
  15. package/lib/commonjs/hooks/useCommonVariables.js.map +1 -1
  16. package/lib/commonjs/hooks/useCommonVariables.test.js +38 -0
  17. package/lib/commonjs/hooks/useCommonVariables.test.js.map +1 -0
  18. package/lib/commonjs/hooks/useLayoutConfig.js.map +1 -1
  19. package/lib/commonjs/hooks/useOffsetX.js +9 -6
  20. package/lib/commonjs/hooks/useOffsetX.js.map +1 -1
  21. package/lib/commonjs/hooks/useOffsetX.test.js +53 -0
  22. package/lib/commonjs/hooks/useOffsetX.test.js.map +1 -0
  23. package/lib/commonjs/hooks/usePanGestureProxy.js +84 -0
  24. package/lib/commonjs/hooks/usePanGestureProxy.js.map +1 -0
  25. package/lib/commonjs/hooks/usePanGestureProxy.test.js +397 -0
  26. package/lib/commonjs/hooks/usePanGestureProxy.test.js.map +1 -0
  27. package/lib/commonjs/hooks/useUpdateGestureConfig.js.map +1 -1
  28. package/lib/commonjs/hooks/useVisibleRanges.js +48 -19
  29. package/lib/commonjs/hooks/useVisibleRanges.js.map +1 -1
  30. package/lib/commonjs/hooks/useVisibleRanges.test.js +162 -0
  31. package/lib/commonjs/hooks/useVisibleRanges.test.js.map +1 -0
  32. package/lib/commonjs/index.js.map +1 -1
  33. package/lib/commonjs/utils/{computeNewIndexWhenDataChanges.js → compute-offset-if-data-changed.js} +3 -3
  34. package/lib/commonjs/utils/compute-offset-if-data-changed.js.map +1 -0
  35. package/lib/commonjs/utils/compute-offset-if-data-changed.test.js +30 -0
  36. package/lib/commonjs/utils/compute-offset-if-data-changed.test.js.map +1 -0
  37. package/lib/commonjs/utils/compute-offset-if-size-changed.js +18 -0
  38. package/lib/commonjs/utils/compute-offset-if-size-changed.js.map +1 -0
  39. package/lib/commonjs/utils/compute-offset-if-size-changed.test.js +72 -0
  40. package/lib/commonjs/utils/compute-offset-if-size-changed.test.js.map +1 -0
  41. package/lib/commonjs/utils/handleroffset-direction.js +5 -5
  42. package/lib/commonjs/utils/handleroffset-direction.js.map +1 -1
  43. package/lib/commonjs/utils/handleroffset-direction.test.js +46 -0
  44. package/lib/commonjs/utils/handleroffset-direction.test.js.map +1 -0
  45. package/lib/commonjs/utils/index.test.js +6 -6
  46. package/lib/commonjs/utils/index.test.js.map +1 -1
  47. package/lib/module/{layouts → components}/BaseLayout.js +6 -16
  48. package/lib/module/components/BaseLayout.js.map +1 -0
  49. package/lib/module/components/Carousel.js +24 -42
  50. package/lib/module/components/Carousel.js.map +1 -1
  51. package/lib/module/components/ItemRenderer.js +62 -0
  52. package/lib/module/components/ItemRenderer.js.map +1 -0
  53. package/lib/module/components/ScrollViewGesture.js +53 -34
  54. package/lib/module/components/ScrollViewGesture.js.map +1 -1
  55. package/lib/module/components/rnr-demo.test.js +33 -0
  56. package/lib/module/components/rnr-demo.test.js.map +1 -0
  57. package/lib/module/hooks/useCarouselController.js +12 -11
  58. package/lib/module/hooks/useCarouselController.js.map +1 -1
  59. package/lib/module/hooks/useCommonVariables.js +38 -8
  60. package/lib/module/hooks/useCommonVariables.js.map +1 -1
  61. package/lib/module/hooks/useCommonVariables.test.js +34 -0
  62. package/lib/module/hooks/useCommonVariables.test.js.map +1 -0
  63. package/lib/module/hooks/useLayoutConfig.js.map +1 -1
  64. package/lib/module/hooks/useOffsetX.js +9 -6
  65. package/lib/module/hooks/useOffsetX.js.map +1 -1
  66. package/lib/module/hooks/useOffsetX.test.js +48 -0
  67. package/lib/module/hooks/useOffsetX.test.js.map +1 -0
  68. package/lib/module/hooks/usePanGestureProxy.js +71 -0
  69. package/lib/module/hooks/usePanGestureProxy.js.map +1 -0
  70. package/lib/module/hooks/usePanGestureProxy.test.js +383 -0
  71. package/lib/module/hooks/usePanGestureProxy.test.js.map +1 -0
  72. package/lib/module/hooks/useUpdateGestureConfig.js.map +1 -1
  73. package/lib/module/hooks/useVisibleRanges.js +47 -19
  74. package/lib/module/hooks/useVisibleRanges.js.map +1 -1
  75. package/lib/module/hooks/useVisibleRanges.test.js +157 -0
  76. package/lib/module/hooks/useVisibleRanges.test.js.map +1 -0
  77. package/lib/module/index.js.map +1 -1
  78. package/lib/module/utils/{computeNewIndexWhenDataChanges.js → compute-offset-if-data-changed.js} +2 -2
  79. package/lib/module/utils/compute-offset-if-data-changed.js.map +1 -0
  80. package/lib/module/utils/compute-offset-if-data-changed.test.js +27 -0
  81. package/lib/module/utils/compute-offset-if-data-changed.test.js.map +1 -0
  82. package/lib/module/utils/compute-offset-if-size-changed.js +11 -0
  83. package/lib/module/utils/compute-offset-if-size-changed.js.map +1 -0
  84. package/lib/module/utils/compute-offset-if-size-changed.test.js +69 -0
  85. package/lib/module/utils/compute-offset-if-size-changed.test.js.map +1 -0
  86. package/lib/module/utils/handleroffset-direction.js +5 -5
  87. package/lib/module/utils/handleroffset-direction.js.map +1 -1
  88. package/lib/module/utils/handleroffset-direction.test.js +41 -0
  89. package/lib/module/utils/handleroffset-direction.test.js.map +1 -0
  90. package/lib/module/utils/index.test.js +6 -6
  91. package/lib/module/utils/index.test.js.map +1 -1
  92. package/lib/typescript/components/ItemRenderer.d.ts +22 -0
  93. package/lib/typescript/components/ScrollViewGesture.d.ts +1 -1
  94. package/lib/typescript/components/rnr-demo.test.d.ts +1 -0
  95. package/lib/typescript/hooks/useCarouselController.d.ts +3 -2
  96. package/lib/typescript/hooks/useCommonVariables.test.d.ts +1 -0
  97. package/lib/typescript/hooks/useLayoutConfig.d.ts +1 -1
  98. package/lib/typescript/hooks/useOffsetX.test.d.ts +1 -0
  99. package/lib/typescript/hooks/usePanGestureProxy.d.ts +9 -0
  100. package/lib/typescript/hooks/usePanGestureProxy.test.d.ts +1 -0
  101. package/lib/typescript/hooks/useUpdateGestureConfig.d.ts +3 -2
  102. package/lib/typescript/hooks/useVisibleRanges.d.ts +8 -4
  103. package/lib/typescript/hooks/useVisibleRanges.test.d.ts +1 -0
  104. package/lib/typescript/index.d.ts +1 -0
  105. package/lib/typescript/types.d.ts +13 -4
  106. package/lib/typescript/utils/{computeNewIndexWhenDataChanges.d.ts → compute-offset-if-data-changed.d.ts} +1 -1
  107. package/lib/typescript/utils/compute-offset-if-data-changed.test.d.ts +1 -0
  108. package/lib/typescript/utils/compute-offset-if-size-changed.d.ts +5 -0
  109. package/lib/typescript/utils/compute-offset-if-size-changed.test.d.ts +1 -0
  110. package/lib/typescript/utils/handleroffset-direction.d.ts +2 -1
  111. package/lib/typescript/utils/handleroffset-direction.test.d.ts +1 -0
  112. package/package.json +16 -59
  113. package/src/{layouts → components}/BaseLayout.tsx +7 -35
  114. package/src/components/Carousel.tsx +24 -58
  115. package/src/components/ItemRenderer.tsx +105 -0
  116. package/src/components/ScrollViewGesture.tsx +74 -49
  117. package/src/components/rnr-demo.test.tsx +43 -0
  118. package/src/hooks/useCarouselController.tsx +24 -21
  119. package/src/hooks/useCommonVariables.test.tsx +41 -0
  120. package/src/hooks/useCommonVariables.ts +35 -10
  121. package/src/hooks/useLayoutConfig.ts +1 -1
  122. package/src/hooks/useOffsetX.test.ts +54 -0
  123. package/src/hooks/useOffsetX.ts +33 -31
  124. package/src/hooks/usePanGestureProxy.test.tsx +376 -0
  125. package/src/hooks/usePanGestureProxy.ts +110 -0
  126. package/src/hooks/useUpdateGestureConfig.ts +4 -2
  127. package/src/hooks/useVisibleRanges.test.tsx +179 -0
  128. package/src/hooks/useVisibleRanges.tsx +72 -24
  129. package/src/index.tsx +2 -0
  130. package/src/types.ts +13 -4
  131. package/src/utils/compute-offset-if-data-changed.test.ts +30 -0
  132. package/src/utils/{computeNewIndexWhenDataChanges.ts → compute-offset-if-data-changed.ts} +1 -1
  133. package/src/utils/compute-offset-if-size-changed.test.ts +78 -0
  134. package/src/utils/compute-offset-if-size-changed.ts +11 -0
  135. package/src/utils/handleroffset-direction.test.ts +52 -0
  136. package/src/utils/handleroffset-direction.ts +12 -9
  137. package/src/utils/index.test.ts +6 -6
  138. package/lib/commonjs/layouts/BaseLayout.js.map +0 -1
  139. package/lib/commonjs/layouts/ParallaxLayout.js +0 -84
  140. package/lib/commonjs/layouts/ParallaxLayout.js.map +0 -1
  141. package/lib/commonjs/utils/computeNewIndexWhenDataChanges.js.map +0 -1
  142. package/lib/module/layouts/BaseLayout.js.map +0 -1
  143. package/lib/module/layouts/ParallaxLayout.js +0 -61
  144. package/lib/module/layouts/ParallaxLayout.js.map +0 -1
  145. package/lib/module/utils/computeNewIndexWhenDataChanges.js.map +0 -1
  146. package/lib/typescript/layouts/ParallaxLayout.d.ts +0 -13
  147. package/src/layouts/ParallaxLayout.tsx +0 -141
  148. /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)(() => animationStyle(x.value / size), [animationStyle]);
82
-
83
- const updateView = _react.default.useCallback((negativeRange, positiveRange) => {
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}_${shouldUpdate ? "READY" : "NOT_READY"}__`
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
- onScrollBegin,
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
- onScrollBegin: () => !!onScrollBegin && (0, _reactNativeReanimated.runOnJS)(onScrollBegin)(),
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 scrollViewGestureOnScrollBegin = _react.default.useCallback(() => {
137
+ const scrollViewGestureOnScrollStart = _react.default.useCallback(() => {
140
138
  pauseAutoPlay();
141
- onScrollBegin === null || onScrollBegin === void 0 ? void 0 : onScrollBegin();
142
- }, [onScrollBegin, pauseAutoPlay]);
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
- onScrollBegin: scrollViewGestureOnScrollBegin,
176
+ onScrollStart: scrollViewGestureOnScrollStart,
211
177
  onScrollEnd: scrollViewGestureOnScrollEnd,
212
178
  onTouchBegin: scrollViewGestureOnTouchBegin,
213
179
  onTouchEnd: scrollViewGestureOnTouchEnd
214
- }, data.map(renderLayout))));
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":";;;;;;;AAAA;;AACA;;AACA;;AACA;;AAEA;;AAEA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAEA;;;;AAEA,MAAMA,QAAQ,gBAAGC,eAAMC,UAAN,CACf,CAACC,MAAD,EAASC,GAAT,KAAiB;AACf,QAAMC,KAAK,GAAG,gCAAaF,MAAb,CAAd;AAEA,QAAM;AACJG,IAAAA,MADI;AAEJC,IAAAA,IAFI;AAGJC,IAAAA,YAHI;AAIJ;AACAC,IAAAA,IALI;AAMJ;AACAC,IAAAA,UAPI;AAQJ;AACAC,IAAAA,OATI;AAUJ;AACAC,IAAAA,aAXI;AAYJC,IAAAA,IAZI;AAaJC,IAAAA,KAbI;AAcJC,IAAAA,KAdI;AAeJC,IAAAA,MAfI;AAgBJC,IAAAA,QAhBI;AAiBJC,IAAAA,QAjBI;AAkBJC,IAAAA,UAlBI;AAmBJC,IAAAA,eAnBI;AAoBJC,IAAAA,gBApBI;AAqBJC,IAAAA,uBArBI;AAsBJC,IAAAA,aAtBI;AAuBJC,IAAAA,UAvBI;AAwBJC,IAAAA,WAxBI;AAyBJC,IAAAA,YAzBI;AA0BJC,IAAAA,aA1BI;AA2BJC,IAAAA,gBA3BI;AA4BJC,IAAAA,eA5BI;AA6BJC,IAAAA;AA7BI,MA8BFzB,KA9BJ;AAgCA,QAAM0B,eAAe,GAAG,4CAAmB1B,KAAnB,CAAxB;AACA,QAAM;AAAE2B,IAAAA,IAAF;AAAQC,IAAAA;AAAR,MAA0BF,eAAhC;AAEA,QAAMG,OAAO,GAAG,4CAAgB,MAAM;AACpC,UAAMC,SAAS,GAAGH,IAAI,GAAGtB,UAAzB;AACA,UAAM0B,CAAC,GAAGH,aAAa,CAACI,KAAd,GAAsBF,SAAhC;AAEA,QAAI,CAAC5B,IAAL,EACE,OAAO0B,aAAa,CAACI,KAArB;AAEF,WAAOC,KAAK,CAACF,CAAD,CAAL,GAAW,CAAX,GAAeA,CAAtB;AACD,GARe,EAQb,CAAC7B,IAAD,EAAOyB,IAAP,EAAatB,UAAb,CARa,CAAhB;AAUA,oDAAsB,EAAE,GAAGL,KAAL;AAAYK,IAAAA;AAAZ,GAAtB;AACA,gDAAoB;AAClBF,IAAAA,YADkB;AAElBD,IAAAA,IAFkB;AAGlByB,IAAAA,IAHkB;AAIlBE,IAAAA,OAJkB;AAKlBtB,IAAAA,aALkB;AAMlBgB,IAAAA;AANkB,GAApB;AASA,QAAMW,kBAAkB,GAAG,kDAAsB;AAC/ChC,IAAAA,IAD+C;AAE/CyB,IAAAA,IAF+C;AAG/CtB,IAAAA,UAH+C;AAI/CF,IAAAA,YAJ+C;AAK/CyB,IAAAA,aAL+C;AAM/CV,IAAAA,aAN+C;AAO/CO,IAAAA,YAP+C;AAQ/CL,IAAAA,WAAW,EAAE,MAAM,oCAAQe,YAAR,GAR4B;AAS/Cb,IAAAA,aAAa,EAAE,MAAM,CAAC,CAACA,aAAF,IAAmB,oCAAQA,aAAR,GATO;AAU/Cc,IAAAA,QAAQ,EAAEnB;AAVqC,GAAtB,CAA3B;AAaA,QAAM;AAAEoB,IAAAA,IAAF;AAAQC,IAAAA,IAAR;AAAcC,IAAAA,QAAd;AAAwBC,IAAAA,cAAxB;AAAwCC,IAAAA;AAAxC,MACIP,kBADV;AAGA,QAAM;AAAEQ,IAAAA,KAAK,EAAEC,aAAT;AAAwBC,IAAAA,KAAK,EAAEC;AAA/B,MAAiD,8BAAY;AACjEhC,IAAAA,QADiE;AAEjEG,IAAAA,gBAFiE;AAGjED,IAAAA,eAHiE;AAIjEmB,IAAAA;AAJiE,GAAZ,CAAvD;;AAOA,QAAMC,YAAY,GAAGvC,eAAMkD,WAAN,CAAkB,MAAM;AAC3C,UAAMC,YAAY,GAAGC,IAAI,CAACC,KAAL,CAAWT,cAAc,EAAzB,CAArB;;AAEA,UAAMU,SAAS,GAAG,iEAAkC;AAClDC,MAAAA,KAAK,EAAEJ,YAD2C;AAElD1C,MAAAA,UAAU,EAAEE,aAFsC;AAGlDL,MAAAA,IAHkD;AAIlDC,MAAAA;AAJkD,KAAlC,CAAlB;AAOA,QAAIkB,YAAJ,EACEA,YAAY,CAAC6B,SAAD,CAAZ;AAEF,QAAI9B,WAAJ,EACEA,WAAW,CAAC8B,SAAD,CAAX;AACH,GAfoB,EAelB,CACDhD,IADC,EAEDC,YAFC,EAGDI,aAHC,EAIDiC,cAJC,EAKDnB,YALC,EAMDD,WANC,CAfkB,CAArB;;AAwBA,QAAMgC,8BAA8B,GAAGxD,eAAMkD,WAAN,CAAkB,MAAM;AAC7DD,IAAAA,aAAa;AACbvB,IAAAA,aAAa,SAAb,IAAAA,aAAa,WAAb,YAAAA,aAAa;AACd,GAHsC,EAGpC,CAACA,aAAD,EAAgBuB,aAAhB,CAHoC,CAAvC;;AAKA,QAAMQ,4BAA4B,GAAGzD,eAAMkD,WAAN,CAAkB,MAAM;AAC3DH,IAAAA,aAAa;;AACbR,IAAAA,YAAY;AACb,GAHoC,EAGlC,CAACA,YAAD,EAAeQ,aAAf,CAHkC,CAArC;;AAKA,QAAMW,6BAA6B,GAAG1D,eAAMkD,WAAN,CAAkBD,aAAlB,EAAiC,CACrEA,aADqE,CAAjC,CAAtC;;AAIA,QAAMU,2BAA2B,GAAG3D,eAAMkD,WAAN,CAAkBH,aAAlB,EAAiC,CACnEA,aADmE,CAAjC,CAApC;;AAIA/C,iBAAM4D,mBAAN,CACEzD,GADF,EAEE,OAAO;AACLsC,IAAAA,IADK;AAELC,IAAAA,IAFK;AAGLG,IAAAA,eAHK;AAILF,IAAAA;AAJK,GAAP,CAFF,EAQE,CAACE,eAAD,EAAkBJ,IAAlB,EAAwBC,IAAxB,EAA8BC,QAA9B,CARF;;AAWA,QAAMkB,aAAa,GAAG,wCAAiB;AACrCC,IAAAA,KAAK,EAAErD,UAD8B;AAErCsD,IAAAA,QAAQ,EAAEhC,IAF2B;AAGrCiC,IAAAA,WAAW,EAAEhC,aAHwB;AAIrCd,IAAAA;AAJqC,GAAjB,CAAtB;AAOA,QAAM+C,YAAY,GAAG,sCAAgB,EAAE,GAAG7D,KAAL;AAAY2B,IAAAA;AAAZ,GAAhB,CAArB;;AAEA,QAAMmC,YAAY,GAAGlE,eAAMkD,WAAN,CACnB,CAACiB,IAAD,EAAYC,CAAZ,KAA0B;AACxB,UAAMd,SAAS,GAAG,iEAAkC;AAClDC,MAAAA,KAAK,EAAEa,CAD2C;AAElD3D,MAAAA,UAAU,EAAEE,aAFsC;AAGlDL,MAAAA,IAHkD;AAIlDC,MAAAA;AAJkD,KAAlC,CAAlB;AAOA,wBACE,6BAAC,sBAAD;AACE,MAAA,GAAG,EAAE6D,CADP;AAEE,MAAA,KAAK,EAAEA,CAFT;AAGE,MAAA,aAAa,EAAEnC,OAHjB;AAIE,MAAA,aAAa,EAAE4B,aAJjB;AAKE,MAAA,cAAc,EAAEjC,eAAe,IAAIqC;AALrC,OAOG;AAAA,UAAC;AAAEI,QAAAA;AAAF,OAAD;AAAA,aACC9C,UAAU,CAAC;AACT4C,QAAAA,IADS;AAETZ,QAAAA,KAAK,EAAED,SAFE;AAGTe,QAAAA;AAHS,OAAD,CADX;AAAA,KAPH,CADF;AAiBD,GA1BkB,EA2BnB,CACE/D,IADF,EAEEI,OAFF,EAGEuB,OAHF,EAIE4B,aAJF,EAKEtD,YALF,EAMEgB,UANF,EAOE0C,YAPF,EAQErC,eARF,CA3BmB,CAArB;;AAuCA,sBACE,6BAAC,iDAAD,qBACE,6BAAC,UAAD,CAAK,QAAL;AAAc,IAAA,KAAK,EAAE;AAAExB,MAAAA,KAAF;AAASkE,MAAAA,MAAM,EAAExC;AAAjB;AAArB,kBACE,6BAAC,oCAAD;AACE,IAAA,GAAG,EAAElB,IADP;AAEE,IAAA,IAAI,EAAEmB,IAFR;AAGE,IAAA,WAAW,EAAEC,aAHf;AAIE,IAAA,KAAK,EAAE,CACLuC,MAAM,CAACC,SADF,EAEL;AACE1D,MAAAA,KAAK,EAAEA,KAAK,IAAI,MADlB;AAEEC,MAAAA,MAAM,EAAEA,MAAM,IAAI;AAFpB,KAFK,EAMLF,KANK,EAOLG,QAAQ,GACJuD,MAAM,CAACE,aADH,GAEJF,MAAM,CAACG,eATN,CAJT;AAeE,IAAA,MAAM,EAAErE,MAfV;AAgBE,IAAA,aAAa,EAAEmD,8BAhBjB;AAiBE,IAAA,WAAW,EAAEC,4BAjBf;AAkBE,IAAA,YAAY,EAAEC,6BAlBhB;AAmBE,IAAA,UAAU,EAAEC;AAnBd,KAqBGnD,IAAI,CAACmE,GAAL,CAAST,YAAT,CArBH,CADF,CADF,CADF;AA6BD,CApNc,CAAjB;;eAuNenE,Q;;;AAIf,MAAMwE,MAAM,GAAGK,wBAAWC,MAAX,CAAkB;AAC/BL,EAAAA,SAAS,EAAE;AACTM,IAAAA,QAAQ,EAAE;AADD,GADoB;AAI/BJ,EAAAA,eAAe,EAAE;AACfK,IAAAA,aAAa,EAAE;AADA,GAJc;AAO/BN,EAAAA,aAAa,EAAE;AACbM,IAAAA,aAAa,EAAE;AADF;AAPgB,CAAlB,CAAf","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 _useUpdateGestureConfig = require("../hooks/useUpdateGestureConfig");
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: infinite,
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
- onScrollBegin,
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"; // Get the limit of the scroll.
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 (!infinite && !overscrollEnabled) {
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
- }, [infinite, size, dataLength, overscrollEnabled]);
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 (infinite) {
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 (!infinite && !overscrollEnabled) {
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, infinite, snapEnabled, translation, pagingEnabled, scrollEndVelocity.value, maxScrollDistancePerSwipe, scrollEndTranslation.value, maxScrollDistancePerSwipeIsSet]);
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 (!infinite) {
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 (!infinite) translation.value = withSpring(-((maxPage - 1) * size));
198
+ if (!loop) translation.value = withSpring(-((maxPage - 1) * size));
196
199
  }
197
- }, [touching.value, translation, maxPage, size, scrollEndTranslation.value, infinite, activeDecay, withSpring]);
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 (!infinite && !overscrollEnabled) {
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 onGestureBegin = (0, _react.useCallback)(() => {
218
+ const onGestureStart = (0, _react.useCallback)(_ => {
216
219
  "worklet";
217
220
 
218
221
  touching.value = true;
219
222
  validStart.value = true;
220
- onScrollBegin && (0, _reactNativeReanimated.runOnJS)(onScrollBegin)();
223
+ onScrollStart && (0, _reactNativeReanimated.runOnJS)(onScrollStart)();
221
224
  max.value = (maxPage - 1) * size;
222
- if (!infinite && !overscrollEnabled) max.value = getLimit();
225
+ if (!loop && !overscrollEnabled) max.value = getLimit();
223
226
  panOffset.value = translation.value;
224
- }, [max, size, maxPage, infinite, touching, panOffset, validStart, translation, overscrollEnabled, getLimit, onScrollBegin]);
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
- const panTranslation = isHorizontal.value ? translationX : translationY;
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 (!infinite) {
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, infinite, overscrollEnabled, translation, validStart, touching]);
253
- const onGestureFinish = (0, _react.useCallback)(e => {
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
- scrollEndTranslation.value = isHorizontal.value ? translationX : translationY;
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 (!infinite) touching.value = false;
274
- }, [size, infinite, touching, panOffset, translation, isHorizontal, scrollEndVelocity, scrollEndTranslation, maxScrollDistancePerSwipeIsSet, maxScrollDistancePerSwipe, endWithSpring, withSpring, onScrollEnd]);
275
- const gesture = (0, _react.useMemo)(() => {
276
- const gesture = _reactNativeGestureHandler.Gesture.Pan().onBegin(onGestureBegin).onUpdate(onGestureUpdate).onEnd(onGestureFinish);
277
-
278
- if (onConfigurePanGesture) onConfigurePanGesture(gesture);
279
- return gesture;
280
- }, [onGestureBegin, onGestureUpdate, onGestureFinish, onConfigurePanGesture]);
281
- (0, _useUpdateGestureConfig.useUpdateGestureConfig)(gesture, {
282
- enabled
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