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