feat: more robust context menu
This commit is contained in:
parent
b07c2fd8ab
commit
6d2bf057a5
@ -400,6 +400,10 @@ button,
|
|||||||
width: fit-content;
|
width: fit-content;
|
||||||
border: 3px solid black;
|
border: 3px solid black;
|
||||||
margin: 0 auto 16px auto;
|
margin: 0 auto 16px auto;
|
||||||
|
|
||||||
|
ul {
|
||||||
|
min-width: 100px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.user-info {
|
.user-info {
|
||||||
|
@ -51,7 +51,7 @@ export default function Avatar() {
|
|||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
setContextMenu({
|
setContextMenu({
|
||||||
open: !contextMenu.open,
|
open: !contextMenu.open,
|
||||||
allowOpen: false,
|
allowOpen: contextMenu.allowOpen,
|
||||||
mouseX: event.clientX + 4,
|
mouseX: event.clientX + 4,
|
||||||
mouseY: event.clientY + 2,
|
mouseY: event.clientY + 2,
|
||||||
});
|
});
|
||||||
@ -68,6 +68,16 @@ export default function Avatar() {
|
|||||||
|
|
||||||
const handleMenuClose = () => {
|
const handleMenuClose = () => {
|
||||||
setContextMenu({ ...contextMenu, open: false });
|
setContextMenu({ ...contextMenu, open: false });
|
||||||
|
setContextMenu((prevContextMenu) => ({
|
||||||
|
...prevContextMenu,
|
||||||
|
allowOpen: false,
|
||||||
|
}));
|
||||||
|
setTimeout(() => {
|
||||||
|
setContextMenu((prevContextMenu) => ({
|
||||||
|
...prevContextMenu,
|
||||||
|
allowOpen: true,
|
||||||
|
}));
|
||||||
|
}, 100);
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleCloseContextMenuOutside: (event: MouseEvent) => void = (ev) => {
|
const handleCloseContextMenuOutside: (event: MouseEvent) => void = (ev) => {
|
||||||
@ -76,9 +86,8 @@ export default function Avatar() {
|
|||||||
contextMenuRef.current?.contains(ev.target as Node) ||
|
contextMenuRef.current?.contains(ev.target as Node) ||
|
||||||
avatarRef.current?.contains(ev.target as Node)
|
avatarRef.current?.contains(ev.target as Node)
|
||||||
)
|
)
|
||||||
) {
|
)
|
||||||
handleMenuClose();
|
handleMenuClose();
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const [dialog, setDialog] = useState(<></>);
|
const [dialog, setDialog] = useState(<></>);
|
||||||
@ -87,7 +96,6 @@ export default function Avatar() {
|
|||||||
function handleViewProfile() {
|
function handleViewProfile() {
|
||||||
handleMenuClose();
|
handleMenuClose();
|
||||||
if (user) {
|
if (user) {
|
||||||
setContextMenu({ ...contextMenu, allowOpen: false });
|
|
||||||
dialogRef.current?.showModal();
|
dialogRef.current?.showModal();
|
||||||
setDialog(UserInfo(user));
|
setDialog(UserInfo(user));
|
||||||
}
|
}
|
||||||
@ -98,7 +106,13 @@ export default function Avatar() {
|
|||||||
className="avatar"
|
className="avatar"
|
||||||
onContextMenu={handleMenuClick}
|
onContextMenu={handleMenuClick}
|
||||||
style={{ display: user ? "block" : "none" }}
|
style={{ display: user ? "block" : "none" }}
|
||||||
onClick={handleMenuClick}
|
onClick={(event) => {
|
||||||
|
if (contextMenu.open && event.target === avatarRef.current) {
|
||||||
|
handleMenuClose();
|
||||||
|
} else {
|
||||||
|
handleMenuClick(event);
|
||||||
|
}
|
||||||
|
}}
|
||||||
ref={avatarRef}
|
ref={avatarRef}
|
||||||
>
|
>
|
||||||
👤 {user?.username}
|
👤 {user?.username}
|
||||||
@ -140,8 +154,8 @@ export default function Avatar() {
|
|||||||
id="AvatarDialog"
|
id="AvatarDialog"
|
||||||
ref={dialogRef}
|
ref={dialogRef}
|
||||||
onClick={(event) => {
|
onClick={(event) => {
|
||||||
|
event.stopPropagation();
|
||||||
event.currentTarget.close();
|
event.currentTarget.close();
|
||||||
setContextMenu({ ...contextMenu, allowOpen: true });
|
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{dialog}
|
{dialog}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user