From c3fe1bc9d476839af446db0e33acc8fd25b382b7 Mon Sep 17 00:00:00 2001 From: Jannis Braun <151788261+TheZwiss@users.noreply.github.com> Date: Mon, 20 Apr 2026 15:06:00 +0200 Subject: [PATCH] feat: track awaitingApprovalPeerOrigins and show login toast for pending approvals --- packages/web/src/hooks/useWebSocket.ts | 31 +++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/packages/web/src/hooks/useWebSocket.ts b/packages/web/src/hooks/useWebSocket.ts index 99bc55c1..95d1a76c 100644 --- a/packages/web/src/hooks/useWebSocket.ts +++ b/packages/web/src/hooks/useWebSocket.ts @@ -22,6 +22,12 @@ export function getRejectedPeerOrigins(): Set { return rejectedPeerOrigins; } +const awaitingApprovalPeerOrigins = new Set(); + +export function getAwaitingApprovalPeerOrigins(): Set { + return awaitingApprovalPeerOrigins; +} + // ─── Connection state ───────────────────────────────────────────────────────── interface ConnectionState { @@ -381,6 +387,27 @@ function handleEvent(origin: string, event: ServerEvent): void { } } } + + // Populate awaiting-approval peer origins + if (isHome) { + awaitingApprovalPeerOrigins.clear(); + if (Array.isArray(event.awaitingApprovalPeerOrigins)) { + for (const o of event.awaitingApprovalPeerOrigins) { + awaitingApprovalPeerOrigins.add(o); + } + } + + // Admin toast for pending approval requests + if (event.pendingApprovalCount && event.pendingApprovalCount > 0) { + const { addToast } = useUIStore.getState(); + const count = event.pendingApprovalCount; + addToast( + `You have ${count} pending peering request${count === 1 ? '' : 's'}`, + 'info', + 5000, + ); + } + } break; case 'message_created': @@ -658,9 +685,10 @@ function handleEvent(origin: string, event: ServerEvent): void { case 'federation_peer_rejected': { const { addToast } = useUIStore.getState(); rejectedPeerOrigins.add(event.peerOrigin); + awaitingApprovalPeerOrigins.delete(event.peerOrigin); const label = event.peerLabel || event.peerOrigin; addToast( - `Cannot relay messages to ${label} — their server requires manual peering approval. Contact their admin to set up peering.`, + `Cannot relay messages to ${label} — ${event.reason}`, 'warning', 10000, ); @@ -669,6 +697,7 @@ function handleEvent(origin: string, event: ServerEvent): void { case 'federation_peer_active': { rejectedPeerOrigins.delete(event.peerOrigin); + awaitingApprovalPeerOrigins.delete(event.peerOrigin); break; }