@edirect/form-engine
Version:
Achieve form logic reusage with forms expressed in json format.
61 lines (60 loc) • 2.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useFormGroup = void 0;
var _react = require("react");
var _index = require("../../core/index.js");
var _index2 = require("../../core/managers/index.js");
const useFormGroup = ({
group,
onData,
onSubmit,
ids = []
}) => {
const [formIds, setFormIds] = (0, _react.useState)(group ? (0, _index2.getGroupFormsIds)(group) : ids);
const onDataChange = (0, _react.useCallback)(() => {
const data = formIds.reduce((acc, formId) => Object.assign(Object.assign({}, acc), {
[formId]: (0, _index.getFormInstance)(formId).formData
}), {});
onData && onData(data);
}, [onData]);
const extractFormsData = opts => {
return formIds.reduce((acc, formId) => {
if (opts === null || opts === void 0 ? void 0 : opts.aggregate) {
return Object.keys(acc).reduce((innerAcc, key) => Object.assign(Object.assign({}, innerAcc), {
[key]: Object.assign(Object.assign({}, acc[key]), (0, _index.getFormInstance)(formId, opts).formData[key])
}), {});
}
return Object.assign(Object.assign({}, acc), {
[formId]: (0, _index.getFormInstance)(formId, opts).formData
});
}, {
formatted: {},
erroredFields: {},
fields: {},
form: {},
predictableErroredFields: {},
filteredFields: {}
});
};
(0, _react.useEffect)(() => {
if (formIds.length || !group) return;
setFormIds((0, _index2.getGroupFormsIds)(group));
}, [formIds]);
(0, _react.useEffect)(() => {
formIds.map(formId => (0, _index.getFormInstance)(formId).subscribe((0, _index.ALL_NAMESPACE_EVENTS)(_index.CoreEvents.ON_FIELD_CHANGE), onDataChange));
}, [onData, formIds]);
(0, _react.useEffect)(() => {
formIds.map(formId => (0, _index.getFormInstance)(formId).subscribe((0, _index.ALL_NAMESPACE_EVENTS)(_index.CoreEvents.ON_FIELD_REHYDRATE), onDataChange));
}, [onData, formIds]);
(0, _react.useEffect)(() => {
formIds.map(formId => (0, _index.getFormInstance)(formId).subscribe(_index.CoreEvents.ON_FORM_SUBMIT, () => onSubmit && onSubmit(extractFormsData({}))));
}, [onSubmit, formIds]);
const submitForm = () => formIds.map(formId => (0, _index.getFormInstance)(formId).publish(_index.CoreEvents.ON_FORM_SUBMIT));
return {
submitForm,
formData: extractFormsData
};
};
exports.useFormGroup = useFormGroup;