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