react-use
Version:
Collection of React Hooks
51 lines (50 loc) • 2.02 kB
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;