import { autoUpdate, flip, FloatingFocusManager, FloatingPortal, offset, type Placement, shift, size as floatingSize, useDismiss, useFloating, useInteractions, useRole, } from '@floating-ui/react'; import { Transition } from '@headlessui/react'; import { FocusScope } from '@react-aria/focus'; import { ThemeProvider, useTheme } from '@wise/components-theming'; import { clsx } from 'clsx'; import { useState } from 'react'; import { PreventScroll } from '../../../common/preventScroll/PreventScroll'; export interface SelectInputPopoverProps { placement?: Placement; open: boolean; renderTrigger: (args: { ref: React.RefCallback; getInteractionProps: (customEventHandlers?: React.HTMLProps) => { [key: string]: unknown; }; }) => React.ReactNode; title?: string; size?: 'md' | 'lg'; padding?: 'none' | 'md'; children?: React.ReactNode; onClose?: () => void; onCloseEnd?: () => void; } const FLOATING_PADDING = 16; export function SelectInputPopover({ placement, open, renderTrigger, title, size = 'md', padding = 'md', children, onClose, onCloseEnd, }: SelectInputPopoverProps) { const { refs, floatingStyles, context } = useFloating({ strategy: 'fixed', placement, middleware: [ offset(8), flip({ padding: FLOATING_PADDING, crossAxis: false }), shift(), floatingSize({ padding: FLOATING_PADDING, apply: ({ elements, rects, availableHeight }) => { elements.floating.style.setProperty('--max-height', `${availableHeight}px`); elements.floating.style.setProperty('--width', `${rects.reference.width}px`); }, }), ], whileElementsMounted: autoUpdate, open, onOpenChange: (value) => { if (!value) { onClose?.(); } }, }); const dismiss = useDismiss(context); const role = useRole(context); const { getReferenceProps, getFloatingProps } = useInteractions([role, dismiss]); const [floatingKey, setFloatingKey] = useState(0); const { theme, screenMode } = useTheme(); return ( <> {open ? : null} {renderTrigger({ ref: refs.setReference, getInteractionProps: getReferenceProps, })} { setFloatingKey((prev) => prev + 1); }} afterLeave={onCloseEnd} >
{title ? (

{title}

) : null}
{children}
); }