diff --git a/dashboard/src/routes/apps/[slug]/+page.svelte b/dashboard/src/routes/apps/[slug]/+page.svelte index 3f6e583..41fe007 100644 --- a/dashboard/src/routes/apps/[slug]/+page.svelte +++ b/dashboard/src/routes/apps/[slug]/+page.svelte @@ -16,6 +16,9 @@ import ConfirmModal from '$lib/ConfirmModal.svelte'; import ActionMenu from '$lib/ActionMenu.svelte'; import RoleChip from '$lib/RoleChip.svelte'; + import { currentUser } from '$lib/auth'; + + const me = $derived($currentUser); const SAMPLE_SOURCE = '#{\n statusCode: 200,\n body: #{ ok: true, echo: ctx.request.body }\n}'; @@ -308,8 +311,16 @@ removingMember = true; removeMemberError = null; try { + const removedSelf = !!me && memberToRemove.user_id === me.id; await api.appMembers.remove(app.id, memberToRemove.user_id); memberToRemove = null; + if (removedSelf) { + // We just revoked our own access to this app; the next + // fetch of /apps/{slug} would 403. Bounce back to the + // apps list rather than render a broken tab. + await goto(`${base}/apps`); + return; + } await loadMembers(app.id); } catch (e) { removeMemberError = e instanceof Error ? e.message : String(e);