UNPKG

1.47 kBJavaScriptView Raw
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import Collapse from './Collapse';
4import { omit, findDOMElements, defaultToggleEvents, addMultipleEventListeners } from './utils';
5
6const omitKeys = ['toggleEvents', 'defaultOpen'];
7
8const propTypes = {
9 defaultOpen: PropTypes.bool,
10 toggler: PropTypes.string.isRequired,
11 toggleEvents: PropTypes.arrayOf(PropTypes.string)
12};
13
14const defaultProps = {
15 toggleEvents: defaultToggleEvents
16};
17
18class UncontrolledCollapse extends Component {
19 constructor(props) {
20 super(props);
21
22 this.togglers = null;
23 this.removeEventListeners = null;
24 this.toggle = this.toggle.bind(this);
25
26 this.state = { isOpen: props.defaultOpen || false };
27 }
28
29 componentDidMount() {
30 this.togglers = findDOMElements(this.props.toggler);
31 if (this.togglers.length) {
32 this.removeEventListeners = addMultipleEventListeners(
33 this.togglers,
34 this.toggle,
35 this.props.toggleEvents
36 );
37 }
38 }
39
40 componentWillUnmount() {
41 if (this.togglers.length && this.removeEventListeners) {
42 this.removeEventListeners();
43 }
44 }
45
46 toggle(e) {
47 this.setState(({ isOpen }) => ({ isOpen: !isOpen }));
48 e.preventDefault();
49 }
50
51 render() {
52 return <Collapse isOpen={this.state.isOpen} {...omit(this.props, omitKeys)} />;
53 }
54}
55
56UncontrolledCollapse.propTypes = propTypes;
57UncontrolledCollapse.defaultProps = defaultProps;
58
59export default UncontrolledCollapse;
60
\No newline at end of file