haunted
Version:
Hooks for web components
49 lines (48 loc) • 1.74 kB
JavaScript
import { contextEvent } from "./symbols";
import { useContext } from "./use-context";
function makeContext(component) {
return (defaultValue) => {
const Context = {
Provider: class extends HTMLElement {
listeners;
_value;
constructor() {
super();
this.listeners = new Set();
this.addEventListener(contextEvent, this);
}
disconnectedCallback() {
this.removeEventListener(contextEvent, this);
}
handleEvent(event) {
const { detail } = event;
if (detail.Context === Context) {
detail.value = this.value;
detail.unsubscribe = this.unsubscribe.bind(this, detail.callback);
this.listeners.add(detail.callback);
event.stopPropagation();
}
}
unsubscribe(callback) {
this.listeners.delete(callback);
}
set value(value) {
this._value = value;
for (let callback of this.listeners) {
callback(value);
}
}
get value() {
return this._value;
}
},
Consumer: component(function ({ render }) {
const context = useContext(Context);
return render(context);
}, { useShadowDOM: false }),
defaultValue,
};
return Context;
};
}
export { makeContext };