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.
Files changed (210) hide show
  1. package/README.md +1 -0
  2. package/android/build.gradle +11 -29
  3. package/android/fabric/src/main/java/com/swmansion/gesturehandler/ReactContextExtensions.kt +1 -1
  4. package/android/paper/src/main/java/com/swmansion/gesturehandler/ReactContextExtensions.kt +1 -1
  5. package/android/src/main/AndroidManifest.xml +1 -3
  6. package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandler.kt +21 -21
  7. package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandlerOrchestrator.kt +2 -2
  8. package/android/src/main/java/com/swmansion/gesturehandler/core/GestureUtils.kt +1 -0
  9. package/android/src/main/java/com/swmansion/gesturehandler/core/HoverGestureHandler.kt +16 -0
  10. package/android/src/main/java/com/swmansion/gesturehandler/core/LongPressGestureHandler.kt +80 -4
  11. package/android/src/main/java/com/swmansion/gesturehandler/core/PanGestureHandler.kt +8 -0
  12. package/android/src/main/java/com/swmansion/gesturehandler/core/PinchGestureHandler.kt +2 -1
  13. package/android/src/main/java/com/swmansion/gesturehandler/core/ScaleGestureDetector.java +10 -0
  14. package/android/src/main/java/com/swmansion/gesturehandler/core/StylusData.kt +103 -0
  15. package/android/src/main/java/com/swmansion/gesturehandler/core/Vector.kt +2 -2
  16. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +24 -15
  17. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +3 -0
  18. package/android/src/main/java/com/swmansion/gesturehandler/react/eventbuilders/HoverGestureHandlerEventDataBuilder.kt +7 -0
  19. package/android/src/main/java/com/swmansion/gesturehandler/react/eventbuilders/PanGestureHandlerEventDataBuilder.kt +7 -0
  20. package/android/src/main/jni/CMakeLists.txt +18 -9
  21. package/apple/Handlers/RNFlingHandler.h +1 -0
  22. package/apple/Handlers/RNFlingHandler.m +153 -19
  23. package/apple/Handlers/RNHoverHandler.m +44 -2
  24. package/apple/Handlers/RNLongPressHandler.m +111 -20
  25. package/apple/Handlers/RNManualHandler.m +53 -29
  26. package/apple/Handlers/RNNativeViewHandler.mm +22 -15
  27. package/apple/Handlers/RNPanHandler.m +57 -7
  28. package/apple/Handlers/RNRotationHandler.m +1 -1
  29. package/apple/RNGHStylusData.h +77 -0
  30. package/apple/RNGHStylusData.m +37 -0
  31. package/apple/RNGHUIKit.h +2 -0
  32. package/apple/RNGHVector.h +31 -0
  33. package/apple/RNGHVector.m +67 -0
  34. package/apple/RNGestureHandler.h +7 -0
  35. package/apple/{RNGestureHandler.m → RNGestureHandler.mm} +63 -1
  36. package/apple/RNGestureHandlerButtonComponentView.mm +41 -0
  37. package/apple/RNGestureHandlerDirection.h +25 -0
  38. package/apple/RNGestureHandlerEvents.h +3 -1
  39. package/apple/RNGestureHandlerEvents.m +11 -3
  40. package/lib/commonjs/PointerType.js +2 -1
  41. package/lib/commonjs/PointerType.js.map +1 -1
  42. package/lib/commonjs/components/GestureButtons.js +5 -1
  43. package/lib/commonjs/components/GestureButtons.js.map +1 -1
  44. package/lib/commonjs/components/GestureComponents.js.map +1 -1
  45. package/lib/commonjs/components/Pressable/Pressable.js +66 -78
  46. package/lib/commonjs/components/Pressable/Pressable.js.map +1 -1
  47. package/lib/commonjs/components/Pressable/index.js +0 -8
  48. package/lib/commonjs/components/Pressable/index.js.map +1 -1
  49. package/lib/commonjs/components/Pressable/utils.js +1 -23
  50. package/lib/commonjs/components/Pressable/utils.js.map +1 -1
  51. package/lib/commonjs/components/ReanimatedSwipeable.js +60 -41
  52. package/lib/commonjs/components/ReanimatedSwipeable.js.map +1 -1
  53. package/lib/commonjs/handlers/GestureHandlerEventPayload.js +4 -0
  54. package/lib/commonjs/handlers/LongPressGestureHandler.js +1 -1
  55. package/lib/commonjs/handlers/LongPressGestureHandler.js.map +1 -1
  56. package/lib/commonjs/handlers/createHandler.js +2 -1
  57. package/lib/commonjs/handlers/createHandler.js.map +1 -1
  58. package/lib/commonjs/handlers/gestures/GestureDetector/utils.js +1 -1
  59. package/lib/commonjs/handlers/gestures/GestureDetector/utils.js.map +1 -1
  60. package/lib/commonjs/handlers/gestures/gesture.js.map +1 -1
  61. package/lib/commonjs/handlers/gestures/hoverGesture.js.map +1 -1
  62. package/lib/commonjs/handlers/gestures/longPressGesture.js +10 -0
  63. package/lib/commonjs/handlers/gestures/longPressGesture.js.map +1 -1
  64. package/lib/commonjs/jestUtils/jestUtils.js +12 -4
  65. package/lib/commonjs/jestUtils/jestUtils.js.map +1 -1
  66. package/lib/commonjs/mocks.js +16 -3
  67. package/lib/commonjs/mocks.js.map +1 -1
  68. package/lib/commonjs/utils.js +4 -0
  69. package/lib/commonjs/utils.js.map +1 -1
  70. package/lib/commonjs/web/constants.js +3 -3
  71. package/lib/commonjs/web/constants.js.map +1 -1
  72. package/lib/commonjs/web/handlers/GestureHandler.js +2 -3
  73. package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
  74. package/lib/commonjs/web/handlers/HoverGestureHandler.js +18 -1
  75. package/lib/commonjs/web/handlers/HoverGestureHandler.js.map +1 -1
  76. package/lib/commonjs/web/handlers/LongPressGestureHandler.js +43 -9
  77. package/lib/commonjs/web/handlers/LongPressGestureHandler.js.map +1 -1
  78. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js +14 -3
  79. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js.map +1 -1
  80. package/lib/commonjs/web/handlers/PanGestureHandler.js +12 -1
  81. package/lib/commonjs/web/handlers/PanGestureHandler.js.map +1 -1
  82. package/lib/commonjs/web/interfaces.js.map +1 -1
  83. package/lib/commonjs/web/tools/EventManager.js.map +1 -1
  84. package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js +55 -11
  85. package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js.map +1 -1
  86. package/lib/commonjs/web/tools/KeyboardEventManager.js +110 -0
  87. package/lib/commonjs/web/tools/KeyboardEventManager.js.map +1 -0
  88. package/lib/commonjs/web/tools/PointerEventManager.js +3 -37
  89. package/lib/commonjs/web/tools/PointerEventManager.js.map +1 -1
  90. package/lib/commonjs/web/tools/Vector.js +4 -2
  91. package/lib/commonjs/web/tools/Vector.js.map +1 -1
  92. package/lib/commonjs/web/utils.js +187 -13
  93. package/lib/commonjs/web/utils.js.map +1 -1
  94. package/lib/module/PointerType.js +2 -1
  95. package/lib/module/PointerType.js.map +1 -1
  96. package/lib/module/components/GestureButtons.js +5 -1
  97. package/lib/module/components/GestureButtons.js.map +1 -1
  98. package/lib/module/components/GestureComponents.js.map +1 -1
  99. package/lib/module/components/Pressable/Pressable.js +67 -78
  100. package/lib/module/components/Pressable/Pressable.js.map +1 -1
  101. package/lib/module/components/Pressable/index.js +0 -1
  102. package/lib/module/components/Pressable/index.js.map +1 -1
  103. package/lib/module/components/Pressable/utils.js +1 -22
  104. package/lib/module/components/Pressable/utils.js.map +1 -1
  105. package/lib/module/components/ReanimatedSwipeable.js +58 -37
  106. package/lib/module/components/ReanimatedSwipeable.js.map +1 -1
  107. package/lib/module/handlers/GestureHandlerEventPayload.js +1 -1
  108. package/lib/module/handlers/LongPressGestureHandler.js +1 -1
  109. package/lib/module/handlers/LongPressGestureHandler.js.map +1 -1
  110. package/lib/module/handlers/createHandler.js +2 -1
  111. package/lib/module/handlers/createHandler.js.map +1 -1
  112. package/lib/module/handlers/gestures/GestureDetector/utils.js +2 -2
  113. package/lib/module/handlers/gestures/GestureDetector/utils.js.map +1 -1
  114. package/lib/module/handlers/gestures/gesture.js.map +1 -1
  115. package/lib/module/handlers/gestures/hoverGesture.js.map +1 -1
  116. package/lib/module/handlers/gestures/longPressGesture.js +10 -0
  117. package/lib/module/handlers/gestures/longPressGesture.js.map +1 -1
  118. package/lib/module/jestUtils/jestUtils.js +12 -4
  119. package/lib/module/jestUtils/jestUtils.js.map +1 -1
  120. package/lib/module/mocks.js +13 -3
  121. package/lib/module/mocks.js.map +1 -1
  122. package/lib/module/utils.js +1 -0
  123. package/lib/module/utils.js.map +1 -1
  124. package/lib/module/web/constants.js +1 -1
  125. package/lib/module/web/constants.js.map +1 -1
  126. package/lib/module/web/handlers/GestureHandler.js +2 -3
  127. package/lib/module/web/handlers/GestureHandler.js.map +1 -1
  128. package/lib/module/web/handlers/HoverGestureHandler.js +18 -1
  129. package/lib/module/web/handlers/HoverGestureHandler.js.map +1 -1
  130. package/lib/module/web/handlers/LongPressGestureHandler.js +43 -9
  131. package/lib/module/web/handlers/LongPressGestureHandler.js.map +1 -1
  132. package/lib/module/web/handlers/NativeViewGestureHandler.js +14 -3
  133. package/lib/module/web/handlers/NativeViewGestureHandler.js.map +1 -1
  134. package/lib/module/web/handlers/PanGestureHandler.js +12 -1
  135. package/lib/module/web/handlers/PanGestureHandler.js.map +1 -1
  136. package/lib/module/web/interfaces.js.map +1 -1
  137. package/lib/module/web/tools/EventManager.js.map +1 -1
  138. package/lib/module/web/tools/GestureHandlerWebDelegate.js +54 -10
  139. package/lib/module/web/tools/GestureHandlerWebDelegate.js.map +1 -1
  140. package/lib/module/web/tools/KeyboardEventManager.js +96 -0
  141. package/lib/module/web/tools/KeyboardEventManager.js.map +1 -0
  142. package/lib/module/web/tools/PointerEventManager.js +4 -38
  143. package/lib/module/web/tools/PointerEventManager.js.map +1 -1
  144. package/lib/module/web/tools/Vector.js +5 -3
  145. package/lib/module/web/tools/Vector.js.map +1 -1
  146. package/lib/module/web/utils.js +184 -13
  147. package/lib/module/web/utils.js.map +1 -1
  148. package/lib/typescript/PointerType.d.ts +2 -1
  149. package/lib/typescript/components/GestureComponents.d.ts +1 -1
  150. package/lib/typescript/components/Pressable/index.d.ts +1 -1
  151. package/lib/typescript/components/Pressable/utils.d.ts +3 -5
  152. package/lib/typescript/handlers/GestureHandlerEventPayload.d.ts +35 -0
  153. package/lib/typescript/handlers/LongPressGestureHandler.d.ts +5 -1
  154. package/lib/typescript/handlers/gestures/gesture.d.ts +2 -2
  155. package/lib/typescript/handlers/gestures/hoverGesture.d.ts +1 -6
  156. package/lib/typescript/handlers/gestures/longPressGesture.d.ts +5 -0
  157. package/lib/typescript/handlers/handlersRegistry.d.ts +1 -1
  158. package/lib/typescript/jestUtils/jestUtils.d.ts +1 -1
  159. package/lib/typescript/mocks.d.ts +4 -3
  160. package/lib/typescript/utils.d.ts +1 -0
  161. package/lib/typescript/web/constants.d.ts +1 -1
  162. package/lib/typescript/web/handlers/GestureHandler.d.ts +1 -1
  163. package/lib/typescript/web/handlers/HoverGestureHandler.d.ts +2 -0
  164. package/lib/typescript/web/handlers/LongPressGestureHandler.d.ts +3 -0
  165. package/lib/typescript/web/handlers/NativeViewGestureHandler.d.ts +1 -0
  166. package/lib/typescript/web/handlers/PanGestureHandler.d.ts +3 -1
  167. package/lib/typescript/web/interfaces.d.ts +9 -4
  168. package/lib/typescript/web/tools/EventManager.d.ts +2 -2
  169. package/lib/typescript/web/tools/GestureHandlerDelegate.d.ts +1 -0
  170. package/lib/typescript/web/tools/GestureHandlerWebDelegate.d.ts +6 -0
  171. package/lib/typescript/web/tools/KeyboardEventManager.d.ts +13 -0
  172. package/lib/typescript/web/utils.d.ts +2 -1
  173. package/package.json +3 -3
  174. package/src/PointerType.ts +1 -0
  175. package/src/components/GestureButtons.tsx +2 -1
  176. package/src/components/GestureComponents.tsx +1 -1
  177. package/src/components/Pressable/Pressable.tsx +77 -70
  178. package/src/components/Pressable/index.ts +1 -1
  179. package/src/components/Pressable/utils.ts +5 -49
  180. package/src/components/ReanimatedSwipeable.tsx +70 -47
  181. package/src/handlers/GestureHandlerEventPayload.ts +42 -0
  182. package/src/handlers/LongPressGestureHandler.ts +6 -0
  183. package/src/handlers/createHandler.tsx +1 -0
  184. package/src/handlers/gestures/GestureDetector/utils.ts +2 -2
  185. package/src/handlers/gestures/gesture.ts +3 -1
  186. package/src/handlers/gestures/hoverGesture.ts +1 -7
  187. package/src/handlers/gestures/longPressGesture.ts +9 -0
  188. package/src/jestUtils/jestUtils.ts +9 -1
  189. package/src/{mocks.ts → mocks.tsx} +8 -3
  190. package/src/utils.ts +2 -0
  191. package/src/web/constants.ts +1 -1
  192. package/src/web/handlers/GestureHandler.ts +4 -2
  193. package/src/web/handlers/HoverGestureHandler.ts +16 -2
  194. package/src/web/handlers/LongPressGestureHandler.ts +49 -10
  195. package/src/web/handlers/NativeViewGestureHandler.ts +14 -4
  196. package/src/web/handlers/PanGestureHandler.ts +14 -1
  197. package/src/web/interfaces.ts +10 -4
  198. package/src/web/tools/EventManager.ts +2 -4
  199. package/src/web/tools/GestureHandlerDelegate.ts +1 -0
  200. package/src/web/tools/GestureHandlerWebDelegate.ts +67 -10
  201. package/src/web/tools/KeyboardEventManager.ts +91 -0
  202. package/src/web/tools/PointerEventManager.ts +2 -38
  203. package/src/web/tools/Vector.ts +4 -3
  204. package/src/web/utils.ts +188 -13
  205. package/lib/commonjs/web/tools/TouchEventManager.js +0 -164
  206. package/lib/commonjs/web/tools/TouchEventManager.js.map +0 -1
  207. package/lib/module/web/tools/TouchEventManager.js +0 -149
  208. package/lib/module/web/tools/TouchEventManager.js.map +0 -1
  209. package/lib/typescript/web/tools/TouchEventManager.d.ts +0 -11
  210. 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?: boolean;
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
- allTouches?: TouchList;
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, TouchEventType } from '../interfaces';
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, index?: number, touchEventType?: TouchEventType): AdaptedEvent;
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;
@@ -19,5 +19,6 @@ export interface GestureHandlerDelegate<TComponent, THandler> {
19
19
  onEnd(): void;
20
20
  onCancel(): void;
21
21
  onFail(): void;
22
+ onEnabledChange(enabled: boolean): void;
22
23
  destroy(config: Config): void;
23
24
  }
