UNPKG

react-hooks-dynamic-form

Version:
73 lines (72 loc) 3.22 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; Object.defineProperty(exports, "__esModule", { value: true }); var react_1 = require("react"); var handlers_1 = require("./handlers"); /** * Form API library entry point to generate and reuse all Form API function * @param fields field definitions array * @param defaultSettings common settings for all fields * @param remoteValues in case fields values are remote (server, parents components ...) */ exports.useFormApi = function (fields, defaultSettings, remoteValues) { var _a = react_1.useState(function () { // Init once without remote value return handlers_1.generateFormData(fields, defaultSettings); }), formData = _a[0], setFormData = _a[1]; react_1.useEffect(function () { // Remote values can be lazily loaded if (remoteValues) { setFormData(function (currentFormData) { return Object.entries(remoteValues).reduce(function (updatedData, _a) { var name = _a[0], value = _a[1]; return handlers_1.updateFormField(updatedData, name, value); }, currentFormData); }); } }, [remoteValues]); var resetForm = react_1.useCallback(function () { var data = handlers_1.generateFormData(fields, defaultSettings, remoteValues); setFormData(data); }, [fields, defaultSettings, remoteValues]); var handleFieldChange = react_1.useCallback(function (name, value) { setFormData(function (currentFormData) { return handlers_1.updateFormField(currentFormData, name, value); }); }, []); var handleFieldValidate = react_1.useCallback(function (name) { setFormData(function (currentFormData) { return handlers_1.validateField(currentFormData, name); }); }, []); var handleFormValidate = react_1.useCallback(function () { var _a = handlers_1.validateForm(formData), isValid = _a.isValid, updatedData = _a.updatedData; setFormData(updatedData); return isValid; }, [formData]); var getFieldInputError = react_1.useCallback(function (name) { return (formData ? formData[name].getInputError() : null); }, [formData]); var values = react_1.useMemo(function () { return fields.reduce(function (acc, _a) { var _b; var name = _a.name; return (__assign(__assign({}, acc), (formData && name && formData[name] ? (_b = {}, _b[name] = formData[name].value, _b) : {}))); }, {}); }, // eslint-disable-next-line react-hooks/exhaustive-deps [formData]); return { isInit: !!formData, values: values, setFieldValue: handleFieldChange, validateField: handleFieldValidate, validateForm: handleFormValidate, getFieldInputError: getFieldInputError, resetForm: resetForm, }; };