react-native-reanimated-carousel 4.0.0-alpha.5 → 4.0.0-alpha.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/lib/commonjs/{layouts → components}/BaseLayout.js +4 -2
  2. package/lib/commonjs/components/BaseLayout.js.map +1 -0
  3. package/lib/commonjs/components/Carousel.js +4 -3
  4. package/lib/commonjs/components/Carousel.js.map +1 -1
  5. package/lib/commonjs/components/ScrollViewGesture.js +34 -30
  6. package/lib/commonjs/components/ScrollViewGesture.js.map +1 -1
  7. package/lib/commonjs/hooks/useLayoutConfig.js.map +1 -1
  8. package/lib/commonjs/hooks/useOffsetX.js +9 -6
  9. package/lib/commonjs/hooks/useOffsetX.js.map +1 -1
  10. package/lib/commonjs/hooks/useOffsetX.test.js +53 -0
  11. package/lib/commonjs/hooks/useOffsetX.test.js.map +1 -0
  12. package/lib/commonjs/hooks/usePanGestureProxy.js +84 -0
  13. package/lib/commonjs/hooks/usePanGestureProxy.js.map +1 -0
  14. package/lib/commonjs/hooks/usePanGestureProxy.test.js +397 -0
  15. package/lib/commonjs/hooks/usePanGestureProxy.test.js.map +1 -0
  16. package/lib/commonjs/hooks/useUpdateGestureConfig.js.map +1 -1
  17. package/lib/commonjs/hooks/useVisibleRanges.js +17 -6
  18. package/lib/commonjs/hooks/useVisibleRanges.js.map +1 -1
  19. package/lib/commonjs/hooks/useVisibleRanges.test.js +162 -0
  20. package/lib/commonjs/hooks/useVisibleRanges.test.js.map +1 -0
  21. package/lib/module/{layouts → components}/BaseLayout.js +4 -2
  22. package/lib/module/components/BaseLayout.js.map +1 -0
  23. package/lib/module/components/Carousel.js +3 -2
  24. package/lib/module/components/Carousel.js.map +1 -1
  25. package/lib/module/components/ScrollViewGesture.js +36 -31
  26. package/lib/module/components/ScrollViewGesture.js.map +1 -1
  27. package/lib/module/hooks/useLayoutConfig.js.map +1 -1
  28. package/lib/module/hooks/useOffsetX.js +9 -6
  29. package/lib/module/hooks/useOffsetX.js.map +1 -1
  30. package/lib/module/hooks/useOffsetX.test.js +48 -0
  31. package/lib/module/hooks/useOffsetX.test.js.map +1 -0
  32. package/lib/module/hooks/usePanGestureProxy.js +71 -0
  33. package/lib/module/hooks/usePanGestureProxy.js.map +1 -0
  34. package/lib/module/hooks/usePanGestureProxy.test.js +383 -0
  35. package/lib/module/hooks/usePanGestureProxy.test.js.map +1 -0
  36. package/lib/module/hooks/useUpdateGestureConfig.js.map +1 -1
  37. package/lib/module/hooks/useVisibleRanges.js +17 -6
  38. package/lib/module/hooks/useVisibleRanges.js.map +1 -1
  39. package/lib/module/hooks/useVisibleRanges.test.js +157 -0
  40. package/lib/module/hooks/useVisibleRanges.test.js.map +1 -0
  41. package/lib/typescript/hooks/useLayoutConfig.d.ts +1 -1
  42. package/lib/typescript/hooks/useOffsetX.test.d.ts +1 -0
  43. package/lib/typescript/hooks/usePanGestureProxy.d.ts +9 -0
  44. package/lib/typescript/hooks/usePanGestureProxy.test.d.ts +1 -0
  45. package/lib/typescript/hooks/useUpdateGestureConfig.d.ts +3 -2
  46. package/lib/typescript/hooks/useVisibleRanges.d.ts +1 -0
  47. package/lib/typescript/hooks/useVisibleRanges.test.d.ts +1 -0
  48. package/lib/typescript/types.d.ts +5 -0
  49. package/package.json +2 -1
  50. package/src/{layouts → components}/BaseLayout.tsx +10 -8
  51. package/src/components/Carousel.tsx +2 -1
  52. package/src/components/ScrollViewGesture.tsx +48 -43
  53. package/src/hooks/useLayoutConfig.ts +1 -1
  54. package/src/hooks/useOffsetX.test.ts +54 -0
  55. package/src/hooks/useOffsetX.ts +33 -31
  56. package/src/hooks/usePanGestureProxy.test.tsx +377 -0
  57. package/src/hooks/usePanGestureProxy.ts +110 -0
  58. package/src/hooks/useUpdateGestureConfig.ts +4 -2
  59. package/src/hooks/useVisibleRanges.test.tsx +179 -0
  60. package/src/hooks/useVisibleRanges.tsx +23 -7
  61. package/src/types.ts +5 -0
  62. package/lib/commonjs/layouts/BaseLayout.js.map +0 -1
  63. package/lib/commonjs/layouts/ParallaxLayout.js +0 -84
  64. package/lib/commonjs/layouts/ParallaxLayout.js.map +0 -1
  65. package/lib/module/layouts/BaseLayout.js.map +0 -1
  66. package/lib/module/layouts/ParallaxLayout.js +0 -61
  67. package/lib/module/layouts/ParallaxLayout.js.map +0 -1
  68. package/lib/typescript/layouts/ParallaxLayout.d.ts +0 -13
  69. package/src/layouts/ParallaxLayout.tsx +0 -141
  70. /package/lib/typescript/{layouts → components}/BaseLayout.d.ts +0 -0
@@ -24,15 +24,18 @@ export const useOffsetX = (opts, visibleRanges) => {
24
24
  negativeRange,
25
25
  positiveRange
26
26
  } = visibleRanges.value;
27
- if ((index < negativeRange[0] || index > negativeRange[1]) && (index < positiveRange[0] || index > positiveRange[1])) return Number.MAX_SAFE_INTEGER;
28
27
 
29
- if (loop) {
30
- const inputRange = [-TOTAL_WIDTH, MIN - HALF_WIDTH - startPos - Number.MIN_VALUE, MIN - HALF_WIDTH - startPos, 0, MAX + HALF_WIDTH - startPos, MAX + HALF_WIDTH - startPos + Number.MIN_VALUE, TOTAL_WIDTH];
31
- const outputRange = [startPos, MAX + HALF_WIDTH - Number.MIN_VALUE, MIN - HALF_WIDTH, startPos, MAX + HALF_WIDTH, MIN - HALF_WIDTH + Number.MIN_VALUE, startPos];
32
- return interpolate(handlerOffset.value, inputRange, outputRange, Extrapolate.CLAMP);
28
+ if (index >= negativeRange[0] && index <= negativeRange[1] || index >= positiveRange[0] && index <= positiveRange[1]) {
29
+ if (loop) {
30
+ const inputRange = [-TOTAL_WIDTH, MIN - HALF_WIDTH - startPos - Number.MIN_VALUE, MIN - HALF_WIDTH - startPos, 0, MAX + HALF_WIDTH - startPos, MAX + HALF_WIDTH - startPos + Number.MIN_VALUE, TOTAL_WIDTH];
31
+ const outputRange = [startPos, MAX + HALF_WIDTH - Number.MIN_VALUE, MIN - HALF_WIDTH, startPos, MAX + HALF_WIDTH, MIN - HALF_WIDTH + Number.MIN_VALUE, startPos];
32
+ return interpolate(handlerOffset.value, inputRange, outputRange, Extrapolate.CLAMP);
33
+ }
34
+
35
+ return handlerOffset.value + size * index;
33
36
  }
34
37
 
35
- return handlerOffset.value + size * index;
38
+ return Number.MAX_SAFE_INTEGER;
36
39
  }, [loop, dataLength, viewCount, type, size, visibleRanges]);
37
40
  return x;
