import {Fragment} from 'react'; import {createPortal} from 'react-dom'; import {SerializedStyles, useTheme} from '@emotion/react'; import styled from '@emotion/styled'; import {AnimatePresence} from 'framer-motion'; import {Overlay, PositionWrapper} from 'sentry/components/overlay'; import {IS_ACCEPTANCE_TEST} from 'sentry/constants/index'; import space from 'sentry/styles/space'; import {useHoverOverlay, UseHoverOverlayProps} from 'sentry/utils/useHoverOverlay'; import {AcceptanceTestTooltip} from './acceptanceTestTooltip'; export interface InternalTooltipProps extends UseHoverOverlayProps { children: React.ReactNode; /** * The content to show in the tooltip popover */ title: React.ReactNode; /** * Disable the tooltip display entirely */ disabled?: boolean; /** * Additional style rules for the tooltip content. */ overlayStyle?: React.CSSProperties | SerializedStyles; } // Warning: This component is conditionally exported end-of-file based on IS_ACCEPTANCE_TEST env variable export function DO_NOT_USE_TOOLTIP({ children, overlayStyle, title, disabled = false, ...hoverOverlayProps }: InternalTooltipProps) { const theme = useTheme(); const {wrapTrigger, isOpen, overlayProps, placement, arrowData, arrowProps} = useHoverOverlay('tooltip', hoverOverlayProps); if (disabled || !title) { return {children}; } const tooltipContent = isOpen && ( {title} ); return ( {wrapTrigger(children)} {createPortal({tooltipContent}, document.body)} ); } const TooltipContent = styled(Overlay)` padding: ${space(1)} ${space(1.5)}; overflow-wrap: break-word; max-width: 225px; color: ${p => p.theme.textColor}; font-size: ${p => p.theme.fontSizeSmall}; line-height: 1.2; text-align: center; `; interface TooltipProps extends InternalTooltipProps { /** * Stops tooltip from being opened during tooltip visual acceptance. * Should be set to true if tooltip contains unisolated data (eg. dates) */ disableForVisualTest?: boolean; } /** * Tooltip will enhance the internal tooltip with the open/close * functionality used in src/sentry/utils/pytest/selenium.py so that tooltips * can be opened and closed for specific snapshots. */ function Tooltip({disableForVisualTest, ...props}: TooltipProps) { if (IS_ACCEPTANCE_TEST) { return disableForVisualTest ? ( {props.children} ) : ( ); } return ; } export default Tooltip;