import cs from 'classnames' import React, { Component, CSSProperties, MouseEvent, ReactNode, RefObject } from 'react' import { onEnterOrSpace } from '../lib/util' interface Props { isOpen?: boolean headerClass?: string headerStyle?: CSSProperties header?: ReactNode headerExtras?: ReactNode containerRef?: RefObject contentClass?: string } interface State { isOpen: boolean } class Collapsible extends Component { static defaultProps = { isOpen: false, headerClass: '', headerStyle: {}, contentClass: '', } constructor (props: Props) { super(props) this.state = { isOpen: props.isOpen || false } } componentDidUpdate (prevProps: Props) { if (this.props.isOpen != null && this.props.isOpen !== prevProps.isOpen) { this.setState({ isOpen: this.props.isOpen }) } } render () { return (
{this.props.header}
{this.props.headerExtras}
{this.state.isOpen && this.props.children}
) } _toggleOpen = () => { this.setState({ isOpen: !this.state.isOpen }) } _onClick = (e: MouseEvent) => { e.stopPropagation() this._toggleOpen() } _onKeyPress = () => { this._toggleOpen() } } export default Collapsible