const Tooltip = ({x, y, content, visible}) => {
const style = {
position: 'fixed',
left: x + 'px',
top: y + 'px',
background: 'black',
color: 'white',
padding: '.5%'
};
const tooltip = <span style={style}>{content}</span>;
return visible ? tooltip : null;
};
const Tooltipable = ({component, tooltipContent}) => {
const [tooltipXy, setTooltipXy] = React.useState({x: 0, y: 0});
const [tooltipVisible, setTooltipVisible] = React.useState(false);
const handleMouseOver = (e) => {
setTooltipXy({x: e.clientX + 5, y: e.clientY + 5});
setTooltipVisible(true);
};
const handleMouseOut = () => {
setTooltipVisible(false);
};
return (
<li>
<span
style={{background: 'pink'}}
onMouseLeave={handleMouseOut}
onMouseMove={handleMouseOver}>
{component}
</span>
<Tooltip
x={tooltipXy.x}
y={tooltipXy.y}
content={tooltipContent}
visible={tooltipVisible}
/>
</li>
);
};
const Todos = ({todos}) => (
<ul>
{todos.map((todo, index) => {
const component = (
<span style={{background: 'powderblue', display: 'inline'}}>
{todo.text}
</span>
);
return (
<Tooltipable
key={index}
component={component}
tooltipContent={'Created ' + todo.createdOn}
/>
);
})}
</ul>
);
const App = () => {
const todos = [
{text: 'clean car', createdOn: 'yesterday'},
{text: 'fix windows', createdOn: 'two days ago'},
{text: 'go shopping', createdOn: 'today'},
{text: 'meet family', createdOn: 'five days ago'},
{text: 'clean car', createdOn: 'yesterday'},
{text: 'fix windows', createdOn: 'two days ago'},
{text: 'go shopping', createdOn: 'today'},
{text: 'meet family', createdOn: 'five days ago'},
{text: 'clean car', createdOn: 'yesterday'},
{text: 'fix windows', createdOn: 'two days ago'},
{text: 'go shopping', createdOn: 'today'},
{text: 'meet family', createdOn: 'five days ago'},
{text: 'clean car', createdOn: 'yesterday'},
{text: 'fix windows', createdOn: 'two days ago'},
{text: 'go shopping', createdOn: 'today'},
{text: 'meet family', createdOn: 'five days ago'}
];
return <Todos todos={todos} />;
};
ReactDOM.render(<App />, document.getElementById('root'));
<!DOCTYPE html>
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.2/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.2/umd/react-dom.production.min.js"></script>
</head>
<body>
<div id="root">
</body>
</html>