From 1aab7c93725beed5a44665586b7d4c1dd414c398 Mon Sep 17 00:00:00 2001 From: kieran Date: Thu, 6 Mar 2025 11:00:05 +0000 Subject: [PATCH] feat: news page --- src/components/markdown.css | 39 -------------------------- src/components/markdown.tsx | 45 +++++++++++++++++++----------- src/main.tsx | 10 +++++++ src/pages/home.tsx | 2 ++ src/pages/news-post.tsx | 25 +++++++++++++++++ src/pages/news.tsx | 55 +++++++++++++++++++++++++++++++++++++ 6 files changed, 121 insertions(+), 55 deletions(-) delete mode 100644 src/components/markdown.css create mode 100644 src/pages/news-post.tsx create mode 100644 src/pages/news.tsx diff --git a/src/components/markdown.css b/src/components/markdown.css deleted file mode 100644 index 4355498..0000000 --- a/src/components/markdown.css +++ /dev/null @@ -1,39 +0,0 @@ -.markdown a { - @apply underline; -} - -.markdown blockquote { - margin: 0; - padding-left: 12px; - @apply border-l-neutral-800 border-2 text-neutral-400; -} - -.markdown hr { - border: 0; - height: 1px; - margin: 20px; - @apply bg-neutral-800; -} - -.markdown img:not(.custom-emoji), -.markdown video, -.markdown iframe, -.markdown audio { - max-width: 100%; - display: block; -} - -.markdown iframe, -.markdown video { - width: -webkit-fill-available; - aspect-ratio: 16 / 9; -} - -.markdown h1, -.markdown h2, -.markdown h3, -.markdown h4, -.markdown h5, -.markdown h6 { - margin: 0.5em 0; -} diff --git a/src/components/markdown.tsx b/src/components/markdown.tsx index 6b96f3e..1fa8bda 100644 --- a/src/components/markdown.tsx +++ b/src/components/markdown.tsx @@ -1,5 +1,3 @@ -import "./markdown.css"; - import { ReactNode, forwardRef, useMemo } from "react"; import { Token, Tokens, marked } from "marked"; import { Link } from "react-router-dom"; @@ -16,9 +14,9 @@ const Markdown = forwardRef( switch (t.type) { case "paragraph": { return ( -
+

{t.tokens ? t.tokens.map(renderToken) : t.raw} -

+

); } case "image": { @@ -28,37 +26,37 @@ const Markdown = forwardRef( switch (t.depth) { case 1: return ( -

+

{t.tokens ? t.tokens.map(renderToken) : t.raw}

); case 2: return ( -

+

{t.tokens ? t.tokens.map(renderToken) : t.raw}

); case 3: return ( -

+

{t.tokens ? t.tokens.map(renderToken) : t.raw}

); case 4: return ( -

+

{t.tokens ? t.tokens.map(renderToken) : t.raw}

); case 5: return ( -
+
{t.tokens ? t.tokens.map(renderToken) : t.raw}
); case 6: return ( -
+
{t.tokens ? t.tokens.map(renderToken) : t.raw}
); @@ -66,7 +64,11 @@ const Markdown = forwardRef( throw new Error("Invalid heading"); } case "codespan": { - return {t.raw}; + return ( + + {t.raw.substring(1, t.raw.length - 1)} + + ); } case "code": { return
{t.raw}
; @@ -84,23 +86,34 @@ const Markdown = forwardRef( } case "blockquote": { return ( -
+
{t.tokens ? t.tokens.map(renderToken) : t.raw}
); } case "link": { return ( - + {t.tokens ? t.tokens.map(renderToken) : t.raw} ); } case "list": { if (t.ordered) { - return
    {t.items.map(renderToken)}
; + return ( +
    + {t.items.map(renderToken)} +
+ ); } else { - return
    {t.items.map(renderToken)}
; + return ( +
    + {t.items.map(renderToken)} +
+ ); } } case "list_item": { @@ -170,7 +183,7 @@ const Markdown = forwardRef( return marked.lexer(props.content); }, [props.content]); return ( -
+
{parsed .filter((a) => a.type !== "footnote" && a.type !== "footnotes") .map((a) => renderToken(a))} diff --git a/src/main.tsx b/src/main.tsx index 72624dc..2050d6c 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -15,6 +15,8 @@ import { StatusPage } from "./pages/status.tsx"; import { AccountSettings } from "./pages/account-settings.tsx"; import { VmBillingPage } from "./pages/vm-billing.tsx"; import { VmGraphsPage } from "./pages/vm-graphs.tsx"; +import { NewsPage } from "./pages/news.tsx"; +import { NewsPost } from "./pages/news-post.tsx"; const system = new NostrSystem({ automaticOutboxModel: false, @@ -71,6 +73,14 @@ const router = createBrowserRouter([ path: "/status", element: , }, + { + path: "/news", + element: , + }, + { + path: "/news/:id", + element: , + }, ], }, ]); diff --git a/src/pages/home.tsx b/src/pages/home.tsx index 4e2a76c..2562d82 100644 --- a/src/pages/home.tsx +++ b/src/pages/home.tsx @@ -40,6 +40,8 @@ export default function HomePage() { {" | "} Terms {" | "} + News + {" | "} a[0] == "title")?.[1]; + const posted = Number( + state.tags.find((a) => a[0] == "published_at")?.[1] ?? state.created_at, + ); + return ( +
+
{title}
+
+ +
{new Date(posted * 1000).toLocaleString()}
+
+ + +
+ ); +} diff --git a/src/pages/news.tsx b/src/pages/news.tsx new file mode 100644 index 0000000..6ffe74c --- /dev/null +++ b/src/pages/news.tsx @@ -0,0 +1,55 @@ +import { EventKind, NostrLink, RequestBuilder } from "@snort/system"; +import { NostrProfile } from "../const"; +import { useRequestBuilder } from "@snort/system-react"; +import { Link } from "react-router-dom"; + +export function NewsPage() { + const req = new RequestBuilder("news"); + req + .withFilter() + .kinds([EventKind.LongFormTextNote]) + .authors([NostrProfile.id]) + .limit(10); + + const posts = useRequestBuilder(req); + + return ( +
+
News
+ {posts + .sort((a, b) => { + const a_posted = Number( + a.tags.find((a) => a[0] == "published_at")?.[1] ?? a.created_at, + ); + const b_posted = Number( + b.tags.find((z) => z[0] == "published_at")?.[1] ?? b.created_at, + ); + return b_posted - a_posted; + }) + .map((a) => { + const link = NostrLink.fromEvent(a); + const title = a.tags.find((a) => a[0] == "title")?.[1]; + const posted = Number( + a.tags.find((a) => a[0] == "published_at")?.[1] ?? a.created_at, + ); + const slug = title + ?.toLocaleLowerCase() + .replace(/[:/]/g, "") + .trimStart() + .trimEnd() + .replace(/ /g, "-"); + return ( + +
+
+
{title}
+
{new Date(posted * 1000).toDateString()}
+
+
+ + ); + })} + {posts.length === 0 &&
No posts yet..
} +
+ ); +}