import React, { Component } from 'react'; import { Motion, spring } from 'react-motion'; import MeasureHeight from 'app/components/MeasureHeight'; import styles from './collapse.scss'; interface Props { isOpened?: boolean; children: React.ReactNode; onRest: () => void; } interface State { isOpened?: boolean; // just to track value for derived updates height: number; wasInitialized: boolean; } export default class Collapse extends Component { state = { isOpened: this.props.isOpened, height: 0, wasInitialized: false, }; static defaultProps: Partial = { onRest: () => {}, }; static getDerivedStateFromProps(props: Props, state: State) { if (props.isOpened !== state.isOpened && !state.wasInitialized) { return { isOpened: props.isOpened, wasInitialized: true, }; } return null; } render() { const { isOpened, children, onRest } = this.props; const { height, wasInitialized } = this.state; return (
{({ top }) => (
{children}
)}
); } onUpdateHeight = (height: number) => { this.setState({ height, }); }; shouldMeasureHeight = () => { return [this.props.isOpened, this.state.wasInitialized].join(''); }; }