UNPKG

@mantine/core

Version:

React components library focused on usability, accessibility and developer experience

60 lines (57 loc) 1.92 kB
import { useState, useRef, useCallback, useEffect } from 'react'; import { useFloating, shift, getOverflowAncestors } from '@floating-ui/react'; function useFloatingTooltip({ offset, position }) { const [opened, setOpened] = useState(false); const boundaryRef = useRef(); const { x, y, reference, floating, refs, update, placement } = useFloating({ placement: position, middleware: [ shift({ crossAxis: true, padding: 5, rootBoundary: "document" }) ] }); const horizontalOffset = placement.includes("right") ? offset : position.includes("left") ? offset * -1 : 0; const verticalOffset = placement.includes("bottom") ? offset : position.includes("top") ? offset * -1 : 0; const handleMouseMove = useCallback(({ clientX, clientY }) => { reference({ getBoundingClientRect() { return { width: 0, height: 0, x: clientX, y: clientY, left: clientX + horizontalOffset, top: clientY + verticalOffset, right: clientX, bottom: clientY }; } }); }, [reference]); useEffect(() => { if (refs.floating.current) { const boundary = boundaryRef.current; boundary.addEventListener("mousemove", handleMouseMove); const parents = getOverflowAncestors(refs.floating.current); parents.forEach((parent) => { parent.addEventListener("scroll", update); }); return () => { boundary.removeEventListener("mousemove", handleMouseMove); parents.forEach((parent) => { parent.removeEventListener("scroll", update); }); }; } return void 0; }, [reference, refs.floating.current, update, handleMouseMove, opened]); return { handleMouseMove, x, y, opened, setOpened, boundaryRef, floating }; } export { useFloatingTooltip }; //# sourceMappingURL=use-floating-tooltip.js.map