38
41
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["useOffsetX.ts"],"names":["Extrapolate","interpolate","useDerivedValue","useOffsetX","opts","visibleRanges","handlerOffset","index","size","loop","dataLength","type","viewCount","_viewCount","ITEM_LENGTH","VALID_LENGTH","TOTAL_WIDTH","HALF_WIDTH","Math","round","positiveCount","startPos","MAX","MIN","x","negativeRange","positiveRange","value","Number","MAX_SAFE_INTEGER","inputRange","MIN_VALUE","outputRange","CLAMP"],"mappings":"AACA,SACEA,WADF,EAEEC,WAFF,EAGEC,eAHF,QAIO,yBAJP;AAkBA,OAAO,MAAMC,UAAU,GAAG,CAACC,IAAD,EAAcC,aAAd,KAAgD;AACxE,QAAM;AACJC,IAAAA,aADI;AAEJC,IAAAA,KAFI;AAGJC,IAAAA,IAHI;AAIJC,IAAAA,IAJI;AAKJC,IAAAA,UALI;AAMJC,IAAAA,IAAI,GAAG,UANH;AAOJC,IAAAA,SAAS,EAAEC;AAPP,MAQFT,IARJ;AAUA,QAAMU,WAAW,GAAGJ,UAApB;AACA,QAAMK,YAAY,GAAGD,WAAW,GAAG,CAAnC;AACA,QAAME,WAAW,GAAGR,IAAI,GAAGM,WAA3B;AACA,QAAMG,UAAU,GAAG,MAAMT,IAAzB;AAEA,QAAMI,SAAS,GAAGC,UAAH,aAAGA,UAAH,cAAGA,UAAH,GAAiBK,IAAI,CAACC,KAAL,CAAW,CAACL,WAAW,GAAG,CAAf,IAAoB,CAA/B,CAAhC;AACA,QAAMM,aAAa,GACXT,IAAI,KAAK,UAAT,GAAsBC,SAAtB,GAAkCG,YAAY,GAAGH,SADzD;AAGA,MAAIS,QAAQ,GAAGb,IAAI,GAAGD,KAAtB;AACA,MAAIA,KAAK,GAAGa,aAAZ,EACEC,QAAQ,GAAG,CAACd,KAAK,GAAGO,WAAT,IAAwBN,IAAnC;AAEF,QAAMc,GAAG,GAAGF,aAAa,GAAGZ,IAA5B;AACA,QAAMe,GAAG,GAAG,EAAE,CAACR,YAAY,GAAGK,aAAhB,IAAiCZ,IAAnC,CAAZ;AAEA,QAAMgB,CAAC,GAAGtB,eAAe,CAAC,MAAM;AAC9B,UAAM;AAAEuB,MAAAA,aAAF;AAAiBC,MAAAA;AAAjB,QAAmCrB,aAAa,CAACsB,KAAvD;AACA,QACE,CAACpB,KAAK,GAAGkB,aAAa,CAAC,CAAD,CAArB,IAA4BlB,KAAK,GAAGkB,aAAa,CAAC,CAAD,CAAlD,MACUlB,KAAK,GAAGmB,aAAa,CAAC,CAAD,CAArB,IAA4BnB,KAAK,GAAGmB,aAAa,CAAC,CAAD,CAD3D,CADF,EAIE,OAAOE,MAAM,CAACC,gBAAd;;AAEF,QAAIpB,IAAJ,EAAU;AACR,YAAMqB,UAAU,GAAG,CACjB,CAACd,WADgB,EAEjBO,GAAG,GAAGN,UAAN,GAAmBI,QAAnB,GAA8BO,MAAM,CAACG,SAFpB,EAGjBR,GAAG,GAAGN,UAAN,GAAmBI,QAHF,EAIjB,CAJiB,EAKjBC,GAAG,GAAGL,UAAN,GAAmBI,QALF,EAMjBC,GAAG,GAAGL,UAAN,GAAmBI,QAAnB,GAA8BO,MAAM,CAACG,SANpB,EAOjBf,WAPiB,CAAnB;AAUA,YAAMgB,WAAW,GAAG,CAClBX,QADkB,EAElBC,GAAG,GAAGL,UAAN,GAAmBW,MAAM,CAACG,SAFR,EAGlBR,GAAG,GAAGN,UAHY,EAIlBI,QAJkB,EAKlBC,GAAG,GAAGL,UALY,EAMlBM,GAAG,GAAGN,UAAN,GAAmBW,MAAM,CAACG,SANR,EAOlBV,QAPkB,CAApB;AAUA,aAAOpB,WAAW,CAChBK,aAAa,CAACqB,KADE,EAEhBG,UAFgB,EAGhBE,WAHgB,EAIhBhC,WAAW,CAACiC,KAJI,CAAlB;AAMD;;AAED,WAAO3B,aAAa,CAACqB,KAAd,GAAsBnB,IAAI,GAAGD,KAApC;AACD,GAtCwB,EAsCtB,CAACE,IAAD,EAAOC,UAAP,EAAmBE,SAAnB,EAA8BD,IAA9B,EAAoCH,IAApC,EAA0CH,aAA1C,CAtCsB,CAAzB;AAwCA,SAAOmB,CAAP;AACD,CApEM","sourcesContent":["import type Animated from \"react-native-reanimated\";\nimport {\n Extrapolate,\n interpolate,\n useDerivedValue,\n} from \"react-native-reanimated\";\n\nimport type { IVisibleRanges } from \"./useVisibleRanges\";\n\nexport interface IOpts {\n index: number\n size: number\n handlerOffset: Animated.SharedValue<number>\n dataLength: number\n type?: \"positive\" | \"negative\"\n viewCount?: number\n loop?: boolean\n}\n\nexport const useOffsetX = (opts: IOpts, visibleRanges: IVisibleRanges) => {\n const {\n handlerOffset,\n index,\n size,\n loop,\n dataLength,\n type = \"positive\",\n viewCount: _viewCount,\n } = opts;\n\n const ITEM_LENGTH = dataLength;\n const VALID_LENGTH = ITEM_LENGTH - 1;\n const TOTAL_WIDTH = size * ITEM_LENGTH;\n const HALF_WIDTH = 0.5 * size;\n\n const viewCount = _viewCount ?? Math.round((ITEM_LENGTH - 1) / 2);\n const positiveCount\n = type === \"positive\" ? viewCount : VALID_LENGTH - viewCount;\n\n let startPos = size * index;\n if (index > positiveCount)\n startPos = (index - ITEM_LENGTH) * size;\n\n const MAX = positiveCount * size;\n const MIN = -((VALID_LENGTH - positiveCount) * size);\n\n const x = useDerivedValue(() => {\n const { negativeRange, positiveRange } = visibleRanges.value;\n if (\n (index < negativeRange[0] || index > negativeRange[1])\n && (index < positiveRange[0] || index > positiveRange[1])\n )\n return Number.MAX_SAFE_INTEGER;\n\n if (loop) {\n const inputRange = [\n -TOTAL_WIDTH,\n MIN - HALF_WIDTH - startPos - Number.MIN_VALUE,\n MIN - HALF_WIDTH - startPos,\n 0,\n MAX + HALF_WIDTH - startPos,\n MAX + HALF_WIDTH - startPos + Number.MIN_VALUE,\n TOTAL_WIDTH,\n ];\n\n const outputRange = [\n startPos,\n MAX + HALF_WIDTH - Number.MIN_VALUE,\n MIN - HALF_WIDTH,\n startPos,\n MAX + HALF_WIDTH,\n MIN - HALF_WIDTH + Number.MIN_VALUE,\n startPos,\n ];\n\n return interpolate(\n handlerOffset.value,\n inputRange,\n outputRange,\n Extrapolate.CLAMP,\n );\n }\n\n return handlerOffset.value + size * index;\n }, [loop, dataLength, viewCount, type, size, visibleRanges]);\n\n return x;\n};\n"]}
1
+ {"version":3,"sources":["useOffsetX.ts"],"names":["Extrapolate","interpolate","useDerivedValue","useOffsetX","opts","visibleRanges","handlerOffset","index","size","loop","dataLength","type","viewCount","_viewCount","ITEM_LENGTH","VALID_LENGTH","TOTAL_WIDTH","HALF_WIDTH","Math","round","positiveCount","startPos","MAX","MIN","x","negativeRange","positiveRange","value","inputRange","Number","MIN_VALUE","outputRange","CLAMP","MAX_SAFE_INTEGER"],"mappings":"AACA,SACEA,WADF,EAEEC,WAFF,EAGEC,eAHF,QAIO,yBAJP;AAkBA,OAAO,MAAMC,UAAU,GAAG,CAACC,IAAD,EAAcC,aAAd,KAAgD;AACxE,QAAM;AACJC,IAAAA,aADI;AAEJC,IAAAA,KAFI;AAGJC,IAAAA,IAHI;AAIJC,IAAAA,IAJI;AAKJC,IAAAA,UALI;AAMJC,IAAAA,IAAI,GAAG,UANH;AAOJC,IAAAA,SAAS,EAAEC;AAPP,MAQFT,IARJ;AAUA,QAAMU,WAAW,GAAGJ,UAApB;AACA,QAAMK,YAAY,GAAGD,WAAW,GAAG,CAAnC;AACA,QAAME,WAAW,GAAGR,IAAI,GAAGM,WAA3B;AACA,QAAMG,UAAU,GAAG,MAAMT,IAAzB;AAEA,QAAMI,SAAS,GAAGC,UAAH,aAAGA,UAAH,cAAGA,UAAH,GAAiBK,IAAI,CAACC,KAAL,CAAW,CAACL,WAAW,GAAG,CAAf,IAAoB,CAA/B,CAAhC;AACA,QAAMM,aAAa,GACfT,IAAI,KAAK,UAAT,GAAsBC,SAAtB,GAAkCG,YAAY,GAAGH,SADrD;AAGA,MAAIS,QAAQ,GAAGb,IAAI,GAAGD,KAAtB;AACA,MAAIA,KAAK,GAAGa,aAAZ,EACEC,QAAQ,GAAG,CAACd,KAAK,GAAGO,WAAT,IAAwBN,IAAnC;AAEF,QAAMc,GAAG,GAAGF,aAAa,GAAGZ,IAA5B;AACA,QAAMe,GAAG,GAAG,EAAE,CAACR,YAAY,GAAGK,aAAhB,IAAiCZ,IAAnC,CAAZ;AAEA,QAAMgB,CAAC,GAAGtB,eAAe,CAAC,MAAM;AAC9B,UAAM;AAAEuB,MAAAA,aAAF;AAAiBC,MAAAA;AAAjB,QAAmCrB,aAAa,CAACsB,KAAvD;;AAEA,QACGpB,KAAK,IAAIkB,aAAa,CAAC,CAAD,CAAtB,IAA6BlB,KAAK,IAAIkB,aAAa,CAAC,CAAD,CAApD,IACIlB,KAAK,IAAImB,aAAa,CAAC,CAAD,CAAtB,IAA6BnB,KAAK,IAAImB,aAAa,CAAC,CAAD,CAFzD,EAGE;AACA,UAAIjB,IAAJ,EAAU;AACR,cAAMmB,UAAU,GAAG,CACjB,CAACZ,WADgB,EAEjBO,GAAG,GAAGN,UAAN,GAAmBI,QAAnB,GAA8BQ,MAAM,CAACC,SAFpB,EAGjBP,GAAG,GAAGN,UAAN,GAAmBI,QAHF,EAIjB,CAJiB,EAKjBC,GAAG,GAAGL,UAAN,GAAmBI,QALF,EAMjBC,GAAG,GAAGL,UAAN,GAAmBI,QAAnB,GAA8BQ,MAAM,CAACC,SANpB,EAOjBd,WAPiB,CAAnB;AAUA,cAAMe,WAAW,GAAG,CAClBV,QADkB,EAElBC,GAAG,GAAGL,UAAN,GAAmBY,MAAM,CAACC,SAFR,EAGlBP,GAAG,GAAGN,UAHY,EAIlBI,QAJkB,EAKlBC,GAAG,GAAGL,UALY,EAMlBM,GAAG,GAAGN,UAAN,GAAmBY,MAAM,CAACC,SANR,EAOlBT,QAPkB,CAApB;AAUA,eAAOpB,WAAW,CAChBK,aAAa,CAACqB,KADE,EAEhBC,UAFgB,EAGhBG,WAHgB,EAIhB/B,WAAW,CAACgC,KAJI,CAAlB;AAMD;;AAED,aAAO1B,aAAa,CAACqB,KAAd,GAAsBnB,IAAI,GAAGD,KAApC;AACD;;AAED,WAAOsB,MAAM,CAACI,gBAAd;AACD,GAxCwB,EAwCtB,CAACxB,IAAD,EAAOC,UAAP,EAAmBE,SAAnB,EAA8BD,IAA9B,EAAoCH,IAApC,EAA0CH,aAA1C,CAxCsB,CAAzB;AA0CA,SAAOmB,CAAP;AACD,CAtEM","sourcesContent":["import type Animated from \"react-native-reanimated\";\nimport {\n Extrapolate,\n interpolate,\n useDerivedValue,\n} from \"react-native-reanimated\";\n\nimport type { IVisibleRanges } from \"./useVisibleRanges\";\n\nexport interface IOpts {\n index: number\n size: number\n handlerOffset: Animated.SharedValue<number>\n dataLength: number\n type?: \"positive\" | \"negative\"\n viewCount?: number\n loop?: boolean\n}\n\nexport const useOffsetX = (opts: IOpts, visibleRanges: IVisibleRanges) => {\n const {\n handlerOffset,\n index,\n size,\n loop,\n dataLength,\n type = \"positive\",\n viewCount: _viewCount,\n } = opts;\n\n const ITEM_LENGTH = dataLength;\n const VALID_LENGTH = ITEM_LENGTH - 1;\n const TOTAL_WIDTH = size * ITEM_LENGTH;\n const HALF_WIDTH = 0.5 * size;\n\n const viewCount = _viewCount ?? Math.round((ITEM_LENGTH - 1) / 2);\n const positiveCount\n = type === \"positive\" ? viewCount : VALID_LENGTH - viewCount;\n\n let startPos = size * index;\n if (index > positiveCount)\n startPos = (index - ITEM_LENGTH) * size;\n\n const MAX = positiveCount * size;\n const MIN = -((VALID_LENGTH - positiveCount) * size);\n\n const x = useDerivedValue(() => {\n const { negativeRange, positiveRange } = visibleRanges.value;\n\n if (\n (index >= negativeRange[0] && index <= negativeRange[1])\n || (index >= positiveRange[0] && index <= positiveRange[1])\n ) {\n if (loop) {\n const inputRange = [\n -TOTAL_WIDTH,\n MIN - HALF_WIDTH - startPos - Number.MIN_VALUE,\n MIN - HALF_WIDTH - startPos,\n 0,\n MAX + HALF_WIDTH - startPos,\n MAX + HALF_WIDTH - startPos + Number.MIN_VALUE,\n TOTAL_WIDTH,\n ];\n\n const outputRange = [\n startPos,\n MAX + HALF_WIDTH - Number.MIN_VALUE,\n MIN - HALF_WIDTH,\n startPos,\n MAX + HALF_WIDTH,\n MIN - HALF_WIDTH + Number.MIN_VALUE,\n startPos,\n ];\n\n return interpolate(\n handlerOffset.value,\n inputRange,\n outputRange,\n Extrapolate.CLAMP,\n );\n }\n\n return handlerOffset.value + size * index;\n }\n\n return Number.MAX_SAFE_INTEGER;\n }, [loop, dataLength, viewCount, type, size, visibleRanges]);\n\n return x;\n};\n"]}
@@ -0,0 +1,48 @@
1
+ import { useSharedValue } from "react-native-reanimated";
2
+ import { renderHook } from "@testing-library/react-hooks";
3
+ import { useOffsetX } from "./useOffsetX";
4
+ describe("useSharedValue", () => {
5
+ it("should return the correct values", async () => {
6
+ const hook = renderHook(() => {
7
+ const range = useSharedValue({
8
+ negativeRange: [7, 9],
9
+ positiveRange: [0, 3]
10
+ });
11
+ const inputs = Array.from({
12
+ length: 10
13
+ }).map((_, index) => ({
14
+ config: {
15
+ dataLength: 10,
16
+ handlerOffset: useSharedValue(-0),
17
+ index,
18
+ loop: false,
19
+ size: 393
20
+ },
21
+ range
22
+ }));
23
+ return inputs.map(input => {
24
+ const {
25
+ config,
26
+ range
27
+ } = input;
28
+ return useOffsetX(config, range);
29
+ });
30
+ });
31
+ const expected = hook.result.current.map(v => v.value).slice();
32
+ expect(expected).toMatchInlineSnapshot(`
33
+ [
34
+ 0,
35
+ 393,
36
+ 786,
37
+ 1179,
38
+ 9007199254740991,
39
+ 9007199254740991,
40
+ 9007199254740991,
41
+ 2751,
42
+ 3144,
43
+ 3537,
44
+ ]
45
+ `);
46
+ });
47
+ });
48
+ //# sourceMappingURL=useOffsetX.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["useOffsetX.test.ts"],"names":["useSharedValue","renderHook","useOffsetX","describe","it","hook","range","negativeRange","positiveRange","inputs","Array","from","length","map","_","index","config","dataLength","handlerOffset","loop","size","input","expected","result","current","v","value","slice","expect","toMatchInlineSnapshot"],"mappings":"AAAA,SAASA,cAAT,QAA+B,yBAA/B;AAEA,SAASC,UAAT,QAA2B,8BAA3B;AAGA,SAASC,UAAT,QAA2B,cAA3B;AAGAC,QAAQ,CAAC,gBAAD,EAAmB,MAAM;AAC/BC,EAAAA,EAAE,CAAC,kCAAD,EAAqC,YAAY;AACjD,UAAMC,IAAI,GAAGJ,UAAU,CAAC,MAAM;AAC5B,YAAMK,KAAK,GAAGN,cAAc,CAAC;AAC3BO,QAAAA,aAAa,EAAE,CAAC,CAAD,EAAI,CAAJ,CADY;AAE3BC,QAAAA,aAAa,EAAE,CAAC,CAAD,EAAI,CAAJ;AAFY,OAAD,CAA5B;AAIA,YAAMC,MAGJ,GAAGC,KAAK,CAACC,IAAN,CAAW;AAAEC,QAAAA,MAAM,EAAE;AAAV,OAAX,EAA2BC,GAA3B,CAA+B,CAACC,CAAD,EAAIC,KAAJ,MAAe;AACjDC,QAAAA,MAAM,EAAE;AACNC,UAAAA,UAAU,EAAE,EADN;AAENC,UAAAA,aAAa,EAAElB,cAAc,CAAC,CAAC,CAAF,CAFvB;AAGNe,UAAAA,KAHM;AAINI,UAAAA,IAAI,EAAE,KAJA;AAKNC,UAAAA,IAAI,EAAE;AALA,SADyC;AAQjDd,QAAAA;AARiD,OAAf,CAA/B,CAHL;AAcA,aAAOG,MAAM,CAACI,GAAP,CAAYQ,KAAD,IAAW;AAC3B,cAAM;AAAEL,UAAAA,MAAF;AAAUV,UAAAA;AAAV,YAAoBe,KAA1B;AAEA,eAAOnB,UAAU,CAACc,MAAD,EAASV,KAAT,CAAjB;AACD,OAJM,CAAP;AAKD,KAxBsB,CAAvB;AA0BA,UAAMgB,QAAQ,GAAGjB,IAAI,CAACkB,MAAL,CAAYC,OAAZ,CAAoBX,GAApB,CAAwBY,CAAC,IAAIA,CAAC,CAACC,KAA/B,EAAsCC,KAAtC,EAAjB;AAEAC,IAAAA,MAAM,CAACN,QAAD,CAAN,CAAiBO,qBAAjB,CAAwC;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAbI;AAcD,GA3CC,CAAF;AA4CD,CA7CO,CAAR","sourcesContent":["import { useSharedValue } from \"react-native-reanimated\";\n\nimport { renderHook } from \"@testing-library/react-hooks\";\n\nimport type { IOpts } from \"./useOffsetX\";\nimport { useOffsetX } from \"./useOffsetX\";\nimport type { IVisibleRanges } from \"./useVisibleRanges\";\n\ndescribe(\"useSharedValue\", () => {\n it(\"should return the correct values\", async () => {\n const hook = renderHook(() => {\n const range = useSharedValue({\n negativeRange: [7, 9],\n positiveRange: [0, 3],\n });\n const inputs: Array<{\n config: IOpts\n range: IVisibleRanges\n }> = Array.from({ length: 10 }).map((_, index) => ({\n config: {\n dataLength: 10,\n handlerOffset: useSharedValue(-0),\n index,\n loop: false,\n size: 393,\n },\n range,\n }));\n\n return inputs.map((input) => {\n const { config, range } = input;\n\n return useOffsetX(config, range);\n });\n });\n\n const expected = hook.result.current.map(v => v.value).slice();\n\n expect(expected).toMatchInlineSnapshot(`\n [\n 0,\n 393,\n 786,\n 1179,\n 9007199254740991,\n 9007199254740991,\n 9007199254740991,\n 2751,\n 3144,\n 3537,\n ]\n `);\n });\n});\n"]}
@@ -0,0 +1,71 @@
1
+ import { useMemo } from "react";
2
+ import { Gesture } from "react-native-gesture-handler";
3
+ import { useUpdateGestureConfig } from "./useUpdateGestureConfig";
4
+ export const usePanGestureProxy = customization => {
5
+ const {
6
+ onConfigurePanGesture,
7
+ onGestureBegin,
8
+ onGestureUpdate,
9
+ onGestureEnd,
10
+ options = {}
11
+ } = customization;
12
+ const gesture = useMemo(() => {
13
+ const gesture = Gesture.Pan(); // Save the original gesture callbacks
14
+
15
+ const originalGestures = {
16
+ onBegin: gesture.onBegin,
17
+ onUpdate: gesture.onUpdate,
18
+ onEnd: gesture.onEnd
19
+ }; // Save the user defined gesture callbacks
20
+
21
+ const userDefinedConflictGestures = {
22
+ onBegin: undefined,
23
+ onUpdate: undefined,
24
+ onEnd: undefined
25
+ };
26
+
27
+ const fakeOnBegin = cb => {
28
+ // Using fakeOnBegin to save the user defined callback
29
+ userDefinedConflictGestures.onBegin = cb;
30
+ return gesture;
31
+ };
32
+
33
+ const fakeOnUpdate = cb => {
34
+ // Using fakeOnUpdate to save the user defined callback
35
+ userDefinedConflictGestures.onUpdate = cb;
36
+ return gesture;
37
+ };
38
+
39
+ const fakeOnEnd = cb => {
40
+ // Using fakeOnEnd to save the user defined callback
41
+ userDefinedConflictGestures.onEnd = cb;
42
+ return gesture;
43
+ }; // Setup the fake callbacks
44
+
45
+
46
+ gesture.onBegin = fakeOnBegin;
47
+ gesture.onUpdate = fakeOnUpdate;
48
+ gesture.onEnd = fakeOnEnd;
49
+ if (onConfigurePanGesture) // Get the gesture with the user defined configuration
50
+ onConfigurePanGesture(gesture); // Restore the original callbacks
51
+
52
+ gesture.onBegin = originalGestures.onBegin;
53
+ gesture.onUpdate = originalGestures.onUpdate;
54
+ gesture.onEnd = originalGestures.onEnd; // Setup the original callbacks with the user defined callbacks
55
+
56
+ gesture.onBegin(e => {
57
+ onGestureBegin(e);
58
+ if (userDefinedConflictGestures.onBegin) userDefinedConflictGestures.onBegin(e);
59
+ }).onUpdate(e => {
60
+ onGestureUpdate(e);
61
+ if (userDefinedConflictGestures.onUpdate) userDefinedConflictGestures.onUpdate(e);
62
+ }).onEnd((e, success) => {
63
+ onGestureEnd(e, success);
64
+ if (userDefinedConflictGestures.onEnd) userDefinedConflictGestures.onEnd(e, success);
65
+ });
66
+ return gesture;
67
+ }, [onGestureBegin, onGestureUpdate, onGestureEnd, onConfigurePanGesture]);
68
+ useUpdateGestureConfig(gesture, options);
69
+ return gesture;
70
+ };
71
+ //# sourceMappingURL=usePanGestureProxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["usePanGestureProxy.ts"],"names":["useMemo","Gesture","useUpdateGestureConfig","usePanGestureProxy","customization","onConfigurePanGesture","onGestureBegin","onGestureUpdate","onGestureEnd","options","gesture","Pan","originalGestures","onBegin","onUpdate","onEnd","userDefinedConflictGestures","undefined","fakeOnBegin","cb","fakeOnUpdate","fakeOnEnd","e","success"],"mappings":"AAAA,SAASA,OAAT,QAAwB,OAAxB;AAEA,SAASC,OAAT,QAAwB,8BAAxB;AAGA,SAASC,sBAAT,QAAuC,0BAAvC;AAEA,OAAO,MAAMC,kBAAkB,GAC7BC,aADgC,IAQ7B;AACH,QAAM;AACJC,IAAAA,qBADI;AAEJC,IAAAA,cAFI;AAGJC,IAAAA,eAHI;AAIJC,IAAAA,YAJI;AAKJC,IAAAA,OAAO,GAAG;AALN,MAMFL,aANJ;AAQA,QAAMM,OAAO,GAAGV,OAAO,CAAC,MAAM;AAC5B,UAAMU,OAAO,GAAGT,OAAO,CAACU,GAAR,EAAhB,CAD4B,CAG5B;;AACA,UAAMC,gBAAgB,GAAG;AACvBC,MAAAA,OAAO,EAAEH,OAAO,CAACG,OADM;AAEvBC,MAAAA,QAAQ,EAAEJ,OAAO,CAACI,QAFK;AAGvBC,MAAAA,KAAK,EAAEL,OAAO,CAACK;AAHQ,KAAzB,CAJ4B,CAU5B;;AACA,UAAMC,2BAIL,GAAG;AACFH,MAAAA,OAAO,EAAEI,SADP;AAEFH,MAAAA,QAAQ,EAAEG,SAFR;AAGFF,MAAAA,KAAK,EAAEE;AAHL,KAJJ;;AAUA,UAAMC,WAAmC,GAAIC,EAAD,IAAQ;AAClD;AACAH,MAAAA,2BAA2B,CAACH,OAA5B,GAAsCM,EAAtC;AACA,aAAOT,OAAP;AACD,KAJD;;AAMA,UAAMU,YAAqC,GAAID,EAAD,IAAQ;AACpD;AACAH,MAAAA,2BAA2B,CAACF,QAA5B,GAAuCK,EAAvC;AACA,aAAOT,OAAP;AACD,KAJD;;AAMA,UAAMW,SAA+B,GAAIF,EAAD,IAAQ;AAC9C;AACAH,MAAAA,2BAA2B,CAACD,KAA5B,GAAoCI,EAApC;AACA,aAAOT,OAAP;AACD,KAJD,CAjC4B,CAuC5B;;;AACAA,IAAAA,OAAO,CAACG,OAAR,GAAkBK,WAAlB;AACAR,IAAAA,OAAO,CAACI,QAAR,GAAmBM,YAAnB;AACAV,IAAAA,OAAO,CAACK,KAAR,GAAgBM,SAAhB;AAEA,QAAIhB,qBAAJ,EACE;AACAA,MAAAA,qBAAqB,CAACK,OAAD,CAArB,CA9C0B,CAgD5B;;AACAA,IAAAA,OAAO,CAACG,OAAR,GAAkBD,gBAAgB,CAACC,OAAnC;AACAH,IAAAA,OAAO,CAACI,QAAR,GAAmBF,gBAAgB,CAACE,QAApC;AACAJ,IAAAA,OAAO,CAACK,KAAR,GAAgBH,gBAAgB,CAACG,KAAjC,CAnD4B,CAqD5B;;AACAL,IAAAA,OAAO,CACJG,OADH,CACYS,CAAD,IAAO;AACdhB,MAAAA,cAAc,CAACgB,CAAD,CAAd;AAEA,UAAIN,2BAA2B,CAACH,OAAhC,EACEG,2BAA2B,CAACH,OAA5B,CAAoCS,CAApC;AACH,KANH,EAOGR,QAPH,CAOaQ,CAAD,IAAO;AACff,MAAAA,eAAe,CAACe,CAAD,CAAf;AAEA,UAAIN,2BAA2B,CAACF,QAAhC,EACEE,2BAA2B,CAACF,QAA5B,CAAqCQ,CAArC;AACH,KAZH,EAaGP,KAbH,CAaS,CAACO,CAAD,EAAIC,OAAJ,KAAgB;AACrBf,MAAAA,YAAY,CAACc,CAAD,EAAIC,OAAJ,CAAZ;AAEA,UAAIP,2BAA2B,CAACD,KAAhC,EACEC,2BAA2B,CAACD,KAA5B,CAAkCO,CAAlC,EAAqCC,OAArC;AACH,KAlBH;AAoBA,WAAOb,OAAP;AACD,GA3EsB,EA2EpB,CACDJ,cADC,EAEDC,eAFC,EAGDC,YAHC,EAIDH,qBAJC,CA3EoB,CAAvB;AAkFAH,EAAAA,sBAAsB,CAACQ,OAAD,EAAUD,OAAV,CAAtB;AAEA,SAAOC,OAAP;AACD,CAtGM","sourcesContent":["import { useMemo } from \"react\";\nimport type { GestureStateChangeEvent, GestureUpdateEvent, PanGesture, PanGestureHandlerEventPayload } from \"react-native-gesture-handler\";\nimport { Gesture } from \"react-native-gesture-handler\";\n\nimport type { GestureConfig } from \"./useUpdateGestureConfig\";\nimport { useUpdateGestureConfig } from \"./useUpdateGestureConfig\";\n\nexport const usePanGestureProxy = (\n customization: {\n onConfigurePanGesture?: (gesture: PanGesture) => void\n onGestureBegin: (event: GestureStateChangeEvent<PanGestureHandlerEventPayload>) => void\n onGestureUpdate: (event: GestureUpdateEvent<PanGestureHandlerEventPayload>) => void\n onGestureEnd: (event: GestureStateChangeEvent<PanGestureHandlerEventPayload>, success: boolean) => void\n options?: GestureConfig\n },\n) => {\n const {\n onConfigurePanGesture,\n onGestureBegin,\n onGestureUpdate,\n onGestureEnd,\n options = {},\n } = customization;\n\n const gesture = useMemo(() => {\n const gesture = Gesture.Pan();\n\n // Save the original gesture callbacks\n const originalGestures = {\n onBegin: gesture.onBegin,\n onUpdate: gesture.onUpdate,\n onEnd: gesture.onEnd,\n };\n\n // Save the user defined gesture callbacks\n const userDefinedConflictGestures: {\n onBegin?: Parameters<(typeof gesture)[\"onBegin\"]>[0]\n onUpdate?: Parameters<(typeof gesture)[\"onUpdate\"]>[0]\n onEnd?: Parameters<(typeof gesture)[\"onEnd\"]>[0]\n } = {\n onBegin: undefined,\n onUpdate: undefined,\n onEnd: undefined,\n };\n\n const fakeOnBegin: typeof gesture.onBegin = (cb) => {\n // Using fakeOnBegin to save the user defined callback\n userDefinedConflictGestures.onBegin = cb;\n return gesture;\n };\n\n const fakeOnUpdate: typeof gesture.onUpdate = (cb) => {\n // Using fakeOnUpdate to save the user defined callback\n userDefinedConflictGestures.onUpdate = cb;\n return gesture;\n };\n\n const fakeOnEnd: typeof gesture.onEnd = (cb) => {\n // Using fakeOnEnd to save the user defined callback\n userDefinedConflictGestures.onEnd = cb;\n return gesture;\n };\n\n // Setup the fake callbacks\n gesture.onBegin = fakeOnBegin;\n gesture.onUpdate = fakeOnUpdate;\n gesture.onEnd = fakeOnEnd;\n\n if (onConfigurePanGesture)\n // Get the gesture with the user defined configuration\n onConfigurePanGesture(gesture);\n\n // Restore the original callbacks\n gesture.onBegin = originalGestures.onBegin;\n gesture.onUpdate = originalGestures.onUpdate;\n gesture.onEnd = originalGestures.onEnd;\n\n // Setup the original callbacks with the user defined callbacks\n gesture\n .onBegin((e) => {\n onGestureBegin(e);\n\n if (userDefinedConflictGestures.onBegin)\n userDefinedConflictGestures.onBegin(e);\n })\n .onUpdate((e) => {\n onGestureUpdate(e);\n\n if (userDefinedConflictGestures.onUpdate)\n userDefinedConflictGestures.onUpdate(e);\n })\n .onEnd((e, success) => {\n onGestureEnd(e, success);\n\n if (userDefinedConflictGestures.onEnd)\n userDefinedConflictGestures.onEnd(e, success);\n });\n\n return gesture;\n }, [\n onGestureBegin,\n onGestureUpdate,\n onGestureEnd,\n onConfigurePanGesture,\n ]);\n\n useUpdateGestureConfig(gesture, options);\n\n return gesture;\n};\n"]}
@@ -0,0 +1,383 @@
1
+ import React from "react";
2
+ import { Text } from "react-native";
3
+ import { Gesture, GestureDetector, GestureHandlerRootView, State } from "react-native-gesture-handler";
4
+ import { cleanup, render } from "@testing-library/react-native";
5
+ import { fireGestureHandler, getByGestureTestId } from "react-native-gesture-handler/jest-utils";
6
+ import { usePanGestureProxy } from "./usePanGestureProxy";
7
+ beforeEach(cleanup);
8
+
9
+ const mockedEventHandlers = () => {
10
+ return {
11
+ begin: jest.fn(),
12
+ start: jest.fn(),
13
+ active: jest.fn(),
14
+ end: jest.fn(),
15
+ fail: jest.fn(),
16
+ cancel: jest.fn(),
17
+ finish: jest.fn()
18
+ };
19
+ };
20
+
21
+ const mockedEventHandlersFromUser = () => {
22
+ return {
23
+ begin: jest.fn(),
24
+ start: jest.fn(),
25
+ active: jest.fn(),
26
+ end: jest.fn(),
27
+ fail: jest.fn(),
28
+ cancel: jest.fn(),
29
+ finish: jest.fn()
30
+ };
31
+ };
32
+
33
+ describe("Using RNGH v2 gesture API", () => {
34
+ function SingleHandler(_ref) {
35
+ let {
36
+ handlers,
37
+ handlersFromUser,
38
+ treatStartAsUpdate
39
+ } = _ref;
40
+ const pan = usePanGestureProxy({
41
+ onConfigurePanGesture: gesture => {
42
+ // This is user's customizations
43
+ gesture.onStart(treatStartAsUpdate ? handlers.active : handlers.start).onBegin(handlersFromUser.begin).onUpdate(handlersFromUser.active).onEnd(handlersFromUser.end).onFinalize(handlers.finish).withTestId("pan");
44
+ },
45
+ onGestureBegin: handlers.begin,
46
+ onGestureUpdate: handlers.active,
47
+ onGestureEnd: handlers.end,
48
+ options: {
49
+ enabled: true
50
+ }
51
+ });
52
+ return /*#__PURE__*/React.createElement(GestureHandlerRootView, null, /*#__PURE__*/React.createElement(GestureDetector, {
53
+ gesture: pan
54
+ }, /*#__PURE__*/React.createElement(Text, null, "v2 API test")));
55
+ }
56
+
57
+ function RacingHandlers(_ref2) {
58
+ let {
59
+ tapHandlers,
60
+ panHandlers
61
+ } = _ref2;
62
+ const tap = Gesture.Tap().onBegin(tapHandlers.begin).onEnd(tapHandlers.end).withTestId("tap");
63
+ const pan = usePanGestureProxy({
64
+ onConfigurePanGesture: _ => {
65
+ _.onFinalize(panHandlers.finish).withTestId("pan");
66
+ },
67
+ onGestureBegin: panHandlers.begin,
68
+ onGestureUpdate: panHandlers.active,
69
+ onGestureEnd: panHandlers.end,
70
+ options: {
71
+ enabled: true
72
+ }
73
+ });
74
+ return /*#__PURE__*/React.createElement(GestureHandlerRootView, null, /*#__PURE__*/React.createElement(GestureDetector, {
75
+ gesture: Gesture.Race(tap, pan)
76
+ }, /*#__PURE__*/React.createElement(Text, null, "v2 API test")));
77
+ }
78
+
79
+ it("sends events to handlers", () => {
80
+ const tapHandlers = mockedEventHandlers();
81
+ const panHandlers = mockedEventHandlers();
82
+ render( /*#__PURE__*/React.createElement(RacingHandlers, {
83
+ tapHandlers: tapHandlers,
84
+ panHandlers: panHandlers
85
+ }));
86
+ fireGestureHandler(getByGestureTestId("pan"), [{
87
+ state: State.BEGAN
88
+ }, {
89
+ state: State.ACTIVE
90
+ }, {
91
+ state: State.END
92
+ }]);
93
+ expect(panHandlers.begin).toBeCalledWith(expect.objectContaining({
94
+ state: State.BEGAN
95
+ }));
96
+ expect(panHandlers.finish).toBeCalled();
97
+ expect(tapHandlers.begin).not.toBeCalled();
98
+ });
99
+ it("sends events with additional data to handlers", () => {
100
+ const panHandlers = mockedEventHandlers();
101
+ const panHandlersFromUser = mockedEventHandlersFromUser();
102
+ render( /*#__PURE__*/React.createElement(SingleHandler, {
103
+ handlers: panHandlers,
104
+ handlersFromUser: panHandlersFromUser,
105
+ treatStartAsUpdate: true
106
+ }));
107
+ fireGestureHandler(getByGestureTestId("pan"), [{
108
+ state: State.BEGAN,
109
+ translationX: 0
110
+ }, {
111
+ state: State.ACTIVE,
112
+ translationX: 10
113
+ }, {
114
+ translationX: 20
115
+ }, {
116
+ translationX: 20
117
+ }, {
118
+ state: State.END,
119
+ translationX: 30
120
+ }]);
121
+ expect(panHandlersFromUser.begin).toBeCalledTimes(1);
122
+ expect(panHandlersFromUser.active).toBeCalledTimes(2);
123
+ expect(panHandlersFromUser.end).toBeCalledTimes(1);
124
+ expect(panHandlers.active).toBeCalledTimes(3);
125
+ expect(panHandlers.active).toHaveBeenLastCalledWith(expect.objectContaining({
126
+ translationX: 20
127
+ }));
128
+ });
129
+ });
130
+ describe("Event list validation", () => {
131
+ function SingleHandler(_ref3) {
132
+ let {
133
+ handlers,
134
+ handlersFromUser,
135
+ treatStartAsUpdate
136
+ } = _ref3;
137
+ const pan = usePanGestureProxy({
138
+ onConfigurePanGesture: _ => {
139
+ _.onStart(treatStartAsUpdate ? handlers.active : handlers.start).onBegin(handlersFromUser.begin).onUpdate(handlersFromUser.active).onEnd(handlersFromUser.end).onFinalize(handlers.finish).withTestId("pan");
140
+ },
141
+ onGestureBegin: handlers.begin,
142
+ onGestureUpdate: handlers.active,
143
+ onGestureEnd: handlers.end,
144
+ options: {
145
+ enabled: true
146
+ }
147
+ });
148
+ return /*#__PURE__*/React.createElement(GestureHandlerRootView, null, /*#__PURE__*/React.createElement(GestureDetector, {
149
+ gesture: pan
150
+ }, /*#__PURE__*/React.createElement(Text, null, "v2 API test")));
151
+ }
152
+
153
+ it("throws error when oldState doesn't correspond to previous event's state", () => {
154
+ const panHandlers = mockedEventHandlers();
155
+ const panHandlersFromUser = mockedEventHandlersFromUser();
156
+ render( /*#__PURE__*/React.createElement(SingleHandler, {
157
+ handlers: panHandlers,
158
+ handlersFromUser: panHandlersFromUser
159
+ }));
160
+ expect(() => {
161
+ fireGestureHandler(getByGestureTestId("pan"), [{
162
+ oldState: State.UNDETERMINED,
163
+ state: State.BEGAN,
164
+ x: 0,
165
+ y: 10
166
+ }, {
167
+ oldState: State.UNDETERMINED,
168
+ state: State.ACTIVE,
169
+ x: 1,
170
+ y: 11
171
+ }]);
172
+ }).toThrow("when state changes, oldState should be the same as previous event' state");
173
+ });
174
+ it.each([[State.END], [State.FAILED], [State.CANCELLED]])("correctly handles events ending with state %s", lastState => {
175
+ const panHandlers = mockedEventHandlers();
176
+ const panHandlersFromUser = mockedEventHandlersFromUser();
177
+ render( /*#__PURE__*/React.createElement(SingleHandler, {
178
+ handlers: panHandlers,
179
+ handlersFromUser: panHandlersFromUser
180
+ }));
181
+ fireGestureHandler(getByGestureTestId("pan"), [{
182
+ state: State.BEGAN
183
+ }, {
184
+ state: State.ACTIVE
185
+ }, {
186
+ state: lastState
187
+ }]);
188
+ expect(panHandlersFromUser.begin).toBeCalledTimes(1);
189
+ expect(panHandlersFromUser.active).toBeCalledTimes(0);
190
+ expect(panHandlersFromUser.end).toBeCalledTimes(1);
191
+ if (lastState === State.END) expect(panHandlers.end).toBeCalled();else expect(panHandlers.finish).toBeCalledWith(expect.any(Object), false);
192
+ });
193
+ });
194
+ describe("Filling event list with defaults", () => {
195
+ function RacingTapAndPan(_ref4) {
196
+ let {
197
+ handlers,
198
+ treatStartAsUpdate
199
+ } = _ref4;
200
+ const tap = Gesture.Tap().onBegin(handlers.begin).onEnd(handlers.end).withTestId("tap");
201
+ const pan = usePanGestureProxy({
202
+ onConfigurePanGesture: _ => {
203
+ _.onStart(treatStartAsUpdate ? handlers.active : handlers.start).onFinalize(handlers.finish).withTestId("pan");
204
+ },
205
+ onGestureBegin: handlers.begin,
206
+ onGestureUpdate: handlers.active,
207
+ onGestureEnd: handlers.end,
208
+ options: {
209
+ enabled: true
210
+ }
211
+ });
212
+ return /*#__PURE__*/React.createElement(GestureHandlerRootView, null, /*#__PURE__*/React.createElement(GestureDetector, {
213
+ gesture: Gesture.Exclusive(pan, tap)
214
+ }, /*#__PURE__*/React.createElement(Text, null, "v2 API test")));
215
+ }
216
+
217
+ it("fills oldState if not passed", () => {
218
+ const handlers = mockedEventHandlers();
219
+ render( /*#__PURE__*/React.createElement(RacingTapAndPan, {
220
+ handlers: handlers,
221
+ treatStartAsUpdate: true
222
+ }));
223
+ fireGestureHandler(getByGestureTestId("pan"), [{
224
+ state: State.BEGAN
225
+ }, {
226
+ state: State.ACTIVE
227
+ }, {
228
+ state: State.ACTIVE
229
+ }, {
230
+ state: State.ACTIVE
231
+ }, {
232
+ state: State.END
233
+ }]);
234
+ expect(handlers.begin).toBeCalledWith(expect.objectContaining({
235
+ oldState: State.UNDETERMINED
236
+ }));
237
+ expect(handlers.active).nthCalledWith(1, expect.objectContaining({
238
+ oldState: State.BEGAN
239
+ }));
240
+ expect(handlers.active).lastCalledWith(expect.not.objectContaining({
241
+ oldState: expect.anything()
242
+ }));
243
+ expect(handlers.end).toBeCalledWith(expect.objectContaining({
244
+ oldState: State.ACTIVE
245
+ }), true);
246
+ });
247
+ it("fills missing ACTIVE states", () => {
248
+ const panHandlers = mockedEventHandlers();
249
+ render( /*#__PURE__*/React.createElement(RacingTapAndPan, {
250
+ handlers: panHandlers,
251
+ treatStartAsUpdate: true
252
+ }));
253
+ fireGestureHandler(getByGestureTestId("pan"), [{
254
+ state: State.BEGAN,
255
+ x: 0,
256
+ y: 10
257
+ }, {
258
+ state: State.ACTIVE,
259
+ x: 1,
260
+ y: 11
261
+ }, {
262
+ x: 2,
263
+ y: 12
264
+ }, {
265
+ x: 3,
266
+ y: 13
267
+ }, {
268
+ state: State.END,
269
+ x: 4,
270
+ y: 14
271
+ }]);
272
+ expect(panHandlers.active).toBeCalledTimes(3);
273
+ expect(panHandlers.active).toHaveBeenLastCalledWith(expect.objectContaining({
274
+ x: 3,
275
+ y: 13
276
+ }));
277
+ });
278
+ it("fills BEGIN and END events for discrete handlers", () => {
279
+ const handlers = mockedEventHandlers();
280
+ render( /*#__PURE__*/React.createElement(RacingTapAndPan, {
281
+ handlers: handlers,
282
+ treatStartAsUpdate: true
283
+ }));
284
+ fireGestureHandler(getByGestureTestId("tap"), [{
285
+ x: 5
286
+ }]);
287
+ expect(handlers.begin).toBeCalledTimes(1);
288
+ expect(handlers.end).toBeCalledTimes(1);
289
+ });
290
+ it("with FAILED event, fills BEGIN event for discrete handlers", () => {
291
+ const handlers = mockedEventHandlers();
292
+ render( /*#__PURE__*/React.createElement(RacingTapAndPan, {
293
+ handlers: handlers,
294
+ treatStartAsUpdate: true
295
+ }));
296
+ fireGestureHandler(getByGestureTestId("tap"), [{
297
+ state: State.FAILED
298
+ }]);
299
+ expect(handlers.begin).toBeCalledTimes(1);
300
+ expect(handlers.end).toBeCalledTimes(1);
301
+ expect(handlers.end).toBeCalledWith(expect.anything(), false);
302
+ });
303
+ it("uses event data from first event in filled BEGIN, ACTIVE events", () => {
304
+ const handlers = mockedEventHandlers();
305
+ render( /*#__PURE__*/React.createElement(RacingTapAndPan, {
306
+ handlers: handlers,
307
+ treatStartAsUpdate: true
308
+ }));
309
+ fireGestureHandler(getByGestureTestId("pan"), [{
310
+ x: 120
311
+ }]);
312
+ expect(handlers.begin).toBeCalledWith(expect.objectContaining({
313
+ x: 120
314
+ }));
315
+ expect(handlers.active).toHaveBeenNthCalledWith(1, expect.objectContaining({
316
+ x: 120
317
+ }));
318
+ });
319
+ it("uses event data from last event in filled END events", () => {
320
+ const handlers = mockedEventHandlers();
321
+ render( /*#__PURE__*/React.createElement(RacingTapAndPan, {
322
+ handlers: handlers,
323
+ treatStartAsUpdate: true
324
+ }));
325
+ fireGestureHandler(getByGestureTestId("pan"), [{
326
+ x: 120,
327
+ state: State.FAILED
328
+ }]);
329
+ expect(handlers.begin).toBeCalledTimes(1);
330
+ expect(handlers.active).toBeCalledTimes(1);
331
+ expect(handlers.end).toBeCalledWith(expect.objectContaining({
332
+ x: 120
333
+ }), false);
334
+ });
335
+ it("uses event data filled events", () => {
336
+ const handlers = mockedEventHandlers();
337
+ render( /*#__PURE__*/React.createElement(RacingTapAndPan, {
338
+ handlers: handlers,
339
+ treatStartAsUpdate: true
340
+ }));
341
+ fireGestureHandler(getByGestureTestId("pan"), [{
342
+ x: 5,
343
+ y: 15
344
+ }, {
345
+ x: 6,
346
+ y: 16
347
+ }, {
348
+ x: 7,
349
+ y: 17
350
+ }]);
351
+ expect(handlers.begin).toBeCalledWith(expect.objectContaining({
352
+ x: 5,
353
+ y: 15
354
+ }));
355
+ expect(handlers.active).toBeCalledTimes(3);
356
+ expect(handlers.end).toBeCalledWith(expect.objectContaining({
357
+ x: 7,
358
+ y: 17
359
+ }), true);
360
+ });
361
+ it("fills BEGIN and END events when they're not present, for discrete handlers", () => {
362
+ const handlers = mockedEventHandlers();
363
+ render( /*#__PURE__*/React.createElement(RacingTapAndPan, {
364
+ handlers: handlers,
365
+ treatStartAsUpdate: true
366
+ }));
367
+ fireGestureHandler(getByGestureTestId("tap"));
368
+ expect(handlers.begin).toBeCalledTimes(1);
369
+ expect(handlers.end).toHaveBeenCalledTimes(1);
370
+ });
371
+ it("fills BEGIN, ACTIVE and END events when they're not present, for continuous handlers", () => {
372
+ const handlers = mockedEventHandlers();
373
+ render( /*#__PURE__*/React.createElement(RacingTapAndPan, {
374
+ handlers: handlers,
375
+ treatStartAsUpdate: true
376
+ }));
377
+ fireGestureHandler(getByGestureTestId("pan"));
378
+ expect(handlers.begin).toBeCalledTimes(1);
379
+ expect(handlers.active).toBeCalledTimes(1);
380
+ expect(handlers.end).toHaveBeenCalledTimes(1);
381
+ });
382
+ });
383
+ //# sourceMappingURL=usePanGestureProxy.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["usePanGestureProxy.test.tsx"],"names":["React","Text","Gesture","GestureDetector","GestureHandlerRootView","State","cleanup","render","fireGestureHandler","getByGestureTestId","usePanGestureProxy","beforeEach","mockedEventHandlers","begin","jest","fn","start","active","end","fail","cancel","finish","mockedEventHandlersFromUser","describe","SingleHandler","handlers","handlersFromUser","treatStartAsUpdate","pan","onConfigurePanGesture","gesture","onStart","onBegin","onUpdate","onEnd","onFinalize","withTestId","onGestureBegin","onGestureUpdate","onGestureEnd","options","enabled","RacingHandlers","tapHandlers","panHandlers","tap","Tap","_","Race","it","state","BEGAN","ACTIVE","END","expect","toBeCalledWith","objectContaining","toBeCalled","not","panHandlersFromUser","translationX","toBeCalledTimes","toHaveBeenLastCalledWith","oldState","UNDETERMINED","x","y","toThrow","each","FAILED","CANCELLED","lastState","any","Object","RacingTapAndPan","Exclusive","nthCalledWith","lastCalledWith","anything","toHaveBeenNthCalledWith","toHaveBeenCalledTimes"],"mappings":"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","sourcesContent":["import React from \"react\";\nimport { Text } from \"react-native\";\nimport type { PanGesture, PanGestureHandler, TapGesture } from \"react-native-gesture-handler\";\nimport { Gesture, GestureDetector, GestureHandlerRootView, State } from \"react-native-gesture-handler\";\n\nimport { cleanup, render } from \"@testing-library/react-native\";\nimport { fireGestureHandler, getByGestureTestId } from \"react-native-gesture-handler/jest-utils\";\n\nimport { usePanGestureProxy } from \"./usePanGestureProxy\";\n\nbeforeEach(cleanup);\n\nconst mockedEventHandlers = () => {\n return {\n begin: jest.fn(),\n start: jest.fn(),\n active: jest.fn(),\n end: jest.fn(),\n fail: jest.fn(),\n cancel: jest.fn(),\n finish: jest.fn(),\n };\n};\n\nconst mockedEventHandlersFromUser = () => {\n return {\n begin: jest.fn(),\n start: jest.fn(),\n active: jest.fn(),\n end: jest.fn(),\n fail: jest.fn(),\n cancel: jest.fn(),\n finish: jest.fn(),\n };\n};\n\ndescribe(\"Using RNGH v2 gesture API\", () => {\n interface SingleHandlerProps {\n handlers: ReturnType<typeof mockedEventHandlers>\n handlersFromUser: ReturnType<typeof mockedEventHandlers>\n treatStartAsUpdate?: boolean\n }\n\n function SingleHandler({ handlers, handlersFromUser, treatStartAsUpdate }: SingleHandlerProps) {\n const pan = usePanGestureProxy({\n onConfigurePanGesture: (gesture: PanGesture) => {\n // This is user's customizations\n gesture\n .onStart(treatStartAsUpdate ? handlers.active : handlers.start)\n .onBegin(handlersFromUser.begin)\n .onUpdate(handlersFromUser.active)\n .onEnd(handlersFromUser.end)\n .onFinalize(handlers.finish)\n .withTestId(\"pan\");\n },\n onGestureBegin: handlers.begin,\n onGestureUpdate: handlers.active,\n onGestureEnd: handlers.end,\n options: { enabled: true },\n });\n\n return (\n <GestureHandlerRootView>\n <GestureDetector gesture={pan}>\n <Text>v2 API test</Text>\n </GestureDetector>\n </GestureHandlerRootView>\n );\n }\n\n interface RacingHandlersProps {\n tapHandlers: ReturnType<typeof mockedEventHandlers>\n panHandlers: ReturnType<typeof mockedEventHandlers>\n }\n\n function RacingHandlers({ tapHandlers, panHandlers }: RacingHandlersProps) {\n const tap = Gesture.Tap()\n .onBegin(tapHandlers.begin)\n .onEnd(tapHandlers.end)\n .withTestId(\"tap\");\n\n const pan = usePanGestureProxy({\n onConfigurePanGesture: (_: PanGesture) => {\n _\n .onFinalize(panHandlers.finish)\n .withTestId(\"pan\");\n },\n onGestureBegin: panHandlers.begin,\n onGestureUpdate: panHandlers.active,\n onGestureEnd: panHandlers.end,\n options: { enabled: true },\n });\n\n return (\n <GestureHandlerRootView>\n <GestureDetector gesture={Gesture.Race(tap, pan)}>\n <Text>v2 API test</Text>\n </GestureDetector>\n </GestureHandlerRootView>\n );\n }\n\n it(\"sends events to handlers\", () => {\n const tapHandlers = mockedEventHandlers();\n const panHandlers = mockedEventHandlers();\n render(\n <RacingHandlers tapHandlers={tapHandlers} panHandlers={panHandlers} />,\n );\n\n fireGestureHandler<PanGesture>(getByGestureTestId(\"pan\"), [\n { state: State.BEGAN },\n { state: State.ACTIVE },\n { state: State.END },\n ]);\n expect(panHandlers.begin).toBeCalledWith(\n expect.objectContaining({ state: State.BEGAN }),\n );\n expect(panHandlers.finish).toBeCalled();\n expect(tapHandlers.begin).not.toBeCalled();\n });\n\n it(\"sends events with additional data to handlers\", () => {\n const panHandlers = mockedEventHandlers();\n const panHandlersFromUser = mockedEventHandlersFromUser();\n render(<SingleHandler handlers={panHandlers} handlersFromUser={panHandlersFromUser} treatStartAsUpdate />);\n fireGestureHandler<PanGesture>(getByGestureTestId(\"pan\"), [\n { state: State.BEGAN, translationX: 0 },\n { state: State.ACTIVE, translationX: 10 },\n { translationX: 20 },\n { translationX: 20 },\n { state: State.END, translationX: 30 },\n ]);\n\n expect(panHandlersFromUser.begin).toBeCalledTimes(1);\n expect(panHandlersFromUser.active).toBeCalledTimes(2);\n expect(panHandlersFromUser.end).toBeCalledTimes(1);\n\n expect(panHandlers.active).toBeCalledTimes(3);\n expect(panHandlers.active).toHaveBeenLastCalledWith(\n expect.objectContaining({ translationX: 20 }),\n );\n });\n});\n\ndescribe(\"Event list validation\", () => {\n interface SingleHandlerProps {\n handlers: ReturnType<typeof mockedEventHandlers>\n handlersFromUser: ReturnType<typeof mockedEventHandlers>\n treatStartAsUpdate?: boolean\n }\n\n function SingleHandler({ handlers, handlersFromUser, treatStartAsUpdate }: SingleHandlerProps) {\n const pan = usePanGestureProxy({\n onConfigurePanGesture: (_: PanGesture) => {\n _\n .onStart(treatStartAsUpdate ? handlers.active : handlers.start)\n .onBegin(handlersFromUser.begin)\n .onUpdate(handlersFromUser.active)\n .onEnd(handlersFromUser.end)\n .onFinalize(handlers.finish)\n .withTestId(\"pan\");\n },\n onGestureBegin: handlers.begin,\n onGestureUpdate: handlers.active,\n onGestureEnd: handlers.end,\n options: { enabled: true },\n });\n\n return (\n <GestureHandlerRootView>\n <GestureDetector gesture={pan}>\n <Text>v2 API test</Text>\n </GestureDetector>\n </GestureHandlerRootView>\n );\n }\n\n it(\"throws error when oldState doesn't correspond to previous event's state\", () => {\n const panHandlers = mockedEventHandlers();\n const panHandlersFromUser = mockedEventHandlersFromUser();\n render(<SingleHandler handlers={panHandlers} handlersFromUser={panHandlersFromUser} />);\n\n expect(() => {\n fireGestureHandler<PanGesture>(getByGestureTestId(\"pan\"), [\n { oldState: State.UNDETERMINED, state: State.BEGAN, x: 0, y: 10 },\n { oldState: State.UNDETERMINED, state: State.ACTIVE, x: 1, y: 11 },\n ]);\n }).toThrow(\n \"when state changes, oldState should be the same as previous event' state\",\n );\n });\n\n it.each([[State.END], [State.FAILED], [State.CANCELLED]])(\n \"correctly handles events ending with state %s\",\n (lastState) => {\n const panHandlers = mockedEventHandlers();\n const panHandlersFromUser = mockedEventHandlersFromUser();\n render(<SingleHandler handlers={panHandlers} handlersFromUser={panHandlersFromUser} />);\n fireGestureHandler<PanGesture>(getByGestureTestId(\"pan\"), [\n { state: State.BEGAN },\n { state: State.ACTIVE },\n { state: lastState },\n ]);\n\n expect(panHandlersFromUser.begin).toBeCalledTimes(1);\n expect(panHandlersFromUser.active).toBeCalledTimes(0);\n expect(panHandlersFromUser.end).toBeCalledTimes(1);\n\n if (lastState === State.END)\n expect(panHandlers.end).toBeCalled();\n\n else\n expect(panHandlers.finish).toBeCalledWith(expect.any(Object), false);\n },\n );\n});\n\ndescribe(\"Filling event list with defaults\", () => {\n interface RacingTapAndPanProps {\n handlers: ReturnType<typeof mockedEventHandlers>\n treatStartAsUpdate?: boolean\n }\n\n function RacingTapAndPan({\n handlers,\n treatStartAsUpdate,\n }: RacingTapAndPanProps) {\n const tap = Gesture.Tap()\n .onBegin(handlers.begin)\n .onEnd(handlers.end)\n .withTestId(\"tap\");\n\n const pan = usePanGestureProxy({\n onConfigurePanGesture: (_: PanGesture) => {\n _\n .onStart(treatStartAsUpdate ? handlers.active : handlers.start)\n .onFinalize(handlers.finish)\n .withTestId(\"pan\");\n },\n onGestureBegin: handlers.begin,\n onGestureUpdate: handlers.active,\n onGestureEnd: handlers.end,\n options: { enabled: true },\n });\n\n return (\n <GestureHandlerRootView>\n <GestureDetector gesture={Gesture.Exclusive(pan, tap)}>\n <Text>v2 API test</Text>\n </GestureDetector>\n </GestureHandlerRootView>\n );\n }\n\n it(\"fills oldState if not passed\", () => {\n const handlers = mockedEventHandlers();\n render(<RacingTapAndPan handlers={handlers} treatStartAsUpdate />);\n fireGestureHandler<PanGestureHandler>(getByGestureTestId(\"pan\"), [\n { state: State.BEGAN },\n { state: State.ACTIVE },\n { state: State.ACTIVE },\n { state: State.ACTIVE },\n { state: State.END },\n ]);\n\n expect(handlers.begin).toBeCalledWith(\n expect.objectContaining({ oldState: State.UNDETERMINED }),\n );\n expect(handlers.active).nthCalledWith(\n 1,\n expect.objectContaining({ oldState: State.BEGAN }),\n );\n expect(handlers.active).lastCalledWith(\n expect.not.objectContaining({ oldState: expect.anything() }),\n );\n expect(handlers.end).toBeCalledWith(\n expect.objectContaining({ oldState: State.ACTIVE }),\n true,\n );\n });\n\n it(\"fills missing ACTIVE states\", () => {\n const panHandlers = mockedEventHandlers();\n render(<RacingTapAndPan handlers={panHandlers} treatStartAsUpdate />);\n fireGestureHandler<PanGesture>(getByGestureTestId(\"pan\"), [\n { state: State.BEGAN, x: 0, y: 10 },\n { state: State.ACTIVE, x: 1, y: 11 },\n { x: 2, y: 12 },\n { x: 3, y: 13 },\n { state: State.END, x: 4, y: 14 },\n ]);\n\n expect(panHandlers.active).toBeCalledTimes(3);\n expect(panHandlers.active).toHaveBeenLastCalledWith(\n expect.objectContaining({ x: 3, y: 13 }),\n );\n });\n\n it(\"fills BEGIN and END events for discrete handlers\", () => {\n const handlers = mockedEventHandlers();\n render(<RacingTapAndPan handlers={handlers} treatStartAsUpdate />);\n fireGestureHandler<TapGesture>(getByGestureTestId(\"tap\"), [{ x: 5 }]);\n expect(handlers.begin).toBeCalledTimes(1);\n expect(handlers.end).toBeCalledTimes(1);\n });\n\n it(\"with FAILED event, fills BEGIN event for discrete handlers\", () => {\n const handlers = mockedEventHandlers();\n render(<RacingTapAndPan handlers={handlers} treatStartAsUpdate />);\n fireGestureHandler<TapGesture>(getByGestureTestId(\"tap\"), [\n { state: State.FAILED },\n ]);\n expect(handlers.begin).toBeCalledTimes(1);\n expect(handlers.end).toBeCalledTimes(1);\n expect(handlers.end).toBeCalledWith(expect.anything(), false);\n });\n\n it(\"uses event data from first event in filled BEGIN, ACTIVE events\", () => {\n const handlers = mockedEventHandlers();\n render(<RacingTapAndPan handlers={handlers} treatStartAsUpdate />);\n fireGestureHandler<PanGesture>(getByGestureTestId(\"pan\"), [{ x: 120 }]);\n expect(handlers.begin).toBeCalledWith(expect.objectContaining({ x: 120 }));\n expect(handlers.active).toHaveBeenNthCalledWith(\n 1,\n expect.objectContaining({ x: 120 }),\n );\n });\n\n it(\"uses event data from last event in filled END events\", () => {\n const handlers = mockedEventHandlers();\n render(<RacingTapAndPan handlers={handlers} treatStartAsUpdate />);\n fireGestureHandler<PanGesture>(getByGestureTestId(\"pan\"), [\n { x: 120, state: State.FAILED },\n ]);\n expect(handlers.begin).toBeCalledTimes(1);\n expect(handlers.active).toBeCalledTimes(1);\n expect(handlers.end).toBeCalledWith(\n expect.objectContaining({ x: 120 }),\n false,\n );\n });\n\n it(\"uses event data filled events\", () => {\n const handlers = mockedEventHandlers();\n render(<RacingTapAndPan handlers={handlers} treatStartAsUpdate />);\n fireGestureHandler<PanGesture>(getByGestureTestId(\"pan\"), [\n { x: 5, y: 15 },\n { x: 6, y: 16 },\n { x: 7, y: 17 },\n ]);\n expect(handlers.begin).toBeCalledWith(\n expect.objectContaining({ x: 5, y: 15 }),\n );\n expect(handlers.active).toBeCalledTimes(3);\n expect(handlers.end).toBeCalledWith(\n expect.objectContaining({ x: 7, y: 17 }),\n true,\n );\n });\n\n it(\"fills BEGIN and END events when they're not present, for discrete handlers\", () => {\n const handlers = mockedEventHandlers();\n render(<RacingTapAndPan handlers={handlers} treatStartAsUpdate />);\n fireGestureHandler<TapGesture>(getByGestureTestId(\"tap\"));\n expect(handlers.begin).toBeCalledTimes(1);\n expect(handlers.end).toHaveBeenCalledTimes(1);\n });\n\n it(\"fills BEGIN, ACTIVE and END events when they're not present, for continuous handlers\", () => {\n const handlers = mockedEventHandlers();\n render(<RacingTapAndPan handlers={handlers} treatStartAsUpdate />);\n fireGestureHandler<PanGesture>(getByGestureTestId(\"pan\"));\n expect(handlers.begin).toBeCalledTimes(1);\n expect(handlers.active).toBeCalledTimes(1);\n expect(handlers.end).toHaveBeenCalledTimes(1);\n });\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["useUpdateGestureConfig.ts"],"names":["useEffect","useUpdateGestureConfig","gesture","config","enabled"],"mappings":"AAAA,SAASA,SAAT,QAA0B,OAA1B;AAGA,OAAO,MAAMC,sBAAsB,GAAG,CAACC,OAAD,EAAsBC,MAAtB,KAEhC;AACJ,QAAM;AAAEC,IAAAA;AAAF,MAAcD,MAApB;AAEAH,EAAAA,SAAS,CAAC,MAAM;AACd,QAAI,OAAOI,OAAP,KAAmB,WAAvB,EACEF,OAAO,CAACE,OAAR,CAAgBA,OAAhB;AACH,GAHQ,EAGN,CAACA,OAAD,EAAUF,OAAV,CAHM,CAAT;AAID,CATM","sourcesContent":["import { useEffect } from \"react\";\nimport type { PanGesture } from \"react-native-gesture-handler\";\n\nexport const useUpdateGestureConfig = (gesture: PanGesture, config: {\n enabled?: boolean\n}) => {\n const { enabled } = config;\n\n useEffect(() => {\n if (typeof enabled !== \"undefined\")\n gesture.enabled(enabled);\n }, [enabled, gesture]);\n};\n"]}
1
+ {"version":3,"sources":["useUpdateGestureConfig.ts"],"names":["useEffect","useUpdateGestureConfig","gesture","config","enabled"],"mappings":"AAAA,SAASA,SAAT,QAA0B,OAA1B;AAOA,OAAO,MAAMC,sBAAsB,GAAG,CAACC,OAAD,EAAsBC,MAAtB,KAAgD;AACpF,QAAM;AAAEC,IAAAA;AAAF,MAAcD,MAApB;AAEAH,EAAAA,SAAS,CAAC,MAAM;AACd,QAAI,OAAOI,OAAP,KAAmB,WAAvB,EACEF,OAAO,CAACE,OAAR,CAAgBA,OAAhB;AACH,GAHQ,EAGN,CAACA,OAAD,EAAUF,OAAV,CAHM,CAAT;AAID,CAPM","sourcesContent":["import { useEffect } from \"react\";\nimport type { PanGesture } from \"react-native-gesture-handler\";\n\nexport interface GestureConfig {\n enabled?: boolean\n}\n\nexport const useUpdateGestureConfig = (gesture: PanGesture, config: GestureConfig) => {\n const { enabled } = config;\n\n useEffect(() => {\n if (typeof enabled !== \"undefined\")\n gesture.enabled(enabled);\n }, [enabled, gesture]);\n};\n"]}