diff --git a/src/components/FeedRelaysIconRow/index.tsx b/src/components/FeedRelaysIconRow/index.tsx
index db29cdc8..f262e093 100644
--- a/src/components/FeedRelaysIconRow/index.tsx
+++ b/src/components/FeedRelaysIconRow/index.tsx
@@ -1,6 +1,9 @@
import RelayIcon from '@/components/RelayIcon'
+import { Button } from '@/components/ui/button'
+import { toRelay } from '@/lib/link'
import { simplifyUrl } from '@/lib/url'
import { cn } from '@/lib/utils'
+import { useSmartRelayNavigation } from '@/PageManager'
import { useTranslation } from 'react-i18next'
export function FeedRelaysIconRow({
@@ -11,6 +14,7 @@ export function FeedRelaysIconRow({
className?: string
}) {
const { t } = useTranslation()
+ const { navigateToRelay } = useSmartRelayNavigation()
if (urls.length === 0) return null
return (
@@ -19,15 +23,23 @@ export function FeedRelaysIconRow({
role="group"
aria-label={t('Feed relays', { defaultValue: 'Relays in this feed' })}
>
- {urls.map((url) => (
-
-
-
- ))}
+ {urls.map((url) => {
+ const label = simplifyUrl(url)
+ return (
+
+ )
+ })}
)
}
diff --git a/src/constants.ts b/src/constants.ts
index 77653d97..14dc9463 100644
--- a/src/constants.ts
+++ b/src/constants.ts
@@ -445,7 +445,8 @@ export const BOOKSTR_RELAY_URLS = [
*/
export const DOCUMENT_RELAY_URLS = [
'wss://thecitadel.nostr1.com',
- 'wss://relay.wikifreedia.xyz'
+ 'wss://relay.wikifreedia.xyz',
+ 'wss://essayist.decentnewsroom.com'
] as const
/**
diff --git a/src/services/client.service.ts b/src/services/client.service.ts
index 16ac9cc8..80fed986 100644
--- a/src/services/client.service.ts
+++ b/src/services/client.service.ts
@@ -131,7 +131,8 @@ import {
getHttpRelayListFromEvent,
getProfileFromEvent,
getRelayListFromEvent,
- getRelaySetFromEvent
+ getRelaySetFromEvent,
+ getRelayUrlFromRelayReviewEvent
} from '@/lib/event-metadata'
import logger from '@/lib/logger'
import { patchPoolRelayAuthRaceAndFeedback } from '@/lib/nostr-relay-auth-patch'
@@ -904,6 +905,22 @@ class ClientService extends EventTarget {
)
}
+ /** Kind 31987: always attempt the reviewed relay (`d` tag) first in the publish stack. */
+ private pinReviewedRelayForRelayReviewPublish(relays: string[], event: NEvent): string[] {
+ if (event.kind !== ExtendedKind.RELAY_REVIEW) return relays
+ const reviewedRelay = getRelayUrlFromRelayReviewEvent(event)
+ if (!reviewedRelay) return relays
+ const normalized = normalizeRelayUrlByScheme(reviewedRelay) || reviewedRelay.trim()
+ if (!normalized) return relays
+ const [pinned] = this.filterPublishingRelays([normalized], event)
+ if (!pinned) return relays
+ const pinnedKey = (normalizeRelayUrlByScheme(pinned) || pinned).toLowerCase()
+ return dedupeNormalizeRelayUrlsOrdered([
+ pinned,
+ ...relays.filter((url) => (normalizeRelayUrlByScheme(url) || url).toLowerCase() !== pinnedKey)
+ ])
+ }
+
private relayListHasWriteUrls(relayList: TRelayList): boolean {
return collectUserWriteOutboxUrls(relayList).length > 0
}
@@ -1486,6 +1503,7 @@ class ClientService extends EventTarget {
}
relays = this.filterPublishingRelays(relays, event)
+ relays = this.pinReviewedRelayForRelayReviewPublish(relays, event)
if (specifiedRelayUrls?.length) {
const checkedCount = specifiedRelayUrls.length