"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;