rsuite
Version:
A suite of react components
76 lines (68 loc) • 2.36 kB
JavaScript
import { useCallback, useContext } from 'react';
import classNames from 'classnames';
import { prefix as addPrefix } from './prefix';
import { CustomContext } from '../CustomProvider/CustomProvider';
/**
* Add a prefix to all classNames.
*
* @param str prefix of className
* @returns { withClassPrefix, merge, prefix }
* - withClassPrefix: A function of combining className and adding a prefix to each className.
* At the same time, the default `classPrefix` is the first className.
* - merge: A merge className function.
* - prefix: Add a prefix to className
* - rootPrefix
*/
function useClassNames(str) {
var _ref = useContext(CustomContext) || {},
_ref$classPrefix = _ref.classPrefix,
classPrefix = _ref$classPrefix === void 0 ? 'rs' : _ref$classPrefix;
var componentName = addPrefix(classPrefix, str);
/**
* @example
*
* if str = 'button':
* prefix('red', { active: true }) => 'rs-button-red rs-button-active'
*/
var prefix = useCallback(function () {
var mergeClasses = arguments.length ? classNames.apply(void 0, arguments).split(' ').map(function (item) {
return addPrefix(componentName, item);
}) : [];
return mergeClasses.filter(function (cls) {
return cls;
}).join(' ');
}, [componentName]);
/**
* @example
*
* if str = 'button':
* withClassPrefix('red', { active: true }) => 'rs-button rs-button-red rs-button-active'
*/
var withClassPrefix = useCallback(function () {
for (var _len = arguments.length, classes = new Array(_len), _key = 0; _key < _len; _key++) {
classes[_key] = arguments[_key];
}
var mergeClasses = prefix(classes);
return mergeClasses ? componentName + " " + mergeClasses : componentName;
}, [componentName, prefix]);
/**
* @example
* rootPrefix('btn') => 'rs-btn'
* rootPrefix('btn', { active: true }) => 'rs-btn rs-active'
*/
var rootPrefix = function rootPrefix() {
var mergeClasses = arguments.length ? classNames.apply(void 0, arguments).split(' ').map(function (item) {
return addPrefix(classPrefix, item);
}) : [];
return mergeClasses.filter(function (cls) {
return cls;
}).join(' ');
};
return {
withClassPrefix: withClassPrefix,
merge: classNames,
prefix: prefix,
rootPrefix: rootPrefix
};
}
export default useClassNames;