From 55ddbe0987a83459ac313ef0c80892eed45b90de Mon Sep 17 00:00:00 2001 From: Aarnav Tale Date: Sat, 14 Mar 2026 14:59:34 -0400 Subject: [PATCH] fix: handle user deletion --- app/routes/users/components/headplane-user-row.tsx | 4 +++- app/routes/users/components/menu.tsx | 5 +++-- app/routes/users/overview.tsx | 2 ++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/app/routes/users/components/headplane-user-row.tsx b/app/routes/users/components/headplane-user-row.tsx index e38c92b..e6b885c 100644 --- a/app/routes/users/components/headplane-user-row.tsx +++ b/app/routes/users/components/headplane-user-row.tsx @@ -10,9 +10,10 @@ import MenuOptions from "./menu"; interface HeadplaneUserRowProps { user: HeadplaneUserData; headscaleUsers: { id: string; name: string; claimed: boolean }[]; + isSelf?: boolean; } -export default function HeadplaneUserRow({ user, headscaleUsers }: HeadplaneUserRowProps) { +export default function HeadplaneUserRow({ user, headscaleUsers, isSelf }: HeadplaneUserRowProps) { const isOnline = user.machines.some((machine) => machine.online); const lastSeen = user.machines.reduce( (acc, machine) => Math.max(acc, new Date(machine.lastSeen).getTime()), @@ -66,6 +67,7 @@ export default function HeadplaneUserRow({ user, headscaleUsers }: HeadplaneUser diff --git a/app/routes/users/components/menu.tsx b/app/routes/users/components/menu.tsx index 6e3820b..93ce028 100644 --- a/app/routes/users/components/menu.tsx +++ b/app/routes/users/components/menu.tsx @@ -12,11 +12,12 @@ interface MenuProps { user: HeadplaneUserData; headscaleUsers: { id: string; name: string; claimed: boolean }[]; currentLink?: string; + isSelf?: boolean; } type Modal = "delete" | "reassign" | "link" | null; -export default function UserMenu({ user, headscaleUsers, currentLink }: MenuProps) { +export default function UserMenu({ user, headscaleUsers, currentLink, isSelf }: MenuProps) { const [modal, setModal] = useState(null); const isLinked = currentLink !== undefined; @@ -80,7 +81,7 @@ export default function UserMenu({ user, headscaleUsers, currentLink }: MenuProp setModal("link")}> {isLinked ? "Change linked user" : "Link Headscale user"} - {user.linkedHeadscaleUser && ( + {user.linkedHeadscaleUser && !isSelf && ( <> setModal("delete")}> diff --git a/app/routes/users/overview.tsx b/app/routes/users/overview.tsx index d944b1a..ea045db 100644 --- a/app/routes/users/overview.tsx +++ b/app/routes/users/overview.tsx @@ -128,6 +128,7 @@ export async function loader({ request, context }: Route.LoaderArgs) { return { writable: writablePermission, + currentUserId: principal.kind === "oidc" ? principal.user.id : undefined, oidc: context.config.oidc ? { issuer: context.config.oidc.issuer } : undefined, magic, apiError, @@ -186,6 +187,7 @@ export default function Page({ loaderData }: Route.ComponentProps) { > {loaderData.headplaneUsers.map((user) => (