UNPKG

@expressive/react

Version:
40 lines 1.23 kB
// src/context.ts import Model, { Context } from "@expressive/mvc"; import { createContext, createElement, Suspense, useContext, useEffect, useMemo } from "react"; var Lookup = createContext(new Context()); Context.use = (create) => { const ambient = useContext(Lookup); return create ? useMemo(() => ambient.push(), []) : 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.include(props.for, (model) => { if (props.forEach) { const cleanup = props.forEach(model); if (cleanup) model.set(cleanup, null); } }); return createProvider(context, props.children, props.fallback, props.name); } function createProvider(context, children, fallback, name) { if (context instanceof Model) context = Context.get(context); const element = createElement(Lookup.Provider, { key: context.id, value: context, children }); return fallback !== void 0 ? createElement(Suspense, { fallback, name }, element) : element; } export { Consumer, Context, Provider, createProvider }; //# sourceMappingURL=context.js.map