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.
- package/DrawerLayout.js +5 -4
- package/GestureButtons.js +166 -0
- package/GestureComponents.js +63 -0
- package/GestureComponents.web.js +35 -0
- package/GestureHandler.js +10 -621
- package/GestureHandlerButton.web.js +4 -12
- package/GestureHandlerPropTypes.js +45 -0
- package/Gestures.js +278 -0
- package/NativeViewGestureHandler.js +14 -0
- package/PlatformConstants.web.js +3 -1
- package/RNGestureHandler.podspec +1 -1
- package/RNGestureHandlerModule.web.js +49 -0
- package/State.js +12 -1
- package/Swipeable.js +6 -11
- package/android/build.gradle +3 -7
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerOrchestrator.java +1 -1
- package/android/lib/src/main/java/com/swmansion/gesturehandler/PanGestureHandler.java +1 -1
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEnabledRootView.java +1 -1
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEvent.java +2 -2
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.java +1 -1
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerPackage.java +1 -1
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRegistry.java +1 -1
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootInterface.java +1 -1
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootView.java +1 -1
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootViewManager.java +1 -1
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerStateChangeEvent.java +2 -2
- package/createHandler.js +46 -20
- package/createNativeWrapper.js +86 -0
- package/ios/RNGestureHandler.xcodeproj/project.pbxproj +4 -4
- package/package.json +20 -17
- package/react-native-gesture-handler.d.ts +25 -3
- package/touchables/GenericTouchable.js +3 -1
- package/touchables/TouchableHighlight.js +1 -3
- package/touchables/TouchableOpacity.web.js +2 -0
- package/touchables/TouchableWithoutFeedback.js +4 -2
- package/web/DiscreteGestureHandler.js +66 -0
- package/web/DraggingGestureHandler.js +22 -0
- package/web/Errors.js +5 -0
- package/web/FlingGestureHandler.js +137 -0
- package/web/GestureHandler.js +442 -0
- package/web/IndiscreteGestureHandler.js +33 -0
- package/web/LongPressGestureHandler.js +50 -0
- package/web/NativeViewGestureHandler.js +38 -0
- package/web/NodeManager.js +24 -0
- package/web/PanGestureHandler.js +213 -0
- package/web/PinchGestureHandler.js +24 -0
- package/web/PressGestureHandler.js +147 -0
- package/web/RotationGestureHandler.js +24 -0
- package/web/TapGestureHandler.js +160 -0
- package/web/constants.js +48 -0
- package/web/utils.js +14 -0
- package/Directions.web.js +0 -6
- package/Swipeable.web.js +0 -4
- 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;
|
package/PlatformConstants.web.js
CHANGED
package/RNGestureHandler.podspec
CHANGED
@@ -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 => "
|
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
|
-
|
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
|
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
|
-
|
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
|
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>
|
package/android/build.gradle
CHANGED
@@ -5,17 +5,13 @@ def safeExtGet(prop, fallback) {
|
|
5
5
|
}
|
6
6
|
|
7
7
|
android {
|
8
|
-
compileSdkVersion safeExtGet("compileSdkVersion",
|
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',
|
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
|
-
|
27
|
+
implementation 'com.facebook.react:react-native:+'
|
32
28
|
}
|
@@ -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
|
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
|
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
|
11
|
+
import androidx.annotation.Nullable;
|
12
12
|
|
13
13
|
public class RNGestureHandlerEvent extends Event<RNGestureHandlerEvent> {
|
14
14
|
|
package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootView.java
CHANGED
@@ -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
|
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
|
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
|
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
|
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 {
|
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
|
-
|
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
|
-
//
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
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
|
}
|