fix: fetch profile from current relays if user has no relay list

This commit is contained in:
codytseng
2025-11-03 09:52:11 +08:00
parent e556b83f5c
commit 1b7ec56c89
3 changed files with 20 additions and 9 deletions

View File

@@ -1,3 +1,4 @@
import { BIG_RELAY_URLS } from '@/constants'
import { TRelayInfo } from '@/types'
export function checkAlgoRelay(relayInfo: TRelayInfo | undefined) {
@@ -7,3 +8,7 @@ export function checkAlgoRelay(relayInfo: TRelayInfo | undefined) {
export function checkSearchRelay(relayInfo: TRelayInfo | undefined) {
return relayInfo?.supported_nips?.includes(50)
}
export function filterOutBigRelays(relayUrls: string[]) {
return relayUrls.filter((url) => !BIG_RELAY_URLS.includes(url))
}

View File

@@ -1,4 +1,5 @@
import { createContext, useCallback, useContext, useMemo, useState } from 'react'
import client from '@/services/client.service'
import { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react'
type TCurrentRelaysContext = {
relayUrls: string[]
@@ -20,6 +21,10 @@ export function CurrentRelaysProvider({ children }: { children: React.ReactNode
const [relayRefCount, setRelayRefCount] = useState<Record<string, number>>({})
const relayUrls = useMemo(() => Object.keys(relayRefCount), [relayRefCount])
useEffect(() => {
client.currentRelays = relayUrls
}, [relayUrls])
const addRelayUrls = useCallback((urls: string[]) => {
setRelayRefCount((prev) => {
const newCounts = { ...prev }

View File

@@ -7,6 +7,7 @@ import {
} from '@/lib/event'
import { getProfileFromEvent, getRelayListFromEvent } from '@/lib/event-metadata'
import { formatPubkey, isValidPubkey, pubkeyToNpub, userIdToPubkey } from '@/lib/pubkey'
import { filterOutBigRelays } from '@/lib/relay'
import { getPubkeysFromPTags, getServersFromServerTags, tagNameEquals } from '@/lib/tag'
import { isLocalNetworkUrl, isWebsocketUrl, normalizeUrl } from '@/lib/url'
import { isSafari } from '@/lib/utils'
@@ -38,6 +39,7 @@ class ClientService extends EventTarget {
signer?: ISigner
pubkey?: string
currentRelays: string[] = []
private pool: SimplePool
private timelines: Record<
@@ -817,10 +819,7 @@ class ClientService extends EventTarget {
return event
}
return this.fetchEventFromRelays(
relayUrls.filter((url) => !BIG_RELAY_URLS.includes(url)),
{ ids: [id], limit: 1 }
)
return this.fetchEventFromRelays(filterOutBigRelays(relayUrls), { ids: [id], limit: 1 })
}
private async _fetchEvent(id: string): Promise<NEvent | undefined> {
@@ -1044,13 +1043,15 @@ class ClientService extends EventTarget {
return profileFromBigRelays
}
// If the user has a relay list, try those relays first
if (!relays.length) {
const relayList = await this.fetchRelayList(pubkey)
relays = relayList.write.filter((url) => !BIG_RELAY_URLS.includes(url)).slice(0, 5)
relays = filterOutBigRelays(relayList.write).slice(0, 5)
}
if (!relays.length) {
return
}
// If the user has no relay list, try current relays
if (!relays.length) {
relays = filterOutBigRelays(this.currentRelays)
}
const profileEvent = await this.fetchEventFromRelays(relays, {