From 26ee4b84a946681cf3886b6a9844e6e36f794400 Mon Sep 17 00:00:00 2001 From: julius Date: Tue, 11 Mar 2025 11:04:42 +0100 Subject: [PATCH] feat: update context menu to use references --- src/Avatar.tsx | 46 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/src/Avatar.tsx b/src/Avatar.tsx index ed664c2..5be5a4f 100644 --- a/src/Avatar.tsx +++ b/src/Avatar.tsx @@ -1,4 +1,4 @@ -import { MouseEventHandler, useEffect, useState } from "react"; +import { createRef, MouseEventHandler, useEffect, useState } from "react"; import { useSession } from "./Session"; interface ContextMenuItem { @@ -13,11 +13,12 @@ export default function Avatar() { mouseX: number; mouseY: number; }>({ open: false, mouseX: 0, mouseY: 0 }); + const contextMenuRef = createRef(); + const avatarRef = createRef(); const contextMenuItems: ContextMenuItem[] = [ - { label: "View Profile", onClick: () => console.log("View Profile") }, - { label: "Edit Profile", onClick: () => console.log("Edit Profile") }, - { label: "Logout", onClick: () => onLogout() }, + { label: "View Profile", onClick: handleViewProfile }, + { label: "Logout", onClick: onLogout }, ]; const handleMenuClick: MouseEventHandler = (event) => { @@ -40,29 +41,43 @@ export default function Avatar() { const handleMenuClose = () => { setContextMenu({ ...contextMenu, open: false }); }; - const handleCloseContextMenuOutside: MouseEventHandler = ( - event - ) => { + const handleCloseContextMenuOutside: (event: MouseEvent) => void = (ev) => { if ( - !event.target || - (!(event.target as Element).closest(".context-menu") && - !(event.target as Element).closest(".avatar")) + !( + contextMenuRef.current?.contains(ev.target as Node) || + avatarRef.current?.contains(ev.target as Node) + ) ) { handleMenuClose(); } }; + const [dialog, setDialog] = useState(<>); + const dialogRef = createRef(); + + function handleViewProfile() { + handleMenuClose(); + dialogRef.current?.showModal(); + setDialog( +
    +
  • username: {user?.username}
  • +
+ ); + } + return (
- {user?.username} + 👤 {user?.username} {contextMenu.open && (
    )} + { + event.currentTarget.close(); + }} + > + {dialog} +
); }