From 89ef0e2c5e5c29797c1881f5f6a1a66c324de0ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20G=C3=B3mez?= Date: Tue, 31 Mar 2026 18:41:28 +0200 Subject: [PATCH] feat: event dialog --- src/components/EventDetailViewer.tsx | 7 +- src/components/EventJsonDialog.tsx | 114 ++++++++++++++++++ .../chat/ChatMessageContextMenu.tsx | 7 +- .../nostr/kinds/BaseEventRenderer.tsx | 12 +- 4 files changed, 125 insertions(+), 15 deletions(-) create mode 100644 src/components/EventJsonDialog.tsx diff --git a/src/components/EventDetailViewer.tsx b/src/components/EventDetailViewer.tsx index 0e93200..75f7d29 100644 --- a/src/components/EventDetailViewer.tsx +++ b/src/components/EventDetailViewer.tsx @@ -3,7 +3,7 @@ import type { EventPointer, AddressPointer } from "nostr-tools/nip19"; import { useNostrEvent } from "@/hooks/useNostrEvent"; import { DetailKindRenderer } from "./nostr/kinds"; import { EventErrorBoundary } from "./EventErrorBoundary"; -import { JsonViewer } from "./JsonViewer"; +import { EventJsonDialog } from "./EventJsonDialog"; import { RelayLink } from "./nostr/RelayLink"; import { EventDetailSkeleton } from "@/components/ui/skeleton"; import { Copy, CopyCheck, FileJson, Wifi } from "lucide-react"; @@ -178,11 +178,10 @@ export function EventDetailViewer({ pointer }: EventDetailViewerProps) { {/* JSON Viewer Dialog */} - ); diff --git a/src/components/EventJsonDialog.tsx b/src/components/EventJsonDialog.tsx new file mode 100644 index 0000000..a13f868 --- /dev/null +++ b/src/components/EventJsonDialog.tsx @@ -0,0 +1,114 @@ +import { useMemo } from "react"; +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; +import { useCopy } from "@/hooks/useCopy"; +import { useProfile } from "@/hooks/useProfile"; +import { getDisplayName } from "@/lib/nostr-utils"; +import { getKindName } from "@/constants/kinds"; +import { Copy, CopyCheck } from "lucide-react"; +import { CodeCopyButton } from "@/components/CodeCopyButton"; +import { SyntaxHighlight } from "@/components/SyntaxHighlight"; +import { isAddressableKind } from "@/lib/nostr-kinds"; +import { getSeenRelays } from "applesauce-core/helpers/relays"; +import { getTagValue } from "applesauce-core/helpers"; +import { nip19 } from "nostr-tools"; +import type { NostrEvent } from "@/types/nostr"; + +interface EventJsonDialogProps { + event: NostrEvent; + open: boolean; + onOpenChange: (open: boolean) => void; +} + +export function EventJsonDialog({ + event, + open, + onOpenChange, +}: EventJsonDialogProps) { + const profile = useProfile(event.pubkey); + const { copy: copyBech32, copied: copiedBech32 } = useCopy(); + const { copy: copyJson, copied: copiedJson } = useCopy(); + + const displayName = getDisplayName(event.pubkey, profile); + const kindName = getKindName(event.kind); + + const bech32Id = useMemo(() => { + const seenRelaysSet = getSeenRelays(event); + const relays = seenRelaysSet ? Array.from(seenRelaysSet) : []; + + return isAddressableKind(event.kind) + ? nip19.naddrEncode({ + kind: event.kind, + pubkey: event.pubkey, + identifier: getTagValue(event, "d") || "", + relays, + }) + : nip19.neventEncode({ + id: event.id, + author: event.pubkey, + relays, + }); + }, [event]); + + const jsonString = useMemo(() => JSON.stringify(event, null, 2), [event]); + + return ( + + + + + {displayName} - {kindName} (kind {event.kind}) + + + +
+ {/* Nostr ID */} +
+ + Nostr ID + +
+ + {bech32Id} + + +
+
+ + {/* JSON */} +
+ + JSON + +
+ + copyJson(jsonString)} + copied={copiedJson} + label="Copy JSON" + /> +
+
+
+
+
+ ); +} diff --git a/src/components/chat/ChatMessageContextMenu.tsx b/src/components/chat/ChatMessageContextMenu.tsx index fb59aa5..d4c25f8 100644 --- a/src/components/chat/ChatMessageContextMenu.tsx +++ b/src/components/chat/ChatMessageContextMenu.tsx @@ -22,7 +22,7 @@ import { } from "lucide-react"; import { useAddWindow } from "@/core/state"; import { useCopy } from "@/hooks/useCopy"; -import { JsonViewer } from "@/components/JsonViewer"; +import { EventJsonDialog } from "@/components/EventJsonDialog"; import { KindBadge } from "@/components/KindBadge"; import { EmojiPickerDialog } from "./EmojiPickerDialog"; import { nip19 } from "nostr-tools"; @@ -224,11 +224,10 @@ export function ChatMessageContextMenu({ - {conversation && adapter && ( - ); @@ -475,11 +474,10 @@ export function EventContextMenu({ View JSON - );