react-native-reanimated-carousel 4.0.0-alpha.0 → 4.0.0-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) hide show
  1. package/README.md +22 -162
  2. package/lib/commonjs/components/BaseLayout.js +95 -0
  3. package/lib/commonjs/components/BaseLayout.js.map +1 -0
  4. package/lib/commonjs/components/Carousel.js +210 -0
  5. package/lib/commonjs/components/Carousel.js.map +1 -0
  6. package/lib/commonjs/components/ItemRenderer.js +80 -0
  7. package/lib/commonjs/components/ItemRenderer.js.map +1 -0
  8. package/lib/commonjs/components/LazyView.js +22 -0
  9. package/lib/commonjs/components/LazyView.js.map +1 -0
  10. package/lib/commonjs/components/ScrollViewGesture.js +315 -0
  11. package/lib/commonjs/components/ScrollViewGesture.js.map +1 -0
  12. package/lib/commonjs/components/rnr-demo.test.js +45 -0
  13. package/lib/commonjs/components/rnr-demo.test.js.map +1 -0
  14. package/lib/commonjs/constants/index.js +21 -1
  15. package/lib/commonjs/constants/index.js.map +1 -1
  16. package/lib/commonjs/hooks/useAutoPlay.js +56 -1
  17. package/lib/commonjs/hooks/useAutoPlay.js.map +1 -1
  18. package/lib/commonjs/hooks/useCarouselController.js +245 -1
  19. package/lib/commonjs/hooks/useCarouselController.js.map +1 -1
  20. package/lib/commonjs/hooks/useCheckMounted.js +23 -1
  21. package/lib/commonjs/hooks/useCheckMounted.js.map +1 -1
  22. package/lib/commonjs/hooks/useCommonVariables.js +102 -1
  23. package/lib/commonjs/hooks/useCommonVariables.js.map +1 -1
  24. package/lib/commonjs/hooks/useCommonVariables.test.js +38 -0
  25. package/lib/commonjs/hooks/useCommonVariables.test.js.map +1 -0
  26. package/lib/commonjs/hooks/useInitProps.js +78 -1
  27. package/lib/commonjs/hooks/useInitProps.js.map +1 -1
  28. package/lib/commonjs/hooks/useLayoutConfig.js +39 -1
  29. package/lib/commonjs/hooks/useLayoutConfig.js.map +1 -1
  30. package/lib/commonjs/hooks/useOffsetX.js +51 -1
  31. package/lib/commonjs/hooks/useOffsetX.js.map +1 -1
  32. package/lib/commonjs/hooks/useOffsetX.test.js +53 -0
  33. package/lib/commonjs/hooks/useOffsetX.test.js.map +1 -0
  34. package/lib/commonjs/hooks/useOnProgressChange.js +38 -1
  35. package/lib/commonjs/hooks/useOnProgressChange.js.map +1 -1
  36. package/lib/commonjs/hooks/usePanGestureProxy.js +84 -0
  37. package/lib/commonjs/hooks/usePanGestureProxy.js.map +1 -0
  38. package/lib/commonjs/hooks/usePanGestureProxy.test.js +397 -0
  39. package/lib/commonjs/hooks/usePanGestureProxy.test.js.map +1 -0
  40. package/lib/commonjs/hooks/usePropsErrorBoundary.js +36 -1
  41. package/lib/commonjs/hooks/usePropsErrorBoundary.js.map +1 -1
  42. package/lib/commonjs/hooks/useUpdateGestureConfig.js +20 -0
  43. package/lib/commonjs/hooks/useUpdateGestureConfig.js.map +1 -0
  44. package/lib/commonjs/hooks/useVisibleRanges.js +71 -1
  45. package/lib/commonjs/hooks/useVisibleRanges.js.map +1 -1
  46. package/lib/commonjs/hooks/useVisibleRanges.test.js +162 -0
  47. package/lib/commonjs/hooks/useVisibleRanges.test.js.map +1 -0
  48. package/lib/commonjs/index.js +13 -1
  49. package/lib/commonjs/index.js.map +1 -1
  50. package/lib/commonjs/layouts/index.js +20 -1
  51. package/lib/commonjs/layouts/index.js.map +1 -1
  52. package/lib/commonjs/layouts/normal.js +27 -1
  53. package/lib/commonjs/layouts/normal.js.map +1 -1
  54. package/lib/commonjs/layouts/parallax.js +38 -1
  55. package/lib/commonjs/layouts/parallax.js.map +1 -1
  56. package/lib/commonjs/layouts/stack.js +215 -1
  57. package/lib/commonjs/layouts/stack.js.map +1 -1
  58. package/lib/commonjs/store/index.js +14 -1
  59. package/lib/commonjs/store/index.js.map +1 -1
  60. package/lib/commonjs/types.js +5 -1
  61. package/lib/commonjs/utils/compute-offset-if-data-changed.js +52 -0
  62. package/lib/commonjs/utils/compute-offset-if-data-changed.js.map +1 -0
  63. package/lib/commonjs/utils/compute-offset-if-data-changed.test.js +30 -0
  64. package/lib/commonjs/utils/compute-offset-if-data-changed.test.js.map +1 -0
  65. package/lib/commonjs/utils/compute-offset-if-size-changed.js +18 -0
  66. package/lib/commonjs/utils/compute-offset-if-size-changed.js.map +1 -0
  67. package/lib/commonjs/utils/compute-offset-if-size-changed.test.js +72 -0
  68. package/lib/commonjs/utils/compute-offset-if-size-changed.test.js.map +1 -0
  69. package/lib/commonjs/utils/computed-with-auto-fill-data.js +124 -0
  70. package/lib/commonjs/utils/computed-with-auto-fill-data.js.map +1 -0
  71. package/lib/commonjs/utils/deal-with-animation.js +21 -0
  72. package/lib/commonjs/utils/deal-with-animation.js.map +1 -0
  73. package/lib/commonjs/utils/handleroffset-direction.js +16 -0
  74. package/lib/commonjs/utils/handleroffset-direction.js.map +1 -0
  75. package/lib/commonjs/utils/handleroffset-direction.test.js +46 -0
  76. package/lib/commonjs/utils/handleroffset-direction.test.js.map +1 -0
  77. package/lib/commonjs/utils/index.test.js +74 -0
  78. package/lib/commonjs/utils/index.test.js.map +1 -0
  79. package/lib/commonjs/utils/log.js +22 -1
  80. package/lib/commonjs/utils/log.js.map +1 -1
  81. package/lib/module/{layouts → components}/BaseLayout.js +6 -16
  82. package/lib/module/components/BaseLayout.js.map +1 -0
  83. package/lib/module/{Carousel.js → components/Carousel.js} +33 -52
  84. package/lib/module/components/Carousel.js.map +1 -0
  85. package/lib/module/components/ItemRenderer.js +62 -0
  86. package/lib/module/components/ItemRenderer.js.map +1 -0
  87. package/lib/module/{ScrollViewGesture.js → components/ScrollViewGesture.js} +59 -32
  88. package/lib/module/components/ScrollViewGesture.js.map +1 -0
  89. package/lib/module/components/rnr-demo.test.js +33 -0
  90. package/lib/module/components/rnr-demo.test.js.map +1 -0
  91. package/lib/module/hooks/useCarouselController.js +15 -14
  92. package/lib/module/hooks/useCarouselController.js.map +1 -1
  93. package/lib/module/hooks/useCommonVariables.js +39 -9
  94. package/lib/module/hooks/useCommonVariables.js.map +1 -1
  95. package/lib/module/hooks/useCommonVariables.test.js +34 -0
  96. package/lib/module/hooks/useCommonVariables.test.js.map +1 -0
  97. package/lib/module/hooks/useInitProps.js +1 -3
  98. package/lib/module/hooks/useInitProps.js.map +1 -1
  99. package/lib/module/hooks/useLayoutConfig.js.map +1 -1
  100. package/lib/module/hooks/useOffsetX.js +9 -6
  101. package/lib/module/hooks/useOffsetX.js.map +1 -1
  102. package/lib/module/hooks/useOffsetX.test.js +48 -0
  103. package/lib/module/hooks/useOffsetX.test.js.map +1 -0
  104. package/lib/module/hooks/useOnProgressChange.js +1 -1
  105. package/lib/module/hooks/useOnProgressChange.js.map +1 -1
  106. package/lib/module/hooks/usePanGestureProxy.js +71 -0
  107. package/lib/module/hooks/usePanGestureProxy.js.map +1 -0
  108. package/lib/module/hooks/usePanGestureProxy.test.js +383 -0
  109. package/lib/module/hooks/usePanGestureProxy.test.js.map +1 -0
  110. package/lib/module/hooks/useUpdateGestureConfig.js +10 -0
  111. package/lib/module/hooks/useUpdateGestureConfig.js.map +1 -0
  112. package/lib/module/hooks/useVisibleRanges.js +47 -19
  113. package/lib/module/hooks/useVisibleRanges.js.map +1 -1
  114. package/lib/module/hooks/useVisibleRanges.test.js +157 -0
  115. package/lib/module/hooks/useVisibleRanges.test.js.map +1 -0
  116. package/lib/module/index.js +1 -2
  117. package/lib/module/index.js.map +1 -1
  118. package/lib/module/{hooks/computeNewIndexWhenDataChanges.js → utils/compute-offset-if-data-changed.js} +2 -2
  119. package/lib/module/utils/compute-offset-if-data-changed.js.map +1 -0
  120. package/lib/module/utils/compute-offset-if-data-changed.test.js +27 -0
  121. package/lib/module/utils/compute-offset-if-data-changed.test.js.map +1 -0
  122. package/lib/module/utils/compute-offset-if-size-changed.js +11 -0
  123. package/lib/module/utils/compute-offset-if-size-changed.js.map +1 -0
  124. package/lib/module/utils/compute-offset-if-size-changed.test.js +69 -0
  125. package/lib/module/utils/compute-offset-if-size-changed.test.js.map +1 -0
  126. package/lib/module/utils/{computedWithAutoFillData.js → computed-with-auto-fill-data.js} +1 -1
  127. package/lib/module/utils/computed-with-auto-fill-data.js.map +1 -0
  128. package/lib/module/utils/{dealWithAnimation.js → deal-with-animation.js} +1 -1
  129. package/lib/module/utils/deal-with-animation.js.map +1 -0
  130. package/lib/module/utils/handleroffset-direction.js +9 -0
  131. package/lib/module/utils/handleroffset-direction.js.map +1 -0
  132. package/lib/module/utils/handleroffset-direction.test.js +41 -0
  133. package/lib/module/utils/handleroffset-direction.test.js.map +1 -0
  134. package/lib/module/{hooks → utils}/index.test.js +6 -6
  135. package/lib/module/utils/index.test.js.map +1 -0
  136. package/lib/typescript/{Carousel.d.ts → components/Carousel.d.ts} +1 -1
  137. package/lib/typescript/components/ItemRenderer.d.ts +22 -0
  138. package/lib/typescript/{ScrollViewGesture.d.ts → components/ScrollViewGesture.d.ts} +1 -1
  139. package/lib/typescript/hooks/useCarouselController.d.ts +3 -2
  140. package/lib/typescript/hooks/useCommonVariables.test.d.ts +1 -0
  141. package/lib/typescript/hooks/useLayoutConfig.d.ts +1 -1
  142. package/lib/typescript/hooks/useOffsetX.test.d.ts +1 -0
  143. package/lib/typescript/hooks/usePanGestureProxy.d.ts +9 -0
  144. package/lib/typescript/hooks/usePanGestureProxy.test.d.ts +1 -0
  145. package/lib/typescript/hooks/useUpdateGestureConfig.d.ts +5 -0
  146. package/lib/typescript/hooks/useVisibleRanges.d.ts +8 -4
  147. package/lib/typescript/hooks/useVisibleRanges.test.d.ts +1 -0
  148. package/lib/typescript/index.d.ts +3 -2
  149. package/lib/typescript/types.d.ts +113 -104
  150. package/lib/typescript/{hooks/computeNewIndexWhenDataChanges.d.ts → utils/compute-offset-if-data-changed.d.ts} +1 -1
  151. package/lib/typescript/utils/compute-offset-if-data-changed.test.d.ts +1 -0
  152. package/lib/typescript/utils/compute-offset-if-size-changed.d.ts +5 -0
  153. package/lib/typescript/utils/compute-offset-if-size-changed.test.d.ts +1 -0
  154. package/lib/typescript/utils/handleroffset-direction.d.ts +3 -0
  155. package/lib/typescript/utils/handleroffset-direction.test.d.ts +1 -0
  156. package/lib/typescript/utils/index.test.d.ts +1 -0
  157. package/package.json +32 -73
  158. package/src/{layouts → components}/BaseLayout.tsx +7 -35
  159. package/src/{Carousel.tsx → components/Carousel.tsx} +35 -69
  160. package/src/components/ItemRenderer.tsx +105 -0
  161. package/src/{ScrollViewGesture.tsx → components/ScrollViewGesture.tsx} +88 -48
  162. package/src/components/rnr-demo.test.tsx +43 -0
  163. package/src/hooks/useCarouselController.tsx +27 -24
  164. package/src/hooks/useCommonVariables.test.tsx +41 -0
  165. package/src/hooks/useCommonVariables.ts +36 -11
  166. package/src/hooks/useInitProps.ts +1 -3
  167. package/src/hooks/useLayoutConfig.ts +1 -1
  168. package/src/hooks/useOffsetX.test.ts +54 -0
  169. package/src/hooks/useOffsetX.ts +33 -31
  170. package/src/hooks/useOnProgressChange.ts +1 -1
  171. package/src/hooks/usePanGestureProxy.test.tsx +376 -0
  172. package/src/hooks/usePanGestureProxy.ts +110 -0
  173. package/src/hooks/useUpdateGestureConfig.ts +15 -0
  174. package/src/hooks/useVisibleRanges.test.tsx +179 -0
  175. package/src/hooks/useVisibleRanges.tsx +72 -24
  176. package/src/index.tsx +4 -2
  177. package/src/types.ts +132 -125
  178. package/src/utils/compute-offset-if-data-changed.test.ts +30 -0
  179. package/src/{hooks/computeNewIndexWhenDataChanges.ts → utils/compute-offset-if-data-changed.ts} +1 -1
  180. package/src/utils/compute-offset-if-size-changed.test.ts +78 -0
  181. package/src/utils/compute-offset-if-size-changed.ts +11 -0
  182. package/src/utils/handleroffset-direction.test.ts +52 -0
  183. package/src/utils/handleroffset-direction.ts +18 -0
  184. package/src/{hooks → utils}/index.test.ts +6 -6
  185. package/README.zh-CN.md +0 -202
  186. package/lib/commonjs/Carousel.js +0 -2
  187. package/lib/commonjs/Carousel.js.map +0 -1
  188. package/lib/commonjs/LazyView.js +0 -2
  189. package/lib/commonjs/LazyView.js.map +0 -1
  190. package/lib/commonjs/ScrollViewGesture.js +0 -2
  191. package/lib/commonjs/ScrollViewGesture.js.map +0 -1
  192. package/lib/commonjs/hooks/computeNewIndexWhenDataChanges.js +0 -2
  193. package/lib/commonjs/hooks/computeNewIndexWhenDataChanges.js.map +0 -1
  194. package/lib/commonjs/hooks/index.test.js +0 -2
  195. package/lib/commonjs/hooks/index.test.js.map +0 -1
  196. package/lib/commonjs/layouts/BaseLayout.js +0 -2
  197. package/lib/commonjs/layouts/BaseLayout.js.map +0 -1
  198. package/lib/commonjs/layouts/ParallaxLayout.js +0 -2
  199. package/lib/commonjs/layouts/ParallaxLayout.js.map +0 -1
  200. package/lib/commonjs/utils/computedWithAutoFillData.js +0 -2
  201. package/lib/commonjs/utils/computedWithAutoFillData.js.map +0 -1
  202. package/lib/commonjs/utils/dealWithAnimation.js +0 -2
  203. package/lib/commonjs/utils/dealWithAnimation.js.map +0 -1
  204. package/lib/commonjs/utils/handlerOffsetDirection.js +0 -2
  205. package/lib/commonjs/utils/handlerOffsetDirection.js.map +0 -1
  206. package/lib/module/Carousel.js.map +0 -1
  207. package/lib/module/ScrollViewGesture.js.map +0 -1
  208. package/lib/module/hooks/computeNewIndexWhenDataChanges.js.map +0 -1
  209. package/lib/module/hooks/index.test.js.map +0 -1
  210. package/lib/module/layouts/BaseLayout.js.map +0 -1
  211. package/lib/module/layouts/ParallaxLayout.js +0 -61
  212. package/lib/module/layouts/ParallaxLayout.js.map +0 -1
  213. package/lib/module/utils/computedWithAutoFillData.js.map +0 -1
  214. package/lib/module/utils/dealWithAnimation.js.map +0 -1
  215. package/lib/module/utils/handlerOffsetDirection.js +0 -9
  216. package/lib/module/utils/handlerOffsetDirection.js.map +0 -1
  217. package/lib/typescript/layouts/ParallaxLayout.d.ts +0 -13
  218. package/lib/typescript/utils/handlerOffsetDirection.d.ts +0 -2
  219. package/src/layouts/ParallaxLayout.tsx +0 -141
  220. package/src/utils/handlerOffsetDirection.ts +0 -15
  221. /package/lib/module/{LazyView.js → components/LazyView.js} +0 -0
  222. /package/lib/module/{LazyView.js.map → components/LazyView.js.map} +0 -0
  223. /package/lib/typescript/{layouts → components}/BaseLayout.d.ts +0 -0
  224. /package/lib/typescript/{LazyView.d.ts → components/LazyView.d.ts} +0 -0
  225. /package/lib/typescript/{hooks/index.test.d.ts → components/rnr-demo.test.d.ts} +0 -0
  226. /package/lib/typescript/utils/{computedWithAutoFillData.d.ts → computed-with-auto-fill-data.d.ts} +0 -0
  227. /package/lib/typescript/utils/{dealWithAnimation.d.ts → deal-with-animation.d.ts} +0 -0
  228. /package/src/{LazyView.tsx → components/LazyView.tsx} +0 -0
  229. /package/src/utils/{computedWithAutoFillData.ts → computed-with-auto-fill-data.ts} +0 -0
  230. /package/src/utils/{dealWithAnimation.ts → deal-with-animation.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["index.test.ts"],"names":["describe","size","positive","negative","params","currentIndex","direction","_direction","previousLength","currentLength","handlerOffset","it","expect","toBe"],"mappings":"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","sourcesContent":["import { computeOffsetIfDataChanged } from \"./compute-offset-if-data-changed\";\n\ndescribe(\"should work as expected\", () => {\n const size = 375;\n const positive = -1;\n const negative = 1;\n\n const params = (params: {\n direction: \"positive\" | \"negative\"\n currentIndex: number\n previousLength: number\n currentLength: number\n }) => {\n const { currentIndex, direction: _direction, previousLength, currentLength } = params;\n const direction = _direction === \"negative\" ? negative : positive;\n return {\n direction,\n handlerOffset: size * currentIndex * direction,\n size,\n previousLength,\n currentLength,\n };\n };\n\n it(\"The direction is negative, And changing length of data set from 4 to 3, the new index will to be 2.\", async () => {\n const currentIndex = 1;\n const handlerOffset = computeOffsetIfDataChanged(params({\n currentIndex,\n direction: \"negative\",\n previousLength: 4,\n currentLength: 3,\n }));\n\n expect(handlerOffset / size).toBe(2 * positive);\n });\n\n it(\"The direction is negative, Changing length of data set from 4 to 3, the index remains original.\", async () => {\n const handlerOffset = computeOffsetIfDataChanged(params({\n currentIndex: 2,\n direction: \"negative\",\n previousLength: 4,\n currentLength: 3,\n }));\n\n expect(handlerOffset / size).toBe(1 * negative);\n });\n\n it(\"The direction is positive, Changing length of data set from 4 to 5, the index remains original.\", async () => {\n const handlerOffset = computeOffsetIfDataChanged(params({\n currentIndex: 3,\n direction: \"positive\",\n previousLength: 4,\n currentLength: 5,\n }));\n\n expect(handlerOffset / size).toBe(3 * positive);\n });\n\n it(\"The direction is negative, Changing length of data set from 4 to 5, the index remains original.\", async () => {\n const handlerOffset = computeOffsetIfDataChanged(params({\n currentIndex: 3,\n direction: \"negative\",\n previousLength: 4,\n currentLength: 5,\n }));\n\n expect(handlerOffset / size).toBe(4 * negative);\n });\n\n it(\"Changing length of data set from 0 to 3, the index remains original.\", async () => {\n const handlerOffset = computeOffsetIfDataChanged(params({\n currentIndex: 0,\n direction: \"positive\",\n previousLength: 0,\n currentLength: 3,\n }));\n\n expect(handlerOffset / size).toBe(0 * positive);\n });\n});\n"]}
