fix: context menu and dialog didn't play nice

This commit is contained in:
julius 2025-03-11 11:14:07 +01:00
parent 26ee4b84a9
commit 00442be4b5
Signed by: julius
GPG Key ID: C80A63E6A5FD7092

View File

@ -10,9 +10,10 @@ export default function Avatar() {
const { user, onLogout } = useSession(); const { user, onLogout } = useSession();
const [contextMenu, setContextMenu] = useState<{ const [contextMenu, setContextMenu] = useState<{
open: boolean; open: boolean;
allowOpen: boolean;
mouseX: number; mouseX: number;
mouseY: number; mouseY: number;
}>({ open: false, mouseX: 0, mouseY: 0 }); }>({ open: false, allowOpen: true, mouseX: 0, mouseY: 0 });
const contextMenuRef = createRef<HTMLUListElement>(); const contextMenuRef = createRef<HTMLUListElement>();
const avatarRef = createRef<HTMLDivElement>(); const avatarRef = createRef<HTMLDivElement>();
@ -22,13 +23,16 @@ export default function Avatar() {
]; ];
const handleMenuClick: MouseEventHandler<HTMLDivElement> = (event) => { const handleMenuClick: MouseEventHandler<HTMLDivElement> = (event) => {
if (!contextMenu.allowOpen) return;
event.preventDefault(); event.preventDefault();
setContextMenu({ setContextMenu({
open: !contextMenu.open, open: !contextMenu.open,
allowOpen: false,
mouseX: event.clientX + 4, mouseX: event.clientX + 4,
mouseY: event.clientY + 2, mouseY: event.clientY + 2,
}); });
}; };
useEffect(() => { useEffect(() => {
if (contextMenu.open) { if (contextMenu.open) {
document.addEventListener("click", handleCloseContextMenuOutside); document.addEventListener("click", handleCloseContextMenuOutside);
@ -41,6 +45,7 @@ export default function Avatar() {
const handleMenuClose = () => { const handleMenuClose = () => {
setContextMenu({ ...contextMenu, open: false }); setContextMenu({ ...contextMenu, open: false });
}; };
const handleCloseContextMenuOutside: (event: MouseEvent) => void = (ev) => { const handleCloseContextMenuOutside: (event: MouseEvent) => void = (ev) => {
if ( if (
!( !(
@ -57,9 +62,10 @@ export default function Avatar() {
function handleViewProfile() { function handleViewProfile() {
handleMenuClose(); handleMenuClose();
setContextMenu({ ...contextMenu, allowOpen: false });
dialogRef.current?.showModal(); dialogRef.current?.showModal();
setDialog( setDialog(
<ul> <ul style={{ listStyle: "none" }}>
<li>username: {user?.username}</li> <li>username: {user?.username}</li>
</ul> </ul>
); );
@ -113,6 +119,7 @@ export default function Avatar() {
ref={dialogRef} ref={dialogRef}
onClick={(event) => { onClick={(event) => {
event.currentTarget.close(); event.currentTarget.close();
setContextMenu({ ...contextMenu, allowOpen: true });
}} }}
> >
{dialog} {dialog}