import { FluidContainer } from "@ente/shared/components/Container"; import { Box, IconButton, MenuItem, styled, Typography, type ButtonProps, type IconButtonProps, type PaperProps, } from "@mui/material"; import Menu, { type MenuProps } from "@mui/material/Menu"; import React, { createContext, useContext, useState } from "react"; const OverflowMenuContext = createContext({ // eslint-disable-next-line @typescript-eslint/no-empty-function close: () => {}, }); interface OverflowMenuProps { triggerButtonIcon: React.ReactNode; triggerButtonProps?: Partial; children?: React.ReactNode; ariaControls: string; menuPaperProps?: Partial; } export const StyledMenu = styled(Menu)` & .MuiPaper-root { margin: 16px auto; box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.16), 0px 3px 6px rgba(0, 0, 0, 0.12); } & .MuiList-root { padding: 0; border: none; } `; export const OverflowMenu: React.FC = ({ children, ariaControls, triggerButtonIcon, triggerButtonProps, menuPaperProps, }) => { const [sortByEl, setSortByEl] = useState( null, ); const handleClose = () => setSortByEl(null); return ( setSortByEl(event.currentTarget)} aria-controls={sortByEl ? ariaControls : undefined} aria-haspopup="true" aria-expanded={sortByEl ? "true" : undefined} {...triggerButtonProps} > {triggerButtonIcon} {children} ); }; interface OverflowMenuOptionProps { onClick: () => void; color?: ButtonProps["color"]; startIcon?: React.ReactNode; endIcon?: React.ReactNode; keepOpenAfterClick?: boolean; children?: any; // To avoid changing old places without an audit, new code should use this // option explicitly to fix/tweak the alignment of the button label and // icon. Once all existing uses have migrated, can change the default. centerAlign?: boolean; } export const OverflowMenuOption: React.FC = ({ onClick, color = "primary", startIcon, endIcon, keepOpenAfterClick, centerAlign, children, }) => { const menuContext = useContext(OverflowMenuContext); const handleClick = () => { onClick(); if (!keepOpenAfterClick) { menuContext.close(); } }; return ( theme.palette[color].main, padding: 1.5, "& .MuiSvgIcon-root": { fontSize: "20px", }, }} > {startIcon && ( {startIcon} )} {children} {endIcon && ( {endIcon} )} ); };