UNPKG

haunted

Version:
49 lines (48 loc) 1.74 kB
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 };