rsuite
Version:
A suite of react components
99 lines (97 loc) • 3.06 kB
JavaScript
'use client';
;
exports.__esModule = true;
exports.default = void 0;
var _schemaTyped = require("schema-typed");
var _react = require("react");
/**
* Convert a flat schema object to a nested schema object
*
* @example
*
* ```js
* const schema = {
* 'address.city': StringType().isRequired('City is required'),
* 'address.street': StringType().isRequired('Street is required')
* };
*
* const result = unflattenSchemaObject(schema);
*
* // result
* {
* address: ObjectType().shape({
* city: StringType().isRequired('City is required'),
* street: StringType().isRequired('Street is required')
* })
* }
* ```
*/
function unflattenSchemaObject(schema) {
var result = {};
var $type = Symbol('schema-type');
Object.keys(schema).forEach(function (key) {
if (key.includes('.')) {
var keys = key.split('.');
var lastKey = keys.pop() || '';
var current = result;
keys.forEach(function (subKey) {
var _ref;
current[subKey] = current[subKey] || (_ref = {}, _ref[$type] = 'object-type', _ref);
current = current[subKey];
});
current[lastKey] = schema[key];
} else {
result[key] = schema[key];
}
});
function convertToShape(obj) {
Object.keys(obj).forEach(function (key) {
var _obj$key;
if (((_obj$key = obj[key]) === null || _obj$key === void 0 ? void 0 : _obj$key[$type]) === 'object-type') {
delete obj[key][$type];
obj[key] = (0, _schemaTyped.ObjectType)().shape(convertToShape(obj[key]));
}
});
return obj;
}
return convertToShape(result);
}
function useSchemaModel(formModel, nestedField) {
var subRulesRef = (0, _react.useRef)([]);
var pushFieldRule = (0, _react.useCallback)(function (name, fieldRule) {
subRulesRef.current.push({
name: name,
fieldRule: fieldRule
});
}, []);
var removeFieldRule = (0, _react.useCallback)(function (name) {
var index = subRulesRef.current.findIndex(function (v) {
return v.name === name;
});
subRulesRef.current.splice(index, 1);
}, []);
var getCombinedModel = (0, _react.useCallback)(function () {
var realSubRules = subRulesRef.current.filter(function (v) {
return Boolean(v.fieldRule.current);
});
// If there is no sub rule, return the original form model
if (realSubRules.length === 0) {
return formModel;
}
var subRuleObject = realSubRules.map(function (_ref2) {
var _ref3;
var name = _ref2.name,
fieldRule = _ref2.fieldRule;
return _ref3 = {}, _ref3[name] = fieldRule.current, _ref3;
}).reduce(function (a, b) {
return Object.assign(a, b);
}, {});
return _schemaTyped.SchemaModel.combine(formModel, (0, _schemaTyped.SchemaModel)(nestedField ? unflattenSchemaObject(subRuleObject) : subRuleObject));
}, [formModel, nestedField]);
return {
getCombinedModel: getCombinedModel,
pushFieldRule: pushFieldRule,
removeFieldRule: removeFieldRule
};
}
var _default = exports.default = useSchemaModel;