stencil-wormhole
Version:
Pass props down component trees easily via wormholes.
67 lines (66 loc) • 2.8 kB
JavaScript
import { getElement, getRenderingRef } from "@stencil/core";
var multiverse = new Map();
var updateConsumer = function (_a, state) {
var fields = _a.fields, updater = _a.updater;
fields.forEach(function (field) { updater(field, state[field]); });
};
export var Universe = {
create: function (creator, initialState) {
var el = getElement(creator);
var wormholes = new Map();
var universe = { wormholes: wormholes, state: initialState };
multiverse.set(creator, universe);
var connectedCallback = creator.connectedCallback;
creator.connectedCallback = function () {
multiverse.set(creator, universe);
if (connectedCallback) {
connectedCallback.call(creator);
}
};
var disconnectedCallback = creator.disconnectedCallback;
creator.disconnectedCallback = function () {
multiverse.delete(creator);
if (disconnectedCallback) {
disconnectedCallback.call(creator);
}
};
el.addEventListener('openWormhole', function (event) {
event.stopPropagation();
var _a = event.detail, consumer = _a.consumer, onOpen = _a.onOpen;
if (wormholes.has(consumer))
return;
if (typeof consumer !== 'symbol') {
var connectedCallback_1 = consumer.connectedCallback, disconnectedCallback_1 = consumer.disconnectedCallback;
consumer.connectedCallback = function () {
wormholes.set(consumer, event.detail);
if (connectedCallback_1) {
connectedCallback_1.call(consumer);
}
};
consumer.disconnectedCallback = function () {
wormholes.delete(consumer);
if (disconnectedCallback_1) {
disconnectedCallback_1.call(consumer);
}
};
}
wormholes.set(consumer, event.detail);
updateConsumer(event.detail, universe.state);
onOpen === null || onOpen === void 0 ? void 0 : onOpen.resolve(function () { wormholes.delete(consumer); });
});
el.addEventListener('closeWormhole', function (event) {
var consumer = event.detail;
wormholes.delete(consumer);
});
},
Provider: function (_a, children) {
var state = _a.state;
var creator = getRenderingRef();
if (multiverse.has(creator)) {
var universe = multiverse.get(creator);
universe.state = state;
universe.wormholes.forEach(function (opening) { updateConsumer(opening, state); });
}
return children;
}
};