1 |
|
2 | import { Touchable, GestureResponderEvent } from 'react-native';
|
3 | const PRESS_RETENTION_OFFSET = { top: 20, left: 20, right: 20, bottom: 30 };
|
4 |
|
5 | const { Mixin } = Touchable;
|
6 | const {
|
7 | touchableHandleStartShouldSetResponder,
|
8 | touchableHandleResponderTerminationRequest,
|
9 | touchableHandleResponderGrant,
|
10 | touchableHandleResponderMove,
|
11 | touchableHandleResponderRelease,
|
12 | touchableHandleResponderTerminate,
|
13 | touchableGetInitialState,
|
14 | } = Mixin;
|
15 |
|
16 | const SvgTouchableMixin = {
|
17 | ...Mixin,
|
18 |
|
19 | touchableHandleStartShouldSetResponder(e: GestureResponderEvent) {
|
20 | const { onStartShouldSetResponder } = this.props;
|
21 | if (onStartShouldSetResponder) {
|
22 | return onStartShouldSetResponder(e);
|
23 | } else {
|
24 | return touchableHandleStartShouldSetResponder.call(this, e);
|
25 | }
|
26 | },
|
27 |
|
28 | touchableHandleResponderTerminationRequest(e: GestureResponderEvent) {
|
29 | const { onResponderTerminationRequest } = this.props;
|
30 | if (onResponderTerminationRequest) {
|
31 | return onResponderTerminationRequest(e);
|
32 | } else {
|
33 | return touchableHandleResponderTerminationRequest.call(this, e);
|
34 | }
|
35 | },
|
36 |
|
37 | touchableHandleResponderGrant(e: GestureResponderEvent) {
|
38 | const { onResponderGrant } = this.props;
|
39 | if (onResponderGrant) {
|
40 | return onResponderGrant(e);
|
41 | } else {
|
42 | return touchableHandleResponderGrant.call(this, e);
|
43 | }
|
44 | },
|
45 |
|
46 | touchableHandleResponderMove(e: GestureResponderEvent) {
|
47 | const { onResponderMove } = this.props;
|
48 | if (onResponderMove) {
|
49 | return onResponderMove(e);
|
50 | } else {
|
51 | return touchableHandleResponderMove.call(this, e);
|
52 | }
|
53 | },
|
54 |
|
55 | touchableHandleResponderRelease(e: GestureResponderEvent) {
|
56 | const { onResponderRelease } = this.props;
|
57 | if (onResponderRelease) {
|
58 | return onResponderRelease(e);
|
59 | } else {
|
60 | return touchableHandleResponderRelease.call(this, e);
|
61 | }
|
62 | },
|
63 |
|
64 | touchableHandleResponderTerminate(e: GestureResponderEvent) {
|
65 | const { onResponderTerminate } = this.props;
|
66 | if (onResponderTerminate) {
|
67 | return onResponderTerminate(e);
|
68 | } else {
|
69 | return touchableHandleResponderTerminate.call(this, e);
|
70 | }
|
71 | },
|
72 |
|
73 | touchableHandlePress(e: GestureResponderEvent) {
|
74 | const { onPress } = this.props;
|
75 | onPress && onPress(e);
|
76 | },
|
77 |
|
78 | touchableHandleActivePressIn(e: GestureResponderEvent) {
|
79 | const { onPressIn } = this.props;
|
80 | onPressIn && onPressIn(e);
|
81 | },
|
82 |
|
83 | touchableHandleActivePressOut(e: GestureResponderEvent) {
|
84 | const { onPressOut } = this.props;
|
85 | onPressOut && onPressOut(e);
|
86 | },
|
87 |
|
88 | touchableHandleLongPress(e: GestureResponderEvent) {
|
89 | const { onLongPress } = this.props;
|
90 | onLongPress && onLongPress(e);
|
91 | },
|
92 |
|
93 | touchableGetPressRectOffset() {
|
94 | const { pressRetentionOffset } = this.props;
|
95 | return pressRetentionOffset || PRESS_RETENTION_OFFSET;
|
96 | },
|
97 |
|
98 | touchableGetHitSlop() {
|
99 | const { hitSlop } = this.props;
|
100 | return hitSlop;
|
101 | },
|
102 |
|
103 | touchableGetHighlightDelayMS() {
|
104 | const { delayPressIn } = this.props;
|
105 | return delayPressIn || 0;
|
106 | },
|
107 |
|
108 | touchableGetLongPressDelayMS() {
|
109 | const { delayLongPress } = this.props;
|
110 | return delayLongPress === 0 ? 0 : delayLongPress || 500;
|
111 | },
|
112 |
|
113 | touchableGetPressOutDelayMS() {
|
114 | const { delayPressOut } = this.props;
|
115 | return delayPressOut || 0;
|
116 | },
|
117 | };
|
118 |
|
119 | const touchKeys = Object.keys(SvgTouchableMixin);
|
120 | const touchVals = touchKeys.map(key => SvgTouchableMixin[key]);
|
121 | const numTouchKeys = touchKeys.length;
|
122 |
|
123 | export default (target: { [x: string]: unknown; state: unknown }) => {
|
124 | for (let i = 0; i < numTouchKeys; i++) {
|
125 | const key = touchKeys[i];
|
126 | const val = touchVals[i];
|
127 | if (typeof val === 'function') {
|
128 | target[key] = val.bind(target);
|
129 | } else {
|
130 | target[key] = val;
|
131 | }
|
132 | }
|
133 | target.state = touchableGetInitialState();
|
134 | };
|