UNPKG

24.5 kBJavaScriptView Raw
1import _extends from 'babel-runtime/helpers/extends';
2import _classCallCheck from 'babel-runtime/helpers/classCallCheck';
3import _createClass from 'babel-runtime/helpers/createClass';
4import _possibleConstructorReturn from 'babel-runtime/helpers/possibleConstructorReturn';
5import _inherits from 'babel-runtime/helpers/inherits';
6// inspired by react-native
7import React from 'react';
8import ReactDOM from 'react-dom';
9import PressEvent, { shouldFirePress } from './PressEvent';
10function keyMirror(obj) {
11 Object.keys(obj).forEach(function (k) {
12 return obj[k] = k;
13 });
14 return obj;
15}
16function copy(from, list) {
17 var to = {};
18 list.forEach(function (k) {
19 to[k] = from[k];
20 });
21 return to;
22}
23function 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 * Touchable states.
36 */
37var 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 * Quick lookup map for states that are considered to be "active"
49 */
50var IsActive = {
51 RESPONDER_ACTIVE_PRESS_OUT: true,
52 RESPONDER_ACTIVE_PRESS_IN: true
53};
54/**
55 * Quick lookup for states that are considered to be "pressing" and are
56 * therefore eligible to result in a "selection" if the press stops.
57 */
58var IsPressingIn = {
59 RESPONDER_INACTIVE_PRESS_IN: true,
60 RESPONDER_ACTIVE_PRESS_IN: true,
61 RESPONDER_ACTIVE_LONG_PRESS_IN: true
62};
63var IsLongPressingIn = {
64 RESPONDER_ACTIVE_LONG_PRESS_IN: true
65};
66/**
67 * Inputs to the state machine.
68 */
69var 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 * Mapping from States x Signals => States
80 */
81var 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// ==== Typical Constants for integrating into UI components ====
156// const HIT_EXPAND_PX = 20;
157// const HIT_VERT_OFFSET_PX = 10;
158var HIGHLIGHT_DELAY_MS = 130;
159var PRESS_EXPAND_PX = 20;
160var LONG_PRESS_THRESHOLD = 500;
161var LONG_PRESS_DELAY_MS = LONG_PRESS_THRESHOLD - HIGHLIGHT_DELAY_MS;
162var LONG_PRESS_ALLOWED_MOVEMENT = 10;
163var lastClickTime = 0;
164var pressDelay = 200;
165function isAllowPress() {
166 // avoid click penetration
167 return Date.now() - lastClickTime >= pressDelay;
168}
169
170var 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 // Measurement may not have returned yet.
226 if (!_this.touchable.dimensionsOnActivate || _this.touchable.touchState === States.NOT_RESPONDER) {
227 return;
228 }
229 // Not enough time elapsed yet, wait for highlight -
230 // this is just a perf optimization.
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 // disabled auto clear active state
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 // container or window scroll
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 // or we're told to ignore it.
547 );
548 var shouldInvokePress = !IsLongPressingIn[curState] || pressIsLongButStillCallOnPress;
549 if (shouldInvokePress) {
550 if (!newIsHighlight && !curIsHighlight) {
551 // we never highlighted because of delay, but we should highlight now
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
618export default Touchable;
619
620Touchable.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