You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
3.9 KiB
88 lines
3.9 KiB
"use strict";
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = void 0;
|
|
var _reactNative = require("react-native");
|
|
var _act = _interopRequireDefault(require("./act"));
|
|
var _componentTree = require("./helpers/component-tree");
|
|
var _filterNodeByType = require("./helpers/filterNodeByType");
|
|
var _hostComponentNames = require("./helpers/host-component-names");
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
const isTextInput = element => {
|
|
if (!element) {
|
|
return false;
|
|
}
|
|
|
|
// We have to test if the element type is either the TextInput component
|
|
// (which would if it is a composite component) or the string
|
|
// TextInput (which would be true if it is a host component)
|
|
// All queries return host components but since fireEvent bubbles up
|
|
// it would trigger the parent prop without the composite component check
|
|
return (0, _filterNodeByType.filterNodeByType)(element, _reactNative.TextInput) || (0, _filterNodeByType.filterNodeByType)(element, (0, _hostComponentNames.getHostComponentNames)().textInput);
|
|
};
|
|
const isTouchResponder = element => {
|
|
if (!(0, _componentTree.isHostElement)(element)) return false;
|
|
return !!element?.props.onStartShouldSetResponder || isTextInput(element);
|
|
};
|
|
const isPointerEventEnabled = (element, isParent) => {
|
|
const parentCondition = isParent ? element?.props.pointerEvents === 'box-only' : element?.props.pointerEvents === 'box-none';
|
|
if (element?.props.pointerEvents === 'none' || parentCondition) {
|
|
return false;
|
|
}
|
|
if (!element?.parent) return true;
|
|
return isPointerEventEnabled(element.parent, true);
|
|
};
|
|
const isTouchEvent = eventName => {
|
|
return eventName === 'press';
|
|
};
|
|
const isEventEnabled = (element, touchResponder, eventName) => {
|
|
if (isTextInput(element)) return element?.props.editable !== false;
|
|
if (!isPointerEventEnabled(element) && isTouchEvent(eventName)) return false;
|
|
const touchStart = touchResponder?.props.onStartShouldSetResponder?.();
|
|
const touchMove = touchResponder?.props.onMoveShouldSetResponder?.();
|
|
if (touchStart || touchMove) return true;
|
|
return touchStart === undefined && touchMove === undefined;
|
|
};
|
|
const findEventHandler = (element, eventName, callsite, nearestTouchResponder) => {
|
|
const touchResponder = isTouchResponder(element) ? element : nearestTouchResponder;
|
|
const handler = getEventHandler(element, eventName);
|
|
if (handler && isEventEnabled(element, touchResponder, eventName)) return handler;
|
|
if (element.parent === null || element.parent.parent === null) {
|
|
return null;
|
|
}
|
|
return findEventHandler(element.parent, eventName, callsite, touchResponder);
|
|
};
|
|
const getEventHandler = (element, eventName) => {
|
|
const eventHandlerName = toEventHandlerName(eventName);
|
|
if (typeof element.props[eventHandlerName] === 'function') {
|
|
return element.props[eventHandlerName];
|
|
}
|
|
if (typeof element.props[eventName] === 'function') {
|
|
return element.props[eventName];
|
|
}
|
|
return undefined;
|
|
};
|
|
const invokeEvent = (element, eventName, callsite, ...data) => {
|
|
const handler = findEventHandler(element, eventName, callsite);
|
|
if (!handler) {
|
|
return;
|
|
}
|
|
let returnValue;
|
|
(0, _act.default)(() => {
|
|
returnValue = handler(...data);
|
|
});
|
|
return returnValue;
|
|
};
|
|
const toEventHandlerName = eventName => `on${eventName.charAt(0).toUpperCase()}${eventName.slice(1)}`;
|
|
const pressHandler = (element, ...data) => invokeEvent(element, 'press', pressHandler, ...data);
|
|
const changeTextHandler = (element, ...data) => invokeEvent(element, 'changeText', changeTextHandler, ...data);
|
|
const scrollHandler = (element, ...data) => invokeEvent(element, 'scroll', scrollHandler, ...data);
|
|
const fireEvent = (element, eventName, ...data) => invokeEvent(element, eventName, fireEvent, ...data);
|
|
fireEvent.press = pressHandler;
|
|
fireEvent.changeText = changeTextHandler;
|
|
fireEvent.scroll = scrollHandler;
|
|
var _default = fireEvent;
|
|
exports.default = _default;
|
|
//# sourceMappingURL=fireEvent.js.map
|