UNPKG

antd

Version:

An enterprise-class UI design language and React-based implementation

134 lines (125 loc) 5.6 kB
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 avatarWidth = ReactDOM.findDOMNode(_this).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 }); } } }; _this.handleImgLoadError = function () { return _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) { 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, others = __rest(_a, ["prefixCls", "shape", "size", "src", "icon", "className"]); 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 && this.state.isImgExist), _defineProperty(_classNames2, prefixCls + '-icon', icon), _classNames2)); var children = this.props.children; if (src && this.state.isImgExist) { children = React.createElement('img', { src: src, onError: this.handleImgLoadError }); } else if (icon) { children = React.createElement(Icon, { type: icon }); } else { var childrenNode = this.avatarChildren; if (childrenNode || this.state.scale !== 1) { var childrenStyle = { msTransform: 'scale(' + this.state.scale + ')', WebkitTransform: 'scale(' + this.state.scale + ')', transform: 'scale(' + this.state.scale + ')', position: 'absolute', display: 'inline-block', left: 'calc(50% - ' + Math.round(childrenNode.offsetWidth / 2) + 'px)' }; children = React.createElement( 'span', { className: prefixCls + '-string', ref: function ref(span) { return _this2.avatarChildren = span; }, style: 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, { className: classString }), children ); } }]); return Avatar; }(React.Component); export default Avatar; Avatar.defaultProps = { prefixCls: 'ant-avatar', shape: 'circle', size: 'default' };