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/GestureHandler.js CHANGED
@@ -1,622 +1,11 @@
1
- import React from 'react';
2
- import {
3
- Animated,
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
- WrappedScrollView as ScrollView,
598
- WrappedSwitch as Switch,
599
- WrappedTextInput as TextInput,
600
- WrappedToolbarAndroid as ToolbarAndroid,
601
- WrappedDrawerLayoutAndroid as DrawerLayoutAndroid,
602
- NativeViewGestureHandler,
603
- TapGestureHandler,
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 { TouchableWithoutFeedback, View } from 'react-native';
2
+ import { View } from 'react-native';
3
3
 
4
- export default class RNGestureHandlerButton extends React.Component {
5
- render() {
6
- const { children, ...rest } = this.props;
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;