import React from 'react'; export type IReactComponent

= | React.StatelessComponent

| React.ComponentClass

| React.ClassicComponentClass

; function computeHeight(node: HTMLDivElement) { const { style } = node; style.height = '100%'; const totalHeight = parseInt(`${getComputedStyle(node).height}`, 10); const padding = parseInt(`${getComputedStyle(node).paddingTop}`, 10) + parseInt(`${getComputedStyle(node).paddingBottom}`, 10); return totalHeight - padding; } function getAutoHeight(n: HTMLDivElement) { if (!n) { return 0; } const node = n; let height = computeHeight(node); const parentNode = node.parentNode as HTMLDivElement; if (parentNode) { height = computeHeight(parentNode); } return height; } interface AutoHeightProps { height?: number; } function autoHeight() { return

( WrappedComponent: React.ComponentClass

| React.SFC

, ): React.ComponentClass

=> { class AutoHeightComponent extends React.Component

{ state = { computedHeight: 0, }; root: HTMLDivElement | null = null; componentDidMount() { const { height } = this.props; if (!height && this.root) { let h = getAutoHeight(this.root); this.setState({ computedHeight: h }); if (h < 1) { h = getAutoHeight(this.root); this.setState({ computedHeight: h }); } } } handleRoot = (node: HTMLDivElement) => { this.root = node; }; render() { const { height } = this.props; const { computedHeight } = this.state; const h = height || computedHeight; return (

{h > 0 && }
); } } return AutoHeightComponent; }; } export default autoHeight;