import React from 'react'; import * as Ariakit from '@ariakit/react'; import type * as t from '~/common'; import { cn } from '~/utils'; interface DropdownProps { keyPrefix?: string; trigger: React.ReactNode; items: t.MenuItemProps[]; isOpen: boolean; setIsOpen: (isOpen: boolean) => void; className?: string; iconClassName?: string; itemClassName?: string; sameWidth?: boolean; anchor?: { x: string; y: string }; gutter?: number; modal?: boolean; portal?: boolean; preserveTabOrder?: boolean; focusLoop?: boolean; menuId: string; mountByState?: boolean; unmountOnHide?: boolean; finalFocus?: React.RefObject; } type MenuProps = Omit< DropdownProps, 'trigger' | 'isOpen' | 'setIsOpen' | 'focusLoop' | 'mountByState' >; const DropdownPopup: React.FC = ({ trigger, isOpen, setIsOpen, focusLoop, mountByState, ...props }) => { const menu = Ariakit.useMenuStore({ open: isOpen, setOpen: setIsOpen, focusLoop }); if (mountByState) { return ( {trigger} {isOpen && } ); } return ( {trigger} ); }; const Menu: React.FC = ({ items, menuId, keyPrefix, className, iconClassName, itemClassName, modal, portal, sameWidth, gutter = 8, finalFocus, unmountOnHide, preserveTabOrder, }) => { const menu = Ariakit.useMenuContext(); return ( {items .filter((item) => item.show !== false) .map((item, index) => { if (item.separate === true) { return ; } return ( { event.preventDefault(); if (item.onClick) { item.onClick(event); } if (item.hideOnClick === false) { return; } menu?.hide(); }} > {item.icon != null && ( )} {item.label} {item.kbd != null && ( // eslint-disable-next-line i18next/no-literal-string ⌘{item.kbd} )} ); })} ); }; export default DropdownPopup;