54 lines
2.1 KiB
JavaScript
54 lines
2.1 KiB
JavaScript
"use strict";
|
|
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;
|