@@ -1,2 +1,23 @@
1
- Object.defineProperty(exports,"__esModule",{value:true});exports.log=log;exports.round=void 0;function log(){var _console;(_console=console).log.apply(_console,arguments);}var _worklet_13546670812588_init_data={code:"function round(number) {\n return Math.round(number);\n}",location:"/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/utils/log.ts",sourceMap:"{\"version\":3,\"names\":[\"round\",\"number\",\"Math\"],\"sources\":[\"/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/utils/log.ts\"],\"mappings\":\"AASO,SAAAA,KAASA,CAAMC,MAAA,EAAc;EAElC,OAAOC,IAAI,CAACF,KAAK,CAACC,MAAM,CAAC;AAC3B\"}"};var round=function(){var _e=[new global.Error(),1,-27];var _f=function _f(number){return Math.round(number);};_f._closure={};_f.__initData=_worklet_13546670812588_init_data;_f.__workletHash=13546670812588;_f.__stackDetails=_e;_f.__version="3.3.0";return _f;}();exports.round=round;
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.log = log;
7
+ exports.round = round;
8
+
9
+ /**
10
+ * In worklet
11
+ * e.g. runOnJS(lop)(...);
12
+ */
13
+ function log() {
14
+ // eslint-disable-next-line no-console
15
+ console.log(...arguments);
16
+ }
17
+
18
+ function round(number) {
19
+ "worklet";
20
+
21
+ return Math.round(number);
22
+ }
2
23
  //# sourceMappingURL=log.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["log.ts"],"names":["log","console","round","number","Math"],"mappings":"8FAIO,QAASA,CAAAA,GAAT,EAA0B,cAE/B,UAAAC,OAAO,EAACD,GAAR,2BACD,C,6fAEeE,CAAAA,K,iEAAMC,M,CAAgB,CAEpC,MAAOC,CAAAA,IAAI,CAACF,KAAL,CAAWC,MAAX,CAAP,CACD,C","sourcesContent":["/**\n * In worklet\n * e.g. runOnJS(lop)(...);\n */\nexport function log(...msg: any) {\n // eslint-disable-next-line no-console\n console.log(...msg);\n}\n\nexport function round(number: number) {\n \"worklet\";\n return Math.round(number);\n}\n"]}
