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.
- package/lib/commonjs/{layouts → components}/BaseLayout.js +4 -2
- package/lib/commonjs/components/BaseLayout.js.map +1 -0
- package/lib/commonjs/components/Carousel.js +4 -3
- package/lib/commonjs/components/Carousel.js.map +1 -1
- package/lib/commonjs/components/ScrollViewGesture.js +34 -30
- package/lib/commonjs/components/ScrollViewGesture.js.map +1 -1
- package/lib/commonjs/hooks/useLayoutConfig.js.map +1 -1
- package/lib/commonjs/hooks/useOffsetX.js +9 -6
- package/lib/commonjs/hooks/useOffsetX.js.map +1 -1
- package/lib/commonjs/hooks/useOffsetX.test.js +53 -0
- package/lib/commonjs/hooks/useOffsetX.test.js.map +1 -0
- package/lib/commonjs/hooks/usePanGestureProxy.js +84 -0
- package/lib/commonjs/hooks/usePanGestureProxy.js.map +1 -0
- package/lib/commonjs/hooks/usePanGestureProxy.test.js +397 -0
- package/lib/commonjs/hooks/usePanGestureProxy.test.js.map +1 -0
- package/lib/commonjs/hooks/useUpdateGestureConfig.js.map +1 -1
- package/lib/commonjs/hooks/useVisibleRanges.js +17 -6
- package/lib/commonjs/hooks/useVisibleRanges.js.map +1 -1
- package/lib/commonjs/hooks/useVisibleRanges.test.js +162 -0
- package/lib/commonjs/hooks/useVisibleRanges.test.js.map +1 -0
- package/lib/module/{layouts → components}/BaseLayout.js +4 -2
- package/lib/module/components/BaseLayout.js.map +1 -0
- package/lib/module/components/Carousel.js +3 -2
- package/lib/module/components/Carousel.js.map +1 -1
- package/lib/module/components/ScrollViewGesture.js +36 -31
- package/lib/module/components/ScrollViewGesture.js.map +1 -1
- package/lib/module/hooks/useLayoutConfig.js.map +1 -1
- package/lib/module/hooks/useOffsetX.js +9 -6
- package/lib/module/hooks/useOffsetX.js.map +1 -1
- package/lib/module/hooks/useOffsetX.test.js +48 -0
- package/lib/module/hooks/useOffsetX.test.js.map +1 -0
- package/lib/module/hooks/usePanGestureProxy.js +71 -0
- package/lib/module/hooks/usePanGestureProxy.js.map +1 -0
- package/lib/module/hooks/usePanGestureProxy.test.js +383 -0
- package/lib/module/hooks/usePanGestureProxy.test.js.map +1 -0
- package/lib/module/hooks/useUpdateGestureConfig.js.map +1 -1
- package/lib/module/hooks/useVisibleRanges.js +17 -6
- package/lib/module/hooks/useVisibleRanges.js.map +1 -1
- package/lib/module/hooks/useVisibleRanges.test.js +157 -0
- package/lib/module/hooks/useVisibleRanges.test.js.map +1 -0
- package/lib/typescript/hooks/useLayoutConfig.d.ts +1 -1
- package/lib/typescript/hooks/useOffsetX.test.d.ts +1 -0
- package/lib/typescript/hooks/usePanGestureProxy.d.ts +9 -0
- package/lib/typescript/hooks/usePanGestureProxy.test.d.ts +1 -0
- package/lib/typescript/hooks/useUpdateGestureConfig.d.ts +3 -2
- package/lib/typescript/hooks/useVisibleRanges.d.ts +1 -0
- package/lib/typescript/hooks/useVisibleRanges.test.d.ts +1 -0
- package/lib/typescript/types.d.ts +5 -0
- package/package.json +2 -1
- package/src/{layouts → components}/BaseLayout.tsx +10 -8
- package/src/components/Carousel.tsx +2 -1
- package/src/components/ScrollViewGesture.tsx +48 -43
- package/src/hooks/useLayoutConfig.ts +1 -1
- package/src/hooks/useOffsetX.test.ts +54 -0
- package/src/hooks/useOffsetX.ts +33 -31
- package/src/hooks/usePanGestureProxy.test.tsx +377 -0
- package/src/hooks/usePanGestureProxy.ts +110 -0
- package/src/hooks/useUpdateGestureConfig.ts +4 -2
- package/src/hooks/useVisibleRanges.test.tsx +179 -0
- package/src/hooks/useVisibleRanges.tsx +23 -7
- package/src/types.ts +5 -0
- package/lib/commonjs/layouts/BaseLayout.js.map +0 -1
- package/lib/commonjs/layouts/ParallaxLayout.js +0 -84
- package/lib/commonjs/layouts/ParallaxLayout.js.map +0 -1
- package/lib/module/layouts/BaseLayout.js.map +0 -1
- package/lib/module/layouts/ParallaxLayout.js +0 -61
- package/lib/module/layouts/ParallaxLayout.js.map +0 -1
- package/lib/typescript/layouts/ParallaxLayout.d.ts +0 -13
- package/src/layouts/ParallaxLayout.tsx +0 -141
- /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 (
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
|
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","
|
|
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;
|
|
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"]}
|