import { Popover } from 'react-bootstrap' import OverlayTrigger from 'react-bootstrap/OverlayTrigger' import { useRef, useState } from 'react' export default function HoverablePopover ({ trigger, body, onShow }) { const [show, setShow] = useState(false) const popRef = useRef(null) const timeoutId = useRef(null) const onToggle = show => { clearTimeout(timeoutId.current) if (show) { onShow?.() timeoutId.current = setTimeout(() => setShow(true), 500) } else { timeoutId.current = setTimeout(() => setShow(!!popRef.current?.matches(':hover')), 300) } } return ( <OverlayTrigger placement='bottom' trigger={['hover', 'focus']} show={show} onToggle={onToggle} transition rootClose overlay={ <Popover style={{ position: 'fixed' }} onPointerLeave={() => onToggle(false)}> <Popover.Body ref={popRef}> {body} </Popover.Body> </Popover> } > <span> {trigger} </span> </OverlayTrigger> ) }