yqcloud-ui
Version:
An enterprise-class UI design language and React-based implementation
171 lines (160 loc) • 7.2 kB
JavaScript
import _extends from 'babel-runtime/helpers/extends';
import _defineProperty from 'babel-runtime/helpers/defineProperty';
import _classCallCheck from 'babel-runtime/helpers/classCallCheck';
import _createClass from 'babel-runtime/helpers/createClass';
import _possibleConstructorReturn from 'babel-runtime/helpers/possibleConstructorReturn';
import _inherits from 'babel-runtime/helpers/inherits';
var __rest = this && this.__rest || function (s, e) {
var t = {};
for (var p in s) {
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
}if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0) t[p[i]] = s[p[i]];
}return t;
};
import * as React from 'react';
import * as ReactDOM from 'react-dom';
import Icon from '../icon';
import classNames from 'classnames';
var Avatar = function (_React$Component) {
_inherits(Avatar, _React$Component);
function Avatar(props) {
_classCallCheck(this, Avatar);
var _this = _possibleConstructorReturn(this, (Avatar.__proto__ || Object.getPrototypeOf(Avatar)).call(this, props));
_this.setScale = function () {
var childrenNode = _this.avatarChildren;
if (childrenNode) {
var childrenWidth = childrenNode.offsetWidth;
var avatarNode = ReactDOM.findDOMNode(_this);
var avatarWidth = avatarNode.getBoundingClientRect().width;
// add 4px gap for each side to get better performance
if (avatarWidth - 8 < childrenWidth) {
_this.setState({
scale: (avatarWidth - 8) / childrenWidth
});
} else {
_this.setState({
scale: 1
});
}
}
};
// yeshuang, 头像背景颜色取值
_this.getNewAvatarColor = function (realName) {
if (realName) {
if (realName.charAt(0).charCodeAt(0) > 96 && realName.charAt(0).charCodeAt(0) < 123) {
return '#EF7F25';
} else if (realName.charAt(0).charCodeAt(0) > 64 && realName.charAt(0).charCodeAt(0) < 91) {
return '#EF7F25';
} else if (realName.charAt(0).charCodeAt(0) > 47 && realName.charAt(0).charCodeAt(0) < 58) {
return '#3C4D73';
} else {
return '#2196F3';
}
} else {
return '#2196F3';
}
};
_this.handleImgLoadError = function () {
var onError = _this.props.onError;
var errorFlag = onError ? onError() : undefined;
if (errorFlag !== false) {
_this.setState({ isImgExist: false });
}
};
_this.state = {
scale: 1,
isImgExist: true
};
return _this;
}
_createClass(Avatar, [{
key: 'componentDidMount',
value: function componentDidMount() {
this.setScale();
}
}, {
key: 'componentDidUpdate',
value: function componentDidUpdate(prevProps, prevState) {
if (prevProps.children !== this.props.children || prevState.scale !== this.state.scale && this.state.scale === 1 || prevState.isImgExist !== this.state.isImgExist) {
this.setScale();
}
}
}, {
key: 'render',
value: function render() {
var _classNames,
_classNames2,
_this2 = this;
var _a = this.props,
prefixCls = _a.prefixCls,
shape = _a.shape,
size = _a.size,
src = _a.src,
icon = _a.icon,
className = _a.className,
alt = _a.alt,
realName = _a.realName,
others = __rest(_a, ["prefixCls", "shape", "size", "src", "icon", "className", "alt", "realName"]);var _state = this.state,
isImgExist = _state.isImgExist,
scale = _state.scale;
var sizeCls = classNames((_classNames = {}, _defineProperty(_classNames, prefixCls + '-lg', size === 'large'), _defineProperty(_classNames, prefixCls + '-sm', size === 'small'), _classNames));
var classString = classNames(prefixCls, className, sizeCls, (_classNames2 = {}, _defineProperty(_classNames2, prefixCls + '-' + shape, shape), _defineProperty(_classNames2, prefixCls + '-image', src && isImgExist), _defineProperty(_classNames2, prefixCls + '-icon', icon), _classNames2));
var sizeStyle = typeof size === 'number' ? {
width: size,
height: size,
lineHeight: size + 'px',
fontSize: icon ? size / 2 : 18,
backgroundColor: this.getNewAvatarColor(realName || '')
} : {
backgroundColor: this.getNewAvatarColor(realName || '')
};
var children = this.props.children;
if (src && isImgExist) {
children = React.createElement('img', { src: src, onError: this.handleImgLoadError, alt: alt });
} else if (icon) {
children = React.createElement(Icon, { type: icon });
} else {
var childrenNode = this.avatarChildren;
if (childrenNode || scale !== 1) {
var transformString = 'scale(' + scale + ') translateX(-50%)';
var childrenStyle = {
msTransform: transformString,
WebkitTransform: transformString,
transform: transformString
};
var sizeChildrenStyle = typeof size === 'number' ? {
lineHeight: size + 'px'
} : {};
children = React.createElement(
'span',
{ className: prefixCls + '-string', ref: function ref(span) {
return _this2.avatarChildren = span;
}, style: _extends({}, sizeChildrenStyle, childrenStyle) },
children
);
} else {
children = React.createElement(
'span',
{ className: prefixCls + '-string', ref: function ref(span) {
return _this2.avatarChildren = span;
} },
children
);
}
}
return React.createElement(
'span',
_extends({}, others, { style: _extends({}, sizeStyle, others.style), className: classString }),
children
);
}
}]);
return Avatar;
}(React.Component);
export default Avatar;
Avatar.defaultProps = {
prefixCls: 'ant-avatar',
shape: 'circle',
size: 'default'
};