redux-act
Version:
An opinionated lib to create actions and reducers for Redux
105 lines (85 loc) • 2.64 kB
JavaScript
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
import batch from './batch';
function normalizeType(typeOrActionCreator) {
if (typeOrActionCreator && typeOrActionCreator.getType) {
return typeOrActionCreator.toString();
}
return typeOrActionCreator;
}
export default function createReducer() {
var handlers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var defaultState = arguments.length > 1 ? arguments[1] : undefined;
var opts = {
payload: true,
fallback: null
};
var reducer = _extends(reduce, {
has: has,
on: on,
off: off,
options: options
});
function has(typeOrActionCreator) {
return !!handlers[normalizeType(typeOrActionCreator)];
}
function on(typeOrActionCreator, handler) {
if (Array.isArray(typeOrActionCreator)) {
typeOrActionCreator.forEach(function (action) {
on(action, handler);
});
} else {
handlers[normalizeType(typeOrActionCreator)] = handler;
}
return reducer;
}
function off(typeOrActionCreator) {
if (Array.isArray(typeOrActionCreator)) {
typeOrActionCreator.forEach(off);
} else {
delete handlers[normalizeType(typeOrActionCreator)];
}
return reducer;
}
function options(newOpts) {
Object.keys(newOpts).forEach(function (name) {
return opts[name] = newOpts[name];
});
return reducer;
}
if (typeof handlers === 'function') {
var factory = handlers;
handlers = {};
factory(on, off);
}
if (!has(batch)) {
on(batch, function (state, payload) {
if (opts.payload) {
return payload.reduce(reduce, state);
} else {
return payload.payload.reduce(reduce, state);
}
});
}
function reduce() {
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultState;
var action = arguments.length > 1 ? arguments[1] : undefined;
if (!action || typeof action.type !== 'string') {
return state;
}
if (action.type.startsWith('@@redux/')) {
return state;
}
var handler = handlers[action.type] || opts.fallback;
if (handler) {
if (opts.payload) {
return handler(state, action.payload, action.meta);
} else {
return handler(state, action);
}
}
return state;
}
;
return reducer;
}
;