blob: 69cf064ca0d6f6aad7efc916389c5681af0eb6a9 [file] [log] [blame]
import React from 'react';
function computeHeight(node) {
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) {
if (!n) {
return 0;
}
const node = n;
let height = computeHeight(node);
const parentNode = node.parentNode;
if (parentNode) {
height = computeHeight(parentNode);
}
return height;
}
function autoHeight() {
return (WrappedComponent) => {
class AutoHeightComponent extends React.Component {
state = {
computedHeight: 0,
};
root = undefined;
componentDidMount() {
const { height } = this.props;
if (!height) {
let h = getAutoHeight(this.root);
this.setState({
computedHeight: h,
});
if (h < 1) {
h = getAutoHeight(this.root);
this.setState({
computedHeight: h,
});
}
}
}
handleRoot = (node) => {
this.root = node;
};
render() {
const { height } = this.props;
const { computedHeight } = this.state;
const h = height || computedHeight;
return (
<div ref={this.handleRoot}>
{h > 0 && <WrappedComponent {...this.props} height={h} />}
</div>
);
}
}
return AutoHeightComponent;
};
}
export default autoHeight;