@@ -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.18.1",
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:ios": "find apple/ -iname *.h -o -iname *.m -o -iname *.cpp -o -iname *.mm | xargs clang-format -i",
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:ios",
117
+ "apple/**/*.{h,m,mm,cpp}": "yarn format:apple",
118
118
  "src/specs/*.ts": "yarn sync-architectures"
119
119
  },
120
120
  "release-it": {
@@ -2,5 +2,6 @@ export enum PointerType {
2
2
  TOUCH,
3
3
  STYLUS,
4
4
  MOUSE,
5
+ KEY,
5
6
  OTHER,
6
7
  }
@@ -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 [pressedState, setPressedState] = useState(
30
- props.testOnly_pressed ?? false
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 props.hitSlop === 'number'
43
- ? numberAsInset(props.hitSlop)
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 props.pressRetentionOffset === 'number'
51
- ? numberAsInset(props.pressRetentionOffset)
52
- : props.pressRetentionOffset ?? {},
53
- [props.pressRetentionOffset]
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 (props.delayHoverIn) {
85
+ if (delayHoverIn) {
69
86
  hoverInTimeout.current = setTimeout(
70
- () => props.onHoverIn?.(gestureToPressableEvent(event)),
71
- props.delayHoverIn
87
+ () => onHoverIn?.(gestureToPressableEvent(event)),
88
+ delayHoverIn
72
89
  );
73
90
  return;
74
91
  }
75
- props.onHoverIn?.(gestureToPressableEvent(event));
92
+ onHoverIn?.(gestureToPressableEvent(event));
76
93
  })
77
94
  .onFinalize((event) => {
78
95
  if (hoverInTimeout.current) {
79
96
  clearTimeout(hoverInTimeout.current);
80
97
  }
81
- if (props.delayHoverOut) {
98
+ if (delayHoverOut) {
82
99
  hoverOutTimeout.current = setTimeout(
83
- () => props.onHoverOut?.(gestureToPressableEvent(event)),
84
- props.delayHoverOut
100
+ () => onHoverOut?.(gestureToPressableEvent(event)),
101
+ delayHoverOut
85
102
  );
86
103
  return;
87
104
  }
88
- props.onHoverOut?.(gestureToPressableEvent(event));
105
+ onHoverOut?.(gestureToPressableEvent(event));
89
106
  }),
90
- [props]
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
- props.onPressIn?.(event);
128
+ onPressIn?.(event);
112
129
  isPressCallbackEnabled.current = true;
113
130
  pressDelayTimeoutRef.current = null;
114
131
  setPressedState(true);
115
132
  },
116
- [props]
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 (props.unstable_pressDelay && pressDelayTimeoutRef.current !== null) {
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
- props.onPressIn?.(deferredEventPayload.current);
155
+ onPressIn?.(deferredEventPayload.current);
139
156
  deferredEventPayload.current = null;
140
157
  }
141
158
 
142
- props.onPressOut?.(event);
159
+ onPressOut?.(event);
143
160
 
144
161
  if (isPressCallbackEnabled.current) {
145
- props.onPress?.(event);
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, props]
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
- props.onLongPress?.(gestureTouchToPressableEvent(event));
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
- [props]
198
+ [onLongPress]
182
199
  );
