refactor: auto-generate subscription ID in useReqTimelineEnhanced

Remove the manual `id` parameter from useReqTimelineEnhanced and generate it
automatically from the filter, relays, and stream option. This prevents bugs
where the ID doesn't match the actual query parameters.

Benefits:
- Simpler API - one less parameter to pass
- Impossible to create ID/filter mismatches
- ID always perfectly reflects what's being queried
- More maintainable and less error-prone

The subscription ID is now generated as:
`req-${JSON.stringify(filters)}-${relays.join(",")}-${stream}`

This ensures the subscription re-triggers when any of these values change,
which is exactly when we want to re-subscribe.

Updated call site in ReqViewer.tsx to use the new API.
This commit is contained in:
Claude
2025-12-22 22:24:39 +00:00
parent e9f6d5fc3a
commit 16889a9e30
2 changed files with 12 additions and 9 deletions

View File

@@ -760,12 +760,10 @@ export default function ReqViewer({
eoseReceived,
relayStates: reqRelayStates,
overallState,
} = useReqTimelineEnhanced(
`req-${JSON.stringify(resolvedFilter)}-${closeOnEose}`,
resolvedFilter,
normalizedRelays,
{ limit: resolvedFilter.limit || 50, stream },
);
} = useReqTimelineEnhanced(resolvedFilter, normalizedRelays, {
limit: resolvedFilter.limit || 50,
stream,
});
const [showQuery, setShowQuery] = useState(false);
const [showExportDialog, setShowExportDialog] = useState(false);

View File

@@ -36,14 +36,13 @@ interface UseReqTimelineEnhancedReturn {
* - Syncs connection state from RelayStateManager
* - Tracks events per relay via event._relay metadata
* - Derives overall state from individual relay states
* - Generates subscription ID automatically from filters, relays, and options
*
* @param id - Unique identifier for this timeline (for caching)
* @param filters - Nostr filter(s)
* @param relays - Array of relay URLs
* @param options - Stream mode, limit, etc.
*/
export function useReqTimelineEnhanced(
id: string,
filters: Filter | Filter[],
relays: string[],
options: UseReqTimelineEnhancedOptions = { limit: 50 },
@@ -85,6 +84,12 @@ export function useReqTimelineEnhanced(
const stableFilters = useStableValue(filters);
const stableRelays = useStableArray(relays);
// Generate stable subscription ID from parameters
// This ensures re-subscription when filters, relays, or stream mode changes
const subscriptionId = useMemo(() => {
return `req-${JSON.stringify(stableFilters)}-${stableRelays.join(",")}-${stream}`;
}, [stableFilters, stableRelays, stream]);
// Initialize relay states when relays change
useEffect(() => {
queryStartedAt.current = Date.now();
@@ -317,7 +322,7 @@ export function useReqTimelineEnhanced(
return () => {
subscriptions.forEach((sub) => sub.unsubscribe());
};
}, [id, stableFilters, stableRelays, limit, stream, eventStore]);
}, [subscriptionId, limit, eventStore]);
// Derive overall state from individual relay states
const overallState = useMemo(() => {