UNPKG

state-pool

Version:

Transform your React app with our state management library! Declare global and local states like variables, powered by the magic of React hooks 🪄✨

94 lines (93 loc) • 3.37 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var react_1 = __importDefault(require("react")); var State_1 = __importStar(require("./State")); function useStateObject(state) { // This is for internal use only var localStateRef = react_1.default.useMemo(function () { if (state instanceof State_1.default) { // We have a global state, so we'll simply pass it out return null; } else { // We have a local state, so we create state obj and keep its ref for futer renders return (0, State_1.createState)(state); } }, []); var stateObject; if (localStateRef instanceof State_1.default) { stateObject = localStateRef; } else { stateObject = state; } return stateObject; } function useReducer(reducer, state, config) { if (config === void 0) { config = {}; } var _a = react_1.default.useState(null), setState = _a[1]; var isMounted = react_1.default.useRef(false); var stateObject = useStateObject(state); var currentState = stateObject.getValue(config.selector); function reRender() { // re-render if the component is mounted if (isMounted.current) { setState({}); } } function observer(newState) { if (currentState === newState) { // Do nothing because the selected state is up-to-date } else { reRender(); } } var subscription = { observer: observer, selector: config.selector ? config.selector : function (state) { return state; }, refresh: reRender }; react_1.default.useEffect(function () { var unsubscribe = stateObject.subscribe(subscription); isMounted.current = true; return function () { unsubscribe(); isMounted.current = false; }; }, [currentState, State_1.default]); function dispatch(action) { var newState = reducer(currentState, action); stateObject.setValue(newState, config); } return [currentState, dispatch, stateObject]; } exports.default = useReducer;