183
200
 
184
201
  const longPressTimeoutRef = useRef<number | null>(null);
185
202
  const longPressMinDuration =
186
- (props.delayLongPress ?? DEFAULT_LONG_PRESS_DURATION) +
187
- (props.unstable_pressDelay ?? 0);
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(Number.MAX_SAFE_INTEGER) // Stops long press from blocking native gesture
193
- .maxDistance(Number.MAX_SAFE_INTEGER) // Stops long press from cancelling after set distance
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 (props.unstable_pressDelay) {
244
+ if (unstable_pressDelay) {
228
245
  pressDelayTimeoutRef.current = setTimeout(() => {
229
246
  pressInHandler(gestureTouchToPressableEvent(event));
230
- }, props.unstable_pressDelay);
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
- props.unstable_pressDelay,
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 = props.disabled !== true;
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 = props.android_ripple ? undefined : 'transparent';
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 props.style === 'function'
364
- ? props.style({ pressed: pressedState })
365
- : props.style;
380
+ typeof style === 'function' ? style({ pressed: pressedState }) : style;
366
381
 
367
382
  const childrenProp =
368
- typeof props.children === 'function'
369
- ? props.children({ pressed: pressedState })
370
- : props.children;
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
- <View style={outerStyles}>
378
- <GestureDetector gesture={gesture}>
379
- <NativeButton
380
- ref={pressableRef}
381
- testID={props.testID}
382
- hitSlop={appliedHitSlop}
383
- enabled={isPressableEnabled}
384
- touchSoundDisabled={props.android_disableSound ?? undefined}
385
- rippleColor={processColor(
386
- props.android_ripple?.color ?? defaultRippleColor
387
- )}
388
- rippleRadius={props.android_ripple?.radius ?? undefined}
389
- style={[StyleSheet.absoluteFill, pointerStyle, innerStyles]}>
390
- {childrenProp}
391
- {__DEV__ ? (
392
- <PressabilityDebugView color="red" hitSlop={normalizedHitSlop} />
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, ViewStyle } from 'react-native';
2
- import { LongPressGestureHandlerEventPayload } from '../../handlers/GestureHandlerEventPayload';
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
  };