Skip to content

Commit 3ee01cb

Browse files
committed
refactor bugitemmenu
1 parent e19809e commit 3ee01cb

1 file changed

Lines changed: 40 additions & 59 deletions

File tree

src/client/src/components/BugItemMenu.jsx

Lines changed: 40 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,90 +1,71 @@
11
import MoreVertIcon from "@mui/icons-material/MoreVert";
22
import { Divider, IconButton, ListItemIcon, ListItemText, Menu, MenuItem } from "@mui/material";
33
import { styled } from "@mui/material/styles";
4-
import React from "react";
4+
import { useState } from "react";
5+
56
const StyledListItemText = styled(ListItemText)(({ theme }) => ({
67
color: theme.palette.text.primary,
78
}));
89

910
export default function BugItemMenu({ item, menuItems }) {
10-
const [anchorEl, setAnchorEl] = React.useState(null);
11-
const open = Boolean(anchorEl);
11+
const [anchorEl, setAnchorEl] = useState(null);
12+
const isOpen = Boolean(anchorEl);
1213

13-
const handleOpenMenuClick = (event) => {
14-
setAnchorEl(event.currentTarget);
14+
// helper to stop event propagation and closing the menu
15+
const stopAndClose = (event) => {
1516
event.stopPropagation();
1617
event.preventDefault();
17-
};
18-
19-
const handleClose = (event) => {
2018
setAnchorEl(null);
21-
event.stopPropagation();
22-
event.preventDefault();
2319
};
2420

25-
const handleMenuItemClicked = (event, menuItem) => {
26-
setAnchorEl(null);
21+
const handleOpen = (event) => {
2722
event.stopPropagation();
2823
event.preventDefault();
29-
if (menuItem.disabled !== true && typeof menuItem.onClick === "function") {
30-
menuItem.onClick(event, item);
31-
}
24+
setAnchorEl(event.currentTarget);
3225
};
3326

34-
const parseDisabled = (disabledValue) => {
35-
if (disabledValue === undefined) {
36-
return false;
37-
}
27+
const handleItemClick = (event, menuItem) => {
28+
const isDisabled = resolveValue(menuItem.disabled, item);
3829

39-
if (typeof disabledValue === "function") {
40-
return disabledValue(item);
41-
}
30+
stopAndClose(event);
4231

43-
return disabledValue;
32+
if (!isDisabled && typeof menuItem.onClick === "function") {
33+
menuItem.onClick(event, item);
34+
}
4435
};
4536

46-
const getIcon = (icon) => {
47-
if (typeof icon === "function") {
48-
return icon(item);
49-
}
50-
return icon;
37+
// generic helper to handle both static values and function-based props
38+
const resolveValue = (value, context) => {
39+
return typeof value === "function" ? value(context) : value;
5140
};
5241

5342
return (
5443
<div>
55-
<IconButton
56-
component="span"
57-
sx={{
58-
padding: "4px",
59-
}}
60-
aria-label="menu"
61-
aria-controls="long-menu"
62-
aria-haspopup="true"
63-
onClick={handleOpenMenuClick}
64-
>
44+
<IconButton size="small" sx={{ padding: "4px" }} onClick={handleOpen}>
6545
<MoreVertIcon />
6646
</IconButton>
67-
<Menu anchorEl={anchorEl} open={open} onClose={handleClose}>
68-
{menuItems
69-
.filter((menuItem) => menuItem !== null)
70-
.map((menuItem, index) => {
71-
if (menuItem.title === "-") {
72-
return <Divider key={index} />;
73-
} else {
74-
return (
75-
<MenuItem
76-
onClick={(event) => handleMenuItemClicked(event, menuItem)}
77-
key={index}
78-
disabled={parseDisabled(menuItem.disabled)}
79-
>
80-
<ListItemIcon disabled={parseDisabled(menuItem.disabled)}>
81-
{getIcon(menuItem.icon)}
82-
</ListItemIcon>
83-
<StyledListItemText primary={menuItem.title} />
84-
</MenuItem>
85-
);
86-
}
87-
})}
47+
48+
<Menu anchorEl={anchorEl} open={isOpen} onClose={stopAndClose}>
49+
{menuItems.filter(Boolean).map((menuItem, index) => {
50+
// render divider for shorthand title
51+
if (menuItem.title === "-") {
52+
return <Divider key={`divider-${index}`} />;
53+
}
54+
55+
const isDisabled = resolveValue(menuItem.disabled, item);
56+
const icon = resolveValue(menuItem.icon, item);
57+
58+
return (
59+
<MenuItem
60+
key={`menu-item-${index}`}
61+
onClick={(e) => handleItemClick(e, menuItem)}
62+
disabled={isDisabled}
63+
>
64+
{icon && <ListItemIcon>{icon}</ListItemIcon>}
65+
<StyledListItemText primary={menuItem.title} />
66+
</MenuItem>
67+
);
68+
})}
8869
</Menu>
8970
</div>
9071
);

0 commit comments

Comments
 (0)