feat: more robust context menu

This commit is contained in:
julius 2025-03-11 12:33:35 +01:00
parent b07c2fd8ab
commit 6d2bf057a5
Signed by: julius
GPG Key ID: C80A63E6A5FD7092
2 changed files with 24 additions and 6 deletions

View File

@ -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 {

View File

@ -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}