react-native-gesture-handler 1.2.1 → 1.4.1

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 (54) hide show
  1. package/DrawerLayout.js +5 -4
  2. package/GestureButtons.js +166 -0
  3. package/GestureComponents.js +63 -0
  4. package/GestureComponents.web.js +35 -0
  5. package/GestureHandler.js +10 -621
  6. package/GestureHandlerButton.web.js +4 -12
  7. package/GestureHandlerPropTypes.js +45 -0
  8. package/Gestures.js +278 -0
  9. package/NativeViewGestureHandler.js +14 -0
  10. package/PlatformConstants.web.js +3 -1
  11. package/RNGestureHandler.podspec +1 -1
  12. package/RNGestureHandlerModule.web.js +49 -0
  13. package/State.js +12 -1
  14. package/Swipeable.js +6 -11
  15. package/android/build.gradle +3 -7
  16. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerOrchestrator.java +1 -1
  17. package/android/lib/src/main/java/com/swmansion/gesturehandler/PanGestureHandler.java +1 -1
  18. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEnabledRootView.java +1 -1
  19. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEvent.java +2 -2
  20. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.java +1 -1
  21. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerPackage.java +1 -1
  22. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRegistry.java +1 -1
  23. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootInterface.java +1 -1
  24. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootView.java +1 -1
  25. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootViewManager.java +1 -1
  26. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerStateChangeEvent.java +2 -2
  27. package/createHandler.js +46 -20
  28. package/createNativeWrapper.js +86 -0
  29. package/ios/RNGestureHandler.xcodeproj/project.pbxproj +4 -4
  30. package/package.json +20 -17
  31. package/react-native-gesture-handler.d.ts +25 -3
  32. package/touchables/GenericTouchable.js +3 -1
  33. package/touchables/TouchableHighlight.js +1 -3
  34. package/touchables/TouchableOpacity.web.js +2 -0
  35. package/touchables/TouchableWithoutFeedback.js +4 -2
  36. package/web/DiscreteGestureHandler.js +66 -0
  37. package/web/DraggingGestureHandler.js +22 -0
  38. package/web/Errors.js +5 -0
  39. package/web/FlingGestureHandler.js +137 -0
  40. package/web/GestureHandler.js +442 -0
  41. package/web/IndiscreteGestureHandler.js +33 -0
  42. package/web/LongPressGestureHandler.js +50 -0
  43. package/web/NativeViewGestureHandler.js +38 -0
  44. package/web/NodeManager.js +24 -0
  45. package/web/PanGestureHandler.js +213 -0
  46. package/web/PinchGestureHandler.js +24 -0
  47. package/web/PressGestureHandler.js +147 -0
  48. package/web/RotationGestureHandler.js +24 -0
  49. package/web/TapGestureHandler.js +160 -0
  50. package/web/constants.js +48 -0
  51. package/web/utils.js +14 -0
  52. package/Directions.web.js +0 -6
  53. package/Swipeable.web.js +0 -4
  54. package/createHandler.web.js +0 -205
