Browse Source

fix relay reviews and document relays

imwald
Silberengel 2 weeks ago
parent
commit
c394749a8a
  1. 24
      src/components/FeedRelaysIconRow/index.tsx
  2. 3
      src/constants.ts
  3. 20
      src/services/client.service.ts

24
src/components/FeedRelaysIconRow/index.tsx

@ -1,6 +1,9 @@
import RelayIcon from '@/components/RelayIcon' import RelayIcon from '@/components/RelayIcon'
import { Button } from '@/components/ui/button'
import { toRelay } from '@/lib/link'
import { simplifyUrl } from '@/lib/url' import { simplifyUrl } from '@/lib/url'
import { cn } from '@/lib/utils' import { cn } from '@/lib/utils'
import { useSmartRelayNavigation } from '@/PageManager'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
export function FeedRelaysIconRow({ export function FeedRelaysIconRow({
@ -11,6 +14,7 @@ export function FeedRelaysIconRow({
className?: string className?: string
}) { }) {
const { t } = useTranslation() const { t } = useTranslation()
const { navigateToRelay } = useSmartRelayNavigation()
if (urls.length === 0) return null if (urls.length === 0) return null
return ( return (
@ -19,15 +23,23 @@ export function FeedRelaysIconRow({
role="group" role="group"
aria-label={t('Feed relays', { defaultValue: 'Relays in this feed' })} aria-label={t('Feed relays', { defaultValue: 'Relays in this feed' })}
> >
{urls.map((url) => ( {urls.map((url) => {
<span const label = simplifyUrl(url)
return (
<Button
key={url} key={url}
className="inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-full" type="button"
title={simplifyUrl(url)} variant="ghost"
size="sm"
className="h-7 w-7 min-h-7 min-w-7 shrink-0 rounded-full p-0 hover:bg-muted/80"
title={label}
aria-label={t('Open relay feed', { relay: label, defaultValue: `Open ${label} feed` })}
onClick={() => navigateToRelay(toRelay(url))}
> >
<RelayIcon url={url} className="h-6 w-6" iconSize={12} /> <RelayIcon url={url} className="h-6 w-6" iconSize={12} />
</span> </Button>
))} )
})}
</div> </div>
) )
} }

3
src/constants.ts

@ -445,7 +445,8 @@ export const BOOKSTR_RELAY_URLS = [
*/ */
export const DOCUMENT_RELAY_URLS = [ export const DOCUMENT_RELAY_URLS = [
'wss://thecitadel.nostr1.com', 'wss://thecitadel.nostr1.com',
'wss://relay.wikifreedia.xyz' 'wss://relay.wikifreedia.xyz',
'wss://essayist.decentnewsroom.com'
] as const ] as const
/** /**

20
src/services/client.service.ts

@ -131,7 +131,8 @@ import {
getHttpRelayListFromEvent, getHttpRelayListFromEvent,
getProfileFromEvent, getProfileFromEvent,
getRelayListFromEvent, getRelayListFromEvent,
getRelaySetFromEvent getRelaySetFromEvent,
getRelayUrlFromRelayReviewEvent
} from '@/lib/event-metadata' } from '@/lib/event-metadata'
import logger from '@/lib/logger' import logger from '@/lib/logger'
import { patchPoolRelayAuthRaceAndFeedback } from '@/lib/nostr-relay-auth-patch' 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 { private relayListHasWriteUrls(relayList: TRelayList): boolean {
return collectUserWriteOutboxUrls(relayList).length > 0 return collectUserWriteOutboxUrls(relayList).length > 0
} }
@ -1486,6 +1503,7 @@ class ClientService extends EventTarget {
} }
relays = this.filterPublishingRelays(relays, event) relays = this.filterPublishingRelays(relays, event)
relays = this.pinReviewedRelayForRelayReviewPublish(relays, event)
if (specifiedRelayUrls?.length) { if (specifiedRelayUrls?.length) {
const checkedCount = specifiedRelayUrls.length const checkedCount = specifiedRelayUrls.length

Loading…
Cancel
Save