d2-ui
Version:
162 lines (136 loc) • 3.52 kB
JSX
import React from 'react';
import StylePropable from './mixins/style-propable';
import Colors from './styles/colors';
import getMuiTheme from './styles/getMuiTheme';
const Avatar = React.createClass({
propTypes: {
/**
* The backgroundColor of the avatar. Does not apply to image avatars.
*/
backgroundColor: React.PropTypes.string,
/**
* Can be used, for instance, to render a letter inside the avatar.
*/
children: React.PropTypes.node,
/**
* The css class name of the root `div` or `img` element.
*/
className: React.PropTypes.string,
/**
* The icon or letter's color.
*/
color: React.PropTypes.string,
/**
* This is the SvgIcon or FontIcon to be used inside the avatar.
*/
icon: React.PropTypes.element,
/**
* This is the size of the avatar in pixels.
*/
size: React.PropTypes.number,
/**
* If passed in, this component will render an img element. Otherwise, a div will be rendered.
*/
src: React.PropTypes.string,
/**
* Override the inline-styles of the root element.
*/
style: React.PropTypes.object,
},
contextTypes: {
muiTheme: React.PropTypes.object,
},
//for passing default theme context to children
childContextTypes: {
muiTheme: React.PropTypes.object,
},
mixins: [StylePropable],
getDefaultProps() {
return {
backgroundColor: Colors.grey400,
color: Colors.white,
size: 40,
};
},
getInitialState() {
return {
muiTheme: this.context.muiTheme || getMuiTheme(),
};
},
getChildContext() {
return {
muiTheme: this.state.muiTheme,
};
},
//to update theme inside state whenever a new theme is passed down
//from the parent / owner using context
componentWillReceiveProps(nextProps, nextContext) {
let newMuiTheme = nextContext.muiTheme ? nextContext.muiTheme : this.state.muiTheme;
this.setState({muiTheme: newMuiTheme});
},
render() {
let {
backgroundColor,
color,
icon,
size,
src,
style,
className,
...other,
} = this.props;
let styles = {
root: {
height: size,
width: size,
userSelect: 'none',
borderRadius: '50%',
display: 'inline-block',
},
};
if (src) {
const borderColor = this.state.muiTheme.avatar.borderColor;
if (borderColor) {
styles.root = this.mergeStyles(styles.root, {
height: size - 2,
width: size - 2,
border: 'solid 1px ' + borderColor,
});
}
return (
<img
{...other}
src={src}
style={this.prepareStyles(styles.root, style)}
className={className}
/>
);
} else {
styles.root = this.mergeStyles(styles.root, {
backgroundColor: backgroundColor,
textAlign: 'center',
lineHeight: size + 'px',
fontSize: size / 2 + 4,
color: color,
});
const styleIcon = {
margin: 8,
};
const iconElement = icon ? React.cloneElement(icon, {
color: color,
style: this.mergeStyles(styleIcon, icon.props.style),
}) : null;
return (
<div
{...other}
style={this.prepareStyles(styles.root, style)}
className={className}
>
{iconElement}
{this.props.children}
</div>
);
}
},
});
export default Avatar;