From 532fe2345a1f2c0f3b3d46fd17c5be0f1bdb4af9 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 14 Jan 2026 11:37:13 +0000 Subject: [PATCH] refactor: Only show relays where event hasn't been published yet Remove redundant "Connected relays" section that showed relays where the event was already seen. It doesn't make sense to republish to relays that already have the event. **Changes**: - Filter myRelays to only show unpublished relays (not in seenRelays) - Remove "Connected relays" section entirely - Update button text: "Publish to all (N)" instead of "Publish to all my relays (N)" - Better empty states: - "Sign in to republish events" when no account - "Already published to all your relays" when all relays have event - "No relays in your relay list" when user has no relays - Update submenu disabled state to check unpublishedRelays length **Result**: Cleaner UX that only shows actionable options. The feature now correctly broadcasts events to relays that don't have them yet, avoiding redundant network traffic. Reduces code by 22 lines while improving functionality. --- .../nostr/kinds/BaseEventRenderer.tsx | 114 +++++++----------- 1 file changed, 46 insertions(+), 68 deletions(-) diff --git a/src/components/nostr/kinds/BaseEventRenderer.tsx b/src/components/nostr/kinds/BaseEventRenderer.tsx index f7780ad..f47167f 100644 --- a/src/components/nostr/kinds/BaseEventRenderer.tsx +++ b/src/components/nostr/kinds/BaseEventRenderer.tsx @@ -237,20 +237,15 @@ export function EventMenu({ event }: { event: NostrEvent }) { }); }, [account]); - // Memoize relay lists to avoid unnecessary recalculations + // Get relays where event was already seen const seenRelays = useMemo(() => { const seenRelaysSet = getSeenRelays(event); return seenRelaysSet ? Array.from(seenRelaysSet) : []; }, [event]); - // Connected relays: seen relays that are not in user's relay list - const connectedRelays = useMemo(() => { - return seenRelays.filter((relay) => !myRelays.includes(relay)); - }, [seenRelays, myRelays]); - - // All available relays (for checking if submenu should be disabled) - const allRelays = useMemo(() => { - return Array.from(new Set([...myRelays, ...seenRelays])); + // User's relays where event has NOT been seen yet (these are the ones we can republish to) + const unpublishedRelays = useMemo(() => { + return myRelays.filter((relay) => !seenRelays.includes(relay)); }, [myRelays, seenRelays]); // Check if any publish operation is in progress @@ -309,11 +304,11 @@ export function EventMenu({ event }: { event: NostrEvent }) { }, []); /** - * Publish event to all user's outbox relays + * Publish event to all user's relays where it hasn't been seen yet */ const handleRepublishToMyRelays = useCallback(async () => { - if (myRelays.length === 0) { - toast.error("No relays found in your relay list"); + if (unpublishedRelays.length === 0) { + toast.error("Event already published to all your relays"); return; } @@ -322,21 +317,21 @@ export function EventMenu({ event }: { event: NostrEvent }) { return; } - // Mark all relays as publishing - setPublishingRelays(new Set(myRelays)); + // Mark all unpublished relays as publishing + setPublishingRelays(new Set(unpublishedRelays)); try { - await publishEventToRelays(event, myRelays); + await publishEventToRelays(event, unpublishedRelays); // Mark event as seen on all relays after successful publish // This updates the event's internal state so it appears in "Seen on" dropdown - myRelays.forEach((relay) => addSeenRelay(event, relay)); + unpublishedRelays.forEach((relay) => addSeenRelay(event, relay)); // Mark all as published in UI - setPublishedRelays((prev) => new Set([...prev, ...myRelays])); + setPublishedRelays((prev) => new Set([...prev, ...unpublishedRelays])); toast.success( - `Published to ${myRelays.length} relay${myRelays.length > 1 ? "s" : ""}`, + `Published to ${unpublishedRelays.length} relay${unpublishedRelays.length > 1 ? "s" : ""}`, ); } catch (error) { const message = error instanceof Error ? error.message : "Unknown error"; @@ -345,7 +340,7 @@ export function EventMenu({ event }: { event: NostrEvent }) { } finally { setPublishingRelays(new Set()); } - }, [event, myRelays, isPublishing]); + }, [event, unpublishedRelays, isPublishing]); /** * Publish event to a specific relay @@ -414,13 +409,37 @@ export function EventMenu({ event }: { event: NostrEvent }) { {/* Republish submenu */} - + Republish - {/* Quick action: Publish to all user's outbox relays */} - {account && myRelays.length > 0 && ( + {/* No account */} + {!account && ( +
+ Sign in to republish events +
+ )} + + {/* All relays already have the event */} + {account && unpublishedRelays.length === 0 && ( +
+ {myRelays.length === 0 + ? "No relays in your relay list" + : "Already published to all your relays"} +
+ )} + + {/* Quick action: Publish to all unpublished relays */} + {account && unpublishedRelays.length > 0 && ( <>
- - )} - - {/* No relays available */} - {allRelays.length === 0 && ( -
- No relays available -
- )} - - {/* User's outbox relays */} - {account && myRelays.length > 0 && ( - <> - My relays + Select relays
- {myRelays.map((relay) => ( - handleRepublishToRelay(relay)} - /> - ))} -
- - )} - - {/* Connected relays (seen on but not in user's list) */} - {connectedRelays.length > 0 && ( - <> - {account && myRelays.length > 0 && } - - Connected relays - -
- {connectedRelays.map((relay) => ( + {unpublishedRelays.map((relay) => (