/* eslint-disable react/hook-use-state */ import { ChevronDownIcon, CopyIcon, KebabHorizontalIcon } from '@primer/octicons-react' import { type FetcherWithComponents, Link } from '@remix-run/react' import { useState } from 'react' import Menu from '~/components/Menu' import StatusCircle from '~/components/StatusCircle' import { toast } from '~/components/Toaster' import { type Machine, type Route } from '~/types' import { cn } from '~/utils/cn' import Delete from './dialogs/delete' import Expire from './dialogs/expire' import Rename from './dialogs/rename' import Routes from './dialogs/routes' type MachineProperties = { readonly machine: Machine; readonly routes: Route[]; readonly fetcher: FetcherWithComponents; readonly magic?: string; } export default function MachineRow({ machine, routes, fetcher, magic }: MachineProperties) { const renameState = useState(false) const expireState = useState(false) const removeState = useState(false) const routesState = useState(false) const expired = new Date(machine.expiry).getTime() < Date.now() const tags = [ ...machine.forcedTags, ...machine.validTags ] if (expired) { tags.unshift('Expired') } return (

{machine.givenName}

{machine.name}

{tags.map(tag => ( {tag} ))}
{machine.ipAddresses[0]} {machine.ipAddresses.map(ip => ( { await navigator.clipboard.writeText(ip) toast('Copied IP address to clipboard') }} > {ip} ))} {magic ? ( { const ip = `${machine.givenName}.${machine.user.name}.${magic}` await navigator.clipboard.writeText(ip) toast('Copied hostname to clipboard') }} > {machine.givenName}.{machine.user.name}.{magic} ) : undefined}

{machine.online && !expired ? 'Connected' : new Date( machine.lastSeen ).toLocaleString()}

{expired ? undefined : ( )} Edit machine name Edit route settings Edit ACL tags {expired ? undefined : ( Expire )} Remove ) }