threshold ? '-translate-y-[calc(100%+12rem)]' : ''
+ 'flex w-full min-w-0 items-end justify-between border-b bg-background px-1',
+ pinnedToLayout
+ ? 'z-10'
+ : 'sticky top-12 z-30 transition-transform',
+ collapseOnDeepBrowse ? '-translate-y-[calc(100%+12rem)]' : ''
)}
>
diff --git a/src/lib/favorites-feed-relays.ts b/src/lib/favorites-feed-relays.ts
index 3ab5e90d..fa2c301c 100644
--- a/src/lib/favorites-feed-relays.ts
+++ b/src/lib/favorites-feed-relays.ts
@@ -16,6 +16,7 @@ import {
MAX_REQ_RELAY_URLS,
relayUrlsLocalsFirst
} from '@/lib/relay-url-priority'
+import { ensureTrendingInFavoriteRelayList } from '@/lib/wisp-trending-relay'
import { feedRelayPolicyUrls, type FeedRelayLayer } from '@/features/feed/relay-policy'
import { stripMailboxLocalUrlsForRemoteViewers } from '@/lib/relay-list-sanitize'
import { relaySessionStrikes } from '@/lib/relay-strikes'
@@ -78,9 +79,11 @@ export function getFavoritesFeedRelayUrls(
const k = normalizeAnyRelayUrl(r) || r
return k && !isBlockedRelay(r, blockedRelays)
})
- const base = visible.length > 0 ? visible : useGlobalFavoriteDefaults ? DEFAULT_FAVORITE_RELAYS : []
+ const base =
+ visible.length > 0 ? visible : useGlobalFavoriteDefaults ? [...DEFAULT_FAVORITE_RELAYS] : []
+ const withTrending = ensureTrendingInFavoriteRelayList(base, { forFeed: true })
return feedRelayPolicyUrls(
- [{ source: 'favorites', urls: base }],
+ [{ source: 'favorites', urls: withTrending }],
{
operation: 'favorites-feed',
blockedRelays,
diff --git a/src/lib/home-feed-relays.ts b/src/lib/home-feed-relays.ts
index 8ccad0cc..a46df1b7 100644
--- a/src/lib/home-feed-relays.ts
+++ b/src/lib/home-feed-relays.ts
@@ -2,7 +2,10 @@ import { feedRelayPolicyUrls } from '@/features/feed/relay-policy'
import { getFavoritesFeedRelayUrls } from '@/lib/favorites-feed-relays'
import { stripNostrLandAggrFromRelayUrls } from '@/lib/nostr-land-relay-eligibility'
import { isMetadataRelaysOnlyPolicyActive } from '@/lib/read-only-relay-personal'
-import { isWispTrendingNotesRelayUrl } from '@/lib/wisp-trending-relay'
+import {
+ ensureTrendingInFavoriteRelayList,
+ isWispTrendingNotesRelayUrl
+} from '@/lib/wisp-trending-relay'
export { stripNostrLandAggrFromRelayUrls }
@@ -24,6 +27,11 @@ export function stripNostrLandAggrFromTimelineSubRequests !isWispTrendingNotesRelayUrl(u))
: extraFeedRelayUrls
- return stripNostrLandAggrFromRelayUrls(
- feedRelayPolicyUrls(
- [
+ return ensureHomeFeedTrendingRelay(
+ stripNostrLandAggrFromRelayUrls(
+ feedRelayPolicyUrls(
+ [
+ {
+ source: 'favorites',
+ urls: getFavoritesFeedRelayUrls(favoriteRelays, blockedRelays, useGlobalFavoriteDefaults)
+ },
+ { source: 'fallback', urls: extras }
+ ],
{
- source: 'favorites',
- urls: getFavoritesFeedRelayUrls(favoriteRelays, blockedRelays, useGlobalFavoriteDefaults)
- },
- { source: 'fallback', urls: extras }
- ],
- {
- operation: 'favorites-feed',
- blockedRelays,
- nostrLandAggr: 'never',
- applySocialKindBlockedFilter: false,
- allowThirdPartyLocalRelays: true
- }
+ operation: 'favorites-feed',
+ blockedRelays,
+ nostrLandAggr: 'never',
+ applySocialKindBlockedFilter: false,
+ allowThirdPartyLocalRelays: true
+ }
+ )
)
)
}
diff --git a/src/lib/relay-url-priority.test.ts b/src/lib/relay-url-priority.test.ts
index 4aaa56af..f1ee996d 100644
--- a/src/lib/relay-url-priority.test.ts
+++ b/src/lib/relay-url-priority.test.ts
@@ -88,7 +88,19 @@ describe('nostr.land aggregator feed relay policy', () => {
[]
)
- expect(out).toEqual(['wss://relay.example.com/'])
+ expect(out).toEqual([
+ 'wss://relay.example.com/',
+ 'wss://feeds.nostrarchives.com/notes/trending/reactions/today'
+ ])
+ })
+
+ it('uses DEFAULT_FAVORITE_RELAYS when favorites are empty and global defaults apply', () => {
+ const out = getFavoritesFeedRelayUrls([], [], true)
+ expect(out).toEqual([
+ 'wss://theforest.nostr1.com/',
+ 'wss://nostr.land/',
+ 'wss://feeds.nostrarchives.com/notes/trending/reactions/today'
+ ])
})
})
diff --git a/src/lib/wisp-trending-relay.test.ts b/src/lib/wisp-trending-relay.test.ts
new file mode 100644
index 00000000..ec577141
--- /dev/null
+++ b/src/lib/wisp-trending-relay.test.ts
@@ -0,0 +1,42 @@
+import { describe, expect, it } from 'vitest'
+import {
+ buildWispTrendingNotesRelayUrl,
+ ensureTrendingInFavoriteRelayList,
+ isWispTrendingNotesRelayUrl
+} from '@/lib/wisp-trending-relay'
+import { setViewerPersonalRelayKeys } from '@/lib/read-only-relay-personal'
+
+describe('ensureTrendingInFavoriteRelayList', () => {
+ const defaultTrending = buildWispTrendingNotesRelayUrl()
+
+ it('appends default trending when missing', () => {
+ const out = ensureTrendingInFavoriteRelayList(['wss://relay.example.com/'])
+ expect(out).toEqual(['wss://relay.example.com/', defaultTrending])
+ })
+
+ it('does not duplicate when default trending is already listed', () => {
+ const out = ensureTrendingInFavoriteRelayList([
+ 'wss://relay.example.com/',
+ defaultTrending
+ ])
+ expect(out).toHaveLength(2)
+ expect(out.some(isWispTrendingNotesRelayUrl)).toBe(true)
+ })
+
+ it('keeps a single trending entry when another Wisp path is already present', () => {
+ const customTrending = buildWispTrendingNotesRelayUrl('replies', '7d')
+ const out = ensureTrendingInFavoriteRelayList([
+ 'wss://relay.example.com/',
+ customTrending,
+ defaultTrending
+ ])
+ expect(out.filter(isWispTrendingNotesRelayUrl)).toEqual([customTrending])
+ })
+
+ it('forFeed skips injection under metadata-relays-only policy', () => {
+ setViewerPersonalRelayKeys(new Set(['wss://relay.example.com/']), { viewerActive: true })
+ const out = ensureTrendingInFavoriteRelayList(['wss://relay.example.com/'], { forFeed: true })
+ expect(out).toEqual(['wss://relay.example.com/'])
+ setViewerPersonalRelayKeys(new Set(), { viewerActive: false })
+ })
+})
diff --git a/src/lib/wisp-trending-relay.ts b/src/lib/wisp-trending-relay.ts
index 22a9e5d2..9eb0f0ee 100644
--- a/src/lib/wisp-trending-relay.ts
+++ b/src/lib/wisp-trending-relay.ts
@@ -1,5 +1,6 @@
import { ExtendedKind } from '@/constants'
-import { normalizeUrl } from '@/lib/url'
+import { isMetadataRelaysOnlyPolicyActive } from '@/lib/read-only-relay-personal'
+import { normalizeAnyRelayUrl, normalizeUrl } from '@/lib/url'
/**
* Trending notes stream from nostrarchives (path-based relay URL). The WebSocket speaks **standard NIP-01**
@@ -29,6 +30,47 @@ export const WISP_TRENDING_FEED_KINDS: readonly number[] = [
ExtendedKind.VIDEO_ADDRESSABLE
]
+/**
+ * Ensure the default nostrarchives trending notes relay is present in a favorite-relay list.
+ * Skips when any Wisp trending URL is already listed (dedupes duplicate trending paths).
+ * When `forFeed` is true, omits injection under the metadata-relays-only read policy.
+ */
+export function ensureTrendingInFavoriteRelayList(
+ relayUrls: readonly string[],
+ options?: { forFeed?: boolean }
+): string[] {
+ if (options?.forFeed && isMetadataRelaysOnlyPolicyActive()) {
+ return [...relayUrls]
+ }
+
+ const out: string[] = []
+ const seen = new Set()
+ let hasTrending = false
+
+ for (const raw of relayUrls) {
+ const normalized = normalizeAnyRelayUrl(raw) || raw.trim()
+ if (!normalized) continue
+ const key = normalized.toLowerCase()
+ if (seen.has(key)) continue
+ if (isWispTrendingNotesRelayUrl(normalized)) {
+ if (hasTrending) continue
+ hasTrending = true
+ }
+ seen.add(key)
+ out.push(normalized)
+ }
+
+ if (!hasTrending) {
+ const trending = normalizeUrl(buildWispTrendingNotesRelayUrl()) || buildWispTrendingNotesRelayUrl()
+ const key = trending.toLowerCase()
+ if (!seen.has(key)) {
+ out.push(trending)
+ }
+ }
+
+ return out
+}
+
/** True when `url` is any nostrarchives notes trending WebSocket feed (path `/notes/trending/...`). */
export function isWispTrendingNotesRelayUrl(url: string): boolean {
const raw = (normalizeUrl(url) || url).trim()
diff --git a/src/pages/primary/NoteListPage/RelaysFeed.tsx b/src/pages/primary/NoteListPage/RelaysFeed.tsx
index 058d3aea..0c49c804 100644
--- a/src/pages/primary/NoteListPage/RelaysFeed.tsx
+++ b/src/pages/primary/NoteListPage/RelaysFeed.tsx
@@ -1,5 +1,6 @@
import NormalFeed from '@/components/NormalFeed'
import type { TNoteListRef } from '@/components/NoteList'
+import { ensureHomeFeedTrendingRelay } from '@/lib/home-feed-relays'
import { checkAlgoRelay } from '@/lib/relay'
import { normalizeUrl } from '@/lib/url'
import { useFeed } from '@/providers/feed-context'
@@ -98,7 +99,7 @@ const RelaysFeed = forwardRef<
if (!canRenderFeed) return []
return [
{
- urls: stableRelayUrls,
+ urls: ensureHomeFeedTrendingRelay(stableRelayUrls),
filter: {
kinds: defaultKinds
}
@@ -107,9 +108,11 @@ const RelaysFeed = forwardRef<
}, [canRenderFeed, relayUrlsKey, stableRelayUrls, defaultKindsKey, defaultKinds])
const repliesSubRequests = useMemo(() => {
if (!canRenderFeed) return []
+ const replyUrls =
+ stableReplyRelayUrls.length > 0 ? stableReplyRelayUrls : stableRelayUrls
return [
{
- urls: stableReplyRelayUrls.length > 0 ? stableReplyRelayUrls : stableRelayUrls,
+ urls: ensureHomeFeedTrendingRelay(replyUrls),
filter: {
kinds: defaultKinds
}
diff --git a/src/pages/secondary/RelaySettingsPage/index.tsx b/src/pages/secondary/RelaySettingsPage/index.tsx
index 659af25e..985dc61c 100644
--- a/src/pages/secondary/RelaySettingsPage/index.tsx
+++ b/src/pages/secondary/RelaySettingsPage/index.tsx
@@ -134,7 +134,12 @@ const RelaySettingsPage = forwardRef(({ index, hideTitlebar = false }: { index?:
}
>
setJsonOpen(false)} />
-
+
{t('Favorite Relays')}
{t('Read & Write Relays')}
diff --git a/src/providers/FavoriteRelaysProvider.tsx b/src/providers/FavoriteRelaysProvider.tsx
index 2260541f..6e4e72d8 100644
--- a/src/providers/FavoriteRelaysProvider.tsx
+++ b/src/providers/FavoriteRelaysProvider.tsx
@@ -1,4 +1,4 @@
-import { FAST_READ_RELAY_URLS, DEFAULT_FAVORITE_RELAYS } from '@/constants'
+import { FAST_READ_RELAY_URLS, DEFAULT_FAVORITE_RELAYS, ExtendedKind } from '@/constants'
import { viewerUsesGlobalRelayDefaults } from '@/lib/viewer-relay-defaults'
import storage from '@/services/local-storage.service'
import { createFavoriteRelaysDraftEvent, createBlockedRelaysDraftEvent, createRelaySetDraftEvent } from '@/lib/draft-event'
@@ -26,15 +26,17 @@ export function FavoriteRelaysProvider({ children }: { children: React.ReactNode
const [relaySets, setRelaySets] = useState([])
useEffect(() => {
- if (!favoriteRelaysEvent) {
- let favoriteRelays: string[] = []
+ let cancelled = false
+
+ const applyNoFavoriteRelaysEvent = () => {
+ let next: string[] = []
if (pubkey) {
const storedRelaySets = storage.getRelaySets()
storedRelaySets.forEach(({ relayUrls }) => {
relayUrls.forEach((url) => {
- if (!favoriteRelays.includes(url)) {
- favoriteRelays.push(url)
+ if (!next.includes(url)) {
+ next.push(url)
}
})
})
@@ -42,23 +44,23 @@ export function FavoriteRelaysProvider({ children }: { children: React.ReactNode
const useGlobal = viewerUsesGlobalRelayDefaults({
viewerPubkey: pubkey,
- favoriteRelayUrls: favoriteRelays,
+ favoriteRelayUrls: next,
relayList
})
- if (favoriteRelays.length === 0 && useGlobal) {
- favoriteRelays = [...DEFAULT_FAVORITE_RELAYS]
+ if (next.length === 0 && useGlobal) {
+ next = [...DEFAULT_FAVORITE_RELAYS]
}
- setFavoriteRelays(favoriteRelays)
+ if (cancelled) return
+ setFavoriteRelays(next)
setRelaySetEvents([])
- return
}
- const init = async () => {
+ const applyFavoriteRelaysEvent = async (event: Event) => {
const relays: string[] = []
const relaySetIds: string[] = []
- favoriteRelaysEvent.tags.forEach(([tagName, tagValue]) => {
+ event.tags.forEach(([tagName, tagValue]) => {
if (!tagValue) return
if (tagName === 'relay') {
@@ -69,7 +71,7 @@ export function FavoriteRelaysProvider({ children }: { children: React.ReactNode
} else if (tagName === 'a') {
const [kind, author, relaySetId] = tagValue.split(':')
if (kind !== kinds.Relaysets.toString()) return
- if (!pubkey || author !== pubkey) return // TODO: support others relay sets
+ if (!pubkey || author !== pubkey) return
if (!relaySetId) return
if (!relaySetIds.includes(relaySetId)) {
@@ -78,18 +80,22 @@ export function FavoriteRelaysProvider({ children }: { children: React.ReactNode
}
})
- // Keep all favorites in state - don't filter blocked relays here
- // Blocked relays are filtered at the relay selection service level
+ if (cancelled) return
setFavoriteRelays(relays)
if (!pubkey || !relaySetIds.length) {
- setRelaySets([])
+ setRelaySetEvents([])
return
}
- const storedRelaySetEvents = await Promise.all(
- relaySetIds.map((id) => indexedDb.getReplaceableEvent(pubkey, kinds.Relaysets, id))
- )
- setRelaySetEvents(storedRelaySetEvents.filter(Boolean) as Event[])
+
+ const storedRelaySetEvents = (
+ await Promise.all(
+ relaySetIds.map((id) => indexedDb.getReplaceableEvent(pubkey, kinds.Relaysets, id))
+ )
+ ).filter(Boolean) as Event[]
+
+ if (cancelled) return
+ setRelaySetEvents(storedRelaySetEvents)
const relaySetDiscoverGlobal = viewerUsesGlobalRelayDefaults({
viewerPubkey: pubkey,
@@ -110,33 +116,60 @@ export function FavoriteRelaysProvider({ children }: { children: React.ReactNode
'#d': relaySetIds
}
)
+ if (cancelled) return
+
const relaySetEventMap = new Map()
- newRelaySetEvents.forEach((event) => {
- const d = getReplaceableEventIdentifier(event)
+ newRelaySetEvents.forEach((fetched) => {
+ const d = getReplaceableEventIdentifier(fetched)
if (!d) return
const old = relaySetEventMap.get(d)
- if (!old || old.created_at < event.created_at) {
- relaySetEventMap.set(d, event)
+ if (!old || old.created_at < fetched.created_at) {
+ relaySetEventMap.set(d, fetched)
}
})
const uniqueNewRelaySetEvents = relaySetIds
.map((id, index) => {
- const event = relaySetEventMap.get(id)
- if (event) {
- return event
+ const fetched = relaySetEventMap.get(id)
+ if (fetched) {
+ return fetched
}
return storedRelaySetEvents[index] || null
})
.filter(Boolean) as Event[]
setRelaySetEvents(uniqueNewRelaySetEvents)
await Promise.all(
- uniqueNewRelaySetEvents.map((event) => {
- return indexedDb.putReplaceableEvent(event)
- })
+ uniqueNewRelaySetEvents.map((evt) => indexedDb.putReplaceableEvent(evt))
)
}
- init()
+
+ if (favoriteRelaysEvent) {
+ void applyFavoriteRelaysEvent(favoriteRelaysEvent)
+ return () => {
+ cancelled = true
+ }
+ }
+
+ if (!pubkey) {
+ applyNoFavoriteRelaysEvent()
+ return () => {
+ cancelled = true
+ }
+ }
+
+ /** PWA / cold start: read kind 10012 from IndexedDB before NostrProvider finishes hydrating. */
+ void indexedDb.getReplaceableEvent(pubkey, ExtendedKind.FAVORITE_RELAYS).then((stored) => {
+ if (cancelled) return
+ if (stored) {
+ void applyFavoriteRelaysEvent(stored)
+ } else {
+ applyNoFavoriteRelaysEvent()
+ }
+ })
+
+ return () => {
+ cancelled = true
+ }
}, [favoriteRelaysEvent, pubkey, relayList])
useEffect(() => {
@@ -328,6 +361,7 @@ export function FavoriteRelaysProvider({ children }: { children: React.ReactNode
[favoriteRelays, publish, updateFavoriteRelaysEvent]
)
+ /** Published kind 10012 `relay` tags (and relay sets via {@link relaySets}); trending is added in feed/UI layers. */
const contextValue = useMemo(
() => ({
favoriteRelaysFromPublishedList: !!favoriteRelaysEvent,
diff --git a/src/providers/FeedProvider.test.ts b/src/providers/FeedProvider.test.ts
index d22d6b47..164765dd 100644
--- a/src/providers/FeedProvider.test.ts
+++ b/src/providers/FeedProvider.test.ts
@@ -44,13 +44,18 @@ describe('home feed relay policy', () => {
it('personal-relay policy omits wisp trending from home feed relay list', () => {
setViewerPersonalRelayKeys(new Set(['wss://relay.example.com/']), { viewerActive: true })
- const wisp = buildWispTrendingNotesRelayUrl()
- const urls = buildAllFavoritesFeedRelayUrls(['wss://relay.example.com/'], [], [wisp])
+ const urls = buildAllFavoritesFeedRelayUrls(['wss://relay.example.com/'], [], [])
expect(urls).toContain('wss://relay.example.com/')
expect(urls.some((u) => isWispTrendingNotesRelayUrl(u))).toBe(false)
setViewerPersonalRelayKeys(new Set(), { viewerActive: false })
})
+ it('includes trending from favorites tier without extra feed relays', () => {
+ const urls = buildAllFavoritesFeedRelayUrls(['wss://relay.example.com/'], [], [])
+ expect(urls).toContain('wss://relay.example.com/')
+ expect(urls).toContain(buildWispTrendingNotesRelayUrl())
+ })
+
it('stripNostrLandAggrFromRelayUrls removes aggr with trailing slash and hostname variants', () => {
const stripped = stripNostrLandAggrFromRelayUrls([
'wss://relay.example/',
diff --git a/src/providers/FeedProvider.tsx b/src/providers/FeedProvider.tsx
index 26dc41f2..70aef4c6 100644
--- a/src/providers/FeedProvider.tsx
+++ b/src/providers/FeedProvider.tsx
@@ -1,6 +1,10 @@
import { DEFAULT_FAVORITE_RELAYS } from '@/constants'
import { feedRelayPolicyUrls } from '@/features/feed/relay-policy'
-import { buildAllFavoritesFeedRelayUrls, stripNostrLandAggrFromRelayUrls } from '@/lib/home-feed-relays'
+import {
+ buildAllFavoritesFeedRelayUrls,
+ ensureHomeFeedTrendingRelay,
+ stripNostrLandAggrFromRelayUrls
+} from '@/lib/home-feed-relays'
import logger from '@/lib/logger'
import {
syncViewerRelayStackNostrLandAggrEligible,
@@ -11,7 +15,6 @@ import { normalizeAnyRelayUrl } from '@/lib/url'
import { viewerUsesGlobalRelayDefaults } from '@/lib/viewer-relay-defaults'
import { collectUserReadInboxUrls } from '@/lib/viewer-read-inboxes'
import { collectUserWriteOutboxUrls } from '@/lib/viewer-write-outboxes'
-import { buildWispTrendingNotesRelayUrl } from '@/lib/wisp-trending-relay'
import { useEffect, useMemo, useState, useCallback, useRef } from 'react'
import type { Dispatch, ReactNode, SetStateAction } from 'react'
import { FeedContext } from './feed-context'
@@ -36,21 +39,23 @@ function buildHomeReplyFeedRelayUrls(
blockedRelays: string[]
): string[] {
/** Home Replies/Gallery: never prepend aggr (reserved for side-panel threads, profiles, spells). */
- return stripNostrLandAggrFromRelayUrls(
- feedRelayPolicyUrls(
- [
- { source: 'favorites', urls: primaryRelayUrls },
- { source: 'viewer-read', urls: inboxRelayUrls },
- { source: 'cache', urls: cacheRelayUrls },
- { source: 'http-index', urls: httpRelayUrls }
- ],
- {
- operation: 'read',
- blockedRelays,
- nostrLandAggr: 'never',
- applySocialKindBlockedFilter: false,
- allowThirdPartyLocalRelays: true
- }
+ return ensureHomeFeedTrendingRelay(
+ stripNostrLandAggrFromRelayUrls(
+ feedRelayPolicyUrls(
+ [
+ { source: 'favorites', urls: primaryRelayUrls },
+ { source: 'viewer-read', urls: inboxRelayUrls },
+ { source: 'cache', urls: cacheRelayUrls },
+ { source: 'http-index', urls: httpRelayUrls }
+ ],
+ {
+ operation: 'read',
+ blockedRelays,
+ nostrLandAggr: 'never',
+ applySocialKindBlockedFilter: false,
+ allowThirdPartyLocalRelays: true
+ }
+ )
)
)
}
@@ -74,12 +79,6 @@ export function FeedProvider({ children }: { children: ReactNode }) {
[favoriteRelays, relaySets]
)
- /**
- * Mixed trending slice (nostrarchives / Wisp-style feed) so the home timeline isn’t only the user’s
- * graph — keeps a finger on what the wider network is surfacing, alongside favorites / NIP-65.
- */
- const primaryExtraRelayUrls = useMemo(() => [buildWispTrendingNotesRelayUrl()], [])
-
/** Read-side layers merged into {@link replyRelayUrls}; {@link outboxRelayUrls} is only for aggr eligibility sync. */
const replyExtraRelayLayers = useMemo(() => {
const cacheRelayUrls = getCacheRelayUrlsFromEvent(cacheRelayListEvent)
@@ -111,12 +110,10 @@ export function FeedProvider({ children }: { children: ReactNode }) {
}, [relayList, cacheRelayListEvent, useGlobalRelayDefaults])
/** Default relays immediately so feeds / sidebar REQ never wait on Nostr session restore. */
- const [relayUrls, setRelayUrls] = useState(() =>
- buildAllFavoritesFeedRelayUrls([], [], [buildWispTrendingNotesRelayUrl()])
- )
+ const [relayUrls, setRelayUrls] = useState(() => buildAllFavoritesFeedRelayUrls([], [], []))
const [replyRelayUrls, setReplyRelayUrls] = useState(() =>
buildHomeReplyFeedRelayUrls(
- buildAllFavoritesFeedRelayUrls([], [], [buildWispTrendingNotesRelayUrl()]),
+ buildAllFavoritesFeedRelayUrls([], [], []),
[],
[],
[],
@@ -152,7 +149,7 @@ export function FeedProvider({ children }: { children: ReactNode }) {
const primaryRelays = buildAllFavoritesFeedRelayUrls(
favoriteFeedRelayUrls,
blockedRelays,
- primaryExtraRelayUrls,
+ [],
useGlobalRelayDefaults
)
const replyRelays = buildHomeReplyFeedRelayUrls(
@@ -174,7 +171,7 @@ export function FeedProvider({ children }: { children: ReactNode }) {
}
setUrlStateIfChanged(setRelayUrls, primaryRelays)
setUrlStateIfChanged(setReplyRelayUrls, replyRelays)
- }, [favoriteFeedRelayUrls, blockedRelays, primaryExtraRelayUrls, replyExtraRelayLayers, setUrlStateIfChanged, useGlobalRelayDefaults])
+ }, [favoriteFeedRelayUrls, blockedRelays, replyExtraRelayLayers, setUrlStateIfChanged, useGlobalRelayDefaults])
const favoriteRelaysIdentity = useMemo(
() =>