fix: 🐛

This commit is contained in:
codytseng
2025-02-20 00:08:51 +08:00
parent fe7d3a8b32
commit 09f44fc1a0
5 changed files with 29 additions and 39 deletions

View File

@@ -1,5 +1,5 @@
import { Skeleton } from '@/components/ui/skeleton' import { Skeleton } from '@/components/ui/skeleton'
import { COMMENT_EVENT_KIND, PICTURE_EVENT_KIND } from '@/constants' import { BIG_RELAY_URLS, COMMENT_EVENT_KIND, PICTURE_EVENT_KIND } from '@/constants'
import { useFetchEvent } from '@/hooks' import { useFetchEvent } from '@/hooks'
import { extractEmbeddedNotesFromContent, extractImagesFromContent } from '@/lib/event' import { extractEmbeddedNotesFromContent, extractImagesFromContent } from '@/lib/event'
import { toNote } from '@/lib/link' import { toNote } from '@/lib/link'
@@ -63,7 +63,7 @@ const NotificationList = forwardRef((_, ref) => {
const { closer, timelineKey } = await client.subscribeTimeline( const { closer, timelineKey } = await client.subscribeTimeline(
relayList.read.length >= 4 relayList.read.length >= 4
? relayList.read ? relayList.read
: relayList.read.concat(client.getDefaultRelayUrls()).slice(0, 4), : relayList.read.concat(BIG_RELAY_URLS).slice(0, 4),
{ {
'#p': [pubkey], '#p': [pubkey],
kinds: [kinds.ShortTextNote, kinds.Repost, kinds.Reaction, COMMENT_EVENT_KIND], kinds: [kinds.ShortTextNote, kinds.Repost, kinds.Reaction, COMMENT_EVENT_KIND],

View File

@@ -1,10 +1,7 @@
import { getProfileFromProfileEvent } from '@/lib/event'
import { userIdToPubkey } from '@/lib/pubkey' import { userIdToPubkey } from '@/lib/pubkey'
import { useNostr } from '@/providers/NostrProvider' import { useNostr } from '@/providers/NostrProvider'
import client from '@/services/client.service' import client from '@/services/client.service'
import indexedDb from '@/services/indexed-db.service'
import { TProfile } from '@/types' import { TProfile } from '@/types'
import { kinds } from 'nostr-tools'
import { useEffect, useState } from 'react' import { useEffect, useState } from 'react'
export function useFetchProfile(id?: string) { export function useFetchProfile(id?: string) {
@@ -28,14 +25,6 @@ export function useFetchProfile(id?: string) {
const pubkey = userIdToPubkey(id) const pubkey = userIdToPubkey(id)
setPubkey(pubkey) setPubkey(pubkey)
const storedProfileEvent = await indexedDb.getReplaceableEvent(pubkey, kinds.Metadata)
if (storedProfileEvent) {
const profile = getProfileFromProfileEvent(storedProfileEvent)
setProfile(profile)
setIsFetching(false)
return
}
const profile = await client.fetchProfile(id) const profile = await client.fetchProfile(id)
if (profile) { if (profile) {
setProfile(profile) setProfile(profile)
@@ -54,7 +43,7 @@ export function useFetchProfile(id?: string) {
if (currentAccountProfile && pubkey === currentAccountProfile.pubkey) { if (currentAccountProfile && pubkey === currentAccountProfile.pubkey) {
setProfile(currentAccountProfile) setProfile(currentAccountProfile)
} }
}, [currentAccountProfile]) }, [currentAccountProfile, pubkey])
return { isFetching, error, profile } return { isFetching, error, profile }
} }

View File

@@ -1,3 +1,4 @@
import { BIG_RELAY_URLS } from '@/constants'
import { createMuteListDraftEvent } from '@/lib/draft-event' import { createMuteListDraftEvent } from '@/lib/draft-event'
import { getLatestEvent } from '@/lib/event' import { getLatestEvent } from '@/lib/event'
import { extractPubkeysFromEventTags, isSameTag } from '@/lib/tag' import { extractPubkeysFromEventTags, isSameTag } from '@/lib/tag'
@@ -41,7 +42,7 @@ export function MuteListProvider({ children }: { children: React.ReactNode }) {
const tags = await extractMuteTags(storedMuteListEvent) const tags = await extractMuteTags(storedMuteListEvent)
setTags(tags) setTags(tags)
} }
const events = await client.fetchEvents(relayList?.write ?? client.getDefaultRelayUrls(), { const events = await client.fetchEvents(relayList?.write ?? BIG_RELAY_URLS, {
kinds: [kinds.Mutelist], kinds: [kinds.Mutelist],
authors: [accountPubkey] authors: [accountPubkey]
}) })

View File

@@ -360,7 +360,8 @@ export function NostrProvider({ children }: { children: React.ReactNode }) {
? specifiedRelayUrls ? specifiedRelayUrls
: (relayList?.write ?? []) : (relayList?.write ?? [])
.concat(additionalRelayUrls ?? []) .concat(additionalRelayUrls ?? [])
.concat(client.getDefaultRelayUrls()), .concat(client.getCurrentRelayUrls())
.concat(BIG_RELAY_URLS),
event event
) )
return event return event

View File

@@ -26,7 +26,7 @@ class ClientService extends EventTarget {
static instance: ClientService static instance: ClientService
signer?: (evt: TDraftEvent) => Promise<VerifiedEvent> signer?: (evt: TDraftEvent) => Promise<VerifiedEvent>
private defaultRelayUrls: string[] = BIG_RELAY_URLS private currentRelayUrls: string[] = []
private pool: SimplePool private pool: SimplePool
private timelines: Record< private timelines: Record<
@@ -43,7 +43,7 @@ class ClientService extends EventTarget {
(ids) => Promise.all(ids.map((id) => this._fetchEvent(id))), (ids) => Promise.all(ids.map((id) => this._fetchEvent(id))),
{ cacheMap: this.eventCache } { cacheMap: this.eventCache }
) )
private fetchEventFromDefaultRelaysDataloader = new DataLoader<string, NEvent | undefined>( private fetchEventFromBigRelaysDataloader = new DataLoader<string, NEvent | undefined>(
this.eventBatchLoadFn.bind(this), this.eventBatchLoadFn.bind(this),
{ cache: false } { cache: false }
) )
@@ -54,7 +54,7 @@ class ClientService extends EventTarget {
maxBatchSize: 50 maxBatchSize: 50
} }
) )
private fetchProfileEventFromDefaultRelaysDataloader = new DataLoader<string, NEvent | undefined>( private fetchProfileEventFromBigRelaysDataloader = new DataLoader<string, NEvent | undefined>(
this.profileEventBatchLoadFn.bind(this), this.profileEventBatchLoadFn.bind(this),
{ {
cacheMap: new LRUCache<string, Promise<NEvent | undefined>>({ max: 1000 }), cacheMap: new LRUCache<string, Promise<NEvent | undefined>>({ max: 1000 }),
@@ -100,11 +100,11 @@ class ClientService extends EventTarget {
} }
setCurrentRelayUrls(urls: string[]) { setCurrentRelayUrls(urls: string[]) {
this.defaultRelayUrls = Array.from(new Set(urls.concat(BIG_RELAY_URLS))) this.currentRelayUrls = urls
} }
getDefaultRelayUrls() { getCurrentRelayUrls() {
return this.defaultRelayUrls return this.currentRelayUrls
} }
async publishEvent(relayUrls: string[], event: NEvent) { async publishEvent(relayUrls: string[], event: NEvent) {
@@ -422,7 +422,7 @@ class ClientService extends EventTarget {
async fetchEvents(relayUrls: string[], filter: Filter, cache = false) { async fetchEvents(relayUrls: string[], filter: Filter, cache = false) {
const events = await this.query( const events = await this.query(
relayUrls.length > 0 ? relayUrls : this.defaultRelayUrls, relayUrls.length > 0 ? relayUrls : this.currentRelayUrls.concat(BIG_RELAY_URLS),
filter filter
) )
if (cache) { if (cache) {
@@ -622,7 +622,7 @@ class ClientService extends EventTarget {
} }
private async fetchEventById(relayUrls: string[], id: string): Promise<NEvent | undefined> { private async fetchEventById(relayUrls: string[], id: string): Promise<NEvent | undefined> {
const event = await this.fetchEventFromDefaultRelaysDataloader.load(id) const event = await this.fetchEventFromBigRelaysDataloader.load(id)
if (event) { if (event) {
return event return event
} }
@@ -703,12 +703,11 @@ class ClientService extends EventTarget {
this.addUsernameToIndex(localProfile) this.addUsernameToIndex(localProfile)
return localProfile return localProfile
} }
const profileFromDefaultRelays = const profileFromBigRelays = await this.fetchProfileEventFromBigRelaysDataloader.load(pubkey)
await this.fetchProfileEventFromDefaultRelaysDataloader.load(pubkey) if (profileFromBigRelays) {
if (profileFromDefaultRelays) { this.addUsernameToIndex(profileFromBigRelays)
this.addUsernameToIndex(profileFromDefaultRelays) await indexedDb.putReplaceableEvent(profileFromBigRelays)
await indexedDb.putReplaceableEvent(profileFromDefaultRelays) return profileFromBigRelays
return profileFromDefaultRelays
} }
const profileEvent = await this.tryHarderToFetchEvent( const profileEvent = await this.tryHarderToFetchEvent(
@@ -756,15 +755,15 @@ class ClientService extends EventTarget {
private async tryHarderToFetchEvent( private async tryHarderToFetchEvent(
relayUrls: string[], relayUrls: string[],
filter: Filter, filter: Filter,
alreadyFetchedFromDefaultRelays = false alreadyFetchedFromBigRelays = false
) { ) {
if (!relayUrls.length && filter.authors?.length) { if (!relayUrls.length && filter.authors?.length) {
const relayList = await this.fetchRelayList(filter.authors[0]) const relayList = await this.fetchRelayList(filter.authors[0])
relayUrls = alreadyFetchedFromDefaultRelays relayUrls = alreadyFetchedFromBigRelays
? relayList.write.filter((url) => !this.defaultRelayUrls.includes(url)).slice(0, 4) ? relayList.write.filter((url) => !BIG_RELAY_URLS.includes(url)).slice(0, 4)
: relayList.write.slice(0, 4) : relayList.write.slice(0, 4)
} else if (!relayUrls.length && !alreadyFetchedFromDefaultRelays) { } else if (!relayUrls.length && !alreadyFetchedFromBigRelays) {
relayUrls = this.defaultRelayUrls relayUrls = BIG_RELAY_URLS
} }
if (!relayUrls.length) return if (!relayUrls.length) return
@@ -773,7 +772,7 @@ class ClientService extends EventTarget {
} }
private async eventBatchLoadFn(ids: readonly string[]) { private async eventBatchLoadFn(ids: readonly string[]) {
const events = await this.query(this.defaultRelayUrls, { const events = await this.query(BIG_RELAY_URLS, {
ids: Array.from(new Set(ids)), ids: Array.from(new Set(ids)),
limit: ids.length limit: ids.length
}) })
@@ -786,7 +785,7 @@ class ClientService extends EventTarget {
} }
private async profileEventBatchLoadFn(pubkeys: readonly string[]) { private async profileEventBatchLoadFn(pubkeys: readonly string[]) {
const events = await this.query(this.defaultRelayUrls, { const events = await this.query(BIG_RELAY_URLS, {
authors: Array.from(new Set(pubkeys)), authors: Array.from(new Set(pubkeys)),
kinds: [kinds.Metadata], kinds: [kinds.Metadata],
limit: pubkeys.length limit: pubkeys.length
@@ -817,7 +816,7 @@ class ClientService extends EventTarget {
) )
const nonExistingPubkeys = pubkeys.filter((_, i) => !relayEvents[i]) const nonExistingPubkeys = pubkeys.filter((_, i) => !relayEvents[i])
if (nonExistingPubkeys.length) { if (nonExistingPubkeys.length) {
const events = await this.query(this.defaultRelayUrls, { const events = await this.query(BIG_RELAY_URLS, {
authors: pubkeys as string[], authors: pubkeys as string[],
kinds: [kinds.RelayList], kinds: [kinds.RelayList],
limit: pubkeys.length limit: pubkeys.length
@@ -847,7 +846,7 @@ class ClientService extends EventTarget {
private async _fetchFollowListEvent(pubkey: string) { private async _fetchFollowListEvent(pubkey: string) {
const relayList = await this.fetchRelayList(pubkey) const relayList = await this.fetchRelayList(pubkey)
const followListEvents = await this.query(relayList.write.concat(this.defaultRelayUrls), { const followListEvents = await this.query(relayList.write.concat(BIG_RELAY_URLS), {
authors: [pubkey], authors: [pubkey],
kinds: [kinds.Contacts] kinds: [kinds.Contacts]
}) })