"use client"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { Ellipsis, LogOut, Settings } from "lucide-react"; import { useEffect, useRef, useState } from "react"; import { Button } from "@/components/ui/button"; import type { Permission, PublicAccount } from "@/modules/core/types"; import { UserAvatar } from "@/modules/shared/components/UserAvatar"; type AccountMenuProps = { account: PublicAccount; permissions: Permission[]; }; export function AccountMenu({ account, permissions }: AccountMenuProps): React.ReactElement { const router = useRouter(); const menuRef = useRef(null); const [isOpen, setIsOpen] = useState(false); const [isPending, setIsPending] = useState(false); const canReadAccounts = permissions.includes("account:read"); const settingsHref = canReadAccounts ? `/app/settings/users?q=${encodeURIComponent(account.email)}` : "/app/settings/global"; useEffect(() => { if (!isOpen) { return; } function handlePointerDown(event: PointerEvent): void { const target = event.target; if (target instanceof Node && !menuRef.current?.contains(target)) { setIsOpen(false); } } function handleKeyDown(event: KeyboardEvent): void { if (event.key === "Escape") { setIsOpen(false); } } document.addEventListener("pointerdown", handlePointerDown); document.addEventListener("keydown", handleKeyDown); return () => { document.removeEventListener("pointerdown", handlePointerDown); document.removeEventListener("keydown", handleKeyDown); }; }, [isOpen]); async function handleSignOut(): Promise { setIsPending(true); await fetch("/api/auth/logout", { method: "POST" }); router.refresh(); router.replace("/login"); } return (

{account.name}

{account.email}

{isOpen ? (
setIsOpen(false)} role="menuitem" >
) : null}
); }