174 lines
5.1 KiB
JavaScript
174 lines
5.1 KiB
JavaScript
"use strict";
|
|
|
|
exports.__esModule = true;
|
|
exports.default = createResponderEvent;
|
|
|
|
var _getBoundingClientRect = _interopRequireDefault(require("../../modules/getBoundingClientRect"));
|
|
|
|
var _ResponderTouchHistoryStore = _interopRequireDefault(require("./ResponderTouchHistoryStore"));
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
/**
|
|
* Copyright (c) Nicolas Gallagher
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
*
|
|
*/
|
|
var emptyFunction = function emptyFunction() {};
|
|
|
|
var emptyObject = {};
|
|
var emptyArray = [];
|
|
/**
|
|
* Safari produces very large identifiers that would cause the `touchBank` array
|
|
* length to be so large as to crash the browser, if not normalized like this.
|
|
* In the future the `touchBank` should use an object/map instead.
|
|
*/
|
|
|
|
function normalizeIdentifier(identifier) {
|
|
return identifier > 20 ? identifier % 20 : identifier;
|
|
}
|
|
/**
|
|
* Converts a native DOM event to a ResponderEvent.
|
|
* Mouse events are transformed into fake touch events.
|
|
*/
|
|
|
|
|
|
function createResponderEvent(domEvent) {
|
|
var rect;
|
|
var propagationWasStopped = false;
|
|
var changedTouches;
|
|
var touches;
|
|
var domEventChangedTouches = domEvent.changedTouches;
|
|
var domEventType = domEvent.type;
|
|
var metaKey = domEvent.metaKey === true;
|
|
var shiftKey = domEvent.shiftKey === true;
|
|
var force = domEventChangedTouches && domEventChangedTouches[0].force || 0;
|
|
var identifier = normalizeIdentifier(domEventChangedTouches && domEventChangedTouches[0].identifier || 0);
|
|
var clientX = domEventChangedTouches && domEventChangedTouches[0].clientX || domEvent.clientX;
|
|
var clientY = domEventChangedTouches && domEventChangedTouches[0].clientY || domEvent.clientY;
|
|
var pageX = domEventChangedTouches && domEventChangedTouches[0].pageX || domEvent.pageX;
|
|
var pageY = domEventChangedTouches && domEventChangedTouches[0].pageY || domEvent.pageY;
|
|
var preventDefault = typeof domEvent.preventDefault === 'function' ? domEvent.preventDefault.bind(domEvent) : emptyFunction;
|
|
var timestamp = domEvent.timeStamp;
|
|
|
|
function normalizeTouches(touches) {
|
|
return Array.prototype.slice.call(touches).map(function (touch) {
|
|
return {
|
|
force: touch.force,
|
|
identifier: normalizeIdentifier(touch.identifier),
|
|
|
|
get locationX() {
|
|
return locationX(touch.clientX);
|
|
},
|
|
|
|
get locationY() {
|
|
return locationY(touch.clientY);
|
|
},
|
|
|
|
pageX: touch.pageX,
|
|
pageY: touch.pageY,
|
|
target: touch.target,
|
|
timestamp: timestamp
|
|
};
|
|
});
|
|
}
|
|
|
|
if (domEventChangedTouches != null) {
|
|
changedTouches = normalizeTouches(domEventChangedTouches);
|
|
touches = normalizeTouches(domEvent.touches);
|
|
} else {
|
|
var emulatedTouches = [{
|
|
force: force,
|
|
identifier: identifier,
|
|
|
|
get locationX() {
|
|
return locationX(clientX);
|
|
},
|
|
|
|
get locationY() {
|
|
return locationY(clientY);
|
|
},
|
|
|
|
pageX: pageX,
|
|
pageY: pageY,
|
|
target: domEvent.target,
|
|
timestamp: timestamp
|
|
}];
|
|
changedTouches = emulatedTouches;
|
|
touches = domEventType === 'mouseup' || domEventType === 'dragstart' ? emptyArray : emulatedTouches;
|
|
}
|
|
|
|
var responderEvent = {
|
|
bubbles: true,
|
|
cancelable: true,
|
|
// `currentTarget` is set before dispatch
|
|
currentTarget: null,
|
|
defaultPrevented: domEvent.defaultPrevented,
|
|
dispatchConfig: emptyObject,
|
|
eventPhase: domEvent.eventPhase,
|
|
isDefaultPrevented: function isDefaultPrevented() {
|
|
return domEvent.defaultPrevented;
|
|
},
|
|
isPropagationStopped: function isPropagationStopped() {
|
|
return propagationWasStopped;
|
|
},
|
|
isTrusted: domEvent.isTrusted,
|
|
nativeEvent: {
|
|
altKey: false,
|
|
ctrlKey: false,
|
|
metaKey: metaKey,
|
|
shiftKey: shiftKey,
|
|
changedTouches: changedTouches,
|
|
force: force,
|
|
identifier: identifier,
|
|
|
|
get locationX() {
|
|
return locationX(clientX);
|
|
},
|
|
|
|
get locationY() {
|
|
return locationY(clientY);
|
|
},
|
|
|
|
pageX: pageX,
|
|
pageY: pageY,
|
|
target: domEvent.target,
|
|
timestamp: timestamp,
|
|
touches: touches,
|
|
type: domEventType
|
|
},
|
|
persist: emptyFunction,
|
|
preventDefault: preventDefault,
|
|
stopPropagation: function stopPropagation() {
|
|
propagationWasStopped = true;
|
|
},
|
|
target: domEvent.target,
|
|
timeStamp: timestamp,
|
|
touchHistory: _ResponderTouchHistoryStore.default.touchHistory
|
|
}; // Using getters and functions serves two purposes:
|
|
// 1) The value of `currentTarget` is not initially available.
|
|
// 2) Measuring the clientRect may cause layout jank and should only be done on-demand.
|
|
|
|
function locationX(x) {
|
|
rect = rect || (0, _getBoundingClientRect.default)(responderEvent.currentTarget);
|
|
|
|
if (rect) {
|
|
return x - rect.left;
|
|
}
|
|
}
|
|
|
|
function locationY(y) {
|
|
rect = rect || (0, _getBoundingClientRect.default)(responderEvent.currentTarget);
|
|
|
|
if (rect) {
|
|
return y - rect.top;
|
|
}
|
|
}
|
|
|
|
return responderEvent;
|
|
}
|
|
|
|
module.exports = exports.default; |