import React, { useState, useCallback, useEffect, useRef } from "react"; import { Overlay, Popover, OverlayProps } from "react-bootstrap"; import { PatchComponent } from "src/patch"; interface IHoverPopover { enterDelay?: number; leaveDelay?: number; content: JSX.Element[] | JSX.Element | string; className?: string; placement?: OverlayProps["placement"]; onOpen?: () => void; onClose?: () => void; target?: React.RefObject; } export const HoverPopover: React.FC = PatchComponent( "HoverPopover", ({ enterDelay = 200, leaveDelay = 200, content, children, className, placement = "top", onOpen, onClose, target, }) => { const [show, setShow] = useState(false); const triggerRef = useRef(null); const enterTimer = useRef(); const leaveTimer = useRef(); const handleMouseEnter = useCallback(() => { window.clearTimeout(leaveTimer.current); enterTimer.current = window.setTimeout(() => { setShow(true); onOpen?.(); }, enterDelay); }, [enterDelay, onOpen]); const handleMouseLeave = useCallback(() => { window.clearTimeout(enterTimer.current); leaveTimer.current = window.setTimeout(() => { setShow(false); onClose?.(); }, leaveDelay); }, [leaveDelay, onClose]); useEffect( () => () => { window.clearTimeout(enterTimer.current); window.clearTimeout(leaveTimer.current); }, [] ); return ( <>
{children}
{triggerRef.current && ( {content} )} ); } );