react-use
Version:
Collection of React Hooks
54 lines (53 loc) • 2.18 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var react_1 = require("react");
var useUpdateEffect_1 = tslib_1.__importDefault(require("../useUpdateEffect"));
function composeMiddleware(chain) {
return function (context, dispatch) {
return chain.reduceRight(function (res, middleware) {
return middleware(context)(res);
}, dispatch);
};
}
var createReducer = function () {
var middlewares = [];
for (var _i = 0; _i < arguments.length; _i++) {
middlewares[_i] = arguments[_i];
}
var composedMiddleware = composeMiddleware(middlewares);
return function (reducer, initialState, initializer) {
if (initializer === void 0) { initializer = function (value) { return value; }; }
var ref = react_1.useRef(initializer(initialState));
var _a = react_1.useState(ref.current), setState = _a[1];
var dispatch = react_1.useCallback(function (action) {
ref.current = reducer(ref.current, action);
setState(ref.current);
return action;
}, [reducer]);
var dispatchRef = react_1.useRef(composedMiddleware({
getState: function () { return ref.current; },
dispatch: function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
return dispatchRef.current.apply(dispatchRef, args);
},
}, dispatch));
useUpdateEffect_1.default(function () {
dispatchRef.current = composedMiddleware({
getState: function () { return ref.current; },
dispatch: function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
return dispatchRef.current.apply(dispatchRef, args);
},
}, dispatch);
}, [dispatch]);
return [ref.current, dispatchRef.current];
};
};
exports.default = createReducer;