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
@@ -154,6 +154,9 @@ class RNGestureHandlerModule(reactContext: ReactApplicationContext?) :
154
154
  if (config.hasKey(KEY_LONG_PRESS_MAX_DIST)) {
155
155
  handler.setMaxDist(PixelUtil.toPixelFromDIP(config.getDouble(KEY_LONG_PRESS_MAX_DIST)))
156
156
  }
157
+ if (config.hasKey(KEY_NUMBER_OF_POINTERS)) {
158
+ handler.setNumberOfPointers(config.getInt(KEY_NUMBER_OF_POINTERS))
159
+ }
157
160
  }
158
161
 
159
162
  override fun createEventBuilder(handler: LongPressGestureHandler) = LongPressGestureHandlerEventDataBuilder(handler)
@@ -3,18 +3,21 @@ package com.swmansion.gesturehandler.react.eventbuilders
3
3
  import com.facebook.react.bridge.WritableMap
4
4
  import com.facebook.react.uimanager.PixelUtil
5
5
  import com.swmansion.gesturehandler.core.HoverGestureHandler
6
+ import com.swmansion.gesturehandler.core.StylusData
6
7
 
7
8
  class HoverGestureHandlerEventDataBuilder(handler: HoverGestureHandler) : GestureHandlerEventDataBuilder<HoverGestureHandler>(handler) {
8
9
  private val x: Float
9
10
  private val y: Float
10
11
  private val absoluteX: Float
11
12
  private val absoluteY: Float
13
+ private val stylusData: StylusData
12
14
 
13
15
  init {
14
16
  x = handler.lastRelativePositionX
15
17
  y = handler.lastRelativePositionY
16
18
  absoluteX = handler.lastPositionInWindowX
17
19
  absoluteY = handler.lastPositionInWindowY
20
+ stylusData = handler.stylusData
18
21
  }
19
22
 
20
23
  override fun buildEventData(eventData: WritableMap) {
@@ -25,6 +28,10 @@ class HoverGestureHandlerEventDataBuilder(handler: HoverGestureHandler) : Gestur
25
28
  putDouble("y", PixelUtil.toDIPFromPixel(y).toDouble())
26
29
  putDouble("absoluteX", PixelUtil.toDIPFromPixel(absoluteX).toDouble())
27
30
  putDouble("absoluteY", PixelUtil.toDIPFromPixel(absoluteY).toDouble())
31
+
32
+ if (stylusData.pressure != -1.0) {
33
+ putMap("stylusData", stylusData.toReadableMap())
34
+ }
28
35
  }
29
36
  }
30
37
  }
@@ -3,6 +3,7 @@ package com.swmansion.gesturehandler.react.eventbuilders
3
3
  import com.facebook.react.bridge.WritableMap
4
4
  import com.facebook.react.uimanager.PixelUtil
5
5
  import com.swmansion.gesturehandler.core.PanGestureHandler
6
+ import com.swmansion.gesturehandler.core.StylusData
6
7
 
7
8
  class PanGestureHandlerEventDataBuilder(handler: PanGestureHandler) : GestureHandlerEventDataBuilder<PanGestureHandler>(handler) {
8
9
  private val x: Float
@@ -13,6 +14,7 @@ class PanGestureHandlerEventDataBuilder(handler: PanGestureHandler) : GestureHan
13
14
  private val translationY: Float
14
15
  private val velocityX: Float
15
16
  private val velocityY: Float
17
+ private val stylusData: StylusData
16
18
 
17
19
  init {
18
20
  x = handler.lastRelativePositionX
@@ -23,6 +25,7 @@ class PanGestureHandlerEventDataBuilder(handler: PanGestureHandler) : GestureHan
23
25
  translationY = handler.translationY
24
26
  velocityX = handler.velocityX
25
27
  velocityY = handler.velocityY
28
+ stylusData = handler.stylusData
26
29
  }
27
30
 
28
31
  override fun buildEventData(eventData: WritableMap) {
@@ -37,6 +40,10 @@ class PanGestureHandlerEventDataBuilder(handler: PanGestureHandler) : GestureHan
37
40
  putDouble("translationY", PixelUtil.toDIPFromPixel(translationY).toDouble())
38
41
  putDouble("velocityX", PixelUtil.toDIPFromPixel(velocityX).toDouble())
39
42
  putDouble("velocityY", PixelUtil.toDIPFromPixel(velocityY).toDouble())
43
+
44
+ if (stylusData.pressure != -1.0) {
45
+ putMap("stylusData", stylusData.toReadableMap())
46
+ }
40
47
  }
41
48
  }
