import * as React from 'react';
import classNames from 'classnames';
import {FloatingPortal, useMergeRefs, FloatingArrow} from '@floating-ui/react';
import Text from '../text/Text';
import useTooltipContext from './useTooltipContext';
export type TooltipElementPropsType = {
/**
* Tooltip text.
* @example
*/
label: string;
/**
* Optional string. Additional classnames.
*/
className?: string | null | undefined;
} & Omit, 'children' | 'className'>;
const ARROW_SIZE_DEFAULT = 24;
const ARROW_SIZE_SMALL = 12;
const ARROW_SVG_PATH_DEFAULT =
'M0 24C1.72106 24 3.38535 23.3843 4.69205 22.2642L11.026 16.8349C11.5868 16.3542 12.414 16.3533 12.9759 16.8327L19.3782 22.2961C20.667 23.3958 22.3057 24 24 24V24L0 24V24Z';
const ARROW_SVG_PATH_SMALL =
'M0 12C0.86053 12 1.69267 11.6922 2.34602 11.1321L5.51299 8.41745C5.79338 8.17711 6.20701 8.17665 6.48794 8.41637L9.6891 11.148C10.3335 11.6979 11.1529 12 12 12L0 12Z';
const TooltipElement = React.forwardRef<
HTMLDivElement,
TooltipElementPropsType
// @ts-ignore
>((props: TooltipElementPropsType, ref) => {
const {className, label} = props;
const context = useTooltipContext();
// @ts-ignore TS18047
const elementRef = useMergeRefs([context.refs.setFloating, ref]);
const arrowSize =
// @ts-ignore TS18047
context.size === 'small' ? ARROW_SIZE_SMALL : ARROW_SIZE_DEFAULT;
const arrowSVGPath =
// @ts-ignore TS18047
context.size === 'small' ? ARROW_SVG_PATH_SMALL : ARROW_SVG_PATH_DEFAULT;
const isShorterThanArrowWithPadding =
// @ts-ignore TS18047
arrowSize + 2 * context.arrowPadding >
// @ts-ignore TS18047
context.refs.floating.current?.offsetHeight;
// If the placement is right or left
// and the tooltip isn't high enough to fit an arrow with the padding
// position the arrow individually.
// We don't care for top and bottom, because the component min width is enough to fit both arrow and it's padding.
const arrowOffset =
isShorterThanArrowWithPadding &&
// @ts-ignore TS18047
(context.placement.includes('right') || context.placement.includes('left'))
? `calc(50% - ${arrowSize / 2}px)`
: null;
const tooltipClass = classNames(
'sg-tooltip',
{
// @ts-ignore TS18047
[`sg-tooltip--${String(context.size)}`]: context.size,
// @ts-ignore TS18047
[`sg-tooltip--${String(context.color)}`]: context.color,
},
className
);
return (
// @ts-ignore TS18047
context.isMounted && (
{label}
)
);
});
export default TooltipElement;