Skip to content

Commit 2b69ad6

Browse files
authored
feat(Collapse): add delay prop (#287)
1 parent e973682 commit 2b69ad6

3 files changed

Lines changed: 65 additions & 5 deletions

File tree

docs/lib/Components/CollapsePage.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,12 @@ export default class CollapsePage extends React.Component {
2828
{`Collapse.propTypes = {
2929
isOpen: PropTypes.bool,
3030
className: PropTypes.node,
31-
navbar: PropTypes.bool
31+
navbar: PropTypes.bool,
32+
delay: PropTypes.oneOfType([
33+
PropTypes.shape({ show: PropTypes.number, hide: PropTypes.number }),
34+
PropTypes.number
35+
]),
36+
// optionally override show/hide delays - default { show: 350, hide: 350 }
3237
}`}
3338
</PrismCode>
3439
</pre>

src/Collapse.js

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,21 @@ const propTypes = {
1414
tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),
1515
cssModule: PropTypes.object,
1616
navbar: PropTypes.bool,
17+
delay: PropTypes.oneOfType([
18+
PropTypes.shape({ show: PropTypes.number, hide: PropTypes.number }),
19+
PropTypes.number,
20+
]),
21+
};
22+
23+
const DEFAULT_DELAYS = {
24+
show: 350,
25+
hide: 350
1726
};
1827

1928
const defaultProps = {
2029
isOpen: false,
21-
tag: 'div'
30+
tag: 'div',
31+
delay: DEFAULT_DELAYS,
2232
};
2333

2434
class Collapse extends Component {
@@ -45,7 +55,7 @@ class Collapse extends Component {
4555
collapse: SHOWN,
4656
height: null
4757
});
48-
}, 350);
58+
}, this.getDelay('show'));
4959
});
5060
} else if (!willOpen && collapse === SHOWN) {
5161
// will hide
@@ -63,7 +73,7 @@ class Collapse extends Component {
6373
collapse: HIDDEN,
6474
height: null
6575
});
66-
}, 350);
76+
}, this.getDelay('hide'));
6777
}
6878
// else: do nothing.
6979
}
@@ -72,6 +82,14 @@ class Collapse extends Component {
7282
clearTimeout(this.transitionTag);
7383
}
7484

85+
getDelay(key) {
86+
const { delay } = this.props;
87+
if (typeof delay === 'object') {
88+
return isNaN(delay[key]) ? DEFAULT_DELAYS[key] : delay[key];
89+
}
90+
return delay;
91+
}
92+
7593
getHeight() {
7694
return this.element.scrollHeight;
7795
}
@@ -83,7 +101,7 @@ class Collapse extends Component {
83101
cssModule,
84102
tag: Tag,
85103
...attributes
86-
} = omit(this.props, ['isOpen']);
104+
} = omit(this.props, ['isOpen', 'delay']);
87105
const { collapse, height } = this.state;
88106
let collapseClass;
89107
switch (collapse) {

src/__tests__/Collapse.spec.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,43 @@ describe('Collapse', () => {
1818
jasmine.clock().uninstall();
1919
});
2020

21+
describe('delay', () => {
22+
it('should accept a number', () => {
23+
const wrapper = mount(<Collapse isOpen={isOpen} delay={200} />);
24+
toggle();
25+
wrapper.setProps({ isOpen: isOpen });
26+
jasmine.clock().tick(200);
27+
expect(wrapper.state('collapse')).toEqual('SHOWN');
28+
wrapper.unmount();
29+
});
30+
31+
it('should accept an object', () => {
32+
const wrapper = mount(<Collapse isOpen={isOpen} delay={{ show: 110, hide: 120 }} />);
33+
toggle();
34+
wrapper.setProps({ isOpen: isOpen });
35+
jasmine.clock().tick(110);
36+
expect(wrapper.state('collapse')).toEqual('SHOWN');
37+
38+
toggle();
39+
wrapper.setProps({ isOpen: isOpen });
40+
jasmine.clock().tick(120);
41+
expect(wrapper.state('collapse')).toEqual('HIDDEN');
42+
});
43+
44+
it('should use default value if value is missing from object', () => {
45+
const wrapper = mount(<Collapse isOpen={isOpen} delay={{ show: 110 }} />);
46+
toggle();
47+
wrapper.setProps({ isOpen: isOpen });
48+
jasmine.clock().tick(110);
49+
expect(wrapper.state('collapse')).toEqual('SHOWN');
50+
51+
toggle();
52+
wrapper.setProps({ isOpen: isOpen });
53+
jasmine.clock().tick(350);
54+
expect(wrapper.state('collapse')).toEqual('HIDDEN');
55+
});
56+
});
57+
2158
it('should render children', () => {
2259
const wrapper = shallow(<Collapse><p>hello</p></Collapse>).find('p');
2360
expect(wrapper.text()).toBe('hello');

0 commit comments

Comments
 (0)