react-native-gesture-handler 2.14.0 → 2.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (186) hide show
  1. package/README.md +1 -0
  2. package/RNGestureHandler.podspec +2 -2
  3. package/android/paper/src/main/java/com/swmansion/gesturehandler/NativeRNGestureHandlerModuleSpec.java +55 -0
  4. package/android/src/main/java/com/swmansion/gesturehandler/RNGestureHandlerPackage.kt +64 -4
  5. package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandlerOrchestrator.kt +12 -2
  6. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +53 -19
  7. package/{ios → apple}/Handlers/RNFlingHandler.m +25 -5
  8. package/{ios → apple}/Handlers/RNForceTouchHandler.m +25 -7
  9. package/{ios → apple}/Handlers/RNHoverHandler.m +26 -1
  10. package/{ios → apple}/Handlers/RNLongPressHandler.m +24 -4
  11. package/{ios → apple}/Handlers/RNManualHandler.m +24 -4
  12. package/{ios → apple}/Handlers/RNNativeViewHandler.mm +42 -6
  13. package/{ios → apple}/Handlers/RNPanHandler.m +100 -15
  14. package/apple/Handlers/RNPinchHandler.m +162 -0
  15. package/{ios → apple}/Handlers/RNRotationHandler.m +71 -9
  16. package/{ios → apple}/Handlers/RNTapHandler.m +96 -26
  17. package/apple/RNGHUIKit.h +27 -0
  18. package/{ios → apple}/RNGestureHandler.h +3 -3
  19. package/{ios → apple}/RNGestureHandler.m +31 -5
  20. package/{ios → apple}/RNGestureHandlerButton.h +4 -1
  21. package/{ios → apple}/RNGestureHandlerButton.m +12 -4
  22. package/{ios → apple}/RNGestureHandlerButtonManager.m +4 -2
  23. package/{ios → apple}/RNGestureHandlerEvents.h +1 -1
  24. package/{ios → apple}/RNGestureHandlerManager.h +2 -2
  25. package/{ios → apple}/RNGestureHandlerManager.mm +46 -11
  26. package/apple/RNGestureHandlerModule.h +17 -0
  27. package/{ios → apple}/RNGestureHandlerModule.mm +46 -60
  28. package/{ios → apple}/RNGestureHandlerPointerTracker.h +5 -5
  29. package/{ios → apple}/RNGestureHandlerPointerTracker.m +19 -14
  30. package/{ios → apple}/RNGestureHandlerRegistry.h +1 -1
  31. package/{ios → apple}/RNGestureHandlerRegistry.m +1 -1
  32. package/{ios → apple}/RNManualActivationRecognizer.h +8 -0
  33. package/{ios → apple}/RNManualActivationRecognizer.m +27 -7
  34. package/{ios → apple}/RNRootViewGestureRecognizer.m +72 -4
  35. package/lib/commonjs/RNGestureHandlerModule.js +5 -18
  36. package/lib/commonjs/RNGestureHandlerModule.js.map +1 -1
  37. package/lib/commonjs/RNGestureHandlerModule.windows.js +10 -102
  38. package/lib/commonjs/RNGestureHandlerModule.windows.js.map +1 -1
  39. package/lib/commonjs/components/DrawerLayout.js +2 -0
  40. package/lib/commonjs/components/DrawerLayout.js.map +1 -1
  41. package/lib/commonjs/components/gestureHandlerRootHOC.js.map +1 -1
  42. package/lib/commonjs/components/touchables/TouchableWithoutFeedback.js.map +1 -1
  43. package/lib/commonjs/handlers/gestureHandlerCommon.js +1 -1
  44. package/lib/commonjs/handlers/gestureHandlerCommon.js.map +1 -1
  45. package/lib/commonjs/handlers/gestures/GestureDetector.js +11 -1
  46. package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
  47. package/lib/commonjs/handlers/gestures/gesture.js +5 -0
  48. package/lib/commonjs/handlers/gestures/gesture.js.map +1 -1
  49. package/lib/commonjs/handlers/gestures/gestureStateManager.js +39 -37
  50. package/lib/commonjs/handlers/gestures/gestureStateManager.js.map +1 -1
  51. package/lib/commonjs/index.js +8 -0
  52. package/lib/commonjs/index.js.map +1 -1
  53. package/lib/commonjs/specs/NativeRNGestureHandlerModule.js +13 -0
  54. package/lib/commonjs/specs/NativeRNGestureHandlerModule.js.map +1 -0
  55. package/lib/commonjs/web/handlers/FlingGestureHandler.js +8 -6
  56. package/lib/commonjs/web/handlers/FlingGestureHandler.js.map +1 -1
  57. package/lib/commonjs/web/handlers/GestureHandler.js +13 -1
  58. package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
  59. package/lib/commonjs/web/handlers/LongPressGestureHandler.js +8 -6
  60. package/lib/commonjs/web/handlers/LongPressGestureHandler.js.map +1 -1
  61. package/lib/commonjs/web/handlers/PanGestureHandler.js +4 -0
  62. package/lib/commonjs/web/handlers/PanGestureHandler.js.map +1 -1
  63. package/lib/commonjs/web/handlers/TapGestureHandler.js +4 -0
  64. package/lib/commonjs/web/handlers/TapGestureHandler.js.map +1 -1
  65. package/lib/commonjs/web/interfaces.js +12 -14
  66. package/lib/commonjs/web/interfaces.js.map +1 -1
  67. package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js +35 -0
  68. package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js.map +1 -1
  69. package/lib/commonjs/web/tools/NodeManager.js +3 -2
  70. package/lib/commonjs/web/tools/NodeManager.js.map +1 -1
  71. package/lib/commonjs/web/tools/PointerEventManager.js +16 -6
  72. package/lib/commonjs/web/tools/PointerEventManager.js.map +1 -1
  73. package/lib/commonjs/web/tools/TouchEventManager.js +0 -1
  74. package/lib/commonjs/web/tools/TouchEventManager.js.map +1 -1
  75. package/lib/module/RNGestureHandlerModule.js +4 -18
  76. package/lib/module/RNGestureHandlerModule.js.map +1 -1
  77. package/lib/module/RNGestureHandlerModule.windows.js +10 -81
  78. package/lib/module/RNGestureHandlerModule.windows.js.map +1 -1
  79. package/lib/module/components/DrawerLayout.js +2 -0
  80. package/lib/module/components/DrawerLayout.js.map +1 -1
  81. package/lib/module/components/gestureHandlerRootHOC.js.map +1 -1
  82. package/lib/module/components/touchables/TouchableWithoutFeedback.js.map +1 -1
  83. package/lib/module/handlers/gestureHandlerCommon.js +1 -1
  84. package/lib/module/handlers/gestureHandlerCommon.js.map +1 -1
  85. package/lib/module/handlers/gestures/GestureDetector.js +11 -1
  86. package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
  87. package/lib/module/handlers/gestures/gesture.js +5 -0
  88. package/lib/module/handlers/gestures/gesture.js.map +1 -1
  89. package/lib/module/handlers/gestures/gestureStateManager.js +44 -42
  90. package/lib/module/handlers/gestures/gestureStateManager.js.map +1 -1
  91. package/lib/module/index.js +1 -0
  92. package/lib/module/index.js.map +1 -1
  93. package/lib/module/specs/NativeRNGestureHandlerModule.js +3 -0
  94. package/lib/module/specs/NativeRNGestureHandlerModule.js.map +1 -0
  95. package/lib/module/web/handlers/FlingGestureHandler.js +8 -6
  96. package/lib/module/web/handlers/FlingGestureHandler.js.map +1 -1
  97. package/lib/module/web/handlers/GestureHandler.js +14 -2
  98. package/lib/module/web/handlers/GestureHandler.js.map +1 -1
  99. package/lib/module/web/handlers/LongPressGestureHandler.js +8 -5
  100. package/lib/module/web/handlers/LongPressGestureHandler.js.map +1 -1
  101. package/lib/module/web/handlers/PanGestureHandler.js +4 -0
  102. package/lib/module/web/handlers/PanGestureHandler.js.map +1 -1
  103. package/lib/module/web/handlers/TapGestureHandler.js +4 -0
  104. package/lib/module/web/handlers/TapGestureHandler.js.map +1 -1
  105. package/lib/module/web/interfaces.js +9 -11
  106. package/lib/module/web/interfaces.js.map +1 -1
  107. package/lib/module/web/tools/GestureHandlerWebDelegate.js +34 -0
  108. package/lib/module/web/tools/GestureHandlerWebDelegate.js.map +1 -1
  109. package/lib/module/web/tools/NodeManager.js +3 -2
  110. package/lib/module/web/tools/NodeManager.js.map +1 -1
  111. package/lib/module/web/tools/PointerEventManager.js +16 -7
  112. package/lib/module/web/tools/PointerEventManager.js.map +1 -1
  113. package/lib/module/web/tools/TouchEventManager.js +1 -2
  114. package/lib/module/web/tools/TouchEventManager.js.map +1 -1
  115. package/lib/typescript/RNGestureHandlerModule.d.ts +2 -13
  116. package/lib/typescript/RNGestureHandlerModule.windows.d.ts +5 -21
  117. package/lib/typescript/components/DrawerLayout.d.ts +11 -0
  118. package/lib/typescript/components/gestureHandlerRootHOC.d.ts +1 -1
  119. package/lib/typescript/components/touchables/TouchableWithoutFeedback.d.ts +1 -1
  120. package/lib/typescript/handlers/NativeViewGestureHandler.d.ts +1 -1
  121. package/lib/typescript/handlers/PanGestureHandler.d.ts +1 -1
  122. package/lib/typescript/handlers/gestureHandlerCommon.d.ts +4 -1
  123. package/lib/typescript/handlers/gestures/GestureDetector.d.ts +2 -1
  124. package/lib/typescript/handlers/gestures/gesture.d.ts +2 -0
  125. package/lib/typescript/handlers/gestures/gestureStateManager.d.ts +3 -1
  126. package/lib/typescript/index.d.ts +1 -0
  127. package/lib/typescript/specs/NativeRNGestureHandlerModule.d.ts +14 -0
  128. package/lib/typescript/web/handlers/GestureHandler.d.ts +3 -1
  129. package/lib/typescript/web/interfaces.d.ts +9 -9
  130. package/lib/typescript/web/tools/GestureHandlerDelegate.d.ts +2 -0
  131. package/lib/typescript/web/tools/GestureHandlerWebDelegate.d.ts +7 -0
  132. package/lib/typescript/web/tools/PointerEventManager.d.ts +2 -0
  133. package/package.json +14 -11
  134. package/src/RNGestureHandlerModule.ts +4 -49
  135. package/src/RNGestureHandlerModule.windows.ts +18 -100
  136. package/src/components/DrawerLayout.tsx +15 -0
  137. package/src/components/gestureHandlerRootHOC.tsx +1 -3
  138. package/src/components/touchables/TouchableWithoutFeedback.tsx +3 -3
  139. package/src/handlers/gestureHandlerCommon.ts +5 -0
  140. package/src/handlers/gestures/GestureDetector.tsx +16 -2
  141. package/src/handlers/gestures/gesture.ts +6 -0
  142. package/src/handlers/gestures/gestureStateManager.ts +42 -40
  143. package/src/index.ts +1 -0
  144. package/src/specs/NativeRNGestureHandlerModule.ts +26 -0
  145. package/src/web/handlers/FlingGestureHandler.ts +9 -5
  146. package/src/web/handlers/GestureHandler.ts +17 -0
  147. package/src/web/handlers/LongPressGestureHandler.ts +8 -5
  148. package/src/web/handlers/PanGestureHandler.ts +4 -0
  149. package/src/web/handlers/TapGestureHandler.ts +4 -0
  150. package/src/web/interfaces.ts +10 -10
  151. package/src/web/tools/GestureHandlerDelegate.ts +3 -0
  152. package/src/web/tools/GestureHandlerWebDelegate.ts +39 -0
  153. package/src/web/tools/NodeManager.ts +5 -1
  154. package/src/web/tools/PointerEventManager.ts +23 -5
  155. package/src/web/tools/TouchEventManager.ts +0 -2
  156. package/ios/Handlers/RNPinchHandler.m +0 -95
  157. package/ios/RNGestureHandlerModule.h +0 -7
  158. package/lib/commonjs/RNGestureHandlerModule.macos.js +0 -149
  159. package/lib/commonjs/RNGestureHandlerModule.macos.js.map +0 -1
  160. package/lib/module/RNGestureHandlerModule.macos.js +0 -110
  161. package/lib/module/RNGestureHandlerModule.macos.js.map +0 -1
  162. package/lib/typescript/RNGestureHandlerModule.macos.d.ts +0 -47
  163. package/src/RNGestureHandlerModule.macos.ts +0 -133
  164. /package/{ios → apple}/Handlers/RNFlingHandler.h +0 -0
  165. /package/{ios → apple}/Handlers/RNForceTouchHandler.h +0 -0
  166. /package/{ios → apple}/Handlers/RNHoverHandler.h +0 -0
  167. /package/{ios → apple}/Handlers/RNLongPressHandler.h +0 -0
  168. /package/{ios → apple}/Handlers/RNManualHandler.h +0 -0
  169. /package/{ios → apple}/Handlers/RNNativeViewHandler.h +0 -0
  170. /package/{ios → apple}/Handlers/RNPanHandler.h +0 -0
  171. /package/{ios → apple}/Handlers/RNPinchHandler.h +0 -0
  172. /package/{ios → apple}/Handlers/RNRotationHandler.h +0 -0
  173. /package/{ios → apple}/Handlers/RNTapHandler.h +0 -0
  174. /package/{ios → apple}/RNGHTouchEventType.h +0 -0
  175. /package/{ios → apple}/RNGestureHandler.xcodeproj/project.pbxproj +0 -0
  176. /package/{ios → apple}/RNGestureHandler.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -0
  177. /package/{ios → apple}/RNGestureHandlerActionType.h +0 -0
  178. /package/{ios → apple}/RNGestureHandlerButtonComponentView.h +0 -0
  179. /package/{ios → apple}/RNGestureHandlerButtonComponentView.mm +0 -0
  180. /package/{ios → apple}/RNGestureHandlerButtonManager.h +0 -0
  181. /package/{ios → apple}/RNGestureHandlerDirection.h +0 -0
  182. /package/{ios → apple}/RNGestureHandlerEvents.m +0 -0
  183. /package/{ios → apple}/RNGestureHandlerRootViewComponentView.mm +0 -0
  184. /package/{ios → apple}/RNGestureHandlerState.h +0 -0
  185. /package/{ios → apple}/RNGestureHandlerStateManager.h +0 -0
  186. /package/{ios → apple}/RNRootViewGestureRecognizer.h +0 -0