42
49
  }
@@ -26,12 +26,21 @@ target_include_directories(
26
26
  )
27
27
 
28
28
  find_package(ReactAndroid REQUIRED CONFIG)
29
-
30
- target_link_libraries(
31
- gesturehandler
32
- ReactAndroid::react_render_core
33
- ReactAndroid::react_render_uimanager
34
- ReactAndroid::react_render_graphics
35
- ReactAndroid::jsi
36
- ReactAndroid::react_nativemodule_core
37
- )
29
+ if (ReactAndroid_VERSION_MINOR GREATER_EQUAL 76)
30
+ target_link_libraries(
31
+ ${PACKAGE_NAME}
32
+ ReactAndroid::reactnative
33
+ ReactAndroid::jsi
34
+ )
35
+ elseif (ReactAndroid_VERSION_MINOR GREATER_EQUAL 75)
36
+ target_link_libraries(
37
+ ${PACKAGE_NAME}
38
+ ReactAndroid::react_render_core
39
+ ReactAndroid::react_render_uimanager
40
+ ReactAndroid::react_render_graphics
41
+ ReactAndroid::jsi
42
+ ReactAndroid::react_nativemodule_core
43
+ )
44
+ else ()
45
+ message(FATAL_ERROR "react-native-gesture-handler on the New Architecture requires react-native 0.75 or newer.")
46
+ endif ()
@@ -1,3 +1,4 @@
1
+ #import "../RNGHVector.h"
1
2
  #import "RNGestureHandler.h"
2
3
 
3
4
  @interface RNFlingGestureHandler : RNGestureHandler
@@ -87,6 +87,154 @@
87
87
 
88
88
  @end
89
89
 
