Skip to content

Commit 765d505

Browse files
committed
add snackbar component
1 parent f418800 commit 765d505

File tree

4 files changed

+139
-14
lines changed

4 files changed

+139
-14
lines changed

src/index.js

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,39 @@ export default {
1717
Toggle,
1818
TextInput
1919
};
20+
import Snackbar from './snackbar';
2021

21-
// import React from 'react';
22-
// import ReactDOM from 'react-dom';
22+
import React from 'react';
23+
import ReactDOM from 'react-dom';
24+
25+
// export default {
26+
// Button,
27+
// Card,
28+
// Checkbox,
29+
// CheckboxGroup,
30+
// RadioButtonGroup,
31+
// Toggle,
32+
// };
2333

24-
// import RadioButtonGroup from './radioButtonGroup';
25-
// import theme from './theme.scss';
34+
import theme from './theme.scss';
2635

27-
// const options = [{ label: 'Alpha' }, { label: 'Beta' }, { label: 'Zheta' }]
28-
// const RadioDisplay = () => (
29-
// <div>
30-
// <RadioButtonGroup
31-
// theme={theme}
32-
// options={options}
33-
// inline
34-
// />
35-
// </div>
36-
// );
36+
class SnackDisplay extends React.Component {
37+
constructor(props) {
38+
super(props);
39+
this.state = {
40+
showSnackbar: false,
41+
}
42+
}
43+
handleButtonClick = () => {
44+
this.setState({
45+
showSnackbar: !this.state.showSnackbar
46+
});
47+
}
48+
49+
handleSnackClose = () => {
50+
this.setState({
51+
showSnackbar: false,
52+
});
53+
}
3754

3855
// ReactDOM.render(<RadioDisplay />, document.getElementById('index'));

src/snackbar/index.js

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
import React from 'react';
2+
import PropTypes from 'prop-types';
3+
import classnames from 'classnames';
4+
import { themr } from 'react-css-themr';
5+
import defaultTheme from './theme.scss';
6+
7+
class Snackbar extends React.Component {
8+
constructor(props) {
9+
super(props);
10+
this.state = {
11+
active: false,
12+
}
13+
}
14+
15+
componentDidMount() {
16+
if (this.props.active) {
17+
this.showSnackbar();
18+
}
19+
}
20+
21+
componentWillReceiveProps(nextProps) {
22+
if (nextProps.active === this.state.active) {
23+
return;
24+
}
25+
if (nextProps.active) {
26+
this.showSnackbar();
27+
} else {
28+
this.dismissSnackbar();
29+
}
30+
}
31+
32+
scheduleTimeout = (props) => {
33+
const { timeout } = props;
34+
if (this.curTimeout) clearTimeout(this.curTimeout);
35+
this.curTimeout = setTimeout(() => {
36+
this.dismissSnackbar();
37+
this.curTimeout = null;
38+
}, timeout);
39+
}
40+
41+
componentWillUnmount() {
42+
clearTimeout(this.curTimeout);
43+
}
44+
45+
showSnackbar = () => {
46+
if (this.props.autoClose) {
47+
this.scheduleTimeout(this.props);
48+
}
49+
this.setState({
50+
active: true,
51+
});
52+
}
53+
54+
dismissSnackbar = () => {
55+
clearTimeout(this.curTimeout);
56+
this.setState({
57+
active: false,
58+
});
59+
if (this.props.onClose) {
60+
this.props.onClose()
61+
}
62+
}
63+
64+
render() {
65+
const { theme, additionaClasses, children } = this.props;
66+
const { active } = this.state;
67+
const classes = classnames(theme.snackbar, active ? 'active' : '', additionaClasses)
68+
return (
69+
<div className={classes}>
70+
{ children }
71+
</div>
72+
)
73+
}
74+
}
75+
76+
Snackbar.propTypes = {
77+
additionaClasses: PropTypes.string,
78+
timeout: PropTypes.number,
79+
onClose: PropTypes.func,
80+
autoClose: PropTypes.bool,
81+
}
82+
83+
Snackbar.defaultProps = {
84+
additionaClasses: null,
85+
timeout: 2000,
86+
autoClose: true,
87+
};
88+
89+
export default themr('CBSnackbar', defaultTheme)(Snackbar);

src/snackbar/readMe.md

Whitespace-only changes.

src/snackbar/theme.scss

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
@import '../globals/theme';
2+
3+
:local(.snackbar) {
4+
background: $primary-color;
5+
border-radius: 3px;
6+
padding: 10px;
7+
position: absolute;
8+
bottom: 0;
9+
left: 50%;
10+
transform: translateX(-50%);
11+
12+
&:not(.active) {
13+
transform: translateY(100%);
14+
}
15+
16+
&.active {
17+
transform: translateY(0%);
18+
}
19+
}

0 commit comments

Comments
 (0)