react-native-gesture-handler 2.1.0 → 2.1.1
Sign up to get free protection for your applications and to get access to all the features.
- package/lib/commonjs/handlers/gestures/GestureDetector.js +15 -1
- package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
- package/lib/commonjs/handlers/gestures/eventReceiver.js +11 -0
- package/lib/commonjs/handlers/gestures/eventReceiver.js.map +1 -1
- package/lib/commonjs/handlers/gestures/forceTouchGesture.js +26 -0
- package/lib/commonjs/handlers/gestures/forceTouchGesture.js.map +1 -1
- package/lib/commonjs/handlers/gestures/gesture.js +15 -7
- package/lib/commonjs/handlers/gestures/gesture.js.map +1 -1
- package/lib/commonjs/handlers/gestures/manualGesture.js +12 -0
- package/lib/commonjs/handlers/gestures/manualGesture.js.map +1 -1
- package/lib/commonjs/handlers/gestures/panGesture.js +28 -0
- package/lib/commonjs/handlers/gestures/panGesture.js.map +1 -1
- package/lib/commonjs/handlers/gestures/pinchGesture.js +26 -0
- package/lib/commonjs/handlers/gestures/pinchGesture.js.map +1 -1
- package/lib/commonjs/handlers/gestures/rotationGesture.js +26 -0
- package/lib/commonjs/handlers/gestures/rotationGesture.js.map +1 -1
- package/lib/module/handlers/gestures/GestureDetector.js +14 -1
- package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
- package/lib/module/handlers/gestures/eventReceiver.js +11 -0
- package/lib/module/handlers/gestures/eventReceiver.js.map +1 -1
- package/lib/module/handlers/gestures/forceTouchGesture.js +27 -0
- package/lib/module/handlers/gestures/forceTouchGesture.js.map +1 -1
- package/lib/module/handlers/gestures/gesture.js +15 -7
- package/lib/module/handlers/gestures/gesture.js.map +1 -1
- package/lib/module/handlers/gestures/manualGesture.js +13 -0
- package/lib/module/handlers/gestures/manualGesture.js.map +1 -1
- package/lib/module/handlers/gestures/panGesture.js +29 -0
- package/lib/module/handlers/gestures/panGesture.js.map +1 -1
- package/lib/module/handlers/gestures/pinchGesture.js +27 -0
- package/lib/module/handlers/gestures/pinchGesture.js.map +1 -1
- package/lib/module/handlers/gestures/rotationGesture.js +27 -0
- package/lib/module/handlers/gestures/rotationGesture.js.map +1 -1
- package/lib/typescript/handlers/gestures/forceTouchGesture.d.ts +7 -1
- package/lib/typescript/handlers/gestures/gesture.d.ts +12 -8
- package/lib/typescript/handlers/gestures/manualGesture.d.ts +3 -1
- package/lib/typescript/handlers/gestures/panGesture.d.ts +8 -1
- package/lib/typescript/handlers/gestures/pinchGesture.d.ts +7 -1
- package/lib/typescript/handlers/gestures/rotationGesture.d.ts +7 -1
- package/package.json +1 -1
- package/src/handlers/gestures/GestureDetector.tsx +21 -0
- package/src/handlers/gestures/eventReceiver.ts +16 -0
- package/src/handlers/gestures/forceTouchGesture.ts +43 -1
- package/src/handlers/gestures/gesture.ts +26 -13
- package/src/handlers/gestures/manualGesture.ts +21 -1
- package/src/handlers/gestures/panGesture.ts +43 -1
- package/src/handlers/gestures/pinchGesture.ts +40 -1
- package/src/handlers/gestures/rotationGesture.ts +40 -1
@@ -1,9 +1,36 @@
|
|
1
1
|
import { ContinousBaseGesture } from './gesture';
|
2
|
+
|
3
|
+
function changeEventCalculator(current, previous) {
|
4
|
+
'worklet';
|
5
|
+
|
6
|
+
let changePayload;
|
7
|
+
|
8
|
+
if (previous === undefined) {
|
9
|
+
changePayload = {
|
10
|
+
scaleChange: current.scale
|
11
|
+
};
|
12
|
+
} else {
|
13
|
+
changePayload = {
|
14
|
+
scaleChange: current.scale / previous.scale
|
15
|
+
};
|
16
|
+
}
|
17
|
+
|
18
|
+
return { ...current,
|
19
|
+
...changePayload
|
20
|
+
};
|
21
|
+
}
|
22
|
+
|
2
23
|
export class PinchGesture extends ContinousBaseGesture {
|
3
24
|
constructor() {
|
4
25
|
super();
|
5
26
|
this.handlerName = 'PinchGestureHandler';
|
6
27
|
}
|
7
28
|
|
29
|
+
onChange(callback) {
|
30
|
+
// @ts-ignore TS being overprotective, PinchGestureHandlerEventPayload is Record
|
31
|
+
this.handlers.changeEventCalculator = changeEventCalculator;
|
32
|
+
return super.onChange(callback);
|
33
|
+
}
|
34
|
+
|
8
35
|
}
|
9
36
|
//# sourceMappingURL=pinchGesture.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["pinchGesture.ts"],"names":["ContinousBaseGesture","PinchGesture","constructor","handlerName"],"mappings":"AAAA,SAASA,oBAAT,QAAqC,WAArC;
|
1
|
+
{"version":3,"sources":["pinchGesture.ts"],"names":["ContinousBaseGesture","changeEventCalculator","current","previous","changePayload","undefined","scaleChange","scale","PinchGesture","constructor","handlerName","onChange","callback","handlers"],"mappings":"AAAA,SAASA,oBAAT,QAAqC,WAArC;;AAQA,SAASC,qBAAT,CACEC,OADF,EAEEC,QAFF,EAGE;AACA;;AACA,MAAIC,aAAJ;;AACA,MAAID,QAAQ,KAAKE,SAAjB,EAA4B;AAC1BD,IAAAA,aAAa,GAAG;AACdE,MAAAA,WAAW,EAAEJ,OAAO,CAACK;AADP,KAAhB;AAGD,GAJD,MAIO;AACLH,IAAAA,aAAa,GAAG;AACdE,MAAAA,WAAW,EAAEJ,OAAO,CAACK,KAAR,GAAgBJ,QAAQ,CAACI;AADxB,KAAhB;AAGD;;AAED,SAAO,EAAE,GAAGL,OAAL;AAAc,OAAGE;AAAjB,GAAP;AACD;;AAED,OAAO,MAAMI,YAAN,SAA2BR,oBAA3B,CAGL;AACAS,EAAAA,WAAW,GAAG;AACZ;AAEA,SAAKC,WAAL,GAAmB,qBAAnB;AACD;;AAEDC,EAAAA,QAAQ,CACNC,QADM,EAMN;AACA;AACA,SAAKC,QAAL,CAAcZ,qBAAd,GAAsCA,qBAAtC;AACA,WAAO,MAAMU,QAAN,CAAeC,QAAf,CAAP;AACD;;AAjBD","sourcesContent":["import { ContinousBaseGesture } from './gesture';\nimport { PinchGestureHandlerEventPayload } from '../PinchGestureHandler';\nimport { GestureUpdateEvent } from '../gestureHandlerCommon';\n\ntype PinchGestureChangeEventPayload = {\n scaleChange: number;\n};\n\nfunction changeEventCalculator(\n current: GestureUpdateEvent<PinchGestureHandlerEventPayload>,\n previous?: GestureUpdateEvent<PinchGestureHandlerEventPayload>\n) {\n 'worklet';\n let changePayload: PinchGestureChangeEventPayload;\n if (previous === undefined) {\n changePayload = {\n scaleChange: current.scale,\n };\n } else {\n changePayload = {\n scaleChange: current.scale / previous.scale,\n };\n }\n\n return { ...current, ...changePayload };\n}\n\nexport class PinchGesture extends ContinousBaseGesture<\n PinchGestureHandlerEventPayload,\n PinchGestureChangeEventPayload\n> {\n constructor() {\n super();\n\n this.handlerName = 'PinchGestureHandler';\n }\n\n onChange(\n callback: (\n event: GestureUpdateEvent<\n PinchGestureHandlerEventPayload & PinchGestureChangeEventPayload\n >\n ) => void\n ) {\n // @ts-ignore TS being overprotective, PinchGestureHandlerEventPayload is Record\n this.handlers.changeEventCalculator = changeEventCalculator;\n return super.onChange(callback);\n }\n}\n\nexport type PinchGestureType = InstanceType<typeof PinchGesture>;\n"]}
|
@@ -1,9 +1,36 @@
|
|
1
1
|
import { ContinousBaseGesture } from './gesture';
|
2
|
+
|
3
|
+
function changeEventCalculator(current, previous) {
|
4
|
+
'worklet';
|
5
|
+
|
6
|
+
let changePayload;
|
7
|
+
|
8
|
+
if (previous === undefined) {
|
9
|
+
changePayload = {
|
10
|
+
rotationChange: current.rotation
|
11
|
+
};
|
12
|
+
} else {
|
13
|
+
changePayload = {
|
14
|
+
rotationChange: current.rotation - previous.rotation
|
15
|
+
};
|
16
|
+
}
|
17
|
+
|
18
|
+
return { ...current,
|
19
|
+
...changePayload
|
20
|
+
};
|
21
|
+
}
|
22
|
+
|
2
23
|
export class RotationGesture extends ContinousBaseGesture {
|
3
24
|
constructor() {
|
4
25
|
super();
|
5
26
|
this.handlerName = 'RotationGestureHandler';
|
6
27
|
}
|
7
28
|
|
29
|
+
onChange(callback) {
|
30
|
+
// @ts-ignore TS being overprotective, RotationGestureHandlerEventPayload is Record
|
31
|
+
this.handlers.changeEventCalculator = changeEventCalculator;
|
32
|
+
return super.onChange(callback);
|
33
|
+
}
|
34
|
+
|
8
35
|
}
|
9
36
|
//# sourceMappingURL=rotationGesture.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["rotationGesture.ts"],"names":["ContinousBaseGesture","RotationGesture","constructor","handlerName"],"mappings":"AAAA,SAASA,oBAAT,QAAqC,WAArC;
|
1
|
+
{"version":3,"sources":["rotationGesture.ts"],"names":["ContinousBaseGesture","changeEventCalculator","current","previous","changePayload","undefined","rotationChange","rotation","RotationGesture","constructor","handlerName","onChange","callback","handlers"],"mappings":"AAAA,SAASA,oBAAT,QAAqC,WAArC;;AAQA,SAASC,qBAAT,CACEC,OADF,EAEEC,QAFF,EAGE;AACA;;AACA,MAAIC,aAAJ;;AACA,MAAID,QAAQ,KAAKE,SAAjB,EAA4B;AAC1BD,IAAAA,aAAa,GAAG;AACdE,MAAAA,cAAc,EAAEJ,OAAO,CAACK;AADV,KAAhB;AAGD,GAJD,MAIO;AACLH,IAAAA,aAAa,GAAG;AACdE,MAAAA,cAAc,EAAEJ,OAAO,CAACK,QAAR,GAAmBJ,QAAQ,CAACI;AAD9B,KAAhB;AAGD;;AAED,SAAO,EAAE,GAAGL,OAAL;AAAc,OAAGE;AAAjB,GAAP;AACD;;AAED,OAAO,MAAMI,eAAN,SAA8BR,oBAA9B,CAGL;AACAS,EAAAA,WAAW,GAAG;AACZ;AAEA,SAAKC,WAAL,GAAmB,wBAAnB;AACD;;AAEDC,EAAAA,QAAQ,CACNC,QADM,EAMN;AACA;AACA,SAAKC,QAAL,CAAcZ,qBAAd,GAAsCA,qBAAtC;AACA,WAAO,MAAMU,QAAN,CAAeC,QAAf,CAAP;AACD;;AAjBD","sourcesContent":["import { ContinousBaseGesture } from './gesture';\nimport { RotationGestureHandlerEventPayload } from '../RotationGestureHandler';\nimport { GestureUpdateEvent } from '../gestureHandlerCommon';\n\ntype RotationGestureChangeEventPayload = {\n rotationChange: number;\n};\n\nfunction changeEventCalculator(\n current: GestureUpdateEvent<RotationGestureHandlerEventPayload>,\n previous?: GestureUpdateEvent<RotationGestureHandlerEventPayload>\n) {\n 'worklet';\n let changePayload: RotationGestureChangeEventPayload;\n if (previous === undefined) {\n changePayload = {\n rotationChange: current.rotation,\n };\n } else {\n changePayload = {\n rotationChange: current.rotation - previous.rotation,\n };\n }\n\n return { ...current, ...changePayload };\n}\n\nexport class RotationGesture extends ContinousBaseGesture<\n RotationGestureHandlerEventPayload,\n RotationGestureChangeEventPayload\n> {\n constructor() {\n super();\n\n this.handlerName = 'RotationGestureHandler';\n }\n\n onChange(\n callback: (\n event: GestureUpdateEvent<\n RotationGestureHandlerEventPayload & RotationGestureChangeEventPayload\n >\n ) => void\n ) {\n // @ts-ignore TS being overprotective, RotationGestureHandlerEventPayload is Record\n this.handlers.changeEventCalculator = changeEventCalculator;\n return super.onChange(callback);\n }\n}\n\nexport type RotationGestureType = InstanceType<typeof RotationGesture>;\n"]}
|
@@ -1,10 +1,16 @@
|
|
1
1
|
import { BaseGestureConfig, ContinousBaseGesture } from './gesture';
|
2
2
|
import { ForceTouchGestureConfig, ForceTouchGestureHandlerEventPayload } from '../ForceTouchGestureHandler';
|
3
|
-
|
3
|
+
import { GestureUpdateEvent } from '../gestureHandlerCommon';
|
4
|
+
declare type ForceTouchGestureChangeEventPayload = {
|
5
|
+
forceChange: number;
|
6
|
+
};
|
7
|
+
export declare class ForceTouchGesture extends ContinousBaseGesture<ForceTouchGestureHandlerEventPayload, ForceTouchGestureChangeEventPayload> {
|
4
8
|
config: BaseGestureConfig & ForceTouchGestureConfig;
|
5
9
|
constructor();
|
6
10
|
minForce(force: number): this;
|
7
11
|
maxForce(force: number): this;
|
8
12
|
feedbackOnActivation(value: boolean): this;
|
13
|
+
onChange(callback: (event: GestureUpdateEvent<GestureUpdateEvent<ForceTouchGestureHandlerEventPayload & ForceTouchGestureChangeEventPayload>>) => void): this;
|
9
14
|
}
|
10
15
|
export declare type ForceTouchGestureType = InstanceType<typeof ForceTouchGesture>;
|
16
|
+
export {};
|
@@ -25,10 +25,12 @@ export declare type HandlerCallbacks<EventPayloadT extends Record<string, unknow
|
|
25
25
|
onEnd?: (event: GestureStateChangeEvent<EventPayloadT>, success: boolean) => void;
|
26
26
|
onFinalize?: (event: GestureStateChangeEvent<EventPayloadT>, success: boolean) => void;
|
27
27
|
onUpdate?: (event: GestureUpdateEvent<EventPayloadT>) => void;
|
28
|
+
onChange?: (event: any) => void;
|
28
29
|
onTouchesDown?: TouchEventHandlerType;
|
29
30
|
onTouchesMove?: TouchEventHandlerType;
|
30
31
|
onTouchesUp?: TouchEventHandlerType;
|
31
32
|
onTouchesCancelled?: TouchEventHandlerType;
|
33
|
+
changeEventCalculator?: (current: GestureUpdateEvent<Record<string, unknown>>, previous?: GestureUpdateEvent<Record<string, unknown>>) => GestureUpdateEvent<Record<string, unknown>>;
|
32
34
|
isWorklet: boolean[];
|
33
35
|
};
|
34
36
|
export declare const CALLBACK_TYPE: {
|
@@ -36,12 +38,13 @@ export declare const CALLBACK_TYPE: {
|
|
36
38
|
readonly BEGAN: 1;
|
37
39
|
readonly START: 2;
|
38
40
|
readonly UPDATE: 3;
|
39
|
-
readonly
|
40
|
-
readonly
|
41
|
-
readonly
|
42
|
-
readonly
|
43
|
-
readonly
|
44
|
-
readonly
|
41
|
+
readonly CHANGE: 4;
|
42
|
+
readonly END: 5;
|
43
|
+
readonly FINALIZE: 6;
|
44
|
+
readonly TOUCHES_DOWN: 7;
|
45
|
+
readonly TOUCHES_MOVE: 8;
|
46
|
+
readonly TOUCHES_UP: 9;
|
47
|
+
readonly TOUCHES_CANCELLED: 10;
|
45
48
|
};
|
46
49
|
export declare type CALLBACK_TYPE = typeof CALLBACK_TYPE[keyof typeof CALLBACK_TYPE];
|
47
50
|
export declare abstract class Gesture {
|
@@ -68,7 +71,7 @@ export declare abstract class BaseGesture<EventPayloadT extends Record<string, u
|
|
68
71
|
handlers: HandlerCallbacks<EventPayloadT>;
|
69
72
|
private addDependency;
|
70
73
|
withRef(ref: React.MutableRefObject<GestureType | undefined>): this;
|
71
|
-
protected isWorklet(callback:
|
74
|
+
protected isWorklet(callback: Function): boolean;
|
72
75
|
onBegin(callback: (event: GestureStateChangeEvent<EventPayloadT>) => void): this;
|
73
76
|
onStart(callback: (event: GestureStateChangeEvent<EventPayloadT>) => void): this;
|
74
77
|
onEnd(callback: (event: GestureStateChangeEvent<EventPayloadT>, success: boolean) => void): this;
|
@@ -86,8 +89,9 @@ export declare abstract class BaseGesture<EventPayloadT extends Record<string, u
|
|
86
89
|
toGestureArray(): GestureType[];
|
87
90
|
prepare(): void;
|
88
91
|
}
|
89
|
-
export declare abstract class ContinousBaseGesture<EventPayloadT extends Record<string, unknown>> extends BaseGesture<EventPayloadT> {
|
92
|
+
export declare abstract class ContinousBaseGesture<EventPayloadT extends Record<string, unknown>, EventChangePayloadT extends Record<string, unknown>> extends BaseGesture<EventPayloadT> {
|
90
93
|
onUpdate(callback: (event: GestureUpdateEvent<EventPayloadT>) => void): this;
|
94
|
+
onChange(callback: (event: GestureUpdateEvent<EventPayloadT & EventChangePayloadT>) => void): this;
|
91
95
|
manualActivation(manualActivation: boolean): this;
|
92
96
|
}
|
93
97
|
export {};
|
@@ -1,5 +1,7 @@
|
|
1
|
+
import { GestureUpdateEvent } from '../gestureHandlerCommon';
|
1
2
|
import { ContinousBaseGesture } from './gesture';
|
2
|
-
export declare class ManualGesture extends ContinousBaseGesture<Record<string, never>> {
|
3
|
+
export declare class ManualGesture extends ContinousBaseGesture<Record<string, never>, Record<string, never>> {
|
3
4
|
constructor();
|
5
|
+
onChange(callback: (event: GestureUpdateEvent<Record<string, never>>) => void): this;
|
4
6
|
}
|
5
7
|
export declare type ManualGestureType = InstanceType<typeof ManualGesture>;
|
@@ -1,6 +1,11 @@
|
|
1
1
|
import { BaseGestureConfig, ContinousBaseGesture } from './gesture';
|
2
|
+
import { GestureUpdateEvent } from '../gestureHandlerCommon';
|
2
3
|
import { PanGestureConfig, PanGestureHandlerEventPayload } from '../PanGestureHandler';
|
3
|
-
|
4
|
+
declare type PanGestureChangeEventPayload = {
|
5
|
+
changeX: number;
|
6
|
+
changeY: number;
|
7
|
+
};
|
8
|
+
export declare class PanGesture extends ContinousBaseGesture<PanGestureHandlerEventPayload, PanGestureChangeEventPayload> {
|
4
9
|
config: BaseGestureConfig & PanGestureConfig;
|
5
10
|
constructor();
|
6
11
|
activeOffsetY(offset: number | number[]): this;
|
@@ -15,5 +20,7 @@ export declare class PanGesture extends ContinousBaseGesture<PanGestureHandlerEv
|
|
15
20
|
minVelocityY(velocity: number): this;
|
16
21
|
averageTouches(value: boolean): this;
|
17
22
|
enableTrackpadTwoFingerGesture(value: boolean): this;
|
23
|
+
onChange(callback: (event: GestureUpdateEvent<PanGestureHandlerEventPayload & PanGestureChangeEventPayload>) => void): this;
|
18
24
|
}
|
19
25
|
export declare type PanGestureType = InstanceType<typeof PanGesture>;
|
26
|
+
export {};
|
@@ -1,6 +1,12 @@
|
|
1
1
|
import { ContinousBaseGesture } from './gesture';
|
2
2
|
import { PinchGestureHandlerEventPayload } from '../PinchGestureHandler';
|
3
|
-
|
3
|
+
import { GestureUpdateEvent } from '../gestureHandlerCommon';
|
4
|
+
declare type PinchGestureChangeEventPayload = {
|
5
|
+
scaleChange: number;
|
6
|
+
};
|
7
|
+
export declare class PinchGesture extends ContinousBaseGesture<PinchGestureHandlerEventPayload, PinchGestureChangeEventPayload> {
|
4
8
|
constructor();
|
9
|
+
onChange(callback: (event: GestureUpdateEvent<PinchGestureHandlerEventPayload & PinchGestureChangeEventPayload>) => void): this;
|
5
10
|
}
|
6
11
|
export declare type PinchGestureType = InstanceType<typeof PinchGesture>;
|
12
|
+
export {};
|
@@ -1,6 +1,12 @@
|
|
1
1
|
import { ContinousBaseGesture } from './gesture';
|
2
2
|
import { RotationGestureHandlerEventPayload } from '../RotationGestureHandler';
|
3
|
-
|
3
|
+
import { GestureUpdateEvent } from '../gestureHandlerCommon';
|
4
|
+
declare type RotationGestureChangeEventPayload = {
|
5
|
+
rotationChange: number;
|
6
|
+
};
|
7
|
+
export declare class RotationGesture extends ContinousBaseGesture<RotationGestureHandlerEventPayload, RotationGestureChangeEventPayload> {
|
4
8
|
constructor();
|
9
|
+
onChange(callback: (event: GestureUpdateEvent<RotationGestureHandlerEventPayload & RotationGestureChangeEventPayload>) => void): this;
|
5
10
|
}
|
6
11
|
export declare type RotationGestureType = InstanceType<typeof RotationGesture>;
|
12
|
+
export {};
|
package/package.json
CHANGED
@@ -256,6 +256,8 @@ function useAnimatedGesture(preparedGesture: GestureConfigReference) {
|
|
256
256
|
return gesture.onStart;
|
257
257
|
case CALLBACK_TYPE.UPDATE:
|
258
258
|
return gesture.onUpdate;
|
259
|
+
case CALLBACK_TYPE.CHANGE:
|
260
|
+
return gesture.onChange;
|
259
261
|
case CALLBACK_TYPE.END:
|
260
262
|
return gesture.onEnd;
|
261
263
|
case CALLBACK_TYPE.FINALIZE:
|
@@ -310,6 +312,11 @@ function useAnimatedGesture(preparedGesture: GestureConfigReference) {
|
|
310
312
|
HandlerCallbacks<Record<string, unknown>>[] | null
|
311
313
|
>(null);
|
312
314
|
|
315
|
+
// eslint-disable-next-line react-hooks/rules-of-hooks
|
316
|
+
const lastUpdateEvent = Reanimated.useSharedValue<
|
317
|
+
(GestureUpdateEvent | undefined)[]
|
318
|
+
>([]);
|
319
|
+
|
313
320
|
// not every gesture needs a state controller, init them lazily
|
314
321
|
const stateControllers: GestureStateManagerType[] = [];
|
315
322
|
|
@@ -339,6 +346,7 @@ function useAnimatedGesture(preparedGesture: GestureConfigReference) {
|
|
339
346
|
event.state === State.ACTIVE
|
340
347
|
) {
|
341
348
|
runWorklet(CALLBACK_TYPE.START, gesture, event);
|
349
|
+
lastUpdateEvent.value[gesture.handlerTag] = undefined;
|
342
350
|
} else if (
|
343
351
|
event.oldState !== event.state &&
|
344
352
|
event.state === State.END
|
@@ -371,6 +379,19 @@ function useAnimatedGesture(preparedGesture: GestureConfigReference) {
|
|
371
379
|
}
|
372
380
|
} else {
|
373
381
|
runWorklet(CALLBACK_TYPE.UPDATE, gesture, event);
|
382
|
+
|
383
|
+
if (gesture.onChange && gesture.changeEventCalculator) {
|
384
|
+
runWorklet(
|
385
|
+
CALLBACK_TYPE.CHANGE,
|
386
|
+
gesture,
|
387
|
+
gesture.changeEventCalculator?.(
|
388
|
+
event,
|
389
|
+
lastUpdateEvent.value[gesture.handlerTag]
|
390
|
+
)
|
391
|
+
);
|
392
|
+
|
393
|
+
lastUpdateEvent.value[gesture.handlerTag] = event;
|
394
|
+
}
|
374
395
|
}
|
375
396
|
}
|
376
397
|
}
|
@@ -36,6 +36,8 @@ const dummyStateManager: GestureStateManagerType = {
|
|
36
36
|
},
|
37
37
|
};
|
38
38
|
|
39
|
+
const lastUpdateEvent: (GestureUpdateEvent | undefined)[] = [];
|
40
|
+
|
39
41
|
function isStateChangeEvent(
|
40
42
|
event: GestureUpdateEvent | GestureStateChangeEvent | GestureTouchEvent
|
41
43
|
): event is GestureStateChangeEvent {
|
@@ -69,11 +71,13 @@ function onGestureHandlerEvent(
|
|
69
71
|
event.state === State.ACTIVE
|
70
72
|
) {
|
71
73
|
handler.handlers.onStart?.(event);
|
74
|
+
lastUpdateEvent[handler.handlers.handlerTag] = event;
|
72
75
|
} else if (event.oldState !== event.state && event.state === State.END) {
|
73
76
|
if (event.oldState === State.ACTIVE) {
|
74
77
|
handler.handlers.onEnd?.(event, true);
|
75
78
|
}
|
76
79
|
handler.handlers.onFinalize?.(event, true);
|
80
|
+
lastUpdateEvent[handler.handlers.handlerTag] = undefined;
|
77
81
|
} else if (
|
78
82
|
(event.state === State.FAILED || event.state === State.CANCELLED) &&
|
79
83
|
event.oldState !== event.state
|
@@ -82,6 +86,7 @@ function onGestureHandlerEvent(
|
|
82
86
|
handler.handlers.onEnd?.(event, false);
|
83
87
|
}
|
84
88
|
handler.handlers.onFinalize?.(event, false);
|
89
|
+
lastUpdateEvent[handler.handlers.handlerTag] = undefined;
|
85
90
|
}
|
86
91
|
} else if (isTouchEvent(event)) {
|
87
92
|
switch (event.eventType) {
|
@@ -100,6 +105,17 @@ function onGestureHandlerEvent(
|
|
100
105
|
}
|
101
106
|
} else {
|
102
107
|
handler.handlers.onUpdate?.(event);
|
108
|
+
|
109
|
+
if (handler.handlers.onChange && handler.handlers.changeEventCalculator) {
|
110
|
+
handler.handlers.onChange?.(
|
111
|
+
handler.handlers.changeEventCalculator?.(
|
112
|
+
event,
|
113
|
+
lastUpdateEvent[handler.handlers.handlerTag]
|
114
|
+
)
|
115
|
+
);
|
116
|
+
|
117
|
+
lastUpdateEvent[handler.handlers.handlerTag] = event;
|
118
|
+
}
|
103
119
|
}
|
104
120
|
}
|
105
121
|
}
|
@@ -3,8 +3,35 @@ import {
|
|
3
3
|
ForceTouchGestureConfig,
|
4
4
|
ForceTouchGestureHandlerEventPayload,
|
5
5
|
} from '../ForceTouchGestureHandler';
|
6
|
+
import { GestureUpdateEvent } from '../gestureHandlerCommon';
|
6
7
|
|
7
|
-
|
8
|
+
type ForceTouchGestureChangeEventPayload = {
|
9
|
+
forceChange: number;
|
10
|
+
};
|
11
|
+
|
12
|
+
function changeEventCalculator(
|
13
|
+
current: GestureUpdateEvent<ForceTouchGestureHandlerEventPayload>,
|
14
|
+
previous?: GestureUpdateEvent<ForceTouchGestureHandlerEventPayload>
|
15
|
+
) {
|
16
|
+
'worklet';
|
17
|
+
let changePayload: ForceTouchGestureChangeEventPayload;
|
18
|
+
if (previous === undefined) {
|
19
|
+
changePayload = {
|
20
|
+
forceChange: current.force,
|
21
|
+
};
|
22
|
+
} else {
|
23
|
+
changePayload = {
|
24
|
+
forceChange: current.force - previous.force,
|
25
|
+
};
|
26
|
+
}
|
27
|
+
|
28
|
+
return { ...current, ...changePayload };
|
29
|
+
}
|
30
|
+
|
31
|
+
export class ForceTouchGesture extends ContinousBaseGesture<
|
32
|
+
ForceTouchGestureHandlerEventPayload,
|
33
|
+
ForceTouchGestureChangeEventPayload
|
34
|
+
> {
|
8
35
|
public config: BaseGestureConfig & ForceTouchGestureConfig = {};
|
9
36
|
|
10
37
|
constructor() {
|
@@ -27,6 +54,21 @@ export class ForceTouchGesture extends ContinousBaseGesture<ForceTouchGestureHan
|
|
27
54
|
this.config.feedbackOnActivation = value;
|
28
55
|
return this;
|
29
56
|
}
|
57
|
+
|
58
|
+
onChange(
|
59
|
+
callback: (
|
60
|
+
event: GestureUpdateEvent<
|
61
|
+
GestureUpdateEvent<
|
62
|
+
ForceTouchGestureHandlerEventPayload &
|
63
|
+
ForceTouchGestureChangeEventPayload
|
64
|
+
>
|
65
|
+
>
|
66
|
+
) => void
|
67
|
+
) {
|
68
|
+
// @ts-ignore TS being overprotective, ForceTouchGestureHandlerEventPayload is Record
|
69
|
+
this.handlers.changeEventCalculator = changeEventCalculator;
|
70
|
+
return super.onChange(callback);
|
71
|
+
}
|
30
72
|
}
|
31
73
|
|
32
74
|
export type ForceTouchGestureType = InstanceType<typeof ForceTouchGesture>;
|
@@ -61,10 +61,15 @@ export type HandlerCallbacks<EventPayloadT extends Record<string, unknown>> = {
|
|
61
61
|
success: boolean
|
62
62
|
) => void;
|
63
63
|
onUpdate?: (event: GestureUpdateEvent<EventPayloadT>) => void;
|
64
|
+
onChange?: (event: any) => void;
|
64
65
|
onTouchesDown?: TouchEventHandlerType;
|
65
66
|
onTouchesMove?: TouchEventHandlerType;
|
66
67
|
onTouchesUp?: TouchEventHandlerType;
|
67
68
|
onTouchesCancelled?: TouchEventHandlerType;
|
69
|
+
changeEventCalculator?: (
|
70
|
+
current: GestureUpdateEvent<Record<string, unknown>>,
|
71
|
+
previous?: GestureUpdateEvent<Record<string, unknown>>
|
72
|
+
) => GestureUpdateEvent<Record<string, unknown>>;
|
68
73
|
isWorklet: boolean[];
|
69
74
|
};
|
70
75
|
|
@@ -73,12 +78,13 @@ export const CALLBACK_TYPE = {
|
|
73
78
|
BEGAN: 1,
|
74
79
|
START: 2,
|
75
80
|
UPDATE: 3,
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
81
|
+
CHANGE: 4,
|
82
|
+
END: 5,
|
83
|
+
FINALIZE: 6,
|
84
|
+
TOUCHES_DOWN: 7,
|
85
|
+
TOUCHES_MOVE: 8,
|
86
|
+
TOUCHES_UP: 9,
|
87
|
+
TOUCHES_CANCELLED: 10,
|
82
88
|
} as const;
|
83
89
|
|
84
90
|
// Allow using CALLBACK_TYPE as object and type
|
@@ -131,12 +137,8 @@ export abstract class BaseGesture<
|
|
131
137
|
return this;
|
132
138
|
}
|
133
139
|
|
134
|
-
|
135
|
-
|
136
|
-
| TouchEventHandlerType
|
137
|
-
| ((event: GestureUpdateEvent<EventPayloadT>) => void)
|
138
|
-
| ((event: GestureStateChangeEvent<EventPayloadT>) => void)
|
139
|
-
) {
|
140
|
+
// eslint-disable-next-line @typescript-eslint/ban-types
|
141
|
+
protected isWorklet(callback: Function) {
|
140
142
|
//@ts-ignore if callback is a worklet, the property will be available, if not then the check will return false
|
141
143
|
return callback.__workletHash !== undefined;
|
142
144
|
}
|
@@ -264,7 +266,8 @@ export abstract class BaseGesture<
|
|
264
266
|
}
|
265
267
|
|
266
268
|
export abstract class ContinousBaseGesture<
|
267
|
-
EventPayloadT extends Record<string, unknown
|
269
|
+
EventPayloadT extends Record<string, unknown>,
|
270
|
+
EventChangePayloadT extends Record<string, unknown>
|
268
271
|
> extends BaseGesture<EventPayloadT> {
|
269
272
|
onUpdate(callback: (event: GestureUpdateEvent<EventPayloadT>) => void) {
|
270
273
|
this.handlers.onUpdate = callback;
|
@@ -272,6 +275,16 @@ export abstract class ContinousBaseGesture<
|
|
272
275
|
return this;
|
273
276
|
}
|
274
277
|
|
278
|
+
onChange(
|
279
|
+
callback: (
|
280
|
+
event: GestureUpdateEvent<EventPayloadT & EventChangePayloadT>
|
281
|
+
) => void
|
282
|
+
) {
|
283
|
+
this.handlers.onChange = callback;
|
284
|
+
this.handlers.isWorklet[CALLBACK_TYPE.CHANGE] = this.isWorklet(callback);
|
285
|
+
return this;
|
286
|
+
}
|
287
|
+
|
275
288
|
manualActivation(manualActivation: boolean) {
|
276
289
|
this.config.manualActivation = manualActivation;
|
277
290
|
return this;
|
@@ -1,11 +1,31 @@
|
|
1
|
+
import { GestureUpdateEvent } from '../gestureHandlerCommon';
|
1
2
|
import { ContinousBaseGesture } from './gesture';
|
2
3
|
|
3
|
-
|
4
|
+
function changeEventCalculator(
|
5
|
+
current: GestureUpdateEvent<Record<string, never>>,
|
6
|
+
_previous?: GestureUpdateEvent<Record<string, never>>
|
7
|
+
) {
|
8
|
+
'worklet';
|
9
|
+
return current;
|
10
|
+
}
|
11
|
+
|
12
|
+
export class ManualGesture extends ContinousBaseGesture<
|
13
|
+
Record<string, never>,
|
14
|
+
Record<string, never>
|
15
|
+
> {
|
4
16
|
constructor() {
|
5
17
|
super();
|
6
18
|
|
7
19
|
this.handlerName = 'ManualGestureHandler';
|
8
20
|
}
|
21
|
+
|
22
|
+
onChange(
|
23
|
+
callback: (event: GestureUpdateEvent<Record<string, never>>) => void
|
24
|
+
) {
|
25
|
+
// @ts-ignore TS being overprotective, Record<string, never> is Record
|
26
|
+
this.handlers.changeEventCalculator = changeEventCalculator;
|
27
|
+
return super.onChange(callback);
|
28
|
+
}
|
9
29
|
}
|
10
30
|
|
11
31
|
export type ManualGestureType = InstanceType<typeof ManualGesture>;
|
@@ -1,10 +1,40 @@
|
|
1
1
|
import { BaseGestureConfig, ContinousBaseGesture } from './gesture';
|
2
|
+
import { GestureUpdateEvent } from '../gestureHandlerCommon';
|
2
3
|
import {
|
3
4
|
PanGestureConfig,
|
4
5
|
PanGestureHandlerEventPayload,
|
5
6
|
} from '../PanGestureHandler';
|
6
7
|
|
7
|
-
|
8
|
+
type PanGestureChangeEventPayload = {
|
9
|
+
changeX: number;
|
10
|
+
changeY: number;
|
11
|
+
};
|
12
|
+
|
13
|
+
function changeEventCalculator(
|
14
|
+
current: GestureUpdateEvent<PanGestureHandlerEventPayload>,
|
15
|
+
previous?: GestureUpdateEvent<PanGestureHandlerEventPayload>
|
16
|
+
) {
|
17
|
+
'worklet';
|
18
|
+
let changePayload: PanGestureChangeEventPayload;
|
19
|
+
if (previous === undefined) {
|
20
|
+
changePayload = {
|
21
|
+
changeX: current.translationX,
|
22
|
+
changeY: current.translationY,
|
23
|
+
};
|
24
|
+
} else {
|
25
|
+
changePayload = {
|
26
|
+
changeX: current.translationX - previous.translationX,
|
27
|
+
changeY: current.translationY - previous.translationY,
|
28
|
+
};
|
29
|
+
}
|
30
|
+
|
31
|
+
return { ...current, ...changePayload };
|
32
|
+
}
|
33
|
+
|
34
|
+
export class PanGesture extends ContinousBaseGesture<
|
35
|
+
PanGestureHandlerEventPayload,
|
36
|
+
PanGestureChangeEventPayload
|
37
|
+
> {
|
8
38
|
public config: BaseGestureConfig & PanGestureConfig = {};
|
9
39
|
|
10
40
|
constructor() {
|
@@ -100,6 +130,18 @@ export class PanGesture extends ContinousBaseGesture<PanGestureHandlerEventPaylo
|
|
100
130
|
this.config.enableTrackpadTwoFingerGesture = value;
|
101
131
|
return this;
|
102
132
|
}
|
133
|
+
|
134
|
+
onChange(
|
135
|
+
callback: (
|
136
|
+
event: GestureUpdateEvent<
|
137
|
+
PanGestureHandlerEventPayload & PanGestureChangeEventPayload
|
138
|
+
>
|
139
|
+
) => void
|
140
|
+
) {
|
141
|
+
// @ts-ignore TS being overprotective, PanGestureHandlerEventPayload is Record
|
142
|
+
this.handlers.changeEventCalculator = changeEventCalculator;
|
143
|
+
return super.onChange(callback);
|
144
|
+
}
|
103
145
|
}
|
104
146
|
|
105
147
|
export type PanGestureType = InstanceType<typeof PanGesture>;
|
@@ -1,12 +1,51 @@
|
|
1
1
|
import { ContinousBaseGesture } from './gesture';
|
2
2
|
import { PinchGestureHandlerEventPayload } from '../PinchGestureHandler';
|
3
|
+
import { GestureUpdateEvent } from '../gestureHandlerCommon';
|
3
4
|
|
4
|
-
|
5
|
+
type PinchGestureChangeEventPayload = {
|
6
|
+
scaleChange: number;
|
7
|
+
};
|
8
|
+
|
9
|
+
function changeEventCalculator(
|
10
|
+
current: GestureUpdateEvent<PinchGestureHandlerEventPayload>,
|
11
|
+
previous?: GestureUpdateEvent<PinchGestureHandlerEventPayload>
|
12
|
+
) {
|
13
|
+
'worklet';
|
14
|
+
let changePayload: PinchGestureChangeEventPayload;
|
15
|
+
if (previous === undefined) {
|
16
|
+
changePayload = {
|
17
|
+
scaleChange: current.scale,
|
18
|
+
};
|
19
|
+
} else {
|
20
|
+
changePayload = {
|
21
|
+
scaleChange: current.scale / previous.scale,
|
22
|
+
};
|
23
|
+
}
|
24
|
+
|
25
|
+
return { ...current, ...changePayload };
|
26
|
+
}
|
27
|
+
|
28
|
+
export class PinchGesture extends ContinousBaseGesture<
|
29
|
+
PinchGestureHandlerEventPayload,
|
30
|
+
PinchGestureChangeEventPayload
|
31
|
+
> {
|
5
32
|
constructor() {
|
6
33
|
super();
|
7
34
|
|
8
35
|
this.handlerName = 'PinchGestureHandler';
|
9
36
|
}
|
37
|
+
|
38
|
+
onChange(
|
39
|
+
callback: (
|
40
|
+
event: GestureUpdateEvent<
|
41
|
+
PinchGestureHandlerEventPayload & PinchGestureChangeEventPayload
|
42
|
+
>
|
43
|
+
) => void
|
44
|
+
) {
|
45
|
+
// @ts-ignore TS being overprotective, PinchGestureHandlerEventPayload is Record
|
46
|
+
this.handlers.changeEventCalculator = changeEventCalculator;
|
47
|
+
return super.onChange(callback);
|
48
|
+
}
|
10
49
|
}
|
11
50
|
|
12
51
|
export type PinchGestureType = InstanceType<typeof PinchGesture>;
|
@@ -1,12 +1,51 @@
|
|
1
1
|
import { ContinousBaseGesture } from './gesture';
|
2
2
|
import { RotationGestureHandlerEventPayload } from '../RotationGestureHandler';
|
3
|
+
import { GestureUpdateEvent } from '../gestureHandlerCommon';
|
3
4
|
|
4
|
-
|
5
|
+
type RotationGestureChangeEventPayload = {
|
6
|
+
rotationChange: number;
|
7
|
+
};
|
8
|
+
|
9
|
+
function changeEventCalculator(
|
10
|
+
current: GestureUpdateEvent<RotationGestureHandlerEventPayload>,
|
11
|
+
previous?: GestureUpdateEvent<RotationGestureHandlerEventPayload>
|
12
|
+
) {
|
13
|
+
'worklet';
|
14
|
+
let changePayload: RotationGestureChangeEventPayload;
|
15
|
+
if (previous === undefined) {
|
16
|
+
changePayload = {
|
17
|
+
rotationChange: current.rotation,
|
18
|
+
};
|
19
|
+
} else {
|
20
|
+
changePayload = {
|
21
|
+
rotationChange: current.rotation - previous.rotation,
|
22
|
+
};
|
23
|
+
}
|
24
|
+
|
25
|
+
return { ...current, ...changePayload };
|
26
|
+
}
|
27
|
+
|
28
|
+
export class RotationGesture extends ContinousBaseGesture<
|
29
|
+
RotationGestureHandlerEventPayload,
|
30
|
+
RotationGestureChangeEventPayload
|
31
|
+
> {
|
5
32
|
constructor() {
|
6
33
|
super();
|
7
34
|
|
8
35
|
this.handlerName = 'RotationGestureHandler';
|
9
36
|
}
|
37
|
+
|
38
|
+
onChange(
|
39
|
+
callback: (
|
40
|
+
event: GestureUpdateEvent<
|
41
|
+
RotationGestureHandlerEventPayload & RotationGestureChangeEventPayload
|
42
|
+
>
|
43
|
+
) => void
|
44
|
+
) {
|
45
|
+
// @ts-ignore TS being overprotective, RotationGestureHandlerEventPayload is Record
|
46
|
+
this.handlers.changeEventCalculator = changeEventCalculator;
|
47
|
+
return super.onChange(callback);
|
48
|
+
}
|
10
49
|
}
|
11
50
|
|
12
51
|
export type RotationGestureType = InstanceType<typeof RotationGesture>;
|