import { RepostNote, Spinner, TextNote } from "@/components"; import { LumeEvent } from "@/system"; import { Kind, type NostrEvent } from "@/types"; import * as ScrollArea from "@radix-ui/react-scroll-area"; import { useQuery } from "@tanstack/react-query"; import { createLazyFileRoute } from "@tanstack/react-router"; import { useCallback, useRef } from "react"; import { Virtualizer } from "virtua"; export const Route = createLazyFileRoute("/columns/_layout/trending")({ component: Screen, }); function Screen() { const { isLoading, data } = useQuery({ queryKey: ["trending-notes"], queryFn: async ({ signal }) => { const res = await fetch("https://api.nostr.band/v0/trending/notes", { signal, }); if (res.status !== 200) { throw new Error("Error."); } const data: { notes: Array<{ event: NostrEvent }> } = await res.json(); const events: NostrEvent[] = data.notes.map( (item: { event: NostrEvent }) => item.event, ); const lumeEvents = Promise.all( events.map(async (ev) => await LumeEvent.build(ev)), ); return lumeEvents; }, refetchOnWindowFocus: false, }); const ref = useRef(null); const renderItem = useCallback( (event: LumeEvent) => { if (!event) return; switch (event.kind) { case Kind.Repost: return ( ); default: return ( ); } }, [data], ); return ( {isLoading ? (
Loading...
) : !data.length ? (
🎉 Yo. You're catching up on all latest notes.
) : ( data.map((item) => renderItem(item)) )}
); }