// 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
{!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}
|
>
)
}