UNPKG

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
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