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/GestureHandler.js
CHANGED
@@ -1,622 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
ScrollView,
|
5
|
-
Switch,
|
6
|
-
TextInput,
|
7
|
-
ToolbarAndroid,
|
8
|
-
DrawerLayoutAndroid,
|
9
|
-
StyleSheet,
|
10
|
-
FlatList,
|
11
|
-
Platform,
|
12
|
-
processColor,
|
13
|
-
} from 'react-native';
|
14
|
-
import PropTypes from 'prop-types';
|
15
|
-
|
16
|
-
import createHandler from './createHandler';
|
17
|
-
import GestureHandlerButton from './GestureHandlerButton';
|
18
|
-
import gestureHandlerRootHOC from './gestureHandlerRootHOC';
|
19
|
-
|
20
|
-
import Directions from './Directions';
|
21
|
-
import State from './State';
|
22
|
-
import PlatformConstants from './PlatformConstants';
|
23
|
-
|
24
|
-
const GestureHandlerPropTypes = {
|
25
|
-
id: PropTypes.string,
|
26
|
-
minPointers: PropTypes.number,
|
27
|
-
enabled: PropTypes.bool,
|
28
|
-
waitFor: PropTypes.oneOfType([
|
29
|
-
PropTypes.string,
|
30
|
-
PropTypes.object,
|
31
|
-
PropTypes.arrayOf(
|
32
|
-
PropTypes.oneOfType([PropTypes.string, PropTypes.object])
|
33
|
-
),
|
34
|
-
]),
|
35
|
-
simultaneousHandlers: PropTypes.oneOfType([
|
36
|
-
PropTypes.string,
|
37
|
-
PropTypes.object,
|
38
|
-
PropTypes.arrayOf(
|
39
|
-
PropTypes.oneOfType([PropTypes.string, PropTypes.object])
|
40
|
-
),
|
41
|
-
]),
|
42
|
-
shouldCancelWhenOutside: PropTypes.bool,
|
43
|
-
hitSlop: PropTypes.oneOfType([
|
44
|
-
PropTypes.number,
|
45
|
-
PropTypes.shape({
|
46
|
-
left: PropTypes.number,
|
47
|
-
top: PropTypes.number,
|
48
|
-
right: PropTypes.number,
|
49
|
-
bottom: PropTypes.number,
|
50
|
-
vertical: PropTypes.number,
|
51
|
-
horizontal: PropTypes.number,
|
52
|
-
width: PropTypes.number,
|
53
|
-
height: PropTypes.number,
|
54
|
-
}),
|
55
|
-
]),
|
56
|
-
onGestureEvent: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),
|
57
|
-
onHandlerStateChange: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),
|
58
|
-
onBegan: PropTypes.func,
|
59
|
-
onFailed: PropTypes.func,
|
60
|
-
onCancelled: PropTypes.func,
|
61
|
-
onActivated: PropTypes.func,
|
62
|
-
onEnded: PropTypes.func,
|
63
|
-
};
|
64
|
-
|
65
|
-
const NativeViewGestureHandler = createHandler('NativeViewGestureHandler', {
|
66
|
-
...GestureHandlerPropTypes,
|
67
|
-
shouldActivateOnStart: PropTypes.bool,
|
68
|
-
disallowInterruption: PropTypes.bool,
|
69
|
-
});
|
70
|
-
const TapGestureHandler = createHandler(
|
71
|
-
'TapGestureHandler',
|
72
|
-
{
|
73
|
-
...GestureHandlerPropTypes,
|
74
|
-
maxDurationMs: PropTypes.number,
|
75
|
-
maxDelayMs: PropTypes.number,
|
76
|
-
numberOfTaps: PropTypes.number,
|
77
|
-
maxDeltaX: PropTypes.number,
|
78
|
-
maxDeltaY: PropTypes.number,
|
79
|
-
maxDist: PropTypes.number,
|
80
|
-
minPointers: PropTypes.number,
|
81
|
-
},
|
82
|
-
{}
|
83
|
-
);
|
84
|
-
|
85
|
-
const FlingGestureHandler = createHandler(
|
86
|
-
'FlingGestureHandler',
|
87
|
-
{
|
88
|
-
...GestureHandlerPropTypes,
|
89
|
-
numberOfPointers: PropTypes.number,
|
90
|
-
direction: PropTypes.number,
|
91
|
-
},
|
92
|
-
{}
|
93
|
-
);
|
94
|
-
|
95
|
-
class ForceTouchFallback extends React.Component {
|
96
|
-
componentDidMount() {
|
97
|
-
console.warn(
|
98
|
-
'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'
|
99
|
-
);
|
100
|
-
}
|
101
|
-
render() {
|
102
|
-
return this.props.children;
|
103
|
-
}
|
104
|
-
}
|
105
|
-
|
106
|
-
const ForceTouchGestureHandler =
|
107
|
-
PlatformConstants && PlatformConstants.forceTouchAvailable
|
108
|
-
? createHandler(
|
109
|
-
'ForceTouchGestureHandler',
|
110
|
-
{
|
111
|
-
...GestureHandlerPropTypes,
|
112
|
-
minForce: PropTypes.number,
|
113
|
-
maxForce: PropTypes.number,
|
114
|
-
feedbackOnActivation: PropTypes.bool,
|
115
|
-
},
|
116
|
-
{}
|
117
|
-
)
|
118
|
-
: ForceTouchFallback;
|
119
|
-
|
120
|
-
ForceTouchGestureHandler.forceTouchAvailable =
|
121
|
-
(PlatformConstants && PlatformConstants.forceTouchAvailable) || false;
|
122
|
-
|
123
|
-
const LongPressGestureHandler = createHandler(
|
124
|
-
'LongPressGestureHandler',
|
125
|
-
{
|
126
|
-
...GestureHandlerPropTypes,
|
127
|
-
minDurationMs: PropTypes.number,
|
128
|
-
maxDist: PropTypes.number,
|
129
|
-
},
|
130
|
-
{}
|
131
|
-
);
|
132
|
-
|
133
|
-
function validatePanGestureHandlerProps(props) {
|
134
|
-
if (props.minDeltaX && props.activeOffsetX) {
|
135
|
-
throw new Error(
|
136
|
-
`It's not supported use minDeltaX with activeOffsetXStart or activeOffsetXEnd`
|
137
|
-
);
|
138
|
-
}
|
139
|
-
if (props.maxDeltaX && props.failOffsetX) {
|
140
|
-
throw new Error(
|
141
|
-
`It's not supported use minDeltaX with activeOffsetXStart or activeOffsetXEnd`
|
142
|
-
);
|
143
|
-
}
|
144
|
-
if (props.minDeltaY && props.activeOffsetY) {
|
145
|
-
throw new Error(
|
146
|
-
`It's not supported use minDeltaX with activeOffsetYStart or activeOffsetYEnd`
|
147
|
-
);
|
148
|
-
}
|
149
|
-
if (props.maxDeltaY && props.failOffsetY) {
|
150
|
-
throw new Error(
|
151
|
-
`It's not supported use minDeltaX with activeOffsetYStart or activeOffsetYEnd`
|
152
|
-
);
|
153
|
-
}
|
154
|
-
if (
|
155
|
-
Array.isArray(props.activeOffsetX) &&
|
156
|
-
(props.activeOffsetX[0] > 0 || props.activeOffsetX[1] < 0)
|
157
|
-
) {
|
158
|
-
throw new Error(
|
159
|
-
`First element of activeOffsetX should be negative, a the second one should be positive`
|
160
|
-
);
|
161
|
-
}
|
162
|
-
|
163
|
-
if (
|
164
|
-
Array.isArray(props.activeOffsetY) &&
|
165
|
-
(props.activeOffsetY[0] > 0 || props.activeOffsetY[1] < 0)
|
166
|
-
) {
|
167
|
-
throw new Error(
|
168
|
-
`First element of activeOffsetY should be negative, a the second one should be positive`
|
169
|
-
);
|
170
|
-
}
|
171
|
-
|
172
|
-
if (
|
173
|
-
Array.isArray(props.failOffsetX) &&
|
174
|
-
(props.failOffsetX[0] > 0 || props.failOffsetX[1] < 0)
|
175
|
-
) {
|
176
|
-
throw new Error(
|
177
|
-
`First element of failOffsetX should be negative, a the second one should be positive`
|
178
|
-
);
|
179
|
-
}
|
180
|
-
|
181
|
-
if (
|
182
|
-
Array.isArray(props.failOffsetY) &&
|
183
|
-
(props.failOffsetY[0] > 0 || props.failOffsetY[1] < 0)
|
184
|
-
) {
|
185
|
-
throw new Error(
|
186
|
-
`First element of failOffsetY should be negative, a the second one should be positive`
|
187
|
-
);
|
188
|
-
}
|
189
|
-
}
|
190
|
-
|
191
|
-
function transformPanGestureHandlerProps(props) {
|
192
|
-
const res = { ...props };
|
193
|
-
if (props.minDeltaX !== undefined) {
|
194
|
-
delete res['minDeltaX'];
|
195
|
-
res.activeOffsetXStart = -props.minDeltaX;
|
196
|
-
res.activeOffsetXEnd = props.minDeltaX;
|
197
|
-
}
|
198
|
-
if (props.maxDeltaX !== undefined) {
|
199
|
-
delete res['maxDeltaX'];
|
200
|
-
res.failOffsetXStart = -props.maxDeltaX;
|
201
|
-
res.failOffsetXEnd = props.maxDeltaX;
|
202
|
-
}
|
203
|
-
if (props.minOffsetX !== undefined) {
|
204
|
-
delete res['minOffsetX'];
|
205
|
-
if (props.minOffsetX < 0) {
|
206
|
-
res.activeOffsetXStart = props.minOffsetX;
|
207
|
-
} else {
|
208
|
-
res.activeOffsetXEnd = props.minOffsetX;
|
209
|
-
}
|
210
|
-
}
|
211
|
-
|
212
|
-
if (props.minDeltaY !== undefined) {
|
213
|
-
delete res['minDeltaY'];
|
214
|
-
res.activeOffsetYStart = -props.minDeltaY;
|
215
|
-
res.activeOffsetYEnd = props.minDeltaY;
|
216
|
-
}
|
217
|
-
if (props.maxDeltaY !== undefined) {
|
218
|
-
delete res['maxDeltaY'];
|
219
|
-
res.failOffsetYStart = -props.maxDeltaY;
|
220
|
-
res.failOffsetYEnd = props.maxDeltaY;
|
221
|
-
}
|
222
|
-
|
223
|
-
if (props.minOffsetY !== undefined) {
|
224
|
-
delete res['minOffsetY'];
|
225
|
-
if (props.minOffsetY < 0) {
|
226
|
-
res.activeOffsetYStart = props.minOffsetY;
|
227
|
-
} else {
|
228
|
-
res.activeOffsetYEnd = props.minOffsetY;
|
229
|
-
}
|
230
|
-
}
|
231
|
-
|
232
|
-
if (props.activeOffsetX !== undefined) {
|
233
|
-
delete res['activeOffsetX'];
|
234
|
-
if (Array.isArray(props.activeOffsetX)) {
|
235
|
-
res.activeOffsetXStart = props.activeOffsetX[0];
|
236
|
-
res.activeOffsetXEnd = props.activeOffsetX[1];
|
237
|
-
} else if (props.activeOffsetX < 0) {
|
238
|
-
res.activeOffsetXStart = props.activeOffsetX;
|
239
|
-
} else {
|
240
|
-
res.activeOffsetXEnd = props.activeOffsetX;
|
241
|
-
}
|
242
|
-
}
|
243
|
-
|
244
|
-
if (props.activeOffsetY !== undefined) {
|
245
|
-
delete res['activeOffsetY'];
|
246
|
-
if (Array.isArray(props.activeOffsetY)) {
|
247
|
-
res.activeOffsetYStart = props.activeOffsetY[0];
|
248
|
-
res.activeOffsetYEnd = props.activeOffsetY[1];
|
249
|
-
} else if (props.activeOffsetY < 0) {
|
250
|
-
res.activeOffsetYStart = props.activeOffsetY;
|
251
|
-
} else {
|
252
|
-
res.activeOffsetYEnd = props.activeOffsetY;
|
253
|
-
}
|
254
|
-
}
|
255
|
-
|
256
|
-
if (props.failOffsetX !== undefined) {
|
257
|
-
delete res['failOffsetX'];
|
258
|
-
if (Array.isArray(props.failOffsetX)) {
|
259
|
-
res.failOffsetXStart = props.failOffsetX[0];
|
260
|
-
res.failOffsetXEnd = props.failOffsetX[1];
|
261
|
-
} else if (props.failOffsetX < 0) {
|
262
|
-
res.failOffsetXStart = props.failOffsetX;
|
263
|
-
} else {
|
264
|
-
res.failOffsetXEnd = props.failOffsetX;
|
265
|
-
}
|
266
|
-
}
|
267
|
-
|
268
|
-
if (props.failOffsetY !== undefined) {
|
269
|
-
delete res['failOffsetY'];
|
270
|
-
if (Array.isArray(props.failOffsetY)) {
|
271
|
-
res.failOffsetYStart = props.failOffsetY[0];
|
272
|
-
res.failOffsetYEnd = props.failOffsetY[1];
|
273
|
-
} else if (props.failOffsetY < 0) {
|
274
|
-
res.failOffsetYStart = props.failOffsetY;
|
275
|
-
} else {
|
276
|
-
res.failOffsetYEnd = props.failOffsetY;
|
277
|
-
}
|
278
|
-
}
|
279
|
-
|
280
|
-
return res;
|
281
|
-
}
|
282
|
-
|
283
|
-
function managePanProps(props) {
|
284
|
-
if (__DEV__) {
|
285
|
-
validatePanGestureHandlerProps(props);
|
286
|
-
}
|
287
|
-
return transformPanGestureHandlerProps(props);
|
288
|
-
}
|
289
|
-
|
290
|
-
const PanGestureHandler = createHandler(
|
291
|
-
'PanGestureHandler',
|
292
|
-
{
|
293
|
-
...GestureHandlerPropTypes,
|
294
|
-
activeOffsetY: PropTypes.oneOfType([
|
295
|
-
PropTypes.number,
|
296
|
-
PropTypes.arrayOf(PropTypes.number),
|
297
|
-
]),
|
298
|
-
activeOffsetX: PropTypes.oneOfType([
|
299
|
-
PropTypes.number,
|
300
|
-
PropTypes.arrayOf(PropTypes.number),
|
301
|
-
]),
|
302
|
-
failOffsetY: PropTypes.oneOfType([
|
303
|
-
PropTypes.number,
|
304
|
-
PropTypes.arrayOf(PropTypes.number),
|
305
|
-
]),
|
306
|
-
failOffsetX: PropTypes.oneOfType([
|
307
|
-
PropTypes.number,
|
308
|
-
PropTypes.arrayOf(PropTypes.number),
|
309
|
-
]),
|
310
|
-
minDist: PropTypes.number,
|
311
|
-
minVelocity: PropTypes.number,
|
312
|
-
minVelocityX: PropTypes.number,
|
313
|
-
minVelocityY: PropTypes.number,
|
314
|
-
minPointers: PropTypes.number,
|
315
|
-
maxPointers: PropTypes.number,
|
316
|
-
avgTouches: PropTypes.bool,
|
317
|
-
},
|
318
|
-
{},
|
319
|
-
managePanProps,
|
320
|
-
{
|
321
|
-
activeOffsetYStart: true,
|
322
|
-
activeOffsetYEnd: true,
|
323
|
-
activeOffsetXStart: true,
|
324
|
-
activeOffsetXEnd: true,
|
325
|
-
failOffsetYStart: true,
|
326
|
-
failOffsetYEnd: true,
|
327
|
-
failOffsetXStart: true,
|
328
|
-
failOffsetXEnd: true,
|
329
|
-
}
|
330
|
-
);
|
331
|
-
const PinchGestureHandler = createHandler(
|
332
|
-
'PinchGestureHandler',
|
333
|
-
GestureHandlerPropTypes,
|
334
|
-
{}
|
335
|
-
);
|
336
|
-
const RotationGestureHandler = createHandler(
|
337
|
-
'RotationGestureHandler',
|
338
|
-
GestureHandlerPropTypes,
|
339
|
-
{}
|
340
|
-
);
|
341
|
-
|
342
|
-
const NATIVE_WRAPPER_BIND_BLACKLIST = new Set(['replaceState', 'isMounted']);
|
343
|
-
const NATIVE_WRAPPER_PROPS_FILTER = {
|
344
|
-
// accept all gesture handler prop types plus native wrapper specific ones
|
345
|
-
...NativeViewGestureHandler.propTypes,
|
346
|
-
// we want to pass gesture event handlers if registered
|
347
|
-
onGestureHandlerEvent: PropTypes.func,
|
348
|
-
onGestureHandlerStateChange: PropTypes.func,
|
349
|
-
};
|
350
|
-
|
351
|
-
function createNativeWrapper(Component, config = {}) {
|
352
|
-
class ComponentWrapper extends React.Component {
|
353
|
-
static propTypes = {
|
354
|
-
...Component.propTypes,
|
355
|
-
};
|
356
|
-
|
357
|
-
static displayName = Component.displayName || "ComponentWrapper";
|
358
|
-
|
359
|
-
_refHandler = node => {
|
360
|
-
// bind native component's methods
|
361
|
-
let source = node;
|
362
|
-
while (source != null) {
|
363
|
-
for (let methodName of Object.getOwnPropertyNames(source)) {
|
364
|
-
if (
|
365
|
-
!methodName.startsWith('_') && // private methods
|
366
|
-
!methodName.startsWith('component') && // lifecycle methods
|
367
|
-
!NATIVE_WRAPPER_BIND_BLACKLIST.has(methodName) && // other
|
368
|
-
typeof source[methodName] === 'function' &&
|
369
|
-
this[methodName] === undefined
|
370
|
-
) {
|
371
|
-
if (source[methodName].prototype) {
|
372
|
-
// determine if it's not bound already
|
373
|
-
this[methodName] = source[methodName].bind(node);
|
374
|
-
} else {
|
375
|
-
this[methodName] = source[methodName];
|
376
|
-
}
|
377
|
-
}
|
378
|
-
}
|
379
|
-
source = Object.getPrototypeOf(source);
|
380
|
-
}
|
381
|
-
};
|
382
|
-
|
383
|
-
render() {
|
384
|
-
// filter out props that should be passed to gesture handler wrapper
|
385
|
-
const gestureHandlerProps = Object.keys(this.props).reduce(
|
386
|
-
(props, key) => {
|
387
|
-
if (key in NATIVE_WRAPPER_PROPS_FILTER) {
|
388
|
-
props[key] = this.props[key];
|
389
|
-
}
|
390
|
-
return props;
|
391
|
-
},
|
392
|
-
{ ...config } // watch out not to modify config
|
393
|
-
);
|
394
|
-
return (
|
395
|
-
<NativeViewGestureHandler {...gestureHandlerProps}>
|
396
|
-
<Component {...this.props} ref={this._refHandler} />
|
397
|
-
</NativeViewGestureHandler>
|
398
|
-
);
|
399
|
-
}
|
400
|
-
}
|
401
|
-
return ComponentWrapper;
|
402
|
-
}
|
403
|
-
|
404
|
-
const WrappedScrollView = createNativeWrapper(ScrollView, {
|
405
|
-
disallowInterruption: true,
|
406
|
-
});
|
407
|
-
const WrappedSwitch = createNativeWrapper(Switch, {
|
408
|
-
shouldCancelWhenOutside: false,
|
409
|
-
shouldActivateOnStart: true,
|
410
|
-
disallowInterruption: true,
|
411
|
-
});
|
412
|
-
const WrappedTextInput = createNativeWrapper(TextInput);
|
413
|
-
|
414
|
-
const WrappedToolbarAndroid = createNativeWrapper(ToolbarAndroid);
|
415
|
-
const WrappedDrawerLayoutAndroid = createNativeWrapper(DrawerLayoutAndroid, {
|
416
|
-
disallowInterruption: true,
|
417
|
-
});
|
418
|
-
WrappedDrawerLayoutAndroid.positions = DrawerLayoutAndroid.positions;
|
419
|
-
|
420
|
-
State.print = state => {
|
421
|
-
const keys = Object.keys(State);
|
422
|
-
for (let i = 0; i < keys.length; i++) {
|
423
|
-
if (state === State[keys[i]]) {
|
424
|
-
return keys[i];
|
425
|
-
}
|
426
|
-
}
|
427
|
-
};
|
428
|
-
|
429
|
-
const RawButton = createNativeWrapper(GestureHandlerButton, {
|
430
|
-
shouldCancelWhenOutside: false,
|
431
|
-
shouldActivateOnStart: false,
|
432
|
-
});
|
433
|
-
|
434
|
-
/* Buttons */
|
435
|
-
|
436
|
-
class BaseButton extends React.Component {
|
437
|
-
static propTypes = {
|
438
|
-
...RawButton.propTypes,
|
439
|
-
onPress: PropTypes.func,
|
440
|
-
onActiveStateChange: PropTypes.func,
|
441
|
-
};
|
442
|
-
|
443
|
-
constructor(props) {
|
444
|
-
super(props);
|
445
|
-
this._lastActive = false;
|
446
|
-
}
|
447
|
-
|
448
|
-
_handleEvent = ({ nativeEvent }) => {
|
449
|
-
const { state, oldState, pointerInside } = nativeEvent;
|
450
|
-
const active = pointerInside && state === State.ACTIVE;
|
451
|
-
|
452
|
-
if (active !== this._lastActive && this.props.onActiveStateChange) {
|
453
|
-
this.props.onActiveStateChange(active);
|
454
|
-
}
|
455
|
-
|
456
|
-
if (
|
457
|
-
oldState === State.ACTIVE &&
|
458
|
-
state !== State.CANCELLED &&
|
459
|
-
this._lastActive &&
|
460
|
-
this.props.onPress
|
461
|
-
) {
|
462
|
-
this.props.onPress(active);
|
463
|
-
}
|
464
|
-
|
465
|
-
this._lastActive = active;
|
466
|
-
};
|
467
|
-
|
468
|
-
// Normally, the parent would execute it's handler first,
|
469
|
-
// then forward the event to listeners. However, here our handler
|
470
|
-
// is virtually only forwarding events to listeners, so we reverse the order
|
471
|
-
// to keep the proper order of the callbacks (from "raw" ones to "processed").
|
472
|
-
_onHandlerStateChange = e => {
|
473
|
-
this.props.onHandlerStateChange && this.props.onHandlerStateChange(e);
|
474
|
-
this._handleEvent(e);
|
475
|
-
};
|
476
|
-
|
477
|
-
_onGestureEvent = e => {
|
478
|
-
this.props.onGestureEvent && this.props.onGestureEvent(e);
|
479
|
-
this._handleEvent(e);
|
480
|
-
};
|
481
|
-
|
482
|
-
render() {
|
483
|
-
const { style, rippleColor, ...rest } = this.props;
|
484
|
-
|
485
|
-
return (
|
486
|
-
<RawButton
|
487
|
-
style={[{ overflow: 'hidden' }, style]}
|
488
|
-
rippleColor={processColor(rippleColor)}
|
489
|
-
{...rest}
|
490
|
-
onGestureEvent={this._onGestureEvent}
|
491
|
-
onHandlerStateChange={this._onHandlerStateChange}
|
492
|
-
/>
|
493
|
-
);
|
494
|
-
}
|
495
|
-
}
|
496
|
-
|
497
|
-
const AnimatedBaseButton = Animated.createAnimatedComponent(BaseButton);
|
498
|
-
|
499
|
-
const btnStyles = StyleSheet.create({
|
500
|
-
underlay: {
|
501
|
-
position: 'absolute',
|
502
|
-
left: 0,
|
503
|
-
right: 0,
|
504
|
-
bottom: 0,
|
505
|
-
top: 0,
|
506
|
-
},
|
507
|
-
});
|
508
|
-
|
509
|
-
class RectButton extends React.Component {
|
510
|
-
static propTypes = BaseButton.propTypes;
|
511
|
-
|
512
|
-
static defaultProps = {
|
513
|
-
activeOpacity: 0.105,
|
514
|
-
underlayColor: 'black',
|
515
|
-
};
|
516
|
-
|
517
|
-
constructor(props) {
|
518
|
-
super(props);
|
519
|
-
this._opacity = new Animated.Value(0);
|
520
|
-
}
|
521
|
-
|
522
|
-
_onActiveStateChange = active => {
|
523
|
-
if (Platform.OS !== 'android') {
|
524
|
-
this._opacity.setValue(active ? this.props.activeOpacity : 0);
|
525
|
-
}
|
526
|
-
|
527
|
-
this.props.onActiveStateChange && this.props.onActiveStateChange(active);
|
528
|
-
};
|
529
|
-
|
530
|
-
render() {
|
531
|
-
const { children, ...rest } = this.props;
|
532
|
-
|
533
|
-
return (
|
534
|
-
<BaseButton {...rest} onActiveStateChange={this._onActiveStateChange}>
|
535
|
-
<Animated.View
|
536
|
-
style={[
|
537
|
-
btnStyles.underlay,
|
538
|
-
{ opacity: this._opacity },
|
539
|
-
{ backgroundColor: this.props.underlayColor },
|
540
|
-
]}
|
541
|
-
/>
|
542
|
-
{children}
|
543
|
-
</BaseButton>
|
544
|
-
);
|
545
|
-
}
|
546
|
-
}
|
547
|
-
|
548
|
-
class BorderlessButton extends React.Component {
|
549
|
-
static propTypes = {
|
550
|
-
...BaseButton.propTypes,
|
551
|
-
borderless: PropTypes.bool,
|
552
|
-
};
|
553
|
-
|
554
|
-
static defaultProps = {
|
555
|
-
activeOpacity: 0.3,
|
556
|
-
borderless: true,
|
557
|
-
};
|
558
|
-
|
559
|
-
constructor(props) {
|
560
|
-
super(props);
|
561
|
-
this._opacity = new Animated.Value(1);
|
562
|
-
}
|
563
|
-
|
564
|
-
_onActiveStateChange = active => {
|
565
|
-
if (Platform.OS !== 'android') {
|
566
|
-
this._opacity.setValue(active ? this.props.activeOpacity : 1);
|
567
|
-
}
|
568
|
-
|
569
|
-
this.props.onActiveStateChange && this.props.onActiveStateChange(active);
|
570
|
-
};
|
571
|
-
|
572
|
-
render() {
|
573
|
-
const { children, style, ...rest } = this.props;
|
574
|
-
|
575
|
-
return (
|
576
|
-
<AnimatedBaseButton
|
577
|
-
{...rest}
|
578
|
-
onActiveStateChange={this._onActiveStateChange}
|
579
|
-
style={[style, Platform.OS === 'ios' && { opacity: this._opacity }]}>
|
580
|
-
{children}
|
581
|
-
</AnimatedBaseButton>
|
582
|
-
);
|
583
|
-
}
|
584
|
-
}
|
585
|
-
|
586
|
-
/* Other */
|
587
|
-
|
588
|
-
const FlatListWithGHScroll = React.forwardRef((props, ref) => (
|
589
|
-
<FlatList
|
590
|
-
ref={ref}
|
591
|
-
{...props}
|
592
|
-
renderScrollComponent={scrollProps => <WrappedScrollView {...scrollProps} />}
|
593
|
-
/>
|
594
|
-
));
|
595
|
-
|
1
|
+
export { default as createNativeWrapper } from './createNativeWrapper';
|
2
|
+
export { default as Directions } from './Directions';
|
3
|
+
export { default as gestureHandlerRootHOC } from './gestureHandlerRootHOC';
|
596
4
|
export {
|
597
|
-
|
598
|
-
|
599
|
-
|
600
|
-
|
601
|
-
|
602
|
-
|
603
|
-
|
604
|
-
FlingGestureHandler,
|
605
|
-
ForceTouchGestureHandler,
|
606
|
-
LongPressGestureHandler,
|
607
|
-
PanGestureHandler,
|
608
|
-
PinchGestureHandler,
|
609
|
-
RotationGestureHandler,
|
610
|
-
State,
|
611
|
-
/* Buttons */
|
612
|
-
RawButton,
|
613
|
-
BaseButton,
|
614
|
-
RectButton,
|
615
|
-
BorderlessButton,
|
616
|
-
/* Other */
|
617
|
-
FlatListWithGHScroll as FlatList,
|
618
|
-
gestureHandlerRootHOC,
|
619
|
-
GestureHandlerButton as PureNativeButton,
|
620
|
-
Directions,
|
621
|
-
createNativeWrapper,
|
622
|
-
};
|
5
|
+
default as NativeViewGestureHandler,
|
6
|
+
} from './NativeViewGestureHandler';
|
7
|
+
export { default as State } from './State';
|
8
|
+
|
9
|
+
export * from './GestureButtons';
|
10
|
+
export * from './GestureComponents';
|
11
|
+
export * from './Gestures';
|
@@ -1,14 +1,6 @@
|
|
1
1
|
import React from 'react';
|
2
|
-
import {
|
2
|
+
import { View } from 'react-native';
|
3
3
|
|
4
|
-
export default
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
return (
|
9
|
-
<TouchableWithoutFeedback accessibilityRole="button" {...rest}>
|
10
|
-
<View>{children}</View>
|
11
|
-
</TouchableWithoutFeedback>
|
12
|
-
);
|
13
|
-
}
|
14
|
-
}
|
4
|
+
export default React.forwardRef((props, ref) => (
|
5
|
+
<View ref={ref} accessibilityRole="button" {...props} />
|
6
|
+
));
|
@@ -0,0 +1,45 @@
|
|
1
|
+
import PropTypes from 'prop-types';
|
2
|
+
|
3
|
+
// If changed, add changes to NATIVE_WRAPPER_PROPS_FILTER as well
|
4
|
+
const GestureHandlerPropTypes = {
|
5
|
+
id: PropTypes.string,
|
6
|
+
minPointers: PropTypes.number,
|
7
|
+
enabled: PropTypes.bool,
|
8
|
+
waitFor: PropTypes.oneOfType([
|
9
|
+
PropTypes.string,
|
10
|
+
PropTypes.object,
|
11
|
+
PropTypes.arrayOf(
|
12
|
+
PropTypes.oneOfType([PropTypes.string, PropTypes.object])
|
13
|
+
),
|
14
|
+
]),
|
15
|
+
simultaneousHandlers: PropTypes.oneOfType([
|
16
|
+
PropTypes.string,
|
17
|
+
PropTypes.object,
|
18
|
+
PropTypes.arrayOf(
|
19
|
+
PropTypes.oneOfType([PropTypes.string, PropTypes.object])
|
20
|
+
),
|
21
|
+
]),
|
22
|
+
shouldCancelWhenOutside: PropTypes.bool,
|
23
|
+
hitSlop: PropTypes.oneOfType([
|
24
|
+
PropTypes.number,
|
25
|
+
PropTypes.shape({
|
26
|
+
left: PropTypes.number,
|
27
|
+
top: PropTypes.number,
|
28
|
+
right: PropTypes.number,
|
29
|
+
bottom: PropTypes.number,
|
30
|
+
vertical: PropTypes.number,
|
31
|
+
horizontal: PropTypes.number,
|
32
|
+
width: PropTypes.number,
|
33
|
+
height: PropTypes.number,
|
34
|
+
}),
|
35
|
+
]),
|
36
|
+
onGestureEvent: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),
|
37
|
+
onHandlerStateChange: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),
|
38
|
+
onBegan: PropTypes.func,
|
39
|
+
onFailed: PropTypes.func,
|
40
|
+
onCancelled: PropTypes.func,
|
41
|
+
onActivated: PropTypes.func,
|
42
|
+
onEnded: PropTypes.func,
|
43
|
+
};
|
44
|
+
|
45
|
+
export default GestureHandlerPropTypes;
|