UNPKG

stencil-quantum

Version:

Experience the quantum realm of stencil.

56 lines (55 loc) 1.77 kB
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; }; }