react-native-gesture-handler 2.18.1 → 2.20.0
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/README.md +1 -0
- package/android/build.gradle +11 -29
- package/android/fabric/src/main/java/com/swmansion/gesturehandler/ReactContextExtensions.kt +1 -1
- package/android/paper/src/main/java/com/swmansion/gesturehandler/ReactContextExtensions.kt +1 -1
- package/android/src/main/AndroidManifest.xml +1 -3
- package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandler.kt +21 -21
- package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandlerOrchestrator.kt +2 -2
- package/android/src/main/java/com/swmansion/gesturehandler/core/GestureUtils.kt +1 -0
- package/android/src/main/java/com/swmansion/gesturehandler/core/HoverGestureHandler.kt +16 -0
- package/android/src/main/java/com/swmansion/gesturehandler/core/LongPressGestureHandler.kt +80 -4
- package/android/src/main/java/com/swmansion/gesturehandler/core/PanGestureHandler.kt +8 -0
- package/android/src/main/java/com/swmansion/gesturehandler/core/PinchGestureHandler.kt +2 -1
- package/android/src/main/java/com/swmansion/gesturehandler/core/ScaleGestureDetector.java +10 -0
- package/android/src/main/java/com/swmansion/gesturehandler/core/StylusData.kt +103 -0
- package/android/src/main/java/com/swmansion/gesturehandler/core/Vector.kt +2 -2
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +24 -15
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +3 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/eventbuilders/HoverGestureHandlerEventDataBuilder.kt +7 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/eventbuilders/PanGestureHandlerEventDataBuilder.kt +7 -0
- package/android/src/main/jni/CMakeLists.txt +18 -9
- package/apple/Handlers/RNFlingHandler.h +1 -0
- package/apple/Handlers/RNFlingHandler.m +153 -19
- package/apple/Handlers/RNHoverHandler.m +44 -2
- package/apple/Handlers/RNLongPressHandler.m +111 -20
- package/apple/Handlers/RNManualHandler.m +53 -29
- package/apple/Handlers/RNNativeViewHandler.mm +22 -15
- package/apple/Handlers/RNPanHandler.m +57 -7
- package/apple/Handlers/RNRotationHandler.m +1 -1
- package/apple/RNGHStylusData.h +77 -0
- package/apple/RNGHStylusData.m +37 -0
- package/apple/RNGHUIKit.h +2 -0
- package/apple/RNGHVector.h +31 -0
- package/apple/RNGHVector.m +67 -0
- package/apple/RNGestureHandler.h +7 -0
- package/apple/{RNGestureHandler.m → RNGestureHandler.mm} +63 -1
- package/apple/RNGestureHandlerButtonComponentView.mm +41 -0
- package/apple/RNGestureHandlerDirection.h +25 -0
- package/apple/RNGestureHandlerEvents.h +3 -1
- package/apple/RNGestureHandlerEvents.m +11 -3
- package/lib/commonjs/PointerType.js +2 -1
- package/lib/commonjs/PointerType.js.map +1 -1
- package/lib/commonjs/components/GestureButtons.js +5 -1
- package/lib/commonjs/components/GestureButtons.js.map +1 -1
- package/lib/commonjs/components/GestureComponents.js.map +1 -1
- package/lib/commonjs/components/Pressable/Pressable.js +66 -78
- package/lib/commonjs/components/Pressable/Pressable.js.map +1 -1
- package/lib/commonjs/components/Pressable/index.js +0 -8
- package/lib/commonjs/components/Pressable/index.js.map +1 -1
- package/lib/commonjs/components/Pressable/utils.js +1 -23
- package/lib/commonjs/components/Pressable/utils.js.map +1 -1
- package/lib/commonjs/components/ReanimatedSwipeable.js +60 -41
- package/lib/commonjs/components/ReanimatedSwipeable.js.map +1 -1
- package/lib/commonjs/handlers/GestureHandlerEventPayload.js +4 -0
- package/lib/commonjs/handlers/LongPressGestureHandler.js +1 -1
- package/lib/commonjs/handlers/LongPressGestureHandler.js.map +1 -1
- package/lib/commonjs/handlers/createHandler.js +2 -1
- package/lib/commonjs/handlers/createHandler.js.map +1 -1
- package/lib/commonjs/handlers/gestures/GestureDetector/utils.js +1 -1
- package/lib/commonjs/handlers/gestures/GestureDetector/utils.js.map +1 -1
- package/lib/commonjs/handlers/gestures/gesture.js.map +1 -1
- package/lib/commonjs/handlers/gestures/hoverGesture.js.map +1 -1
- package/lib/commonjs/handlers/gestures/longPressGesture.js +10 -0
- package/lib/commonjs/handlers/gestures/longPressGesture.js.map +1 -1
- package/lib/commonjs/jestUtils/jestUtils.js +12 -4
- package/lib/commonjs/jestUtils/jestUtils.js.map +1 -1
- package/lib/commonjs/mocks.js +16 -3
- package/lib/commonjs/mocks.js.map +1 -1
- package/lib/commonjs/utils.js +4 -0
- package/lib/commonjs/utils.js.map +1 -1
- package/lib/commonjs/web/constants.js +3 -3
- package/lib/commonjs/web/constants.js.map +1 -1
- package/lib/commonjs/web/handlers/GestureHandler.js +2 -3
- package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/HoverGestureHandler.js +18 -1
- package/lib/commonjs/web/handlers/HoverGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/LongPressGestureHandler.js +43 -9
- package/lib/commonjs/web/handlers/LongPressGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/NativeViewGestureHandler.js +14 -3
- package/lib/commonjs/web/handlers/NativeViewGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/PanGestureHandler.js +12 -1
- package/lib/commonjs/web/handlers/PanGestureHandler.js.map +1 -1
- package/lib/commonjs/web/interfaces.js.map +1 -1
- package/lib/commonjs/web/tools/EventManager.js.map +1 -1
- package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js +55 -11
- package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js.map +1 -1
- package/lib/commonjs/web/tools/KeyboardEventManager.js +110 -0
- package/lib/commonjs/web/tools/KeyboardEventManager.js.map +1 -0
- package/lib/commonjs/web/tools/PointerEventManager.js +3 -37
- package/lib/commonjs/web/tools/PointerEventManager.js.map +1 -1
- package/lib/commonjs/web/tools/Vector.js +4 -2
- package/lib/commonjs/web/tools/Vector.js.map +1 -1
- package/lib/commonjs/web/utils.js +187 -13
- package/lib/commonjs/web/utils.js.map +1 -1
- package/lib/module/PointerType.js +2 -1
- package/lib/module/PointerType.js.map +1 -1
- package/lib/module/components/GestureButtons.js +5 -1
- package/lib/module/components/GestureButtons.js.map +1 -1
- package/lib/module/components/GestureComponents.js.map +1 -1
- package/lib/module/components/Pressable/Pressable.js +67 -78
- package/lib/module/components/Pressable/Pressable.js.map +1 -1
- package/lib/module/components/Pressable/index.js +0 -1
- package/lib/module/components/Pressable/index.js.map +1 -1
- package/lib/module/components/Pressable/utils.js +1 -22
- package/lib/module/components/Pressable/utils.js.map +1 -1
- package/lib/module/components/ReanimatedSwipeable.js +58 -37
- package/lib/module/components/ReanimatedSwipeable.js.map +1 -1
- package/lib/module/handlers/GestureHandlerEventPayload.js +1 -1
- package/lib/module/handlers/LongPressGestureHandler.js +1 -1
- package/lib/module/handlers/LongPressGestureHandler.js.map +1 -1
- package/lib/module/handlers/createHandler.js +2 -1
- package/lib/module/handlers/createHandler.js.map +1 -1
- package/lib/module/handlers/gestures/GestureDetector/utils.js +2 -2
- package/lib/module/handlers/gestures/GestureDetector/utils.js.map +1 -1
- package/lib/module/handlers/gestures/gesture.js.map +1 -1
- package/lib/module/handlers/gestures/hoverGesture.js.map +1 -1
- package/lib/module/handlers/gestures/longPressGesture.js +10 -0
- package/lib/module/handlers/gestures/longPressGesture.js.map +1 -1
- package/lib/module/jestUtils/jestUtils.js +12 -4
- package/lib/module/jestUtils/jestUtils.js.map +1 -1
- package/lib/module/mocks.js +13 -3
- package/lib/module/mocks.js.map +1 -1
- package/lib/module/utils.js +1 -0
- package/lib/module/utils.js.map +1 -1
- package/lib/module/web/constants.js +1 -1
- package/lib/module/web/constants.js.map +1 -1
- package/lib/module/web/handlers/GestureHandler.js +2 -3
- package/lib/module/web/handlers/GestureHandler.js.map +1 -1
- package/lib/module/web/handlers/HoverGestureHandler.js +18 -1
- package/lib/module/web/handlers/HoverGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/LongPressGestureHandler.js +43 -9
- package/lib/module/web/handlers/LongPressGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/NativeViewGestureHandler.js +14 -3
- package/lib/module/web/handlers/NativeViewGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/PanGestureHandler.js +12 -1
- package/lib/module/web/handlers/PanGestureHandler.js.map +1 -1
- package/lib/module/web/interfaces.js.map +1 -1
- package/lib/module/web/tools/EventManager.js.map +1 -1
- package/lib/module/web/tools/GestureHandlerWebDelegate.js +54 -10
- package/lib/module/web/tools/GestureHandlerWebDelegate.js.map +1 -1
- package/lib/module/web/tools/KeyboardEventManager.js +96 -0
- package/lib/module/web/tools/KeyboardEventManager.js.map +1 -0
- package/lib/module/web/tools/PointerEventManager.js +4 -38
- package/lib/module/web/tools/PointerEventManager.js.map +1 -1
- package/lib/module/web/tools/Vector.js +5 -3
- package/lib/module/web/tools/Vector.js.map +1 -1
- package/lib/module/web/utils.js +184 -13
- package/lib/module/web/utils.js.map +1 -1
- package/lib/typescript/PointerType.d.ts +2 -1
- package/lib/typescript/components/GestureComponents.d.ts +1 -1
- package/lib/typescript/components/Pressable/index.d.ts +1 -1
- package/lib/typescript/components/Pressable/utils.d.ts +3 -5
- package/lib/typescript/handlers/GestureHandlerEventPayload.d.ts +35 -0
- package/lib/typescript/handlers/LongPressGestureHandler.d.ts +5 -1
- package/lib/typescript/handlers/gestures/gesture.d.ts +2 -2
- package/lib/typescript/handlers/gestures/hoverGesture.d.ts +1 -6
- package/lib/typescript/handlers/gestures/longPressGesture.d.ts +5 -0
- package/lib/typescript/handlers/handlersRegistry.d.ts +1 -1
- package/lib/typescript/jestUtils/jestUtils.d.ts +1 -1
- package/lib/typescript/mocks.d.ts +4 -3
- package/lib/typescript/utils.d.ts +1 -0
- package/lib/typescript/web/constants.d.ts +1 -1
- package/lib/typescript/web/handlers/GestureHandler.d.ts +1 -1
- package/lib/typescript/web/handlers/HoverGestureHandler.d.ts +2 -0
- package/lib/typescript/web/handlers/LongPressGestureHandler.d.ts +3 -0
- package/lib/typescript/web/handlers/NativeViewGestureHandler.d.ts +1 -0
- package/lib/typescript/web/handlers/PanGestureHandler.d.ts +3 -1
- package/lib/typescript/web/interfaces.d.ts +9 -4
- package/lib/typescript/web/tools/EventManager.d.ts +2 -2
- package/lib/typescript/web/tools/GestureHandlerDelegate.d.ts +1 -0
- package/lib/typescript/web/tools/GestureHandlerWebDelegate.d.ts +6 -0
- package/lib/typescript/web/tools/KeyboardEventManager.d.ts +13 -0
- package/lib/typescript/web/utils.d.ts +2 -1
- package/package.json +3 -3
- package/src/PointerType.ts +1 -0
- package/src/components/GestureButtons.tsx +2 -1
- package/src/components/GestureComponents.tsx +1 -1
- package/src/components/Pressable/Pressable.tsx +77 -70
- package/src/components/Pressable/index.ts +1 -1
- package/src/components/Pressable/utils.ts +5 -49
- package/src/components/ReanimatedSwipeable.tsx +70 -47
- package/src/handlers/GestureHandlerEventPayload.ts +42 -0
- package/src/handlers/LongPressGestureHandler.ts +6 -0
- package/src/handlers/createHandler.tsx +1 -0
- package/src/handlers/gestures/GestureDetector/utils.ts +2 -2
- package/src/handlers/gestures/gesture.ts +3 -1
- package/src/handlers/gestures/hoverGesture.ts +1 -7
- package/src/handlers/gestures/longPressGesture.ts +9 -0
- package/src/jestUtils/jestUtils.ts +9 -1
- package/src/{mocks.ts → mocks.tsx} +8 -3
- package/src/utils.ts +2 -0
- package/src/web/constants.ts +1 -1
- package/src/web/handlers/GestureHandler.ts +4 -2
- package/src/web/handlers/HoverGestureHandler.ts +16 -2
- package/src/web/handlers/LongPressGestureHandler.ts +49 -10
- package/src/web/handlers/NativeViewGestureHandler.ts +14 -4
- package/src/web/handlers/PanGestureHandler.ts +14 -1
- package/src/web/interfaces.ts +10 -4
- package/src/web/tools/EventManager.ts +2 -4
- package/src/web/tools/GestureHandlerDelegate.ts +1 -0
- package/src/web/tools/GestureHandlerWebDelegate.ts +67 -10
- package/src/web/tools/KeyboardEventManager.ts +91 -0
- package/src/web/tools/PointerEventManager.ts +2 -38
- package/src/web/tools/Vector.ts +4 -3
- package/src/web/utils.ts +188 -13
- package/lib/commonjs/web/tools/TouchEventManager.js +0 -164
- package/lib/commonjs/web/tools/TouchEventManager.js.map +0 -1
- package/lib/module/web/tools/TouchEventManager.js +0 -149
- package/lib/module/web/tools/TouchEventManager.js.map +0 -1
- package/lib/typescript/web/tools/TouchEventManager.d.ts +0 -11
- package/src/web/tools/TouchEventManager.ts +0 -175
|
@@ -6,6 +6,7 @@ export default class LongPressGestureHandler extends GestureHandler {
|
|
|
6
6
|
private minDurationMs;
|
|
7
7
|
private defaultMaxDistSq;
|
|
8
8
|
private maxDistSq;
|
|
9
|
+
private numberOfPointers;
|
|
9
10
|
private startX;
|
|
10
11
|
private startY;
|
|
11
12
|
private startTime;
|
|
@@ -19,8 +20,10 @@ export default class LongPressGestureHandler extends GestureHandler {
|
|
|
19
20
|
protected resetConfig(): void;
|
|
20
21
|
protected onStateChange(_newState: State, _oldState: State): void;
|
|
21
22
|
protected onPointerDown(event: AdaptedEvent): void;
|
|
23
|
+
protected onPointerAdd(event: AdaptedEvent): void;
|
|
22
24
|
protected onPointerMove(event: AdaptedEvent): void;
|
|
23
25
|
protected onPointerUp(event: AdaptedEvent): void;
|
|
26
|
+
protected onPointerRemove(event: AdaptedEvent): void;
|
|
24
27
|
private tryBegin;
|
|
25
28
|
private tryActivate;
|
|
26
29
|
private checkDistanceFail;
|
|
@@ -10,6 +10,7 @@ export default class NativeViewGestureHandler extends GestureHandler {
|
|
|
10
10
|
private minDistSq;
|
|
11
11
|
init(ref: number, propsRef: React.RefObject<unknown>): void;
|
|
12
12
|
updateGestureConfig({ enabled, ...props }: Config): void;
|
|
13
|
+
private restoreViewStyles;
|
|
13
14
|
protected resetConfig(): void;
|
|
14
15
|
protected onPointerDown(event: AdaptedEvent): void;
|
|
15
16
|
protected onPointerAdd(event: AdaptedEvent): void;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
|
-
import { AdaptedEvent, Config } from '../interfaces';
|
|
2
|
+
import { AdaptedEvent, Config, StylusData } from '../interfaces';
|
|
3
3
|
import GestureHandler from './GestureHandler';
|
|
4
4
|
export default class PanGestureHandler extends GestureHandler {
|
|
5
5
|
private readonly customActivationProperties;
|
|
@@ -25,6 +25,7 @@ export default class PanGestureHandler extends GestureHandler {
|
|
|
25
25
|
private offsetY;
|
|
26
26
|
private lastX;
|
|
27
27
|
private lastY;
|
|
28
|
+
private stylusData;
|
|
28
29
|
private activateAfterLongPress;
|
|
29
30
|
private activationTimeout;
|
|
30
31
|
init(ref: number, propsRef: React.RefObject<unknown>): void;
|
|
@@ -35,6 +36,7 @@ export default class PanGestureHandler extends GestureHandler {
|
|
|
35
36
|
translationY: number;
|
|
36
37
|
velocityX: number;
|
|
37
38
|
velocityY: number;
|
|
39
|
+
stylusData: StylusData | undefined;
|
|
38
40
|
};
|
|
39
41
|
private getTranslationX;
|
|
40
42
|
private getTranslationY;
|
|
@@ -17,7 +17,7 @@ export interface Handler {
|
|
|
17
17
|
}
|
|
18
18
|
type ConfigArgs = number | boolean | HitSlop | UserSelect | TouchAction | ActiveCursor | Directions | Handler[] | null | undefined;
|
|
19
19
|
export interface Config extends Record<string, ConfigArgs> {
|
|
20
|
-
enabled
|
|
20
|
+
enabled: boolean;
|
|
21
21
|
simultaneousHandlers?: Handler[] | null;
|
|
22
22
|
waitFor?: Handler[] | null;
|
|
23
23
|
blocksHandlers?: Handler[] | null;
|
|
@@ -102,6 +102,13 @@ export interface PropsRef {
|
|
|
102
102
|
onGestureHandlerEvent: () => void;
|
|
103
103
|
onGestureHandlerStateChange: () => void;
|
|
104
104
|
}
|
|
105
|
+
export interface StylusData {
|
|
106
|
+
tiltX: number;
|
|
107
|
+
tiltY: number;
|
|
108
|
+
azimuthAngle: number;
|
|
109
|
+
altitudeAngle: number;
|
|
110
|
+
pressure: number;
|
|
111
|
+
}
|
|
105
112
|
export interface AdaptedEvent {
|
|
106
113
|
x: number;
|
|
107
114
|
y: number;
|
|
@@ -112,9 +119,7 @@ export interface AdaptedEvent {
|
|
|
112
119
|
pointerType: PointerType;
|
|
113
120
|
time: number;
|
|
114
121
|
button?: MouseButton;
|
|
115
|
-
|
|
116
|
-
changedTouches?: TouchList;
|
|
117
|
-
touchEventType?: TouchEventType;
|
|
122
|
+
stylusData?: StylusData;
|
|
118
123
|
}
|
|
119
124
|
export declare enum EventTypes {
|
|
120
125
|
DOWN = 0,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AdaptedEvent, EventTypes
|
|
1
|
+
import { AdaptedEvent, EventTypes } from '../interfaces';
|
|
2
2
|
type PointerEventCallback = (event: AdaptedEvent) => void;
|
|
3
3
|
export default abstract class EventManager<T> {
|
|
4
4
|
protected readonly view: T;
|
|
@@ -7,7 +7,7 @@ export default abstract class EventManager<T> {
|
|
|
7
7
|
constructor(view: T);
|
|
8
8
|
abstract registerListeners(): void;
|
|
9
9
|
abstract unregisterListeners(): void;
|
|
10
|
-
protected abstract mapEvent(event: Event, eventType: EventTypes
|
|
10
|
+
protected abstract mapEvent(event: Event, eventType: EventTypes): AdaptedEvent;
|
|
11
11
|
protected onPointerDown(_event: AdaptedEvent): void;
|
|
12
12
|
protected onPointerAdd(_event: AdaptedEvent): void;
|
|
13
13
|
protected onPointerUp(_event: AdaptedEvent): void;
|
|
@@ -2,9 +2,11 @@ import type IGestureHandler from '../handlers/IGestureHandler';
|
|
|
2
2
|
import { GestureHandlerDelegate, MeasureResult } from './GestureHandlerDelegate';
|
|
3
3
|
import { Config } from '../interfaces';
|
|
4
4
|
export declare class GestureHandlerWebDelegate implements GestureHandlerDelegate<HTMLElement, IGestureHandler> {
|
|
5
|
+
private isInitialized;
|
|
5
6
|
private view;
|
|
6
7
|
private gestureHandler;
|
|
7
8
|
private eventManagers;
|
|
9
|
+
private defaultViewStyles;
|
|
8
10
|
getView(): HTMLElement;
|
|
9
11
|
init(viewRef: number, handler: IGestureHandler): void;
|
|
10
12
|
isPointerInBounds({ x, y }: {
|
|
@@ -19,6 +21,10 @@ export declare class GestureHandlerWebDelegate implements GestureHandlerDelegate
|
|
|
19
21
|
private removeContextMenuListeners;
|
|
20
22
|
private disableContextMenu;
|
|
21
23
|
private enableContextMenu;
|
|
24
|
+
private setUserSelect;
|
|
25
|
+
private setTouchAction;
|
|
26
|
+
private setContextMenu;
|
|
27
|
+
onEnabledChange(enabled: boolean): void;
|
|
22
28
|
onBegin(): void;
|
|
23
29
|
onActivate(): void;
|
|
24
30
|
onEnd(): void;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AdaptedEvent, EventTypes } from '../interfaces';
|
|
2
|
+
import EventManager from './EventManager';
|
|
3
|
+
export default class KeyboardEventManager extends EventManager<HTMLElement> {
|
|
4
|
+
private activationKeys;
|
|
5
|
+
private cancelationKeys;
|
|
6
|
+
private isPressed;
|
|
7
|
+
private keyDownCallback;
|
|
8
|
+
private keyUpCallback;
|
|
9
|
+
private dispatchEvent;
|
|
10
|
+
registerListeners(): void;
|
|
11
|
+
unregisterListeners(): void;
|
|
12
|
+
protected mapEvent(event: KeyboardEvent, eventType: EventTypes): AdaptedEvent;
|
|
13
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { PointerType } from '../PointerType';
|
|
2
|
-
import { Point } from './interfaces';
|
|
2
|
+
import type { Point, StylusData } from './interfaces';
|
|
3
3
|
export declare function isPointerInBounds(view: HTMLElement, { x, y }: Point): boolean;
|
|
4
4
|
export declare const PointerTypeMapping: Map<string, PointerType>;
|
|
5
5
|
export declare const degToRad: (degrees: number) => number;
|
|
@@ -8,3 +8,4 @@ export declare function calculateViewScale(view: HTMLElement): {
|
|
|
8
8
|
scaleX: number;
|
|
9
9
|
scaleY: number;
|
|
10
10
|
};
|
|
11
|
+
export declare function tryExtractStylusData(event: PointerEvent): StylusData | undefined;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-gesture-handler",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.20.0",
|
|
4
4
|
"description": "Experimental implementation of a new declarative API for gesture handling in react-native",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"prepare": "bob build && husky install",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"ts-check": "yarn tsc --noEmit",
|
|
12
12
|
"format:js": "prettier --write --list-different './{src,example,FabricExample,MacOSExample}/**/*.{js,jsx,ts,tsx}'",
|
|
13
13
|
"format:android": "node ./scripts/format-android.js",
|
|
14
|
-
"format:
|
|
14
|
+
"format:apple": "find apple/ -iname *.h -o -iname *.m -o -iname *.cpp -o -iname *.mm | xargs clang-format -i",
|
|
15
15
|
"lint:js": "eslint --ext '.js,.ts,.tsx' src/ example/src FabricExample/src MacOSExample/src && yarn prettier --check './{src,example,FabricExample,MacOSExample}/**/*.{js,jsx,ts,tsx}'",
|
|
16
16
|
"lint:js-root": "eslint --ext '.js,.ts,.tsx' src/ && yarn prettier --check './src/**/*.{js,jsx,ts,tsx}'",
|
|
17
17
|
"lint:android": "./android/gradlew -p android spotlessCheck -q",
|
|
@@ -114,7 +114,7 @@
|
|
|
114
114
|
"lint-staged": {
|
|
115
115
|
"./{src,example,FabricExample,MacOSExample}/**/*.{ts,tsx}": "yarn format:js",
|
|
116
116
|
"android/**/*.kt": "yarn format:android",
|
|
117
|
-
"apple/**/*.{h,m,mm,cpp}": "yarn format:
|
|
117
|
+
"apple/**/*.{h,m,mm,cpp}": "yarn format:apple",
|
|
118
118
|
"src/specs/*.ts": "yarn sync-architectures"
|
|
119
119
|
},
|
|
120
120
|
"release-it": {
|
package/src/PointerType.ts
CHANGED
|
@@ -120,12 +120,13 @@ class InnerBaseButton extends React.Component<BaseButtonWithRefProps> {
|
|
|
120
120
|
};
|
|
121
121
|
|
|
122
122
|
render() {
|
|
123
|
-
const { rippleColor, ...rest } = this.props;
|
|
123
|
+
const { rippleColor, style, ...rest } = this.props;
|
|
124
124
|
|
|
125
125
|
return (
|
|
126
126
|
<RawButton
|
|
127
127
|
ref={this.props.innerRef}
|
|
128
128
|
rippleColor={processColor(rippleColor)}
|
|
129
|
+
style={[style, Platform.OS === 'ios' && { cursor: undefined }]}
|
|
129
130
|
{...rest}
|
|
130
131
|
onGestureEvent={this.onGestureEvent}
|
|
131
132
|
onHandlerStateChange={this.onHandlerStateChange}
|
|
@@ -138,7 +138,7 @@ export const FlatList = React.forwardRef((props, ref) => {
|
|
|
138
138
|
);
|
|
139
139
|
}) as <ItemT = any>(
|
|
140
140
|
props: PropsWithChildren<
|
|
141
|
-
RNFlatListProps<ItemT> &
|
|
141
|
+
Omit<RNFlatListProps<ItemT>, 'renderScrollComponent'> &
|
|
142
142
|
RefAttributes<FlatList<ItemT>> &
|
|
143
143
|
NativeViewGestureHandlerProps
|
|
144
144
|
>,
|
|
@@ -9,7 +9,6 @@ import {
|
|
|
9
9
|
View,
|
|
10
10
|
ViewStyle,
|
|
11
11
|
processColor,
|
|
12
|
-
StyleSheet,
|
|
13
12
|
} from 'react-native';
|
|
14
13
|
import NativeButton from '../GestureHandlerButton';
|
|
15
14
|
import {
|
|
@@ -18,17 +17,37 @@ import {
|
|
|
18
17
|
isTouchWithinInset,
|
|
19
18
|
gestureTouchToPressableEvent,
|
|
20
19
|
addInsets,
|
|
21
|
-
splitStyles,
|
|
22
20
|
} from './utils';
|
|
23
21
|
import { PressabilityDebugView } from '../../handlers/PressabilityDebugView';
|
|
24
22
|
import { GestureTouchEvent } from '../../handlers/gestureHandlerCommon';
|
|
23
|
+
import { INT32_MAX } from '../../utils';
|
|
25
24
|
|
|
26
25
|
const DEFAULT_LONG_PRESS_DURATION = 500;
|
|
27
26
|
|
|
28
27
|
export default function Pressable(props: PressableProps) {
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
const {
|
|
29
|
+
testOnly_pressed,
|
|
30
|
+
hitSlop,
|
|
31
|
+
pressRetentionOffset,
|
|
32
|
+
delayHoverIn,
|
|
33
|
+
onHoverIn,
|
|
34
|
+
delayHoverOut,
|
|
35
|
+
onHoverOut,
|
|
36
|
+
delayLongPress,
|
|
37
|
+
unstable_pressDelay,
|
|
38
|
+
onPress,
|
|
39
|
+
onPressIn,
|
|
40
|
+
onPressOut,
|
|
41
|
+
onLongPress,
|
|
42
|
+
style,
|
|
43
|
+
children,
|
|
44
|
+
android_disableSound,
|
|
45
|
+
android_ripple,
|
|
46
|
+
disabled,
|
|
47
|
+
...remainingProps
|
|
48
|
+
} = props;
|
|
49
|
+
|
|
50
|
+
const [pressedState, setPressedState] = useState(testOnly_pressed ?? false);
|
|
32
51
|
|
|
33
52
|
const pressableRef = useRef<View>(null);
|
|
34
53
|
|
|
@@ -39,18 +58,16 @@ export default function Pressable(props: PressableProps) {
|
|
|
39
58
|
|
|
40
59
|
const normalizedHitSlop: Insets = useMemo(
|
|
41
60
|
() =>
|
|
42
|
-
typeof
|
|
43
|
-
|
|
44
|
-
: props.hitSlop ?? {},
|
|
45
|
-
[props.hitSlop]
|
|
61
|
+
typeof hitSlop === 'number' ? numberAsInset(hitSlop) : hitSlop ?? {},
|
|
62
|
+
[hitSlop]
|
|
46
63
|
);
|
|
47
64
|
|
|
48
65
|
const normalizedPressRetentionOffset: Insets = useMemo(
|
|
49
66
|
() =>
|
|
50
|
-
typeof
|
|
51
|
-
? numberAsInset(
|
|
52
|
-
:
|
|
53
|
-
[
|
|
67
|
+
typeof pressRetentionOffset === 'number'
|
|
68
|
+
? numberAsInset(pressRetentionOffset)
|
|
69
|
+
: pressRetentionOffset ?? {},
|
|
70
|
+
[pressRetentionOffset]
|
|
54
71
|
);
|
|
55
72
|
|
|
56
73
|
const hoverInTimeout = useRef<number | null>(null);
|
|
@@ -65,29 +82,29 @@ export default function Pressable(props: PressableProps) {
|
|
|
65
82
|
if (hoverOutTimeout.current) {
|
|
66
83
|
clearTimeout(hoverOutTimeout.current);
|
|
67
84
|
}
|
|
68
|
-
if (
|
|
85
|
+
if (delayHoverIn) {
|
|
69
86
|
hoverInTimeout.current = setTimeout(
|
|
70
|
-
() =>
|
|
71
|
-
|
|
87
|
+
() => onHoverIn?.(gestureToPressableEvent(event)),
|
|
88
|
+
delayHoverIn
|
|
72
89
|
);
|
|
73
90
|
return;
|
|
74
91
|
}
|
|
75
|
-
|
|
92
|
+
onHoverIn?.(gestureToPressableEvent(event));
|
|
76
93
|
})
|
|
77
94
|
.onFinalize((event) => {
|
|
78
95
|
if (hoverInTimeout.current) {
|
|
79
96
|
clearTimeout(hoverInTimeout.current);
|
|
80
97
|
}
|
|
81
|
-
if (
|
|
98
|
+
if (delayHoverOut) {
|
|
82
99
|
hoverOutTimeout.current = setTimeout(
|
|
83
|
-
() =>
|
|
84
|
-
|
|
100
|
+
() => onHoverOut?.(gestureToPressableEvent(event)),
|
|
101
|
+
delayHoverOut
|
|
85
102
|
);
|
|
86
103
|
return;
|
|
87
104
|
}
|
|
88
|
-
|
|
105
|
+
onHoverOut?.(gestureToPressableEvent(event));
|
|
89
106
|
}),
|
|
90
|
-
[
|
|
107
|
+
[delayHoverIn, delayHoverOut, onHoverIn, onHoverOut]
|
|
91
108
|
);
|
|
92
109
|
|
|
93
110
|
const pressDelayTimeoutRef = useRef<number | null>(null);
|
|
@@ -108,12 +125,12 @@ export default function Pressable(props: PressableProps) {
|
|
|
108
125
|
|
|
109
126
|
deferredEventPayload.current = null;
|
|
110
127
|
|
|
111
|
-
|
|
128
|
+
onPressIn?.(event);
|
|
112
129
|
isPressCallbackEnabled.current = true;
|
|
113
130
|
pressDelayTimeoutRef.current = null;
|
|
114
131
|
setPressedState(true);
|
|
115
132
|
},
|
|
116
|
-
[
|
|
133
|
+
[onPressIn]
|
|
117
134
|
);
|
|
118
135
|
|
|
119
136
|
const pressOutHandler = useCallback(
|
|
@@ -126,7 +143,7 @@ export default function Pressable(props: PressableProps) {
|
|
|
126
143
|
return;
|
|
127
144
|
}
|
|
128
145
|
|
|
129
|
-
if (
|
|
146
|
+
if (unstable_pressDelay && pressDelayTimeoutRef.current !== null) {
|
|
130
147
|
// When delay is preemptively finished by lifting touches,
|
|
131
148
|
// we want to immediately activate it's effects - pressInHandler,
|
|
132
149
|
// even though we are located at the pressOutHandler
|
|
@@ -135,14 +152,14 @@ export default function Pressable(props: PressableProps) {
|
|
|
135
152
|
}
|
|
136
153
|
|
|
137
154
|
if (deferredEventPayload.current) {
|
|
138
|
-
|
|
155
|
+
onPressIn?.(deferredEventPayload.current);
|
|
139
156
|
deferredEventPayload.current = null;
|
|
140
157
|
}
|
|
141
158
|
|
|
142
|
-
|
|
159
|
+
onPressOut?.(event);
|
|
143
160
|
|
|
144
161
|
if (isPressCallbackEnabled.current) {
|
|
145
|
-
|
|
162
|
+
onPress?.(event);
|
|
146
163
|
}
|
|
147
164
|
|
|
148
165
|
if (longPressTimeoutRef.current) {
|
|
@@ -155,7 +172,7 @@ export default function Pressable(props: PressableProps) {
|
|
|
155
172
|
isPressCallbackEnabled.current = true;
|
|
156
173
|
setPressedState(false);
|
|
157
174
|
},
|
|
158
|
-
[pressInHandler,
|
|
175
|
+
[onPress, onPressIn, onPressOut, pressInHandler, unstable_pressDelay]
|
|
159
176
|
);
|
|
160
177
|
|
|
161
178
|
const handlingOnTouchesDown = useRef<boolean>(false);
|
|
@@ -169,7 +186,7 @@ export default function Pressable(props: PressableProps) {
|
|
|
169
186
|
}
|
|
170
187
|
|
|
171
188
|
if (hasPassedBoundsChecks.current) {
|
|
172
|
-
|
|
189
|
+
onLongPress?.(gestureTouchToPressableEvent(event));
|
|
173
190
|
isPressCallbackEnabled.current = false;
|
|
174
191
|
}
|
|
175
192
|
|
|
@@ -178,19 +195,19 @@ export default function Pressable(props: PressableProps) {
|
|
|
178
195
|
longPressTimeoutRef.current = null;
|
|
179
196
|
}
|
|
180
197
|
},
|
|
181
|
-
[
|
|
198
|
+
[onLongPress]
|
|
182
199
|
);
|
|
183
200
|
|
|
184
201
|
const longPressTimeoutRef = useRef<number | null>(null);
|
|
185
202
|
const longPressMinDuration =
|
|
186
|
-
(
|
|
187
|
-
(
|
|
203
|
+
(delayLongPress ?? DEFAULT_LONG_PRESS_DURATION) +
|
|
204
|
+
(unstable_pressDelay ?? 0);
|
|
188
205
|
|
|
189
206
|
const pressAndTouchGesture = useMemo(
|
|
190
207
|
() =>
|
|
191
208
|
Gesture.LongPress()
|
|
192
|
-
.minDuration(
|
|
193
|
-
.maxDistance(
|
|
209
|
+
.minDuration(INT32_MAX) // Stops long press from blocking native gesture
|
|
210
|
+
.maxDistance(INT32_MAX) // Stops long press from cancelling after set distance
|
|
194
211
|
.cancelsTouchesInView(false)
|
|
195
212
|
.onTouchesDown((event) => {
|
|
196
213
|
handlingOnTouchesDown.current = true;
|
|
@@ -224,10 +241,10 @@ export default function Pressable(props: PressableProps) {
|
|
|
224
241
|
);
|
|
225
242
|
}
|
|
226
243
|
|
|
227
|
-
if (
|
|
244
|
+
if (unstable_pressDelay) {
|
|
228
245
|
pressDelayTimeoutRef.current = setTimeout(() => {
|
|
229
246
|
pressInHandler(gestureTouchToPressableEvent(event));
|
|
230
|
-
},
|
|
247
|
+
}, unstable_pressDelay);
|
|
231
248
|
} else {
|
|
232
249
|
pressInHandler(gestureTouchToPressableEvent(event));
|
|
233
250
|
}
|
|
@@ -275,7 +292,7 @@ export default function Pressable(props: PressableProps) {
|
|
|
275
292
|
normalizedHitSlop,
|
|
276
293
|
pressInHandler,
|
|
277
294
|
pressOutHandler,
|
|
278
|
-
|
|
295
|
+
unstable_pressDelay,
|
|
279
296
|
]
|
|
280
297
|
);
|
|
281
298
|
|
|
@@ -333,7 +350,7 @@ export default function Pressable(props: PressableProps) {
|
|
|
333
350
|
normalizedPressRetentionOffset
|
|
334
351
|
);
|
|
335
352
|
|
|
336
|
-
const isPressableEnabled =
|
|
353
|
+
const isPressableEnabled = disabled !== true;
|
|
337
354
|
|
|
338
355
|
const gestures = [pressAndTouchGesture, hoverGesture, buttonGesture];
|
|
339
356
|
|
|
@@ -353,46 +370,36 @@ export default function Pressable(props: PressableProps) {
|
|
|
353
370
|
|
|
354
371
|
const gesture = Gesture.Simultaneous(...gestures);
|
|
355
372
|
|
|
356
|
-
const defaultRippleColor =
|
|
373
|
+
const defaultRippleColor = android_ripple ? undefined : 'transparent';
|
|
357
374
|
|
|
358
375
|
// `cursor: 'pointer'` on `RNButton` crashes iOS
|
|
359
376
|
const pointerStyle: StyleProp<ViewStyle> =
|
|
360
377
|
Platform.OS === 'web' ? { cursor: 'pointer' } : {};
|
|
361
378
|
|
|
362
379
|
const styleProp =
|
|
363
|
-
typeof
|
|
364
|
-
? props.style({ pressed: pressedState })
|
|
365
|
-
: props.style;
|
|
380
|
+
typeof style === 'function' ? style({ pressed: pressedState }) : style;
|
|
366
381
|
|
|
367
382
|
const childrenProp =
|
|
368
|
-
typeof
|
|
369
|
-
?
|
|
370
|
-
:
|
|
371
|
-
|
|
372
|
-
const flattenedStyles = StyleSheet.flatten(styleProp ?? {});
|
|
373
|
-
|
|
374
|
-
const [innerStyles, outerStyles] = splitStyles(flattenedStyles);
|
|
383
|
+
typeof children === 'function'
|
|
384
|
+
? children({ pressed: pressedState })
|
|
385
|
+
: children;
|
|
375
386
|
|
|
376
387
|
return (
|
|
377
|
-
<
|
|
378
|
-
<
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
) : null}
|
|
394
|
-
</NativeButton>
|
|
395
|
-
</GestureDetector>
|
|
396
|
-
</View>
|
|
388
|
+
<GestureDetector gesture={gesture}>
|
|
389
|
+
<NativeButton
|
|
390
|
+
{...remainingProps}
|
|
391
|
+
ref={pressableRef}
|
|
392
|
+
hitSlop={appliedHitSlop}
|
|
393
|
+
enabled={isPressableEnabled}
|
|
394
|
+
touchSoundDisabled={android_disableSound ?? undefined}
|
|
395
|
+
rippleColor={processColor(android_ripple?.color ?? defaultRippleColor)}
|
|
396
|
+
rippleRadius={android_ripple?.radius ?? undefined}
|
|
397
|
+
style={[pointerStyle, styleProp]}>
|
|
398
|
+
{childrenProp}
|
|
399
|
+
{__DEV__ ? (
|
|
400
|
+
<PressabilityDebugView color="red" hitSlop={normalizedHitSlop} />
|
|
401
|
+
) : null}
|
|
402
|
+
</NativeButton>
|
|
403
|
+
</GestureDetector>
|
|
397
404
|
);
|
|
398
405
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { PressableProps } from './PressableProps';
|
|
1
|
+
export type { PressableProps } from './PressableProps';
|
|
2
2
|
export { default } from './Pressable';
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import { Insets
|
|
2
|
-
import {
|
|
1
|
+
import { Insets } from 'react-native';
|
|
2
|
+
import {
|
|
3
|
+
HoverGestureHandlerEventPayload,
|
|
4
|
+
LongPressGestureHandlerEventPayload,
|
|
5
|
+
} from '../../handlers/GestureHandlerEventPayload';
|
|
3
6
|
import {
|
|
4
7
|
TouchData,
|
|
5
8
|
GestureStateChangeEvent,
|
|
6
9
|
GestureTouchEvent,
|
|
7
10
|
} from '../../handlers/gestureHandlerCommon';
|
|
8
|
-
import { HoverGestureHandlerEventPayload } from '../../handlers/gestures/hoverGesture';
|
|
9
11
|
import { InnerPressableEvent, PressableEvent } from './PressableProps';
|
|
10
12
|
|
|
11
13
|
const numberAsInset = (value: number): Insets => ({
|
|
@@ -125,56 +127,10 @@ const gestureTouchToPressableEvent = (
|
|
|
125
127
|
};
|
|
126
128
|
};
|
|
127
129
|
|
|
128
|
-
type StylePropKeys = (keyof ViewStyle)[];
|
|
129
|
-
|
|
130
|
-
// Source:
|
|
131
|
-
// - From ViewStyle extracted FlexStyle sub-interface which contains all of the box-model manipulating props.
|
|
132
|
-
// - From FlexStyle handpicked those styles, which act on the inner part of the box-model.
|
|
133
|
-
const innerStyleKeys = new Set([
|
|
134
|
-
'alignContent',
|
|
135
|
-
'alignItems',
|
|
136
|
-
'flexBasis',
|
|
137
|
-
'flexDirection',
|
|
138
|
-
'flexWrap',
|
|
139
|
-
'rowGap',
|
|
140
|
-
'gap',
|
|
141
|
-
'columnGap',
|
|
142
|
-
'justifyContent',
|
|
143
|
-
'overflow',
|
|
144
|
-
'padding',
|
|
145
|
-
'paddingBottom',
|
|
146
|
-
'paddingEnd',
|
|
147
|
-
'paddingHorizontal',
|
|
148
|
-
'paddingLeft',
|
|
149
|
-
'paddingRight',
|
|
150
|
-
'paddingStart',
|
|
151
|
-
'paddingTop',
|
|
152
|
-
'paddingVertical',
|
|
153
|
-
'start',
|
|
154
|
-
'end',
|
|
155
|
-
'direction', // iOS only
|
|
156
|
-
] as StylePropKeys);
|
|
157
|
-
|
|
158
|
-
const splitStyles = (from: ViewStyle): [ViewStyle, ViewStyle] => {
|
|
159
|
-
const outerStyles: Record<string, unknown> = {};
|
|
160
|
-
const innerStyles: Record<string, unknown> = {};
|
|
161
|
-
|
|
162
|
-
for (const key in from) {
|
|
163
|
-
if (innerStyleKeys.has(key as keyof ViewStyle)) {
|
|
164
|
-
innerStyles[key] = from[key as keyof ViewStyle];
|
|
165
|
-
} else {
|
|
166
|
-
outerStyles[key] = from[key as keyof ViewStyle];
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
return [innerStyles, outerStyles];
|
|
171
|
-
};
|
|
172
|
-
|
|
173
130
|
export {
|
|
174
131
|
numberAsInset,
|
|
175
132
|
addInsets,
|
|
176
133
|
isTouchWithinInset,
|
|
177
134
|
gestureToPressableEvent,
|
|
178
135
|
gestureTouchToPressableEvent,
|
|
179
|
-
splitStyles,
|
|
180
136
|
};
|