react-native-gesture-handler 1.2.1 → 1.4.1

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