From d20a92e8541f01c8523bfc341c7f1d630a3a19c5 Mon Sep 17 00:00:00 2001 From: Alejandro Date: Wed, 21 Jan 2026 10:15:11 +0100 Subject: [PATCH] fix: support zapping addressable events (naddr) (#182) ZapWindow now correctly handles naddr pointers by: - Using useNostrEvent hook which supports both EventPointer and AddressPointer - Falling back to addressPointer.pubkey when event hasn't loaded yet Previously, zapping an naddr would fail because the component only tried to load events via eventPointer.id, ignoring addressPointer. Co-authored-by: Claude --- src/components/ZapWindow.tsx | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/components/ZapWindow.tsx b/src/components/ZapWindow.tsx index b4eb3c4..380f12b 100644 --- a/src/components/ZapWindow.tsx +++ b/src/components/ZapWindow.tsx @@ -31,8 +31,7 @@ import { PrivateKeySigner } from "applesauce-signers"; import { generateSecretKey } from "nostr-tools"; import QRCode from "qrcode"; import { useProfile } from "@/hooks/useProfile"; -import { use$ } from "applesauce-react/hooks"; -import eventStore from "@/services/event-store"; +import { useNostrEvent } from "@/hooks/useNostrEvent"; import { useWallet } from "@/hooks/useWallet"; import { getDisplayName } from "@/lib/nostr-utils"; import { KindRenderer } from "./nostr/kinds"; @@ -101,16 +100,18 @@ export function ZapWindow({ customTags, relays: propsRelays, }: ZapWindowProps) { - // Load event if we have an eventPointer and no recipient pubkey (derive from event author) - const event = use$(() => { - if (!eventPointer) return undefined; - return eventStore.event(eventPointer.id); - }, [eventPointer]); + // Load event if we have a pointer - supports both EventPointer and AddressPointer + const event = useNostrEvent(eventPointer || addressPointer); - // Resolve recipient: use provided pubkey or derive from semantic author - // For zaps, this returns the zapper; for streams, returns the host; etc. + // Resolve recipient pubkey: + // 1. Use provided pubkey if available + // 2. Otherwise derive from event's semantic author (zapper, host, etc.) + // 3. Fall back to addressPointer.pubkey for addressable events const recipientPubkey = - initialRecipientPubkey || (event ? getSemanticAuthor(event) : ""); + initialRecipientPubkey || + (event ? getSemanticAuthor(event) : "") || + addressPointer?.pubkey || + ""; const recipientProfile = useProfile(recipientPubkey);