diff --git a/src/hooks/useComments.ts b/src/hooks/useComments.ts index 355a01a..f11dbce 100644 --- a/src/hooks/useComments.ts +++ b/src/hooks/useComments.ts @@ -1,11 +1,14 @@ import { + getRelayListForUser, NDKFilter, NDKKind, + NDKRelaySet, NDKSubscription, NDKSubscriptionCacheUsage } from '@nostr-dev-kit/ndk' import { useEffect, useState } from 'react' -import { CommentEvent, ModDetails } from 'types' +import { CommentEvent, ModDetails, UserRelaysType } from 'types' +import { log, LogType, timeout } from 'utils' import { useNDKContext } from './useNDKContext' export const useComments = (mod: ModDetails) => { @@ -16,20 +19,51 @@ export const useComments = (mod: ModDetails) => { let subscription: NDKSubscription // Define the subscription variable here for cleanup const setupSubscription = async () => { + // Find the mod author's relays. + + const authorReadRelays = await Promise.race([ + getRelayListForUser(mod.author, ndk), + timeout(10 * 1000) // add a 10 sec timeout + ]) + .then((ndkRelayList) => { + if (ndkRelayList) return ndkRelayList[UserRelaysType.Read] + return [] // Return an empty array if ndkRelayList is undefined + }) + .catch((err) => { + log( + true, + LogType.Error, + `An error occurred in fetching user's (${mod.author}) ${UserRelaysType.Read}`, + err + ) + return [] as string[] + }) + const filter: NDKFilter = { kinds: [NDKKind.Text], - '#a': [mod.aTag], - '#p': [mod.author] + '#a': [mod.aTag] } - subscription = ndk.subscribe(filter, { - closeOnEose: false, - cacheUsage: NDKSubscriptionCacheUsage.CACHE_FIRST + const relayUrls = new Set() + + ndk.pool.urls().forEach((relayUrl) => { + relayUrls.add(relayUrl) }) - console.log('ndk.pool.urls() :>> ', ndk.pool.urls()) + authorReadRelays.forEach((relayUrl) => relayUrls.add(relayUrl)) + + subscription = ndk.subscribe( + filter, + { + closeOnEose: false, + cacheUsage: NDKSubscriptionCacheUsage.CACHE_FIRST + }, + NDKRelaySet.fromRelayUrls(Array.from(relayUrls), ndk) + ) subscription.on('event', (ndkEvent) => { + console.log('ndkEvent :>> ', ndkEvent) + setCommentEvents((prev) => { if (prev.find((e) => e.id === ndkEvent.id)) { return [...prev]