@@ -18,45 +18,47 @@ const warningMessage = tagMessage(
18
18
  const REANIMATED_AVAILABLE = Reanimated?.useSharedValue !== undefined;
19
19
  const setGestureState = Reanimated?.setGestureState;
20
20
 
21
+ function create(handlerTag: number): GestureStateManagerType {
22
+ 'worklet';
23
+ return {
24
+ begin: () => {
25
+ 'worklet';
26
+ if (REANIMATED_AVAILABLE) {
27
+ setGestureState(handlerTag, State.BEGAN);
28
+ } else {
29
+ console.warn(warningMessage);
30
+ }
31
+ },
32
+
33
+ activate: () => {
34
+ 'worklet';
35
+ if (REANIMATED_AVAILABLE) {
36
+ setGestureState(handlerTag, State.ACTIVE);
37
+ } else {
38
+ console.warn(warningMessage);
39
+ }
40
+ },
41
+
42
+ fail: () => {
43
+ 'worklet';
44
+ if (REANIMATED_AVAILABLE) {
45
+ setGestureState(handlerTag, State.FAILED);
46
+ } else {
47
+ console.warn(warningMessage);
48
+ }
49
+ },
50
+
51
+ end: () => {
52
+ 'worklet';
53
+ if (REANIMATED_AVAILABLE) {
54
+ setGestureState(handlerTag, State.END);
55
+ } else {
56
+ console.warn(warningMessage);
57
+ }
58
+ },
59
+ };
60
+ }
61
+
21
62
  export const GestureStateManager = {
22
- create(handlerTag: number): GestureStateManagerType {
23
- 'worklet';
24
- return {
25
- begin: () => {
26
- 'worklet';
27
- if (REANIMATED_AVAILABLE) {
28
- setGestureState(handlerTag, State.BEGAN);
29
- } else {
30
- console.warn(warningMessage);
31
- }
32
- },
33
-
34
- activate: () => {
35
- 'worklet';
36
- if (REANIMATED_AVAILABLE) {
37
- setGestureState(handlerTag, State.ACTIVE);
38
- } else {
39
- console.warn(warningMessage);
40
- }
41
- },
42
-
43
- fail: () => {
44
- 'worklet';
45
- if (REANIMATED_AVAILABLE) {
46
- setGestureState(handlerTag, State.FAILED);
47
- } else {
48
- console.warn(warningMessage);
49
- }
50
- },
51
-
52
- end: () => {
53
- 'worklet';
54
- if (REANIMATED_AVAILABLE) {
55
- setGestureState(handlerTag, State.END);
56
- } else {
57
- console.warn(warningMessage);
58
- }
59
- },
60
- };
61
- },
63
+ create,
62
64
  };
package/src/index.ts CHANGED
@@ -2,6 +2,7 @@ import { initialize } from './init';
2
2
 
3
3
  export { Directions } from './Directions';
4
4
  export { State } from './State';
5
+ export { MouseButton } from './web/interfaces';
5
6
  export { default as gestureHandlerRootHOC } from './components/gestureHandlerRootHOC';
6
7
  export { default as GestureHandlerRootView } from './components/GestureHandlerRootView';
7
8
  export type {
@@ -0,0 +1,26 @@
1
+ import { TurboModuleRegistry, TurboModule } from 'react-native';
2
+ import { Int32 } from 'react-native/Libraries/Types/CodegenTypes';
3
+
4
+ export interface Spec extends TurboModule {
5
+ handleSetJSResponder: (tag: Int32, blockNativeResponder: boolean) => void;
6
+ handleClearJSResponder: () => void;
7
+ createGestureHandler: (
8
+ handlerName: string,
9
+ handlerTag: Int32,
10
+ // Record<> is not supported by codegen
11
+ // eslint-disable-next-line @typescript-eslint/ban-types
12
+ config: Object
13
+ ) => void;
14
+ attachGestureHandler: (
15
+ handlerTag: Int32,
16
+ newView: Int32,
17
+ actionType: Int32
18
+ ) => void;
19
+ // eslint-disable-next-line @typescript-eslint/ban-types
20
+ updateGestureHandler: (handlerTag: Int32, newConfig: Object) => void;
21
+ dropGestureHandler: (handlerTag: Int32) => void;
22
+ install: () => boolean;
23
+ flushOperations: () => void;
24
+ }
25
+
26
+ export default TurboModuleRegistry.getEnforcing<Spec>('RNGestureHandlerModule');
@@ -5,7 +5,7 @@ import { AdaptedEvent, Config } from '../interfaces';
5
5
  import GestureHandler from './GestureHandler';
6
6
 
7
7
  const DEFAULT_MAX_DURATION_MS = 800;
8
- const DEFAULT_MIN_ACCEPTABLE_DELTA = 160;
8
+ const DEFAULT_MIN_ACCEPTABLE_DELTA = 32;
9
9
  const DEFAULT_DIRECTION = Direction.RIGHT;
10
10
  const DEFAULT_NUMBER_OF_TOUCHES_REQUIRED = 1;
11
11
 
@@ -83,6 +83,10 @@ export default class FlingGestureHandler extends GestureHandler {
83
83
  }
84
84
 
85
85
  protected onPointerDown(event: AdaptedEvent): void {
86
+ if (!this.isButtonInConfig(event.button)) {
87
+ return;
88
+ }
89
+
86
90
  this.tracker.addToTracker(event);
87
91
  this.keyPointer = event.pointerId;
88
92
 
@@ -141,11 +145,11 @@ export default class FlingGestureHandler extends GestureHandler {
141
145
  }
142
146
 
143
147
  private onUp(event: AdaptedEvent): void {
144
- this.tracker.removeFromTracker(event.pointerId);
145
- if (this.currentState !== State.BEGAN) {
146
- return;
148
+ if (this.currentState === State.BEGAN) {
149
+ this.endFling();
147
150
  }
148
- this.endFling();
151
+
152
+ this.tracker.removeFromTracker(event.pointerId);
149
153
  }
150
154
 
151
155
  public activate(force?: boolean): void {
@@ -10,6 +10,7 @@ import {
10
10
  PointerType,
11
11
  TouchEventType,
12
12
  EventTypes,
13
+ MouseButton,
13
14
  } from '../interfaces';
14
15
  import EventManager from '../tools/EventManager';
15
16
  import GestureHandlerOrchestrator from '../tools/GestureHandlerOrchestrator';
@@ -117,6 +118,10 @@ export default abstract class GestureHandler {
117
118
  );
118
119
 
119
120
  this.onStateChange(newState, oldState);
121
+
122
+ if (!this.enabled && this.isFinished()) {
123
+ this.currentState = State.UNDETERMINED;
124
+ }
120
125
  }
121
126
 
122
127
  protected onStateChange(_newState: State, _oldState: State): void {}
@@ -736,8 +741,20 @@ export default abstract class GestureHandler {
736
741
  return false;
737
742
  }
738
743
 
744
+ public isButtonInConfig(mouseButton: MouseButton | undefined) {
745
+ return (
746
+ !mouseButton ||
747
+ (!this.config.mouseButton && mouseButton === MouseButton.LEFT) ||
748
+ (this.config.mouseButton && mouseButton & this.config.mouseButton)
749
+ );
750
+ }
751
+
739
752
  protected resetConfig(): void {}
740
753
 
754
+ public onDestroy(): void {
755
+ this.delegate.destroy(this.config);
756
+ }
757
+
741
758
  //
742
759
  // Getters and setters
743
760
  //
@@ -1,4 +1,3 @@
1
- import { Platform } from 'react-native';
2
1
  import { State } from '../../State';
3
2
  import { AdaptedEvent, Config } from '../interfaces';
4
3
 
@@ -22,11 +21,11 @@ export default class LongPressGestureHandler extends GestureHandler {
22
21
  private activationTimeout: number | undefined;
23
22
 
24
23
  public init(ref: number, propsRef: React.RefObject<unknown>) {
25
- super.init(ref, propsRef);
26
-
27
- if (Platform.OS === 'web') {
28
- (this.delegate.getView() as HTMLElement).oncontextmenu = () => false;
24
+ if (this.config.enableContextMenu === undefined) {
25
+ this.config.enableContextMenu = false;
29
26
  }
27
+
28
+ super.init(ref, propsRef);
30
29
  }
31
30
 
32
31
  protected transformNativeEvent() {
@@ -59,6 +58,10 @@ export default class LongPressGestureHandler extends GestureHandler {
59
58
  }
60
59
 
61
60
  protected onPointerDown(event: AdaptedEvent): void {
61
+ if (!this.isButtonInConfig(event.button)) {
62
+ return;
63
+ }
64
+
62
65
  this.tracker.addToTracker(event);
63
66
  super.onPointerDown(event);
64
67
  this.tryBegin(event);
@@ -211,6 +211,10 @@ export default class PanGestureHandler extends GestureHandler {
211
211
 
212
212
  //EventsHandling
213
213
  protected onPointerDown(event: AdaptedEvent): void {
214
+ if (!this.isButtonInConfig(event.button)) {
215
+ return;
216
+ }
217
+
214
218
  this.tracker.addToTracker(event);
215
219
  super.onPointerDown(event);
216
220
 
@@ -105,6 +105,10 @@ export default class TapGestureHandler extends GestureHandler {
105
105
 
106
106
  //Handling Events
107
107
  protected onPointerDown(event: AdaptedEvent): void {
108
+ if (!this.isButtonInConfig(event.button)) {
109
+ return;
110
+ }
111
+
108
112
  this.tracker.addToTracker(event);
109
113
  super.onPointerDown(event);
110
114
 
@@ -37,6 +37,8 @@ export interface Config extends Record<string, ConfigArgs> {
37
37
  shouldCancelWhenOutside?: boolean;
38
38
  userSelect?: UserSelect;
39
39
  activeCursor?: ActiveCursor;
40
+ mouseButton?: MouseButton;
41
+ enableContextMenu?: boolean;
40
42
 
41
43
  activateAfterLongPress?: number;
42
44
  failOffsetXStart?: number;
@@ -122,22 +124,20 @@ export interface AdaptedEvent {
122
124
  pointerId: number;
123
125
  eventType: EventTypes;
124
126
  pointerType: PointerType;
125
- buttons: number;
126
127
  time: number;
128
+ button?: MouseButton;
127
129
  allTouches?: TouchList;
128
130
  changedTouches?: TouchList;
129
131
  touchEventType?: TouchEventType;
130
132
  }
131
133
 
132
- export enum MouseButtons {
133
- NONE,
134
- LEFT,
135
- RIGHT,
136
- LEFT_RIGHT,
137
- SCROLL,
138
- SCROLL_LEFT,
139
- SCROLL_RIGHT,
140
- SCROLL_LEFT_RIGHT,
134
+ export enum MouseButton {
135
+ LEFT = 1,
136
+ MIDDLE = 2,
137
+ RIGHT = 4,
138
+ BUTTON_4 = 8,
139
+ BUTTON_5 = 16,
140
+ ALL = 31,
141
141
  }
142
142
 
143
143
  export enum EventTypes {
@@ -1,4 +1,5 @@
1
1
  import type GestureHandler from '../handlers/GestureHandler';
2
+ import { Config } from '../interfaces';
2
3
 
3
4
  export interface MeasureResult {
4
5
  pageX: number;
@@ -20,4 +21,6 @@ export interface GestureHandlerDelegate<T> {
20
21
  onEnd(): void;
21
22
  onCancel(): void;
22
23
  onFail(): void;
24
+
25
+ destroy(config: Config): void;
23
26
  }
@@ -9,6 +9,7 @@ import TouchEventManager from './TouchEventManager';
9
9
  import { State } from '../../State';
10
10
  import { isPointerInBounds } from '../utils';
11
11
  import EventManager from './EventManager';
12
+ import { Config, MouseButton } from '../interfaces';
12
13
 
13
14
  export class GestureHandlerWebDelegate
14
15
  implements GestureHandlerDelegate<HTMLElement>
@@ -37,6 +38,8 @@ export class GestureHandlerWebDelegate
37
38
 
38
39
  const config = handler.getConfig();
39
40
 
41
+ this.addContextMenuListeners(config);
42
+
40
43
  if (!config.userSelect) {
41
44
  this.view.style['webkitUserSelect'] = 'none';
42
45
  this.view.style['userSelect'] = 'none';
@@ -86,6 +89,38 @@ export class GestureHandlerWebDelegate
86
89
  }
87
90
  }
88
91
 
92
+ private shouldDisableContextMenu(config: Config) {
93
+ return (
94
+ (config.enableContextMenu === undefined &&
95
+ this.gestureHandler.isButtonInConfig(MouseButton.RIGHT)) ||
96
+ config.enableContextMenu === false
97
+ );
98
+ }
99
+
100
+ private addContextMenuListeners(config: Config): void {
101
+ if (this.shouldDisableContextMenu(config)) {
102
+ this.view.addEventListener('contextmenu', this.disableContextMenu);
103
+ } else if (config.enableContextMenu) {
104
+ this.view.addEventListener('contextmenu', this.enableContextMenu);
105
+ }
106
+ }
107
+
108
+ private removeContextMenuListeners(config: Config): void {
109
+ if (this.shouldDisableContextMenu(config)) {
110
+ this.view.removeEventListener('contextmenu', this.disableContextMenu);
111
+ } else if (config.enableContextMenu) {
112
+ this.view.removeEventListener('contextmenu', this.enableContextMenu);
113
+ }
114
+ }
115
+
116
+ private disableContextMenu(this: void, e: MouseEvent): void {
117
+ e.preventDefault();
118
+ }
119
+
120
+ private enableContextMenu(this: void, e: MouseEvent): void {
121
+ e.stopPropagation();
122
+ }
123
+
89
124
  onBegin(): void {
90
125
  // no-op for now
91
126
  }
@@ -112,4 +147,8 @@ export class GestureHandlerWebDelegate
112
147
  onFail(): void {
113
148
  this.tryResetCursor();
114
149
  }
150
+
151
+ public destroy(config: Config): void {
152
+ this.removeContextMenuListeners(config);
153
+ }
115
154
  }
@@ -21,7 +21,9 @@ export default abstract class NodeManager {
21
21
  handler: InstanceType<ValueOf<typeof Gestures>>
22
22
  ): void {
23
23
  if (handlerTag in this.gestures) {
24
- throw new Error(`Handler with tag ${handlerTag} already exists`);
24
+ throw new Error(
25
+ `Handler with tag ${handlerTag} already exists. Please ensure that no Gesture instance is used across multiple GestureDetectors.`
26
+ );
25
27
  }
26
28
 
27
29
  this.gestures[handlerTag] = handler;
@@ -33,6 +35,8 @@ export default abstract class NodeManager {
33
35
  return;
34
36
  }
35
37
 
38
+ this.gestures[handlerTag].onDestroy();
39
+
36
40
  // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
37
41
  delete this.gestures[handlerTag];
38
42
  }
@@ -1,9 +1,27 @@
1
- import { AdaptedEvent, EventTypes, PointerType } from '../interfaces';
1
+ import {
2
+ AdaptedEvent,
3
+ EventTypes,
4
+ MouseButton,
5
+ PointerType,
6
+ } from '../interfaces';
2
7
  import EventManager from './EventManager';
3
8
  import { isPointerInBounds } from '../utils';
4
9
 
10
+ const POINTER_CAPTURE_EXCLUDE_LIST = new Set<string>(['SELECT', 'INPUT']);
11
+
5
12
  export default class PointerEventManager extends EventManager<HTMLElement> {
6
13
  private trackedPointers = new Set<number>();
14
+ private readonly mouseButtonsMapper = new Map<number, MouseButton>();
15
+
16
+ constructor(view: HTMLElement) {
17
+ super(view);
18
+
19
+ this.mouseButtonsMapper.set(0, MouseButton.LEFT);
20
+ this.mouseButtonsMapper.set(1, MouseButton.MIDDLE);
21
+ this.mouseButtonsMapper.set(2, MouseButton.RIGHT);
22
+ this.mouseButtonsMapper.set(3, MouseButton.BUTTON_4);
23
+ this.mouseButtonsMapper.set(4, MouseButton.BUTTON_5);
24
+ }
7
25
 
8
26
  public setListeners(): void {
9
27
  this.view.addEventListener('pointerdown', (event: PointerEvent): void => {
@@ -19,7 +37,7 @@ export default class PointerEventManager extends EventManager<HTMLElement> {
19
37
  const adaptedEvent: AdaptedEvent = this.mapEvent(event, EventTypes.DOWN);
20
38
  const target = event.target as HTMLElement;
21
39
 
22
- if (target instanceof HTMLDivElement) {
40
+ if (!POINTER_CAPTURE_EXCLUDE_LIST.has(target.tagName)) {
23
41
  target.setPointerCapture(adaptedEvent.pointerId);
24
42
  }
25
43
 
@@ -50,7 +68,7 @@ export default class PointerEventManager extends EventManager<HTMLElement> {
50
68
  const adaptedEvent: AdaptedEvent = this.mapEvent(event, EventTypes.UP);
51
69
  const target = event.target as HTMLElement;
52
70
 
53
- if (target instanceof HTMLDivElement) {
71
+ if (!POINTER_CAPTURE_EXCLUDE_LIST.has(target.tagName)) {
54
72
  target.releasePointerCapture(adaptedEvent.pointerId);
55
73
  }
56
74
 
@@ -87,7 +105,7 @@ export default class PointerEventManager extends EventManager<HTMLElement> {
87
105
  // God, I do love web development.
88
106
  if (
89
107
  !target.hasPointerCapture(event.pointerId) &&
90
- target instanceof HTMLDivElement
108
+ !POINTER_CAPTURE_EXCLUDE_LIST.has(target.tagName)
91
109
  ) {
92
110
  target.setPointerCapture(event.pointerId);
93
111
  }
@@ -190,7 +208,7 @@ export default class PointerEventManager extends EventManager<HTMLElement> {
190
208
  pointerId: event.pointerId,
191
209
  eventType: eventType,
192
210
  pointerType: event.pointerType as PointerType,
193
- buttons: event.buttons,
211
+ button: this.mouseButtonsMapper.get(event.button),
194
212
  time: event.timeStamp,
195
213
  };
196
214
  }
@@ -1,7 +1,6 @@
1
1
  import {
2
2
  AdaptedEvent,
3
3
  EventTypes,
4
- MouseButtons,
5
4
  PointerType,
6
5
  TouchEventType,
7
6
  } from '../interfaces';
@@ -157,7 +156,6 @@ export default class TouchEventManager extends EventManager<HTMLElement> {
157
156
  pointerId: event.changedTouches[index].identifier,
158
157
  eventType: eventType,
159
158
  pointerType: PointerType.TOUCH,
160
- buttons: MouseButtons.NONE,
161
159
  time: event.timeStamp,
162
160
  allTouches: event.touches,
163
161
  changedTouches: event.changedTouches,
@@ -1,95 +0,0 @@
1
-
2
-
3
- //
4
- // RNPinchHandler.m
5
- // RNGestureHandler
6
- //
7
- // Created by Krzysztof Magiera on 12/10/2017.
8
- // Copyright © 2017 Software Mansion. All rights reserved.
9
- //
10
-
11
- #import "RNPinchHandler.h"
12
-
13
- #if !TARGET_OS_TV
14
- @interface RNBetterPinchRecognizer : UIPinchGestureRecognizer
15
-
16
- - (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler;
17
-
18
- @end
19
-
20
- @implementation RNBetterPinchRecognizer {
21
- __weak RNGestureHandler *_gestureHandler;
22
- }
23
-
24
- - (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
25
- {
26
- if ((self = [super initWithTarget:self action:@selector(handleGesture:)])) {
27
- _gestureHandler = gestureHandler;
28
- }
29
- return self;
30
- }
31
-
32
- - (void)handleGesture:(UIGestureRecognizer *)recognizer
33
- {
34
- if (self.state == UIGestureRecognizerStateBegan) {
35
- self.scale = 1;
36
- }
37
- [_gestureHandler handleGesture:recognizer];
38
- }
39
-
40
- - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
41
- {
42
- [super touchesBegan:touches withEvent:event];
43
- [_gestureHandler.pointerTracker touchesBegan:touches withEvent:event];
44
- }
45
-
46
- - (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
47
- {
48
- [super touchesMoved:touches withEvent:event];
49
- [_gestureHandler.pointerTracker touchesMoved:touches withEvent:event];
50
- }
51
-
52
- - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
53
- {
54
- [super touchesEnded:touches withEvent:event];
55
- [_gestureHandler.pointerTracker touchesEnded:touches withEvent:event];
56
- }
57
-
58
- - (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
59
- {
60
- [super touchesCancelled:touches withEvent:event];
61
- [_gestureHandler.pointerTracker touchesCancelled:touches withEvent:event];
62
- }
63
-
64
- - (void)reset
65
- {
66
- [_gestureHandler.pointerTracker reset];
67
- [super reset];
68
- }
69
-
70
- @end
71
- #endif
72
-
73
- @implementation RNPinchGestureHandler
74
-
75
- - (instancetype)initWithTag:(NSNumber *)tag
76
- {
77
- if ((self = [super initWithTag:tag])) {
78
- #if !TARGET_OS_TV
79
- _recognizer = [[RNBetterPinchRecognizer alloc] initWithGestureHandler:self];
80
- #endif
81
- }
82
- return self;
83
- }
84
-
85
- #if !TARGET_OS_TV
86
- - (RNGestureHandlerEventExtraData *)eventExtraData:(UIPinchGestureRecognizer *)recognizer
87
- {
88
- return [RNGestureHandlerEventExtraData forPinch:recognizer.scale
89
- withFocalPoint:[recognizer locationInView:recognizer.view]
90
- withVelocity:recognizer.velocity
91
- withNumberOfTouches:recognizer.numberOfTouches];
92
- }
93
- #endif
94
-
95
- @end
@@ -1,7 +0,0 @@
1
- #import <React/RCTBridgeModule.h>
2
- #import <React/RCTEventEmitter.h>
3
- #import <React/RCTUIManager.h>
4
-
5
- @interface RNGestureHandlerModule : RCTEventEmitter <RCTBridgeModule>
6
-
7
- @end