@expressive/react
Version:
Use classes to define state in React!
40 lines • 1.23 kB
JavaScript
// 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