1
+ {"version":3,"sources":["log.ts"],"names":["log","console","round","number","Math"],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AACO,SAASA,GAAT,GAA0B;AAC/B;AACAC,EAAAA,OAAO,CAACD,GAAR,CAAY,YAAZ;AACD;;AAEM,SAASE,KAAT,CAAeC,MAAf,EAA+B;AACpC;;AACA,SAAOC,IAAI,CAACF,KAAL,CAAWC,MAAX,CAAP;AACD","sourcesContent":["/**\n * In worklet\n * e.g. runOnJS(lop)(...);\n */\nexport function log(...msg: any) {\n // eslint-disable-next-line no-console\n console.log(...msg);\n}\n\nexport function round(number: number) {\n \"worklet\";\n return Math.round(number);\n}\n"]}
@@ -1,11 +1,8 @@
1
1
  import React from "react";
2
- import Animated, { runOnJS, useAnimatedReaction, useAnimatedStyle, useDerivedValue } from "react-native-reanimated";
3
- import { useCheckMounted } from "../hooks/useCheckMounted";
2
+ import Animated, { useAnimatedStyle, useDerivedValue } from "react-native-reanimated";
4
3
  import { useOffsetX } from "../hooks/useOffsetX";
5
- import { LazyView } from "../LazyView";
6
4
  import { CTX } from "../store";
7
5
  export const BaseLayout = props => {
8
- const mounted = useCheckMounted();
9
6
  const {
10
7
  handlerOffset,
11
8
  index,
@@ -27,7 +24,6 @@ export const BaseLayout = props => {
27
24
  }
28
25
  } = context;
29
26
  const size = vertical ? height : width;
30
- const [shouldUpdate, setShouldUpdate] = React.useState(false);
31
27
  let offsetXConfig = {
32
28
  handlerOffset,
33
29
  index,
@@ -55,13 +51,9 @@ export const BaseLayout = props => {
55
51
 
56
52
  const x = useOffsetX(offsetXConfig, visibleRanges);
57
53
  const animationValue = useDerivedValue(() => x.value / size, [x, size]);
58
- const animatedStyle = useAnimatedStyle(() => animationStyle(x.value / size), [animationStyle]);
59
- const updateView = React.useCallback((negativeRange, positiveRange) => {
60
- mounted.current && setShouldUpdate(index >= negativeRange[0] && index <= negativeRange[1] || index >= positiveRange[0] && index <= positiveRange[1]);
61
- }, [index, mounted]);
62
- useAnimatedReaction(() => visibleRanges.value, () => {
63
- runOnJS(updateView)(visibleRanges.value.negativeRange, visibleRanges.value.positiveRange);
64
- }, [visibleRanges.value]);
54
+ const animatedStyle = useAnimatedStyle(() => {
55
+ return animationStyle(x.value / size);
56
+ }, [animationStyle]);
65
57
  return /*#__PURE__*/React.createElement(Animated.View, {
66
58
  style: [{
67
59
  width: width || "100%",
@@ -74,11 +66,9 @@ export const BaseLayout = props => {
74
66
  * The testID of first item will be changed to __CAROUSEL_ITEM_0_READY__ from __CAROUSEL_ITEM_0_NOT_READY__ when the item is ready.
75
67
  * */
76
68
  ,
77
- testID: `__CAROUSEL_ITEM_${index}_${shouldUpdate ? "READY" : "NOT_READY"}__`
78
- }, /*#__PURE__*/React.createElement(LazyView, {
79
- shouldUpdate: shouldUpdate
69
+ testID: `__CAROUSEL_ITEM_${index}__`
80
70
  }, children({
81
71
  animationValue
82
- })));
72
+ }));
83
73
  };
84
74
  //# sourceMappingURL=BaseLayout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["BaseLayout.tsx"],"names":["React","Animated","useAnimatedStyle","useDerivedValue","useOffsetX","CTX","BaseLayout","props","handlerOffset","index","children","visibleRanges","animationStyle","context","useContext","loop","dataLength","width","height","vertical","customConfig","mode","modeConfig","size","offsetXConfig","snapDirection","showLength","type","viewCount","x","animationValue","value","animatedStyle","position"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AAGA,OAAOC,QAAP,IACEC,gBADF,EAEEC,eAFF,QAGO,yBAHP;AAMA,SAASC,UAAT,QAA2B,qBAA3B;AAGA,SAASC,GAAT,QAAoB,UAApB;AAIA,OAAO,MAAMC,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,GAAGb,KAAK,CAACc,UAAN,CAAiBT,GAAjB,CAAhB;AACA,QAAM;AACJE,IAAAA,KAAK,EAAE;AACLQ,MAAAA,IADK;AAELC,MAAAA,UAFK;AAGLC,MAAAA,KAHK;AAILC,MAAAA,MAJK;AAKLC,MAAAA,QALK;AAMLC,MAAAA,YANK;AAOLC,MAAAA,IAPK;AAQLC,MAAAA;AARK;AADH,MAWFT,OAXJ;AAYA,QAAMU,IAAI,GAAGJ,QAAQ,GAAGD,MAAH,GAAYD,KAAjC;AAEA,MAAIO,aAAoB,GAAG;AACzBhB,IAAAA,aADyB;AAEzBC,IAAAA,KAFyB;AAGzBc,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;AACdhB,MAAAA,aADc;AAEdC,MAAAA,KAFc;AAGdc,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,GAAGzB,UAAU,CAACoB,aAAD,EAAgBb,aAAhB,CAApB;AACA,QAAMmB,cAAc,GAAG3B,eAAe,CAAC,MAAM0B,CAAC,CAACE,KAAF,GAAUR,IAAjB,EAAuB,CAACM,CAAD,EAAIN,IAAJ,CAAvB,CAAtC;AACA,QAAMS,aAAa,GAAG9B,gBAAgB,CACpC,MAAM;AACJ,WAAOU,cAAc,CAACiB,CAAC,CAACE,KAAF,GAAUR,IAAX,CAArB;AACD,GAHmC,EAIpC,CAACX,cAAD,CAJoC,CAAtC;AAOA,sBACE,oBAAC,QAAD,CAAU,IAAV;AACE,IAAA,KAAK,EAAE,CACL;AACEK,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,mBAAkBvB,KAAM;AAdnC,KAgBGC,QAAQ,CAAC;AAAEoB,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"]}
@@ -1,20 +1,18 @@
1
- /* eslint-disable @typescript-eslint/no-use-before-define */
2
1
  import React from "react";
3
2
  import { StyleSheet } from "react-native";
4
3
  import { GestureHandlerRootView } from "react-native-gesture-handler";
5
4
  import { runOnJS, useDerivedValue } from "react-native-reanimated";
6
- import { useAutoPlay } from "./hooks/useAutoPlay";
7
- import { useCarouselController } from "./hooks/useCarouselController";
8
- import { useCommonVariables } from "./hooks/useCommonVariables";
9
- import { useInitProps } from "./hooks/useInitProps";
10
- import { useLayoutConfig } from "./hooks/useLayoutConfig";
11
- import { useOnProgressChange } from "./hooks/useOnProgressChange";
12
- import { usePropsErrorBoundary } from "./hooks/usePropsErrorBoundary";
13
- import { useVisibleRanges } from "./hooks/useVisibleRanges";
14
- import { BaseLayout } from "./layouts/BaseLayout";
5
+ import { ItemRenderer } from "./ItemRenderer";
15
6
  import { ScrollViewGesture } from "./ScrollViewGesture";
16
- import { CTX } from "./store";
17
- import { computedRealIndexWithAutoFillData } from "./utils/computedWithAutoFillData";
7
+ import { useAutoPlay } from "../hooks/useAutoPlay";
8
+ import { useCarouselController } from "../hooks/useCarouselController";
9
+ import { useCommonVariables } from "../hooks/useCommonVariables";
10
+ import { useInitProps } from "../hooks/useInitProps";
11
+ import { useLayoutConfig } from "../hooks/useLayoutConfig";
12
+ import { useOnProgressChange } from "../hooks/useOnProgressChange";
13
+ import { usePropsErrorBoundary } from "../hooks/usePropsErrorBoundary";
14
+ import { CTX } from "../store";
15
+ import { computedRealIndexWithAutoFillData } from "../utils/computed-with-auto-fill-data";
18
16
  const Carousel = /*#__PURE__*/React.forwardRef((_props, ref) => {
19
17
  const props = useInitProps(_props);
20
18
  const {
@@ -25,8 +23,6 @@ const Carousel = /*#__PURE__*/React.forwardRef((_props, ref) => {
25
23
  data,
26
24
  // Length of fill data
27
25
  dataLength,
28
- // Raw data that has not been processed
29
- rawData,
30
26
  // Length of raw data
31
27
  rawDataLength,
32
28
  mode,
@@ -40,10 +36,11 @@ const Carousel = /*#__PURE__*/React.forwardRef((_props, ref) => {
40
36
  autoPlayInterval,
41
37
  scrollAnimationDuration,
42
38
  withAnimation,
39
+ fixedDirection,
43
40
  renderItem,
44
41
  onScrollEnd,
45
42
  onSnapToItem,
46
- onScrollBegin,
43
+ onScrollStart,
47
44
  onProgressChange,
48
45
  customAnimation,
49
46
  defaultIndex
@@ -78,9 +75,10 @@ const Carousel = /*#__PURE__*/React.forwardRef((_props, ref) => {
78
75
  handlerOffset,
79
76
  withAnimation,
80
77
  defaultIndex,
78
+ fixedDirection,
79
+ duration: scrollAnimationDuration,
81
80
  onScrollEnd: () => runOnJS(_onScrollEnd)(),
82
- onScrollBegin: () => !!onScrollBegin && runOnJS(onScrollBegin)(),
83
- duration: scrollAnimationDuration
81
+ onScrollStart: () => !!onScrollStart && runOnJS(onScrollStart)()
84
82
  });
85
83
  const {
86
84
  next,
@@ -112,10 +110,10 @@ const Carousel = /*#__PURE__*/React.forwardRef((_props, ref) => {
112
110
  if (onScrollEnd) onScrollEnd(realIndex);
113
111
  }, [loop, autoFillData, rawDataLength, getSharedIndex, onSnapToItem, onScrollEnd]);
114
112
 
115
- const scrollViewGestureOnScrollBegin = React.useCallback(() => {
113
+ const scrollViewGestureOnScrollStart = React.useCallback(() => {
116
114
  pauseAutoPlay();
117
- onScrollBegin === null || onScrollBegin === void 0 ? void 0 : onScrollBegin();
118
- }, [onScrollBegin, pauseAutoPlay]);
115
+ onScrollStart === null || onScrollStart === void 0 ? void 0 : onScrollStart();
116
+ }, [onScrollStart, pauseAutoPlay]);
119
117
  const scrollViewGestureOnScrollEnd = React.useCallback(() => {
120
118
  startAutoPlay();
121
119
 
@@ -129,39 +127,9 @@ const Carousel = /*#__PURE__*/React.forwardRef((_props, ref) => {
129
127
  getCurrentIndex,
130
128
  scrollTo
131
129
  }), [getCurrentIndex, next, prev, scrollTo]);
132
- const visibleRanges = useVisibleRanges({
133
- total: dataLength,
134
- viewSize: size,
135
- translation: handlerOffset,
136
- windowSize
137
- });
138
130
  const layoutConfig = useLayoutConfig({ ...props,
139
131
  size
140
132
  });
141
- const renderLayout = React.useCallback((item, i) => {
142
- const realIndex = computedRealIndexWithAutoFillData({
143
- index: i,
144
- dataLength: rawDataLength,
145
- loop,
146
- autoFillData
147
- });
148
- return /*#__PURE__*/React.createElement(BaseLayout, {
149
- key: i,
150
- index: i,
151
- handlerOffset: offsetX,
152
- visibleRanges: visibleRanges,
153
- animationStyle: customAnimation || layoutConfig
154
- }, _ref => {
155
- let {
156
- animationValue
157
- } = _ref;
158
- return renderItem({
159
- item,
160
- index: realIndex,
161
- animationValue
162
- });
163
- });
164
- }, [loop, rawData, offsetX, visibleRanges, autoFillData, renderItem, layoutConfig, customAnimation]);
165
133
  return /*#__PURE__*/React.createElement(GestureHandlerRootView, null, /*#__PURE__*/React.createElement(CTX.Provider, {
166
134
  value: {
167
135
  props,
@@ -176,11 +144,24 @@ const Carousel = /*#__PURE__*/React.forwardRef((_props, ref) => {
176
144
  height: height || "100%"
177
145
  }, style, vertical ? styles.itemsVertical : styles.itemsHorizontal],
178
146
  testID: testID,
179
- onScrollBegin: scrollViewGestureOnScrollBegin,
147
+ onScrollStart: scrollViewGestureOnScrollStart,
180
148
  onScrollEnd: scrollViewGestureOnScrollEnd,
181
149
  onTouchBegin: scrollViewGestureOnTouchBegin,
182
150
  onTouchEnd: scrollViewGestureOnTouchEnd
183
- }, data.map(renderLayout))));
151
+ }, /*#__PURE__*/React.createElement(ItemRenderer, {
152
+ data: data,
153
+ dataLength: dataLength,
154
+ rawDataLength: rawDataLength,
155
+ loop: loop,
156
+ size: size,
157
+ windowSize: windowSize,
158
+ autoFillData: autoFillData,
159
+ offsetX: offsetX,
160
+ handlerOffset: handlerOffset,
161
+ layoutConfig: layoutConfig,
162
+ renderItem: renderItem,
163
+ customAnimation: customAnimation
164
+ }))));
184
165
  });
185
166
  export default Carousel;
186
167
  const styles = StyleSheet.create({
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["Carousel.tsx"],"names":["React","StyleSheet","GestureHandlerRootView","runOnJS","useDerivedValue","ItemRenderer","ScrollViewGesture","useAutoPlay","useCarouselController","useCommonVariables","useInitProps","useLayoutConfig","useOnProgressChange","usePropsErrorBoundary","CTX","computedRealIndexWithAutoFillData","Carousel","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","create","overflow","flexDirection"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,SAASC,UAAT,QAA2B,cAA3B;AACA,SAASC,sBAAT,QAAuC,8BAAvC;AACA,SAASC,OAAT,EAAkBC,eAAlB,QAAyC,yBAAzC;AAEA,SAASC,YAAT,QAA6B,gBAA7B;AACA,SAASC,iBAAT,QAAkC,qBAAlC;AAEA,SAASC,WAAT,QAA4B,sBAA5B;AACA,SAASC,qBAAT,QAAsC,gCAAtC;AACA,SAASC,kBAAT,QAAmC,6BAAnC;AACA,SAASC,YAAT,QAA6B,uBAA7B;AACA,SAASC,eAAT,QAAgC,0BAAhC;AACA,SAASC,mBAAT,QAAoC,8BAApC;AACA,SAASC,qBAAT,QAAsC,gCAAtC;AACA,SAASC,GAAT,QAAoB,UAApB;AAEA,SAASC,iCAAT,QAAkD,uCAAlD;AAEA,MAAMC,QAAQ,gBAAGhB,KAAK,CAACiB,UAAN,CACf,CAACC,MAAD,EAASC,GAAT,KAAiB;AACf,QAAMC,KAAK,GAAGV,YAAY,CAACQ,MAAD,CAA1B;AAEA,QAAM;AACJG,IAAAA,MADI;AAEJC,IAAAA,IAFI;AAGJC,IAAAA,YAHI;AAIJ;AACAC,IAAAA,IALI;AAMJ;AACAC,IAAAA,UAPI;AAQJ;AACAC,IAAAA,aATI;AAUJC,IAAAA,IAVI;AAWJC,IAAAA,KAXI;AAYJC,IAAAA,KAZI;AAaJC,IAAAA,MAbI;AAcJC,IAAAA,QAdI;AAeJC,IAAAA,QAfI;AAgBJC,IAAAA,UAhBI;AAiBJC,IAAAA,eAjBI;AAkBJC,IAAAA,gBAlBI;AAmBJC,IAAAA,uBAnBI;AAoBJC,IAAAA,aApBI;AAqBJC,IAAAA,cArBI;AAsBJC,IAAAA,UAtBI;AAuBJC,IAAAA,WAvBI;AAwBJC,IAAAA,YAxBI;AAyBJC,IAAAA,aAzBI;AA0BJC,IAAAA,gBA1BI;AA2BJC,IAAAA,eA3BI;AA4BJC,IAAAA;AA5BI,MA6BFzB,KA7BJ;AA+BA,QAAM0B,eAAe,GAAGrC,kBAAkB,CAACW,KAAD,CAA1C;AACA,QAAM;AAAE2B,IAAAA,IAAF;AAAQC,IAAAA;AAAR,MAA0BF,eAAhC;AAEA,QAAMG,OAAO,GAAG7C,eAAe,CAAC,MAAM;AACpC,UAAM8C,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,GAR8B,EAQ5B,CAAC7B,IAAD,EAAOyB,IAAP,EAAatB,UAAb,CAR4B,CAA/B;AAUAZ,EAAAA,qBAAqB,CAAC,EAAE,GAAGO,KAAL;AAAYK,IAAAA;AAAZ,GAAD,CAArB;AACAb,EAAAA,mBAAmB,CAAC;AAClBW,IAAAA,YADkB;AAElBD,IAAAA,IAFkB;AAGlByB,IAAAA,IAHkB;AAIlBE,IAAAA,OAJkB;AAKlBvB,IAAAA,aALkB;AAMlBiB,IAAAA;AANkB,GAAD,CAAnB;AASA,QAAMW,kBAAkB,GAAG9C,qBAAqB,CAAC;AAC/Cc,IAAAA,IAD+C;AAE/CyB,IAAAA,IAF+C;AAG/CtB,IAAAA,UAH+C;AAI/CF,IAAAA,YAJ+C;AAK/CyB,IAAAA,aAL+C;AAM/CX,IAAAA,aAN+C;AAO/CQ,IAAAA,YAP+C;AAQ/CP,IAAAA,cAR+C;AAS/CiB,IAAAA,QAAQ,EAAEnB,uBATqC;AAU/CI,IAAAA,WAAW,EAAE,MAAMrC,OAAO,CAACqD,YAAD,CAAP,EAV4B;AAW/Cd,IAAAA,aAAa,EAAE,MAAM,CAAC,CAACA,aAAF,IAAmBvC,OAAO,CAACuC,aAAD,CAAP;AAXO,GAAD,CAAhD;AAcA,QAAM;AAAEe,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,MAAiD1D,WAAW,CAAC;AACjEyB,IAAAA,QADiE;AAEjEG,IAAAA,gBAFiE;AAGjED,IAAAA,eAHiE;AAIjEoB,IAAAA;AAJiE,GAAD,CAAlE;;AAOA,QAAME,YAAY,GAAGxD,KAAK,CAACkE,WAAN,CAAkB,MAAM;AAC3C,UAAMC,YAAY,GAAGC,IAAI,CAACC,KAAL,CAAWT,cAAc,EAAzB,CAArB;;AAEA,UAAMU,SAAS,GAAGvD,iCAAiC,CAAC;AAClDwD,MAAAA,KAAK,EAAEJ,YAD2C;AAElD1C,MAAAA,UAAU,EAAEC,aAFsC;AAGlDJ,MAAAA,IAHkD;AAIlDC,MAAAA;AAJkD,KAAD,CAAnD;AAOA,QAAIkB,YAAJ,EACEA,YAAY,CAAC6B,SAAD,CAAZ;AAEF,QAAI9B,WAAJ,EACEA,WAAW,CAAC8B,SAAD,CAAX;AACH,GAfoB,EAelB,CACDhD,IADC,EAEDC,YAFC,EAGDG,aAHC,EAIDkC,cAJC,EAKDnB,YALC,EAMDD,WANC,CAfkB,CAArB;;AAwBA,QAAMgC,8BAA8B,GAAGxE,KAAK,CAACkE,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,GAAGzE,KAAK,CAACkE,WAAN,CAAkB,MAAM;AAC3DH,IAAAA,aAAa;;AACbP,IAAAA,YAAY;AACb,GAHoC,EAGlC,CAACA,YAAD,EAAeO,aAAf,CAHkC,CAArC;AAKA,QAAMW,6BAA6B,GAAG1E,KAAK,CAACkE,WAAN,CAAkBD,aAAlB,EAAiC,CACrEA,aADqE,CAAjC,CAAtC;AAIA,QAAMU,2BAA2B,GAAG3E,KAAK,CAACkE,WAAN,CAAkBH,aAAlB,EAAiC,CACnEA,aADmE,CAAjC,CAApC;AAIA/D,EAAAA,KAAK,CAAC4E,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,YAAY,GAAGlE,eAAe,CAAC,EAAE,GAAGS,KAAL;AAAY2B,IAAAA;AAAZ,GAAD,CAApC;AAEA,sBACE,oBAAC,sBAAD,qBACE,oBAAC,GAAD,CAAK,QAAL;AAAc,IAAA,KAAK,EAAE;AAAE3B,MAAAA,KAAF;AAAS0D,MAAAA,MAAM,EAAEhC;AAAjB;AAArB,kBACE,oBAAC,iBAAD;AACE,IAAA,GAAG,EAAEnB,IADP;AAEE,IAAA,IAAI,EAAEoB,IAFR;AAGE,IAAA,WAAW,EAAEC,aAHf;AAIE,IAAA,KAAK,EAAE,CACL+B,MAAM,CAACC,SADF,EAEL;AACEnD,MAAAA,KAAK,EAAEA,KAAK,IAAI,MADlB;AAEEC,MAAAA,MAAM,EAAEA,MAAM,IAAI;AAFpB,KAFK,EAMLF,KANK,EAOLG,QAAQ,GACJgD,MAAM,CAACE,aADH,GAEJF,MAAM,CAACG,eATN,CAJT;AAeE,IAAA,MAAM,EAAE7D,MAfV;AAgBE,IAAA,aAAa,EAAEmD,8BAhBjB;AAiBE,IAAA,WAAW,EAAEC,4BAjBf;AAkBE,IAAA,YAAY,EAAEC,6BAlBhB;AAmBE,IAAA,UAAU,EAAEC;AAnBd,kBAqBE,oBAAC,YAAD;AACE,IAAA,IAAI,EAAEnD,IADR;AAEE,IAAA,UAAU,EAAEC,UAFd;AAGE,IAAA,aAAa,EAAEC,aAHjB;AAIE,IAAA,IAAI,EAAEJ,IAJR;AAKE,IAAA,IAAI,EAAEyB,IALR;AAME,IAAA,UAAU,EAAEd,UANd;AAOE,IAAA,YAAY,EAAEV,YAPhB;AAQE,IAAA,OAAO,EAAE0B,OARX;AASE,IAAA,aAAa,EAAED,aATjB;AAUE,IAAA,YAAY,EAAE6B,YAVhB;AAWE,IAAA,UAAU,EAAEtC,UAXd;AAYE,IAAA,eAAe,EAAEK;AAZnB,IArBF,CADF,CADF,CADF;AA0CD,CAnLc,CAAjB;AAsLA,eAAe5B,QAAf;AAIA,MAAM+D,MAAM,GAAG9E,UAAU,CAACkF,MAAX,CAAkB;AAC/BH,EAAAA,SAAS,EAAE;AACTI,IAAAA,QAAQ,EAAE;AADD,GADoB;AAI/BF,EAAAA,eAAe,EAAE;AACfG,IAAAA,aAAa,EAAE;AADA,GAJc;AAO/BJ,EAAAA,aAAa,EAAE;AACbI,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 { 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,62 @@
1
+ import React from "react";
2
+ import { useAnimatedReaction, runOnJS } from "react-native-reanimated";
3
+ import { BaseLayout } from "./BaseLayout";
4
+ import { useVisibleRanges } from "../hooks/useVisibleRanges";
5
+ import { computedRealIndexWithAutoFillData } from "../utils/computed-with-auto-fill-data";
6
+ export const ItemRenderer = props => {
7
+ const {
8
+ data,
9
+ size,
10
+ windowSize,
11
+ handlerOffset,
12
+ offsetX,
13
+ dataLength,
14
+ rawDataLength,
15
+ loop,
16
+ autoFillData,
17
+ layoutConfig,
18
+ renderItem,
19
+ customAnimation
20
+ } = props;
21
+ const visibleRanges = useVisibleRanges({
22
+ total: dataLength,
23
+ viewSize: size,
24
+ translation: handlerOffset,
25
+ windowSize,
26
+ loop
27
+ });
28
+ const [displayedItems, setDisplayedItems] = React.useState(null);
29
+ useAnimatedReaction(() => visibleRanges.value, ranges => runOnJS(setDisplayedItems)(ranges), [visibleRanges]);
30
+ if (!displayedItems) return null;
31
+ return /*#__PURE__*/React.createElement(React.Fragment, null, data.map((item, index) => {
32
+ const realIndex = computedRealIndexWithAutoFillData({
33
+ index,
34
+ dataLength: rawDataLength,
35
+ loop,
36
+ autoFillData
37
+ });
38
+ const {
39
+ negativeRange,
40
+ positiveRange
41
+ } = displayedItems;
42
+ const shouldRender = index >= negativeRange[0] && index <= negativeRange[1] || index >= positiveRange[0] && index <= positiveRange[1];
43
+ if (!shouldRender) return null;
44
+ return /*#__PURE__*/React.createElement(BaseLayout, {
45
+ key: index,
46
+ index: index,
47
+ handlerOffset: offsetX,
48
+ visibleRanges: visibleRanges,
49
+ animationStyle: customAnimation || layoutConfig
50
+ }, _ref => {
51
+ let {
52
+ animationValue
53
+ } = _ref;
54
+ return renderItem({
55
+ item,
56
+ index: realIndex,
57
+ animationValue
58
+ });
59
+ });
60
+ }));
61
+ };
62
+ //# sourceMappingURL=ItemRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["ItemRenderer.tsx"],"names":["React","useAnimatedReaction","runOnJS","BaseLayout","useVisibleRanges","computedRealIndexWithAutoFillData","ItemRenderer","props","data","size","windowSize","handlerOffset","offsetX","dataLength","rawDataLength","loop","autoFillData","layoutConfig","renderItem","customAnimation","visibleRanges","total","viewSize","translation","displayedItems","setDisplayedItems","useState","value","ranges","map","item","index","realIndex","negativeRange","positiveRange","shouldRender","animationValue"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AAIA,SAASC,mBAAT,EAAsDC,OAAtD,QAAqE,yBAArE;AAGA,SAASC,UAAT,QAA2B,cAA3B;AAGA,SAASC,gBAAT,QAAiC,2BAAjC;AAEA,SAASC,iCAAT,QAAkD,uCAAlD;AAiBA,OAAO,MAAMC,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,GAAGhB,gBAAgB,CAAC;AACrCiB,IAAAA,KAAK,EAAER,UAD8B;AAErCS,IAAAA,QAAQ,EAAEb,IAF2B;AAGrCc,IAAAA,WAAW,EAAEZ,aAHwB;AAIrCD,IAAAA,UAJqC;AAKrCK,IAAAA;AALqC,GAAD,CAAtC;AAQA,QAAM,CAACS,cAAD,EAAiBC,iBAAjB,IAAsCzB,KAAK,CAAC0B,QAAN,CAA8B,IAA9B,CAA5C;AAEAzB,EAAAA,mBAAmB,CACjB,MAAMmB,aAAa,CAACO,KADH,EAEjBC,MAAM,IAAI1B,OAAO,CAACuB,iBAAD,CAAP,CAA2BG,MAA3B,CAFO,EAGjB,CAACR,aAAD,CAHiB,CAAnB;AAMA,MAAI,CAACI,cAAL,EACE,OAAO,IAAP;AAEF,sBACE,0CAEIhB,IAAI,CAACqB,GAAL,CAAS,CAACC,IAAD,EAAOC,KAAP,KAAiB;AACxB,UAAMC,SAAS,GAAG3B,iCAAiC,CAAC;AAClD0B,MAAAA,KADkD;AAElDlB,MAAAA,UAAU,EAAEC,aAFsC;AAGlDC,MAAAA,IAHkD;AAIlDC,MAAAA;AAJkD,KAAD,CAAnD;AAOA,UAAM;AAAEiB,MAAAA,aAAF;AAAiBC,MAAAA;AAAjB,QAAmCV,cAAzC;AAEA,UAAMW,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,oBAAC,UAAD;AACE,MAAA,GAAG,EAAEJ,KADP;AAEE,MAAA,KAAK,EAAEA,KAFT;AAGE,MAAA,aAAa,EAAEnB,OAHjB;AAIE,MAAA,aAAa,EAAEQ,aAJjB;AAKE,MAAA,cAAc,EAAED,eAAe,IAAIF;AALrC,OAOG;AAAA,UAAC;AAAEmB,QAAAA;AAAF,OAAD;AAAA,aACClB,UAAU,CAAC;AACTY,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"]}
@@ -1,23 +1,27 @@
1
- import React, { useCallback, useMemo } from "react";
2
- import { Gesture, GestureDetector } from "react-native-gesture-handler";
1
+ import React, { useCallback } from "react";
2
+ import { GestureDetector } from "react-native-gesture-handler";
3
3
  import Animated, { cancelAnimation, measure, runOnJS, useAnimatedReaction, useAnimatedRef, useDerivedValue, useSharedValue, withDecay } from "react-native-reanimated";
4
- import { Easing } from "./constants";
5
- import { CTX } from "./store";
6
- import { dealWithAnimation } from "./utils/dealWithAnimation";
4
+ import { Easing } from "../constants";
5
+ import { usePanGestureProxy } from "../hooks/usePanGestureProxy";
6
+ import { CTX } from "../store";
7
+ import { dealWithAnimation } from "../utils/deal-with-animation";
7
8
 
8
9
  const IScrollViewGesture = props => {
9
10
  const {
10
11
  props: {
12
+ onConfigurePanGesture,
11
13
  vertical,
12
14
  pagingEnabled,
13
15
  snapEnabled,
14
- loop: infinite,
16
+ loop,
15
17
  scrollAnimationDuration,
16
18
  withAnimation,
17
19
  enabled,
18
20
  dataLength,
19
21
  overscrollEnabled,
20
- maxScrollDistancePerSwipe
22
+ maxScrollDistancePerSwipe,
23
+ minScrollDistancePerSwipe,
24
+ fixedDirection
21
25
  }
22
26
  } = React.useContext(CTX);
23
27
  const {
@@ -25,7 +29,7 @@ const IScrollViewGesture = props => {
25
29
  translation,
26
30
  testID,
27
31
  style = {},
28
- onScrollBegin,
32
+ onScrollStart,
29
33
  onScrollEnd,
30
34
  onTouchBegin,
31
35
  onTouchEnd
@@ -39,12 +43,13 @@ const IScrollViewGesture = props => {
39
43
  const scrollEndTranslation = useSharedValue(0);
40
44
  const scrollEndVelocity = useSharedValue(0);
41
45
  const containerRef = useAnimatedRef();
42
- const maxScrollDistancePerSwipeIsSet = typeof maxScrollDistancePerSwipe === "number"; // Get the limit of the scroll.
46
+ const maxScrollDistancePerSwipeIsSet = typeof maxScrollDistancePerSwipe === "number";
47
+ const minScrollDistancePerSwipeIsSet = typeof minScrollDistancePerSwipe === "number"; // Get the limit of the scroll.
43
48
 
44
49
  const getLimit = React.useCallback(() => {
45
50
  "worklet";
46
51
 
47
- if (!infinite && !overscrollEnabled) {
52
+ if (!loop && !overscrollEnabled) {
48
53
  const {
49
54
  width: containerWidth = 0
50
55
  } = measure(containerRef); // If the item's total width is less than the container's width, then there is no need to scroll.
@@ -55,7 +60,7 @@ const IScrollViewGesture = props => {
55
60
  }
56
61
 
57
62
  return dataLength * size;
58
- }, [infinite, size, dataLength, overscrollEnabled]);
63
+ }, [loop, size, dataLength, overscrollEnabled]);
59
64
  const withSpring = React.useCallback((toValue, onFinished) => {
60
65
  "worklet";
61
66
 
@@ -100,7 +105,7 @@ const IScrollViewGesture = props => {
100
105
  const computed = offset < 0 ? Math.ceil : Math.floor;
101
106
  const page = computed(-translation.value / size);
102
107
 
103
- if (infinite) {
108
+ if (loop) {
104
109
  const finalPage = page + offset;
105
110
  finalTranslation = withSpring(withProcessTranslation(-finalPage * size), onFinished);
106
111
  } else {
@@ -119,7 +124,7 @@ const IScrollViewGesture = props => {
119
124
  translation.value = finalTranslation;
120
125
 
121
126
  function withProcessTranslation(translation) {
122
- if (!infinite && !overscrollEnabled) {
127
+ if (!loop && !overscrollEnabled) {
123
128
  const limit = getLimit();
124
129
  const sign = Math.sign(translation);
125
130
  return sign * Math.max(0, Math.min(limit, Math.abs(translation)));
@@ -127,7 +132,7 @@ const IScrollViewGesture = props => {
127
132
 
128
133
  return translation;
129
134
  }
130
- }, [withSpring, size, maxPage, infinite, snapEnabled, translation, pagingEnabled, scrollEndVelocity.value, maxScrollDistancePerSwipe, scrollEndTranslation.value, maxScrollDistancePerSwipeIsSet]);
135
+ }, [withSpring, size, maxPage, loop, snapEnabled, translation, pagingEnabled, scrollEndVelocity.value, maxScrollDistancePerSwipe, scrollEndTranslation.value, maxScrollDistancePerSwipeIsSet]);
131
136
  const onFinish = React.useCallback(isFinished => {
132
137
  "worklet";
133
138
 
@@ -155,7 +160,7 @@ const IScrollViewGesture = props => {
155
160
  return;
156
161
  }
157
162
 
158
- if (!infinite) {
163
+ if (!loop) {
159
164
  translation.value = withSpring(0);
160
165
  return;
161
166
  }
@@ -167,9 +172,9 @@ const IScrollViewGesture = props => {
167
172
  return;
168
173
  }
169
174
 
170
- if (!infinite) translation.value = withSpring(-((maxPage - 1) * size));
175
+ if (!loop) translation.value = withSpring(-((maxPage - 1) * size));
171
176
  }
172
- }, [touching.value, translation, maxPage, size, scrollEndTranslation.value, infinite, activeDecay, withSpring]);
177
+ }, [touching.value, translation, maxPage, size, scrollEndTranslation.value, loop, activeDecay, withSpring]);
173
178
  useAnimatedReaction(() => translation.value, () => {
174
179
  if (!pagingEnabled) resetBoundary();
175
180
  }, [pagingEnabled, resetBoundary]);
@@ -177,7 +182,7 @@ const IScrollViewGesture = props => {
177
182
  function withProcessTranslation(translation) {
178
183
  "worklet";
179
184
 
180
- if (!infinite && !overscrollEnabled) {
185
+ if (!loop && !overscrollEnabled) {
181
186
  const limit = getLimit();
182
187
  const sign = Math.sign(translation);
183
188
  return sign * Math.max(0, Math.min(limit, Math.abs(translation)));
@@ -186,16 +191,16 @@ const IScrollViewGesture = props => {
186
191
  return translation;
187
192
  }
188
193
 
189
- const onGestureBegin = useCallback(() => {
194
+ const onGestureStart = useCallback(_ => {
190
195
  "worklet";
191
196
 
192
197
  touching.value = true;
193
198
  validStart.value = true;
194
- onScrollBegin && runOnJS(onScrollBegin)();
199
+ onScrollStart && runOnJS(onScrollStart)();
195
200
  max.value = (maxPage - 1) * size;
196
- if (!infinite && !overscrollEnabled) max.value = getLimit();
201
+ if (!loop && !overscrollEnabled) max.value = getLimit();
197
202
  panOffset.value = translation.value;
198
- }, [max, size, maxPage, infinite, touching, panOffset, validStart, translation, overscrollEnabled, getLimit, onScrollBegin]);
203
+ }, [max, size, maxPage, loop, touching, panOffset, validStart, translation, overscrollEnabled, getLimit, onScrollStart]);
199
204
  const onGestureUpdate = useCallback(e => {
200
205
  "worklet";
201
206
 
@@ -209,9 +214,10 @@ const IScrollViewGesture = props => {
209
214
  translationX,
210
215
  translationY
211
216
  } = e;
212
- const panTranslation = isHorizontal.value ? translationX : translationY;
217
+ let panTranslation = isHorizontal.value ? translationX : translationY;
218
+ if (fixedDirection === "negative") panTranslation = -Math.abs(panTranslation);else if (fixedDirection === "positive") panTranslation = +Math.abs(panTranslation);
213
219
 
214
- if (!infinite) {
220
+ if (!loop) {
215
221
  if (translation.value > 0 || translation.value < -max.value) {
216
222
  const boundary = translation.value > 0 ? 0 : -max.value;
217
223
  const fixed = boundary - panOffset.value;
@@ -223,8 +229,8 @@ const IScrollViewGesture = props => {
223
229
 
224
230
  const translationValue = panOffset.value + panTranslation;
225
231
  translation.value = translationValue;
226
- }, [isHorizontal, max, panOffset, infinite, overscrollEnabled, translation, validStart, touching]);
227
- const onGestureFinish = useCallback(e => {
232
+ }, [isHorizontal, max, panOffset, loop, overscrollEnabled, fixedDirection, translation, validStart, touching]);
233
+ const onGestureEnd = useCallback((e, _success) => {
228
234
  "worklet";
229
235
 
230
236
  const {
@@ -234,21 +240,42 @@ const IScrollViewGesture = props => {
234
240
  translationY
235
241
  } = e;
236
242
  scrollEndVelocity.value = isHorizontal.value ? velocityX : velocityY;
237
- scrollEndTranslation.value = isHorizontal.value ? translationX : translationY;
243
+ let panTranslation = isHorizontal.value ? translationX : translationY;
244
+ if (fixedDirection === "negative") panTranslation = -Math.abs(panTranslation);else if (fixedDirection === "positive") panTranslation = +Math.abs(panTranslation);
245
+ scrollEndTranslation.value = panTranslation;
238
246
  const totalTranslation = scrollEndVelocity.value + scrollEndTranslation.value;
247
+ /**
248
+ * If the maximum scroll distance is set and the translation `exceeds the maximum scroll distance`,
249
+ * the carousel will keep the view at the current position.
250
+ */
239
251
 
240
252
  if (maxScrollDistancePerSwipeIsSet && Math.abs(totalTranslation) > maxScrollDistancePerSwipe) {
241
253
  const nextPage = Math.round((panOffset.value + maxScrollDistancePerSwipe * Math.sign(totalTranslation)) / size) * size;
242
254
  translation.value = withSpring(withProcessTranslation(nextPage), onScrollEnd);
255
+ }
256
+ /**
257
+ * If the minimum scroll distance is set and the translation `didn't exceeds the minimum scroll distance`,
258
+ * the carousel will keep the view at the current position.
259
+ */
260
+ else if (minScrollDistancePerSwipeIsSet && Math.abs(totalTranslation) < minScrollDistancePerSwipe) {
261
+ const nextPage = Math.round((panOffset.value + minScrollDistancePerSwipe * Math.sign(totalTranslation)) / size) * size;
262
+ translation.value = withSpring(withProcessTranslation(nextPage), onScrollEnd);
243
263
  } else {
244
264
  endWithSpring(onScrollEnd);
245
265
  }
246
266
 
247
- if (!infinite) touching.value = false;
248
- }, [size, infinite, touching, panOffset, translation, isHorizontal, scrollEndVelocity, scrollEndTranslation, maxScrollDistancePerSwipeIsSet, maxScrollDistancePerSwipe, endWithSpring, withSpring, onScrollEnd]);
249
- const gesture = useMemo(() => Gesture.Pan().onBegin(onGestureBegin).onUpdate(onGestureUpdate).onEnd(onGestureFinish), [onGestureBegin, onGestureUpdate, onGestureFinish]);
250
- const GestureContainer = enabled ? GestureDetector : React.Fragment;
251
- return /*#__PURE__*/React.createElement(GestureContainer, {
267
+ if (!loop) touching.value = false;
268
+ }, [size, loop, touching, panOffset, translation, isHorizontal, scrollEndVelocity, scrollEndTranslation, fixedDirection, maxScrollDistancePerSwipeIsSet, maxScrollDistancePerSwipe, maxScrollDistancePerSwipeIsSet, minScrollDistancePerSwipe, endWithSpring, withSpring, onScrollEnd]);
269
+ const gesture = usePanGestureProxy({
270
+ onConfigurePanGesture,
271
+ onGestureStart,
272
+ onGestureUpdate,
273
+ onGestureEnd,
274
+ options: {
275
+ enabled
276
+ }
277
+ });
278
+ return /*#__PURE__*/React.createElement(GestureDetector, {
252
279
  gesture: gesture
253
280
  }, /*#__PURE__*/React.createElement(Animated.View, {
254
281
  ref: containerRef,
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["ScrollViewGesture.tsx"],"names":["React","useCallback","GestureDetector","Animated","cancelAnimation","measure","runOnJS","useAnimatedReaction","useAnimatedRef","useDerivedValue","useSharedValue","withDecay","Easing","usePanGestureProxy","CTX","dealWithAnimation","IScrollViewGesture","props","onConfigurePanGesture","vertical","pagingEnabled","snapEnabled","loop","scrollAnimationDuration","withAnimation","enabled","dataLength","overscrollEnabled","maxScrollDistancePerSwipe","minScrollDistancePerSwipe","fixedDirection","useContext","size","translation","testID","style","onScrollStart","onScrollEnd","onTouchBegin","onTouchEnd","maxPage","isHorizontal","max","panOffset","touching","validStart","scrollEndTranslation","scrollEndVelocity","containerRef","maxScrollDistancePerSwipeIsSet","minScrollDistancePerSwipeIsSet","getLimit","width","containerWidth","withSpring","toValue","onFinished","defaultWithAnimation","type","config","duration","easing","easeOutQuart","isFinished","endWithSpring","origin","value","velocity","finalTranslation","deceleration","Math","abs","offset","computed","ceil","floor","page","finalPage","withProcessTranslation","min","nextPage","round","limit","sign","onFinish","activeDecay","resetBoundary","onGestureStart","_","onGestureUpdate","e","translationX","translationY","panTranslation","boundary","fixed","dynamic","translationValue","onGestureEnd","_success","velocityX","velocityY","totalTranslation","gesture","options","children","ScrollViewGesture"],"mappings":"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","sourcesContent":["import type { PropsWithChildren } from \"react\";\nimport React, { useCallback } from \"react\";\nimport type { StyleProp, ViewStyle } from \"react-native\";\nimport type { GestureStateChangeEvent, PanGestureHandlerEventPayload } from \"react-native-gesture-handler\";\nimport { GestureDetector } from \"react-native-gesture-handler\";\nimport Animated, {\n cancelAnimation,\n measure,\n runOnJS,\n useAnimatedReaction,\n useAnimatedRef,\n useDerivedValue,\n useSharedValue,\n withDecay,\n} from \"react-native-reanimated\";\n\nimport { Easing } from \"../constants\";\nimport { usePanGestureProxy } from \"../hooks/usePanGestureProxy\";\nimport { CTX } from \"../store\";\nimport type { WithTimingAnimation } from \"../types\";\nimport { dealWithAnimation } from \"../utils/deal-with-animation\";\n\ninterface Props {\n size: number\n infinite?: boolean\n testID?: string\n style?: StyleProp<ViewStyle>\n onScrollStart?: () => void\n onScrollEnd?: () => void\n onTouchBegin?: () => void\n onTouchEnd?: () => void\n translation: Animated.SharedValue<number>\n}\n\nconst IScrollViewGesture: React.FC<PropsWithChildren<Props>> = (props) => {\n const {\n props: {\n onConfigurePanGesture,\n vertical,\n pagingEnabled,\n snapEnabled,\n loop,\n scrollAnimationDuration,\n withAnimation,\n enabled,\n dataLength,\n overscrollEnabled,\n maxScrollDistancePerSwipe,\n minScrollDistancePerSwipe,\n fixedDirection,\n },\n } = React.useContext(CTX);\n\n const {\n size,\n translation,\n testID,\n style = {},\n onScrollStart,\n onScrollEnd,\n onTouchBegin,\n onTouchEnd,\n } = props;\n\n const maxPage = dataLength;\n const isHorizontal = useDerivedValue(() => !vertical, [vertical]);\n const max = useSharedValue(0);\n const panOffset = useSharedValue(0);\n const touching = useSharedValue(false);\n const validStart = useSharedValue(false);\n const scrollEndTranslation = useSharedValue(0);\n const scrollEndVelocity = useSharedValue(0);\n const containerRef = useAnimatedRef<Animated.View>();\n const maxScrollDistancePerSwipeIsSet = typeof maxScrollDistancePerSwipe === \"number\";\n const minScrollDistancePerSwipeIsSet = typeof minScrollDistancePerSwipe === \"number\";\n\n // Get the limit of the scroll.\n const getLimit = React.useCallback(() => {\n \"worklet\";\n\n if (!loop && !overscrollEnabled) {\n const { width: containerWidth = 0 } = measure(containerRef);\n\n // If the item's total width is less than the container's width, then there is no need to scroll.\n if (dataLength * size < containerWidth)\n return 0;\n\n // Disable the \"overscroll\" effect\n return dataLength * size - containerWidth;\n }\n\n return dataLength * size;\n }, [loop, size, dataLength, overscrollEnabled]);\n\n const withSpring = React.useCallback(\n (toValue: number, onFinished?: () => void) => {\n \"worklet\";\n const defaultWithAnimation: WithTimingAnimation = {\n type: \"timing\",\n config: {\n duration: scrollAnimationDuration + 100,\n easing: Easing.easeOutQuart,\n },\n };\n\n return dealWithAnimation(withAnimation ?? defaultWithAnimation)(\n toValue,\n (isFinished: boolean) => {\n \"worklet\";\n if (isFinished)\n onFinished && runOnJS(onFinished)();\n },\n );\n },\n [scrollAnimationDuration, withAnimation],\n );\n\n const endWithSpring = React.useCallback(\n (onFinished?: () => void) => {\n \"worklet\";\n const origin = translation.value;\n const velocity = scrollEndVelocity.value;\n // Default to scroll in the direction of the slide (with deceleration)\n let finalTranslation: number = withDecay({ velocity, deceleration: 0.999 });\n\n // If the distance of the swipe exceeds the max scroll distance, keep the view at the current position\n if (maxScrollDistancePerSwipeIsSet && Math.abs(scrollEndTranslation.value) > maxScrollDistancePerSwipe) {\n finalTranslation = origin;\n }\n else {\n /**\n * The page size is the same as the item size.\n * If direction is vertical, the page size is the height of the item.\n * If direction is horizontal, the page size is the width of the item.\n *\n * `page size` equals to `size` variable.\n * */\n if (pagingEnabled) {\n // distance with direction\n const offset = -(scrollEndTranslation.value >= 0 ? 1 : -1); // 1 or -1\n const computed = offset < 0 ? Math.ceil : Math.floor;\n const page = computed(-translation.value / size);\n\n if (loop) {\n const finalPage = page + offset;\n finalTranslation = withSpring(withProcessTranslation(-finalPage * size), onFinished);\n }\n else {\n const finalPage = Math.min(maxPage - 1, Math.max(0, page + offset));\n finalTranslation = withSpring(withProcessTranslation(-finalPage * size), onFinished);\n }\n }\n\n if (!pagingEnabled && snapEnabled) {\n // scroll to the nearest item\n const nextPage = Math.round((origin + velocity * 0.4) / size) * size;\n finalTranslation = withSpring(withProcessTranslation(nextPage), onFinished);\n }\n }\n\n translation.value = finalTranslation;\n\n function withProcessTranslation(translation: number) {\n if (!loop && !overscrollEnabled) {\n const limit = getLimit();\n const sign = Math.sign(translation);\n return sign * Math.max(0, Math.min(limit, Math.abs(translation)));\n }\n\n return translation;\n }\n },\n [\n withSpring,\n size,\n maxPage,\n loop,\n snapEnabled,\n translation,\n pagingEnabled,\n scrollEndVelocity.value,\n maxScrollDistancePerSwipe,\n scrollEndTranslation.value,\n maxScrollDistancePerSwipeIsSet,\n ],\n );\n\n const onFinish = React.useCallback(\n (isFinished: boolean) => {\n \"worklet\";\n if (isFinished) {\n touching.value = false;\n onScrollEnd && runOnJS(onScrollEnd)();\n }\n },\n [onScrollEnd, touching],\n );\n\n const activeDecay = React.useCallback(() => {\n \"worklet\";\n touching.value = true;\n translation.value = withDecay(\n { velocity: scrollEndVelocity.value },\n isFinished => onFinish(isFinished as boolean),\n );\n }, [onFinish, scrollEndVelocity.value, touching, translation]);\n\n const resetBoundary = React.useCallback(() => {\n \"worklet\";\n if (touching.value)\n return;\n\n if (translation.value > 0) {\n if (scrollEndTranslation.value < 0) {\n activeDecay();\n return;\n }\n if (!loop) {\n translation.value = withSpring(0);\n return;\n }\n }\n\n if (translation.value < -((maxPage - 1) * size)) {\n if (scrollEndTranslation.value > 0) {\n activeDecay();\n return;\n }\n if (!loop)\n translation.value = withSpring(-((maxPage - 1) * size));\n }\n }, [\n touching.value,\n translation,\n maxPage,\n size,\n scrollEndTranslation.value,\n loop,\n activeDecay,\n withSpring,\n ]);\n\n useAnimatedReaction(\n () => translation.value,\n () => {\n if (!pagingEnabled)\n resetBoundary();\n },\n [pagingEnabled, resetBoundary],\n );\n\n function withProcessTranslation(translation: number) {\n \"worklet\";\n\n if (!loop && !overscrollEnabled) {\n const limit = getLimit();\n const sign = Math.sign(translation);\n return sign * Math.max(0, Math.min(limit, Math.abs(translation)));\n }\n\n return translation;\n }\n\n const onGestureStart = useCallback((_: PanGestureHandlerEventPayload) => {\n \"worklet\";\n\n touching.value = true;\n validStart.value = true;\n onScrollStart && runOnJS(onScrollStart)();\n\n max.value = (maxPage - 1) * size;\n if (!loop && !overscrollEnabled)\n max.value = getLimit();\n\n panOffset.value = translation.value;\n }, [\n max,\n size,\n maxPage,\n loop,\n touching,\n panOffset,\n validStart,\n translation,\n overscrollEnabled,\n getLimit,\n onScrollStart,\n ]);\n\n const onGestureUpdate = useCallback((e: PanGestureHandlerEventPayload) => {\n \"worklet\";\n\n if (validStart.value) {\n validStart.value = false;\n cancelAnimation(translation);\n }\n touching.value = true;\n const { translationX, translationY } = e;\n\n let panTranslation = isHorizontal.value\n ? translationX\n : translationY;\n\n if (fixedDirection === \"negative\")\n panTranslation = -Math.abs(panTranslation);\n\n else if (fixedDirection === \"positive\")\n panTranslation = +Math.abs(panTranslation);\n\n if (!loop) {\n if ((translation.value > 0 || translation.value < -max.value)) {\n const boundary = translation.value > 0 ? 0 : -max.value;\n const fixed = boundary - panOffset.value;\n const dynamic = panTranslation - fixed;\n translation.value = boundary + dynamic * 0.5;\n return;\n }\n }\n\n const translationValue = panOffset.value + panTranslation;\n translation.value = translationValue;\n }, [\n isHorizontal,\n max,\n panOffset,\n loop,\n overscrollEnabled,\n fixedDirection,\n translation,\n validStart,\n touching,\n ]);\n\n const onGestureEnd = useCallback((e: GestureStateChangeEvent<PanGestureHandlerEventPayload>, _success: boolean) => {\n \"worklet\";\n\n const { velocityX, velocityY, translationX, translationY } = e;\n scrollEndVelocity.value = isHorizontal.value\n ? velocityX\n : velocityY;\n\n let panTranslation = isHorizontal.value\n ? translationX\n : translationY;\n\n if (fixedDirection === \"negative\")\n panTranslation = -Math.abs(panTranslation);\n\n else if (fixedDirection === \"positive\")\n panTranslation = +Math.abs(panTranslation);\n\n scrollEndTranslation.value = panTranslation;\n\n const totalTranslation = scrollEndVelocity.value + scrollEndTranslation.value;\n\n /**\n * If the maximum scroll distance is set and the translation `exceeds the maximum scroll distance`,\n * the carousel will keep the view at the current position.\n */\n if (\n maxScrollDistancePerSwipeIsSet && Math.abs(totalTranslation) > maxScrollDistancePerSwipe\n ) {\n const nextPage = Math.round((panOffset.value + maxScrollDistancePerSwipe * Math.sign(totalTranslation)) / size) * size;\n translation.value = withSpring(withProcessTranslation(nextPage), onScrollEnd);\n }\n /**\n * If the minimum scroll distance is set and the translation `didn't exceeds the minimum scroll distance`,\n * the carousel will keep the view at the current position.\n */\n else if (\n minScrollDistancePerSwipeIsSet && Math.abs(totalTranslation) < minScrollDistancePerSwipe\n ) {\n const nextPage = Math.round((panOffset.value + minScrollDistancePerSwipe * Math.sign(totalTranslation)) / size) * size;\n translation.value = withSpring(withProcessTranslation(nextPage), onScrollEnd);\n }\n else {\n endWithSpring(onScrollEnd);\n }\n\n if (!loop)\n touching.value = false;\n }, [\n size,\n loop,\n touching,\n panOffset,\n translation,\n isHorizontal,\n scrollEndVelocity,\n scrollEndTranslation,\n fixedDirection,\n maxScrollDistancePerSwipeIsSet,\n maxScrollDistancePerSwipe,\n maxScrollDistancePerSwipeIsSet,\n minScrollDistancePerSwipe,\n endWithSpring,\n withSpring,\n onScrollEnd,\n ]);\n\n const gesture = usePanGestureProxy({\n onConfigurePanGesture,\n onGestureStart,\n onGestureUpdate,\n onGestureEnd,\n options: { enabled },\n });\n\n return (\n <GestureDetector gesture={gesture}>\n <Animated.View\n ref={containerRef}\n testID={testID}\n style={style}\n onTouchStart={onTouchBegin}\n onTouchEnd={onTouchEnd}\n >\n {props.children}\n </Animated.View>\n </GestureDetector>\n );\n};\n\nexport const ScrollViewGesture = IScrollViewGesture;\n"]}