-
-
-
-
-
-
-
-
-
- {settings.zap ? : null}
-
-
-
-
-
+
+
+
-
-
+
Your newsfeed is empty
+
+ Here are few suggestions to get started.
+
+
+
+
+
+ Show global newsfeed
+
+
+
+ Show trending notes
+
+
+
+ Discover trending users
+
+
+
);
}
diff --git a/apps/desktop2/src/routes/trending.lazy.tsx b/apps/desktop2/src/routes/trending.lazy.tsx
deleted file mode 100644
index 906b7d350..000000000
--- a/apps/desktop2/src/routes/trending.lazy.tsx
+++ /dev/null
@@ -1,71 +0,0 @@
-import { RepostNote } from "@/components/repost";
-import { Suggest } from "@/components/suggest";
-import { TextNote } from "@/components/text";
-import { LoaderIcon, InfoIcon } from "@lume/icons";
-import { Event, Kind } from "@lume/types";
-import { Column } from "@lume/ui";
-import { useQuery } from "@tanstack/react-query";
-import { createLazyFileRoute } from "@tanstack/react-router";
-import { useTranslation } from "react-i18next";
-import { Virtualizer } from "virtua";
-import { fetch } from "@tauri-apps/plugin-http";
-
-export const Route = createLazyFileRoute("/trending")({
- component: Screen,
-});
-
-export function Screen() {
- // @ts-ignore, just work!!!
- const { id, name, account } = Route.useSearch();
- const { t } = useTranslation();
- const { data, isLoading } = useQuery({
- queryKey: ["trending", account],
- queryFn: async () => {
- const res = await fetch("https://api.nostr.band/v0/trending/notes");
- const data = await res.json();
- const events = data.notes.map((item) => item.event) as Event[];
- return events.sort((a, b) => b.created_at - a.created_at);
- },
- refetchOnWindowFocus: false,
- });
-
- const renderItem = (event: Event) => {
- if (!event) return;
- switch (event.kind) {
- case Kind.Repost:
- return
;
- default:
- return
;
- }
- };
-
- return (
-
-
-
- {isLoading ? (
-
-
-
- ) : !data.length ? (
-
-
-
-
-
{t("emptyFeedTitle")}
-
{t("emptyFeedSubtitle")}
-
-
-
-
- ) : (
-
- {data.map((item) => renderItem(item))}
-
- )}
-
-
- );
-}
diff --git a/apps/desktop2/src/routes/trending.notes.tsx b/apps/desktop2/src/routes/trending.notes.tsx
new file mode 100644
index 000000000..8f3be65df
--- /dev/null
+++ b/apps/desktop2/src/routes/trending.notes.tsx
@@ -0,0 +1,67 @@
+import { RepostNote } from "@/components/repost";
+import { TextNote } from "@/components/text";
+import { LoaderIcon } from "@lume/icons";
+import { Event, Kind } from "@lume/types";
+import { Await, createFileRoute } from "@tanstack/react-router";
+import { Virtualizer } from "virtua";
+import { fetch } from "@tauri-apps/plugin-http";
+import { defer } from "@tanstack/react-router";
+import { Suspense } from "react";
+
+export const Route = createFileRoute("/trending/notes")({
+ loader: async ({ abortController }) => {
+ try {
+ return {
+ data: defer(
+ fetch("https://api.nostr.band/v0/trending/notes", {
+ signal: abortController.signal,
+ })
+ .then((res) => res.json())
+ .then((res) => res.notes.map((item) => item.event) as Event[]),
+ ),
+ };
+ } catch (e) {
+ throw new Error(String(e));
+ }
+ },
+ component: Screen,
+});
+
+export function Screen() {
+ const { data } = Route.useLoaderData();
+
+ const renderItem = (event: Event) => {
+ if (!event) return;
+ switch (event.kind) {
+ case Kind.Repost:
+ return
;
+ default:
+ return
;
+ }
+ };
+
+ return (
+
+
+
+
+
+ }
+ >
+
+ {(notes) => notes.map((event) => renderItem(event))}
+
+
+
+
+ );
+}
diff --git a/apps/desktop2/src/routes/trending.tsx b/apps/desktop2/src/routes/trending.tsx
new file mode 100644
index 000000000..31c696ffd
--- /dev/null
+++ b/apps/desktop2/src/routes/trending.tsx
@@ -0,0 +1,69 @@
+import { ArticleIcon, GroupFeedsIcon } from "@lume/icons";
+import { ColumnRouteSearch } from "@lume/types";
+import { Column } from "@lume/ui";
+import { cn } from "@lume/utils";
+import { Link, Outlet } from "@tanstack/react-router";
+import { createFileRoute } from "@tanstack/react-router";
+
+export const Route = createFileRoute("/trending")({
+ validateSearch: (search: Record