UNPKG

react-collapse

Version:

Component-wrapper for collapse animation for elements with variable (and dynamic) height

78 lines (58 loc) 1.71 kB
import React from 'react'; import PropTypes from 'prop-types'; import {Collapse} from './Collapse'; export class UnmountClosed extends React.PureComponent { static propTypes = { isOpened: PropTypes.bool.isRequired, onWork: PropTypes.func, onRest: PropTypes.func }; static defaultProps = { onWork: undefined, onRest: undefined }; constructor(props) { super(props); this.state = {isResting: true, isOpened: props.isOpened, isInitialRender: true}; } componentDidUpdate(prevProps) { const {isOpened} = this.props; if (prevProps.isOpened !== isOpened) { // eslint-disable-next-line react/no-did-update-set-state this.setState({isResting: false, isOpened, isInitialRender: false}); } } onWork = ({isOpened, ...rest}) => { this.setState({isResting: false, isOpened}); const {onWork} = this.props; if (onWork) { onWork({isOpened, ...rest}); } }; onRest = ({isOpened, ...rest}) => { this.setState({isResting: true, isOpened, isInitialRender: false}); const {onRest} = this.props; if (onRest) { onRest({isOpened, ...rest}); } }; getInitialStyle = () => { const {isOpened, isInitialRender} = this.state; if (isInitialRender) { return isOpened ? {height: 'auto', overflow: 'initial'} : {height: '0px', overflow: 'hidden'}; } return {height: '0px', overflow: 'hidden'}; }; render() { const {isResting, isOpened} = this.state; return isResting && !isOpened ? null : ( <Collapse {...this.props} initialStyle={this.getInitialStyle()} onWork={this.onWork} onRest={this.onRest} /> ); } }