Skip to content

Commit 462f6cd

Browse files
author
Aaron Panchal
committed
Add props to Alert for configuring animation timeout
- Use value of zero to not animate
1 parent 8ff3e00 commit 462f6cd

2 files changed

Lines changed: 63 additions & 4 deletions

File tree

src/Alert.js

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,19 @@ const propTypes = {
1111
color: PropTypes.string,
1212
isOpen: PropTypes.bool,
1313
toggle: PropTypes.func,
14-
tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string])
14+
tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),
15+
transitionAppearTimeout: PropTypes.number,
16+
transitionEnterTimeout: PropTypes.number,
17+
transitionLeaveTimeout: PropTypes.number
1518
};
1619

1720
const defaultProps = {
1821
color: 'success',
1922
isOpen: true,
20-
tag: 'div'
23+
tag: 'div',
24+
transitionAppearTimeout: 150,
25+
transitionEnterTimeout: 150,
26+
transitionLeaveTimeout: 150
2127
};
2228

2329
const Alert = (props) => {
@@ -28,6 +34,9 @@ const Alert = (props) => {
2834
isOpen,
2935
toggle,
3036
children,
37+
transitionAppearTimeout,
38+
transitionEnterTimeout,
39+
transitionLeaveTimeout,
3140
...attributes
3241
} = props;
3342

@@ -53,11 +62,20 @@ const Alert = (props) => {
5362
<ReactCSSTransitionGroup
5463
component={FirstChild}
5564
transitionName={{
65+
appear: 'fade',
66+
appearActive: 'in',
67+
enter: 'fade',
68+
enterActive: 'in',
5669
leave: 'fade',
5770
leaveActive: 'out'
5871
}}
59-
transitionEnter={false}
60-
transitionLeaveTimeout={300}>
72+
transitionAppear={transitionAppearTimeout > 0}
73+
transitionAppearTimeout={transitionAppearTimeout}
74+
transitionEnter={transitionEnterTimeout > 0}
75+
transitionEnterTimeout={transitionEnterTimeout}
76+
transitionLeave={transitionLeaveTimeout > 0}
77+
transitionLeaveTimeout={transitionLeaveTimeout}
78+
>
6179
{isOpen ? alert : null}
6280
</ReactCSSTransitionGroup>
6381
);

src/__tests__/Alert.spec.js

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,47 @@ describe('Alert', () => {
99
expect(alert.text()).toBe('Yo!');
1010
});
1111

12+
it('should transition on appear, enter, and leave using fade', () => {
13+
const alert = shallow(<Alert>Yo!</Alert>);
14+
expect(alert.prop('transitionName')).toEqual({
15+
appear: 'fade',
16+
appearActive: 'in',
17+
enter: 'fade',
18+
enterActive: 'in',
19+
leave: 'fade',
20+
leaveActive: 'out'
21+
});
22+
});
23+
24+
it('should have default transitionTimeouts', () => {
25+
const alert = shallow(<Alert>Yo!</Alert>);
26+
27+
expect(alert.prop('transitionAppearTimeout')).toBe(150);
28+
expect(alert.prop('transitionAppear')).toBe(true);
29+
expect(alert.prop('transitionEnterTimeout')).toBe(150);
30+
expect(alert.prop('transitionEnter')).toBe(true);
31+
expect(alert.prop('transitionLeaveTimeout')).toBe(150);
32+
expect(alert.prop('transitionLeave')).toBe(true);
33+
});
34+
35+
it('should have support configurable transitionTimeouts', () => {
36+
const alert = shallow(
37+
<Alert
38+
transitionAppearTimeout={0}
39+
transitionEnterTimeout={0}
40+
transitionLeaveTimeout={0}>
41+
Yo!
42+
</Alert>
43+
);
44+
45+
expect(alert.prop('transitionAppearTimeout')).toBe(0);
46+
expect(alert.prop('transitionAppear')).toBe(false);
47+
expect(alert.prop('transitionEnterTimeout')).toBe(0);
48+
expect(alert.prop('transitionEnter')).toBe(false);
49+
expect(alert.prop('transitionLeaveTimeout')).toBe(0);
50+
expect(alert.prop('transitionLeave')).toBe(false);
51+
});
52+
1253
it('should have "success" as default color', () => {
1354
const alert = shallow(<Alert>Yo!</Alert>).find('div');
1455
expect(alert.hasClass('alert-success')).toBe(true);

0 commit comments

Comments
 (0)