51 lines
2.0 KiB
JavaScript
51 lines
2.0 KiB
JavaScript
import { useCallback, useRef, useState } from 'react';
|
|
import useUpdateEffect from '../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 = useRef(initializer(initialState));
|
|
var _a = useState(ref.current), setState = _a[1];
|
|
var dispatch = useCallback(function (action) {
|
|
ref.current = reducer(ref.current, action);
|
|
setState(ref.current);
|
|
return action;
|
|
}, [reducer]);
|
|
var dispatchRef = 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(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];
|
|
};
|
|
};
|
|
export default createReducer;
|