UNPKG

stencil-quantum

Version:

Experience the quantum realm of stencil.

91 lines (90 loc) 2.68 kB
import { Provider } from "./provider"; import { hookComponent } from "./utils"; import { forceUpdate } from "@stencil/core"; import { throwQuantum } from "./error"; import { getElement } from "@stencil/core"; export function Emit(opts) { return function (prototype, propertyName) { var _a; const _event = (_a = opts.on) !== null && _a !== void 0 ? _a : propertyName; let provider; let value = prototype[propertyName]; hookComponent(prototype, "componentWillLoad", obj => { const el = getElement(obj); try { provider = Provider.find(el, opts.emitter, opts.namespace); if (value) provider.retrieve().emit(_event, value); provider.hook(el); } catch (err) { } return () => { try { if (provider) provider.unhook(el); provider = Provider.find(el, opts.emitter); if (value) provider.retrieve().emit(_event, value); provider.hook(el); } catch (err) { throwQuantum(el, err); } }; }); if (delete prototype[propertyName]) { Object.defineProperty(prototype, propertyName, { get: () => value, set: (v) => { provider === null || provider === void 0 ? void 0 : provider.retrieve().emit(_event, v); value = v; }, enumerable: true, configurable: true }); } }; } export function Receive(opts) { return function (prototype, propertyName) { var _a; const _event = (_a = opts.on) !== null && _a !== void 0 ? _a : propertyName; let el; let value = prototype[propertyName]; const onValue = (v) => { value = v; forceUpdate(el); }; hookComponent(prototype, "componentWillLoad", obj => { let provider; let lastEmitter; el = getElement(obj); const findAndListen = (onErr = (e) => { }) => { try { if (!provider) { provider = Provider.find(el, opts.emitter, opts.namespace); provider.listen(emitter => { lastEmitter === null || lastEmitter === void 0 ? void 0 : lastEmitter.off(_event, onValue); emitter.on(_event, onValue); lastEmitter = emitter; }); } } catch (err) { onErr(err); } }; findAndListen(); return () => findAndListen(err => throwQuantum(el, err)); }); if (delete prototype[propertyName]) { Object.defineProperty(prototype, propertyName, { get: () => value, set: onValue, enumerable: true, configurable: true }); } }; }