constate
Version:
Yet another React state management library that lets you work with local state and scale up to global state with ease
42 lines (41 loc) • 1.49 kB
JavaScript
import * as React from "react";
//#region src/index.tsx
const isDev = process.env.NODE_ENV !== "production";
const NO_PROVIDER = {};
function createUseContext(context) {
return () => {
const value = React.useContext(context);
if (isDev && value === NO_PROVIDER) {
const warnMessage = context.displayName ? `The context consumer of ${context.displayName} must be wrapped with its corresponding Provider` : "Component must be wrapped with Provider.";
console.warn(warnMessage);
}
return value;
};
}
function constate(useValue, ...selectors) {
const contexts = [];
const hooks = [];
const createContext = (displayName) => {
const context = React.createContext(NO_PROVIDER);
if (isDev && displayName) context.displayName = displayName;
contexts.push(context);
hooks.push(createUseContext(context));
};
if (selectors.length) selectors.forEach((selector) => createContext(selector.name));
else createContext(useValue.name);
const Provider = ({ children, ...props }) => {
const value = useValue(props);
let element = children;
for (let i = 0; i < contexts.length; i += 1) {
const context = contexts[i];
const selector = selectors[i] || ((v) => v);
element = /* @__PURE__ */ React.createElement(context.Provider, { value: selector(value) }, element);
}
return element;
};
if (isDev && useValue.name) Provider.displayName = "Constate";
return [Provider, ...hooks];
}
//#endregion
export { constate as default };
//# sourceMappingURL=index.js.map