import React, { cloneElement, useRef } from 'react'; import { AriaTooltipProps, mergeProps, useTooltip, useTooltipTrigger, } from 'react-aria'; import { TooltipTriggerState, useTooltipTriggerState } from 'react-stately'; import cn from '~/utils/cn'; export interface TooltipProps extends AriaTooltipProps { children: [React.ReactElement, React.ReactElement]; } function Tooltip(props: TooltipProps) { const state = useTooltipTriggerState({ ...props, delay: 0, closeDelay: 0, }); const ref = useRef(null); const { triggerProps, tooltipProps } = useTooltipTrigger( { ...props, delay: 0, closeDelay: 0, }, state, ref, ); const [component, body] = props.children; return ( {state.isOpen && cloneElement(body, { ...tooltipProps, state, })} ); } interface TooltipBodyProps extends AriaTooltipProps { children: React.ReactNode; state?: TooltipTriggerState; className?: string; } function Body({ state, className, ...props }: TooltipBodyProps) { const { tooltipProps } = useTooltip(props, state); return ( {props.children} ); } export default Object.assign(Tooltip, { Body, });