import { CircleUser } from "lucide-react"; import StatusCircle from "~/components/StatusCircle"; import type { Role } from "~/server/web/roles"; import cn from "~/utils/cn"; import type { HeadplaneUserData } from "../overview"; import MenuOptions from "./menu"; interface HeadplaneUserRowProps { user: HeadplaneUserData; headscaleUsers: { id: string; name: string; claimed: boolean }[]; isSelf?: boolean; isOwner?: boolean; } export default function HeadplaneUserRow({ user, headscaleUsers, isSelf, isOwner, }: HeadplaneUserRowProps) { const isOnline = user.machines.some((machine) => machine.online); const lastSeen = user.machines.reduce( (acc, machine) => Math.max(acc, new Date(machine.lastSeen).getTime()), 0, ); const displayName = user.linkedHeadscaleUser?.displayName || user.name || user.email || user.sub; const displayEmail = user.linkedHeadscaleUser?.email ?? user.email; return (
{displayName}
{displayEmail &&{displayEmail}
} {!user.headscaleUserId && (Not linked
)}{mapRoleToName(user.role)}
{user.lastLoginAt ? new Date(user.lastLoginAt).toLocaleDateString() : "Never"}
{isOnline ? "Connected" : new Date(lastSeen).toLocaleString()}
) : (No machines
)}Member
; default: return "Unknown"; } }