import { Cog, Ellipsis, SquareTerminal } from 'lucide-react'; import { useState } from 'react'; import Menu 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; } type Modal = 'rename' | 'expire' | 'remove' | 'routes' | 'move' | 'tags' | null; export default function MachineMenu({ node, magic, users, isFullButton, isDisabled, }: 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); }} /> )} {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); }} /> )} {isFullButton ? (
{supportsTailscaleSSH ? ( { // We need to use JS to open the SSH URL // in a new WINDOW since href can only // do a new TAB. window.open( // TODO: Use the actual real username lol `${__PREFIX__}/ssh?hostname=${node.name}&username=tale`, '_blank', 'noopener,noreferrer,width=800,height=600', ); }} >

SSH

) : undefined}

Machine Settings

) : (
{supportsTailscaleSSH ? ( { // We need to use JS to open the SSH URL // in a new WINDOW since href can only // do a new TAB. window.open( // TODO: Use the actual real username lol `${__PREFIX__}/ssh?hostname=${node.name}&username=tale`, '_blank', 'noopener,noreferrer,width=800,height=600', ); }} className={cn( 'py-0.5 w-fit bg-transparent border-transparent', 'border group-hover:border-headplane-200', 'dark:group-hover:border-headplane-700', 'opacity-0 pointer-events-none group-hover:opacity-100', 'group-hover:pointer-events-auto', )} > SSH ) : undefined}
)} setModal(key as Modal)} disabledKeys={node.expired ? ['expire'] : []} > Edit machine name Edit route settings Edit ACL tags Change owner

Expire

Remove

); }