UNPKG

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
'use strict'; 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