UNPKG

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