From de98e0b232509d5f40c135d540a70e415272ff85 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Wed, 3 May 2017 15:35:00 +0200 Subject: node_modules --- node_modules/react-dom/lib/TapEventPlugin.js | 115 +++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 node_modules/react-dom/lib/TapEventPlugin.js (limited to 'node_modules/react-dom/lib/TapEventPlugin.js') diff --git a/node_modules/react-dom/lib/TapEventPlugin.js b/node_modules/react-dom/lib/TapEventPlugin.js new file mode 100644 index 000000000..463fe9851 --- /dev/null +++ b/node_modules/react-dom/lib/TapEventPlugin.js @@ -0,0 +1,115 @@ +/** + * Copyright 2013-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * + */ + +'use strict'; + +var EventPluginUtils = require('./EventPluginUtils'); +var EventPropagators = require('./EventPropagators'); +var SyntheticUIEvent = require('./SyntheticUIEvent'); +var TouchEventUtils = require('fbjs/lib/TouchEventUtils'); +var ViewportMetrics = require('./ViewportMetrics'); + +var isStartish = EventPluginUtils.isStartish; +var isEndish = EventPluginUtils.isEndish; + +/** + * We are extending the Flow 'Touch' declaration to enable using bracket + * notation to access properties. + * Without this adjustment Flow throws + * "Indexable signature not found in Touch". + * See https://github.com/facebook/flow/issues/1323 + */ + + +/** + * Number of pixels that are tolerated in between a `touchStart` and `touchEnd` + * in order to still be considered a 'tap' event. + */ +var tapMoveThreshold = 10; +var startCoords = { x: 0, y: 0 }; + +var Axis = { + x: { page: 'pageX', client: 'clientX', envScroll: 'currentPageScrollLeft' }, + y: { page: 'pageY', client: 'clientY', envScroll: 'currentPageScrollTop' } +}; + +function getAxisCoordOfEvent(axis, nativeEvent) { + var singleTouch = TouchEventUtils.extractSingleTouch(nativeEvent); + if (singleTouch) { + return singleTouch[axis.page]; + } + return axis.page in nativeEvent ? nativeEvent[axis.page] : nativeEvent[axis.client] + ViewportMetrics[axis.envScroll]; +} + +function getDistance(coords, nativeEvent) { + var pageX = getAxisCoordOfEvent(Axis.x, nativeEvent); + var pageY = getAxisCoordOfEvent(Axis.y, nativeEvent); + return Math.pow(Math.pow(pageX - coords.x, 2) + Math.pow(pageY - coords.y, 2), 0.5); +} + +var touchEvents = ['topTouchStart', 'topTouchCancel', 'topTouchEnd', 'topTouchMove']; + +var dependencies = ['topMouseDown', 'topMouseMove', 'topMouseUp'].concat(touchEvents); + +var eventTypes = { + touchTap: { + phasedRegistrationNames: { + bubbled: 'onTouchTap', + captured: 'onTouchTapCapture' + }, + dependencies: dependencies + } +}; + +var usedTouch = false; +var usedTouchTime = 0; +var TOUCH_DELAY = 1000; + +var TapEventPlugin = { + + tapMoveThreshold: tapMoveThreshold, + + eventTypes: eventTypes, + + extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) { + if (!isStartish(topLevelType) && !isEndish(topLevelType)) { + return null; + } + // on ios, there is a delay after touch event and synthetic + // mouse events, so that user can perform double tap + // solution: ignore mouse events following touchevent within small timeframe + if (touchEvents.indexOf(topLevelType) !== -1) { + usedTouch = true; + usedTouchTime = Date.now(); + } else { + if (usedTouch && Date.now() - usedTouchTime < TOUCH_DELAY) { + return null; + } + } + var event = null; + var distance = getDistance(startCoords, nativeEvent); + if (isEndish(topLevelType) && distance < tapMoveThreshold) { + event = SyntheticUIEvent.getPooled(eventTypes.touchTap, targetInst, nativeEvent, nativeEventTarget); + } + if (isStartish(topLevelType)) { + startCoords.x = getAxisCoordOfEvent(Axis.x, nativeEvent); + startCoords.y = getAxisCoordOfEvent(Axis.y, nativeEvent); + } else if (isEndish(topLevelType)) { + startCoords.x = 0; + startCoords.y = 0; + } + EventPropagators.accumulateTwoPhaseDispatches(event); + return event; + } + +}; + +module.exports = TapEventPlugin; \ No newline at end of file -- cgit v1.2.3