@snipsonian/observable-state
Version:
Observable-state snippets (redux-like)
66 lines (65 loc) • 2.75 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const isFunction_1 = require("@snipsonian/core/cjs/is/isFunction");
const isObservableStateAction_1 = require("./isObservableStateAction");
const WARN_MESSAGE = {
FILTER_MAY_NOT_RETURN_OTHER_ACTION_TYPE: 'Observable state action: returning another action type from a filter hook is not supported!!!',
};
function createObservableStateActionMiddleware({ store, extraProcessInput = {}, }) {
const middleware = ({ getState }) => (next) => (action) => {
if ((0, isObservableStateAction_1.default)(action)) {
const filterHookResultingAction = executeFilterHook(action);
if (filterHookResultingAction === false) {
return;
}
const resultNextMiddleware = next(filterHookResultingAction);
executeProcessHook(filterHookResultingAction);
return resultNextMiddleware;
}
return next(action);
function executeFilterHook(incomingAction) {
if (incomingAction.filter) {
const filterResultingAction = incomingAction.filter({
action: incomingAction,
getState,
});
if (filterResultingAction && filterResultingAction.type !== incomingAction.type) {
if (process.env.NODE_ENV !== 'test') {
console.warn(WARN_MESSAGE.FILTER_MAY_NOT_RETURN_OTHER_ACTION_TYPE);
}
}
else {
return filterResultingAction;
}
}
return incomingAction;
}
function executeProcessHook(filteredAction) {
if (filteredAction.process) {
filteredAction.process(Object.assign({ action: filteredAction, getState, setState: ({ newState, notificationsToTrigger, context = getDefaultContext(filteredAction) }) => {
store.setState({
newState,
notificationsToTrigger,
context,
});
}, dispatch: store.dispatch }, extraProcessInput));
}
}
};
return middleware;
}
exports.default = createObservableStateActionMiddleware;
function getDefaultContext(action) {
const actionWithoutFunctions = Object.keys(action)
.reduce((accumulator, propKey) => {
const propVal = action[propKey];
if (!(0, isFunction_1.default)(propVal)) {
accumulator[propKey] = propVal;
}
return accumulator;
}, {});
return {
title: action.type,
info: actionWithoutFunctions,
};
}