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.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,