in apps/chat/src/components/Common/Tooltip.tsx [42:106]
export function useTooltip({
initialOpen = false,
placement = 'bottom',
isTriggerClickable = false,
open: controlledOpen,
onOpenChange: setControlledOpen,
}: TooltipContainerOptions = {}) {
const [uncontrolledOpen, setUncontrolledOpen] = useState(initialOpen);
const arrowRef = useRef<SVGSVGElement>(null);
const open = controlledOpen ?? uncontrolledOpen;
const setOpen = setControlledOpen ?? setUncontrolledOpen;
const ARROW_HEIGHT = 7;
const GAP = 2;
const data = useFloating({
placement,
open,
onOpenChange: setOpen,
whileElementsMounted: autoUpdate,
middleware: [
offset(ARROW_HEIGHT + GAP),
flip({
crossAxis: placement.includes('-'),
fallbackAxisSideDirection: 'start',
padding: 5,
}),
shift({ padding: 5 }),
arrow({
element: arrowRef,
}),
],
});
const context = data.context;
const hover = useHover(context, {
move: false,
enabled: controlledOpen == null,
mouseOnly: isTriggerClickable,
delay: {
open: 500,
close: 0,
},
});
const focus = useFocus(context, {
enabled: controlledOpen == null,
});
const dismiss = useDismiss(context);
const role = useRole(context, { role: 'tooltip' });
const interactions = useInteractions([hover, focus, dismiss, role]);
return useMemo(
() => ({
open,
setOpen,
arrowRef,
...interactions,
...data,
}),
[open, setOpen, interactions, data],
);
}