diff --git a/packages/app/src/Components/Event/Application.tsx b/packages/app/src/Components/Event/Application.tsx
new file mode 100644
index 00000000..fb78ddbe
--- /dev/null
+++ b/packages/app/src/Components/Event/Application.tsx
@@ -0,0 +1,39 @@
+import { mapEventToProfile, TaggedNostrEvent } from "@snort/system";
+import { FormattedMessage } from "react-intl";
+
+import KindName from "../kind-name";
+import Avatar from "../User/Avatar";
+import DisplayName from "../User/DisplayName";
+import ProfileImage from "../User/ProfileImage";
+
+export function ApplicationHandler({ ev }: { ev: TaggedNostrEvent }) {
+ const profile = mapEventToProfile(ev);
+ const kinds = ev.tags
+ .filter(a => a[0] === "k")
+ .map(a => Number(a[1]))
+ .sort((a, b) => a - b);
+ return (
+
+
+
+
+ {kinds.map(a => (
+
+
+
+ ))}
+
+
+ );
+}
diff --git a/packages/app/src/Components/Event/EventComponent.tsx b/packages/app/src/Components/Event/EventComponent.tsx
index cd46ac93..ba599b9d 100644
--- a/packages/app/src/Components/Event/EventComponent.tsx
+++ b/packages/app/src/Components/Event/EventComponent.tsx
@@ -6,15 +6,15 @@ import { memo, ReactNode } from "react";
import PubkeyList from "@/Components/Embed/PubkeyList";
import ZapstrEmbed from "@/Components/Embed/ZapstrEmbed";
import ErrorBoundary from "@/Components/ErrorBoundary";
+import { ApplicationHandler } from "@/Components/Event/Application";
+import { LongFormText } from "@/Components/Event/LongFormText";
import { NostrFileElement } from "@/Components/Event/NostrFileHeader";
+import { Note } from "@/Components/Event/Note/Note";
import NoteReaction from "@/Components/Event/NoteReaction";
import { ZapGoal } from "@/Components/Event/ZapGoal";
import { LiveEvent } from "@/Components/LiveStream/LiveEvent";
import ProfilePreview from "@/Components/User/ProfilePreview";
-import { LongFormText } from "./LongFormText";
-import { Note } from "./Note/Note";
-
export interface NotePropsOptions {
isRoot?: boolean;
showHeader?: boolean;
@@ -75,6 +75,10 @@ export default memo(function EventComponent(props: NoteProps) {
case 9041: // Assuming 9041 is a valid EventKind
content = ;
break;
+ case EventKind.ApplicationHandler: {
+ content = ;
+ break;
+ }
case EventKind.Photo:
case EventKind.Video:
case EventKind.ShortVideo: {
diff --git a/packages/app/src/Components/kind-name.tsx b/packages/app/src/Components/kind-name.tsx
index b5c42430..a8be82d9 100644
--- a/packages/app/src/Components/kind-name.tsx
+++ b/packages/app/src/Components/kind-name.tsx
@@ -1,3 +1,4 @@
+/* eslint-disable max-lines */
import { FormattedMessage } from "react-intl";
export default function KindName({ kind }: { kind: number }) {
@@ -222,5 +223,9 @@ export default function KindName({ kind }: { kind: number }) {
return ;
case 34550:
return ;
+ case 31337:
+ return ;
+ default:
+ return kind;
}
}
diff --git a/packages/app/src/Pages/Layout/Header.tsx b/packages/app/src/Pages/Layout/Header.tsx
index 23ff57b0..f9ad1dad 100644
--- a/packages/app/src/Pages/Layout/Header.tsx
+++ b/packages/app/src/Pages/Layout/Header.tsx
@@ -64,7 +64,11 @@ export function Header() {
>
);
} else if (nostrLink) {
- if (nostrLink.type === NostrPrefix.Event || nostrLink.type === NostrPrefix.Note) {
+ if (
+ nostrLink.type === NostrPrefix.Event ||
+ nostrLink.type === NostrPrefix.Note ||
+ nostrLink.type === NostrPrefix.Address
+ ) {
title = ;
} else if (nostrLink.type === NostrPrefix.PublicKey || nostrLink.type === NostrPrefix.Profile) {
try {
diff --git a/packages/app/src/lang.json b/packages/app/src/lang.json
index 93041fac..0633ea7f 100644
--- a/packages/app/src/lang.json
+++ b/packages/app/src/lang.json
@@ -270,6 +270,9 @@
"4emo2p": {
"defaultMessage": "Missing Relays"
},
+ "4oPRxH": {
+ "defaultMessage": "Supported Kinds:"
+ },
"4rYCjn": {
"defaultMessage": "Note to Self"
},
@@ -1148,6 +1151,9 @@
"QWhotP": {
"defaultMessage": "Zap Pool only works if you use one of the supported wallet connections (WebLN, LNC, LNDHub or Nostr Wallet Connect)"
},
+ "QaGyuN": {
+ "defaultMessage": "Zapstr Track"
+ },
"QpaLA3": {
"defaultMessage": "Channel Message"
},
@@ -1302,6 +1308,9 @@
"ULXFfP": {
"defaultMessage": "Receive"
},
+ "ULsJTk": {
+ "defaultMessage": "Published by"
+ },
"UNjfWJ": {
"defaultMessage": "Check all event signatures received from relays"
},
diff --git a/packages/app/src/translations/en.json b/packages/app/src/translations/en.json
index 2132910e..0d591ba1 100644
--- a/packages/app/src/translations/en.json
+++ b/packages/app/src/translations/en.json
@@ -89,6 +89,7 @@
"4Vmpt4": "Nostr Plebs is one of the first NIP-05 providers in the space and offers a good collection of domains at reasonable prices",
"4Z3t5i": "Use imgproxy to compress images",
"4emo2p": "Missing Relays",
+ "4oPRxH": "Supported Kinds:",
"4rYCjn": "Note to Self",
"4wgYpI": "Recommended Application Handlers",
"5BVs2e": "zap",
@@ -380,6 +381,7 @@
"QDFTjG": "{n} Relays",
"QJfhKt": "The private key is like a password, but it cannot be reset. Guard it carefully and never show it to anyone. Once someone has your private key, they will have access to your account forever.",
"QWhotP": "Zap Pool only works if you use one of the supported wallet connections (WebLN, LNC, LNDHub or Nostr Wallet Connect)",
+ "QaGyuN": "Zapstr Track",
"QpaLA3": "Channel Message",
"Qxv0B2": "You currently have {number} sats in your zap pool.",
"Qy6/Ft": "Private Direct Messages",
@@ -431,6 +433,7 @@
"U30H69": "Community Definition",
"UJTWqI": "Remove from my relays",
"ULXFfP": "Receive",
+ "ULsJTk": "Published by",
"UNjfWJ": "Check all event signatures received from relays",
"UT7Nkj": "New Chat",
"UUPFlt": "Users must accept the content warning to show the content of your note.",
diff --git a/packages/system/src/event-kind.ts b/packages/system/src/event-kind.ts
index f30ce316..70372a69 100644
--- a/packages/system/src/event-kind.ts
+++ b/packages/system/src/event-kind.ts
@@ -55,6 +55,7 @@ const enum EventKind {
LiveEvent = 30311, // NIP-102
UserStatus = 30315, // NIP-38
ZapstrTrack = 31337,
+ ApplicationHandler = 31_990,
SimpleChatMetadata = 39_000, // NIP-29
ZapRequest = 9734, // NIP 57
ZapReceipt = 9735, // NIP 57