import React, { PureComponent } from 'react'; import { Manager, Popper, Arrow, Target } from 'react-popper'; interface IwithTooltipProps { placement?: string; content: string | ((props: any) => JSX.Element); className?: string; } export function withTooltip(WrappedComponent) { return class extends React.Component { constructor(props) { super(props); this.setState = this.setState.bind(this); this.state = { placement: this.props.placement || 'auto', show: false, }; } componentWillReceiveProps(nextProps) { if (nextProps.placement && nextProps.placement !== this.state.placement) { this.setState(prevState => { return { ...prevState, placement: nextProps.placement, }; }); } } renderContent(content) { if (typeof content === 'function') { // If it's a function we assume it's a React component const ReactComponent = content; return ; } return content; } render() { const { content, className } = this.props; return ( {this.state.show ? ( {this.renderContent(content)} ) : null} ); } }; } interface Props { tooltipSetState: (prevState: object) => void; } class Tooltip extends PureComponent { showTooltip = () => { const { tooltipSetState } = this.props; tooltipSetState(prevState => ({ ...prevState, show: true, })); }; hideTooltip = () => { const { tooltipSetState } = this.props; tooltipSetState(prevState => ({ ...prevState, show: false, })); }; render() { return ( {this.props.children} ); } } export default withTooltip(Tooltip);