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.
- 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
|
}
|