import { type FC, type MouseEventHandler, useRef } from 'react'; import { useIntl } from 'react-intl'; import { useOnClickOutside } from '../../../../utils/hooks'; import { Heading, Icon } from '../../../atoms'; import { HelpButton } from '../../buttons'; import { Modal, type ModalProps } from '../modal'; import styles from './tooltip.module.scss'; export type TooltipProps = Omit & { /** * The tooltip direction when opening. * * @default "downwards" */ direction?: 'downwards' | 'upwards'; /** * The tooltip heading. */ heading: string; /** * Should the tooltip be opened? * * @default false */ isOpen?: boolean; /** * A callback function to trigger when clicking outside the modal. */ onClickOutside?: () => void; /** * An event handler when clicking on the help button. */ onToggle?: MouseEventHandler; }; /** * Tooltip component * * Render a button and a modal. Note: you should add a CSS rule * `position: relative;` on the consumer. */ export const Tooltip: FC = ({ children, className = '', direction = 'downwards', heading, isOpen, onClickOutside, onToggle, ...props }) => { const intl = useIntl(); const helpLabel = intl.formatMessage({ defaultMessage: 'Show help', description: 'Tooltip: show help label', id: '1Xgg7+', }); const directionModifier = direction === 'upwards' ? 'tooltip--up' : 'tooltip--down'; const visibilityModifier = isOpen ? 'tooltip--visible' : 'tooltip--hidden'; const tooltipClass = `${styles.tooltip} ${styles[directionModifier]} ${styles[visibilityModifier]} ${className}`; const btnRef = useRef(null); const closeModal = ({ target }: MouseEvent | FocusEvent) => { if ( onClickOutside && btnRef.current && !btnRef.current.contains(target as Node) ) { onClickOutside(); } }; const modalRef = useOnClickOutside(closeModal); return ( <> {heading} } icon={} kind="secondary" ref={modalRef} > {children} ); };