// Copyright (c) Tailscale Inc & AUTHORS // SPDX-License-Identifier: BSD-3-Clause import cx from "classnames" import React from "react" import { apiFetch, incrementMetric } from "src/api" import ACLTag from "src/components/acl-tag" import * as Control from "src/components/control-components" import NiceIP from "src/components/nice-ip" import { UpdateAvailableNotification } from "src/components/update-available" import { NodeData } from "src/hooks/node-data" import Button from "src/ui/button" import QuickCopy from "src/ui/quick-copy" import { useLocation } from "wouter" export default function DeviceDetailsView({ readonly, node, }: { readonly: boolean node: NodeData }) { const [, setLocation] = useLocation() return ( <>

Device details

{node.DeviceName}

{!readonly && ( )}
{node.Features["auto-update"] && !readonly && node.ClientVersion && !node.ClientVersion.RunningLatest && ( )}

General

Managed by {node.IsTagged ? node.Tags.map((t) => ) : node.Profile?.DisplayName}
Machine name {node.DeviceName}
OS {node.OS}
ID {node.ID}
Tailscale version {node.IPNVersion}
Key expiry {node.KeyExpired ? "Expired" : // TODO: present as relative expiry (e.g. "5 months from now") new Date(node.KeyExpiry).toLocaleString()}

Addresses

Tailscale IPv4 {node.IPv4}
Tailscale IPv6
Short domain {node.DeviceName}
Full domain {node.DeviceName}.{node.TailnetName}
) }