anvil/striker-ui/components/Menu.tsx

44 lines
1.1 KiB
TypeScript
Raw Normal View History

2023-12-11 23:32:27 +00:00
import { Menu as MuiMenu } from '@mui/material';
import { FC, useMemo } from 'react';
import MenuItem from './MenuItem';
const Menu: FC<MenuProps> = (props) => {
const {
getItemDisabled,
2023-12-11 23:32:27 +00:00
items = {},
muiMenuProps: menuProps,
onItemClick,
open,
renderItem,
} = props;
const pairs = useMemo(() => Object.entries(items), [items]);
const itemElements = useMemo(
() =>
pairs.map(([key, value]) => (
<MenuItem
disabled={getItemDisabled?.call(null, key, value)}
2023-12-11 23:32:27 +00:00
onClick={(...parent) =>
onItemClick?.call(null, key, value, ...parent)
}
// The key is only relevant within the same branch; i.e., instance of
// the same key under a different parent is OK.
key={key}
>
{renderItem?.call(null, key, value)}
</MenuItem>
)),
[getItemDisabled, onItemClick, pairs, renderItem],
2023-12-11 23:32:27 +00:00
);
return (
<MuiMenu open={open} {...menuProps}>
{itemElements}
</MuiMenu>
);
};
export default Menu as <T>(props: MenuProps<T>) => ReturnType<FC<MenuProps<T>>>;