package/Gestures.js ADDED
@@ -0,0 +1,278 @@
1
+ import PropTypes from 'prop-types';
2
+ import React from 'react';
3
+
4
+ import createHandler from './createHandler';
5
+ import GestureHandlerPropTypes from './GestureHandlerPropTypes';
6
+ import PlatformConstants from './PlatformConstants';
7
+
8
+ export const TapGestureHandler = createHandler(
9
+ 'TapGestureHandler',
10
+ {
11
+ ...GestureHandlerPropTypes,
12
+ maxDurationMs: PropTypes.number,
13
+ maxDelayMs: PropTypes.number,
14
+ numberOfTaps: PropTypes.number,
15
+ maxDeltaX: PropTypes.number,
16
+ maxDeltaY: PropTypes.number,
17
+ maxDist: PropTypes.number,
18
+ minPointers: PropTypes.number,
19
+ },
20
+ {}
21
+ );
22
+
23
+ export const FlingGestureHandler = createHandler(
24
+ 'FlingGestureHandler',
25
+ {
26
+ ...GestureHandlerPropTypes,
27
+ numberOfPointers: PropTypes.number,
28
+ direction: PropTypes.number,
29
+ },
30
+ {}
31
+ );
32
+
33
+ class ForceTouchFallback extends React.Component {
34
+ componentDidMount() {
35
+ console.warn(
36
+ 'ForceTouchGestureHandler is not available on this platform. Please use ForceTouchGestureHandler.forceTouchAvailable to conditionally render other components that would provide a fallback behavior specific to your usecase'
37
+ );
38
+ }
39
+ render() {
40
+ return this.props.children;
41
+ }
42
+ }
43
+
44
+ export const ForceTouchGestureHandler =
45
+ PlatformConstants && PlatformConstants.forceTouchAvailable
46
+ ? createHandler(
47
+ 'ForceTouchGestureHandler',
48
+ {
49
+ ...GestureHandlerPropTypes,
50
+ minForce: PropTypes.number,
51
+ maxForce: PropTypes.number,
52
+ feedbackOnActivation: PropTypes.bool,
53
+ },
54
+ {}
55
+ )
56
+ : ForceTouchFallback;
57
+
58
+ ForceTouchGestureHandler.forceTouchAvailable =
59
+ (PlatformConstants && PlatformConstants.forceTouchAvailable) || false;
60
+
61
+ export const LongPressGestureHandler = createHandler(
62
+ 'LongPressGestureHandler',
63
+ {
64
+ ...GestureHandlerPropTypes,
65
+ minDurationMs: PropTypes.number,
66
+ maxDist: PropTypes.number,
67
+ },
68
+ {}
69
+ );
70
+
71
+ function validatePanGestureHandlerProps(props) {
72
+ if (props.minDeltaX && props.activeOffsetX) {
73
+ throw new Error(
74
+ `It's not supported use minDeltaX with activeOffsetXStart or activeOffsetXEnd`
75
+ );
76
+ }
77
+ if (props.maxDeltaX && props.failOffsetX) {
78
+ throw new Error(
79
+ `It's not supported use minDeltaX with activeOffsetXStart or activeOffsetXEnd`
80
+ );
81
+ }
82
+ if (props.minDeltaY && props.activeOffsetY) {
83
+ throw new Error(
84
+ `It's not supported use minDeltaX with activeOffsetYStart or activeOffsetYEnd`
85
+ );
86
+ }
87
+ if (props.maxDeltaY && props.failOffsetY) {
88
+ throw new Error(
89
+ `It's not supported use minDeltaX with activeOffsetYStart or activeOffsetYEnd`
90
+ );
91
+ }
92
+ if (
93
+ Array.isArray(props.activeOffsetX) &&
94
+ (props.activeOffsetX[0] > 0 || props.activeOffsetX[1] < 0)
95
+ ) {
96
+ throw new Error(
97
+ `First element of activeOffsetX should be negative, a the second one should be positive`
98
+ );
99
+ }
100
+
101
+ if (
102
+ Array.isArray(props.activeOffsetY) &&
103
+ (props.activeOffsetY[0] > 0 || props.activeOffsetY[1] < 0)
104
+ ) {
105
+ throw new Error(
106
+ `First element of activeOffsetY should be negative, a the second one should be positive`
107
+ );
108
+ }
109
+
110
+ if (
111
+ Array.isArray(props.failOffsetX) &&
112
+ (props.failOffsetX[0] > 0 || props.failOffsetX[1] < 0)
113
+ ) {
114
+ throw new Error(
115
+ `First element of failOffsetX should be negative, a the second one should be positive`
116
+ );
117
+ }
118
+
119
+ if (
120
+ Array.isArray(props.failOffsetY) &&
121
+ (props.failOffsetY[0] > 0 || props.failOffsetY[1] < 0)
122
+ ) {
123
+ throw new Error(
124
+ `First element of failOffsetY should be negative, a the second one should be positive`
125
+ );
126
+ }
127
+ }
128
+
129
+ function transformPanGestureHandlerProps(props) {
130
+ const res = { ...props };
131
+ if (props.minDeltaX !== undefined) {
132
+ delete res['minDeltaX'];
133
+ res.activeOffsetXStart = -props.minDeltaX;
134
+ res.activeOffsetXEnd = props.minDeltaX;
135
+ }
136
+ if (props.maxDeltaX !== undefined) {
137
+ delete res['maxDeltaX'];
138
+ res.failOffsetXStart = -props.maxDeltaX;
139
+ res.failOffsetXEnd = props.maxDeltaX;
140
+ }
141
+ if (props.minOffsetX !== undefined) {
142
+ delete res['minOffsetX'];
143
+ if (props.minOffsetX < 0) {
144
+ res.activeOffsetXStart = props.minOffsetX;
145
+ } else {
146
+ res.activeOffsetXEnd = props.minOffsetX;
147
+ }
148
+ }
149
+
150
+ if (props.minDeltaY !== undefined) {
151
+ delete res['minDeltaY'];
152
+ res.activeOffsetYStart = -props.minDeltaY;
153
+ res.activeOffsetYEnd = props.minDeltaY;
154
+ }
155
+ if (props.maxDeltaY !== undefined) {
156
+ delete res['maxDeltaY'];
157
+ res.failOffsetYStart = -props.maxDeltaY;
158
+ res.failOffsetYEnd = props.maxDeltaY;
159
+ }
160
+
161
+ if (props.minOffsetY !== undefined) {
162
+ delete res['minOffsetY'];
163
+ if (props.minOffsetY < 0) {
164
+ res.activeOffsetYStart = props.minOffsetY;
165
+ } else {
166
+ res.activeOffsetYEnd = props.minOffsetY;
167
+ }
168
+ }
169
+
170
+ if (props.activeOffsetX !== undefined) {
171
+ delete res['activeOffsetX'];
172
+ if (Array.isArray(props.activeOffsetX)) {
173
+ res.activeOffsetXStart = props.activeOffsetX[0];
174
+ res.activeOffsetXEnd = props.activeOffsetX[1];
175
+ } else if (props.activeOffsetX < 0) {
176
+ res.activeOffsetXStart = props.activeOffsetX;
177
+ } else {
178
+ res.activeOffsetXEnd = props.activeOffsetX;
179
+ }
180
+ }
181
+
182
+ if (props.activeOffsetY !== undefined) {
183
+ delete res['activeOffsetY'];
184
+ if (Array.isArray(props.activeOffsetY)) {
185
+ res.activeOffsetYStart = props.activeOffsetY[0];
186
+ res.activeOffsetYEnd = props.activeOffsetY[1];
187
+ } else if (props.activeOffsetY < 0) {
188
+ res.activeOffsetYStart = props.activeOffsetY;
189
+ } else {
190
+ res.activeOffsetYEnd = props.activeOffsetY;
191
+ }
192
+ }
193
+
194
+ if (props.failOffsetX !== undefined) {
195
+ delete res['failOffsetX'];
196
+ if (Array.isArray(props.failOffsetX)) {
197
+ res.failOffsetXStart = props.failOffsetX[0];
198
+ res.failOffsetXEnd = props.failOffsetX[1];
199
+ } else if (props.failOffsetX < 0) {
200
+ res.failOffsetXStart = props.failOffsetX;
201
+ } else {
202
+ res.failOffsetXEnd = props.failOffsetX;
203
+ }
204
+ }
205
+
206
+ if (props.failOffsetY !== undefined) {
207
+ delete res['failOffsetY'];
208
+ if (Array.isArray(props.failOffsetY)) {
209
+ res.failOffsetYStart = props.failOffsetY[0];
210
+ res.failOffsetYEnd = props.failOffsetY[1];
211
+ } else if (props.failOffsetY < 0) {
212
+ res.failOffsetYStart = props.failOffsetY;
213
+ } else {
214
+ res.failOffsetYEnd = props.failOffsetY;
215
+ }
216
+ }
217
+
218
+ return res;
219
+ }
220
+
221
+ function managePanProps(props) {
222
+ if (__DEV__) {
223
+ validatePanGestureHandlerProps(props);
224
+ }
225
+ return transformPanGestureHandlerProps(props);
226
+ }
227
+
228
+ export const PanGestureHandler = createHandler(
229
+ 'PanGestureHandler',
230
+ {
231
+ ...GestureHandlerPropTypes,
232
+ activeOffsetY: PropTypes.oneOfType([
233
+ PropTypes.number,
234
+ PropTypes.arrayOf(PropTypes.number),
235
+ ]),
236
+ activeOffsetX: PropTypes.oneOfType([
237
+ PropTypes.number,
238
+ PropTypes.arrayOf(PropTypes.number),
239
+ ]),
240
+ failOffsetY: PropTypes.oneOfType([
241
+ PropTypes.number,
242
+ PropTypes.arrayOf(PropTypes.number),
243
+ ]),
244
+ failOffsetX: PropTypes.oneOfType([
245
+ PropTypes.number,
246
+ PropTypes.arrayOf(PropTypes.number),
247
+ ]),
248
+ minDist: PropTypes.number,
249
+ minVelocity: PropTypes.number,
250
+ minVelocityX: PropTypes.number,
251
+ minVelocityY: PropTypes.number,
252
+ minPointers: PropTypes.number,
253
+ maxPointers: PropTypes.number,
254
+ avgTouches: PropTypes.bool,
255
+ },
256
+ {},
257
+ managePanProps,
258
+ {
259
+ activeOffsetYStart: true,
260
+ activeOffsetYEnd: true,
261
+ activeOffsetXStart: true,
262
+ activeOffsetXEnd: true,
263
+ failOffsetYStart: true,
264
+ failOffsetYEnd: true,
265
+ failOffsetXStart: true,
266
+ failOffsetXEnd: true,
267
+ }
268
+ );
269
+ export const PinchGestureHandler = createHandler(
270
+ 'PinchGestureHandler',
271
+ GestureHandlerPropTypes,
272
+ {}
273
+ );
274
+ export const RotationGestureHandler = createHandler(
275
+ 'RotationGestureHandler',
276
+ GestureHandlerPropTypes,
277
+ {}
278
+ );
@@ -0,0 +1,14 @@
1
+ import PropTypes from 'prop-types';
2
+
3
+ import createHandler from './createHandler';
4
+ import GestureHandlerPropTypes from './GestureHandlerPropTypes';
5
+
6
+ const NativeViewGestureHandler = createHandler('NativeViewGestureHandler', {
7
+ ...GestureHandlerPropTypes,
8
+
9
+ // If changed, add changes to NATIVE_WRAPPER_PROPS_FILTER as well
10
+ shouldActivateOnStart: PropTypes.bool,
11
+ disallowInterruption: PropTypes.bool,
12
+ });
13
+
14
+ export default NativeViewGestureHandler;
@@ -1,3 +1,5 @@
1
1
  export default {
2
- forceTouchAvailable: false,
2
+ get forceTouchAvailable() {
3
+ return false;
4
+ },
3
5
  };
