Fix onboarding relay membership denial handling (#500)

This commit is contained in:
Bradley Axen
2026-05-07 22:33:04 +00:00
committed by GitHub
parent 774632753a
commit 7b2c615d8f
2 changed files with 37 additions and 6 deletions
@@ -16,7 +16,17 @@ export function MembershipDenied({
onRetry,
pubkey,
}: MembershipDeniedProps) {
const npub = React.useMemo(() => pubkeyToNpub(pubkey), [pubkey]);
const npub = React.useMemo(() => {
if (!pubkey) {
return "Unknown public key";
}
try {
return pubkeyToNpub(pubkey);
} catch {
return pubkey;
}
}, [pubkey]);
const [copied, setCopied] = React.useState(false);
const handleCopy = React.useCallback(async () => {
@@ -35,15 +35,25 @@ import type {
* Returns `true` if denied, `false` if the user is a member (or if the
* relay doesn't enforce membership / isn't reachable).
*/
function isRelayMembershipDeniedError(error: unknown): boolean {
if (!(error instanceof Error)) {
return false;
}
return (
error.message.includes("You must be a relay member") ||
error.message.includes("relay_membership_required") ||
error.message.includes("restricted: not a relay member") ||
error.message.includes("invalid: you are not a relay member")
);
}
async function checkMembershipDenied(): Promise<boolean> {
try {
const { membership, snapshotFound } = await getMyRelayMembershipLookup();
return snapshotFound && membership === null;
} catch (error) {
if (
error instanceof Error &&
error.message.includes("relay returned 403")
) {
if (isRelayMembershipDeniedError(error)) {
return true;
}
// Network errors, 401s, 500s — not membership denials.
@@ -271,7 +281,18 @@ export function OnboardingFlow({
if (Object.keys(updatePayload).length > 0) {
try {
await profileUpdateMutation.mutateAsync(updatePayload);
} catch {
} catch (error) {
if (isRelayMembershipDeniedError(error)) {
try {
const identity = await getIdentity();
setDeniedPubkey(identity.pubkey);
} catch {
setDeniedPubkey("");
}
setCurrentPage("membership-denied");
return;
}
// Error falls through to the error banner / recovery buttons.
return;
}