import React, { forwardRef, MouseEvent, useCallback, useRef, useState } from 'react'; import Popover from '@material-ui/core/Popover'; import Box from '@material-ui/core/Box'; import { PopoverProps } from './types'; import { useStyles } from './styles'; const DEBOUNCE_DELAY = 100; export const PopupHover = forwardRef((props, ref) => { const { trigger, content, anchorOrigin, transformOrigin, mountNode } = props; const debounceRef = useRef(0); const classes = useStyles(); const [anchorEl, setAnchorEl] = useState(null); const open = Boolean(anchorEl); const onMouseEnter = useCallback((e: MouseEvent) => { clearTimeout(debounceRef.current); setAnchorEl(e.currentTarget); }, []); const onMouseLeave = useCallback((e: MouseEvent) => { clearTimeout(debounceRef.current); debounceRef.current = window.setTimeout(() => { setAnchorEl(null); }, DEBOUNCE_DELAY); }, []); const onMouseEnterPopup = useCallback((e: MouseEvent) => { clearTimeout(debounceRef.current); }, []); return ( <> {React.cloneElement(trigger, { ref, onMouseEnter, onMouseLeave })} setAnchorEl(null)} disableRestoreFocus> {content} ); });