diff --git a/packages/app/src/Element/HyperText.tsx b/packages/app/src/Element/HyperText.tsx
index 01d747e..f7439a7 100644
--- a/packages/app/src/Element/HyperText.tsx
+++ b/packages/app/src/Element/HyperText.tsx
@@ -26,7 +26,7 @@ import NostrLink from "Element/NostrLink";
import RevealMedia from "Element/RevealMedia";
import MagnetLink from "Element/MagnetLink";
-export default function HyperText({ link, creator }: { link: string; creator: string }) {
+export default function HyperText({ link, creator, depth }: { link: string; creator: string; depth?: number }) {
const a = link;
try {
const url = new URL(a);
@@ -85,7 +85,7 @@ export default function HyperText({ link, creator }: { link: string; creator: st
} else if (isWavlakeLink) {
return ;
} else if (url.protocol === "nostr:" || url.protocol === "web+nostr:") {
- return ;
+ return ;
} else if (url.protocol === "magnet:") {
const parsed = magnetURIDecode(a);
if (parsed) {
diff --git a/packages/app/src/Element/NostrFileHeader.tsx b/packages/app/src/Element/NostrFileHeader.tsx
index f60793b..ba61a5d 100644
--- a/packages/app/src/Element/NostrFileHeader.tsx
+++ b/packages/app/src/Element/NostrFileHeader.tsx
@@ -2,23 +2,23 @@ import useEventFeed from "Feed/EventFeed";
import { NostrLink } from "Util";
import HyperText from "Element/HyperText";
import { FormattedMessage } from "react-intl";
-import Spinner from "Icons/Spinner";
+import PageSpinner from "Element/PageSpinner";
export default function NostrFileHeader({ link }: { link: NostrLink }) {
const ev = useEventFeed(link);
- if (!ev.data?.length) return ;
+ if (!ev.data) return ;
// assume image or embed which can be rendered by the hypertext kind
// todo: make use of hash
// todo: use magnet or other links if present
- const u = ev.data?.[0]?.tags.find(a => a[0] === "u")?.[1] ?? "";
+ const u = ev.data?.tags.find(a => a[0] === "u")?.[1] ?? "";
if (u) {
- return ;
+ return ;
} else {
return (
-
+
);
}
diff --git a/packages/app/src/Element/NostrLink.tsx b/packages/app/src/Element/NostrLink.tsx
index 4362799..4d92521 100644
--- a/packages/app/src/Element/NostrLink.tsx
+++ b/packages/app/src/Element/NostrLink.tsx
@@ -1,11 +1,12 @@
-import { EventKind, NostrPrefix } from "@snort/nostr";
import { Link } from "react-router-dom";
+import { EventKind, NostrPrefix } from "@snort/nostr";
import Mention from "Element/Mention";
import NostrFileHeader from "Element/NostrFileHeader";
import { parseNostrLink } from "Util";
+import NoteQuote from "Element/NoteQuote";
-export default function NostrLink({ link }: { link: string }) {
+export default function NostrLink({ link, depth }: { link: string; depth?: number }) {
const nav = parseNostrLink(link);
if (nav?.type === NostrPrefix.PublicKey || nav?.type === NostrPrefix.Profile) {
@@ -14,12 +15,16 @@ export default function NostrLink({ link }: { link: string }) {
if (nav.kind === EventKind.FileHeader) {
return ;
}
- const evLink = nav.encode();
- return (
- e.stopPropagation()} state={{ from: location.pathname }}>
- #{evLink.substring(0, 12)}
-
- );
+ if ((depth ?? 0) > 0) {
+ const evLink = nav.encode();
+ return (
+ e.stopPropagation()} state={{ from: location.pathname }}>
+ #{evLink.substring(0, 12)}
+
+ );
+ } else {
+ return ;
+ }
} else {
return (
e.stopPropagation()} target="_blank" rel="noreferrer" className="ext">
diff --git a/packages/app/src/Element/Note.css b/packages/app/src/Element/Note.css
index 61d6007..28806a2 100644
--- a/packages/app/src/Element/Note.css
+++ b/packages/app/src/Element/Note.css
@@ -57,6 +57,14 @@
margin-right: 8px;
}
+.note-quote {
+ border: 1px solid var(--gray);
+}
+
+.note-quote.note > .body {
+ padding-left: 0;
+}
+
.note > .body {
margin-top: 4px;
margin-bottom: 24px;
@@ -98,9 +106,6 @@
border-radius: 16px;
}
-.light .note > .footer .ctx-menu {
-}
-
.note > .footer .ctx-menu li {
background: #1e1e1e;
padding-top: 8px;
diff --git a/packages/app/src/Element/Note.tsx b/packages/app/src/Element/Note.tsx
index 61c2633..ac6cf6a 100644
--- a/packages/app/src/Element/Note.tsx
+++ b/packages/app/src/Element/Note.tsx
@@ -39,6 +39,7 @@ export interface NoteProps {
highlight?: boolean;
ignoreModeration?: boolean;
onClick?: (e: TaggedRawEvent) => void;
+ depth?: number;
options?: {
showHeader?: boolean;
showTime?: boolean;
@@ -187,7 +188,7 @@ export default function Note(props: NoteProps) {
);
}
- return ;
+ return ;
};
useLayoutEffect(() => {
diff --git a/packages/app/src/Element/NoteQuote.tsx b/packages/app/src/Element/NoteQuote.tsx
new file mode 100644
index 0000000..75cdc3b
--- /dev/null
+++ b/packages/app/src/Element/NoteQuote.tsx
@@ -0,0 +1,20 @@
+import useEventFeed from "Feed/EventFeed";
+import { NostrLink } from "Util";
+import Note from "Element/Note";
+import PageSpinner from "Element/PageSpinner";
+
+export default function NoteQuote({ link, depth }: { link: NostrLink; depth?: number }) {
+ const ev = useEventFeed(link);
+ if (!ev.data) return ;
+ return (
+
+ );
+}
diff --git a/packages/app/src/Element/Text.css b/packages/app/src/Element/Text.css
index 88096ec..710ce86 100644
--- a/packages/app/src/Element/Text.css
+++ b/packages/app/src/Element/Text.css
@@ -5,7 +5,7 @@
word-break: break-word;
}
-.text a {
+.text > a {
color: var(--highlight);
text-decoration: none;
}
diff --git a/packages/app/src/Element/Text.tsx b/packages/app/src/Element/Text.tsx
index 64f8432..6078cf0 100644
--- a/packages/app/src/Element/Text.tsx
+++ b/packages/app/src/Element/Text.tsx
@@ -25,9 +25,10 @@ export interface TextProps {
creator: HexKey;
tags: Array>;
disableMedia?: boolean;
+ depth?: number;
}
-export default function Text({ content, tags, creator, disableMedia }: TextProps) {
+export default function Text({ content, tags, creator, disableMedia, depth }: TextProps) {
const location = useLocation();
function extractLinks(fragments: Fragment[]) {
@@ -43,7 +44,7 @@ export default function Text({ content, tags, creator, disableMedia }: TextProps
);
}
- return ;
+ return ;
}
return a;
});
diff --git a/packages/app/src/Element/Timeline.tsx b/packages/app/src/Element/Timeline.tsx
index de88861..8f6c6ef 100644
--- a/packages/app/src/Element/Timeline.tsx
+++ b/packages/app/src/Element/Timeline.tsx
@@ -88,7 +88,9 @@ const Timeline = (props: TimelineProps) => {
if (eRef) {
return ;
}
- return ;
+ return (
+
+ );
}
case EventKind.ZapReceipt: {
const zap = parseZap(e);
diff --git a/packages/app/src/Feed/EventFeed.ts b/packages/app/src/Feed/EventFeed.ts
index 3fce393..798a569 100644
--- a/packages/app/src/Feed/EventFeed.ts
+++ b/packages/app/src/Feed/EventFeed.ts
@@ -1,7 +1,7 @@
import { useMemo } from "react";
import useRequestBuilder from "Hooks/useRequestBuilder";
-import { FlatNoteStore, RequestBuilder } from "System";
+import { RequestBuilder, ReplaceableNoteStore } from "System";
import { NostrLink } from "Util";
export default function useEventFeed(link: NostrLink) {
@@ -11,5 +11,5 @@ export default function useEventFeed(link: NostrLink) {
return b;
}, [link]);
- return useRequestBuilder(FlatNoteStore, sub);
+ return useRequestBuilder(ReplaceableNoteStore, sub);
}
diff --git a/packages/app/src/System/index.ts b/packages/app/src/System/index.ts
index c5c254a..73474f5 100644
--- a/packages/app/src/System/index.ts
+++ b/packages/app/src/System/index.ts
@@ -8,6 +8,7 @@ import {
NoteStore,
PubkeyReplaceableNoteStore,
ParameterizedReplaceableNoteStore,
+ ReplaceableNoteStore,
} from "./NoteCollection";
import { diffFilters } from "./RequestSplitter";
import { Query } from "./Query";
@@ -18,6 +19,7 @@ export {
FlatNoteStore,
PubkeyReplaceableNoteStore,
ParameterizedReplaceableNoteStore,
+ ReplaceableNoteStore,
Query,
EventBuilder,
};