feat: community mode (#738)

Co-authored-by: CXPLAY <62034099+cxplay@users.noreply.github.com>
This commit is contained in:
Cody Tseng 2026-01-24 00:09:10 +08:00 committed by GitHub
parent 686b1f9998
commit ed8a22d5bc
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
21 changed files with 303 additions and 101 deletions

View file

@ -1,8 +1,9 @@
import { IS_COMMUNITY_MODE, COMMUNITY_RELAY_SETS, COMMUNITY_RELAYS } from '@/constants'
import { getRelaySetFromEvent } from '@/lib/event-metadata'
import { isWebsocketUrl, normalizeUrl } from '@/lib/url'
import indexedDb from '@/services/indexed-db.service'
import storage from '@/services/local-storage.service'
import { TFeedInfo, TFeedType } from '@/types'
import { TFeedInfo, TFeedType, TRelaySet } from '@/types'
import { kinds } from 'nostr-tools'
import { createContext, useContext, useEffect, useRef, useState } from 'react'
import { useFavoriteRelays } from './FavoriteRelaysProvider'
@ -48,9 +49,21 @@ export function FeedProvider({ children }: { children: React.ReactNode }) {
if (storedFeedInfo) {
feedInfo = storedFeedInfo
} else {
feedInfo = { feedType: 'following' }
if (!IS_COMMUNITY_MODE) {
feedInfo = { feedType: 'following' }
}
}
}
if (!feedInfo && IS_COMMUNITY_MODE) {
feedInfo =
COMMUNITY_RELAY_SETS.length > 0
? {
feedType: 'relays',
id: COMMUNITY_RELAY_SETS[0].id,
name: COMMUNITY_RELAY_SETS[0].name
}
: { feedType: 'relay', id: COMMUNITY_RELAYS[0] }
}
if (feedInfo?.feedType === 'relays') {
return await switchFeed('relays', { activeRelaySetId: feedInfo.id })
@ -109,24 +122,33 @@ export function FeedProvider({ children }: { children: React.ReactNode }) {
}
if (feedType === 'relays') {
const relaySetId = options.activeRelaySetId ?? (relaySets.length > 0 ? relaySets[0].id : null)
if (!relaySetId || !pubkey) {
setIsReady(true)
return
}
let relaySet: TRelaySet | null = null
if (IS_COMMUNITY_MODE) {
relaySet =
COMMUNITY_RELAY_SETS.find((set) => set.id === relaySetId) ??
(COMMUNITY_RELAY_SETS.length > 0 ? COMMUNITY_RELAY_SETS[0] : null)
} else {
if (!relaySetId || !pubkey) {
setIsReady(true)
return
}
let relaySet =
relaySets.find((set) => set.id === relaySetId) ??
(relaySets.length > 0 ? relaySets[0] : null)
if (!relaySet) {
const storedRelaySetEvent = await indexedDb.getReplaceableEvent(
pubkey,
kinds.Relaysets,
relaySetId
)
if (storedRelaySetEvent) {
relaySet = getRelaySetFromEvent(storedRelaySetEvent)
relaySet =
relaySets.find((set) => set.id === relaySetId) ??
(relaySets.length > 0 ? relaySets[0] : null)
if (!relaySet) {
const storedRelaySetEvent = await indexedDb.getReplaceableEvent(
pubkey,
kinds.Relaysets,
relaySetId
)
if (storedRelaySetEvent) {
relaySet = getRelaySetFromEvent(storedRelaySetEvent)
}
}
}
if (relaySet) {
const newFeedInfo = { feedType, id: relaySet.id }
setFeedInfo(newFeedInfo)