UNPKG

@paprika/seducer

Version:

Seducer (simple reducer) is a wrapper on top of React.useReducer, making it easier to use

85 lines (59 loc) 4.15 kB
"use strict"; var _Object$keys = require("@babel/runtime-corejs2/core-js/object/keys"); var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs2/core-js/object/get-own-property-symbols"); var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor"); var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptors"); var _Object$defineProperties = require("@babel/runtime-corejs2/core-js/object/define-properties"); var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property"); var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault"); _Object$defineProperty(exports, "__esModule", { value: true }); exports.useSeducer = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/slicedToArray")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _reducer = _interopRequireDefault(require("./reducer")); var _getTypes = _interopRequireDefault(require("./getTypes")); 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) { (0, _defineProperty2["default"])(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; } 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["default"].useMemo(function () { return (0, _getTypes["default"])(_objectSpread(_objectSpread({}, interceptors), actions)); }, [actions, interceptors]); var reducerMemo = _react["default"].useMemo(function () { return (0, _reducer["default"])(actions, hasLogger, interceptors); }, [actions, hasLogger, interceptors]); var _React$useReducer = _react["default"].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 = (0, _slicedToArray2["default"])(_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["default"].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]; }; exports.useSeducer = useSeducer; //# sourceMappingURL=useSeducer.js.map