@expressive/react
Version:
Use classes to define state in React!
38 lines (36 loc) • 1.11 kB
JavaScript
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