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