stencil-quantum
Version:
Experience the quantum realm of stencil.
91 lines (90 loc) • 2.68 kB
JavaScript
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
});
}
};
}