mirror of
https://github.com/purrgrammer/grimoire.git
synced 2026-06-05 10:11:12 +02:00
feat: render all relay lists
This commit is contained in:
@@ -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">
|
||||
|
||||
40
src/components/nostr/kinds/GenericRelayListRenderer.tsx
Normal file
40
src/components/nostr/kinds/GenericRelayListRenderer.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
@@ -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)
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user