stencil-quantum
Version:
Experience the quantum realm of stencil.
56 lines (55 loc) • 1.77 kB
JavaScript
import { Provider } from "../provider";
import { getElement } from "@stencil/core";
import { hookComponent, nop } from "../utils";
import { throwQuantum } from "../error";
export function React(from, fromKey, to, toKey) {
return function (prototype, propertyName, propertyDesciptor) {
const fromOpts = from.get(fromKey);
const toOpts = to.get(toKey);
const method = propertyDesciptor.value;
hookComponent(prototype, "componentWillLoad", obj => {
const el = getElement(obj);
let listener;
let inputProvider;
const resultProvider = Provider.create(el, toOpts.name, undefined, toOpts.namespace);
resultProvider.mutable = !!toOpts.mutable;
const hookProvider = () => {
inputProvider = Provider.find(el, fromOpts.name, fromOpts.namespace);
listener = inputProvider.listen(async (v) => {
try {
const result = await method.apply(obj, [v]);
if (resultProvider)
resultProvider.provide(result);
}
catch (err) {
throwQuantum(el, err);
}
});
};
hookComponent(prototype, "disconnectedCallback", o => {
if (o === obj && listener)
listener.paused = true;
});
hookComponent(prototype, "connectedCallback", o => {
if (o === obj && listener)
listener.paused = false;
});
try {
hookProvider();
return nop;
}
catch (err) {
return () => {
listener === null || listener === void 0 ? void 0 : listener.unlisten();
try {
hookProvider();
}
catch (err) {
throwQuantum(el, err);
}
};
}
});
return propertyDesciptor;
};
}