react-native-gesture-handler 2.18.1 → 2.20.0

Sign up to get free protection for your applications and to get access to all the features.
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