import { ChevronDownIcon, CopyIcon } from '@primer/octicons-react'; import { useMemo } from 'react'; import { Link } from 'react-router'; import Chip from '~/components/Chip'; import Menu from '~/components/Menu'; import StatusCircle from '~/components/StatusCircle'; import type { User } from '~/types'; import cn from '~/utils/cn'; import * as hinfo from '~/utils/host-info'; import { ExitNodeTag } from '~/components/tags/ExitNode'; import { ExpiryTag } from '~/components/tags/Expiry'; import { HeadplaneAgentTag } from '~/components/tags/HeadplaneAgent'; import { SubnetTag } from '~/components/tags/Subnet'; import { PopulatedNode } from '~/utils/node-info'; import toast from '~/utils/toast'; import MenuOptions from './menu'; interface Props { node: PopulatedNode; users: User[]; isAgent?: boolean; magic?: string; isDisabled?: boolean; } export default function MachineRow({ node, users, isAgent, magic, isDisabled, }: Props) { const uiTags = useMemo(() => { const tags = uiTagsForNode(node, isAgent); return tags; }, [node, isAgent]); const ipOptions = useMemo(() => { if (magic) { return [...node.ipAddresses, `${node.givenName}.${magic}`]; } return node.ipAddresses; }, [magic, node.ipAddresses]); return (
{node.givenName}
{node.user.name}
{hinfo.getTSVersion(node.hostInfo)}
{hinfo.getOSInfo(node.hostInfo)}
> ) : (Unknown
)}{node.online && !node.expired ? 'Connected' : new Date(node.lastSeen).toLocaleString()}