Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
81155 views
1
/**
2
* Copyright 2013-2014, Facebook, Inc.
3
* All rights reserved.
4
*
5
* This source code is licensed under the BSD-style license found in the
6
* LICENSE file in the root directory of this source tree. An additional grant
7
* of patent rights can be found in the PATENTS file in the same directory.
8
*
9
* @providesModule TapEventPlugin
10
* @typechecks static-only
11
*/
12
13
"use strict";
14
15
var EventConstants = require('EventConstants');
16
var EventPluginUtils = require('EventPluginUtils');
17
var EventPropagators = require('EventPropagators');
18
var SyntheticUIEvent = require('SyntheticUIEvent');
19
var TouchEventUtils = require('TouchEventUtils');
20
var ViewportMetrics = require('ViewportMetrics');
21
22
var keyOf = require('keyOf');
23
var topLevelTypes = EventConstants.topLevelTypes;
24
25
var isStartish = EventPluginUtils.isStartish;
26
var isEndish = EventPluginUtils.isEndish;
27
28
/**
29
* Number of pixels that are tolerated in between a `touchStart` and `touchEnd`
30
* in order to still be considered a 'tap' event.
31
*/
32
var tapMoveThreshold = 10;
33
var startCoords = {x: null, y: null};
34
35
var Axis = {
36
x: {page: 'pageX', client: 'clientX', envScroll: 'currentPageScrollLeft'},
37
y: {page: 'pageY', client: 'clientY', envScroll: 'currentPageScrollTop'}
38
};
39
40
function getAxisCoordOfEvent(axis, nativeEvent) {
41
var singleTouch = TouchEventUtils.extractSingleTouch(nativeEvent);
42
if (singleTouch) {
43
return singleTouch[axis.page];
44
}
45
return axis.page in nativeEvent ?
46
nativeEvent[axis.page] :
47
nativeEvent[axis.client] + ViewportMetrics[axis.envScroll];
48
}
49
50
function getDistance(coords, nativeEvent) {
51
var pageX = getAxisCoordOfEvent(Axis.x, nativeEvent);
52
var pageY = getAxisCoordOfEvent(Axis.y, nativeEvent);
53
return Math.pow(
54
Math.pow(pageX - coords.x, 2) + Math.pow(pageY - coords.y, 2),
55
0.5
56
);
57
}
58
59
var dependencies = [
60
topLevelTypes.topMouseDown,
61
topLevelTypes.topMouseMove,
62
topLevelTypes.topMouseUp
63
];
64
65
if (EventPluginUtils.useTouchEvents) {
66
dependencies.push(
67
topLevelTypes.topTouchCancel,
68
topLevelTypes.topTouchEnd,
69
topLevelTypes.topTouchStart,
70
topLevelTypes.topTouchMove
71
);
72
}
73
74
var eventTypes = {
75
touchTap: {
76
phasedRegistrationNames: {
77
bubbled: keyOf({onTouchTap: null}),
78
captured: keyOf({onTouchTapCapture: null})
79
},
80
dependencies: dependencies
81
}
82
};
83
84
var TapEventPlugin = {
85
86
tapMoveThreshold: tapMoveThreshold,
87
88
eventTypes: eventTypes,
89
90
/**
91
* @param {string} topLevelType Record from `EventConstants`.
92
* @param {DOMEventTarget} topLevelTarget The listening component root node.
93
* @param {string} topLevelTargetID ID of `topLevelTarget`.
94
* @param {object} nativeEvent Native browser event.
95
* @return {*} An accumulation of synthetic events.
96
* @see {EventPluginHub.extractEvents}
97
*/
98
extractEvents: function(
99
topLevelType,
100
topLevelTarget,
101
topLevelTargetID,
102
nativeEvent) {
103
if (!isStartish(topLevelType) && !isEndish(topLevelType)) {
104
return null;
105
}
106
var event = null;
107
var distance = getDistance(startCoords, nativeEvent);
108
if (isEndish(topLevelType) && distance < tapMoveThreshold) {
109
event = SyntheticUIEvent.getPooled(
110
eventTypes.touchTap,
111
topLevelTargetID,
112
nativeEvent
113
);
114
}
115
if (isStartish(topLevelType)) {
116
startCoords.x = getAxisCoordOfEvent(Axis.x, nativeEvent);
117
startCoords.y = getAxisCoordOfEvent(Axis.y, nativeEvent);
118
} else if (isEndish(topLevelType)) {
119
startCoords.x = 0;
120
startCoords.y = 0;
121
}
122
EventPropagators.accumulateTwoPhaseDispatches(event);
123
return event;
124
}
125
126
};
127
128
module.exports = TapEventPlugin;
129
130