evento-react
Version:
- Dispatch custom component events with a payload, or forward React synthetic events. - Replicate Svelte's `createEventDispatcher` and Vue's `$emit` behavior in React. - Hook + HOC for class components. - TypeScript support.
151 lines (124 loc) • 4.82 kB
JavaScript
Object.defineProperty(exports, '__esModule', { value: true });
var React = require('react');
function _interopNamespace(e) {
if (e && e.__esModule) return e;
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n["default"] = e;
return n;
}
var React__namespace = /*#__PURE__*/_interopNamespace(React);
function _extends() {
_extends = Object.assign || function (target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i];
for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}
return target;
};
return _extends.apply(this, arguments);
}
function IE_custom_event(evtType, evtDetail) {
var evt = document.createEvent('CustomEvent');
evt.initCustomEvent(evtType, false, false, evtDetail);
return evt;
}
function is_of_type(variable, targetType) {
return typeof variable === targetType;
}
function create_custom_event(evtType, evtDetail) {
var customEvt = typeof window.CustomEvent === 'function' ? IE_custom_event(evtType, evtDetail) : new CustomEvent(evtType, {
detail: evtDetail
});
return customEvt;
}
function event_name_to_prop_name(eventName) {
var propName = 'on' + eventName.charAt(0).toUpperCase() + eventName.slice(1);
return propName;
}
function is_synthetic_event_duck_typing(payload) {
return is_of_type(payload.bubbles, 'boolean') && is_of_type(payload.cancelable, 'boolean') && is_of_type(payload.defaultPrevented, 'boolean') && is_of_type(payload.eventPhase, 'number') && is_of_type(payload.isTrusted, 'boolean') && is_of_type(payload.preventDefault, 'function') && is_of_type(payload.isDefaultPrevented, 'function') && is_of_type(payload.stopPropagation, 'function') && is_of_type(payload.isPropagationStopped, 'function') && is_of_type(payload.persist, 'function') && is_of_type(payload.timeStamp, 'number') && is_of_type(payload.type, 'string') && payload.currentTarget && payload.nativeEvent && payload.target;
}
function useCreateEvento(props) {
return React__namespace.useCallback(function () {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
var eventName = args[0],
payload = args[1];
var propName = event_name_to_prop_name(eventName);
var cb = props[propName];
if (typeof cb !== 'function') {
return new Promise(function (resolve) {
return resolve(false);
});
}
var eventPayload = payload && is_synthetic_event_duck_typing(payload) ? payload : create_custom_event(eventName, payload);
var res = cb(eventPayload);
if (res instanceof Promise) {
return res.then(function () {
return true;
});
}
return new Promise(function (resolve) {
return resolve(true);
});
}, [props]);
}
function useExpCreateEvento() {
var _React$__SECRET_INTER, _React$__SECRET_INTER2;
// @ts-ignore: Unreachable code error
var props = (_React$__SECRET_INTER = React__namespace.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner) == null ? void 0 : (_React$__SECRET_INTER2 = _React$__SECRET_INTER.current) == null ? void 0 : _React$__SECRET_INTER2.pendingProps;
return React__namespace.useCallback(function () {
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
var eventName = args[0],
payload = args[1];
var propName = event_name_to_prop_name(eventName);
var cb = props[propName];
if (typeof cb !== 'function') {
return new Promise(function (resolve) {
return resolve(false);
});
}
var eventPayload = payload && is_synthetic_event_duck_typing(payload) ? payload : create_custom_event(eventName, payload);
var res = cb(eventPayload);
if (res instanceof Promise) {
return res.then(function () {
return true;
});
}
return new Promise(function (resolve) {
return resolve(true);
});
}, [props]);
}
function withEvento(El) {
return function (props) {
var evento = useCreateEvento(props);
var updatedProps = _extends({}, props, {
evento: evento
});
return /*#__PURE__*/React__namespace.createElement(El, updatedProps);
};
}
exports.useCreateEvento = useCreateEvento;
exports.useExpCreateEvento = useExpCreateEvento;
exports.withEvento = withEvento;
//# sourceMappingURL=evento-react.cjs.development.js.map
;