antd
Version:
An enterprise-class UI design language and React components implementation
87 lines (86 loc) • 3.63 kB
JavaScript
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = useMergeSemantic;
exports.mergeClassNames = mergeClassNames;
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var React = _interopRequireWildcard(require("react"));
var _classnames = _interopRequireDefault(require("classnames"));
// ========================= ClassNames =========================
function mergeClassNames(schema) {
const mergedSchema = schema || {};
for (var _len = arguments.length, classNames = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
classNames[_key - 1] = arguments[_key];
}
return classNames.reduce((acc, cur) => {
// Loop keys of the current classNames
Object.keys(cur || {}).forEach(key => {
const keySchema = mergedSchema[key];
const curVal = cur[key];
if (keySchema && typeof keySchema === 'object') {
if (curVal && typeof curVal === 'object') {
// Loop fill
acc[key] = mergeClassNames(keySchema, acc[key], curVal);
} else {
// Covert string to object structure
const {
_default: defaultField
} = keySchema;
acc[key] = acc[key] || {};
acc[key][defaultField] = (0, _classnames.default)(acc[key][defaultField], curVal);
}
} else {
// Flatten fill
acc[key] = (0, _classnames.default)(acc[key], curVal);
}
});
return acc;
}, {});
}
function useSemanticClassNames(schema) {
for (var _len2 = arguments.length, classNames = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
classNames[_key2 - 1] = arguments[_key2];
}
return React.useMemo(() => mergeClassNames.apply(void 0, [schema].concat(classNames)), [classNames]);
}
// =========================== Styles ===========================
function useSemanticStyles() {
for (var _len3 = arguments.length, styles = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
styles[_key3] = arguments[_key3];
}
return React.useMemo(() => {
return styles.reduce(function (acc) {
let cur = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
Object.keys(cur).forEach(key => {
acc[key] = Object.assign(Object.assign({}, acc[key]), cur[key]);
});
return acc;
}, {});
}, [styles]);
}
// =========================== Export ===========================
function fillObjectBySchema(obj, schema) {
const newObj = Object.assign({}, obj);
Object.keys(schema).forEach(key => {
if (key !== '_default') {
const nestSchema = schema[key];
const nextValue = newObj[key] || {};
newObj[key] = nestSchema ? fillObjectBySchema(nextValue, nestSchema) : nextValue;
}
});
return newObj;
}
/**
* Merge classNames and styles from multiple sources.
* When `schema` is provided, it will **must** provide the nest object structure.
*/
function useMergeSemantic(classNamesList, stylesList, schema) {
const mergedClassNames = useSemanticClassNames.apply(void 0, [schema].concat((0, _toConsumableArray2.default)(classNamesList)));
const mergedStyles = useSemanticStyles.apply(void 0, (0, _toConsumableArray2.default)(stylesList));
return React.useMemo(() => {
return [fillObjectBySchema(mergedClassNames, schema), fillObjectBySchema(mergedStyles, schema)];
}, [mergedClassNames, mergedStyles]);
}
;