feat: render all relay lists

This commit is contained in:
Alejandro Gómez
2025-12-11 16:31:52 +01:00
parent eaaa3d9da9
commit 961738343a
3 changed files with 50 additions and 2 deletions

View File

@@ -12,6 +12,7 @@ export interface RelayLinkProps {
url: string;
read?: boolean;
write?: boolean;
showInboxOutbox?: boolean;
className?: string;
urlClassname?: string;
iconClassname?: string;
@@ -28,6 +29,7 @@ export function RelayLink({
iconClassname,
read = false,
write = false,
showInboxOutbox = true,
className,
}: RelayLinkProps) {
const { addWindow } = useGrimoire();
@@ -56,7 +58,7 @@ export function RelayLink({
<span className={cn("text-xs truncate", urlClassname)}>{url}</span>
</div>
<div className="flex items-center gap-1 flex-shrink-0">
{read && (
{showInboxOutbox && read && (
<HoverCard openDelay={200}>
<HoverCardTrigger asChild>
<div className="cursor-help">
@@ -81,7 +83,7 @@ export function RelayLink({
</HoverCardContent>
</HoverCard>
)}
{write && (
{showInboxOutbox && write && (
<HoverCard openDelay={200}>
<HoverCardTrigger asChild>
<div className="cursor-help">

View File

@@ -0,0 +1,40 @@
import { BaseEventProps, BaseEventContainer } from "./BaseEventRenderer";
import { getRelaysFromList } from "applesauce-core/helpers/lists";
import { RelayLink } from "../RelayLink";
/**
* Generic Relay List Renderer
* Works for NIP-51 relay list kinds: 10006, 10007, 10012, 10050, 30002
* These lists contain simple "relay" tags without read/write distinction
*/
export function GenericRelayListRenderer({ event }: BaseEventProps) {
// Extract relay URLs from the list (supports both public and encrypted)
const relays = getRelaysFromList(event, "all");
if (relays.length === 0) {
return (
<BaseEventContainer event={event}>
<div className="text-xs text-muted-foreground italic">
No relays configured
</div>
</BaseEventContainer>
);
}
return (
<BaseEventContainer event={event}>
<div className="flex flex-col gap-0.5">
{relays.map((url) => (
<RelayLink
key={url}
url={url}
showInboxOutbox={false}
className="py-0.5 hover:bg-none"
iconClassname="size-4"
urlClassname="underline decoration-dotted"
/>
))}
</div>
</BaseEventContainer>
);
}

View File

@@ -12,6 +12,7 @@ import { Kind9802Renderer } from "./Kind9802Renderer";
import { Kind10002Renderer } from "./Kind10002Renderer";
import { Kind30023Renderer } from "./Kind30023Renderer";
import { Kind39701Renderer } from "./Kind39701Renderer";
import { GenericRelayListRenderer } from "./GenericRelayListRenderer";
import { NostrEvent } from "@/types/nostr";
import { BaseEventContainer, type BaseEventProps } from "./BaseEventRenderer";
@@ -33,6 +34,11 @@ const kindRenderers: Record<number, React.ComponentType<BaseEventProps>> = {
9735: Kind9735Renderer, // Zap Receipt
9802: Kind9802Renderer, // Highlight
10002: Kind10002Renderer, // Relay List Metadata (NIP-65)
10006: GenericRelayListRenderer, // Blocked Relays (NIP-51)
10007: GenericRelayListRenderer, // Search Relays (NIP-51)
10012: GenericRelayListRenderer, // Favorite Relays (NIP-51)
10050: GenericRelayListRenderer, // DM Relay List (NIP-51)
30002: GenericRelayListRenderer, // Relay Sets (NIP-51)
30023: Kind30023Renderer, // Long-form Article
39701: Kind39701Renderer, // Web Bookmarks (NIP-B0)
};