@mantine/core
Version:
React components library focused on usability, accessibility and developer experience
88 lines (87 loc) • 3.22 kB
JavaScript
"use client";
import { TooltipGroupContext } from "./TooltipGroup/TooltipGroup.mjs";
import { use, useCallback, useState } from "react";
import { useDidUpdate, useId as useId$1 } from "@mantine/hooks";
import { arrow, autoUpdate, flip, inline, offset, shift, useDelayGroup, useDismiss, useFloating, useFocus, useHover, useInteractions, useRole } from "@floating-ui/react";
//#region packages/@mantine/core/src/components/Tooltip/use-tooltip.ts
function getDefaultMiddlewares(middlewares) {
if (middlewares === void 0) return {
shift: true,
flip: true
};
const result = { ...middlewares };
if (middlewares.shift === void 0) result.shift = true;
if (middlewares.flip === void 0) result.flip = true;
return result;
}
function getTooltipMiddlewares(settings) {
const middlewaresOptions = getDefaultMiddlewares(settings.middlewares);
const middlewares = [offset(settings.offset)];
if (middlewaresOptions.shift) middlewares.push(shift(typeof middlewaresOptions.shift === "boolean" ? { padding: 8 } : {
padding: 8,
...middlewaresOptions.shift
}));
if (middlewaresOptions.flip) middlewares.push(typeof middlewaresOptions.flip === "boolean" ? flip() : flip(middlewaresOptions.flip));
middlewares.push(arrow({
element: settings.arrowRef,
padding: settings.arrowOffset
}));
if (middlewaresOptions.inline) middlewares.push(typeof middlewaresOptions.inline === "boolean" ? inline() : inline(middlewaresOptions.inline));
else if (settings.inline) middlewares.push(inline());
return middlewares;
}
function useTooltip(settings) {
const [uncontrolledOpened, setUncontrolledOpened] = useState(settings.defaultOpened);
const opened = typeof settings.opened === "boolean" ? settings.opened : uncontrolledOpened;
const withinGroup = use(TooltipGroupContext).withinGroup;
const uid = useId$1();
const onChange = useCallback((_opened) => {
setUncontrolledOpened(_opened);
if (_opened) setCurrentId(uid);
}, [uid]);
const { x, y, context, refs, placement, middlewareData: { arrow: { x: arrowX, y: arrowY } = {} } } = useFloating({
strategy: settings.strategy,
placement: settings.position,
open: opened,
onOpenChange: onChange,
middleware: getTooltipMiddlewares(settings),
whileElementsMounted: autoUpdate
});
const { delay: groupDelay, currentId, setCurrentId } = useDelayGroup(context, { id: uid });
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,
visibleOnly: true
}),
useRole(context, { role: "tooltip" }),
useDismiss(context, { enabled: typeof settings.opened === "undefined" })
]);
useDidUpdate(() => {
settings.onPositionChange?.(placement);
}, [placement]);
const isGroupPhase = opened && currentId && currentId !== uid;
return {
x,
y,
arrowX,
arrowY,
reference: refs.setReference,
floating: refs.setFloating,
getFloatingProps,
getReferenceProps,
isGroupPhase,
opened,
placement
};
}
//#endregion
export { useTooltip };
//# sourceMappingURL=use-tooltip.mjs.map