From 359d3d0dd61fddc47ff238f6b68ded2dfb4adbc9 Mon Sep 17 00:00:00 2001 From: Gigi Date: Mon, 20 Oct 2025 19:56:00 +0200 Subject: [PATCH] feat: add relay list debug section to Debug component - Add state variables for relay list loading (isLoadingRelayList, relayListEvents, timing) - Add handleLoadRelayList function to query kind 10002 events - Add handleClearRelayList function to clear loaded data - Add UI section with Load/Clear buttons and event display - Show relay URLs and permissions for each relay list event - Add loadRelayList to live timing type definition --- src/components/Debug.tsx | 137 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) diff --git a/src/components/Debug.tsx b/src/components/Debug.tsx index 159784fd..80e7acba 100644 --- a/src/components/Debug.tsx +++ b/src/components/Debug.tsx @@ -114,6 +114,12 @@ const Debug: React.FC = ({ const [markAsReadReactions, setMarkAsReadReactions] = useState([]) const [tLoadMarkAsRead, setTLoadMarkAsRead] = useState(null) const [tFirstMarkAsRead, setTFirstMarkAsRead] = useState(null) + + // Relay list loading state + const [isLoadingRelayList, setIsLoadingRelayList] = useState(false) + const [relayListEvents, setRelayListEvents] = useState([]) + const [tLoadRelayList, setTLoadRelayList] = useState(null) + const [tFirstRelayList, setTFirstRelayList] = useState(null) // Deduplicated reading progress from controller const [deduplicatedProgressMap, setDeduplicatedProgressMap] = useState>(new Map()) @@ -127,6 +133,7 @@ const Debug: React.FC = ({ loadHighlights?: { startTime: number } loadReadingProgress?: { startTime: number } loadMarkAsRead?: { startTime: number } + loadRelayList?: { startTime: number } }>({}) // Web of Trust state @@ -886,6 +893,70 @@ const Debug: React.FC = ({ DebugBus.info('debug', 'Cleared mark-as-read reactions data') } + const handleLoadRelayList = async () => { + if (!relayPool || !activeAccount?.pubkey) { + DebugBus.warn('debug', 'Please log in to load relay list') + return + } + + try { + setIsLoadingRelayList(true) + setRelayListEvents([]) + setTLoadRelayList(null) + setTFirstRelayList(null) + DebugBus.info('debug', 'Loading relay list (kind 10002)...') + + const start = performance.now() + let firstEventTime: number | null = null + setLiveTiming(prev => ({ ...prev, loadRelayList: { startTime: start } })) + + const { queryEvents } = await import('../services/dataFetch') + + // Query for kind:10002 (relay list) + const events = await queryEvents(relayPool, { + kinds: [10002], + authors: [activeAccount.pubkey], + limit: 10 + }, { + onEvent: (evt) => { + if (firstEventTime === null) { + firstEventTime = performance.now() - start + setTFirstRelayList(Math.round(firstEventTime)) + } + setRelayListEvents(prev => [...prev, evt]) + } + }) + + const elapsed = Math.round(performance.now() - start) + setTLoadRelayList(elapsed) + setLiveTiming(prev => { + // eslint-disable-next-line @typescript-eslint/no-unused-vars, no-unused-vars + const { loadRelayList, ...rest } = prev + return rest + }) + + DebugBus.info('debug', `Loaded ${events.length} relay list events in ${elapsed}ms`) + + // Log details about the events + events.forEach((event, index) => { + const relayCount = event.tags.filter(tag => tag[0] === 'r').length + DebugBus.info('debug', `Event ${index + 1}: ${relayCount} relays, created ${new Date(event.created_at * 1000).toISOString()}`) + }) + } catch (err) { + console.error('Failed to load relay list:', err) + DebugBus.error('debug', `Failed to load relay list: ${err instanceof Error ? err.message : String(err)}`) + } finally { + setIsLoadingRelayList(false) + } + } + + const handleClearRelayList = () => { + setRelayListEvents([]) + setTLoadRelayList(null) + setTFirstRelayList(null) + DebugBus.info('debug', 'Cleared relay list data') + } + const handleLoadFriendsList = async () => { if (!relayPool || !activeAccount?.pubkey) { DebugBus.warn('debug', 'Please log in to load friends list') @@ -1698,6 +1769,72 @@ const Debug: React.FC = ({ )} + {/* Relay List Loading Section */} +
+

Relay List Loading (kind 10002)

+
Load your relay list to debug dynamic relay integration:
+ +
+ + +
+ +
+ + +
+ {relayListEvents.length > 0 && ( +
+
Loaded Relay List Events ({relayListEvents.length}):
+
+ {relayListEvents.map((evt, idx) => { + const relayTags = evt.tags?.filter((t: string[]) => t[0] === 'r') || [] + + return ( +
+
Relay List Event #{idx + 1}
+
+
Kind: {evt.kind}
+
Author: {evt.pubkey.slice(0, 16)}...
+
Created: {new Date(evt.created_at * 1000).toLocaleString()}
+
Relays: {relayTags.length}
+
+
+
Relay URLs:
+ {relayTags.map((tag, tagIdx) => ( +
+ {tag[1]} {tag[2] ? `(${tag[2]})` : ''} +
+ ))} +
+
ID: {evt.id}
+
+ ) + })} +
+
+ )} +
+ {/* Web of Trust Section */}

Web of Trust