import { Cog, Ellipsis, SquareTerminal } from "lucide-react"; import { useState } from "react"; import Button from "~/components/Button"; import { Menu, MenuContent, MenuItem, MenuSeparator, MenuTrigger } from "~/components/menu"; import type { User } from "~/types"; import cn from "~/utils/cn"; import { PopulatedNode } from "~/utils/node-info"; import Delete from "../dialogs/delete"; import Expire from "../dialogs/expire"; import Move from "../dialogs/move"; import Rename from "../dialogs/rename"; import Routes from "../dialogs/routes"; import Tags from "../dialogs/tags"; interface MenuProps { node: PopulatedNode; users: User[]; magic?: string; isFullButton?: boolean; isDisabled?: boolean; existingTags?: string[]; supportsNodeOwnerChange: boolean; } type Modal = "rename" | "expire" | "remove" | "routes" | "move" | "tags" | null; export default function MachineMenu({ node, magic, users, isFullButton, isDisabled, existingTags, supportsNodeOwnerChange, }: MenuProps) { const [modal, setModal] = useState(null); const supportsTailscaleSSH = node.hostInfo?.sshHostKeys && node.hostInfo?.sshHostKeys.length > 0; return (
{modal === "remove" && ( { if (!isOpen) setModal(null); }} /> )} {modal === "move" && ( { if (!isOpen) setModal(null); }} users={users} /> )} {modal === "rename" && ( { if (!isOpen) setModal(null); }} /> )} {modal === "routes" && ( { if (!isOpen) setModal(null); }} /> )} {modal === "tags" && ( { if (!isOpen) setModal(null); }} /> )} {node.expired && modal === "expire" ? undefined : ( { if (!isOpen) setModal(null); }} /> )} {supportsTailscaleSSH ? ( isFullButton ? ( ) : ( ) ) : undefined} {isFullButton ? ( <>

Machine Settings

) : ( )}
setModal("rename")}>Edit machine name setModal("routes")}>Edit route settings setModal("tags")}>Edit ACL tags {supportsNodeOwnerChange && ( setModal("move")}>Change owner )} setModal("expire")}> Expire setModal("remove")}> Remove
); }