@paprika/seducer
Version:
Seducer (simple reducer) is a wrapper on top of React.useReducer, making it easier to use
61 lines (52 loc) • 3.63 kB
JavaScript
import _Object$keys from "@babel/runtime-corejs2/core-js/object/keys";
import _Object$getOwnPropertySymbols from "@babel/runtime-corejs2/core-js/object/get-own-property-symbols";
import _Object$getOwnPropertyDescriptor from "@babel/runtime-corejs2/core-js/object/get-own-property-descriptor";
import _Object$getOwnPropertyDescriptors from "@babel/runtime-corejs2/core-js/object/get-own-property-descriptors";
import _Object$defineProperties from "@babel/runtime-corejs2/core-js/object/define-properties";
import _Object$defineProperty from "@babel/runtime-corejs2/core-js/object/define-property";
import _slicedToArray from "@babel/runtime-corejs2/helpers/slicedToArray";
import _defineProperty from "@babel/runtime-corejs2/helpers/defineProperty";
function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (_Object$getOwnPropertyDescriptors) { _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } } return target; }
import React from "react";
import reducer from "./reducer";
import getTypes from "./getTypes";
export var useSeducer = function useSeducer(actions) {
var initialState = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var initializer = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
var hasLogger = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
var interceptors = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
if (!actions) {
throw new Error("Actions are required for useSeducer, is an object with their actions as their properties");
}
var types = React.useMemo(function () {
return getTypes(_objectSpread(_objectSpread({}, interceptors), actions));
}, [actions, interceptors]);
var reducerMemo = React.useMemo(function () {
return reducer(actions, hasLogger, interceptors);
}, [actions, hasLogger, interceptors]);
var _React$useReducer = React.useReducer(reducerMemo, initialState, // if initializer is not a function just skipped by passing undefined so hasLogger can work
typeof initializer === "function" ? initializer : undefined),
_React$useReducer2 = _slicedToArray(_React$useReducer, 2),
state = _React$useReducer2[0],
dispatch = _React$useReducer2[1];
/**
* This is a helper that allowed to change the regular dispatch signature which is
* dispatch({ type: "action", payload: value })
* to
* dispatch(types.type, value) which IMO is more versatile, shorter and pleasant to look at it.
*/
var memoCustomDispatch = React.useCallback(function () {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
var type = args[0],
payload = args[1];
dispatch({
type: type,
payload: payload
});
}, []);
return [state, memoCustomDispatch, types];
};
//# sourceMappingURL=useSeducer.js.map