import { Spinner } from "@/components"; import { Conversation } from "@/components/conversation"; import { Quote } from "@/components/quote"; import { RepostNote } from "@/components/repost"; import { TextNote } from "@/components/text"; import { Kind, type NostrEvent } from "@/types"; import { LumeEvent } from "@/system"; import * as ScrollArea from "@radix-ui/react-scroll-area"; import { Await, createFileRoute } from "@tanstack/react-router"; import { defer } from "@tanstack/react-router"; import { Suspense, useCallback, useRef } from "react"; import { Virtualizer } from "virtua"; 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) => { const events: NostrEvent[] = res.notes.map( (item: { event: NostrEvent }) => item.event, ); const lumeEvents = Promise.all( events.map(async (ev) => await LumeEvent.build(ev)), ); return lumeEvents; }), ), }; } catch (e) { throw new Error(String(e)); } }, component: Screen, }); export function Screen() { const { data } = Route.useLoaderData(); const ref = useRef(null); const renderItem = useCallback((event: LumeEvent) => { if (!event) return; switch (event.kind) { case Kind.Repost: return ; default: { if (event.isConversation) { return ; } if (event.isQuote) { return ; } return ; } } }, []); return ( } > {(notes) => notes.map((event) => renderItem(event))} ); }