import React, { AriaRole, ReactNode } from 'react' import Tippy from '@tippyjs/react/headless' import { StrictModifiers } from '@popperjs/core' import { noop } from '@aviato/utils' import { BasePlacement, BasePosition, Placement } from './types' import { flipPlacement, flipPosition } from './utils' import { getZIndex } from '~/theme' import { Transition, TransitionPrimitive, } from '~/components/Utilities/Transition' export interface SharedPopoverProps { position?: BasePosition placement?: BasePlacement role?: AriaRole padding?: number transition?: TransitionPrimitive transitionDuration?: number exitTransitionDuration?: number transitionTimingFunction?: string } export interface PopoverProps extends SharedPopoverProps { referenceElement: T mounted: boolean zIndex?: number modifiers?: StrictModifiers[] onTransitionEnd?(): void children: ReactNode } export function Popover({ referenceElement, position = 'top', placement = 'center', mounted, zIndex = getZIndex('Popover'), role = 'tooltip', padding = 8, modifiers = [], transition = 'none', transitionDuration = 0, exitTransitionDuration = transitionDuration, transitionTimingFunction, onTransitionEnd = noop, children, }: PopoverProps) { const internalPlacement = flipPlacement(placement, 'ltr') const internalPosition = flipPosition(position, 'ltr') const initialPlacement: Placement = internalPlacement === 'center' ? internalPosition : `${internalPosition}-${internalPlacement}` const popperModifiers = [ { name: 'offset', options: { offset: [0, padding], }, }, ...modifiers, ] const popperOptions = { modifiers: popperModifiers, } /** * Unmount Tippy instance after animation ends */ let unmountTippyInstance = () => {} return ( { unmountTippyInstance() onTransitionEnd() }} > {(transitionStyles) => ( { unmountTippyInstance = instance.unmount }} render={(attributes) => (
{children}
)} /> )}
) } Popover.displayName = 'Popper'