stencil-quantum
Version:
Experience the quantum realm of stencil.
51 lines (50 loc) • 1.52 kB
JavaScript
import { throwQuantum } from "../error";
import { Provider } from "../provider";
import { hookComponent } from "../utils";
import { getElement } from "@stencil/core";
export function Observe(config, key) {
return function (prototype, propertyName, propertyDesciptor) {
const opts = config === null || config === void 0 ? void 0 : config.get(key);
const method = propertyDesciptor.value;
hookComponent(prototype, "componentWillLoad", obj => {
let provider;
let listener;
const el = getElement(obj);
const hookProvider = () => {
provider = Provider.find(el, key, opts === null || opts === void 0 ? void 0 : opts.namespace);
listener = provider.listen(v => {
try {
method.apply(obj, [v]);
}
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();
}
catch (err) { }
return () => {
if (provider)
return;
listener === null || listener === void 0 ? void 0 : listener.unlisten();
try {
hookProvider();
}
catch (err) {
throwQuantum(el, err);
}
};
});
return propertyDesciptor;
};
}