UNPKG

@mantine/core

Version:

React components library focused on usability, accessibility and developer experience

81 lines (78 loc) 2.6 kB
import { useState, useCallback } from 'react'; import { useDelayGroupContext, useFloating, offset, shift, flip, arrow, inline, useInteractions, useHover, useFocus, useRole, useDismiss, useDelayGroup } from '@floating-ui/react'; import { useId, useDidUpdate } from '@mantine/hooks'; import { useTooltipGroupContext } from './TooltipGroup/TooltipGroup.context.js'; import { useFloatingAutoUpdate } from '../Floating/use-floating-auto-update.js'; function useTooltip(settings) { const [uncontrolledOpened, setUncontrolledOpened] = useState(false); const controlled = typeof settings.opened === "boolean"; const opened = controlled ? settings.opened : uncontrolledOpened; const withinGroup = useTooltipGroupContext(); const uid = useId(); const { delay: groupDelay, currentId, setCurrentId } = useDelayGroupContext(); const onChange = useCallback((_opened) => { setUncontrolledOpened(_opened); if (_opened) { setCurrentId(uid); } }, [setCurrentId, uid]); const { x, y, reference, floating, context, refs, update, placement, middlewareData: { arrow: { x: arrowX, y: arrowY } = {} } } = useFloating({ placement: settings.position, open: opened, onOpenChange: onChange, middleware: [ offset(settings.offset), shift({ padding: 8 }), flip(), arrow({ element: settings.arrowRef, padding: settings.arrowOffset }), ...settings.inline ? [inline()] : [] ] }); const { getReferenceProps, getFloatingProps } = useInteractions([ useHover(context, { enabled: settings.events.hover, delay: withinGroup ? groupDelay : { open: settings.openDelay, close: settings.closeDelay }, mouseOnly: !settings.events.touch }), useFocus(context, { enabled: settings.events.focus, keyboardOnly: true }), useRole(context, { role: "tooltip" }), useDismiss(context, { enabled: typeof settings.opened === void 0 }), useDelayGroup(context, { id: uid }) ]); useFloatingAutoUpdate({ opened, position: settings.position, positionDependencies: settings.positionDependencies, floating: { refs, update } }); useDidUpdate(() => { var _a; (_a = settings.onPositionChange) == null ? void 0 : _a.call(settings, placement); }, [placement]); const isGroupPhase = opened && currentId && currentId !== uid; return { x, y, arrowX, arrowY, reference, floating, getFloatingProps, getReferenceProps, isGroupPhase, opened, placement }; } export { useTooltip }; //# sourceMappingURL=use-tooltip.js.map