import { Ellipsis } from "lucide-react"; import { useState } from "react"; import Menu from "~/components/Menu"; import type { Machine, User } from "~/types"; import cn from "~/utils/cn"; import Delete from "../dialogs/delete-user"; import LinkUser from "../dialogs/link-user"; import Reassign from "../dialogs/reassign-user"; import Rename from "../dialogs/rename-user"; interface MenuProps { user: User & { headplaneRole: string; machines: Machine[]; }; headscaleUsers: { id: string; name: string; claimed: boolean }[]; currentLink?: string; } type Modal = "rename" | "delete" | "reassign" | "link" | null; export default function UserMenu({ user, headscaleUsers, currentLink }: MenuProps) { const [modal, setModal] = useState(null); const disabledKeys: string[] = []; if (user.provider === "oidc") { disabledKeys.push("rename"); } else { disabledKeys.push("reassign", "link"); } // Filter linkable users: unclaimed, or the one currently linked to this user const linkableUsers = headscaleUsers.filter((u) => !u.claimed || u.id === currentLink); return ( <> {modal === "rename" && ( { if (!isOpen) setModal(null); }} user={user} /> )} {modal === "delete" && ( { if (!isOpen) setModal(null); }} user={user} /> )} {modal === "reassign" && ( { if (!isOpen) setModal(null); }} user={user} /> )} {modal === "link" && ( { if (!isOpen) setModal(null); }} user={user} /> )} setModal(key as Modal)}> Rename user Change role Link Headscale user

Delete

); }