import { DropdownMenu, IconButton, clx } from "@medusajs/ui" import { EllipsisHorizontal } from "@medusajs/icons" import { PropsWithChildren, ReactNode } from "react" import { Link } from "react-router-dom" import { ConditionalTooltip } from "../conditional-tooltip" import { useDocumentDirection } from "../../../hooks/use-document-direction" export type Action = { icon: ReactNode label: string disabled?: boolean /** * Optional tooltip to display when a disabled action is hovered. */ disabledTooltip?: string | ReactNode } & ( | { to: string onClick?: never } | { onClick: () => void to?: never } ) export type ActionGroup = { actions: Action[] } type ActionMenuProps = PropsWithChildren<{ groups: ActionGroup[] variant?: "transparent" | "primary" }> export const ActionMenu = ({ groups, variant = "transparent", children, }: ActionMenuProps) => { const direction = useDocumentDirection() const inner = children ?? ( ) return ( {inner} {groups.map((group, index) => { if (!group.actions.length) { return null } const isLast = index === groups.length - 1 return ( {group.actions.map((action, index) => { const Wrapper = action.disabledTooltip ? ({ children }: { children: ReactNode }) => (
{children}
) : "div" if (action.onClick) { return ( { e.stopPropagation() action.onClick() }} className={clx( "[&_svg]:text-ui-fg-subtle flex items-center gap-x-2", { "[&_svg]:text-ui-fg-disabled": action.disabled, } )} > {action.icon} {action.label} ) } return ( e.stopPropagation()}> {action.icon} {action.label} ) })} {!isLast && }
) })}
) }