UNPKG

@expressive/react

Version:
38 lines (36 loc) 1.11 kB
import { Context } from "@expressive/state"; import { Suspense, createContext, createElement, useContext, useEffect, useMemo } from "react"; //#region src/context.ts const Layers = createContext(new Context()); Context.use = (create) => { const ambient = useContext(Layers); return create ? useMemo(() => ambient.push(), [ambient]) : ambient; }; function Consumer(props) { return props.for.get((i) => props.children(i)); } function Provider(props) { const context = Context.use(true); useEffect(() => () => context.pop(), [context]); context.use(props.for, (state) => { if (props.forEach) { const cleanup = props.forEach(state); if (cleanup) state.set(cleanup, null); } }); return provide(context, props.children, props.fallback, props.name); } function provide(context, children, fallback, name) { if (fallback !== void 0) children = createElement(Suspense, { fallback, name }, children); return createElement(Layers.Provider, { key: context.id, value: context, children }); } //#endregion export { Consumer, Layers, Provider, provide }; //# sourceMappingURL=context.js.map