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) => (