@ysmood/material-ui
Version:
Material Design UI components built with React
137 lines (115 loc) • 3.52 kB
JSX
var React = require('react');
var CssEvent = require('./utils/css-event');
var StylePropable = require('./mixins/style-propable');
var Transitions = require('./styles/transitions');
var ClickAwayable = require('./mixins/click-awayable');
var FlatButton = require('./flat-button');
var Snackbar = React.createClass({
mixins: [StylePropable, ClickAwayable],
manuallyBindClickAway: true,
contextTypes: {
muiTheme: React.PropTypes.object
},
propTypes: {
action: React.PropTypes.string,
message: React.PropTypes.string.isRequired,
openOnMount: React.PropTypes.bool,
onActionTouchTap: React.PropTypes.func
},
getInitialState: function() {
return {
open: this.props.openOnMount || false
};
},
componentClickAway: function() {
this.dismiss();
},
componentDidUpdate: function(prevProps, prevState) {
if (prevState.open != this.state.open) {
if (this.state.open) {
//Only Bind clickaway after transition finishes
CssEvent.onTransitionEnd(React.findDOMNode(this), function() {
this._bindClickAway();
}.bind(this));
} else {
this._unbindClickAway();
}
}
},
getTheme: function() {
return this.context.muiTheme.component.snackbar;
},
getSpacing: function() {
return this.context.muiTheme.spacing;
},
getStyles: function() {
var styles = {
root: {
color: this.getTheme().textColor,
backgroundColor: this.getTheme().backgroundColor,
borderRadius: 2,
padding: '0px ' + this.getSpacing().desktopGutter + 'px',
height: this.getSpacing().desktopSubheaderHeight,
lineHeight: this.getSpacing().desktopSubheaderHeight + 'px',
minWidth: 288,
maxWidth: 568,
position: 'fixed',
zIndex: 10,
bottom: this.getSpacing().desktopGutter,
marginLeft: this.getSpacing().desktopGutter,
left: -10000,
opacity: 0,
transform: 'translate3d(0, 20px, 0)',
transition:
Transitions.easeOut('0ms', 'left', '400ms') + ',' +
Transitions.easeOut('400ms', 'opacity') + ',' +
Transitions.easeOut('400ms', 'transform'),
},
action: {
color: this.getTheme().actionColor,
float: 'right',
marginTop: 6,
marginRight: -16,
marginLeft: this.getSpacing().desktopGutter,
backgroundColor: 'transparent'
},
rootWhenOpen: {
left: '0px',
opacity: 1,
transform: 'translate3d(0, 0, 0)',
transition:
Transitions.easeOut('0ms', 'left', '0ms') + ',' +
Transitions.easeOut('400ms', 'opacity', '0ms') + ',' +
Transitions.easeOut('400ms', 'transform', '0ms')
}
};
return styles;
},
render: function() {
var styles = this.getStyles();
var action;
if (this.props.action) {
action = (
<FlatButton
style={styles.action}
label={this.props.action}
onTouchTap={this.props.onActionTouchTap} />
);
}
var rootStyles = styles.root;
if (this.state.open) rootStyles = this.mergeStyles(styles.root, styles.rootWhenOpen, this.props.style);
return (
<span style={rootStyles}>
<span>{this.props.message}</span>
{action}
</span>
);
},
show: function() {
this.setState({ open: true });
},
dismiss: function() {
this.setState({ open: false });
}
});
module.exports = Snackbar;