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

"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