From 67e0da7444e8308c6ff95ae3abe65dd34dba7897 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 15 Jan 2026 15:07:38 +0000 Subject: [PATCH] Add proper relay hints for fetching Zapstore releases Use useLiveTimeline instead of eventStore.timeline() to actually fetch release events from relays. Relay selection includes: - Seen relays (where the app event was received from) - Publisher's outbox relays (NIP-65) - Aggregator relays as fallback This ensures releases are properly fetched rather than just read from the local event store cache. --- .../nostr/kinds/ZapstoreAppDetailRenderer.tsx | 46 +++++++++++++++++-- .../nostr/kinds/ZapstoreAppRenderer.tsx | 46 +++++++++++++++++-- 2 files changed, 82 insertions(+), 10 deletions(-) diff --git a/src/components/nostr/kinds/ZapstoreAppDetailRenderer.tsx b/src/components/nostr/kinds/ZapstoreAppDetailRenderer.tsx index 9fddd1c..93b4e2b 100644 --- a/src/components/nostr/kinds/ZapstoreAppDetailRenderer.tsx +++ b/src/components/nostr/kinds/ZapstoreAppDetailRenderer.tsx @@ -16,8 +16,6 @@ import { UserName } from "../UserName"; import { ExternalLink } from "@/components/ExternalLink"; import { MediaEmbed } from "../MediaEmbed"; import { Badge } from "@/components/ui/badge"; -import { use$ } from "applesauce-react/hooks"; -import eventStore from "@/services/event-store"; import { useMemo } from "react"; import { useGrimoire } from "@/core/state"; import { @@ -29,6 +27,10 @@ import { Laptop, FileDown, } from "lucide-react"; +import { getSeenRelays } from "applesauce-core/helpers/relays"; +import { relayListCache } from "@/services/relay-list-cache"; +import { AGGREGATOR_RELAYS } from "@/services/loaders"; +import { useLiveTimeline } from "@/hooks/useLiveTimeline"; interface ZapstoreAppDetailRendererProps { event: NostrEvent; @@ -157,6 +159,37 @@ export function ZapstoreAppDetailRenderer({ const license = getAppLicense(event); const identifier = getAppIdentifier(event); + // Build relay list for fetching releases: + // 1. Seen relays (where we received this app event) + // 2. Publisher's outbox relays (NIP-65) + // 3. Aggregator relays (fallback) + const relays = useMemo(() => { + const relaySet = new Set(); + + // Add seen relays from the app event + const seenRelays = getSeenRelays(event); + if (seenRelays) { + for (const relay of seenRelays) { + relaySet.add(relay); + } + } + + // Add publisher's outbox relays + const outboxRelays = relayListCache.getOutboxRelaysSync(event.pubkey); + if (outboxRelays) { + for (const relay of outboxRelays.slice(0, 3)) { + relaySet.add(relay); + } + } + + // Add aggregator relays + for (const relay of AGGREGATOR_RELAYS) { + relaySet.add(relay); + } + + return Array.from(relaySet); + }, [event]); + // Query for releases that reference this app const releasesFilter = useMemo(() => { if (!identifier) { @@ -169,9 +202,12 @@ export function ZapstoreAppDetailRenderer({ }; }, [event.pubkey, identifier]); - const releases = use$( - () => eventStore.timeline(releasesFilter), - [releasesFilter], + // Use useLiveTimeline to fetch releases from relays with proper hints + const { events: releases } = useLiveTimeline( + `zapstore-releases-detail-${event.id}`, + releasesFilter, + relays, + { limit: 50 }, ); // Sort releases by version (newest first) or created_at diff --git a/src/components/nostr/kinds/ZapstoreAppRenderer.tsx b/src/components/nostr/kinds/ZapstoreAppRenderer.tsx index c49cfa2..3b34863 100644 --- a/src/components/nostr/kinds/ZapstoreAppRenderer.tsx +++ b/src/components/nostr/kinds/ZapstoreAppRenderer.tsx @@ -12,11 +12,13 @@ import { getReleaseFileEventId, } from "@/lib/zapstore-helpers"; import { PlatformIcon } from "./zapstore/PlatformIcon"; -import { use$ } from "applesauce-react/hooks"; -import eventStore from "@/services/event-store"; import { useMemo } from "react"; import { useGrimoire } from "@/core/state"; import { FileDown } from "lucide-react"; +import { getSeenRelays } from "applesauce-core/helpers/relays"; +import { relayListCache } from "@/services/relay-list-cache"; +import { AGGREGATOR_RELAYS } from "@/services/loaders"; +import { useLiveTimeline } from "@/hooks/useLiveTimeline"; /** * Renderer for Kind 32267 - App Metadata @@ -29,6 +31,37 @@ export function ZapstoreAppRenderer({ event }: BaseEventProps) { const identifier = getAppIdentifier(event); const platforms = detectPlatforms(event); + // Build relay list for fetching releases: + // 1. Seen relays (where we received this app event) + // 2. Publisher's outbox relays (NIP-65) + // 3. Aggregator relays (fallback) + const relays = useMemo(() => { + const relaySet = new Set(); + + // Add seen relays from the app event + const seenRelays = getSeenRelays(event); + if (seenRelays) { + for (const relay of seenRelays) { + relaySet.add(relay); + } + } + + // Add publisher's outbox relays + const outboxRelays = relayListCache.getOutboxRelaysSync(event.pubkey); + if (outboxRelays) { + for (const relay of outboxRelays.slice(0, 3)) { + relaySet.add(relay); + } + } + + // Add aggregator relays + for (const relay of AGGREGATOR_RELAYS) { + relaySet.add(relay); + } + + return Array.from(relaySet); + }, [event]); + // Query for releases that reference this app const releasesFilter = useMemo(() => { if (!identifier) { @@ -40,9 +73,12 @@ export function ZapstoreAppRenderer({ event }: BaseEventProps) { }; }, [event.pubkey, identifier]); - const releases = use$( - () => eventStore.timeline(releasesFilter), - [releasesFilter], + // Use useLiveTimeline to actually fetch releases from relays + const { events: releases } = useLiveTimeline( + `zapstore-releases-${event.id}`, + releasesFilter, + relays, + { limit: 10 }, ); // Get the latest release (by version or created_at)