diff --git a/packages/app/src/Element/HyperText.tsx b/packages/app/src/Element/HyperText.tsx index 01d747eb..f7439a7c 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 f60793b5..ba61a5dc 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 4362799c..4d925216 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 61d60077..28806a27 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 61c2633a..ac6cf6a1 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 00000000..75cdc3b9 --- /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 88096ecc..710ce864 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 64f84320..6078cf0c 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 de88861e..8f6c6ef9 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 3fce393f..798a5696 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 c5c254a1..73474f51 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, };