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 useScaleable from '../use-scaleable' import { getRect } from './helper' 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 } = useScaleable() const el = usePortal('tooltip') const selfRef = useRef(null) const [rect, setRect] = useState(defaultTooltipPosition) const colors = useMemo(() => getColors(type, theme.palette), [type, theme.palette]) const hasShadow = type === 'default' if (!parent) return null const updateRect = () => { const position = getPosition(placement, getRect(parent), offset) setRect(position) } useResize(updateRect) useClickAnyWhere(() => updateRect()) 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