1 | import _extends from 'babel-runtime/helpers/extends';
|
2 | import _classCallCheck from 'babel-runtime/helpers/classCallCheck';
|
3 | import _createClass from 'babel-runtime/helpers/createClass';
|
4 | import _possibleConstructorReturn from 'babel-runtime/helpers/possibleConstructorReturn';
|
5 | import _inherits from 'babel-runtime/helpers/inherits';
|
6 |
|
7 | import React from 'react';
|
8 | import ReactDOM from 'react-dom';
|
9 | import PressEvent, { shouldFirePress } from './PressEvent';
|
10 | function keyMirror(obj) {
|
11 | Object.keys(obj).forEach(function (k) {
|
12 | return obj[k] = k;
|
13 | });
|
14 | return obj;
|
15 | }
|
16 | function copy(from, list) {
|
17 | var to = {};
|
18 | list.forEach(function (k) {
|
19 | to[k] = from[k];
|
20 | });
|
21 | return to;
|
22 | }
|
23 | function extractSingleTouch(_nativeEvent) {
|
24 | var nativeEvent = _nativeEvent;
|
25 | if (nativeEvent.nativeEvent) {
|
26 | nativeEvent = nativeEvent.nativeEvent;
|
27 | }
|
28 | var touches = nativeEvent.touches;
|
29 | var changedTouches = nativeEvent.changedTouches;
|
30 | var hasTouches = touches && touches.length > 0;
|
31 | var hasChangedTouches = changedTouches && changedTouches.length > 0;
|
32 | return !hasTouches && hasChangedTouches ? changedTouches[0] : hasTouches ? touches[0] : nativeEvent;
|
33 | }
|
34 |
|
35 |
|
36 |
|
37 | var States = keyMirror({
|
38 | NOT_RESPONDER: null,
|
39 | RESPONDER_INACTIVE_PRESS_IN: null,
|
40 | RESPONDER_INACTIVE_PRESS_OUT: null,
|
41 | RESPONDER_ACTIVE_PRESS_IN: null,
|
42 | RESPONDER_ACTIVE_PRESS_OUT: null,
|
43 | RESPONDER_ACTIVE_LONG_PRESS_IN: null,
|
44 | RESPONDER_ACTIVE_LONG_PRESS_OUT: null,
|
45 | ERROR: null
|
46 | });
|
47 |
|
48 |
|
49 |
|
50 | var IsActive = {
|
51 | RESPONDER_ACTIVE_PRESS_OUT: true,
|
52 | RESPONDER_ACTIVE_PRESS_IN: true
|
53 | };
|
54 |
|
55 |
|
56 |
|
57 |
|
58 | var IsPressingIn = {
|
59 | RESPONDER_INACTIVE_PRESS_IN: true,
|
60 | RESPONDER_ACTIVE_PRESS_IN: true,
|
61 | RESPONDER_ACTIVE_LONG_PRESS_IN: true
|
62 | };
|
63 | var IsLongPressingIn = {
|
64 | RESPONDER_ACTIVE_LONG_PRESS_IN: true
|
65 | };
|
66 |
|
67 |
|
68 |
|
69 | var Signals = keyMirror({
|
70 | DELAY: null,
|
71 | RESPONDER_GRANT: null,
|
72 | RESPONDER_RELEASE: null,
|
73 | RESPONDER_TERMINATED: null,
|
74 | ENTER_PRESS_RECT: null,
|
75 | LEAVE_PRESS_RECT: null,
|
76 | LONG_PRESS_DETECTED: null
|
77 | });
|
78 |
|
79 |
|
80 |
|
81 | var Transitions = {
|
82 | NOT_RESPONDER: {
|
83 | DELAY: States.ERROR,
|
84 | RESPONDER_GRANT: States.RESPONDER_INACTIVE_PRESS_IN,
|
85 | RESPONDER_RELEASE: States.ERROR,
|
86 | RESPONDER_TERMINATED: States.ERROR,
|
87 | ENTER_PRESS_RECT: States.ERROR,
|
88 | LEAVE_PRESS_RECT: States.ERROR,
|
89 | LONG_PRESS_DETECTED: States.ERROR
|
90 | },
|
91 | RESPONDER_INACTIVE_PRESS_IN: {
|
92 | DELAY: States.RESPONDER_ACTIVE_PRESS_IN,
|
93 | RESPONDER_GRANT: States.ERROR,
|
94 | RESPONDER_RELEASE: States.NOT_RESPONDER,
|
95 | RESPONDER_TERMINATED: States.NOT_RESPONDER,
|
96 | ENTER_PRESS_RECT: States.RESPONDER_INACTIVE_PRESS_IN,
|
97 | LEAVE_PRESS_RECT: States.RESPONDER_INACTIVE_PRESS_OUT,
|
98 | LONG_PRESS_DETECTED: States.ERROR
|
99 | },
|
100 | RESPONDER_INACTIVE_PRESS_OUT: {
|
101 | DELAY: States.RESPONDER_ACTIVE_PRESS_OUT,
|
102 | RESPONDER_GRANT: States.ERROR,
|
103 | RESPONDER_RELEASE: States.NOT_RESPONDER,
|
104 | RESPONDER_TERMINATED: States.NOT_RESPONDER,
|
105 | ENTER_PRESS_RECT: States.RESPONDER_INACTIVE_PRESS_IN,
|
106 | LEAVE_PRESS_RECT: States.RESPONDER_INACTIVE_PRESS_OUT,
|
107 | LONG_PRESS_DETECTED: States.ERROR
|
108 | },
|
109 | RESPONDER_ACTIVE_PRESS_IN: {
|
110 | DELAY: States.ERROR,
|
111 | RESPONDER_GRANT: States.ERROR,
|
112 | RESPONDER_RELEASE: States.NOT_RESPONDER,
|
113 | RESPONDER_TERMINATED: States.NOT_RESPONDER,
|
114 | ENTER_PRESS_RECT: States.RESPONDER_ACTIVE_PRESS_IN,
|
115 | LEAVE_PRESS_RECT: States.RESPONDER_ACTIVE_PRESS_OUT,
|
116 | LONG_PRESS_DETECTED: States.RESPONDER_ACTIVE_LONG_PRESS_IN
|
117 | },
|
118 | RESPONDER_ACTIVE_PRESS_OUT: {
|
119 | DELAY: States.ERROR,
|
120 | RESPONDER_GRANT: States.ERROR,
|
121 | RESPONDER_RELEASE: States.NOT_RESPONDER,
|
122 | RESPONDER_TERMINATED: States.NOT_RESPONDER,
|
123 | ENTER_PRESS_RECT: States.RESPONDER_ACTIVE_PRESS_IN,
|
124 | LEAVE_PRESS_RECT: States.RESPONDER_ACTIVE_PRESS_OUT,
|
125 | LONG_PRESS_DETECTED: States.ERROR
|
126 | },
|
127 | RESPONDER_ACTIVE_LONG_PRESS_IN: {
|
128 | DELAY: States.ERROR,
|
129 | RESPONDER_GRANT: States.ERROR,
|
130 | RESPONDER_RELEASE: States.NOT_RESPONDER,
|
131 | RESPONDER_TERMINATED: States.NOT_RESPONDER,
|
132 | ENTER_PRESS_RECT: States.RESPONDER_ACTIVE_LONG_PRESS_IN,
|
133 | LEAVE_PRESS_RECT: States.RESPONDER_ACTIVE_LONG_PRESS_OUT,
|
134 | LONG_PRESS_DETECTED: States.RESPONDER_ACTIVE_LONG_PRESS_IN
|
135 | },
|
136 | RESPONDER_ACTIVE_LONG_PRESS_OUT: {
|
137 | DELAY: States.ERROR,
|
138 | RESPONDER_GRANT: States.ERROR,
|
139 | RESPONDER_RELEASE: States.NOT_RESPONDER,
|
140 | RESPONDER_TERMINATED: States.NOT_RESPONDER,
|
141 | ENTER_PRESS_RECT: States.RESPONDER_ACTIVE_LONG_PRESS_IN,
|
142 | LEAVE_PRESS_RECT: States.RESPONDER_ACTIVE_LONG_PRESS_OUT,
|
143 | LONG_PRESS_DETECTED: States.ERROR
|
144 | },
|
145 | error: {
|
146 | DELAY: States.NOT_RESPONDER,
|
147 | RESPONDER_GRANT: States.RESPONDER_INACTIVE_PRESS_IN,
|
148 | RESPONDER_RELEASE: States.NOT_RESPONDER,
|
149 | RESPONDER_TERMINATED: States.NOT_RESPONDER,
|
150 | ENTER_PRESS_RECT: States.NOT_RESPONDER,
|
151 | LEAVE_PRESS_RECT: States.NOT_RESPONDER,
|
152 | LONG_PRESS_DETECTED: States.NOT_RESPONDER
|
153 | }
|
154 | };
|
155 |
|
156 |
|
157 |
|
158 | var HIGHLIGHT_DELAY_MS = 130;
|
159 | var PRESS_EXPAND_PX = 20;
|
160 | var LONG_PRESS_THRESHOLD = 500;
|
161 | var LONG_PRESS_DELAY_MS = LONG_PRESS_THRESHOLD - HIGHLIGHT_DELAY_MS;
|
162 | var LONG_PRESS_ALLOWED_MOVEMENT = 10;
|
163 | var lastClickTime = 0;
|
164 | var pressDelay = 200;
|
165 | function isAllowPress() {
|
166 |
|
167 | return Date.now() - lastClickTime >= pressDelay;
|
168 | }
|
169 |
|
170 | var Touchable = function (_React$Component) {
|
171 | _inherits(Touchable, _React$Component);
|
172 |
|
173 | function Touchable() {
|
174 | _classCallCheck(this, Touchable);
|
175 |
|
176 | var _this = _possibleConstructorReturn(this, (Touchable.__proto__ || Object.getPrototypeOf(Touchable)).apply(this, arguments));
|
177 |
|
178 | _this.state = {
|
179 | active: false
|
180 | };
|
181 | _this.onTouchStart = function (e) {
|
182 | _this.callChildEvent('onTouchStart', e);
|
183 | _this.lockMouse = true;
|
184 | if (_this.releaseLockTimer) {
|
185 | clearTimeout(_this.releaseLockTimer);
|
186 | }
|
187 | _this.touchableHandleResponderGrant(e.nativeEvent);
|
188 | };
|
189 | _this.onTouchMove = function (e) {
|
190 | _this.callChildEvent('onTouchMove', e);
|
191 | _this.touchableHandleResponderMove(e.nativeEvent);
|
192 | };
|
193 | _this.onTouchEnd = function (e) {
|
194 | _this.callChildEvent('onTouchEnd', e);
|
195 | _this.releaseLockTimer = setTimeout(function () {
|
196 | _this.lockMouse = false;
|
197 | }, 300);
|
198 | _this.touchableHandleResponderRelease(new PressEvent(e.nativeEvent));
|
199 | };
|
200 | _this.onTouchCancel = function (e) {
|
201 | _this.callChildEvent('onTouchCancel', e);
|
202 | _this.releaseLockTimer = setTimeout(function () {
|
203 | _this.lockMouse = false;
|
204 | }, 300);
|
205 | _this.touchableHandleResponderTerminate(e.nativeEvent);
|
206 | };
|
207 | _this.onMouseDown = function (e) {
|
208 | _this.callChildEvent('onMouseDown', e);
|
209 | if (_this.lockMouse) {
|
210 | return;
|
211 | }
|
212 | _this.touchableHandleResponderGrant(e.nativeEvent);
|
213 | document.addEventListener('mousemove', _this.touchableHandleResponderMove, false);
|
214 | document.addEventListener('mouseup', _this.onMouseUp, false);
|
215 | };
|
216 | _this.onMouseUp = function (e) {
|
217 | document.removeEventListener('mousemove', _this.touchableHandleResponderMove, false);
|
218 | document.removeEventListener('mouseup', _this.onMouseUp, false);
|
219 | _this.touchableHandleResponderRelease(new PressEvent(e));
|
220 | };
|
221 | _this.touchableHandleResponderMove = function (e) {
|
222 | if (!_this.touchable.startMouse) {
|
223 | return;
|
224 | }
|
225 |
|
226 | if (!_this.touchable.dimensionsOnActivate || _this.touchable.touchState === States.NOT_RESPONDER) {
|
227 | return;
|
228 | }
|
229 |
|
230 |
|
231 | if (_this.touchable.touchState === States.RESPONDER_INACTIVE_PRESS_IN) {
|
232 | return;
|
233 | }
|
234 | var touch = extractSingleTouch(e);
|
235 | var pageX = touch && touch.pageX;
|
236 | var pageY = touch && touch.pageY;
|
237 | if (_this.pressInLocation) {
|
238 | var movedDistance = _this._getDistanceBetweenPoints(pageX, pageY, _this.pressInLocation.pageX, _this.pressInLocation.pageY);
|
239 | if (movedDistance > LONG_PRESS_ALLOWED_MOVEMENT) {
|
240 | _this._cancelLongPressDelayTimeout();
|
241 | }
|
242 | }
|
243 | if (_this.checkTouchWithinActive(e)) {
|
244 | _this._receiveSignal(Signals.ENTER_PRESS_RECT, e);
|
245 | var curState = _this.touchable.touchState;
|
246 | if (curState === States.RESPONDER_INACTIVE_PRESS_IN) {
|
247 | _this._cancelLongPressDelayTimeout();
|
248 | }
|
249 | } else {
|
250 | _this._cancelLongPressDelayTimeout();
|
251 | _this._receiveSignal(Signals.LEAVE_PRESS_RECT, e);
|
252 | }
|
253 | };
|
254 | return _this;
|
255 | }
|
256 |
|
257 | _createClass(Touchable, [{
|
258 | key: 'componentWillMount',
|
259 | value: function componentWillMount() {
|
260 | this.touchable = { touchState: undefined };
|
261 | }
|
262 | }, {
|
263 | key: 'componentDidMount',
|
264 | value: function componentDidMount() {
|
265 | this.root = ReactDOM.findDOMNode(this);
|
266 | }
|
267 | }, {
|
268 | key: 'componentDidUpdate',
|
269 | value: function componentDidUpdate() {
|
270 | this.root = ReactDOM.findDOMNode(this);
|
271 |
|
272 | if (this.props.disabled && this.state.active) {
|
273 | this.setState({
|
274 | active: false
|
275 | });
|
276 | }
|
277 | }
|
278 | }, {
|
279 | key: 'componentWillUnmount',
|
280 | value: function componentWillUnmount() {
|
281 | if (this.releaseLockTimer) {
|
282 | clearTimeout(this.releaseLockTimer);
|
283 | }
|
284 | if (this.touchableDelayTimeout) {
|
285 | clearTimeout(this.touchableDelayTimeout);
|
286 | }
|
287 | if (this.longPressDelayTimeout) {
|
288 | clearTimeout(this.longPressDelayTimeout);
|
289 | }
|
290 | if (this.pressOutDelayTimeout) {
|
291 | clearTimeout(this.pressOutDelayTimeout);
|
292 | }
|
293 | }
|
294 | }, {
|
295 | key: 'callChildEvent',
|
296 | value: function callChildEvent(event, e) {
|
297 | var childHandle = React.Children.only(this.props.children).props[event];
|
298 | if (childHandle) {
|
299 | childHandle(e);
|
300 | }
|
301 | }
|
302 | }, {
|
303 | key: '_remeasureMetricsOnInit',
|
304 | value: function _remeasureMetricsOnInit(e) {
|
305 | var root = this.root;
|
306 |
|
307 | var touch = extractSingleTouch(e);
|
308 | var boundingRect = root.getBoundingClientRect();
|
309 | this.touchable = {
|
310 | touchState: this.touchable.touchState,
|
311 | startMouse: {
|
312 | pageX: touch.pageX,
|
313 | pageY: touch.pageY
|
314 | },
|
315 | positionOnGrant: {
|
316 | left: boundingRect.left + window.pageXOffset,
|
317 | top: boundingRect.top + window.pageYOffset,
|
318 | width: boundingRect.width,
|
319 | height: boundingRect.height,
|
320 | clientLeft: boundingRect.left,
|
321 | clientTop: boundingRect.top
|
322 | }
|
323 | };
|
324 | }
|
325 | }, {
|
326 | key: 'touchableHandleResponderGrant',
|
327 | value: function touchableHandleResponderGrant(e) {
|
328 | var _this2 = this;
|
329 |
|
330 | this.touchable.touchState = States.NOT_RESPONDER;
|
331 | if (this.pressOutDelayTimeout) {
|
332 | clearTimeout(this.pressOutDelayTimeout);
|
333 | this.pressOutDelayTimeout = null;
|
334 | }
|
335 | if (this.props.fixClickPenetration && !isAllowPress()) {
|
336 | return;
|
337 | }
|
338 | this._remeasureMetricsOnInit(e);
|
339 | this._receiveSignal(Signals.RESPONDER_GRANT, e);
|
340 | var _props = this.props,
|
341 | delayMS = _props.delayPressIn,
|
342 | longDelayMS = _props.delayLongPress;
|
343 |
|
344 | if (delayMS) {
|
345 | this.touchableDelayTimeout = setTimeout(function () {
|
346 | _this2._handleDelay(e);
|
347 | }, delayMS);
|
348 | } else {
|
349 | this._handleDelay(e);
|
350 | }
|
351 | var longPressEvent = new PressEvent(e);
|
352 | this.longPressDelayTimeout = setTimeout(function () {
|
353 | _this2._handleLongDelay(longPressEvent);
|
354 | }, longDelayMS + delayMS);
|
355 | }
|
356 | }, {
|
357 | key: 'checkScroll',
|
358 | value: function checkScroll(e) {
|
359 | var positionOnGrant = this.touchable.positionOnGrant;
|
360 |
|
361 | var boundingRect = this.root.getBoundingClientRect();
|
362 | if (boundingRect.left !== positionOnGrant.clientLeft || boundingRect.top !== positionOnGrant.clientTop) {
|
363 | this._receiveSignal(Signals.RESPONDER_TERMINATED, e);
|
364 | return false;
|
365 | }
|
366 | }
|
367 | }, {
|
368 | key: 'touchableHandleResponderRelease',
|
369 | value: function touchableHandleResponderRelease(e) {
|
370 | if (!this.touchable.startMouse) {
|
371 | return;
|
372 | }
|
373 | var touch = extractSingleTouch(e);
|
374 | if (Math.abs(touch.pageX - this.touchable.startMouse.pageX) > 30 || Math.abs(touch.pageY - this.touchable.startMouse.pageY) > 30) {
|
375 | this._receiveSignal(Signals.RESPONDER_TERMINATED, e);
|
376 | return;
|
377 | }
|
378 | if (this.checkScroll(e) === false) {
|
379 | return;
|
380 | }
|
381 | this._receiveSignal(Signals.RESPONDER_RELEASE, e);
|
382 | }
|
383 | }, {
|
384 | key: 'touchableHandleResponderTerminate',
|
385 | value: function touchableHandleResponderTerminate(e) {
|
386 | if (!this.touchable.startMouse) {
|
387 | return;
|
388 | }
|
389 | this._receiveSignal(Signals.RESPONDER_TERMINATED, e);
|
390 | }
|
391 | }, {
|
392 | key: 'checkTouchWithinActive',
|
393 | value: function checkTouchWithinActive(e) {
|
394 | var positionOnGrant = this.touchable.positionOnGrant;
|
395 | var _props2 = this.props,
|
396 | _props2$pressRetentio = _props2.pressRetentionOffset,
|
397 | pressRetentionOffset = _props2$pressRetentio === undefined ? {} : _props2$pressRetentio,
|
398 | hitSlop = _props2.hitSlop;
|
399 |
|
400 | var pressExpandLeft = pressRetentionOffset.left;
|
401 | var pressExpandTop = pressRetentionOffset.top;
|
402 | var pressExpandRight = pressRetentionOffset.right;
|
403 | var pressExpandBottom = pressRetentionOffset.bottom;
|
404 | if (hitSlop) {
|
405 | pressExpandLeft += hitSlop.left;
|
406 | pressExpandTop += hitSlop.top;
|
407 | pressExpandRight += hitSlop.right;
|
408 | pressExpandBottom += hitSlop.bottom;
|
409 | }
|
410 | var touch = extractSingleTouch(e);
|
411 | var pageX = touch && touch.pageX;
|
412 | var pageY = touch && touch.pageY;
|
413 | return pageX > positionOnGrant.left - pressExpandLeft && pageY > positionOnGrant.top - pressExpandTop && pageX < positionOnGrant.left + positionOnGrant.width + pressExpandRight && pageY < positionOnGrant.top + positionOnGrant.height + pressExpandBottom;
|
414 | }
|
415 | }, {
|
416 | key: 'callProp',
|
417 | value: function callProp(name, e) {
|
418 | if (this.props[name] && !this.props.disabled) {
|
419 | this.props[name](e);
|
420 | }
|
421 | }
|
422 | }, {
|
423 | key: 'touchableHandleActivePressIn',
|
424 | value: function touchableHandleActivePressIn(e) {
|
425 | this.setActive(true);
|
426 | this.callProp('onPressIn', e);
|
427 | }
|
428 | }, {
|
429 | key: 'touchableHandleActivePressOut',
|
430 | value: function touchableHandleActivePressOut(e) {
|
431 | this.setActive(false);
|
432 | this.callProp('onPressOut', e);
|
433 | }
|
434 | }, {
|
435 | key: 'touchableHandlePress',
|
436 | value: function touchableHandlePress(e) {
|
437 | if (shouldFirePress(e)) {
|
438 | this.callProp('onPress', e);
|
439 | }
|
440 | lastClickTime = Date.now();
|
441 | }
|
442 | }, {
|
443 | key: 'touchableHandleLongPress',
|
444 | value: function touchableHandleLongPress(e) {
|
445 | if (shouldFirePress(e)) {
|
446 | this.callProp('onLongPress', e);
|
447 | }
|
448 | }
|
449 | }, {
|
450 | key: 'setActive',
|
451 | value: function setActive(active) {
|
452 | if (this.props.activeClassName || this.props.activeStyle) {
|
453 | this.setState({
|
454 | active: active
|
455 | });
|
456 | }
|
457 | }
|
458 | }, {
|
459 | key: '_remeasureMetricsOnActivation',
|
460 | value: function _remeasureMetricsOnActivation() {
|
461 | this.touchable.dimensionsOnActivate = this.touchable.positionOnGrant;
|
462 | }
|
463 | }, {
|
464 | key: '_handleDelay',
|
465 | value: function _handleDelay(e) {
|
466 | this.touchableDelayTimeout = null;
|
467 | this._receiveSignal(Signals.DELAY, e);
|
468 | }
|
469 | }, {
|
470 | key: '_handleLongDelay',
|
471 | value: function _handleLongDelay(e) {
|
472 | this.longPressDelayTimeout = null;
|
473 | var curState = this.touchable.touchState;
|
474 | if (curState !== States.RESPONDER_ACTIVE_PRESS_IN && curState !== States.RESPONDER_ACTIVE_LONG_PRESS_IN) {
|
475 | console.error('Attempted to transition from state `' + curState + '` to `' + States.RESPONDER_ACTIVE_LONG_PRESS_IN + '`, which is not supported. This is ' + 'most likely due to `Touchable.longPressDelayTimeout` not being cancelled.');
|
476 | } else {
|
477 | this._receiveSignal(Signals.LONG_PRESS_DETECTED, e);
|
478 | }
|
479 | }
|
480 | }, {
|
481 | key: '_receiveSignal',
|
482 | value: function _receiveSignal(signal, e) {
|
483 | var curState = this.touchable.touchState;
|
484 | var nextState = Transitions[curState] && Transitions[curState][signal];
|
485 | if (!nextState) {
|
486 | return;
|
487 | }
|
488 | if (nextState === States.ERROR) {
|
489 | return;
|
490 | }
|
491 | if (curState !== nextState) {
|
492 | this._performSideEffectsForTransition(curState, nextState, signal, e);
|
493 | this.touchable.touchState = nextState;
|
494 | }
|
495 | }
|
496 | }, {
|
497 | key: '_cancelLongPressDelayTimeout',
|
498 | value: function _cancelLongPressDelayTimeout() {
|
499 | if (this.longPressDelayTimeout) {
|
500 | clearTimeout(this.longPressDelayTimeout);
|
501 | this.longPressDelayTimeout = null;
|
502 | }
|
503 | }
|
504 | }, {
|
505 | key: '_isHighlight',
|
506 | value: function _isHighlight(state) {
|
507 | return state === States.RESPONDER_ACTIVE_PRESS_IN || state === States.RESPONDER_ACTIVE_LONG_PRESS_IN;
|
508 | }
|
509 | }, {
|
510 | key: '_savePressInLocation',
|
511 | value: function _savePressInLocation(e) {
|
512 | var touch = extractSingleTouch(e);
|
513 | var pageX = touch && touch.pageX;
|
514 | var pageY = touch && touch.pageY;
|
515 | this.pressInLocation = { pageX: pageX, pageY: pageY };
|
516 | }
|
517 | }, {
|
518 | key: '_getDistanceBetweenPoints',
|
519 | value: function _getDistanceBetweenPoints(aX, aY, bX, bY) {
|
520 | var deltaX = aX - bX;
|
521 | var deltaY = aY - bY;
|
522 | return Math.sqrt(deltaX * deltaX + deltaY * deltaY);
|
523 | }
|
524 | }, {
|
525 | key: '_performSideEffectsForTransition',
|
526 | value: function _performSideEffectsForTransition(curState, nextState, signal, e) {
|
527 | var curIsHighlight = this._isHighlight(curState);
|
528 | var newIsHighlight = this._isHighlight(nextState);
|
529 | var isFinalSignal = signal === Signals.RESPONDER_TERMINATED || signal === Signals.RESPONDER_RELEASE;
|
530 | if (isFinalSignal) {
|
531 | this._cancelLongPressDelayTimeout();
|
532 | }
|
533 | if (!IsActive[curState] && IsActive[nextState]) {
|
534 | this._remeasureMetricsOnActivation();
|
535 | }
|
536 | if (IsPressingIn[curState] && signal === Signals.LONG_PRESS_DETECTED) {
|
537 | this.touchableHandleLongPress(e);
|
538 | }
|
539 | if (newIsHighlight && !curIsHighlight) {
|
540 | this._startHighlight(e);
|
541 | } else if (!newIsHighlight && curIsHighlight) {
|
542 | this._endHighlight(e);
|
543 | }
|
544 | if (IsPressingIn[curState] && signal === Signals.RESPONDER_RELEASE) {
|
545 | var hasLongPressHandler = !!this.props.onLongPress;
|
546 | var pressIsLongButStillCallOnPress = IsLongPressingIn[curState] && (!hasLongPressHandler || !this.props.longPressCancelsPress
|
547 | );
|
548 | var shouldInvokePress = !IsLongPressingIn[curState] || pressIsLongButStillCallOnPress;
|
549 | if (shouldInvokePress) {
|
550 | if (!newIsHighlight && !curIsHighlight) {
|
551 |
|
552 | this._startHighlight(e);
|
553 | this._endHighlight(e);
|
554 | }
|
555 | this.touchableHandlePress(e);
|
556 | }
|
557 | }
|
558 | if (this.touchableDelayTimeout) {
|
559 | clearTimeout(this.touchableDelayTimeout);
|
560 | this.touchableDelayTimeout = null;
|
561 | }
|
562 | }
|
563 | }, {
|
564 | key: '_startHighlight',
|
565 | value: function _startHighlight(e) {
|
566 | this._savePressInLocation(e);
|
567 | this.touchableHandleActivePressIn(e);
|
568 | }
|
569 | }, {
|
570 | key: '_endHighlight',
|
571 | value: function _endHighlight(e) {
|
572 | var _this3 = this;
|
573 |
|
574 | if (this.props.delayPressOut) {
|
575 | this.pressOutDelayTimeout = setTimeout(function () {
|
576 | _this3.touchableHandleActivePressOut(e);
|
577 | }, this.props.delayPressOut);
|
578 | } else {
|
579 | this.touchableHandleActivePressOut(e);
|
580 | }
|
581 | }
|
582 | }, {
|
583 | key: 'render',
|
584 | value: function render() {
|
585 | var _props3 = this.props,
|
586 | children = _props3.children,
|
587 | disabled = _props3.disabled,
|
588 | activeStyle = _props3.activeStyle,
|
589 | activeClassName = _props3.activeClassName;
|
590 |
|
591 | var events = disabled ? undefined : copy(this, ['onTouchStart', 'onTouchMove', 'onTouchEnd', 'onTouchCancel', 'onMouseDown']);
|
592 | var child = React.Children.only(children);
|
593 | if (!disabled && this.state.active) {
|
594 | var _child$props = child.props,
|
595 | style = _child$props.style,
|
596 | className = _child$props.className;
|
597 |
|
598 | if (activeStyle) {
|
599 | style = _extends({}, style, activeStyle);
|
600 | }
|
601 | if (activeClassName) {
|
602 | if (className) {
|
603 | className += ' ' + activeClassName;
|
604 | } else {
|
605 | className = activeClassName;
|
606 | }
|
607 | }
|
608 | return React.cloneElement(child, _extends({ className: className,
|
609 | style: style }, events));
|
610 | }
|
611 | return React.cloneElement(child, events);
|
612 | }
|
613 | }]);
|
614 |
|
615 | return Touchable;
|
616 | }(React.Component);
|
617 |
|
618 | export default Touchable;
|
619 |
|
620 | Touchable.defaultProps = {
|
621 | fixClickPenetration: false,
|
622 | disabled: false,
|
623 | delayPressIn: HIGHLIGHT_DELAY_MS,
|
624 | delayLongPress: LONG_PRESS_DELAY_MS,
|
625 | delayPressOut: 100,
|
626 | pressRetentionOffset: {
|
627 | left: PRESS_EXPAND_PX,
|
628 | right: PRESS_EXPAND_PX,
|
629 | top: PRESS_EXPAND_PX,
|
630 | bottom: PRESS_EXPAND_PX
|
631 | },
|
632 | hitSlop: undefined,
|
633 | longPressCancelsPress: true
|
634 | }; |
\ | No newline at end of file |