From 1b7ec56c89ec2615d8e4034b2a0f97db7ea455be Mon Sep 17 00:00:00 2001 From: codytseng Date: Mon, 3 Nov 2025 09:52:11 +0800 Subject: [PATCH] fix: fetch profile from current relays if user has no relay list --- src/lib/relay.ts | 5 +++++ src/providers/CurrentRelaysProvider.tsx | 7 ++++++- src/services/client.service.ts | 17 +++++++++-------- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/lib/relay.ts b/src/lib/relay.ts index 738f124..4211bfc 100644 --- a/src/lib/relay.ts +++ b/src/lib/relay.ts @@ -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)) +} diff --git a/src/providers/CurrentRelaysProvider.tsx b/src/providers/CurrentRelaysProvider.tsx index f42dddc..7cddae0 100644 --- a/src/providers/CurrentRelaysProvider.tsx +++ b/src/providers/CurrentRelaysProvider.tsx @@ -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>({}) const relayUrls = useMemo(() => Object.keys(relayRefCount), [relayRefCount]) + useEffect(() => { + client.currentRelays = relayUrls + }, [relayUrls]) + const addRelayUrls = useCallback((urls: string[]) => { setRelayRefCount((prev) => { const newCounts = { ...prev } diff --git a/src/services/client.service.ts b/src/services/client.service.ts index 480ef06..549dee4 100644 --- a/src/services/client.service.ts +++ b/src/services/client.service.ts @@ -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 { @@ -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, {