forked from reactstrap/reactstrap
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAlert.js
More file actions
91 lines (82 loc) · 2.22 KB
/
Copy pathAlert.js
File metadata and controls
91 lines (82 loc) · 2.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import React, { PropTypes } from 'react';
import classNames from 'classnames';
import ReactCSSTransitionGroup from 'react-addons-css-transition-group';
import { mapToCssModules } from './utils';
const FirstChild = ({ children }) => (
React.Children.toArray(children)[0] || null
);
const propTypes = {
children: PropTypes.node,
className: PropTypes.string,
cssModule: PropTypes.object,
color: PropTypes.string,
isOpen: PropTypes.bool,
toggle: PropTypes.func,
tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),
transitionAppearTimeout: PropTypes.number,
transitionEnterTimeout: PropTypes.number,
transitionLeaveTimeout: PropTypes.number,
};
const defaultProps = {
color: 'success',
isOpen: true,
tag: 'div',
transitionAppearTimeout: 150,
transitionEnterTimeout: 150,
transitionLeaveTimeout: 150
};
const Alert = (props) => {
const {
className,
cssModule,
tag: Tag,
color,
isOpen,
toggle,
children,
transitionAppearTimeout,
transitionEnterTimeout,
transitionLeaveTimeout,
...attributes
} = props;
const classes = mapToCssModules(classNames(
className,
'alert',
`alert-${color}`,
{ 'alert-dismissible': toggle }
), cssModule);
const alert = (
<Tag {...attributes} className={classes} role="alert">
{ toggle ?
<button type="button" className="close" aria-label="Close" onClick={toggle}>
<span aria-hidden="true">×</span>
</button>
: null }
{ children }
</Tag>
);
return (
<ReactCSSTransitionGroup
component={FirstChild}
transitionName={{
appear: 'fade',
appearActive: 'in',
enter: 'fade',
enterActive: 'in',
leave: 'fade',
leaveActive: 'out'
}}
transitionAppear={transitionAppearTimeout > 0}
transitionAppearTimeout={transitionAppearTimeout}
transitionEnter={transitionEnterTimeout > 0}
transitionEnterTimeout={transitionEnterTimeout}
transitionLeave={transitionLeaveTimeout > 0}
transitionLeaveTimeout={transitionLeaveTimeout}
>
{isOpen ? alert : null}
</ReactCSSTransitionGroup>
);
};
Alert.propTypes = propTypes;
Alert.defaultProps = defaultProps;
export default Alert;