import React, { MutableRefObject, useEffect, useMemo, useRef, useState } from 'react' import { createPortal } from 'react-dom' import useTheme from '../use-theme' import usePortal from '../utils/use-portal' import useResize from '../utils/use-resize' import CssTransition from '../shared/css-transition' import useClickAnyWhere from '../utils/use-click-anywhere' import { getColors } from './styles' import { getPosition, TooltipPosition, defaultTooltipPosition } from './placement' import TooltipIcon from './tooltip-icon' import { Placement, SnippetTypes } from '../utils/prop-types' import useScale from '../use-scale' import { getRect } from './helper' import useClasses from '../use-classes' interface Props { parent?: MutableRefObject | undefined placement?: Placement type?: SnippetTypes visible?: boolean hideArrow?: boolean offset?: number className?: string iconOffset: TooltipIconOffset } export type TooltipIconOffset = { x: string y: string } const TooltipContent: React.FC> = ({ children, parent, visible, offset, iconOffset, placement, type, className, hideArrow }) => { const theme = useTheme() const { SCALES } = useScale() const el = usePortal( 'tooltip', () => document.body.querySelector('#hui-tooltip-root') || document.body ) const selfRef = useRef(null) const [rect, setRect] = useState(defaultTooltipPosition) const colors = useMemo(() => getColors(type || 'default', theme.palette), [type, theme.palette]) const hasShadow = type === 'default' const classes = useClasses('tooltip-content', className) if (!parent) return null const updateRect = () => { const position = getPosition(placement || 'top', getRect(parent), offset || 0) setRect(position) } // eslint-disable-next-line react-hooks/rules-of-hooks useResize(updateRect) // eslint-disable-next-line react-hooks/rules-of-hooks useClickAnyWhere(() => updateRect()) // eslint-disable-next-line react-hooks/rules-of-hooks useEffect(() => { updateRect() }, [visible]) const preventHandler = (event: React.MouseEvent) => { event.stopPropagation() event.nativeEvent.stopImmediatePropagation() } if (!el) return null return createPortal(
{!hideArrow && } {children}
, el ) } export default TooltipContent