90
+ #else
91
+
92
+ @interface RNBetterSwipeGestureRecognizer : NSGestureRecognizer {
93
+ dispatch_block_t failFlingAction;
94
+ int maxDuration;
95
+ int minVelocity;
96
+ double defaultAlignmentCone;
97
+ double axialDeviationCosine;
98
+ double diagonalDeviationCosine;
99
+ }
100
+
101
+ @property (atomic, assign) RNGestureHandlerDirection direction;
102
+ @property (atomic, assign) int numberOfTouchesRequired;
103
+
104
+ - (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler;
105
+
106
+ @end
107
+
108
+ @implementation RNBetterSwipeGestureRecognizer {
109
+ __weak RNGestureHandler *_gestureHandler;
110
+
111
+ NSPoint startPosition;
112
+ double startTime;
113
+ }
114
+
115
+ - (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
116
+ {
117
+ if ((self = [super initWithTarget:self action:@selector(handleGesture:)])) {
118
+ _gestureHandler = gestureHandler;
119
+
120
+ maxDuration = 1.0;
121
+ minVelocity = 700;
122
+
123
+ defaultAlignmentCone = 30;
124
+ axialDeviationCosine = [self coneToDeviation:defaultAlignmentCone];
125
+ diagonalDeviationCosine = [self coneToDeviation:(90 - defaultAlignmentCone)];
126
+ }
127
+ return self;
128
+ }
129
+
130
+ - (void)handleGesture:(NSPanGestureRecognizer *)gestureRecognizer
131
+ {
132
+ [_gestureHandler handleGesture:self];
133
+ }
134
+
135
+ - (void)mouseDown:(NSEvent *)event
136
+ {
137
+ [super mouseDown:event];
138
+
139
+ startPosition = [self locationInView:self.view];
140
+ startTime = CACurrentMediaTime();
141
+
142
+ self.state = NSGestureRecognizerStatePossible;
143
+
144
+ __weak typeof(self) weakSelf = self;
145
+
146
+ failFlingAction = dispatch_block_create(0, ^{
147
+ __strong typeof(self) strongSelf = weakSelf;
148
+
149
+ if (strongSelf) {
150
+ strongSelf.state = NSGestureRecognizerStateFailed;
151
+ }
152
+ });
153
+
154
+ dispatch_after(
155
+ dispatch_time(DISPATCH_TIME_NOW, (int64_t)(maxDuration * NSEC_PER_SEC)),
156
+ dispatch_get_main_queue(),
157
+ failFlingAction);
158
+ }
159
+
160
+ - (void)mouseDragged:(NSEvent *)event
161
+ {
162
+ [super mouseDragged:event];
163
+
164
+ NSPoint currentPosition = [self locationInView:self.view];
165
+ double currentTime = CACurrentMediaTime();
166
+
167
+ NSPoint distance;
168
+ distance.x = currentPosition.x - startPosition.x;
169
+ distance.y = startPosition.y - currentPosition.y;
170
+
171
+ double timeDelta = currentTime - startTime;
172
+
173
+ Vector *velocityVector = [Vector fromVelocityX:(distance.x / timeDelta) withVelocityY:(distance.y / timeDelta)];
174
+
175
+ [self tryActivate:velocityVector];
176
+ }
177
+
178
+ - (void)mouseUp:(NSEvent *)event
179
+ {
180
+ [super mouseUp:event];
181
+
182
+ dispatch_block_cancel(failFlingAction);
183
+
184
+ self.state =
185
+ self.state == NSGestureRecognizerStateChanged ? NSGestureRecognizerStateEnded : NSGestureRecognizerStateFailed;
186
+ }
187
+
188
+ - (void)tryActivate:(Vector *)velocityVector
189
+ {
190
+ bool isAligned = NO;
191
+
192
+ for (int i = 0; i < directionsSize; ++i) {
193
+ if ([self getAlignment:axialDirections[i]
194
+ withMinimalAlignmentCosine:axialDeviationCosine
195
+ withVelocityVector:velocityVector]) {
196
+ isAligned = YES;
197
+ break;
198
+ }
199
+ }
200
+
201
+ if (!isAligned) {
202
+ for (int i = 0; i < directionsSize; ++i) {
203
+ if ([self getAlignment:diagonalDirections[i]
204
+ withMinimalAlignmentCosine:diagonalDeviationCosine
205
+ withVelocityVector:velocityVector]) {
206
+ isAligned = YES;
207
+ break;
208
+ }
209
+ }
210
+ }
211
+
212
+ bool isFastEnough = velocityVector.magnitude >= minVelocity;
213
+
214
+ if (isAligned && isFastEnough) {
215
+ self.state = NSGestureRecognizerStateChanged;
216
+ }
217
+ }
218
+
219
+ - (BOOL)getAlignment:(RNGestureHandlerDirection)direction
220
+ withMinimalAlignmentCosine:(double)minimalAlignmentCosine
221
+ withVelocityVector:(Vector *)velocityVector
222
+ {
223
+ Vector *directionVector = [Vector fromDirection:direction];
224
+ return ((self.direction & direction) == direction) &&
225
+ [velocityVector isSimilar:directionVector withThreshold:minimalAlignmentCosine];
226
+ }
227
+
228
+ - (double)coneToDeviation:(double)degrees
229
+ {
230
+ double radians = (degrees * M_PI) / 180;
231
+ return cos(radians / 2);
232
+ }
233
+
234
+ @end
235
+
236
+ #endif
237
+
90
238
  @implementation RNFlingGestureHandler
91
239
 
92
240
  - (instancetype)initWithTag:(NSNumber *)tag
@@ -100,8 +248,8 @@
100
248
  - (void)resetConfig
101
249
  {
102
250
  [super resetConfig];
103
- UISwipeGestureRecognizer *recognizer = (UISwipeGestureRecognizer *)_recognizer;
104
- recognizer.direction = UISwipeGestureRecognizerDirectionRight;
251
+ RNBetterSwipeGestureRecognizer *recognizer = (RNBetterSwipeGestureRecognizer *)_recognizer;
252
+ recognizer.direction = RNGestureHandlerDirectionRight;
105
253
  #if !TARGET_OS_TV
106
254
  recognizer.numberOfTouchesRequired = 1;
107
255
  #endif
@@ -110,7 +258,7 @@
110
258
  - (void)configure:(NSDictionary *)config
111
259
  {
112
260
  [super configure:config];
113
- UISwipeGestureRecognizer *recognizer = (UISwipeGestureRecognizer *)_recognizer;
261
+ RNBetterSwipeGestureRecognizer *recognizer = (RNBetterSwipeGestureRecognizer *)_recognizer;
114
262
 
115
263
  id prop = config[@"direction"];
116
264
  if (prop != nil) {
@@ -125,6 +273,7 @@
125
273
  #endif
126
274
  }
127
275
 
276
+ #if !TARGET_OS_OSX
128
277
  - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
129
278
  {
130
279
  RNGestureHandlerState savedState = _lastState;
@@ -154,21 +303,6 @@
154
303
  withNumberOfTouches:recognizer.numberOfTouches
155
304
  withPointerType:_pointerType];
156
305
  }
157
- @end
158
-
159
- #else
160
-
161
- @implementation RNFlingGestureHandler
162
-
163
- - (instancetype)initWithTag:(NSNumber *)tag
164
- {
165
- RCTLogWarn(@"FlingGestureHandler is not supported on macOS");
166
- if ((self = [super initWithTag:tag])) {
167
- _recognizer = [NSGestureRecognizer alloc];
168
- }
169
- return self;
170
- }
306
+ #endif
171
307
 
172
308
  @end
173
-
174
- #endif
@@ -6,6 +6,7 @@
6
6
  //
7
7
 
8
8
  #import "RNHoverHandler.h"
9
+ #import <React/UIView+React.h>
9
10
 
10
11
  #if !TARGET_OS_OSX
11
12
 
@@ -163,17 +164,58 @@ API_AVAILABLE(ios(13.4))
163
164
 
164
165
  #else
165
166
 
166
- @implementation RNHoverGestureHandler
167
+ @implementation RNHoverGestureHandler {
168
+ NSTrackingArea *trackingArea;
169
+ RNGHUIView *_view;
170
+ }
167
171
 
168
172
  - (instancetype)initWithTag:(NSNumber *)tag
169
173
  {
170
- RCTLogWarn(@"HoverGestureHandler is not supported on macOS");
171
174
  if ((self = [super initWithTag:tag])) {
172
175
  _recognizer = [NSGestureRecognizer alloc];
173
176
  }
177
+
174
178
  return self;
175
179
  }
176
180
 
181
+ - (void)bindToView:(RNGHUIView *)view
182
+ {
183
+ _view = view;
184
+
185
+ NSTrackingAreaOptions options =
186
+ NSTrackingMouseEnteredAndExited | NSTrackingActiveInActiveApp | NSTrackingInVisibleRect;
187
+
188
+ trackingArea = [[NSTrackingArea alloc] initWithRect:_view.bounds options:options owner:self userInfo:nil];
189
+ [_view addTrackingArea:trackingArea];
190
+ }
191
+
192
+ - (void)unbindFromView
193
+ {
194
+ [_view removeTrackingArea:trackingArea];
195
+ _view = nil;
196
+ }
197
+
198
+ - (void)mouseEntered:(NSEvent *)event
199
+ {
200
+ [self sendEventsInState:RNGestureHandlerStateBegan
201
+ forViewWithTag:_view.reactTag
202
+ withExtraData:[RNGestureHandlerEventExtraData forPointerInside:YES withPointerType:_pointerType]];
203
+ [self sendEventsInState:RNGestureHandlerStateActive
204
+ forViewWithTag:_view.reactTag
205
+ withExtraData:[RNGestureHandlerEventExtraData forPointerInside:YES withPointerType:_pointerType]];
206
+ }
207
+
208
+ - (void)mouseExited:(NSEvent *)theEvent
209
+ {
210
+ [self sendEventsInState:RNGestureHandlerStateEnd
211
+ forViewWithTag:_view.reactTag
212
+ withExtraData:[RNGestureHandlerEventExtraData forPointerInside:YES withPointerType:_pointerType]];
213
+
214
+ [self sendEventsInState:RNGestureHandlerStateUndetermined
215
+ forViewWithTag:_view.reactTag
216
+ withExtraData:[RNGestureHandlerEventExtraData forPointerInside:YES withPointerType:_pointerType]];
217
+ }
218
+
177
219
  @end
178
220
 
179
221
  #endif
@@ -7,22 +7,37 @@
7
7
  //
8
8
 
9
9
  #import "RNLongPressHandler.h"
10
+ #import <React/RCTConvert.h>
10
11
 
11
12
  #if !TARGET_OS_OSX
12
13
 
13
14
  #import <UIKit/UIGestureRecognizerSubclass.h>
14
15
 
15
- #import <React/RCTConvert.h>
16
-
17
16
  @interface RNBetterLongPressGestureRecognizer : UILongPressGestureRecognizer {
17
+ #else
18
+ @interface RNBetterLongPressGestureRecognizer : NSGestureRecognizer {
19
+ dispatch_block_t block;
20
+ #endif
21
+
18
22
  CFTimeInterval startTime;
19
23
  CFTimeInterval previousTime;
20
24
  }
21
25
 
26
+ #if TARGET_OS_OSX
27
+ @property (nonatomic, assign) double minimumPressDuration;
28
+ @property (nonatomic, assign) double allowableMovement;
29
+ @property (nonatomic, assign) double numberOfTouchesRequired;
30
+ #endif
31
+
22
32
  - (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler;
23
- - (void)handleGesture:(UIGestureRecognizer *)recognizer;
24
33
  - (NSUInteger)getDuration;
25
34
 
35
+ #if !TARGET_OS_OSX
36
+ - (void)handleGesture:(UIGestureRecognizer *)recognizer;
37
+ #else
38
+ - (void)handleGesture:(NSGestureRecognizer *)recognizer;
39
+ #endif
40
+
26
41
  @end
27
42
 
28
43
  @implementation RNBetterLongPressGestureRecognizer {
@@ -55,12 +70,16 @@
55
70
  return CGPointMake(currentPosition.x - _initPosition.x, currentPosition.y - _initPosition.y);
56
71
  }
57
72
 
73
+ #if !TARGET_OS_OSX
74
+
58
75
  - (void)touchesBegan:(NSSet<RNGHUITouch *> *)touches withEvent:(UIEvent *)event
59
76
  {
60
77
  [_gestureHandler setCurrentPointerType:event];
61
78
  [super touchesBegan:touches withEvent:event];
62
79
  [_gestureHandler.pointerTracker touchesBegan:touches withEvent:event];
63
80
 
81
+ self.state = UIGestureRecognizerStatePossible;
82
+
64
83
  _initPosition = [self locationInView:self.view];
65
84
  startTime = CACurrentMediaTime();
66
85
  [_gestureHandler reset];
@@ -72,10 +91,8 @@
72
91
  [super touchesMoved:touches withEvent:event];
73
92
  [_gestureHandler.pointerTracker touchesMoved:touches withEvent:event];
74
93
 
75
- CGPoint trans = [self translationInView];
76
- if ((_gestureHandler.shouldCancelWhenOutside && ![_gestureHandler containsPointInView]) ||
77
- (TEST_MAX_IF_NOT_NAN(
78
- fabs(trans.y * trans.y + trans.x * trans.x), self.allowableMovement * self.allowableMovement))) {
94
+ if ([self shouldCancelGesture]) {
95
+ self.state = UIGestureRecognizerStateFailed;
79
96
  self.enabled = NO;
80
97
  self.enabled = YES;
81
98
  }
@@ -94,6 +111,75 @@
94
111
  [self reset];
95
112
  }
96
113
 
114
+ #else
115
+ - (void)mouseDown:(NSEvent *)event
116
+ {
117
+ self.state = NSGestureRecognizerStateBegan;
118
+ startTime = CACurrentMediaTime();
119
+
120
+ [_gestureHandler.pointerTracker touchesBegan:[NSSet setWithObject:event] withEvent:event];
121
+
122
+ _initPosition = [self locationInView:self.view];
123
+
124
+ __weak typeof(self) weakSelf = self;
125
+
126
+ block = dispatch_block_create(0, ^{
127
+ __strong typeof(self) strongSelf = weakSelf;
128
+
129
+ if (strongSelf) {
130
+ strongSelf.state = NSGestureRecognizerStateChanged;
131
+ }
132
+ });
133
+
134
+ dispatch_after(
135
+ dispatch_time(DISPATCH_TIME_NOW, (int64_t)(self.minimumPressDuration * NSEC_PER_SEC)),
136
+ dispatch_get_main_queue(),
137
+ block);
138
+ }
139
+
140
+ - (void)mouseDragged:(NSEvent *)event
141
+ {
142
+ [_gestureHandler.pointerTracker touchesMoved:[NSSet setWithObject:event] withEvent:event];
143
+
144
+ if (block == nil) {
145
+ return;
146
+ }
147
+
148
+ if ([self shouldCancelGesture]) {
149
+ dispatch_block_cancel(block);
150
+ block = nil;
151
+
152
+ self.state = self.state == NSGestureRecognizerStateChanged ? NSGestureRecognizerStateCancelled
153
+ : NSGestureRecognizerStateFailed;
154
+ }
155
+ }
156
+
157
+ - (void)mouseUp:(NSEvent *)event
158
+ {
159
+ [_gestureHandler.pointerTracker touchesEnded:[NSSet setWithObject:event] withEvent:event];
160
+
161
+ if (block) {
162
+ dispatch_block_cancel(block);
163
+ block = nil;
164
+ }
165
+
166
+ self.state =
167
+ self.state == NSGestureRecognizerStateChanged ? NSGestureRecognizerStateEnded : NSGestureRecognizerStateFailed;
168
+ }
169
+
170
+ #endif
171
+
172
+ - (BOOL)shouldCancelGesture
173
+ {
174
+ CGPoint trans = [self translationInView];
175
+
176
+ BOOL shouldBeCancelledOutside = _gestureHandler.shouldCancelWhenOutside && ![_gestureHandler containsPointInView];
177
+ BOOL distanceExceeded =
178
+ TEST_MAX_IF_NOT_NAN(fabs(trans.y * trans.y + trans.x * trans.x), self.allowableMovement * self.allowableMovement);
179
+
180
+ return shouldBeCancelledOutside || distanceExceeded;
181
+ }
182
+
97
183
  - (void)reset
98
184
  {
99
185
  if (self.state == UIGestureRecognizerStateFailed) {
@@ -126,7 +212,7 @@
126
212
  - (void)resetConfig
127
213
  {
128
214
  [super resetConfig];
129
- UILongPressGestureRecognizer *recognizer = (UILongPressGestureRecognizer *)_recognizer;
215
+ RNBetterLongPressGestureRecognizer *recognizer = (RNBetterLongPressGestureRecognizer *)_recognizer;
130
216
 
131
217
  recognizer.minimumPressDuration = 0.5;
132
218
  recognizer.allowableMovement = 10;
@@ -135,7 +221,7 @@
135
221
  - (void)configure:(NSDictionary *)config
136
222
  {
137
223
  [super configure:config];
138
- UILongPressGestureRecognizer *recognizer = (UILongPressGestureRecognizer *)_recognizer;
224
+ RNBetterLongPressGestureRecognizer *recognizer = (RNBetterLongPressGestureRecognizer *)_recognizer;
139
225
 
140
226
  id prop = config[@"minDurationMs"];
141
227
  if (prop != nil) {
@@ -146,8 +232,17 @@
146
232
  if (prop != nil) {
147
233
  recognizer.allowableMovement = [RCTConvert CGFloat:prop];
148
234
  }
235
+
236
+ #if !TARGET_OS_TV
237
+ prop = config[@"numberOfPointers"];
238
+ if (prop != nil) {
239
+ recognizer.numberOfTouchesRequired = [RCTConvert CGFloat:prop];
240
+ }
241
+ #endif
149
242
  }
150
243
 
244
+ #if !TARGET_OS_OSX
245
+
151
246
  - (RNGestureHandlerState)state
152
247
  {
153
248
  // For long press recognizer we treat "Began" state as "active"
@@ -178,21 +273,17 @@
178
273
  withDuration:[(RNBetterLongPressGestureRecognizer *)recognizer getDuration]
179
274
  withPointerType:_pointerType];
180
275
  }
181
- @end
182
276
 
183
277
  #else
184
278
 
185
- @implementation RNLongPressGestureHandler
186
-
187
- - (instancetype)initWithTag:(NSNumber *)tag
279
+ - (RNGestureHandlerEventExtraData *)eventExtraData:(NSGestureRecognizer *)recognizer
188
280
  {
189
- RCTLogWarn(@"LongPressGestureHandler is not supported on macOS");
190
- if ((self = [super initWithTag:tag])) {
191
- _recognizer = [NSGestureRecognizer alloc];
192
- }
193
- return self;
281
+ return [RNGestureHandlerEventExtraData forPosition:[recognizer locationInView:recognizer.view]
282
+ withAbsolutePosition:[recognizer locationInView:recognizer.view.window.contentView]
283
+ withNumberOfTouches:1
284
+ withDuration:[(RNBetterLongPressGestureRecognizer *)recognizer getDuration]
285
+ withPointerType:RNGestureHandlerMouse];
194
286
  }
195
287
 
196
- @end
197
-
198
288
  #endif
289
+ @end