From 2726bfd59532d7ee84974d6f16e2218a2c6d5e19 Mon Sep 17 00:00:00 2001 From: reya Date: Thu, 4 Jan 2024 15:10:52 +0700 Subject: [PATCH] feat: support nip 89 --- packages/ark/src/ark.ts | 34 +++++++----- .../ark/src/components/note/appHandler.tsx | 54 +++++++++++++++++++ packages/ark/src/components/note/content.tsx | 16 ++---- packages/ark/src/components/note/nip89.tsx | 53 ++++++++++++++++++ packages/ark/src/provider.tsx | 1 - 5 files changed, 131 insertions(+), 27 deletions(-) create mode 100644 packages/ark/src/components/note/appHandler.tsx create mode 100644 packages/ark/src/components/note/nip89.tsx diff --git a/packages/ark/src/ark.ts b/packages/ark/src/ark.ts index 73ac9a47..52c5436c 100644 --- a/packages/ark/src/ark.ts +++ b/packages/ark/src/ark.ts @@ -1,6 +1,7 @@ import { LumeStorage } from "@lume/storage"; import { type NDKEventWithReplies, type NIP05 } from "@lume/types"; import NDK, { + NDKAppHandlerEvent, NDKEvent, NDKFilter, NDKKind, @@ -519,19 +520,26 @@ export class Ark { return false; } - public async replyTo({ - content, - event, - }: { content: string; event: NDKEvent }) { - try { - const replyEvent = new NDKEvent(this.ndk); - replyEvent.content = content; - replyEvent.kind = NDKKind.Text; - replyEvent.tag(event, "reply"); + public async getAppRecommend({ + unknownKind, + author, + }: { unknownKind: string; author?: string }) { + const event = await this.ndk.fetchEvent({ + kinds: [NDKKind.AppRecommendation], + "#d": [unknownKind], + authors: this.#storage.account.contacts || [author], + }); - return await replyEvent.publish(); - } catch (e) { - throw new Error(e); - } + if (event) return event.tags.filter((item) => item[0] !== "d"); + + const altEvent = await this.ndk.fetchEvent({ + kinds: [NDKKind.AppHandler], + "#k": [unknownKind], + authors: this.#storage.account.contacts || [author], + }); + + if (altEvent) return altEvent.tags.filter((item) => item[0] !== "d"); + + return null; } } diff --git a/packages/ark/src/components/note/appHandler.tsx b/packages/ark/src/components/note/appHandler.tsx new file mode 100644 index 00000000..540ddb72 --- /dev/null +++ b/packages/ark/src/components/note/appHandler.tsx @@ -0,0 +1,54 @@ +import { NDKAppHandlerEvent } from "@nostr-dev-kit/ndk"; +import { useQuery } from "@tanstack/react-query"; +import { useArk } from "../../provider"; + +export function AppHandler({ tag }: { tag: string[] }) { + const ark = useArk(); + + const { isLoading, isError, data } = useQuery({ + queryKey: ["app-handler", tag[1]], + queryFn: async () => { + const ref = tag[1].split(":"); + const event = await ark.getEventByFilter({ + filter: { + kinds: [Number(ref[0])], + authors: [ref[1]], + "#d": [ref[2]], + }, + }); + + if (!event) return null; + + const app = NDKAppHandlerEvent.from(event); + return await app.fetchProfile(); + }, + refetchOnWindowFocus: false, + }); + + if (isLoading) { +
Loading...
; + } + + if (isError || !data) { + return
Error
; + } + + return ( +
+ {data.pubkey} +
+
+ {data.name} +
+
+ {data.about} +
+
+
+ ); +} diff --git a/packages/ark/src/components/note/content.tsx b/packages/ark/src/components/note/content.tsx index 186fb6bf..ddd18fcd 100644 --- a/packages/ark/src/components/note/content.tsx +++ b/packages/ark/src/components/note/content.tsx @@ -1,6 +1,7 @@ import { cn } from "@lume/utils"; import { NDKKind } from "@nostr-dev-kit/ndk"; import { useNoteContext, useRichContent } from "../.."; +import { NIP89 } from "./nip89"; export function NoteContent({ className, @@ -10,18 +11,7 @@ export function NoteContent({ const event = useNoteContext(); const { parsedContent } = useRichContent(event.content); - if (event.kind === NDKKind.Text) { - return ( -
- {parsedContent} -
- ); - } + if (event.kind !== NDKKind.Text) return ; return (
- Unsupported kind + {parsedContent}
); } diff --git a/packages/ark/src/components/note/nip89.tsx b/packages/ark/src/components/note/nip89.tsx new file mode 100644 index 00000000..66b4b60a --- /dev/null +++ b/packages/ark/src/components/note/nip89.tsx @@ -0,0 +1,53 @@ +import { useQuery } from "@tanstack/react-query"; +import { useArk } from "../../provider"; +import { AppHandler } from "./appHandler"; +import { useNoteContext } from "./provider"; + +export function NIP89({ className }: { className?: string }) { + const ark = useArk(); + const event = useNoteContext(); + + const { isLoading, isError, data } = useQuery({ + queryKey: ["app-recommend", event.id], + queryFn: () => { + return ark.getAppRecommend({ + unknownKind: event.kind.toString(), + author: event.pubkey, + }); + }, + refetchOnWindowFocus: false, + refetchOnMount: false, + staleTime: Infinity, + }); + + if (isLoading) { +
Loading...
; + } + + if (isError || !data) { + return
Error
; + } + + return ( +
+
+
+

+ Lume isn't support this event +

+

+ {event.kind} +

+
+
+ + Open with + + {data.map((item, index) => ( + + ))} +
+
+
+ ); +} diff --git a/packages/ark/src/provider.tsx b/packages/ark/src/provider.tsx index e5ecc16e..fd552c70 100644 --- a/packages/ark/src/provider.tsx +++ b/packages/ark/src/provider.tsx @@ -3,7 +3,6 @@ import { NDKCacheAdapterTauri } from "@lume/ndk-cache-tauri"; import { LumeStorage } from "@lume/storage"; import { QUOTES, delay, sendNativeNotification } from "@lume/utils"; import NDK, { - NDKKind, NDKNip46Signer, NDKPrivateKeySigner, NDKRelay,