import { ComponentProps, ReactNode, useCallback, useEffect, useState, } from 'react'; import * as DropdownMenu from '@radix-ui/react-dropdown-menu'; import { clsx } from 'clsx/lite'; import { FiMoreHorizontal } from 'react-icons/fi'; import MoreMenuItem from './MoreMenuItem'; export default function MoreMenu({ sections, icon, header, className, classNameButton, classNameButtonOpen, ariaLabel, align = 'end', // Prevent errant clicks from trigger being too close to menu sideOffset = 6, isOpen: isOpenProp, setIsOpen: setIsOpenProp, onOpen, ...props }: { sections: ComponentProps[][] icon?: ReactNode header?: ReactNode className?: string classNameButton?: string classNameButtonOpen?: string ariaLabel: string isOpen?: boolean setIsOpen?: (isOpen: boolean) => void onOpen?: () => void } & ComponentProps){ const [isOpenInternal, setIsOpenInternal] = useState(isOpenProp ?? false); const isOpen = isOpenProp ?? isOpenInternal; const setIsOpen = setIsOpenProp ?? setIsOpenInternal; const dismissMenu = useCallback(() => { setIsOpen(false); }, [setIsOpen]); useEffect(() => { if (isOpen) { onOpen?.(); } }, [isOpen, onOpen]); return ( e.preventDefault()} align={align} sideOffset={sideOffset} className={clsx( 'z-10', 'min-w-[8rem]', 'component-surface', 'py-1', 'shadow-lg shadow-gray-900/10 dark:shadow-900', 'data-[side=top]:dark:shadow-[0_0px_40px_rgba(0,0,0,0.6)]', 'data-[side=bottom]:dark:shadow-[0_10px_40px_rgba(0,0,0,0.6)]', 'data-[side=top]:animate-fade-in-from-bottom', 'data-[side=bottom]:animate-fade-in-from-top', className, )} > {header &&
{header}
}
{sections.map((section, index) =>
{section.map(props =>
, )}
, )}
); };