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 (
{user.profilePicUrl ? ( {displayName} ) : ( )}

{displayName}

{displayEmail &&

{displayEmail}

} {!user.headscaleUserId && (

Not linked

)}

{mapRoleToName(user.role)}

{user.lastLoginAt ? new Date(user.lastLoginAt).toLocaleDateString() : "Never"}

{user.machines.length > 0 ? (

{isOnline ? "Connected" : new Date(lastSeen).toLocaleString()}

) : (

No machines

)} ); } function mapRoleToName(role: Role) { switch (role) { case "owner": return "Owner"; case "admin": return "Admin"; case "network_admin": return "Network Admin"; case "it_admin": return "IT Admin"; case "auditor": return "Auditor"; case "viewer": return "Viewer"; case "member": return

Member

; default: return "Unknown"; } }