stapp-validate
Version:
Form validation module for stapp - modular state manager
72 lines • 3.43 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var rxjs_1 = require("rxjs");
var operators_1 = require("rxjs/operators");
var stapp_1 = require("stapp");
var stapp_formbase_1 = require("stapp-formbase");
var constants_1 = require("./constants");
var events_1 = require("./events");
var helpers_1 = require("./helpers");
var reducers_1 = require("./reducers");
var emptyEpic = function () { return rxjs_1.EMPTY; };
exports.validate = function (_a) {
var _b = _a.validateOnInit, validateOnInit = _b === void 0 ? true : _b, _c = _a.setTouchedOnSubmit, setTouchedOnSubmit = _c === void 0 ? true : _c, _d = _a.moduleName, moduleName = _d === void 0 ? constants_1.VALIDATE : _d, rules = _a.rules;
var getRules = function (state) {
return typeof rules === 'function' ? rules(state) : rules;
};
var mapValues = function (state, flags, fields) {
var nextRules = getRules(state);
var nextFields = fields || Object.keys(nextRules);
return rxjs_1.from(nextFields.map(function (field) { return ({
field: field,
value: state.values[field],
rule: nextRules[field],
flags: flags
}); }));
};
var validateEpic = function (event$, state$, _a) {
var getState = _a.getState;
var setValue$ = event$.pipe(operators_1.filter(stapp_1.select(stapp_formbase_1.setValue)), operators_1.mergeMap(function (event) {
return mapValues(getState(), { onChange: true }, Object.keys(event.payload));
}));
var initDone$ = validateOnInit
? event$.pipe(operators_1.filter(stapp_1.select(stapp_1.initEvent)), operators_1.mergeMap(function () {
return mapValues(getState(), { onInit: true });
}))
: rxjs_1.EMPTY;
var revalidate$ = event$.pipe(operators_1.filter(stapp_1.select(events_1.revalidate)), operators_1.mergeMap(function (event) {
return mapValues(getState(), { onRevalidate: true }, event.payload);
}));
return rxjs_1.merge(setValue$, revalidate$, initDone$).pipe(operators_1.filter(function (_a) {
var rule = _a.rule;
return !!rule;
}), operators_1.groupBy(function (res) { return res.field; }), operators_1.mergeMap(function (field$) {
return field$.pipe(operators_1.switchMap(function (res) {
return helpers_1.runValidation(getState(), res.field, res.rule, res.flags);
}));
}));
};
// Set all fields that have validation rules as touched
var setTouchedOnSubmitEpic = setTouchedOnSubmit
? stapp_formbase_1.submit.epic(function (submit$, _, _a) {
var getState = _a.getState;
return submit$.pipe(operators_1.map(function () {
var fields = Object.keys(getRules(getState()));
return stapp_formbase_1.setTouched(fields.reduce(function (result, field) {
result[field] = true;
return result;
}, {}));
}));
})
: emptyEpic;
return {
name: moduleName,
state: {
validating: reducers_1.validateReducer
},
epic: stapp_1.combineEpics([validateEpic, setTouchedOnSubmitEpic]),
dependencies: [stapp_formbase_1.FORM_BASE],
useGlobalObservableConfig: false
};
};
//# sourceMappingURL=validate.js.map