@@ -10,7 +10,7 @@ Pod::Spec.new do |s|
10
10
  s.homepage = "https://github.com/kmagiera/react-native-gesture-handler"
11
11
  s.license = "MIT"
12
12
  s.author = { package["author"]["name"] => package["author"]["email"] }
13
- s.platforms = { :ios => "7.0", :tvos => "9.0" }
13
+ s.platforms = { :ios => "9.0", :tvos => "9.0" }
14
14
  s.source = { :git => "https://github.com/kmagiera/react-native-gesture-handler", :tag => "#{s.version}" }
15
15
  s.source_files = "ios/**/*.{h,m}"
16
16
 
@@ -0,0 +1,49 @@
1
+ import { Direction } from './web/constants';
2
+ import FlingGestureHandler from './web/FlingGestureHandler';
3
+ import LongPressGestureHandler from './web/LongPressGestureHandler';
4
+ import NativeViewGestureHandler from './web/NativeViewGestureHandler';
5
+ import * as NodeManager from './web/NodeManager';
6
+ import PanGestureHandler from './web/PanGestureHandler';
7
+ import PinchGestureHandler from './web/PinchGestureHandler';
8
+ import RotationGestureHandler from './web/RotationGestureHandler';
9
+ import TapGestureHandler from './web/TapGestureHandler';
10
+
11
+ const Gestures = {
12
+ PanGestureHandler,
13
+ RotationGestureHandler,
14
+ PinchGestureHandler,
15
+ TapGestureHandler,
16
+ NativeViewGestureHandler,
17
+ LongPressGestureHandler,
18
+ FlingGestureHandler,
19
+ // ForceTouchGestureHandler,
20
+ };
21
+
22
+ export default {
23
+ Direction,
24
+ handleSetJSResponder(tag, blockNativeResponder) {
25
+ console.warn('handleSetJSResponder: ', tag, blockNativeResponder);
26
+ },
27
+ handleClearJSResponder() {
28
+ console.warn('handleClearJSResponder: ');
29
+ },
30
+ createGestureHandler(handlerName, handlerTag, config) {
31
+ if (!(handlerName in Gestures))
32
+ throw new Error(`react-native-gesture-handler: ${handlerName} is not supported on web.`);
33
+ const GestureClass = Gestures[handlerName];
34
+ NodeManager.createGestureHandler(handlerTag, new GestureClass());
35
+ this.updateGestureHandler(handlerTag, config);
36
+ },
37
+ attachGestureHandler(handlerTag, newView) {
38
+ NodeManager.getHandler(handlerTag).setView(newView);
39
+ },
40
+ updateGestureHandler(handlerTag, newConfig) {
41
+ NodeManager.getHandler(handlerTag).updateGestureConfig(newConfig);
42
+ },
43
+ getGestureHandlerNode(handlerTag) {
44
+ return NodeManager.getHandler(handlerTag);
45
+ },
46
+ dropGestureHandler(handlerTag) {
47
+ NodeManager.dropGestureHandler(handlerTag);
48
+ },
49
+ };
package/State.js CHANGED
@@ -1,4 +1,4 @@
1
- export default {
1
+ const State = {
2
2
  UNDETERMINED: 0,
3
3
  FAILED: 1,
4
4
  BEGAN: 2,
@@ -6,3 +6,14 @@ export default {
6
6
  ACTIVE: 4,
7
7
  END: 5,
8
8
  };
9
+
10
+ State.print = state => {
11
+ const keys = Object.keys(State);
12
+ for (let i = 0; i < keys.length; i++) {
13
+ if (state === State[keys[i]]) {
14
+ return keys[i];
15
+ }
16
+ }
17
+ };
18
+
19
+ export default State;
package/Swipeable.js CHANGED
@@ -11,13 +11,6 @@ import { PanGestureHandler, TapGestureHandler, State } from './GestureHandler';
11
11
 
12
12
  const DRAG_TOSS = 0.05;
13
13
 
14
- // Math.sign polyfill for iOS 8.x
15
- if (!Math.sign) {
16
- Math.sign = function(x) {
17
- return Number(x > 0) - Number(x < 0) || +x;
18
- };
19
- }
20
-
21
14
  export type PropType = {
22
15
  children: any,
23
16
  friction: number,
@@ -25,7 +18,7 @@ export type PropType = {
25
18
  rightThreshold?: number,
26
19
  overshootLeft?: boolean,
27
20
  overshootRight?: boolean,
28
- overshootFriction?: number,
21
+ overshootFriction: number,
29
22
  onSwipeableLeftOpen?: Function,
30
23
  onSwipeableRightOpen?: Function,
31
24
  onSwipeableOpen?: Function,
@@ -88,7 +81,7 @@ export default class Swipeable extends Component<PropType, StateType> {
88
81
  );
89
82
  }
90
83
 
91
- componentWillUpdate(props: PropType, state: StateType) {
84
+ UNSAFE_componentWillUpdate(props: PropType, state: StateType) {
92
85
  if (
93
86
  this.props.friction !== props.friction ||
94
87
  this.props.overshootLeft !== props.overshootLeft ||
@@ -322,7 +315,9 @@ export default class Swipeable extends Component<PropType, StateType> {
322
315
  minDeltaX={10}
323
316
  onGestureEvent={this._onGestureEvent}
324
317
  onHandlerStateChange={this._onHandlerStateChange}>
325
- <Animated.View onLayout={this._onRowLayout} style={[styles.container, this.props.containerStyle]}>
318
+ <Animated.View
319
+ onLayout={this._onRowLayout}
320
+ style={[styles.container, this.props.containerStyle]}>
326
321
  {left}
327
322
  {right}
328
323
  <TapGestureHandler
@@ -334,7 +329,7 @@ export default class Swipeable extends Component<PropType, StateType> {
334
329
  {
335
330
  transform: [{ translateX: this._transX }],
336
331
  },
337
- this.props.childrenContainerStyle
332
+ this.props.childrenContainerStyle,
338
333
  ]}>
339
334
  {children}
340
335
  </Animated.View>
@@ -5,17 +5,13 @@ def safeExtGet(prop, fallback) {
5
5
  }
6
6
 
7
7
  android {
8
- compileSdkVersion safeExtGet("compileSdkVersion", 25)
9
- buildToolsVersion safeExtGet("buildToolsVersion", '25.0.2')
8
+ compileSdkVersion safeExtGet("compileSdkVersion", 28)
10
9
 
11
10
  defaultConfig {
12
11
  minSdkVersion safeExtGet('minSdkVersion', 16)
13
- targetSdkVersion safeExtGet('targetSdkVersion', 25)
12
+ targetSdkVersion safeExtGet('targetSdkVersion', 28)
14
13
  versionCode 1
15
14
  versionName "1.0"
16
- ndk {
17
- abiFilters "armeabi-v7a", "x86"
18
- }
19
15
  }
20
16
 
21
17
  // Include "lib/" as sources, unfortunetely react-native link can't handle
@@ -28,5 +24,5 @@ android {
28
24
 
29
25
  dependencies {
30
26
  //noinspection GradleDynamicVersion
31
- compileOnly 'com.facebook.react:react-native:+'
27
+ implementation 'com.facebook.react:react-native:+'
32
28
  }
@@ -11,7 +11,7 @@ import java.util.ArrayList;
11
11
  import java.util.Arrays;
12
12
  import java.util.Comparator;
13
13
 
14
- import javax.annotation.Nullable;
14
+ import androidx.annotation.Nullable;
15
15
 
16
16
  public class GestureHandlerOrchestrator {
17
17
 
@@ -241,7 +241,7 @@ public class PanGestureHandler extends GestureHandler<PanGestureHandler> {
241
241
  }
242
242
 
243
243
  if (action == MotionEvent.ACTION_UP) {
244
- if (state == STATE_ACTIVE) {
244
+ if (state == STATE_ACTIVE || state == STATE_BEGAN) {
245
245
  end();
246
246
  } else {
247
247
  fail();
@@ -7,7 +7,7 @@ import android.view.MotionEvent;
7
7
  import com.facebook.react.ReactInstanceManager;
8
8
  import com.facebook.react.ReactRootView;
9
9
 
10
- import javax.annotation.Nullable;
10
+ import androidx.annotation.Nullable;
11
11
 
12
12
  public class RNGestureHandlerEnabledRootView extends ReactRootView {
13
13
 
@@ -1,6 +1,6 @@
1
1
  package com.swmansion.gesturehandler.react;
2
2
 
3
- import android.support.v4.util.Pools;
3
+ import androidx.core.util.Pools;
4
4
 
5
5
  import com.facebook.react.bridge.Arguments;
6
6
  import com.facebook.react.bridge.WritableMap;
@@ -8,7 +8,7 @@ import com.facebook.react.uimanager.events.Event;
8
8
  import com.facebook.react.uimanager.events.RCTEventEmitter;
9
9
  import com.swmansion.gesturehandler.GestureHandler;
10
10
 
11
- import javax.annotation.Nullable;
11
+ import androidx.annotation.Nullable;
12
12
 
13
13
  public class RNGestureHandlerEvent extends Event<RNGestureHandlerEvent> {
14
14
 
@@ -33,7 +33,7 @@ import java.util.ArrayList;
33
33
  import java.util.List;
34
34
  import java.util.Map;
35
35
 
36
- import javax.annotation.Nullable;
36
+ import androidx.annotation.Nullable;
37
37
 
38
38
  import static com.swmansion.gesturehandler.GestureHandler.HIT_SLOP_NONE;
39
39
 
@@ -13,7 +13,7 @@ import java.util.Arrays;
13
13
  import java.util.List;
14
14
  import java.util.Map;
15
15
 
16
- import javax.annotation.Nullable;
16
+ import androidx.annotation.Nullable;
17
17
 
18
18
  public class RNGestureHandlerPackage implements ReactPackage {
19
19
 
@@ -8,7 +8,7 @@ import com.swmansion.gesturehandler.GestureHandlerRegistry;
8
8
 
9
9
  import java.util.ArrayList;
10
10
 
11
- import javax.annotation.Nullable;
11
+ import androidx.annotation.Nullable;
12
12
 
13
13
  public class RNGestureHandlerRegistry implements GestureHandlerRegistry {
14
14
 
@@ -1,6 +1,6 @@
1
1
  package com.swmansion.gesturehandler.react;
2
2
 
3
- import javax.annotation.Nullable;
3
+ import androidx.annotation.Nullable;
4
4
 
5
5
  public interface RNGestureHandlerRootInterface {
6
6
  @Nullable RNGestureHandlerRootHelper getRootHelper();
@@ -7,7 +7,7 @@ import com.facebook.infer.annotation.Assertions;
7
7
  import com.facebook.react.bridge.ReactContext;
8
8
  import com.facebook.react.views.view.ReactViewGroup;
9
9
 
10
- import javax.annotation.Nullable;
10
+ import androidx.annotation.Nullable;
11
11
 
12
12
  public class RNGestureHandlerRootView extends ReactViewGroup {
13
13
 
@@ -7,7 +7,7 @@ import com.facebook.react.uimanager.ViewGroupManager;
7
7
 
8
8
  import java.util.Map;
9
9
 
10
- import javax.annotation.Nullable;
10
+ import androidx.annotation.Nullable;
11
11
 
12
12
  /**
13
13
  * React native's view manager used for creating instances of {@link }RNGestureHandlerRootView}. It
@@ -1,6 +1,6 @@
1
1
  package com.swmansion.gesturehandler.react;
2
2
 
3
- import android.support.v4.util.Pools;
3
+ import androidx.core.util.Pools;
4
4
 
5
5
  import com.facebook.react.bridge.Arguments;
6
6
  import com.facebook.react.bridge.WritableMap;
@@ -8,7 +8,7 @@ import com.facebook.react.uimanager.events.Event;
8
8
  import com.facebook.react.uimanager.events.RCTEventEmitter;
9
9
  import com.swmansion.gesturehandler.GestureHandler;
10
10
 
11
- import javax.annotation.Nullable;
11
+ import androidx.annotation.Nullable;
12
12
 
13
13
  public class RNGestureHandlerStateChangeEvent extends Event<RNGestureHandlerStateChangeEvent>{
14
14
 
package/createHandler.js CHANGED
@@ -1,16 +1,42 @@
1
1
  import React from 'react';
2
- import { findNodeHandle, NativeModules, Touchable } from 'react-native';
2
+ import {
3
+ findNodeHandle as findNodeHandleRN,
4
+ NativeModules,
5
+ Touchable,
6
+ Platform,
7
+ } from 'react-native';
3
8
  import deepEqual from 'fbjs/lib/areEqual';
4
9
  import RNGestureHandlerModule from './RNGestureHandlerModule';
5
-
6
10
  import State from './State';
7
11
 
8
- const { UIManager } = NativeModules;
12
+ function findNodeHandle(node) {
13
+ if (Platform.OS === 'web') return node;
14
+ return findNodeHandleRN(node);
15
+ }
16
+
17
+ const { UIManager = {} } = NativeModules;
18
+
19
+ const customGHEventsConfig = {
20
+ onGestureHandlerEvent: { registrationName: 'onGestureHandlerEvent' },
21
+ onGestureHandlerStateChange: {
22
+ registrationName: 'onGestureHandlerStateChange',
23
+ },
24
+ };
25
+
26
+ // Add gesture specific events to genericDirectEventTypes object exported from UIManager
27
+ // native module.
28
+ // Once new event types are registered with react it is possible to dispatch these
29
+ // events to all kind of native views.
30
+ UIManager.genericDirectEventTypes = {
31
+ ...UIManager.genericDirectEventTypes,
32
+ ...customGHEventsConfig,
33
+ };
9
34
 
10
35
  // Wrap JS responder calls and notify gesture handler manager
11
36
  const {
12
- setJSResponder: oldSetJSResponder,
13
- clearJSResponder: oldClearJSResponder,
37
+ setJSResponder: oldSetJSResponder = () => {},
38
+ clearJSResponder: oldClearJSResponder = () => {},
39
+ getConstants: oldGetConstants = () => ({}),
14
40
  } = UIManager;
15
41
  UIManager.setJSResponder = (tag, blockNativeResponder) => {
16
42
  RNGestureHandlerModule.handleSetJSResponder(tag, blockNativeResponder);
@@ -20,17 +46,17 @@ UIManager.clearJSResponder = () => {
20
46
  RNGestureHandlerModule.handleClearJSResponder();
21
47
  oldClearJSResponder();
22
48
  };
23
-
24
- // Add gesture specific events to genericDirectEventTypes object exported from UIManager
25
- // native module.
26
- // Once new event types are registered with react it is possible to dispatch these
27
- // events to all kind of native views.
28
- UIManager.genericDirectEventTypes = {
29
- ...UIManager.genericDirectEventTypes,
30
- onGestureHandlerEvent: { registrationName: 'onGestureHandlerEvent' },
31
- onGestureHandlerStateChange: {
32
- registrationName: 'onGestureHandlerStateChange',
33
- },
49
+ // We also add GH specific events to the constants object returned by
50
+ // UIManager.getConstants to make it work with the newest version of RN
51
+ UIManager.getConstants = () => {
52
+ const constants = oldGetConstants();
53
+ return {
54
+ ...constants,
55
+ genericDirectEventTypes: {
56
+ ...constants.genericDirectEventTypes,
57
+ ...customGHEventsConfig,
58
+ },
59
+ };
34
60
  };
35
61
 
36
62
  let handlerTag = 1;
@@ -71,6 +97,9 @@ function transformIntoHandlerTags(handlerIDs) {
71
97
  handlerIDs = [handlerIDs];
72
98
  }
73
99
 
100
+ if (Platform.OS === 'web') {
101
+ return handlerIDs.map(({ current }) => current).filter(handle => handle);
102
+ }
74
103
  // converts handler string IDs into their numeric tags
75
104
  return handlerIDs
76
105
  .map(
@@ -184,11 +213,8 @@ export default function createHandler(
184
213
  RNGestureHandlerModule.updateGestureHandler(this._handlerTag, newConfig);
185
214
  };
186
215
 
187
- _dropGestureHandler = () => {
188
- RNGestureHandlerModule.dropGestureHandler(this._handlerTag);
189
- };
190
-
191
216
  componentWillUnmount() {
217
+ RNGestureHandlerModule.dropGestureHandler(this._handlerTag);
192
218
  if (this._updateEnqueued) {
193
219
  clearImmediate(this._updateEnqueued);
194
220
  }