react-native-reanimated-carousel 1.0.6 → 1.0.7

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.
@@ -17,8 +17,6 @@ var _index = require("./layouts/index");
17
17
 
18
18
  var _useCarouselController = require("./hooks/useCarouselController");
19
19
 
20
- var _useComputedAnim = require("./hooks/useComputedAnim");
21
-
22
20
  var _useAutoPlay = require("./hooks/useAutoPlay");
23
21
 
24
22
  var _useIndexController = require("./hooks/useIndexController");
@@ -94,7 +92,6 @@ function Carousel(props, ref) {
94
92
  return _data;
95
93
  }, [_data, loop]);
96
94
 
97
- const computedAnimResult = (0, _useComputedAnim.useComputedAnim)(width, data.length);
98
95
  const indexController = (0, _useIndexController.useIndexController)({
99
96
  originalLength: _data.length,
100
97
  length: data.length,
@@ -144,14 +141,15 @@ function Carousel(props, ref) {
144
141
  }, [sharedPreIndex, sharedIndex, computedIndex, props, run]);
145
142
 
146
143
  const offsetX = (0, _reactNativeReanimated.useDerivedValue)(() => {
147
- const x = handlerOffsetX.value % computedAnimResult.TOTAL_WIDTH;
144
+ const totalWidth = width * data.length;
145
+ const x = handlerOffsetX.value % totalWidth;
148
146
 
149
147
  if (!loop) {
150
148
  return handlerOffsetX.value;
151
149
  }
152
150
 
153
151
  return isNaN(x) ? 0 : x;
154
- }, [computedAnimResult, loop]);
152
+ }, [loop, width, data]);
155
153
  (0, _reactNativeReanimated.useAnimatedReaction)(() => offsetX.value, value => {
156
154
  let absoluteProgress = Math.abs(value / width);
157
155
 
@@ -249,7 +247,7 @@ function Carousel(props, ref) {
249
247
  return /*#__PURE__*/_react.default.createElement(_index.ParallaxLayout, {
250
248
  parallaxScrollingOffset: parallaxScrollingOffset,
251
249
  parallaxScrollingScale: parallaxScrollingScale,
252
- computedAnimResult: computedAnimResult,
250
+ data: data,
253
251
  width: width,
254
252
  handlerOffsetX: offsetX,
255
253
  index: i,
@@ -259,7 +257,7 @@ function Carousel(props, ref) {
259
257
 
260
258
  default:
261
259
  return /*#__PURE__*/_react.default.createElement(_CarouselItem.CarouselItem, {
262
- computedAnimResult: computedAnimResult,
260
+ data: data,
263
261
  width: width,
264
262
  height: height,
265
263
  handlerOffsetX: offsetX,
@@ -268,7 +266,7 @@ function Carousel(props, ref) {
268
266
  loop: loop
269
267
  }, renderItem(item, i));
270
268
  }
271
- }, [loop, mode, computedAnimResult, height, offsetX, parallaxScrollingOffset, parallaxScrollingScale, width, renderItem]);
269
+ }, [loop, mode, data, height, offsetX, parallaxScrollingOffset, parallaxScrollingScale, width, renderItem]);
272
270
 
273
271
  return /*#__PURE__*/_react.default.createElement(_reactNativeGestureHandler.PanGestureHandler, _extends({}, panGestureHandlerProps, {
274
272
  onGestureEvent: animatedListScrollHandler
@@ -1 +1 @@
1
- {"version":3,"sources":["Carousel.tsx"],"names":["defaultSpringConfig","damping","Carousel","props","ref","defaultIndex","height","data","_data","loop","mode","autoPlay","autoPlayReverse","autoPlayInterval","parallaxScrollingOffset","parallaxScrollingScale","style","panGestureHandlerProps","renderItem","onSnapToItem","onProgressChange","timingConfig","springConfig","width","Math","round","defaultHandlerOffsetX","abs","handlerOffsetX","React","useMemo","length","computedAnimResult","indexController","originalLength","onChange","i","carouselController","disable","onScrollBegin","onScrollEnd","run","pause","index","sharedPreIndex","sharedIndex","computedIndex","useCallback","current","offsetX","x","value","TOTAL_WIDTH","isNaN","absoluteProgress","next","prev","getCurrentIndex","goToIndex","animated","to","animatedListScrollHandler","onStart","_","ctx","currentContentOffsetX","start","onActive","e","translationX","onEnd","_withAnimationCallback","num","Object","assign","velocity","velocityX","isFinished","page","velocityPage","pageWithVelocity","min","max","useImperativeHandle","renderLayout","item","flexDirection","position","map","forwardRef"],"mappings":";;;;;;;AAAA;;AAEA;;AAKA;;AASA;;AAEA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;;;;;AAEA,MAAMA,mBAA8C,GAAG;AACnDC,EAAAA,OAAO,EAAE;AAD0C,CAAvD;;AAsHA,SAASC,QAAT,CACIC,KADJ,EAEIC,GAFJ,EAGE;AACE,QAAM;AACFC,IAAAA,YAAY,GAAG,CADb;AAEFC,IAAAA,MAAM,GAAG,MAFP;AAGFC,IAAAA,IAAI,EAAEC,KAAK,GAAG,EAHZ;AAIFC,IAAAA,IAAI,GAAG,IAJL;AAKFC,IAAAA,IAAI,GAAG,SALL;AAMFC,IAAAA,QANE;AAOFC,IAAAA,eAPE;AAQFC,IAAAA,gBAAgB,GAAG,IARjB;AASFC,IAAAA,uBATE;AAUFC,IAAAA,sBAVE;AAWFC,IAAAA,KAXE;AAYFC,IAAAA,sBAAsB,GAAG,EAZvB;AAaFC,IAAAA,UAbE;AAcFC,IAAAA,YAdE;AAeFC,IAAAA;AAfE,MAgBFjB,KAhBJ;AAkBA,oDAAsB,EAClB,GAAGA,KADe;AAElBE,IAAAA,YAFkB;AAGlBC,IAAAA,MAHkB;AAIlBC,IAAAA,IAAI,EAAEC,KAJY;AAKlBC,IAAAA,IALkB;AAMlBC,IAAAA,IANkB;AAOlBC,IAAAA,QAPkB;AAQlBC,IAAAA,eARkB;AASlBC,IAAAA,gBATkB;AAUlBC,IAAAA,uBAVkB;AAWlBC,IAAAA,sBAXkB;AAYlBC,IAAAA,KAZkB;AAalBC,IAAAA,sBAbkB;AAclB;AACAC,IAAAA,UAfkB;AAgBlBC,IAAAA,YAhBkB;AAiBlBC,IAAAA;AAjBkB,GAAtB;AAoBA,QAAMC,YAAY,GAAG,EACjB,GAAGrB,mBADc;AAEjB,OAAGG,KAAK,CAACmB;AAFQ,GAArB;AAIA,QAAMC,KAAK,GAAGC,IAAI,CAACC,KAAL,CAAWtB,KAAK,CAACoB,KAAjB,CAAd;AACA,QAAMG,qBAAqB,GAAG,CAACF,IAAI,CAACG,GAAL,CAAStB,YAAY,GAAGkB,KAAxB,CAA/B;AACA,QAAMK,cAAc,GAAG,2CAAuBF,qBAAvB,CAAvB;;AACA,QAAMnB,IAAI,GAAGsB,eAAMC,OAAN,CAAmB,MAAM;AAClC,QAAI,CAACrB,IAAL,EAAW,OAAOD,KAAP;;AAEX,QAAIA,KAAK,CAACuB,MAAN,KAAiB,CAArB,EAAwB;AACpB,aAAO,CAACvB,KAAK,CAAC,CAAD,CAAN,EAAWA,KAAK,CAAC,CAAD,CAAhB,EAAqBA,KAAK,CAAC,CAAD,CAA1B,CAAP;AACH;;AAED,QAAIA,KAAK,CAACuB,MAAN,KAAiB,CAArB,EAAwB;AACpB,aAAO,CAACvB,KAAK,CAAC,CAAD,CAAN,EAAWA,KAAK,CAAC,CAAD,CAAhB,EAAqBA,KAAK,CAAC,CAAD,CAA1B,EAA+BA,KAAK,CAAC,CAAD,CAApC,CAAP;AACH;;AAED,WAAOA,KAAP;AACH,GAZY,EAYV,CAACA,KAAD,EAAQC,IAAR,CAZU,CAAb;;AAcA,QAAMuB,kBAAkB,GAAG,sCAAgBT,KAAhB,EAAuBhB,IAAI,CAACwB,MAA5B,CAA3B;AAEA,QAAME,eAAe,GAAG,4CAAmB;AACvCC,IAAAA,cAAc,EAAE1B,KAAK,CAACuB,MADiB;AAEvCA,IAAAA,MAAM,EAAExB,IAAI,CAACwB,MAF0B;AAGvCH,IAAAA,cAHuC;AAIvCL,IAAAA,KAJuC;AAKvCd,IAAAA,IALuC;AAMvC0B,IAAAA,QAAQ,EAAGC,CAAD,IAAOjB,YAAY,IAAI,oCAAQA,YAAR,EAAsBiB,CAAtB;AANM,GAAnB,CAAxB;AASA,QAAMC,kBAAkB,GAAG,kDAAsB;AAC7C5B,IAAAA,IAD6C;AAE7Cc,IAAAA,KAF6C;AAG7CK,IAAAA,cAH6C;AAI7CK,IAAAA,eAJ6C;AAK7CK,IAAAA,OAAO,EAAE,CAAC/B,IAAI,CAACwB,MAL8B;AAM7CQ,IAAAA,aAAa,EAAE,MAAM,oCAAQA,aAAR,GANwB;AAO7CC,IAAAA,WAAW,EAAE,MAAM,oCAAQA,WAAR;AAP0B,GAAtB,CAA3B;AAUA,QAAM;AAAEC,IAAAA,GAAF;AAAOC,IAAAA;AAAP,MAAiB,8BAAY;AAC/B/B,IAAAA,QAD+B;AAE/BE,IAAAA,gBAF+B;AAG/BD,IAAAA,eAH+B;AAI/ByB,IAAAA;AAJ+B,GAAZ,CAAvB;AAOA,QAAM;AAAEM,IAAAA,KAAF;AAASC,IAAAA,cAAT;AAAyBC,IAAAA,WAAzB;AAAsCC,IAAAA;AAAtC,MACFb,eADJ;;AAGA,QAAMM,aAAa,GAAGV,eAAMkB,WAAN,CAAkB,MAAM;AAAA;;AAC1CL,IAAAA,KAAK;AACL,4BAAAvC,KAAK,CAACoC,aAAN,mFAAApC,KAAK;AACR,GAHqB,EAGnB,CAACuC,KAAD,EAAQvC,KAAR,CAHmB,CAAtB;;AAKA,QAAMqC,WAAW,GAAGX,eAAMkB,WAAN,CAAkB,MAAM;AAAA;;AACxCN,IAAAA,GAAG;AACHK,IAAAA,aAAa;AACb,0BAAA3C,KAAK,CAACqC,WAAN,+EAAArC,KAAK,EAAeyC,cAAc,CAACI,OAA9B,EAAuCH,WAAW,CAACG,OAAnD,CAAL;AACH,GAJmB,EAIjB,CAACJ,cAAD,EAAiBC,WAAjB,EAA8BC,aAA9B,EAA6C3C,KAA7C,EAAoDsC,GAApD,CAJiB,CAApB;;AAMA,QAAMQ,OAAO,GAAG,4CAAgB,MAAM;AAClC,UAAMC,CAAC,GAAGtB,cAAc,CAACuB,KAAf,GAAuBnB,kBAAkB,CAACoB,WAApD;;AAEA,QAAI,CAAC3C,IAAL,EAAW;AACP,aAAOmB,cAAc,CAACuB,KAAtB;AACH;;AACD,WAAOE,KAAK,CAACH,CAAD,CAAL,GAAW,CAAX,GAAeA,CAAtB;AACH,GAPe,EAOb,CAAClB,kBAAD,EAAqBvB,IAArB,CAPa,CAAhB;AASA,kDACI,MAAMwC,OAAO,CAACE,KADlB,EAEKA,KAAD,IAAW;AACP,QAAIG,gBAAgB,GAAG9B,IAAI,CAACG,GAAL,CAASwB,KAAK,GAAG5B,KAAjB,CAAvB;;AACA,QAAI4B,KAAK,GAAG,CAAZ,EAAe;AACXG,MAAAA,gBAAgB,GAAG/C,IAAI,CAACwB,MAAL,GAAcuB,gBAAjC;AACH;;AACD,KAAC,CAAClC,gBAAF,IACI,oCAAQA,gBAAR,EAA0B+B,KAA1B,EAAiCG,gBAAjC,CADJ;AAEH,GATL,EAUI,CAAClC,gBAAD,EAAmBb,IAAnB,CAVJ;;AAaA,QAAMgD,IAAI,GAAG1B,eAAMkB,WAAN,CAAkB,MAAM;AACjC,WAAOV,kBAAkB,CAACkB,IAAnB,EAAP;AACH,GAFY,EAEV,CAAClB,kBAAD,CAFU,CAAb;;AAIA,QAAMmB,IAAI,GAAG3B,eAAMkB,WAAN,CAAkB,MAAM;AACjC,WAAOV,kBAAkB,CAACmB,IAAnB,EAAP;AACH,GAFY,EAEV,CAACnB,kBAAD,CAFU,CAAb;;AAIA,QAAMoB,eAAe,GAAG5B,eAAMkB,WAAN,CAAkB,MAAM;AAC5C,WAAOJ,KAAK,CAACQ,KAAb;AACH,GAFuB,EAErB,CAACR,KAAD,CAFqB,CAAxB;;AAIA,QAAMe,SAAS,GAAG7B,eAAMkB,WAAN,CACd,CAACX,CAAD,EAAYuB,QAAZ,KAAmC;AAC/BtB,IAAAA,kBAAkB,CAACuB,EAAnB,CAAsBxB,CAAtB,EAAyBuB,QAAzB;AACH,GAHa,EAId,CAACtB,kBAAD,CAJc,CAAlB;;AAOA,QAAMwB,yBAAyB,GAC3B,sDACI;AACIC,IAAAA,OAAO,EAAE,CAACC,CAAD,EAAIC,GAAJ,KAAiB;AACtB,0CAAQtB,KAAR;AACA,0CAAQH,aAAR;AACA,kDAAgBX,cAAhB;AACAoC,MAAAA,GAAG,CAACC,qBAAJ,GAA4BrC,cAAc,CAACuB,KAA3C;AACAa,MAAAA,GAAG,CAACE,KAAJ,GAAY,IAAZ;AACH,KAPL;AAQIC,IAAAA,QAAQ,EAAE,CAACC,CAAD,EAAIJ,GAAJ,KAAiB;AACvB,YAAM;AAAEK,QAAAA;AAAF,UAAmBD,CAAzB;;AACA,UACI,CAAC3D,IAAD,KACCmB,cAAc,CAACuB,KAAf,IAAwB,CAAxB,IACGvB,cAAc,CAACuB,KAAf,IAAwB,EAAE5C,IAAI,CAACwB,MAAL,GAAc,CAAhB,IAAqBR,KAFjD,CADJ,EAIE;AACEK,QAAAA,cAAc,CAACuB,KAAf,GACIa,GAAG,CAACC,qBAAJ,GAA4BI,YAAY,GAAG,CAD/C;AAEA;AACH;;AACDzC,MAAAA,cAAc,CAACuB,KAAf,GACIa,GAAG,CAACC,qBAAJ,GAA4BI,YADhC;AAEH,KArBL;AAsBIC,IAAAA,KAAK,EAAGF,CAAD,IAAO;AACV,eAASG,sBAAT,CAAgCC,GAAhC,EAA6C;AACzC,eAAO,uCACHA,GADG,EAEHC,MAAM,CAACC,MAAP,CAAc,EAAd,EAAkBrD,YAAlB,EAAgC;AAC5BsD,UAAAA,QAAQ,EAAEP,CAAC,CAACQ;AADgB,SAAhC,CAFG,EAKFC,UAAD,IAAgB;AACZ,cAAIA,UAAJ,EAAgB;AACZ,gDAAQrC,WAAR;AACH;AACJ,SATE,CAAP;AAWH;;AAED,YAAMsC,IAAI,GAAGtD,IAAI,CAACC,KAAL,CAAWG,cAAc,CAACuB,KAAf,GAAuB5B,KAAlC,CAAb;AAEA,YAAMwD,YAAY,GAAGvD,IAAI,CAACC,KAAL,CACjB,CAACG,cAAc,CAACuB,KAAf,GAAuBiB,CAAC,CAACQ,SAA1B,IAAuCrD,KADtB,CAArB;AAIA,UAAIyD,gBAAgB,GAAGxD,IAAI,CAACyD,GAAL,CACnBH,IAAI,GAAG,CADY,EAEnBtD,IAAI,CAAC0D,GAAL,CAASJ,IAAI,GAAG,CAAhB,EAAmBC,YAAnB,CAFmB,CAAvB;;AAKA,UAAI,CAACtE,IAAL,EAAW;AACPuE,QAAAA,gBAAgB,GAAGxD,IAAI,CAAC0D,GAAL,CACf,EAAE3E,IAAI,CAACwB,MAAL,GAAc,CAAhB,CADe,EAEfP,IAAI,CAACyD,GAAL,CAAS,CAAT,EAAYD,gBAAZ,CAFe,CAAnB;AAIH;;AAED,UAAIvE,IAAJ,EAAU;AACNmB,QAAAA,cAAc,CAACuB,KAAf,GAAuBoB,sBAAsB,CACzCS,gBAAgB,GAAGzD,KADsB,CAA7C;AAGA;AACH;;AACD,UAAIK,cAAc,CAACuB,KAAf,IAAwB,CAA5B,EAA+B;AAC3BvB,QAAAA,cAAc,CAACuB,KAAf,GAAuBoB,sBAAsB,CAAC,CAAD,CAA7C;AACA;AACH;;AAED,UAAI3C,cAAc,CAACuB,KAAf,IAAwB,EAAE5C,IAAI,CAACwB,MAAL,GAAc,CAAhB,IAAqBR,KAAjD,EAAwD;AACpDK,QAAAA,cAAc,CAACuB,KAAf,GAAuBoB,sBAAsB,CACzC,EAAEhE,IAAI,CAACwB,MAAL,GAAc,CAAhB,IAAqBR,KADoB,CAA7C;AAGA;AACH;;AAEDK,MAAAA,cAAc,CAACuB,KAAf,GAAuBoB,sBAAsB,CACzCS,gBAAgB,GAAGzD,KADsB,CAA7C;AAGH;AA5EL,GADJ,EA+EI,CAACd,IAAD,EAAOF,IAAP,EAAagC,aAAb,EAA4BC,WAA5B,CA/EJ,CADJ;;AAmFAX,iBAAMsD,mBAAN,CACI/E,GADJ,EAEI,OAAO;AACHmD,IAAAA,IADG;AAEHC,IAAAA,IAFG;AAGHC,IAAAA,eAHG;AAIHC,IAAAA;AAJG,GAAP,CAFJ,EAQI,CAACD,eAAD,EAAkBC,SAAlB,EAA6BH,IAA7B,EAAmCC,IAAnC,CARJ;;AAWA,QAAM4B,YAAY,GAAGvD,eAAMkB,WAAN,CACjB,CAACsC,IAAD,EAAUjD,CAAV,KAAwB;AACpB,YAAQ1B,IAAR;AACI,WAAK,UAAL;AACI,4BACI,6BAAC,qBAAD;AACI,UAAA,uBAAuB,EAAEI,uBAD7B;AAEI,UAAA,sBAAsB,EAAEC,sBAF5B;AAGI,UAAA,kBAAkB,EAAEiB,kBAHxB;AAII,UAAA,KAAK,EAAET,KAJX;AAKI,UAAA,cAAc,EAAE0B,OALpB;AAMI,UAAA,KAAK,EAAEb,CANX;AAOI,UAAA,GAAG,EAAEA,CAPT;AAQI,UAAA,IAAI,EAAE3B;AARV,WAUKS,UAAU,CAACmE,IAAD,EAAOjD,CAAP,CAVf,CADJ;;AAcJ;AACI,4BACI,6BAAC,0BAAD;AACI,UAAA,kBAAkB,EAAEJ,kBADxB;AAEI,UAAA,KAAK,EAAET,KAFX;AAGI,UAAA,MAAM,EAAEjB,MAHZ;AAII,UAAA,cAAc,EAAE2C,OAJpB;AAKI,UAAA,KAAK,EAAEb,CALX;AAMI,UAAA,GAAG,EAAEA,CANT;AAOI,UAAA,IAAI,EAAE3B;AAPV,WASKS,UAAU,CAACmE,IAAD,EAAOjD,CAAP,CATf,CADJ;AAjBR;AA+BH,GAjCgB,EAkCjB,CACI3B,IADJ,EAEIC,IAFJ,EAGIsB,kBAHJ,EAII1B,MAJJ,EAKI2C,OALJ,EAMInC,uBANJ,EAOIC,sBAPJ,EAQIQ,KARJ,EASIL,UATJ,CAlCiB,CAArB;;AA+CA,sBACI,6BAAC,4CAAD,eACQD,sBADR;AAEI,IAAA,cAAc,EAAE4C;AAFpB,mBAII,6BAAC,8BAAD,CAAU,IAAV;AACI;AACA,IAAA,KAAK,EAAE,EACH,GAAG7C,KADA;AAEHO,MAAAA,KAFG;AAGHjB,MAAAA,MAHG;AAIHgF,MAAAA,aAAa,EAAE,KAJZ;AAKHC,MAAAA,QAAQ,EAAE;AALP;AAFX,KAUKhF,IAAI,CAACiF,GAAL,CAASJ,YAAT,CAVL,CAJJ,CADJ;AAmBH;;4BAEcvD,eAAM4D,UAAN,CAAiBvF,QAAjB,C","sourcesContent":["import React from 'react';\nimport type { FlexStyle, ViewStyle } from 'react-native';\nimport {\n PanGestureHandler,\n PanGestureHandlerProps,\n PanGestureHandlerGestureEvent,\n} from 'react-native-gesture-handler';\nimport Animated, {\n cancelAnimation,\n runOnJS,\n useAnimatedGestureHandler,\n useAnimatedReaction,\n useDerivedValue,\n useSharedValue,\n withSpring,\n} from 'react-native-reanimated';\nimport { CarouselItem } from './CarouselItem';\nimport type { TMode } from './layouts';\nimport { ParallaxLayout } from './layouts/index';\nimport { useCarouselController } from './hooks/useCarouselController';\nimport { useComputedAnim } from './hooks/useComputedAnim';\nimport { useAutoPlay } from './hooks/useAutoPlay';\nimport { useIndexController } from './hooks/useIndexController';\nimport { usePropsErrorBoundary } from './hooks/usePropsErrorBoundary';\n\nconst defaultSpringConfig: Animated.WithSpringConfig = {\n damping: 100,\n};\nexport interface ICarouselProps<T extends unknown> {\n ref?: React.Ref<ICarouselInstance>;\n /**\n * Carousel loop playback.\n * @default true\n */\n loop?: boolean;\n /**\n * Carousel Animated transitions.\n * @default 'default'\n */\n mode?: TMode;\n /**\n * Specified carousel container width.\n */\n width: number;\n /**\n * Specified carousel container height.\n * @default '100%'\n */\n height?: FlexStyle['height'];\n /**\n * Carousel items data set.\n */\n data: T[];\n /**\n * Default index\n * @default 0\n */\n defaultIndex?: number;\n /**\n * Auto play\n */\n autoPlay?: boolean;\n /**\n * Auto play\n * @description reverse playback\n */\n autoPlayReverse?: boolean;\n /**\n * Auto play\n * @description playback interval\n */\n autoPlayInterval?: number;\n /**\n * Carousel container style\n */\n style?: ViewStyle;\n /**\n * When use 'default' Layout props,this prop can be control prev/next item offset.\n * @default 100\n */\n parallaxScrollingOffset?: number;\n /**\n * When use 'default' Layout props,this prop can be control prev/next item offset.\n * @default 0.8\n */\n parallaxScrollingScale?: number;\n /**\n * Sping config of translation animated\n */\n springConfig?: Animated.WithSpringConfig;\n /**\n * PanGestureHandler props\n */\n panGestureHandlerProps?: Omit<\n Partial<PanGestureHandlerProps>,\n 'onHandlerStateChange'\n >;\n /**\n * Render carousel item.\n */\n renderItem: (data: T, index: number) => React.ReactNode;\n /**\n * Callback fired when navigating to an item\n */\n onSnapToItem?: (index: number) => void;\n /**\n * On scroll begin\n */\n onScrollBegin?: () => void;\n /**\n * On scroll end\n */\n onScrollEnd?: (previous: number, current: number) => void;\n /**\n * On progress change\n * @param offsetProgress Total of offset distance (0 390 780 ...)\n * @param absoluteProgress Convert to index (0 1 2 ...)\n */\n onProgressChange?: (\n offsetProgress: number,\n absoluteProgress: number\n ) => void;\n}\n\nexport interface ICarouselInstance {\n /**\n * Play the last one\n */\n prev: () => void;\n /**\n * Play the next one\n */\n next: () => void;\n /**\n * Get current item index\n */\n getCurrentIndex: () => number;\n /**\n * Go to index\n */\n goToIndex: (index: number, animated?: boolean) => void;\n}\n\nfunction Carousel<T extends unknown = any>(\n props: ICarouselProps<T>,\n ref: React.Ref<ICarouselInstance>\n) {\n const {\n defaultIndex = 0,\n height = '100%',\n data: _data = [],\n loop = true,\n mode = 'default',\n autoPlay,\n autoPlayReverse,\n autoPlayInterval = 1000,\n parallaxScrollingOffset,\n parallaxScrollingScale,\n style,\n panGestureHandlerProps = {},\n renderItem,\n onSnapToItem,\n onProgressChange,\n } = props;\n\n usePropsErrorBoundary({\n ...props,\n defaultIndex,\n height,\n data: _data,\n loop,\n mode,\n autoPlay,\n autoPlayReverse,\n autoPlayInterval,\n parallaxScrollingOffset,\n parallaxScrollingScale,\n style,\n panGestureHandlerProps,\n // @ts-ignore\n renderItem,\n onSnapToItem,\n onProgressChange,\n });\n\n const timingConfig = {\n ...defaultSpringConfig,\n ...props.springConfig,\n };\n const width = Math.round(props.width);\n const defaultHandlerOffsetX = -Math.abs(defaultIndex * width);\n const handlerOffsetX = useSharedValue<number>(defaultHandlerOffsetX);\n const data = React.useMemo<T[]>(() => {\n if (!loop) return _data;\n\n if (_data.length === 1) {\n return [_data[0], _data[0], _data[0]];\n }\n\n if (_data.length === 2) {\n return [_data[0], _data[1], _data[0], _data[1]];\n }\n\n return _data;\n }, [_data, loop]);\n\n const computedAnimResult = useComputedAnim(width, data.length);\n\n const indexController = useIndexController({\n originalLength: _data.length,\n length: data.length,\n handlerOffsetX,\n width,\n loop,\n onChange: (i) => onSnapToItem && runOnJS(onSnapToItem)(i),\n });\n\n const carouselController = useCarouselController({\n loop,\n width,\n handlerOffsetX,\n indexController,\n disable: !data.length,\n onScrollBegin: () => runOnJS(onScrollBegin)(),\n onScrollEnd: () => runOnJS(onScrollEnd)(),\n });\n\n const { run, pause } = useAutoPlay({\n autoPlay,\n autoPlayInterval,\n autoPlayReverse,\n carouselController,\n });\n\n const { index, sharedPreIndex, sharedIndex, computedIndex } =\n indexController;\n\n const onScrollBegin = React.useCallback(() => {\n pause();\n props.onScrollBegin?.();\n }, [pause, props]);\n\n const onScrollEnd = React.useCallback(() => {\n run();\n computedIndex();\n props.onScrollEnd?.(sharedPreIndex.current, sharedIndex.current);\n }, [sharedPreIndex, sharedIndex, computedIndex, props, run]);\n\n const offsetX = useDerivedValue(() => {\n const x = handlerOffsetX.value % computedAnimResult.TOTAL_WIDTH;\n\n if (!loop) {\n return handlerOffsetX.value;\n }\n return isNaN(x) ? 0 : x;\n }, [computedAnimResult, loop]);\n\n useAnimatedReaction(\n () => offsetX.value,\n (value) => {\n let absoluteProgress = Math.abs(value / width);\n if (value > 0) {\n absoluteProgress = data.length - absoluteProgress;\n }\n !!onProgressChange &&\n runOnJS(onProgressChange)(value, absoluteProgress);\n },\n [onProgressChange, data]\n );\n\n const next = React.useCallback(() => {\n return carouselController.next();\n }, [carouselController]);\n\n const prev = React.useCallback(() => {\n return carouselController.prev();\n }, [carouselController]);\n\n const getCurrentIndex = React.useCallback(() => {\n return index.value;\n }, [index]);\n\n const goToIndex = React.useCallback(\n (i: number, animated?: boolean) => {\n carouselController.to(i, animated);\n },\n [carouselController]\n );\n\n const animatedListScrollHandler =\n useAnimatedGestureHandler<PanGestureHandlerGestureEvent>(\n {\n onStart: (_, ctx: any) => {\n runOnJS(pause)();\n runOnJS(onScrollBegin)();\n cancelAnimation(handlerOffsetX);\n ctx.currentContentOffsetX = handlerOffsetX.value;\n ctx.start = true;\n },\n onActive: (e, ctx: any) => {\n const { translationX } = e;\n if (\n !loop &&\n (handlerOffsetX.value >= 0 ||\n handlerOffsetX.value <= -(data.length - 1) * width)\n ) {\n handlerOffsetX.value =\n ctx.currentContentOffsetX + translationX / 2;\n return;\n }\n handlerOffsetX.value =\n ctx.currentContentOffsetX + translationX;\n },\n onEnd: (e) => {\n function _withAnimationCallback(num: number) {\n return withSpring(\n num,\n Object.assign({}, timingConfig, {\n velocity: e.velocityX,\n }),\n (isFinished) => {\n if (isFinished) {\n runOnJS(onScrollEnd)();\n }\n }\n );\n }\n\n const page = Math.round(handlerOffsetX.value / width);\n\n const velocityPage = Math.round(\n (handlerOffsetX.value + e.velocityX) / width\n );\n\n let pageWithVelocity = Math.min(\n page + 1,\n Math.max(page - 1, velocityPage)\n );\n\n if (!loop) {\n pageWithVelocity = Math.max(\n -(data.length - 1),\n Math.min(0, pageWithVelocity)\n );\n }\n\n if (loop) {\n handlerOffsetX.value = _withAnimationCallback(\n pageWithVelocity * width\n );\n return;\n }\n if (handlerOffsetX.value >= 0) {\n handlerOffsetX.value = _withAnimationCallback(0);\n return;\n }\n\n if (handlerOffsetX.value <= -(data.length - 1) * width) {\n handlerOffsetX.value = _withAnimationCallback(\n -(data.length - 1) * width\n );\n return;\n }\n\n handlerOffsetX.value = _withAnimationCallback(\n pageWithVelocity * width\n );\n },\n },\n [loop, data, onScrollBegin, onScrollEnd]\n );\n\n React.useImperativeHandle(\n ref,\n () => ({\n next,\n prev,\n getCurrentIndex,\n goToIndex,\n }),\n [getCurrentIndex, goToIndex, next, prev]\n );\n\n const renderLayout = React.useCallback(\n (item: T, i: number) => {\n switch (mode) {\n case 'parallax':\n return (\n <ParallaxLayout\n parallaxScrollingOffset={parallaxScrollingOffset}\n parallaxScrollingScale={parallaxScrollingScale}\n computedAnimResult={computedAnimResult}\n width={width}\n handlerOffsetX={offsetX}\n index={i}\n key={i}\n loop={loop}\n >\n {renderItem(item, i)}\n </ParallaxLayout>\n );\n default:\n return (\n <CarouselItem\n computedAnimResult={computedAnimResult}\n width={width}\n height={height}\n handlerOffsetX={offsetX}\n index={i}\n key={i}\n loop={loop}\n >\n {renderItem(item, i)}\n </CarouselItem>\n );\n }\n },\n [\n loop,\n mode,\n computedAnimResult,\n height,\n offsetX,\n parallaxScrollingOffset,\n parallaxScrollingScale,\n width,\n renderItem,\n ]\n );\n\n return (\n <PanGestureHandler\n {...panGestureHandlerProps}\n onGestureEvent={animatedListScrollHandler}\n >\n <Animated.View\n // eslint-disable-next-line react-native/no-inline-styles\n style={{\n ...style,\n width,\n height,\n flexDirection: 'row',\n position: 'relative',\n }}\n >\n {data.map(renderLayout)}\n </Animated.View>\n </PanGestureHandler>\n );\n}\n\nexport default React.forwardRef(Carousel) as typeof Carousel;\n"]}
1
+ {"version":3,"sources":["Carousel.tsx"],"names":["defaultSpringConfig","damping","Carousel","props","ref","defaultIndex","height","data","_data","loop","mode","autoPlay","autoPlayReverse","autoPlayInterval","parallaxScrollingOffset","parallaxScrollingScale","style","panGestureHandlerProps","renderItem","onSnapToItem","onProgressChange","timingConfig","springConfig","width","Math","round","defaultHandlerOffsetX","abs","handlerOffsetX","React","useMemo","length","indexController","originalLength","onChange","i","carouselController","disable","onScrollBegin","onScrollEnd","run","pause","index","sharedPreIndex","sharedIndex","computedIndex","useCallback","current","offsetX","totalWidth","x","value","isNaN","absoluteProgress","next","prev","getCurrentIndex","goToIndex","animated","to","animatedListScrollHandler","onStart","_","ctx","currentContentOffsetX","start","onActive","e","translationX","onEnd","_withAnimationCallback","num","Object","assign","velocity","velocityX","isFinished","page","velocityPage","pageWithVelocity","min","max","useImperativeHandle","renderLayout","item","flexDirection","position","map","forwardRef"],"mappings":"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","sourcesContent":["import React from 'react';\nimport type { FlexStyle, ViewStyle } from 'react-native';\nimport {\n PanGestureHandler,\n PanGestureHandlerProps,\n PanGestureHandlerGestureEvent,\n} from 'react-native-gesture-handler';\nimport Animated, {\n cancelAnimation,\n runOnJS,\n useAnimatedGestureHandler,\n useAnimatedReaction,\n useDerivedValue,\n useSharedValue,\n withSpring,\n} from 'react-native-reanimated';\nimport { CarouselItem } from './CarouselItem';\nimport type { TMode } from './layouts';\nimport { ParallaxLayout } from './layouts/index';\nimport { useCarouselController } from './hooks/useCarouselController';\nimport { useAutoPlay } from './hooks/useAutoPlay';\nimport { useIndexController } from './hooks/useIndexController';\nimport { usePropsErrorBoundary } from './hooks/usePropsErrorBoundary';\n\nconst defaultSpringConfig: Animated.WithSpringConfig = {\n damping: 100,\n};\nexport interface ICarouselProps<T extends unknown> {\n ref?: React.Ref<ICarouselInstance>;\n /**\n * Carousel loop playback.\n * @default true\n */\n loop?: boolean;\n /**\n * Carousel Animated transitions.\n * @default 'default'\n */\n mode?: TMode;\n /**\n * Specified carousel container width.\n */\n width: number;\n /**\n * Specified carousel container height.\n * @default '100%'\n */\n height?: FlexStyle['height'];\n /**\n * Carousel items data set.\n */\n data: T[];\n /**\n * Default index\n * @default 0\n */\n defaultIndex?: number;\n /**\n * Auto play\n */\n autoPlay?: boolean;\n /**\n * Auto play\n * @description reverse playback\n */\n autoPlayReverse?: boolean;\n /**\n * Auto play\n * @description playback interval\n */\n autoPlayInterval?: number;\n /**\n * Carousel container style\n */\n style?: ViewStyle;\n /**\n * When use 'default' Layout props,this prop can be control prev/next item offset.\n * @default 100\n */\n parallaxScrollingOffset?: number;\n /**\n * When use 'default' Layout props,this prop can be control prev/next item offset.\n * @default 0.8\n */\n parallaxScrollingScale?: number;\n /**\n * Sping config of translation animated\n */\n springConfig?: Animated.WithSpringConfig;\n /**\n * PanGestureHandler props\n */\n panGestureHandlerProps?: Omit<\n Partial<PanGestureHandlerProps>,\n 'onHandlerStateChange'\n >;\n /**\n * Render carousel item.\n */\n renderItem: (data: T, index: number) => React.ReactNode;\n /**\n * Callback fired when navigating to an item\n */\n onSnapToItem?: (index: number) => void;\n /**\n * On scroll begin\n */\n onScrollBegin?: () => void;\n /**\n * On scroll end\n */\n onScrollEnd?: (previous: number, current: number) => void;\n /**\n * On progress change\n * @param offsetProgress Total of offset distance (0 390 780 ...)\n * @param absoluteProgress Convert to index (0 1 2 ...)\n */\n onProgressChange?: (\n offsetProgress: number,\n absoluteProgress: number\n ) => void;\n}\n\nexport interface ICarouselInstance {\n /**\n * Play the last one\n */\n prev: () => void;\n /**\n * Play the next one\n */\n next: () => void;\n /**\n * Get current item index\n */\n getCurrentIndex: () => number;\n /**\n * Go to index\n */\n goToIndex: (index: number, animated?: boolean) => void;\n}\n\nfunction Carousel<T extends unknown = any>(\n props: ICarouselProps<T>,\n ref: React.Ref<ICarouselInstance>\n) {\n const {\n defaultIndex = 0,\n height = '100%',\n data: _data = [],\n loop = true,\n mode = 'default',\n autoPlay,\n autoPlayReverse,\n autoPlayInterval = 1000,\n parallaxScrollingOffset,\n parallaxScrollingScale,\n style,\n panGestureHandlerProps = {},\n renderItem,\n onSnapToItem,\n onProgressChange,\n } = props;\n\n usePropsErrorBoundary({\n ...props,\n defaultIndex,\n height,\n data: _data,\n loop,\n mode,\n autoPlay,\n autoPlayReverse,\n autoPlayInterval,\n parallaxScrollingOffset,\n parallaxScrollingScale,\n style,\n panGestureHandlerProps,\n // @ts-ignore\n renderItem,\n onSnapToItem,\n onProgressChange,\n });\n\n const timingConfig = {\n ...defaultSpringConfig,\n ...props.springConfig,\n };\n const width = Math.round(props.width);\n const defaultHandlerOffsetX = -Math.abs(defaultIndex * width);\n const handlerOffsetX = useSharedValue<number>(defaultHandlerOffsetX);\n const data = React.useMemo<T[]>(() => {\n if (!loop) return _data;\n\n if (_data.length === 1) {\n return [_data[0], _data[0], _data[0]];\n }\n\n if (_data.length === 2) {\n return [_data[0], _data[1], _data[0], _data[1]];\n }\n\n return _data;\n }, [_data, loop]);\n\n const indexController = useIndexController({\n originalLength: _data.length,\n length: data.length,\n handlerOffsetX,\n width,\n loop,\n onChange: (i) => onSnapToItem && runOnJS(onSnapToItem)(i),\n });\n\n const carouselController = useCarouselController({\n loop,\n width,\n handlerOffsetX,\n indexController,\n disable: !data.length,\n onScrollBegin: () => runOnJS(onScrollBegin)(),\n onScrollEnd: () => runOnJS(onScrollEnd)(),\n });\n\n const { run, pause } = useAutoPlay({\n autoPlay,\n autoPlayInterval,\n autoPlayReverse,\n carouselController,\n });\n\n const { index, sharedPreIndex, sharedIndex, computedIndex } =\n indexController;\n\n const onScrollBegin = React.useCallback(() => {\n pause();\n props.onScrollBegin?.();\n }, [pause, props]);\n\n const onScrollEnd = React.useCallback(() => {\n run();\n computedIndex();\n props.onScrollEnd?.(sharedPreIndex.current, sharedIndex.current);\n }, [sharedPreIndex, sharedIndex, computedIndex, props, run]);\n\n const offsetX = useDerivedValue(() => {\n const totalWidth = width * data.length;\n const x = handlerOffsetX.value % totalWidth;\n\n if (!loop) {\n return handlerOffsetX.value;\n }\n return isNaN(x) ? 0 : x;\n }, [loop, width, data]);\n\n useAnimatedReaction(\n () => offsetX.value,\n (value) => {\n let absoluteProgress = Math.abs(value / width);\n if (value > 0) {\n absoluteProgress = data.length - absoluteProgress;\n }\n !!onProgressChange &&\n runOnJS(onProgressChange)(value, absoluteProgress);\n },\n [onProgressChange, data]\n );\n\n const next = React.useCallback(() => {\n return carouselController.next();\n }, [carouselController]);\n\n const prev = React.useCallback(() => {\n return carouselController.prev();\n }, [carouselController]);\n\n const getCurrentIndex = React.useCallback(() => {\n return index.value;\n }, [index]);\n\n const goToIndex = React.useCallback(\n (i: number, animated?: boolean) => {\n carouselController.to(i, animated);\n },\n [carouselController]\n );\n\n const animatedListScrollHandler =\n useAnimatedGestureHandler<PanGestureHandlerGestureEvent>(\n {\n onStart: (_, ctx: any) => {\n runOnJS(pause)();\n runOnJS(onScrollBegin)();\n cancelAnimation(handlerOffsetX);\n ctx.currentContentOffsetX = handlerOffsetX.value;\n ctx.start = true;\n },\n onActive: (e, ctx: any) => {\n const { translationX } = e;\n if (\n !loop &&\n (handlerOffsetX.value >= 0 ||\n handlerOffsetX.value <= -(data.length - 1) * width)\n ) {\n handlerOffsetX.value =\n ctx.currentContentOffsetX + translationX / 2;\n return;\n }\n handlerOffsetX.value =\n ctx.currentContentOffsetX + translationX;\n },\n onEnd: (e) => {\n function _withAnimationCallback(num: number) {\n return withSpring(\n num,\n Object.assign({}, timingConfig, {\n velocity: e.velocityX,\n }),\n (isFinished) => {\n if (isFinished) {\n runOnJS(onScrollEnd)();\n }\n }\n );\n }\n\n const page = Math.round(handlerOffsetX.value / width);\n\n const velocityPage = Math.round(\n (handlerOffsetX.value + e.velocityX) / width\n );\n\n let pageWithVelocity = Math.min(\n page + 1,\n Math.max(page - 1, velocityPage)\n );\n\n if (!loop) {\n pageWithVelocity = Math.max(\n -(data.length - 1),\n Math.min(0, pageWithVelocity)\n );\n }\n\n if (loop) {\n handlerOffsetX.value = _withAnimationCallback(\n pageWithVelocity * width\n );\n return;\n }\n if (handlerOffsetX.value >= 0) {\n handlerOffsetX.value = _withAnimationCallback(0);\n return;\n }\n\n if (handlerOffsetX.value <= -(data.length - 1) * width) {\n handlerOffsetX.value = _withAnimationCallback(\n -(data.length - 1) * width\n );\n return;\n }\n\n handlerOffsetX.value = _withAnimationCallback(\n pageWithVelocity * width\n );\n },\n },\n [loop, data, onScrollBegin, onScrollEnd]\n );\n\n React.useImperativeHandle(\n ref,\n () => ({\n next,\n prev,\n getCurrentIndex,\n goToIndex,\n }),\n [getCurrentIndex, goToIndex, next, prev]\n );\n\n const renderLayout = React.useCallback(\n (item: T, i: number) => {\n switch (mode) {\n case 'parallax':\n return (\n <ParallaxLayout\n parallaxScrollingOffset={parallaxScrollingOffset}\n parallaxScrollingScale={parallaxScrollingScale}\n data={data}\n width={width}\n handlerOffsetX={offsetX}\n index={i}\n key={i}\n loop={loop}\n >\n {renderItem(item, i)}\n </ParallaxLayout>\n );\n default:\n return (\n <CarouselItem\n data={data}\n width={width}\n height={height}\n handlerOffsetX={offsetX}\n index={i}\n key={i}\n loop={loop}\n >\n {renderItem(item, i)}\n </CarouselItem>\n );\n }\n },\n [\n loop,\n mode,\n data,\n height,\n offsetX,\n parallaxScrollingOffset,\n parallaxScrollingScale,\n width,\n renderItem,\n ]\n );\n\n return (\n <PanGestureHandler\n {...panGestureHandlerProps}\n onGestureEvent={animatedListScrollHandler}\n >\n <Animated.View\n // eslint-disable-next-line react-native/no-inline-styles\n style={{\n ...style,\n width,\n height,\n flexDirection: 'row',\n position: 'relative',\n }}\n >\n {data.map(renderLayout)}\n </Animated.View>\n </PanGestureHandler>\n );\n}\n\nexport default React.forwardRef(Carousel) as typeof Carousel;\n"]}
@@ -26,14 +26,14 @@ const CarouselItem = props => {
26
26
  children,
27
27
  width,
28
28
  height = '100%',
29
- computedAnimResult,
30
- loop
29
+ loop,
30
+ data
31
31
  } = props;
32
32
  const x = (0, _useOffsetX.useOffsetX)({
33
33
  handlerOffsetX,
34
34
  index,
35
35
  width,
36
- computedAnimResult,
36
+ data,
37
37
  loop
38
38
  });
39
39
  const offsetXStyle = (0, _reactNativeReanimated.useAnimatedStyle)(() => {
@@ -1 +1 @@
1
- {"version":3,"sources":["CarouselItem.tsx"],"names":["CarouselItem","props","handlerOffsetX","index","children","width","height","computedAnimResult","loop","x","offsetXStyle","transform","translateX","value"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AAEA;;;;;;;;AAEO,MAAMA,YAOX,GAAIC,KAAD,IAAW;AACZ,QAAM;AACFC,IAAAA,cADE;AAEFC,IAAAA,KAFE;AAGFC,IAAAA,QAHE;AAIFC,IAAAA,KAJE;AAKFC,IAAAA,MAAM,GAAG,MALP;AAMFC,IAAAA,kBANE;AAOFC,IAAAA;AAPE,MAQFP,KARJ;AASA,QAAMQ,CAAC,GAAG,4BAAW;AACjBP,IAAAA,cADiB;AAEjBC,IAAAA,KAFiB;AAGjBE,IAAAA,KAHiB;AAIjBE,IAAAA,kBAJiB;AAKjBC,IAAAA;AALiB,GAAX,CAAV;AAOA,QAAME,YAAY,GAAG,6CAAiB,MAAM;AACxC,WAAO;AACHC,MAAAA,SAAS,EAAE,CAAC;AAAEC,QAAAA,UAAU,EAAEH,CAAC,CAACI,KAAF,GAAUV,KAAK,GAAGE;AAAhC,OAAD;AADR,KAAP;AAGH,GAJoB,EAIlB,EAJkB,CAArB;AAMA,sBACI,6BAAC,8BAAD,CAAU,IAAV;AAAe,IAAA,KAAK,EAAEK;AAAtB,kBACI,6BAAC,iBAAD;AAAM,IAAA,KAAK,EAAE;AAAEL,MAAAA,KAAF;AAASC,MAAAA;AAAT;AAAb,KAAiCF,QAAjC,CADJ,CADJ;AAKH,CAnCM","sourcesContent":["import React from 'react';\nimport { FlexStyle, View } from 'react-native';\nimport Animated, { useAnimatedStyle } from 'react-native-reanimated';\nimport type { IComputedAnimResult } from './hooks/useComputedAnim';\nimport { useOffsetX } from './hooks/useOffsetX';\n\nexport const CarouselItem: React.FC<{\n loop?: boolean;\n index: number;\n handlerOffsetX: Animated.SharedValue<number>;\n width: number;\n height?: FlexStyle['height'];\n computedAnimResult: IComputedAnimResult;\n}> = (props) => {\n const {\n handlerOffsetX,\n index,\n children,\n width,\n height = '100%',\n computedAnimResult,\n loop,\n } = props;\n const x = useOffsetX({\n handlerOffsetX,\n index,\n width,\n computedAnimResult,\n loop,\n });\n const offsetXStyle = useAnimatedStyle(() => {\n return {\n transform: [{ translateX: x.value - index * width }],\n };\n }, []);\n\n return (\n <Animated.View style={offsetXStyle}>\n <View style={{ width, height }}>{children}</View>\n </Animated.View>\n );\n};\n"]}
1
+ {"version":3,"sources":["CarouselItem.tsx"],"names":["CarouselItem","props","handlerOffsetX","index","children","width","height","loop","data","x","offsetXStyle","transform","translateX","value"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AACA;;;;;;;;AAEO,MAAMA,YAOX,GAAIC,KAAD,IAAW;AACZ,QAAM;AACFC,IAAAA,cADE;AAEFC,IAAAA,KAFE;AAGFC,IAAAA,QAHE;AAIFC,IAAAA,KAJE;AAKFC,IAAAA,MAAM,GAAG,MALP;AAMFC,IAAAA,IANE;AAOFC,IAAAA;AAPE,MAQFP,KARJ;AAUA,QAAMQ,CAAC,GAAG,4BAAW;AACjBP,IAAAA,cADiB;AAEjBC,IAAAA,KAFiB;AAGjBE,IAAAA,KAHiB;AAIjBG,IAAAA,IAJiB;AAKjBD,IAAAA;AALiB,GAAX,CAAV;AAQA,QAAMG,YAAY,GAAG,6CAAiB,MAAM;AACxC,WAAO;AACHC,MAAAA,SAAS,EAAE,CAAC;AAAEC,QAAAA,UAAU,EAAEH,CAAC,CAACI,KAAF,GAAUV,KAAK,GAAGE;AAAhC,OAAD;AADR,KAAP;AAGH,GAJoB,EAIlB,EAJkB,CAArB;AAMA,sBACI,6BAAC,8BAAD,CAAU,IAAV;AAAe,IAAA,KAAK,EAAEK;AAAtB,kBACI,6BAAC,iBAAD;AAAM,IAAA,KAAK,EAAE;AAAEL,MAAAA,KAAF;AAASC,MAAAA;AAAT;AAAb,KAAiCF,QAAjC,CADJ,CADJ;AAKH,CArCM","sourcesContent":["import React from 'react';\nimport { FlexStyle, View } from 'react-native';\nimport Animated, { useAnimatedStyle } from 'react-native-reanimated';\nimport { useOffsetX } from './hooks/useOffsetX';\n\nexport const CarouselItem: React.FC<{\n loop?: boolean;\n index: number;\n handlerOffsetX: Animated.SharedValue<number>;\n width: number;\n data: unknown[];\n height?: FlexStyle['height'];\n}> = (props) => {\n const {\n handlerOffsetX,\n index,\n children,\n width,\n height = '100%',\n loop,\n data,\n } = props;\n\n const x = useOffsetX({\n handlerOffsetX,\n index,\n width,\n data,\n loop,\n });\n\n const offsetXStyle = useAnimatedStyle(() => {\n return {\n transform: [{ translateX: x.value - index * width }],\n };\n }, []);\n\n return (\n <Animated.View style={offsetXStyle}>\n <View style={{ width, height }}>{children}</View>\n </Animated.View>\n );\n};\n"]}
@@ -12,28 +12,55 @@ const useOffsetX = opts => {
12
12
  handlerOffsetX,
13
13
  index,
14
14
  width,
15
- computedAnimResult,
16
- loop
15
+ loop,
16
+ data,
17
+ type = 'positive',
18
+ viewCount = Math.round((data.length - 1) / 2)
17
19
  } = opts;
20
+ const ITEM_LENGTH = data.length;
21
+ const VALID_LENGTH = ITEM_LENGTH - 1;
22
+ const TOTAL_WIDTH = width * ITEM_LENGTH;
23
+ const HALF_WIDTH = 0.5 * width;
18
24
  const x = (0, _reactNativeReanimated.useDerivedValue)(() => {
19
- const {
20
- MAX,
21
- MIN,
22
- TOTAL_WIDTH,
23
- HALF_WIDTH
24
- } = computedAnimResult;
25
+ const defaultPos = width * index;
25
26
 
26
27
  if (loop) {
27
- const defaultPos = width * index;
28
- const startPos = defaultPos > MAX ? MAX - defaultPos : defaultPos < MIN ? MIN - defaultPos : defaultPos;
29
- const inputRange = [-TOTAL_WIDTH, -(MAX + HALF_WIDTH) - startPos - 1, -(MAX + HALF_WIDTH) - startPos, 0, MAX + HALF_WIDTH - startPos, MAX + HALF_WIDTH - startPos + 1, TOTAL_WIDTH];
30
- const outputRange = [startPos, 1.5 * width - 1, -(MAX + HALF_WIDTH), startPos, MAX + HALF_WIDTH, -(1.5 * width - 1), startPos];
28
+ function getDefaultPos(_type, _count) {
29
+ let MAX = null;
30
+ let MIN = null;
31
+ let startPos = defaultPos;
32
+
33
+ if (_type === 'positive') {
34
+ MAX = _count * width;
35
+ MIN = -(VALID_LENGTH - _count) * width;
36
+ } else {
37
+ MAX = (VALID_LENGTH - _count) * width;
38
+ MIN = -_count * width;
39
+ }
40
+
41
+ if (defaultPos > MAX) {
42
+ startPos = MAX - defaultPos;
43
+ }
44
+
45
+ return {
46
+ startPos,
47
+ MAX,
48
+ MIN
49
+ };
50
+ }
51
+
52
+ const {
53
+ startPos,
54
+ MAX,
55
+ MIN
56
+ } = getDefaultPos(type, viewCount);
57
+ const inputRange = [-TOTAL_WIDTH, MIN - HALF_WIDTH - startPos - 1, MIN - HALF_WIDTH - startPos, 0, MAX + HALF_WIDTH - startPos, MAX + HALF_WIDTH - startPos + 1, TOTAL_WIDTH];
58
+ const outputRange = [startPos, MAX + HALF_WIDTH - 1, MIN - HALF_WIDTH, startPos, MAX + HALF_WIDTH, MIN - HALF_WIDTH + 1, startPos];
31
59
  return (0, _reactNativeReanimated.interpolate)(Math.round(handlerOffsetX.value), inputRange.map(Math.round), outputRange.map(Math.round), _reactNativeReanimated.Extrapolate.CLAMP);
32
60
  }
33
61
 
34
- const startPos = width * index;
35
- return handlerOffsetX.value + startPos;
36
- }, [loop, computedAnimResult]);
62
+ return handlerOffsetX.value + defaultPos;
63
+ }, [loop, data, viewCount, type]);
37
64
  return x;
38
65
  };
39
66
 
@@ -1 +1 @@
1
- {"version":3,"sources":["useOffsetX.ts"],"names":["useOffsetX","opts","handlerOffsetX","index","width","computedAnimResult","loop","x","MAX","MIN","TOTAL_WIDTH","HALF_WIDTH","defaultPos","startPos","inputRange","outputRange","Math","round","value","map","Extrapolate","CLAMP"],"mappings":";;;;;;;AAAA;;AAeO,MAAMA,UAAU,GAAIC,IAAD,IAAiB;AACvC,QAAM;AAAEC,IAAAA,cAAF;AAAkBC,IAAAA,KAAlB;AAAyBC,IAAAA,KAAzB;AAAgCC,IAAAA,kBAAhC;AAAoDC,IAAAA;AAApD,MAA6DL,IAAnE;AACA,QAAMM,CAAC,GAAG,4CAAgB,MAAM;AAC5B,UAAM;AAAEC,MAAAA,GAAF;AAAOC,MAAAA,GAAP;AAAYC,MAAAA,WAAZ;AAAyBC,MAAAA;AAAzB,QAAwCN,kBAA9C;;AACA,QAAIC,IAAJ,EAAU;AACN,YAAMM,UAAU,GAAGR,KAAK,GAAGD,KAA3B;AACA,YAAMU,QAAQ,GACVD,UAAU,GAAGJ,GAAb,GACMA,GAAG,GAAGI,UADZ,GAEMA,UAAU,GAAGH,GAAb,GACAA,GAAG,GAAGG,UADN,GAEAA,UALV;AAOA,YAAME,UAAU,GAAG,CACf,CAACJ,WADc,EAEf,EAAEF,GAAG,GAAGG,UAAR,IAAsBE,QAAtB,GAAiC,CAFlB,EAGf,EAAEL,GAAG,GAAGG,UAAR,IAAsBE,QAHP,EAIf,CAJe,EAKfL,GAAG,GAAGG,UAAN,GAAmBE,QALJ,EAMfL,GAAG,GAAGG,UAAN,GAAmBE,QAAnB,GAA8B,CANf,EAOfH,WAPe,CAAnB;AAUA,YAAMK,WAAW,GAAG,CAChBF,QADgB,EAEhB,MAAMT,KAAN,GAAc,CAFE,EAGhB,EAAEI,GAAG,GAAGG,UAAR,CAHgB,EAIhBE,QAJgB,EAKhBL,GAAG,GAAGG,UALU,EAMhB,EAAE,MAAMP,KAAN,GAAc,CAAhB,CANgB,EAOhBS,QAPgB,CAApB;AAUA,aAAO,wCACHG,IAAI,CAACC,KAAL,CAAWf,cAAc,CAACgB,KAA1B,CADG,EAEHJ,UAAU,CAACK,GAAX,CAAeH,IAAI,CAACC,KAApB,CAFG,EAGHF,WAAW,CAACI,GAAZ,CAAgBH,IAAI,CAACC,KAArB,CAHG,EAIHG,mCAAYC,KAJT,CAAP;AAMH;;AAED,UAAMR,QAAQ,GAAGT,KAAK,GAAGD,KAAzB;AACA,WAAOD,cAAc,CAACgB,KAAf,GAAuBL,QAA9B;AACH,GAzCS,EAyCP,CAACP,IAAD,EAAOD,kBAAP,CAzCO,CAAV;AA0CA,SAAOE,CAAP;AACH,CA7CM","sourcesContent":["import Animated, {\n Extrapolate,\n interpolate,\n useDerivedValue,\n} from 'react-native-reanimated';\nimport type { IComputedAnimResult } from './useComputedAnim';\n\ninterface IOpts {\n index: number;\n width: number;\n computedAnimResult: IComputedAnimResult;\n handlerOffsetX: Animated.SharedValue<number>;\n loop?: boolean;\n}\n\nexport const useOffsetX = (opts: IOpts) => {\n const { handlerOffsetX, index, width, computedAnimResult, loop } = opts;\n const x = useDerivedValue(() => {\n const { MAX, MIN, TOTAL_WIDTH, HALF_WIDTH } = computedAnimResult;\n if (loop) {\n const defaultPos = width * index;\n const startPos =\n defaultPos > MAX\n ? MAX - defaultPos\n : defaultPos < MIN\n ? MIN - defaultPos\n : defaultPos;\n\n const inputRange = [\n -TOTAL_WIDTH,\n -(MAX + HALF_WIDTH) - startPos - 1,\n -(MAX + HALF_WIDTH) - startPos,\n 0,\n MAX + HALF_WIDTH - startPos,\n MAX + HALF_WIDTH - startPos + 1,\n TOTAL_WIDTH,\n ];\n\n const outputRange = [\n startPos,\n 1.5 * width - 1,\n -(MAX + HALF_WIDTH),\n startPos,\n MAX + HALF_WIDTH,\n -(1.5 * width - 1),\n startPos,\n ];\n\n return interpolate(\n Math.round(handlerOffsetX.value),\n inputRange.map(Math.round),\n outputRange.map(Math.round),\n Extrapolate.CLAMP\n );\n }\n\n const startPos = width * index;\n return handlerOffsetX.value + startPos;\n }, [loop, computedAnimResult]);\n return x;\n};\n"]}
1
+ {"version":3,"sources":["useOffsetX.ts"],"names":["useOffsetX","opts","handlerOffsetX","index","width","loop","data","type","viewCount","Math","round","length","ITEM_LENGTH","VALID_LENGTH","TOTAL_WIDTH","HALF_WIDTH","x","defaultPos","getDefaultPos","_type","_count","MAX","MIN","startPos","inputRange","outputRange","value","map","Extrapolate","CLAMP"],"mappings":";;;;;;;AAAA;;AAgBO,MAAMA,UAAU,GAAIC,IAAD,IAAiB;AACvC,QAAM;AACFC,IAAAA,cADE;AAEFC,IAAAA,KAFE;AAGFC,IAAAA,KAHE;AAIFC,IAAAA,IAJE;AAKFC,IAAAA,IALE;AAMFC,IAAAA,IAAI,GAAG,UANL;AAOFC,IAAAA,SAAS,GAAGC,IAAI,CAACC,KAAL,CAAW,CAACJ,IAAI,CAACK,MAAL,GAAc,CAAf,IAAoB,CAA/B;AAPV,MAQFV,IARJ;AASA,QAAMW,WAAW,GAAGN,IAAI,CAACK,MAAzB;AACA,QAAME,YAAY,GAAGD,WAAW,GAAG,CAAnC;AACA,QAAME,WAAW,GAAGV,KAAK,GAAGQ,WAA5B;AACA,QAAMG,UAAU,GAAG,MAAMX,KAAzB;AAEA,QAAMY,CAAC,GAAG,4CAAgB,MAAM;AAC5B,UAAMC,UAAU,GAAGb,KAAK,GAAGD,KAA3B;;AACA,QAAIE,IAAJ,EAAU;AACN,eAASa,aAAT,CACIC,KADJ,EAEIC,MAFJ,EAOE;AACE,YAAIC,GAAG,GAAG,IAAV;AACA,YAAIC,GAAG,GAAG,IAAV;AAEA,YAAIC,QAAgB,GAAGN,UAAvB;;AAEA,YAAIE,KAAK,KAAK,UAAd,EAA0B;AACtBE,UAAAA,GAAG,GAAGD,MAAM,GAAGhB,KAAf;AACAkB,UAAAA,GAAG,GAAG,EAAET,YAAY,GAAGO,MAAjB,IAA2BhB,KAAjC;AACH,SAHD,MAGO;AACHiB,UAAAA,GAAG,GAAG,CAACR,YAAY,GAAGO,MAAhB,IAA0BhB,KAAhC;AACAkB,UAAAA,GAAG,GAAG,CAACF,MAAD,GAAUhB,KAAhB;AACH;;AAED,YAAIa,UAAU,GAAGI,GAAjB,EAAsB;AAClBE,UAAAA,QAAQ,GAAGF,GAAG,GAAGJ,UAAjB;AACH;;AAED,eAAO;AACHM,UAAAA,QADG;AAEHF,UAAAA,GAFG;AAGHC,UAAAA;AAHG,SAAP;AAKH;;AAED,YAAM;AAAEC,QAAAA,QAAF;AAAYF,QAAAA,GAAZ;AAAiBC,QAAAA;AAAjB,UAAyBJ,aAAa,CAACX,IAAD,EAAOC,SAAP,CAA5C;AAEA,YAAMgB,UAAU,GAAG,CACf,CAACV,WADc,EAEfQ,GAAG,GAAGP,UAAN,GAAmBQ,QAAnB,GAA8B,CAFf,EAGfD,GAAG,GAAGP,UAAN,GAAmBQ,QAHJ,EAIf,CAJe,EAKfF,GAAG,GAAGN,UAAN,GAAmBQ,QALJ,EAMfF,GAAG,GAAGN,UAAN,GAAmBQ,QAAnB,GAA8B,CANf,EAOfT,WAPe,CAAnB;AAUA,YAAMW,WAAW,GAAG,CAChBF,QADgB,EAEhBF,GAAG,GAAGN,UAAN,GAAmB,CAFH,EAGhBO,GAAG,GAAGP,UAHU,EAIhBQ,QAJgB,EAKhBF,GAAG,GAAGN,UALU,EAMhBO,GAAG,GAAGP,UAAN,GAAmB,CANH,EAOhBQ,QAPgB,CAApB;AAUA,aAAO,wCACHd,IAAI,CAACC,KAAL,CAAWR,cAAc,CAACwB,KAA1B,CADG,EAEHF,UAAU,CAACG,GAAX,CAAelB,IAAI,CAACC,KAApB,CAFG,EAGHe,WAAW,CAACE,GAAZ,CAAgBlB,IAAI,CAACC,KAArB,CAHG,EAIHkB,mCAAYC,KAJT,CAAP;AAMH;;AAED,WAAO3B,cAAc,CAACwB,KAAf,GAAuBT,UAA9B;AACH,GAlES,EAkEP,CAACZ,IAAD,EAAOC,IAAP,EAAaE,SAAb,EAAwBD,IAAxB,CAlEO,CAAV;AAoEA,SAAOS,CAAP;AACH,CApFM","sourcesContent":["import Animated, {\n Extrapolate,\n interpolate,\n useDerivedValue,\n} from 'react-native-reanimated';\n\ninterface IOpts {\n index: number;\n width: number;\n handlerOffsetX: Animated.SharedValue<number>;\n data: unknown[];\n type?: 'positive' | 'negative';\n viewCount?: number;\n loop?: boolean;\n}\n\nexport const useOffsetX = (opts: IOpts) => {\n const {\n handlerOffsetX,\n index,\n width,\n loop,\n data,\n type = 'positive',\n viewCount = Math.round((data.length - 1) / 2),\n } = opts;\n const ITEM_LENGTH = data.length;\n const VALID_LENGTH = ITEM_LENGTH - 1;\n const TOTAL_WIDTH = width * ITEM_LENGTH;\n const HALF_WIDTH = 0.5 * width;\n\n const x = useDerivedValue(() => {\n const defaultPos = width * index;\n if (loop) {\n function getDefaultPos(\n _type: 'positive' | 'negative',\n _count: number\n ): {\n MAX: number;\n MIN: number;\n startPos: number;\n } {\n let MAX = null;\n let MIN = null;\n\n let startPos: number = defaultPos;\n\n if (_type === 'positive') {\n MAX = _count * width;\n MIN = -(VALID_LENGTH - _count) * width;\n } else {\n MAX = (VALID_LENGTH - _count) * width;\n MIN = -_count * width;\n }\n\n if (defaultPos > MAX) {\n startPos = MAX - defaultPos;\n }\n\n return {\n startPos,\n MAX,\n MIN,\n };\n }\n\n const { startPos, MAX, MIN } = getDefaultPos(type, viewCount);\n\n const inputRange = [\n -TOTAL_WIDTH,\n MIN - HALF_WIDTH - startPos - 1,\n MIN - HALF_WIDTH - startPos,\n 0,\n MAX + HALF_WIDTH - startPos,\n MAX + HALF_WIDTH - startPos + 1,\n TOTAL_WIDTH,\n ];\n\n const outputRange = [\n startPos,\n MAX + HALF_WIDTH - 1,\n MIN - HALF_WIDTH,\n startPos,\n MAX + HALF_WIDTH,\n MIN - HALF_WIDTH + 1,\n startPos,\n ];\n\n return interpolate(\n Math.round(handlerOffsetX.value),\n inputRange.map(Math.round),\n outputRange.map(Math.round),\n Extrapolate.CLAMP\n );\n }\n\n return handlerOffsetX.value + defaultPos;\n }, [loop, data, viewCount, type]);\n\n return x;\n};\n"]}
@@ -28,14 +28,14 @@ const ParallaxLayout = props => {
28
28
  index,
29
29
  width,
30
30
  loop,
31
- children,
32
- computedAnimResult
31
+ data,
32
+ children
33
33
  } = props;
34
34
  const x = (0, _useOffsetX.useOffsetX)({
35
35
  handlerOffsetX,
36
36
  index,
37
37
  width,
38
- computedAnimResult,
38
+ data,
39
39
  loop
40
40
  });
41
41
  const offsetXStyle = (0, _reactNativeReanimated.useAnimatedStyle)(() => {
@@ -1 +1 @@
1
- {"version":3,"sources":["ParallaxLayout.tsx"],"names":["ParallaxLayout","props","handlerOffsetX","parallaxScrollingOffset","parallaxScrollingScale","index","width","loop","children","computedAnimResult","x","offsetXStyle","baseTranslateX","value","padding","extraOffset","zIndex","Extrapolate","CLAMP","scale","relatedTranslateX","transform","translateX","height","alignSelf","flex"],"mappings":";;;;;;;AACA;;AACA;;AACA;;AAMA;;;;;;;;AATA;AAWO,MAAMA,cAQX,GAAIC,KAAD,IAAW;AACZ,QAAM;AACFC,IAAAA,cADE;AAEFC,IAAAA,uBAAuB,GAAG,GAFxB;AAGFC,IAAAA,sBAAsB,GAAG,GAHvB;AAIFC,IAAAA,KAJE;AAKFC,IAAAA,KALE;AAMFC,IAAAA,IANE;AAOFC,IAAAA,QAPE;AAQFC,IAAAA;AARE,MASFR,KATJ;AAWA,QAAMS,CAAC,GAAG,4BAAW;AACjBR,IAAAA,cADiB;AAEjBG,IAAAA,KAFiB;AAGjBC,IAAAA,KAHiB;AAIjBG,IAAAA,kBAJiB;AAKjBF,IAAAA;AALiB,GAAX,CAAV;AAQA,QAAMI,YAAY,GAAG,6CAAiB,MAAM;AACxC,UAAMC,cAAc,GAAGF,CAAC,CAACG,KAAF,GAAUR,KAAK,GAAGC,KAAzC;AACA,UAAMQ,OAAO,GAAG,CAAC,IAAIV,sBAAL,IAA+BE,KAA/C;AACA,UAAMS,WAAW,GAAGV,KAAK,GAAGS,OAAR,GAAkBA,OAAO,GAAG,CAAhD;AAEA,UAAME,MAAM,GAAG,wCACXN,CAAC,CAACG,KADS,EAEX,CAAC,CAACP,KAAF,EAAS,CAAT,EAAYA,KAAZ,CAFW,EAGX,CAAC,CAAD,EAAIA,KAAJ,EAAW,CAAX,CAHW,EAIXW,mCAAYC,KAJD,CAAf;AAMA,UAAMC,KAAK,GAAG,wCACVT,CAAC,CAACG,KADQ,EAEV,CAAC,CAACP,KAAF,EAAS,CAAT,EAAYA,KAAZ,CAFU,EAGV,CAACF,sBAAD,EAAyB,CAAzB,EAA4BA,sBAA5B,CAHU,EAIVa,mCAAYC,KAJF,CAAd;AAMA,UAAME,iBAAiB,GAAG,wCACtBV,CAAC,CAACG,KADoB,EAEtB,CAAC,CAACP,KAAF,EAAS,CAAT,EAAYA,KAAZ,CAFsB,EAGtB,CAACH,uBAAD,EAA0B,CAA1B,EAA6B,CAACA,uBAA9B,CAHsB,EAItBc,mCAAYC,KAJU,CAA1B;AAMA,WAAO;AACHG,MAAAA,SAAS,EAAE,CACP;AACIC,QAAAA,UAAU,EACNV,cAAc,GAAGG,WAAjB,GAA+BK;AAFvC,OADO,EAKP;AAAED,QAAAA;AAAF,OALO,CADR;AAQHH,MAAAA;AARG,KAAP;AAUH,GAjCoB,EAiClB,CAACT,IAAD,CAjCkB,CAArB;AAmCA,sBACI,6BAAC,8BAAD,CAAU,IAAV;AACI,IAAA,KAAK,EAAE,CACH;AACID,MAAAA,KAAK,EAAG,GAAEF,sBAAsB,GAAG,GAAI,GAD3C;AAEImB,MAAAA,MAAM,EAAG,GAAEnB,sBAAsB,GAAG,GAAI,GAF5C;AAGIoB,MAAAA,SAAS,EAAE;AAHf,KADG,EAMHb,YANG;AADX,kBAUI,6BAAC,iBAAD;AAAM,IAAA,KAAK,EAAE;AAAEc,MAAAA,IAAI,EAAE;AAAR;AAAb,KAA2BjB,QAA3B,CAVJ,CADJ;AAcH,CA7EM","sourcesContent":["/* eslint-disable react-native/no-inline-styles */\nimport React from 'react';\nimport { View } from 'react-native';\nimport Animated, {\n Extrapolate,\n interpolate,\n useAnimatedStyle,\n} from 'react-native-reanimated';\nimport type { IComputedAnimResult } from 'src/hooks/useComputedAnim';\nimport { useOffsetX } from '../hooks/useOffsetX';\n\nexport const ParallaxLayout: React.FC<{\n loop?: boolean;\n parallaxScrollingOffset?: number;\n parallaxScrollingScale?: number;\n handlerOffsetX: Animated.SharedValue<number>;\n index: number;\n width: number;\n computedAnimResult: IComputedAnimResult;\n}> = (props) => {\n const {\n handlerOffsetX,\n parallaxScrollingOffset = 100,\n parallaxScrollingScale = 0.8,\n index,\n width,\n loop,\n children,\n computedAnimResult,\n } = props;\n\n const x = useOffsetX({\n handlerOffsetX,\n index,\n width,\n computedAnimResult,\n loop,\n });\n\n const offsetXStyle = useAnimatedStyle(() => {\n const baseTranslateX = x.value - index * width;\n const padding = (1 - parallaxScrollingScale) * width;\n const extraOffset = index * padding + padding / 2;\n\n const zIndex = interpolate(\n x.value,\n [-width, 0, width],\n [0, width, 0],\n Extrapolate.CLAMP\n );\n const scale = interpolate(\n x.value,\n [-width, 0, width],\n [parallaxScrollingScale, 1, parallaxScrollingScale],\n Extrapolate.CLAMP\n );\n const relatedTranslateX = interpolate(\n x.value,\n [-width, 0, width],\n [parallaxScrollingOffset, 0, -parallaxScrollingOffset],\n Extrapolate.CLAMP\n );\n return {\n transform: [\n {\n translateX:\n baseTranslateX + extraOffset + relatedTranslateX,\n },\n { scale },\n ],\n zIndex,\n };\n }, [loop]);\n\n return (\n <Animated.View\n style={[\n {\n width: `${parallaxScrollingScale * 100}%`,\n height: `${parallaxScrollingScale * 100}%`,\n alignSelf: 'center',\n },\n offsetXStyle,\n ]}\n >\n <View style={{ flex: 1 }}>{children}</View>\n </Animated.View>\n );\n};\n"]}
1
+ {"version":3,"sources":["ParallaxLayout.tsx"],"names":["ParallaxLayout","props","handlerOffsetX","parallaxScrollingOffset","parallaxScrollingScale","index","width","loop","data","children","x","offsetXStyle","baseTranslateX","value","padding","extraOffset","zIndex","Extrapolate","CLAMP","scale","relatedTranslateX","transform","translateX","height","alignSelf","flex"],"mappings":";;;;;;;AACA;;AACA;;AACA;;AAKA;;;;;;;;AARA;AAUO,MAAMA,cAQX,GAAIC,KAAD,IAAW;AACZ,QAAM;AACFC,IAAAA,cADE;AAEFC,IAAAA,uBAAuB,GAAG,GAFxB;AAGFC,IAAAA,sBAAsB,GAAG,GAHvB;AAIFC,IAAAA,KAJE;AAKFC,IAAAA,KALE;AAMFC,IAAAA,IANE;AAOFC,IAAAA,IAPE;AAQFC,IAAAA;AARE,MASFR,KATJ;AAWA,QAAMS,CAAC,GAAG,4BAAW;AACjBR,IAAAA,cADiB;AAEjBG,IAAAA,KAFiB;AAGjBC,IAAAA,KAHiB;AAIjBE,IAAAA,IAJiB;AAKjBD,IAAAA;AALiB,GAAX,CAAV;AAQA,QAAMI,YAAY,GAAG,6CAAiB,MAAM;AACxC,UAAMC,cAAc,GAAGF,CAAC,CAACG,KAAF,GAAUR,KAAK,GAAGC,KAAzC;AACA,UAAMQ,OAAO,GAAG,CAAC,IAAIV,sBAAL,IAA+BE,KAA/C;AACA,UAAMS,WAAW,GAAGV,KAAK,GAAGS,OAAR,GAAkBA,OAAO,GAAG,CAAhD;AAEA,UAAME,MAAM,GAAG,wCACXN,CAAC,CAACG,KADS,EAEX,CAAC,CAACP,KAAF,EAAS,CAAT,EAAYA,KAAZ,CAFW,EAGX,CAAC,CAAD,EAAIA,KAAJ,EAAW,CAAX,CAHW,EAIXW,mCAAYC,KAJD,CAAf;AAMA,UAAMC,KAAK,GAAG,wCACVT,CAAC,CAACG,KADQ,EAEV,CAAC,CAACP,KAAF,EAAS,CAAT,EAAYA,KAAZ,CAFU,EAGV,CAACF,sBAAD,EAAyB,CAAzB,EAA4BA,sBAA5B,CAHU,EAIVa,mCAAYC,KAJF,CAAd;AAMA,UAAME,iBAAiB,GAAG,wCACtBV,CAAC,CAACG,KADoB,EAEtB,CAAC,CAACP,KAAF,EAAS,CAAT,EAAYA,KAAZ,CAFsB,EAGtB,CAACH,uBAAD,EAA0B,CAA1B,EAA6B,CAACA,uBAA9B,CAHsB,EAItBc,mCAAYC,KAJU,CAA1B;AAMA,WAAO;AACHG,MAAAA,SAAS,EAAE,CACP;AACIC,QAAAA,UAAU,EACNV,cAAc,GAAGG,WAAjB,GAA+BK;AAFvC,OADO,EAKP;AAAED,QAAAA;AAAF,OALO,CADR;AAQHH,MAAAA;AARG,KAAP;AAUH,GAjCoB,EAiClB,CAACT,IAAD,CAjCkB,CAArB;AAmCA,sBACI,6BAAC,8BAAD,CAAU,IAAV;AACI,IAAA,KAAK,EAAE,CACH;AACID,MAAAA,KAAK,EAAG,GAAEF,sBAAsB,GAAG,GAAI,GAD3C;AAEImB,MAAAA,MAAM,EAAG,GAAEnB,sBAAsB,GAAG,GAAI,GAF5C;AAGIoB,MAAAA,SAAS,EAAE;AAHf,KADG,EAMHb,YANG;AADX,kBAUI,6BAAC,iBAAD;AAAM,IAAA,KAAK,EAAE;AAAEc,MAAAA,IAAI,EAAE;AAAR;AAAb,KAA2BhB,QAA3B,CAVJ,CADJ;AAcH,CA7EM","sourcesContent":["/* eslint-disable react-native/no-inline-styles */\nimport React from 'react';\nimport { View } from 'react-native';\nimport Animated, {\n Extrapolate,\n interpolate,\n useAnimatedStyle,\n} from 'react-native-reanimated';\nimport { useOffsetX } from '../hooks/useOffsetX';\n\nexport const ParallaxLayout: React.FC<{\n loop?: boolean;\n parallaxScrollingOffset?: number;\n parallaxScrollingScale?: number;\n handlerOffsetX: Animated.SharedValue<number>;\n index: number;\n width: number;\n data: unknown[];\n}> = (props) => {\n const {\n handlerOffsetX,\n parallaxScrollingOffset = 100,\n parallaxScrollingScale = 0.8,\n index,\n width,\n loop,\n data,\n children,\n } = props;\n\n const x = useOffsetX({\n handlerOffsetX,\n index,\n width,\n data,\n loop,\n });\n\n const offsetXStyle = useAnimatedStyle(() => {\n const baseTranslateX = x.value - index * width;\n const padding = (1 - parallaxScrollingScale) * width;\n const extraOffset = index * padding + padding / 2;\n\n const zIndex = interpolate(\n x.value,\n [-width, 0, width],\n [0, width, 0],\n Extrapolate.CLAMP\n );\n const scale = interpolate(\n x.value,\n [-width, 0, width],\n [parallaxScrollingScale, 1, parallaxScrollingScale],\n Extrapolate.CLAMP\n );\n const relatedTranslateX = interpolate(\n x.value,\n [-width, 0, width],\n [parallaxScrollingOffset, 0, -parallaxScrollingOffset],\n Extrapolate.CLAMP\n );\n return {\n transform: [\n {\n translateX:\n baseTranslateX + extraOffset + relatedTranslateX,\n },\n { scale },\n ],\n zIndex,\n };\n }, [loop]);\n\n return (\n <Animated.View\n style={[\n {\n width: `${parallaxScrollingScale * 100}%`,\n height: `${parallaxScrollingScale * 100}%`,\n alignSelf: 'center',\n },\n offsetXStyle,\n ]}\n >\n <View style={{ flex: 1 }}>{children}</View>\n </Animated.View>\n );\n};\n"]}
@@ -6,7 +6,6 @@ import Animated, { cancelAnimation, runOnJS, useAnimatedGestureHandler, useAnima
6
6
  import { CarouselItem } from './CarouselItem';
7
7
  import { ParallaxLayout } from './layouts/index';
8
8
  import { useCarouselController } from './hooks/useCarouselController';
9
- import { useComputedAnim } from './hooks/useComputedAnim';
10
9
  import { useAutoPlay } from './hooks/useAutoPlay';
11
10
  import { useIndexController } from './hooks/useIndexController';
12
11
  import { usePropsErrorBoundary } from './hooks/usePropsErrorBoundary';
@@ -69,7 +68,6 @@ function Carousel(props, ref) {
69
68
 
70
69
  return _data;
71
70
  }, [_data, loop]);
72
- const computedAnimResult = useComputedAnim(width, data.length);
73
71
  const indexController = useIndexController({
74
72
  originalLength: _data.length,
75
73
  length: data.length,
@@ -116,14 +114,15 @@ function Carousel(props, ref) {
116
114
  (_props$onScrollEnd = props.onScrollEnd) === null || _props$onScrollEnd === void 0 ? void 0 : _props$onScrollEnd.call(props, sharedPreIndex.current, sharedIndex.current);
117
115
  }, [sharedPreIndex, sharedIndex, computedIndex, props, run]);
118
116
  const offsetX = useDerivedValue(() => {
119
- const x = handlerOffsetX.value % computedAnimResult.TOTAL_WIDTH;
117
+ const totalWidth = width * data.length;
118
+ const x = handlerOffsetX.value % totalWidth;
120
119
 
121
120
  if (!loop) {
122
121
  return handlerOffsetX.value;
123
122
  }
124
123
 
125
124
  return isNaN(x) ? 0 : x;
126
- }, [computedAnimResult, loop]);
125
+ }, [loop, width, data]);
127
126
  useAnimatedReaction(() => offsetX.value, value => {
128
127
  let absoluteProgress = Math.abs(value / width);
129
128
 
@@ -214,7 +213,7 @@ function Carousel(props, ref) {
214
213
  return /*#__PURE__*/React.createElement(ParallaxLayout, {
215
214
  parallaxScrollingOffset: parallaxScrollingOffset,
216
215
  parallaxScrollingScale: parallaxScrollingScale,
217
- computedAnimResult: computedAnimResult,
216
+ data: data,
218
217
  width: width,
219
218
  handlerOffsetX: offsetX,
220
219
  index: i,
@@ -224,7 +223,7 @@ function Carousel(props, ref) {
224
223
 
225
224
  default:
226
225
  return /*#__PURE__*/React.createElement(CarouselItem, {
227
- computedAnimResult: computedAnimResult,
226
+ data: data,
228
227
  width: width,
229
228
  height: height,
230
229
  handlerOffsetX: offsetX,
@@ -233,7 +232,7 @@ function Carousel(props, ref) {
233
232
  loop: loop
234
233
  }, renderItem(item, i));
235
234
  }
236
- }, [loop, mode, computedAnimResult, height, offsetX, parallaxScrollingOffset, parallaxScrollingScale, width, renderItem]);
235
+ }, [loop, mode, data, height, offsetX, parallaxScrollingOffset, parallaxScrollingScale, width, renderItem]);
237
236
  return /*#__PURE__*/React.createElement(PanGestureHandler, _extends({}, panGestureHandlerProps, {
238
237
  onGestureEvent: animatedListScrollHandler
239
238
  }), /*#__PURE__*/React.createElement(Animated.View, {
@@ -1 +1 @@
1
- {"version":3,"sources":["Carousel.tsx"],"names":["React","PanGestureHandler","Animated","cancelAnimation","runOnJS","useAnimatedGestureHandler","useAnimatedReaction","useDerivedValue","useSharedValue","withSpring","CarouselItem","ParallaxLayout","useCarouselController","useComputedAnim","useAutoPlay","useIndexController","usePropsErrorBoundary","defaultSpringConfig","damping","Carousel","props","ref","defaultIndex","height","data","_data","loop","mode","autoPlay","autoPlayReverse","autoPlayInterval","parallaxScrollingOffset","parallaxScrollingScale","style","panGestureHandlerProps","renderItem","onSnapToItem","onProgressChange","timingConfig","springConfig","width","Math","round","defaultHandlerOffsetX","abs","handlerOffsetX","useMemo","length","computedAnimResult","indexController","originalLength","onChange","i","carouselController","disable","onScrollBegin","onScrollEnd","run","pause","index","sharedPreIndex","sharedIndex","computedIndex","useCallback","current","offsetX","x","value","TOTAL_WIDTH","isNaN","absoluteProgress","next","prev","getCurrentIndex","goToIndex","animated","to","animatedListScrollHandler","onStart","_","ctx","currentContentOffsetX","start","onActive","e","translationX","onEnd","_withAnimationCallback","num","Object","assign","velocity","velocityX","isFinished","page","velocityPage","pageWithVelocity","min","max","useImperativeHandle","renderLayout","item","flexDirection","position","map","forwardRef"],"mappings":"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","sourcesContent":["import React from 'react';\nimport type { FlexStyle, ViewStyle } from 'react-native';\nimport {\n PanGestureHandler,\n PanGestureHandlerProps,\n PanGestureHandlerGestureEvent,\n} from 'react-native-gesture-handler';\nimport Animated, {\n cancelAnimation,\n runOnJS,\n useAnimatedGestureHandler,\n useAnimatedReaction,\n useDerivedValue,\n useSharedValue,\n withSpring,\n} from 'react-native-reanimated';\nimport { CarouselItem } from './CarouselItem';\nimport type { TMode } from './layouts';\nimport { ParallaxLayout } from './layouts/index';\nimport { useCarouselController } from './hooks/useCarouselController';\nimport { useComputedAnim } from './hooks/useComputedAnim';\nimport { useAutoPlay } from './hooks/useAutoPlay';\nimport { useIndexController } from './hooks/useIndexController';\nimport { usePropsErrorBoundary } from './hooks/usePropsErrorBoundary';\n\nconst defaultSpringConfig: Animated.WithSpringConfig = {\n damping: 100,\n};\nexport interface ICarouselProps<T extends unknown> {\n ref?: React.Ref<ICarouselInstance>;\n /**\n * Carousel loop playback.\n * @default true\n */\n loop?: boolean;\n /**\n * Carousel Animated transitions.\n * @default 'default'\n */\n mode?: TMode;\n /**\n * Specified carousel container width.\n */\n width: number;\n /**\n * Specified carousel container height.\n * @default '100%'\n */\n height?: FlexStyle['height'];\n /**\n * Carousel items data set.\n */\n data: T[];\n /**\n * Default index\n * @default 0\n */\n defaultIndex?: number;\n /**\n * Auto play\n */\n autoPlay?: boolean;\n /**\n * Auto play\n * @description reverse playback\n */\n autoPlayReverse?: boolean;\n /**\n * Auto play\n * @description playback interval\n */\n autoPlayInterval?: number;\n /**\n * Carousel container style\n */\n style?: ViewStyle;\n /**\n * When use 'default' Layout props,this prop can be control prev/next item offset.\n * @default 100\n */\n parallaxScrollingOffset?: number;\n /**\n * When use 'default' Layout props,this prop can be control prev/next item offset.\n * @default 0.8\n */\n parallaxScrollingScale?: number;\n /**\n * Sping config of translation animated\n */\n springConfig?: Animated.WithSpringConfig;\n /**\n * PanGestureHandler props\n */\n panGestureHandlerProps?: Omit<\n Partial<PanGestureHandlerProps>,\n 'onHandlerStateChange'\n >;\n /**\n * Render carousel item.\n */\n renderItem: (data: T, index: number) => React.ReactNode;\n /**\n * Callback fired when navigating to an item\n */\n onSnapToItem?: (index: number) => void;\n /**\n * On scroll begin\n */\n onScrollBegin?: () => void;\n /**\n * On scroll end\n */\n onScrollEnd?: (previous: number, current: number) => void;\n /**\n * On progress change\n * @param offsetProgress Total of offset distance (0 390 780 ...)\n * @param absoluteProgress Convert to index (0 1 2 ...)\n */\n onProgressChange?: (\n offsetProgress: number,\n absoluteProgress: number\n ) => void;\n}\n\nexport interface ICarouselInstance {\n /**\n * Play the last one\n */\n prev: () => void;\n /**\n * Play the next one\n */\n next: () => void;\n /**\n * Get current item index\n */\n getCurrentIndex: () => number;\n /**\n * Go to index\n */\n goToIndex: (index: number, animated?: boolean) => void;\n}\n\nfunction Carousel<T extends unknown = any>(\n props: ICarouselProps<T>,\n ref: React.Ref<ICarouselInstance>\n) {\n const {\n defaultIndex = 0,\n height = '100%',\n data: _data = [],\n loop = true,\n mode = 'default',\n autoPlay,\n autoPlayReverse,\n autoPlayInterval = 1000,\n parallaxScrollingOffset,\n parallaxScrollingScale,\n style,\n panGestureHandlerProps = {},\n renderItem,\n onSnapToItem,\n onProgressChange,\n } = props;\n\n usePropsErrorBoundary({\n ...props,\n defaultIndex,\n height,\n data: _data,\n loop,\n mode,\n autoPlay,\n autoPlayReverse,\n autoPlayInterval,\n parallaxScrollingOffset,\n parallaxScrollingScale,\n style,\n panGestureHandlerProps,\n // @ts-ignore\n renderItem,\n onSnapToItem,\n onProgressChange,\n });\n\n const timingConfig = {\n ...defaultSpringConfig,\n ...props.springConfig,\n };\n const width = Math.round(props.width);\n const defaultHandlerOffsetX = -Math.abs(defaultIndex * width);\n const handlerOffsetX = useSharedValue<number>(defaultHandlerOffsetX);\n const data = React.useMemo<T[]>(() => {\n if (!loop) return _data;\n\n if (_data.length === 1) {\n return [_data[0], _data[0], _data[0]];\n }\n\n if (_data.length === 2) {\n return [_data[0], _data[1], _data[0], _data[1]];\n }\n\n return _data;\n }, [_data, loop]);\n\n const computedAnimResult = useComputedAnim(width, data.length);\n\n const indexController = useIndexController({\n originalLength: _data.length,\n length: data.length,\n handlerOffsetX,\n width,\n loop,\n onChange: (i) => onSnapToItem && runOnJS(onSnapToItem)(i),\n });\n\n const carouselController = useCarouselController({\n loop,\n width,\n handlerOffsetX,\n indexController,\n disable: !data.length,\n onScrollBegin: () => runOnJS(onScrollBegin)(),\n onScrollEnd: () => runOnJS(onScrollEnd)(),\n });\n\n const { run, pause } = useAutoPlay({\n autoPlay,\n autoPlayInterval,\n autoPlayReverse,\n carouselController,\n });\n\n const { index, sharedPreIndex, sharedIndex, computedIndex } =\n indexController;\n\n const onScrollBegin = React.useCallback(() => {\n pause();\n props.onScrollBegin?.();\n }, [pause, props]);\n\n const onScrollEnd = React.useCallback(() => {\n run();\n computedIndex();\n props.onScrollEnd?.(sharedPreIndex.current, sharedIndex.current);\n }, [sharedPreIndex, sharedIndex, computedIndex, props, run]);\n\n const offsetX = useDerivedValue(() => {\n const x = handlerOffsetX.value % computedAnimResult.TOTAL_WIDTH;\n\n if (!loop) {\n return handlerOffsetX.value;\n }\n return isNaN(x) ? 0 : x;\n }, [computedAnimResult, loop]);\n\n useAnimatedReaction(\n () => offsetX.value,\n (value) => {\n let absoluteProgress = Math.abs(value / width);\n if (value > 0) {\n absoluteProgress = data.length - absoluteProgress;\n }\n !!onProgressChange &&\n runOnJS(onProgressChange)(value, absoluteProgress);\n },\n [onProgressChange, data]\n );\n\n const next = React.useCallback(() => {\n return carouselController.next();\n }, [carouselController]);\n\n const prev = React.useCallback(() => {\n return carouselController.prev();\n }, [carouselController]);\n\n const getCurrentIndex = React.useCallback(() => {\n return index.value;\n }, [index]);\n\n const goToIndex = React.useCallback(\n (i: number, animated?: boolean) => {\n carouselController.to(i, animated);\n },\n [carouselController]\n );\n\n const animatedListScrollHandler =\n useAnimatedGestureHandler<PanGestureHandlerGestureEvent>(\n {\n onStart: (_, ctx: any) => {\n runOnJS(pause)();\n runOnJS(onScrollBegin)();\n cancelAnimation(handlerOffsetX);\n ctx.currentContentOffsetX = handlerOffsetX.value;\n ctx.start = true;\n },\n onActive: (e, ctx: any) => {\n const { translationX } = e;\n if (\n !loop &&\n (handlerOffsetX.value >= 0 ||\n handlerOffsetX.value <= -(data.length - 1) * width)\n ) {\n handlerOffsetX.value =\n ctx.currentContentOffsetX + translationX / 2;\n return;\n }\n handlerOffsetX.value =\n ctx.currentContentOffsetX + translationX;\n },\n onEnd: (e) => {\n function _withAnimationCallback(num: number) {\n return withSpring(\n num,\n Object.assign({}, timingConfig, {\n velocity: e.velocityX,\n }),\n (isFinished) => {\n if (isFinished) {\n runOnJS(onScrollEnd)();\n }\n }\n );\n }\n\n const page = Math.round(handlerOffsetX.value / width);\n\n const velocityPage = Math.round(\n (handlerOffsetX.value + e.velocityX) / width\n );\n\n let pageWithVelocity = Math.min(\n page + 1,\n Math.max(page - 1, velocityPage)\n );\n\n if (!loop) {\n pageWithVelocity = Math.max(\n -(data.length - 1),\n Math.min(0, pageWithVelocity)\n );\n }\n\n if (loop) {\n handlerOffsetX.value = _withAnimationCallback(\n pageWithVelocity * width\n );\n return;\n }\n if (handlerOffsetX.value >= 0) {\n handlerOffsetX.value = _withAnimationCallback(0);\n return;\n }\n\n if (handlerOffsetX.value <= -(data.length - 1) * width) {\n handlerOffsetX.value = _withAnimationCallback(\n -(data.length - 1) * width\n );\n return;\n }\n\n handlerOffsetX.value = _withAnimationCallback(\n pageWithVelocity * width\n );\n },\n },\n [loop, data, onScrollBegin, onScrollEnd]\n );\n\n React.useImperativeHandle(\n ref,\n () => ({\n next,\n prev,\n getCurrentIndex,\n goToIndex,\n }),\n [getCurrentIndex, goToIndex, next, prev]\n );\n\n const renderLayout = React.useCallback(\n (item: T, i: number) => {\n switch (mode) {\n case 'parallax':\n return (\n <ParallaxLayout\n parallaxScrollingOffset={parallaxScrollingOffset}\n parallaxScrollingScale={parallaxScrollingScale}\n computedAnimResult={computedAnimResult}\n width={width}\n handlerOffsetX={offsetX}\n index={i}\n key={i}\n loop={loop}\n >\n {renderItem(item, i)}\n </ParallaxLayout>\n );\n default:\n return (\n <CarouselItem\n computedAnimResult={computedAnimResult}\n width={width}\n height={height}\n handlerOffsetX={offsetX}\n index={i}\n key={i}\n loop={loop}\n >\n {renderItem(item, i)}\n </CarouselItem>\n );\n }\n },\n [\n loop,\n mode,\n computedAnimResult,\n height,\n offsetX,\n parallaxScrollingOffset,\n parallaxScrollingScale,\n width,\n renderItem,\n ]\n );\n\n return (\n <PanGestureHandler\n {...panGestureHandlerProps}\n onGestureEvent={animatedListScrollHandler}\n >\n <Animated.View\n // eslint-disable-next-line react-native/no-inline-styles\n style={{\n ...style,\n width,\n height,\n flexDirection: 'row',\n position: 'relative',\n }}\n >\n {data.map(renderLayout)}\n </Animated.View>\n </PanGestureHandler>\n );\n}\n\nexport default React.forwardRef(Carousel) as typeof Carousel;\n"]}
1
+ {"version":3,"sources":["Carousel.tsx"],"names":["React","PanGestureHandler","Animated","cancelAnimation","runOnJS","useAnimatedGestureHandler","useAnimatedReaction","useDerivedValue","useSharedValue","withSpring","CarouselItem","ParallaxLayout","useCarouselController","useAutoPlay","useIndexController","usePropsErrorBoundary","defaultSpringConfig","damping","Carousel","props","ref","defaultIndex","height","data","_data","loop","mode","autoPlay","autoPlayReverse","autoPlayInterval","parallaxScrollingOffset","parallaxScrollingScale","style","panGestureHandlerProps","renderItem","onSnapToItem","onProgressChange","timingConfig","springConfig","width","Math","round","defaultHandlerOffsetX","abs","handlerOffsetX","useMemo","length","indexController","originalLength","onChange","i","carouselController","disable","onScrollBegin","onScrollEnd","run","pause","index","sharedPreIndex","sharedIndex","computedIndex","useCallback","current","offsetX","totalWidth","x","value","isNaN","absoluteProgress","next","prev","getCurrentIndex","goToIndex","animated","to","animatedListScrollHandler","onStart","_","ctx","currentContentOffsetX","start","onActive","e","translationX","onEnd","_withAnimationCallback","num","Object","assign","velocity","velocityX","isFinished","page","velocityPage","pageWithVelocity","min","max","useImperativeHandle","renderLayout","item","flexDirection","position","map","forwardRef"],"mappings":"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","sourcesContent":["import React from 'react';\nimport type { FlexStyle, ViewStyle } from 'react-native';\nimport {\n PanGestureHandler,\n PanGestureHandlerProps,\n PanGestureHandlerGestureEvent,\n} from 'react-native-gesture-handler';\nimport Animated, {\n cancelAnimation,\n runOnJS,\n useAnimatedGestureHandler,\n useAnimatedReaction,\n useDerivedValue,\n useSharedValue,\n withSpring,\n} from 'react-native-reanimated';\nimport { CarouselItem } from './CarouselItem';\nimport type { TMode } from './layouts';\nimport { ParallaxLayout } from './layouts/index';\nimport { useCarouselController } from './hooks/useCarouselController';\nimport { useAutoPlay } from './hooks/useAutoPlay';\nimport { useIndexController } from './hooks/useIndexController';\nimport { usePropsErrorBoundary } from './hooks/usePropsErrorBoundary';\n\nconst defaultSpringConfig: Animated.WithSpringConfig = {\n damping: 100,\n};\nexport interface ICarouselProps<T extends unknown> {\n ref?: React.Ref<ICarouselInstance>;\n /**\n * Carousel loop playback.\n * @default true\n */\n loop?: boolean;\n /**\n * Carousel Animated transitions.\n * @default 'default'\n */\n mode?: TMode;\n /**\n * Specified carousel container width.\n */\n width: number;\n /**\n * Specified carousel container height.\n * @default '100%'\n */\n height?: FlexStyle['height'];\n /**\n * Carousel items data set.\n */\n data: T[];\n /**\n * Default index\n * @default 0\n */\n defaultIndex?: number;\n /**\n * Auto play\n */\n autoPlay?: boolean;\n /**\n * Auto play\n * @description reverse playback\n */\n autoPlayReverse?: boolean;\n /**\n * Auto play\n * @description playback interval\n */\n autoPlayInterval?: number;\n /**\n * Carousel container style\n */\n style?: ViewStyle;\n /**\n * When use 'default' Layout props,this prop can be control prev/next item offset.\n * @default 100\n */\n parallaxScrollingOffset?: number;\n /**\n * When use 'default' Layout props,this prop can be control prev/next item offset.\n * @default 0.8\n */\n parallaxScrollingScale?: number;\n /**\n * Sping config of translation animated\n */\n springConfig?: Animated.WithSpringConfig;\n /**\n * PanGestureHandler props\n */\n panGestureHandlerProps?: Omit<\n Partial<PanGestureHandlerProps>,\n 'onHandlerStateChange'\n >;\n /**\n * Render carousel item.\n */\n renderItem: (data: T, index: number) => React.ReactNode;\n /**\n * Callback fired when navigating to an item\n */\n onSnapToItem?: (index: number) => void;\n /**\n * On scroll begin\n */\n onScrollBegin?: () => void;\n /**\n * On scroll end\n */\n onScrollEnd?: (previous: number, current: number) => void;\n /**\n * On progress change\n * @param offsetProgress Total of offset distance (0 390 780 ...)\n * @param absoluteProgress Convert to index (0 1 2 ...)\n */\n onProgressChange?: (\n offsetProgress: number,\n absoluteProgress: number\n ) => void;\n}\n\nexport interface ICarouselInstance {\n /**\n * Play the last one\n */\n prev: () => void;\n /**\n * Play the next one\n */\n next: () => void;\n /**\n * Get current item index\n */\n getCurrentIndex: () => number;\n /**\n * Go to index\n */\n goToIndex: (index: number, animated?: boolean) => void;\n}\n\nfunction Carousel<T extends unknown = any>(\n props: ICarouselProps<T>,\n ref: React.Ref<ICarouselInstance>\n) {\n const {\n defaultIndex = 0,\n height = '100%',\n data: _data = [],\n loop = true,\n mode = 'default',\n autoPlay,\n autoPlayReverse,\n autoPlayInterval = 1000,\n parallaxScrollingOffset,\n parallaxScrollingScale,\n style,\n panGestureHandlerProps = {},\n renderItem,\n onSnapToItem,\n onProgressChange,\n } = props;\n\n usePropsErrorBoundary({\n ...props,\n defaultIndex,\n height,\n data: _data,\n loop,\n mode,\n autoPlay,\n autoPlayReverse,\n autoPlayInterval,\n parallaxScrollingOffset,\n parallaxScrollingScale,\n style,\n panGestureHandlerProps,\n // @ts-ignore\n renderItem,\n onSnapToItem,\n onProgressChange,\n });\n\n const timingConfig = {\n ...defaultSpringConfig,\n ...props.springConfig,\n };\n const width = Math.round(props.width);\n const defaultHandlerOffsetX = -Math.abs(defaultIndex * width);\n const handlerOffsetX = useSharedValue<number>(defaultHandlerOffsetX);\n const data = React.useMemo<T[]>(() => {\n if (!loop) return _data;\n\n if (_data.length === 1) {\n return [_data[0], _data[0], _data[0]];\n }\n\n if (_data.length === 2) {\n return [_data[0], _data[1], _data[0], _data[1]];\n }\n\n return _data;\n }, [_data, loop]);\n\n const indexController = useIndexController({\n originalLength: _data.length,\n length: data.length,\n handlerOffsetX,\n width,\n loop,\n onChange: (i) => onSnapToItem && runOnJS(onSnapToItem)(i),\n });\n\n const carouselController = useCarouselController({\n loop,\n width,\n handlerOffsetX,\n indexController,\n disable: !data.length,\n onScrollBegin: () => runOnJS(onScrollBegin)(),\n onScrollEnd: () => runOnJS(onScrollEnd)(),\n });\n\n const { run, pause } = useAutoPlay({\n autoPlay,\n autoPlayInterval,\n autoPlayReverse,\n carouselController,\n });\n\n const { index, sharedPreIndex, sharedIndex, computedIndex } =\n indexController;\n\n const onScrollBegin = React.useCallback(() => {\n pause();\n props.onScrollBegin?.();\n }, [pause, props]);\n\n const onScrollEnd = React.useCallback(() => {\n run();\n computedIndex();\n props.onScrollEnd?.(sharedPreIndex.current, sharedIndex.current);\n }, [sharedPreIndex, sharedIndex, computedIndex, props, run]);\n\n const offsetX = useDerivedValue(() => {\n const totalWidth = width * data.length;\n const x = handlerOffsetX.value % totalWidth;\n\n if (!loop) {\n return handlerOffsetX.value;\n }\n return isNaN(x) ? 0 : x;\n }, [loop, width, data]);\n\n useAnimatedReaction(\n () => offsetX.value,\n (value) => {\n let absoluteProgress = Math.abs(value / width);\n if (value > 0) {\n absoluteProgress = data.length - absoluteProgress;\n }\n !!onProgressChange &&\n runOnJS(onProgressChange)(value, absoluteProgress);\n },\n [onProgressChange, data]\n );\n\n const next = React.useCallback(() => {\n return carouselController.next();\n }, [carouselController]);\n\n const prev = React.useCallback(() => {\n return carouselController.prev();\n }, [carouselController]);\n\n const getCurrentIndex = React.useCallback(() => {\n return index.value;\n }, [index]);\n\n const goToIndex = React.useCallback(\n (i: number, animated?: boolean) => {\n carouselController.to(i, animated);\n },\n [carouselController]\n );\n\n const animatedListScrollHandler =\n useAnimatedGestureHandler<PanGestureHandlerGestureEvent>(\n {\n onStart: (_, ctx: any) => {\n runOnJS(pause)();\n runOnJS(onScrollBegin)();\n cancelAnimation(handlerOffsetX);\n ctx.currentContentOffsetX = handlerOffsetX.value;\n ctx.start = true;\n },\n onActive: (e, ctx: any) => {\n const { translationX } = e;\n if (\n !loop &&\n (handlerOffsetX.value >= 0 ||\n handlerOffsetX.value <= -(data.length - 1) * width)\n ) {\n handlerOffsetX.value =\n ctx.currentContentOffsetX + translationX / 2;\n return;\n }\n handlerOffsetX.value =\n ctx.currentContentOffsetX + translationX;\n },\n onEnd: (e) => {\n function _withAnimationCallback(num: number) {\n return withSpring(\n num,\n Object.assign({}, timingConfig, {\n velocity: e.velocityX,\n }),\n (isFinished) => {\n if (isFinished) {\n runOnJS(onScrollEnd)();\n }\n }\n );\n }\n\n const page = Math.round(handlerOffsetX.value / width);\n\n const velocityPage = Math.round(\n (handlerOffsetX.value + e.velocityX) / width\n );\n\n let pageWithVelocity = Math.min(\n page + 1,\n Math.max(page - 1, velocityPage)\n );\n\n if (!loop) {\n pageWithVelocity = Math.max(\n -(data.length - 1),\n Math.min(0, pageWithVelocity)\n );\n }\n\n if (loop) {\n handlerOffsetX.value = _withAnimationCallback(\n pageWithVelocity * width\n );\n return;\n }\n if (handlerOffsetX.value >= 0) {\n handlerOffsetX.value = _withAnimationCallback(0);\n return;\n }\n\n if (handlerOffsetX.value <= -(data.length - 1) * width) {\n handlerOffsetX.value = _withAnimationCallback(\n -(data.length - 1) * width\n );\n return;\n }\n\n handlerOffsetX.value = _withAnimationCallback(\n pageWithVelocity * width\n );\n },\n },\n [loop, data, onScrollBegin, onScrollEnd]\n );\n\n React.useImperativeHandle(\n ref,\n () => ({\n next,\n prev,\n getCurrentIndex,\n goToIndex,\n }),\n [getCurrentIndex, goToIndex, next, prev]\n );\n\n const renderLayout = React.useCallback(\n (item: T, i: number) => {\n switch (mode) {\n case 'parallax':\n return (\n <ParallaxLayout\n parallaxScrollingOffset={parallaxScrollingOffset}\n parallaxScrollingScale={parallaxScrollingScale}\n data={data}\n width={width}\n handlerOffsetX={offsetX}\n index={i}\n key={i}\n loop={loop}\n >\n {renderItem(item, i)}\n </ParallaxLayout>\n );\n default:\n return (\n <CarouselItem\n data={data}\n width={width}\n height={height}\n handlerOffsetX={offsetX}\n index={i}\n key={i}\n loop={loop}\n >\n {renderItem(item, i)}\n </CarouselItem>\n );\n }\n },\n [\n loop,\n mode,\n data,\n height,\n offsetX,\n parallaxScrollingOffset,\n parallaxScrollingScale,\n width,\n renderItem,\n ]\n );\n\n return (\n <PanGestureHandler\n {...panGestureHandlerProps}\n onGestureEvent={animatedListScrollHandler}\n >\n <Animated.View\n // eslint-disable-next-line react-native/no-inline-styles\n style={{\n ...style,\n width,\n height,\n flexDirection: 'row',\n position: 'relative',\n }}\n >\n {data.map(renderLayout)}\n </Animated.View>\n </PanGestureHandler>\n );\n}\n\nexport default React.forwardRef(Carousel) as typeof Carousel;\n"]}
@@ -9,14 +9,14 @@ export const CarouselItem = props => {
9
9
  children,
10
10
  width,
11
11
  height = '100%',
12
- computedAnimResult,
13
- loop
12
+ loop,
13
+ data
14
14
  } = props;
15
15
  const x = useOffsetX({
16
16
  handlerOffsetX,
17
17
  index,
18
18
  width,
19
- computedAnimResult,
19
+ data,
20
20
  loop
21
21
  });
22
22
  const offsetXStyle = useAnimatedStyle(() => {
@@ -1 +1 @@
1
- {"version":3,"sources":["CarouselItem.tsx"],"names":["React","View","Animated","useAnimatedStyle","useOffsetX","CarouselItem","props","handlerOffsetX","index","children","width","height","computedAnimResult","loop","x","offsetXStyle","transform","translateX","value"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,SAAoBC,IAApB,QAAgC,cAAhC;AACA,OAAOC,QAAP,IAAmBC,gBAAnB,QAA2C,yBAA3C;AAEA,SAASC,UAAT,QAA2B,oBAA3B;AAEA,OAAO,MAAMC,YAOX,GAAIC,KAAD,IAAW;AACZ,QAAM;AACFC,IAAAA,cADE;AAEFC,IAAAA,KAFE;AAGFC,IAAAA,QAHE;AAIFC,IAAAA,KAJE;AAKFC,IAAAA,MAAM,GAAG,MALP;AAMFC,IAAAA,kBANE;AAOFC,IAAAA;AAPE,MAQFP,KARJ;AASA,QAAMQ,CAAC,GAAGV,UAAU,CAAC;AACjBG,IAAAA,cADiB;AAEjBC,IAAAA,KAFiB;AAGjBE,IAAAA,KAHiB;AAIjBE,IAAAA,kBAJiB;AAKjBC,IAAAA;AALiB,GAAD,CAApB;AAOA,QAAME,YAAY,GAAGZ,gBAAgB,CAAC,MAAM;AACxC,WAAO;AACHa,MAAAA,SAAS,EAAE,CAAC;AAAEC,QAAAA,UAAU,EAAEH,CAAC,CAACI,KAAF,GAAUV,KAAK,GAAGE;AAAhC,OAAD;AADR,KAAP;AAGH,GAJoC,EAIlC,EAJkC,CAArC;AAMA,sBACI,oBAAC,QAAD,CAAU,IAAV;AAAe,IAAA,KAAK,EAAEK;AAAtB,kBACI,oBAAC,IAAD;AAAM,IAAA,KAAK,EAAE;AAAEL,MAAAA,KAAF;AAASC,MAAAA;AAAT;AAAb,KAAiCF,QAAjC,CADJ,CADJ;AAKH,CAnCM","sourcesContent":["import React from 'react';\nimport { FlexStyle, View } from 'react-native';\nimport Animated, { useAnimatedStyle } from 'react-native-reanimated';\nimport type { IComputedAnimResult } from './hooks/useComputedAnim';\nimport { useOffsetX } from './hooks/useOffsetX';\n\nexport const CarouselItem: React.FC<{\n loop?: boolean;\n index: number;\n handlerOffsetX: Animated.SharedValue<number>;\n width: number;\n height?: FlexStyle['height'];\n computedAnimResult: IComputedAnimResult;\n}> = (props) => {\n const {\n handlerOffsetX,\n index,\n children,\n width,\n height = '100%',\n computedAnimResult,\n loop,\n } = props;\n const x = useOffsetX({\n handlerOffsetX,\n index,\n width,\n computedAnimResult,\n loop,\n });\n const offsetXStyle = useAnimatedStyle(() => {\n return {\n transform: [{ translateX: x.value - index * width }],\n };\n }, []);\n\n return (\n <Animated.View style={offsetXStyle}>\n <View style={{ width, height }}>{children}</View>\n </Animated.View>\n );\n};\n"]}
1
+ {"version":3,"sources":["CarouselItem.tsx"],"names":["React","View","Animated","useAnimatedStyle","useOffsetX","CarouselItem","props","handlerOffsetX","index","children","width","height","loop","data","x","offsetXStyle","transform","translateX","value"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,SAAoBC,IAApB,QAAgC,cAAhC;AACA,OAAOC,QAAP,IAAmBC,gBAAnB,QAA2C,yBAA3C;AACA,SAASC,UAAT,QAA2B,oBAA3B;AAEA,OAAO,MAAMC,YAOX,GAAIC,KAAD,IAAW;AACZ,QAAM;AACFC,IAAAA,cADE;AAEFC,IAAAA,KAFE;AAGFC,IAAAA,QAHE;AAIFC,IAAAA,KAJE;AAKFC,IAAAA,MAAM,GAAG,MALP;AAMFC,IAAAA,IANE;AAOFC,IAAAA;AAPE,MAQFP,KARJ;AAUA,QAAMQ,CAAC,GAAGV,UAAU,CAAC;AACjBG,IAAAA,cADiB;AAEjBC,IAAAA,KAFiB;AAGjBE,IAAAA,KAHiB;AAIjBG,IAAAA,IAJiB;AAKjBD,IAAAA;AALiB,GAAD,CAApB;AAQA,QAAMG,YAAY,GAAGZ,gBAAgB,CAAC,MAAM;AACxC,WAAO;AACHa,MAAAA,SAAS,EAAE,CAAC;AAAEC,QAAAA,UAAU,EAAEH,CAAC,CAACI,KAAF,GAAUV,KAAK,GAAGE;AAAhC,OAAD;AADR,KAAP;AAGH,GAJoC,EAIlC,EAJkC,CAArC;AAMA,sBACI,oBAAC,QAAD,CAAU,IAAV;AAAe,IAAA,KAAK,EAAEK;AAAtB,kBACI,oBAAC,IAAD;AAAM,IAAA,KAAK,EAAE;AAAEL,MAAAA,KAAF;AAASC,MAAAA;AAAT;AAAb,KAAiCF,QAAjC,CADJ,CADJ;AAKH,CArCM","sourcesContent":["import React from 'react';\nimport { FlexStyle, View } from 'react-native';\nimport Animated, { useAnimatedStyle } from 'react-native-reanimated';\nimport { useOffsetX } from './hooks/useOffsetX';\n\nexport const CarouselItem: React.FC<{\n loop?: boolean;\n index: number;\n handlerOffsetX: Animated.SharedValue<number>;\n width: number;\n data: unknown[];\n height?: FlexStyle['height'];\n}> = (props) => {\n const {\n handlerOffsetX,\n index,\n children,\n width,\n height = '100%',\n loop,\n data,\n } = props;\n\n const x = useOffsetX({\n handlerOffsetX,\n index,\n width,\n data,\n loop,\n });\n\n const offsetXStyle = useAnimatedStyle(() => {\n return {\n transform: [{ translateX: x.value - index * width }],\n };\n }, []);\n\n return (\n <Animated.View style={offsetXStyle}>\n <View style={{ width, height }}>{children}</View>\n </Animated.View>\n );\n};\n"]}
@@ -4,28 +4,55 @@ export const useOffsetX = opts => {
4
4
  handlerOffsetX,
5
5
  index,
6
6
  width,
7
- computedAnimResult,
8
- loop
7
+ loop,
8
+ data,
9
+ type = 'positive',
10
+ viewCount = Math.round((data.length - 1) / 2)
9
11
  } = opts;
12
+ const ITEM_LENGTH = data.length;
13
+ const VALID_LENGTH = ITEM_LENGTH - 1;
14
+ const TOTAL_WIDTH = width * ITEM_LENGTH;
15
+ const HALF_WIDTH = 0.5 * width;
10
16
  const x = useDerivedValue(() => {
11
- const {
12
- MAX,
13
- MIN,
14
- TOTAL_WIDTH,
15
- HALF_WIDTH
16
- } = computedAnimResult;
17
+ const defaultPos = width * index;
17
18
 
18
19
  if (loop) {
19
- const defaultPos = width * index;
20
- const startPos = defaultPos > MAX ? MAX - defaultPos : defaultPos < MIN ? MIN - defaultPos : defaultPos;
21
- const inputRange = [-TOTAL_WIDTH, -(MAX + HALF_WIDTH) - startPos - 1, -(MAX + HALF_WIDTH) - startPos, 0, MAX + HALF_WIDTH - startPos, MAX + HALF_WIDTH - startPos + 1, TOTAL_WIDTH];
22
- const outputRange = [startPos, 1.5 * width - 1, -(MAX + HALF_WIDTH), startPos, MAX + HALF_WIDTH, -(1.5 * width - 1), startPos];
20
+ function getDefaultPos(_type, _count) {
21
+ let MAX = null;
22
+ let MIN = null;
23
+ let startPos = defaultPos;
24
+
25
+ if (_type === 'positive') {
26
+ MAX = _count * width;
27
+ MIN = -(VALID_LENGTH - _count) * width;
28
+ } else {
29
+ MAX = (VALID_LENGTH - _count) * width;
30
+ MIN = -_count * width;
31
+ }
32
+
33
+ if (defaultPos > MAX) {
34
+ startPos = MAX - defaultPos;
35
+ }
36
+
37
+ return {
38
+ startPos,
39
+ MAX,
40
+ MIN
41
+ };
42
+ }
43
+
44
+ const {
45
+ startPos,
46
+ MAX,
47
+ MIN
48
+ } = getDefaultPos(type, viewCount);
49
+ const inputRange = [-TOTAL_WIDTH, MIN - HALF_WIDTH - startPos - 1, MIN - HALF_WIDTH - startPos, 0, MAX + HALF_WIDTH - startPos, MAX + HALF_WIDTH - startPos + 1, TOTAL_WIDTH];
50
+ const outputRange = [startPos, MAX + HALF_WIDTH - 1, MIN - HALF_WIDTH, startPos, MAX + HALF_WIDTH, MIN - HALF_WIDTH + 1, startPos];
23
51
  return interpolate(Math.round(handlerOffsetX.value), inputRange.map(Math.round), outputRange.map(Math.round), Extrapolate.CLAMP);
24
52
  }
25
53
 
26
- const startPos = width * index;
27
- return handlerOffsetX.value + startPos;
28
- }, [loop, computedAnimResult]);
54
+ return handlerOffsetX.value + defaultPos;
55
+ }, [loop, data, viewCount, type]);
29
56
  return x;
30
57
  };
31
58
  //# sourceMappingURL=useOffsetX.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["useOffsetX.ts"],"names":["Extrapolate","interpolate","useDerivedValue","useOffsetX","opts","handlerOffsetX","index","width","computedAnimResult","loop","x","MAX","MIN","TOTAL_WIDTH","HALF_WIDTH","defaultPos","startPos","inputRange","outputRange","Math","round","value","map","CLAMP"],"mappings":"AAAA,SACIA,WADJ,EAEIC,WAFJ,EAGIC,eAHJ,QAIO,yBAJP;AAeA,OAAO,MAAMC,UAAU,GAAIC,IAAD,IAAiB;AACvC,QAAM;AAAEC,IAAAA,cAAF;AAAkBC,IAAAA,KAAlB;AAAyBC,IAAAA,KAAzB;AAAgCC,IAAAA,kBAAhC;AAAoDC,IAAAA;AAApD,MAA6DL,IAAnE;AACA,QAAMM,CAAC,GAAGR,eAAe,CAAC,MAAM;AAC5B,UAAM;AAAES,MAAAA,GAAF;AAAOC,MAAAA,GAAP;AAAYC,MAAAA,WAAZ;AAAyBC,MAAAA;AAAzB,QAAwCN,kBAA9C;;AACA,QAAIC,IAAJ,EAAU;AACN,YAAMM,UAAU,GAAGR,KAAK,GAAGD,KAA3B;AACA,YAAMU,QAAQ,GACVD,UAAU,GAAGJ,GAAb,GACMA,GAAG,GAAGI,UADZ,GAEMA,UAAU,GAAGH,GAAb,GACAA,GAAG,GAAGG,UADN,GAEAA,UALV;AAOA,YAAME,UAAU,GAAG,CACf,CAACJ,WADc,EAEf,EAAEF,GAAG,GAAGG,UAAR,IAAsBE,QAAtB,GAAiC,CAFlB,EAGf,EAAEL,GAAG,GAAGG,UAAR,IAAsBE,QAHP,EAIf,CAJe,EAKfL,GAAG,GAAGG,UAAN,GAAmBE,QALJ,EAMfL,GAAG,GAAGG,UAAN,GAAmBE,QAAnB,GAA8B,CANf,EAOfH,WAPe,CAAnB;AAUA,YAAMK,WAAW,GAAG,CAChBF,QADgB,EAEhB,MAAMT,KAAN,GAAc,CAFE,EAGhB,EAAEI,GAAG,GAAGG,UAAR,CAHgB,EAIhBE,QAJgB,EAKhBL,GAAG,GAAGG,UALU,EAMhB,EAAE,MAAMP,KAAN,GAAc,CAAhB,CANgB,EAOhBS,QAPgB,CAApB;AAUA,aAAOf,WAAW,CACdkB,IAAI,CAACC,KAAL,CAAWf,cAAc,CAACgB,KAA1B,CADc,EAEdJ,UAAU,CAACK,GAAX,CAAeH,IAAI,CAACC,KAApB,CAFc,EAGdF,WAAW,CAACI,GAAZ,CAAgBH,IAAI,CAACC,KAArB,CAHc,EAIdpB,WAAW,CAACuB,KAJE,CAAlB;AAMH;;AAED,UAAMP,QAAQ,GAAGT,KAAK,GAAGD,KAAzB;AACA,WAAOD,cAAc,CAACgB,KAAf,GAAuBL,QAA9B;AACH,GAzCwB,EAyCtB,CAACP,IAAD,EAAOD,kBAAP,CAzCsB,CAAzB;AA0CA,SAAOE,CAAP;AACH,CA7CM","sourcesContent":["import Animated, {\n Extrapolate,\n interpolate,\n useDerivedValue,\n} from 'react-native-reanimated';\nimport type { IComputedAnimResult } from './useComputedAnim';\n\ninterface IOpts {\n index: number;\n width: number;\n computedAnimResult: IComputedAnimResult;\n handlerOffsetX: Animated.SharedValue<number>;\n loop?: boolean;\n}\n\nexport const useOffsetX = (opts: IOpts) => {\n const { handlerOffsetX, index, width, computedAnimResult, loop } = opts;\n const x = useDerivedValue(() => {\n const { MAX, MIN, TOTAL_WIDTH, HALF_WIDTH } = computedAnimResult;\n if (loop) {\n const defaultPos = width * index;\n const startPos =\n defaultPos > MAX\n ? MAX - defaultPos\n : defaultPos < MIN\n ? MIN - defaultPos\n : defaultPos;\n\n const inputRange = [\n -TOTAL_WIDTH,\n -(MAX + HALF_WIDTH) - startPos - 1,\n -(MAX + HALF_WIDTH) - startPos,\n 0,\n MAX + HALF_WIDTH - startPos,\n MAX + HALF_WIDTH - startPos + 1,\n TOTAL_WIDTH,\n ];\n\n const outputRange = [\n startPos,\n 1.5 * width - 1,\n -(MAX + HALF_WIDTH),\n startPos,\n MAX + HALF_WIDTH,\n -(1.5 * width - 1),\n startPos,\n ];\n\n return interpolate(\n Math.round(handlerOffsetX.value),\n inputRange.map(Math.round),\n outputRange.map(Math.round),\n Extrapolate.CLAMP\n );\n }\n\n const startPos = width * index;\n return handlerOffsetX.value + startPos;\n }, [loop, computedAnimResult]);\n return x;\n};\n"]}
1
+ {"version":3,"sources":["useOffsetX.ts"],"names":["Extrapolate","interpolate","useDerivedValue","useOffsetX","opts","handlerOffsetX","index","width","loop","data","type","viewCount","Math","round","length","ITEM_LENGTH","VALID_LENGTH","TOTAL_WIDTH","HALF_WIDTH","x","defaultPos","getDefaultPos","_type","_count","MAX","MIN","startPos","inputRange","outputRange","value","map","CLAMP"],"mappings":"AAAA,SACIA,WADJ,EAEIC,WAFJ,EAGIC,eAHJ,QAIO,yBAJP;AAgBA,OAAO,MAAMC,UAAU,GAAIC,IAAD,IAAiB;AACvC,QAAM;AACFC,IAAAA,cADE;AAEFC,IAAAA,KAFE;AAGFC,IAAAA,KAHE;AAIFC,IAAAA,IAJE;AAKFC,IAAAA,IALE;AAMFC,IAAAA,IAAI,GAAG,UANL;AAOFC,IAAAA,SAAS,GAAGC,IAAI,CAACC,KAAL,CAAW,CAACJ,IAAI,CAACK,MAAL,GAAc,CAAf,IAAoB,CAA/B;AAPV,MAQFV,IARJ;AASA,QAAMW,WAAW,GAAGN,IAAI,CAACK,MAAzB;AACA,QAAME,YAAY,GAAGD,WAAW,GAAG,CAAnC;AACA,QAAME,WAAW,GAAGV,KAAK,GAAGQ,WAA5B;AACA,QAAMG,UAAU,GAAG,MAAMX,KAAzB;AAEA,QAAMY,CAAC,GAAGjB,eAAe,CAAC,MAAM;AAC5B,UAAMkB,UAAU,GAAGb,KAAK,GAAGD,KAA3B;;AACA,QAAIE,IAAJ,EAAU;AACN,eAASa,aAAT,CACIC,KADJ,EAEIC,MAFJ,EAOE;AACE,YAAIC,GAAG,GAAG,IAAV;AACA,YAAIC,GAAG,GAAG,IAAV;AAEA,YAAIC,QAAgB,GAAGN,UAAvB;;AAEA,YAAIE,KAAK,KAAK,UAAd,EAA0B;AACtBE,UAAAA,GAAG,GAAGD,MAAM,GAAGhB,KAAf;AACAkB,UAAAA,GAAG,GAAG,EAAET,YAAY,GAAGO,MAAjB,IAA2BhB,KAAjC;AACH,SAHD,MAGO;AACHiB,UAAAA,GAAG,GAAG,CAACR,YAAY,GAAGO,MAAhB,IAA0BhB,KAAhC;AACAkB,UAAAA,GAAG,GAAG,CAACF,MAAD,GAAUhB,KAAhB;AACH;;AAED,YAAIa,UAAU,GAAGI,GAAjB,EAAsB;AAClBE,UAAAA,QAAQ,GAAGF,GAAG,GAAGJ,UAAjB;AACH;;AAED,eAAO;AACHM,UAAAA,QADG;AAEHF,UAAAA,GAFG;AAGHC,UAAAA;AAHG,SAAP;AAKH;;AAED,YAAM;AAAEC,QAAAA,QAAF;AAAYF,QAAAA,GAAZ;AAAiBC,QAAAA;AAAjB,UAAyBJ,aAAa,CAACX,IAAD,EAAOC,SAAP,CAA5C;AAEA,YAAMgB,UAAU,GAAG,CACf,CAACV,WADc,EAEfQ,GAAG,GAAGP,UAAN,GAAmBQ,QAAnB,GAA8B,CAFf,EAGfD,GAAG,GAAGP,UAAN,GAAmBQ,QAHJ,EAIf,CAJe,EAKfF,GAAG,GAAGN,UAAN,GAAmBQ,QALJ,EAMfF,GAAG,GAAGN,UAAN,GAAmBQ,QAAnB,GAA8B,CANf,EAOfT,WAPe,CAAnB;AAUA,YAAMW,WAAW,GAAG,CAChBF,QADgB,EAEhBF,GAAG,GAAGN,UAAN,GAAmB,CAFH,EAGhBO,GAAG,GAAGP,UAHU,EAIhBQ,QAJgB,EAKhBF,GAAG,GAAGN,UALU,EAMhBO,GAAG,GAAGP,UAAN,GAAmB,CANH,EAOhBQ,QAPgB,CAApB;AAUA,aAAOzB,WAAW,CACdW,IAAI,CAACC,KAAL,CAAWR,cAAc,CAACwB,KAA1B,CADc,EAEdF,UAAU,CAACG,GAAX,CAAelB,IAAI,CAACC,KAApB,CAFc,EAGde,WAAW,CAACE,GAAZ,CAAgBlB,IAAI,CAACC,KAArB,CAHc,EAIdb,WAAW,CAAC+B,KAJE,CAAlB;AAMH;;AAED,WAAO1B,cAAc,CAACwB,KAAf,GAAuBT,UAA9B;AACH,GAlEwB,EAkEtB,CAACZ,IAAD,EAAOC,IAAP,EAAaE,SAAb,EAAwBD,IAAxB,CAlEsB,CAAzB;AAoEA,SAAOS,CAAP;AACH,CApFM","sourcesContent":["import Animated, {\n Extrapolate,\n interpolate,\n useDerivedValue,\n} from 'react-native-reanimated';\n\ninterface IOpts {\n index: number;\n width: number;\n handlerOffsetX: Animated.SharedValue<number>;\n data: unknown[];\n type?: 'positive' | 'negative';\n viewCount?: number;\n loop?: boolean;\n}\n\nexport const useOffsetX = (opts: IOpts) => {\n const {\n handlerOffsetX,\n index,\n width,\n loop,\n data,\n type = 'positive',\n viewCount = Math.round((data.length - 1) / 2),\n } = opts;\n const ITEM_LENGTH = data.length;\n const VALID_LENGTH = ITEM_LENGTH - 1;\n const TOTAL_WIDTH = width * ITEM_LENGTH;\n const HALF_WIDTH = 0.5 * width;\n\n const x = useDerivedValue(() => {\n const defaultPos = width * index;\n if (loop) {\n function getDefaultPos(\n _type: 'positive' | 'negative',\n _count: number\n ): {\n MAX: number;\n MIN: number;\n startPos: number;\n } {\n let MAX = null;\n let MIN = null;\n\n let startPos: number = defaultPos;\n\n if (_type === 'positive') {\n MAX = _count * width;\n MIN = -(VALID_LENGTH - _count) * width;\n } else {\n MAX = (VALID_LENGTH - _count) * width;\n MIN = -_count * width;\n }\n\n if (defaultPos > MAX) {\n startPos = MAX - defaultPos;\n }\n\n return {\n startPos,\n MAX,\n MIN,\n };\n }\n\n const { startPos, MAX, MIN } = getDefaultPos(type, viewCount);\n\n const inputRange = [\n -TOTAL_WIDTH,\n MIN - HALF_WIDTH - startPos - 1,\n MIN - HALF_WIDTH - startPos,\n 0,\n MAX + HALF_WIDTH - startPos,\n MAX + HALF_WIDTH - startPos + 1,\n TOTAL_WIDTH,\n ];\n\n const outputRange = [\n startPos,\n MAX + HALF_WIDTH - 1,\n MIN - HALF_WIDTH,\n startPos,\n MAX + HALF_WIDTH,\n MIN - HALF_WIDTH + 1,\n startPos,\n ];\n\n return interpolate(\n Math.round(handlerOffsetX.value),\n inputRange.map(Math.round),\n outputRange.map(Math.round),\n Extrapolate.CLAMP\n );\n }\n\n return handlerOffsetX.value + defaultPos;\n }, [loop, data, viewCount, type]);\n\n return x;\n};\n"]}
@@ -11,14 +11,14 @@ export const ParallaxLayout = props => {
11
11
  index,
12
12
  width,
13
13
  loop,
14
- children,
15
- computedAnimResult
14
+ data,
15
+ children
16
16
  } = props;
17
17
  const x = useOffsetX({
18
18
  handlerOffsetX,
19
19
  index,
20
20
  width,
21
- computedAnimResult,
21
+ data,
22
22
  loop
23
23
  });
24
24
  const offsetXStyle = useAnimatedStyle(() => {
@@ -1 +1 @@
1
- {"version":3,"sources":["ParallaxLayout.tsx"],"names":["React","View","Animated","Extrapolate","interpolate","useAnimatedStyle","useOffsetX","ParallaxLayout","props","handlerOffsetX","parallaxScrollingOffset","parallaxScrollingScale","index","width","loop","children","computedAnimResult","x","offsetXStyle","baseTranslateX","value","padding","extraOffset","zIndex","CLAMP","scale","relatedTranslateX","transform","translateX","height","alignSelf","flex"],"mappings":"AAAA;AACA,OAAOA,KAAP,MAAkB,OAAlB;AACA,SAASC,IAAT,QAAqB,cAArB;AACA,OAAOC,QAAP,IACIC,WADJ,EAEIC,WAFJ,EAGIC,gBAHJ,QAIO,yBAJP;AAMA,SAASC,UAAT,QAA2B,qBAA3B;AAEA,OAAO,MAAMC,cAQX,GAAIC,KAAD,IAAW;AACZ,QAAM;AACFC,IAAAA,cADE;AAEFC,IAAAA,uBAAuB,GAAG,GAFxB;AAGFC,IAAAA,sBAAsB,GAAG,GAHvB;AAIFC,IAAAA,KAJE;AAKFC,IAAAA,KALE;AAMFC,IAAAA,IANE;AAOFC,IAAAA,QAPE;AAQFC,IAAAA;AARE,MASFR,KATJ;AAWA,QAAMS,CAAC,GAAGX,UAAU,CAAC;AACjBG,IAAAA,cADiB;AAEjBG,IAAAA,KAFiB;AAGjBC,IAAAA,KAHiB;AAIjBG,IAAAA,kBAJiB;AAKjBF,IAAAA;AALiB,GAAD,CAApB;AAQA,QAAMI,YAAY,GAAGb,gBAAgB,CAAC,MAAM;AACxC,UAAMc,cAAc,GAAGF,CAAC,CAACG,KAAF,GAAUR,KAAK,GAAGC,KAAzC;AACA,UAAMQ,OAAO,GAAG,CAAC,IAAIV,sBAAL,IAA+BE,KAA/C;AACA,UAAMS,WAAW,GAAGV,KAAK,GAAGS,OAAR,GAAkBA,OAAO,GAAG,CAAhD;AAEA,UAAME,MAAM,GAAGnB,WAAW,CACtBa,CAAC,CAACG,KADoB,EAEtB,CAAC,CAACP,KAAF,EAAS,CAAT,EAAYA,KAAZ,CAFsB,EAGtB,CAAC,CAAD,EAAIA,KAAJ,EAAW,CAAX,CAHsB,EAItBV,WAAW,CAACqB,KAJU,CAA1B;AAMA,UAAMC,KAAK,GAAGrB,WAAW,CACrBa,CAAC,CAACG,KADmB,EAErB,CAAC,CAACP,KAAF,EAAS,CAAT,EAAYA,KAAZ,CAFqB,EAGrB,CAACF,sBAAD,EAAyB,CAAzB,EAA4BA,sBAA5B,CAHqB,EAIrBR,WAAW,CAACqB,KAJS,CAAzB;AAMA,UAAME,iBAAiB,GAAGtB,WAAW,CACjCa,CAAC,CAACG,KAD+B,EAEjC,CAAC,CAACP,KAAF,EAAS,CAAT,EAAYA,KAAZ,CAFiC,EAGjC,CAACH,uBAAD,EAA0B,CAA1B,EAA6B,CAACA,uBAA9B,CAHiC,EAIjCP,WAAW,CAACqB,KAJqB,CAArC;AAMA,WAAO;AACHG,MAAAA,SAAS,EAAE,CACP;AACIC,QAAAA,UAAU,EACNT,cAAc,GAAGG,WAAjB,GAA+BI;AAFvC,OADO,EAKP;AAAED,QAAAA;AAAF,OALO,CADR;AAQHF,MAAAA;AARG,KAAP;AAUH,GAjCoC,EAiClC,CAACT,IAAD,CAjCkC,CAArC;AAmCA,sBACI,oBAAC,QAAD,CAAU,IAAV;AACI,IAAA,KAAK,EAAE,CACH;AACID,MAAAA,KAAK,EAAG,GAAEF,sBAAsB,GAAG,GAAI,GAD3C;AAEIkB,MAAAA,MAAM,EAAG,GAAElB,sBAAsB,GAAG,GAAI,GAF5C;AAGImB,MAAAA,SAAS,EAAE;AAHf,KADG,EAMHZ,YANG;AADX,kBAUI,oBAAC,IAAD;AAAM,IAAA,KAAK,EAAE;AAAEa,MAAAA,IAAI,EAAE;AAAR;AAAb,KAA2BhB,QAA3B,CAVJ,CADJ;AAcH,CA7EM","sourcesContent":["/* eslint-disable react-native/no-inline-styles */\nimport React from 'react';\nimport { View } from 'react-native';\nimport Animated, {\n Extrapolate,\n interpolate,\n useAnimatedStyle,\n} from 'react-native-reanimated';\nimport type { IComputedAnimResult } from 'src/hooks/useComputedAnim';\nimport { useOffsetX } from '../hooks/useOffsetX';\n\nexport const ParallaxLayout: React.FC<{\n loop?: boolean;\n parallaxScrollingOffset?: number;\n parallaxScrollingScale?: number;\n handlerOffsetX: Animated.SharedValue<number>;\n index: number;\n width: number;\n computedAnimResult: IComputedAnimResult;\n}> = (props) => {\n const {\n handlerOffsetX,\n parallaxScrollingOffset = 100,\n parallaxScrollingScale = 0.8,\n index,\n width,\n loop,\n children,\n computedAnimResult,\n } = props;\n\n const x = useOffsetX({\n handlerOffsetX,\n index,\n width,\n computedAnimResult,\n loop,\n });\n\n const offsetXStyle = useAnimatedStyle(() => {\n const baseTranslateX = x.value - index * width;\n const padding = (1 - parallaxScrollingScale) * width;\n const extraOffset = index * padding + padding / 2;\n\n const zIndex = interpolate(\n x.value,\n [-width, 0, width],\n [0, width, 0],\n Extrapolate.CLAMP\n );\n const scale = interpolate(\n x.value,\n [-width, 0, width],\n [parallaxScrollingScale, 1, parallaxScrollingScale],\n Extrapolate.CLAMP\n );\n const relatedTranslateX = interpolate(\n x.value,\n [-width, 0, width],\n [parallaxScrollingOffset, 0, -parallaxScrollingOffset],\n Extrapolate.CLAMP\n );\n return {\n transform: [\n {\n translateX:\n baseTranslateX + extraOffset + relatedTranslateX,\n },\n { scale },\n ],\n zIndex,\n };\n }, [loop]);\n\n return (\n <Animated.View\n style={[\n {\n width: `${parallaxScrollingScale * 100}%`,\n height: `${parallaxScrollingScale * 100}%`,\n alignSelf: 'center',\n },\n offsetXStyle,\n ]}\n >\n <View style={{ flex: 1 }}>{children}</View>\n </Animated.View>\n );\n};\n"]}
1
+ {"version":3,"sources":["ParallaxLayout.tsx"],"names":["React","View","Animated","Extrapolate","interpolate","useAnimatedStyle","useOffsetX","ParallaxLayout","props","handlerOffsetX","parallaxScrollingOffset","parallaxScrollingScale","index","width","loop","data","children","x","offsetXStyle","baseTranslateX","value","padding","extraOffset","zIndex","CLAMP","scale","relatedTranslateX","transform","translateX","height","alignSelf","flex"],"mappings":"AAAA;AACA,OAAOA,KAAP,MAAkB,OAAlB;AACA,SAASC,IAAT,QAAqB,cAArB;AACA,OAAOC,QAAP,IACIC,WADJ,EAEIC,WAFJ,EAGIC,gBAHJ,QAIO,yBAJP;AAKA,SAASC,UAAT,QAA2B,qBAA3B;AAEA,OAAO,MAAMC,cAQX,GAAIC,KAAD,IAAW;AACZ,QAAM;AACFC,IAAAA,cADE;AAEFC,IAAAA,uBAAuB,GAAG,GAFxB;AAGFC,IAAAA,sBAAsB,GAAG,GAHvB;AAIFC,IAAAA,KAJE;AAKFC,IAAAA,KALE;AAMFC,IAAAA,IANE;AAOFC,IAAAA,IAPE;AAQFC,IAAAA;AARE,MASFR,KATJ;AAWA,QAAMS,CAAC,GAAGX,UAAU,CAAC;AACjBG,IAAAA,cADiB;AAEjBG,IAAAA,KAFiB;AAGjBC,IAAAA,KAHiB;AAIjBE,IAAAA,IAJiB;AAKjBD,IAAAA;AALiB,GAAD,CAApB;AAQA,QAAMI,YAAY,GAAGb,gBAAgB,CAAC,MAAM;AACxC,UAAMc,cAAc,GAAGF,CAAC,CAACG,KAAF,GAAUR,KAAK,GAAGC,KAAzC;AACA,UAAMQ,OAAO,GAAG,CAAC,IAAIV,sBAAL,IAA+BE,KAA/C;AACA,UAAMS,WAAW,GAAGV,KAAK,GAAGS,OAAR,GAAkBA,OAAO,GAAG,CAAhD;AAEA,UAAME,MAAM,GAAGnB,WAAW,CACtBa,CAAC,CAACG,KADoB,EAEtB,CAAC,CAACP,KAAF,EAAS,CAAT,EAAYA,KAAZ,CAFsB,EAGtB,CAAC,CAAD,EAAIA,KAAJ,EAAW,CAAX,CAHsB,EAItBV,WAAW,CAACqB,KAJU,CAA1B;AAMA,UAAMC,KAAK,GAAGrB,WAAW,CACrBa,CAAC,CAACG,KADmB,EAErB,CAAC,CAACP,KAAF,EAAS,CAAT,EAAYA,KAAZ,CAFqB,EAGrB,CAACF,sBAAD,EAAyB,CAAzB,EAA4BA,sBAA5B,CAHqB,EAIrBR,WAAW,CAACqB,KAJS,CAAzB;AAMA,UAAME,iBAAiB,GAAGtB,WAAW,CACjCa,CAAC,CAACG,KAD+B,EAEjC,CAAC,CAACP,KAAF,EAAS,CAAT,EAAYA,KAAZ,CAFiC,EAGjC,CAACH,uBAAD,EAA0B,CAA1B,EAA6B,CAACA,uBAA9B,CAHiC,EAIjCP,WAAW,CAACqB,KAJqB,CAArC;AAMA,WAAO;AACHG,MAAAA,SAAS,EAAE,CACP;AACIC,QAAAA,UAAU,EACNT,cAAc,GAAGG,WAAjB,GAA+BI;AAFvC,OADO,EAKP;AAAED,QAAAA;AAAF,OALO,CADR;AAQHF,MAAAA;AARG,KAAP;AAUH,GAjCoC,EAiClC,CAACT,IAAD,CAjCkC,CAArC;AAmCA,sBACI,oBAAC,QAAD,CAAU,IAAV;AACI,IAAA,KAAK,EAAE,CACH;AACID,MAAAA,KAAK,EAAG,GAAEF,sBAAsB,GAAG,GAAI,GAD3C;AAEIkB,MAAAA,MAAM,EAAG,GAAElB,sBAAsB,GAAG,GAAI,GAF5C;AAGImB,MAAAA,SAAS,EAAE;AAHf,KADG,EAMHZ,YANG;AADX,kBAUI,oBAAC,IAAD;AAAM,IAAA,KAAK,EAAE;AAAEa,MAAAA,IAAI,EAAE;AAAR;AAAb,KAA2Bf,QAA3B,CAVJ,CADJ;AAcH,CA7EM","sourcesContent":["/* eslint-disable react-native/no-inline-styles */\nimport React from 'react';\nimport { View } from 'react-native';\nimport Animated, {\n Extrapolate,\n interpolate,\n useAnimatedStyle,\n} from 'react-native-reanimated';\nimport { useOffsetX } from '../hooks/useOffsetX';\n\nexport const ParallaxLayout: React.FC<{\n loop?: boolean;\n parallaxScrollingOffset?: number;\n parallaxScrollingScale?: number;\n handlerOffsetX: Animated.SharedValue<number>;\n index: number;\n width: number;\n data: unknown[];\n}> = (props) => {\n const {\n handlerOffsetX,\n parallaxScrollingOffset = 100,\n parallaxScrollingScale = 0.8,\n index,\n width,\n loop,\n data,\n children,\n } = props;\n\n const x = useOffsetX({\n handlerOffsetX,\n index,\n width,\n data,\n loop,\n });\n\n const offsetXStyle = useAnimatedStyle(() => {\n const baseTranslateX = x.value - index * width;\n const padding = (1 - parallaxScrollingScale) * width;\n const extraOffset = index * padding + padding / 2;\n\n const zIndex = interpolate(\n x.value,\n [-width, 0, width],\n [0, width, 0],\n Extrapolate.CLAMP\n );\n const scale = interpolate(\n x.value,\n [-width, 0, width],\n [parallaxScrollingScale, 1, parallaxScrollingScale],\n Extrapolate.CLAMP\n );\n const relatedTranslateX = interpolate(\n x.value,\n [-width, 0, width],\n [parallaxScrollingOffset, 0, -parallaxScrollingOffset],\n Extrapolate.CLAMP\n );\n return {\n transform: [\n {\n translateX:\n baseTranslateX + extraOffset + relatedTranslateX,\n },\n { scale },\n ],\n zIndex,\n };\n }, [loop]);\n\n return (\n <Animated.View\n style={[\n {\n width: `${parallaxScrollingScale * 100}%`,\n height: `${parallaxScrollingScale * 100}%`,\n alignSelf: 'center',\n },\n offsetXStyle,\n ]}\n >\n <View style={{ flex: 1 }}>{children}</View>\n </Animated.View>\n );\n};\n"]}
@@ -1,12 +1,11 @@
1
1
  import React from 'react';
2
2
  import { FlexStyle } from 'react-native';
3
3
  import Animated from 'react-native-reanimated';
4
- import type { IComputedAnimResult } from './hooks/useComputedAnim';
5
4
  export declare const CarouselItem: React.FC<{
6
5
  loop?: boolean;
7
6
  index: number;
8
7
  handlerOffsetX: Animated.SharedValue<number>;
9
8
  width: number;
9
+ data: unknown[];
10
10
  height?: FlexStyle['height'];
11
- computedAnimResult: IComputedAnimResult;
12
11
  }>;
@@ -1,10 +1,11 @@
1
1
  import Animated from 'react-native-reanimated';
2
- import type { IComputedAnimResult } from './useComputedAnim';
3
2
  interface IOpts {
4
3
  index: number;
5
4
  width: number;
6
- computedAnimResult: IComputedAnimResult;
7
5
  handlerOffsetX: Animated.SharedValue<number>;
6
+ data: unknown[];
7
+ type?: 'positive' | 'negative';
8
+ viewCount?: number;
8
9
  loop?: boolean;
9
10
  }
10
11
  export declare const useOffsetX: (opts: IOpts) => Readonly<Animated.SharedValue<number>>;
@@ -1,6 +1,5 @@
1
1
  import React from 'react';
2
2
  import Animated from 'react-native-reanimated';
3
- import type { IComputedAnimResult } from 'src/hooks/useComputedAnim';
4
3
  export declare const ParallaxLayout: React.FC<{
5
4
  loop?: boolean;
6
5
  parallaxScrollingOffset?: number;
@@ -8,5 +7,5 @@ export declare const ParallaxLayout: React.FC<{
8
7
  handlerOffsetX: Animated.SharedValue<number>;
9
8
  index: number;
10
9
  width: number;
11
- computedAnimResult: IComputedAnimResult;
10
+ data: unknown[];
12
11
  }>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-reanimated-carousel",
3
- "version": "1.0.6",
3
+ "version": "1.0.7",
4
4
  "description": "Simple carousel component.fully implemented using Reanimated 2.Infinitely scrolling, very smooth.",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",
package/src/Carousel.tsx CHANGED
@@ -18,7 +18,6 @@ import { CarouselItem } from './CarouselItem';
18
18
  import type { TMode } from './layouts';
19
19
  import { ParallaxLayout } from './layouts/index';
20
20
  import { useCarouselController } from './hooks/useCarouselController';
21
- import { useComputedAnim } from './hooks/useComputedAnim';
22
21
  import { useAutoPlay } from './hooks/useAutoPlay';
23
22
  import { useIndexController } from './hooks/useIndexController';
24
23
  import { usePropsErrorBoundary } from './hooks/usePropsErrorBoundary';
@@ -204,8 +203,6 @@ function Carousel<T extends unknown = any>(
204
203
  return _data;
205
204
  }, [_data, loop]);
206
205
 
207
- const computedAnimResult = useComputedAnim(width, data.length);
208
-
209
206
  const indexController = useIndexController({
210
207
  originalLength: _data.length,
211
208
  length: data.length,
@@ -247,13 +244,14 @@ function Carousel<T extends unknown = any>(
247
244
  }, [sharedPreIndex, sharedIndex, computedIndex, props, run]);
248
245
 
249
246
  const offsetX = useDerivedValue(() => {
250
- const x = handlerOffsetX.value % computedAnimResult.TOTAL_WIDTH;
247
+ const totalWidth = width * data.length;
248
+ const x = handlerOffsetX.value % totalWidth;
251
249
 
252
250
  if (!loop) {
253
251
  return handlerOffsetX.value;
254
252
  }
255
253
  return isNaN(x) ? 0 : x;
256
- }, [computedAnimResult, loop]);
254
+ }, [loop, width, data]);
257
255
 
258
256
  useAnimatedReaction(
259
257
  () => offsetX.value,
@@ -389,7 +387,7 @@ function Carousel<T extends unknown = any>(
389
387
  <ParallaxLayout
390
388
  parallaxScrollingOffset={parallaxScrollingOffset}
391
389
  parallaxScrollingScale={parallaxScrollingScale}
392
- computedAnimResult={computedAnimResult}
390
+ data={data}
393
391
  width={width}
394
392
  handlerOffsetX={offsetX}
395
393
  index={i}
@@ -402,7 +400,7 @@ function Carousel<T extends unknown = any>(
402
400
  default:
403
401
  return (
404
402
  <CarouselItem
405
- computedAnimResult={computedAnimResult}
403
+ data={data}
406
404
  width={width}
407
405
  height={height}
408
406
  handlerOffsetX={offsetX}
@@ -418,7 +416,7 @@ function Carousel<T extends unknown = any>(
418
416
  [
419
417
  loop,
420
418
  mode,
421
- computedAnimResult,
419
+ data,
422
420
  height,
423
421
  offsetX,
424
422
  parallaxScrollingOffset,
@@ -1,7 +1,6 @@
1
1
  import React from 'react';
2
2
  import { FlexStyle, View } from 'react-native';
3
3
  import Animated, { useAnimatedStyle } from 'react-native-reanimated';
4
- import type { IComputedAnimResult } from './hooks/useComputedAnim';
5
4
  import { useOffsetX } from './hooks/useOffsetX';
6
5
 
7
6
  export const CarouselItem: React.FC<{
@@ -9,8 +8,8 @@ export const CarouselItem: React.FC<{
9
8
  index: number;
10
9
  handlerOffsetX: Animated.SharedValue<number>;
11
10
  width: number;
11
+ data: unknown[];
12
12
  height?: FlexStyle['height'];
13
- computedAnimResult: IComputedAnimResult;
14
13
  }> = (props) => {
15
14
  const {
16
15
  handlerOffsetX,
@@ -18,16 +17,18 @@ export const CarouselItem: React.FC<{
18
17
  children,
19
18
  width,
20
19
  height = '100%',
21
- computedAnimResult,
22
20
  loop,
21
+ data,
23
22
  } = props;
23
+
24
24
  const x = useOffsetX({
25
25
  handlerOffsetX,
26
26
  index,
27
27
  width,
28
- computedAnimResult,
28
+ data,
29
29
  loop,
30
30
  });
31
+
31
32
  const offsetXStyle = useAnimatedStyle(() => {
32
33
  return {
33
34
  transform: [{ translateX: x.value - index * width }],
@@ -3,33 +3,73 @@ import Animated, {
3
3
  interpolate,
4
4
  useDerivedValue,
5
5
  } from 'react-native-reanimated';
6
- import type { IComputedAnimResult } from './useComputedAnim';
7
6
 
8
7
  interface IOpts {
9
8
  index: number;
10
9
  width: number;
11
- computedAnimResult: IComputedAnimResult;
12
10
  handlerOffsetX: Animated.SharedValue<number>;
11
+ data: unknown[];
12
+ type?: 'positive' | 'negative';
13
+ viewCount?: number;
13
14
  loop?: boolean;
14
15
  }
15
16
 
16
17
  export const useOffsetX = (opts: IOpts) => {
17
- const { handlerOffsetX, index, width, computedAnimResult, loop } = opts;
18
+ const {
19
+ handlerOffsetX,
20
+ index,
21
+ width,
22
+ loop,
23
+ data,
24
+ type = 'positive',
25
+ viewCount = Math.round((data.length - 1) / 2),
26
+ } = opts;
27
+ const ITEM_LENGTH = data.length;
28
+ const VALID_LENGTH = ITEM_LENGTH - 1;
29
+ const TOTAL_WIDTH = width * ITEM_LENGTH;
30
+ const HALF_WIDTH = 0.5 * width;
31
+
18
32
  const x = useDerivedValue(() => {
19
- const { MAX, MIN, TOTAL_WIDTH, HALF_WIDTH } = computedAnimResult;
33
+ const defaultPos = width * index;
20
34
  if (loop) {
21
- const defaultPos = width * index;
22
- const startPos =
23
- defaultPos > MAX
24
- ? MAX - defaultPos
25
- : defaultPos < MIN
26
- ? MIN - defaultPos
27
- : defaultPos;
35
+ function getDefaultPos(
36
+ _type: 'positive' | 'negative',
37
+ _count: number
38
+ ): {
39
+ MAX: number;
40
+ MIN: number;
41
+ startPos: number;
42
+ } {
43
+ let MAX = null;
44
+ let MIN = null;
45
+
46
+ let startPos: number = defaultPos;
47
+
48
+ if (_type === 'positive') {
49
+ MAX = _count * width;
50
+ MIN = -(VALID_LENGTH - _count) * width;
51
+ } else {
52
+ MAX = (VALID_LENGTH - _count) * width;
53
+ MIN = -_count * width;
54
+ }
55
+
56
+ if (defaultPos > MAX) {
57
+ startPos = MAX - defaultPos;
58
+ }
59
+
60
+ return {
61
+ startPos,
62
+ MAX,
63
+ MIN,
64
+ };
65
+ }
66
+
67
+ const { startPos, MAX, MIN } = getDefaultPos(type, viewCount);
28
68
 
29
69
  const inputRange = [
30
70
  -TOTAL_WIDTH,
31
- -(MAX + HALF_WIDTH) - startPos - 1,
32
- -(MAX + HALF_WIDTH) - startPos,
71
+ MIN - HALF_WIDTH - startPos - 1,
72
+ MIN - HALF_WIDTH - startPos,
33
73
  0,
34
74
  MAX + HALF_WIDTH - startPos,
35
75
  MAX + HALF_WIDTH - startPos + 1,
@@ -38,11 +78,11 @@ export const useOffsetX = (opts: IOpts) => {
38
78
 
39
79
  const outputRange = [
40
80
  startPos,
41
- 1.5 * width - 1,
42
- -(MAX + HALF_WIDTH),
81
+ MAX + HALF_WIDTH - 1,
82
+ MIN - HALF_WIDTH,
43
83
  startPos,
44
84
  MAX + HALF_WIDTH,
45
- -(1.5 * width - 1),
85
+ MIN - HALF_WIDTH + 1,
46
86
  startPos,
47
87
  ];
48
88
 
@@ -54,8 +94,8 @@ export const useOffsetX = (opts: IOpts) => {
54
94
  );
55
95
  }
56
96
 
57
- const startPos = width * index;
58
- return handlerOffsetX.value + startPos;
59
- }, [loop, computedAnimResult]);
97
+ return handlerOffsetX.value + defaultPos;
98
+ }, [loop, data, viewCount, type]);
99
+
60
100
  return x;
61
101
  };
@@ -6,7 +6,6 @@ import Animated, {
6
6
  interpolate,
7
7
  useAnimatedStyle,
8
8
  } from 'react-native-reanimated';
9
- import type { IComputedAnimResult } from 'src/hooks/useComputedAnim';
10
9
  import { useOffsetX } from '../hooks/useOffsetX';
11
10
 
12
11
  export const ParallaxLayout: React.FC<{
@@ -16,7 +15,7 @@ export const ParallaxLayout: React.FC<{
16
15
  handlerOffsetX: Animated.SharedValue<number>;
17
16
  index: number;
18
17
  width: number;
19
- computedAnimResult: IComputedAnimResult;
18
+ data: unknown[];
20
19
  }> = (props) => {
21
20
  const {
22
21
  handlerOffsetX,
@@ -25,15 +24,15 @@ export const ParallaxLayout: React.FC<{
25
24
  index,
26
25
  width,
27
26
  loop,
27
+ data,
28
28
  children,
29
- computedAnimResult,
30
29
  } = props;
31
30
 
32
31
  const x = useOffsetX({
33
32
  handlerOffsetX,
34
33
  index,
35
34
  width,
36
- computedAnimResult,
35
+ data,
37
36
  loop,
38
37
  });
39
38
 
@@ -1,20 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.useComputedAnim = useComputedAnim;
7
-
8
- function useComputedAnim(width, ITEM_LENGTH) {
9
- const MAX = (ITEM_LENGTH - 2) * width;
10
- const MIN = -MAX;
11
- const TOTAL_WIDTH = width * ITEM_LENGTH;
12
- const HALF_WIDTH = 0.5 * width;
13
- return {
14
- MAX,
15
- MIN,
16
- TOTAL_WIDTH,
17
- HALF_WIDTH
18
- };
19
- }
20
- //# sourceMappingURL=useComputedAnim.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["useComputedAnim.ts"],"names":["useComputedAnim","width","ITEM_LENGTH","MAX","MIN","TOTAL_WIDTH","HALF_WIDTH"],"mappings":";;;;;;;AAOO,SAASA,eAAT,CACHC,KADG,EAEHC,WAFG,EAGgB;AACnB,QAAMC,GAAG,GAAG,CAACD,WAAW,GAAG,CAAf,IAAoBD,KAAhC;AACA,QAAMG,GAAG,GAAG,CAACD,GAAb;AACA,QAAME,WAAW,GAAGJ,KAAK,GAAGC,WAA5B;AACA,QAAMI,UAAU,GAAG,MAAML,KAAzB;AAEA,SAAO;AACHE,IAAAA,GADG;AAEHC,IAAAA,GAFG;AAGHC,IAAAA,WAHG;AAIHC,IAAAA;AAJG,GAAP;AAMH","sourcesContent":["export interface IComputedAnimResult {\n MAX: number;\n MIN: number;\n TOTAL_WIDTH: number;\n HALF_WIDTH: number;\n}\n\nexport function useComputedAnim(\n width: number,\n ITEM_LENGTH: number\n): IComputedAnimResult {\n const MAX = (ITEM_LENGTH - 2) * width;\n const MIN = -MAX;\n const TOTAL_WIDTH = width * ITEM_LENGTH;\n const HALF_WIDTH = 0.5 * width;\n\n return {\n MAX,\n MIN,\n TOTAL_WIDTH,\n HALF_WIDTH,\n };\n}\n"]}
@@ -1,13 +0,0 @@
1
- export function useComputedAnim(width, ITEM_LENGTH) {
2
- const MAX = (ITEM_LENGTH - 2) * width;
3
- const MIN = -MAX;
4
- const TOTAL_WIDTH = width * ITEM_LENGTH;
5
- const HALF_WIDTH = 0.5 * width;
6
- return {
7
- MAX,
8
- MIN,
9
- TOTAL_WIDTH,
10
- HALF_WIDTH
11
- };
12
- }
13
- //# sourceMappingURL=useComputedAnim.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["useComputedAnim.ts"],"names":["useComputedAnim","width","ITEM_LENGTH","MAX","MIN","TOTAL_WIDTH","HALF_WIDTH"],"mappings":"AAOA,OAAO,SAASA,eAAT,CACHC,KADG,EAEHC,WAFG,EAGgB;AACnB,QAAMC,GAAG,GAAG,CAACD,WAAW,GAAG,CAAf,IAAoBD,KAAhC;AACA,QAAMG,GAAG,GAAG,CAACD,GAAb;AACA,QAAME,WAAW,GAAGJ,KAAK,GAAGC,WAA5B;AACA,QAAMI,UAAU,GAAG,MAAML,KAAzB;AAEA,SAAO;AACHE,IAAAA,GADG;AAEHC,IAAAA,GAFG;AAGHC,IAAAA,WAHG;AAIHC,IAAAA;AAJG,GAAP;AAMH","sourcesContent":["export interface IComputedAnimResult {\n MAX: number;\n MIN: number;\n TOTAL_WIDTH: number;\n HALF_WIDTH: number;\n}\n\nexport function useComputedAnim(\n width: number,\n ITEM_LENGTH: number\n): IComputedAnimResult {\n const MAX = (ITEM_LENGTH - 2) * width;\n const MIN = -MAX;\n const TOTAL_WIDTH = width * ITEM_LENGTH;\n const HALF_WIDTH = 0.5 * width;\n\n return {\n MAX,\n MIN,\n TOTAL_WIDTH,\n HALF_WIDTH,\n };\n}\n"]}
@@ -1,7 +0,0 @@
1
- export interface IComputedAnimResult {
2
- MAX: number;
3
- MIN: number;
4
- TOTAL_WIDTH: number;
5
- HALF_WIDTH: number;
6
- }
7
- export declare function useComputedAnim(width: number, ITEM_LENGTH: number): IComputedAnimResult;
@@ -1,23 +0,0 @@
1
- export interface IComputedAnimResult {
2
- MAX: number;
3
- MIN: number;
4
- TOTAL_WIDTH: number;
5
- HALF_WIDTH: number;
6
- }
7
-
8
- export function useComputedAnim(
9
- width: number,
10
- ITEM_LENGTH: number
11
- ): IComputedAnimResult {
12
- const MAX = (ITEM_LENGTH - 2) * width;
13
- const MIN = -MAX;
14
- const TOTAL_WIDTH = width * ITEM_LENGTH;
15
- const HALF_WIDTH = 0.5 * width;
16
-
17
- return {
18
- MAX,
19
- MIN,
20
- TOTAL_WIDTH,
21
- HALF_WIDTH,
22
- };
23
- }