import { commands } from "@/commands.gen"; import { toLumeEvents } from "@/commons"; import { RepostNote, Spinner, TextNote } from "@/components"; import type { LumeEvent } from "@/system"; import { Kind } from "@/types"; import * as ScrollArea from "@radix-ui/react-scroll-area"; import { useQuery } from "@tanstack/react-query"; import { createLazyFileRoute } from "@tanstack/react-router"; import { type RefObject, useCallback, useRef } from "react"; import { Virtualizer } from "virtua"; export const Route = createLazyFileRoute("/columns/_layout/dvm/$id")({ component: Screen, }); function Screen() { const { id } = Route.useParams(); const { account } = Route.useSearch(); const { isLoading, isError, error, data } = useQuery({ queryKey: ["job-result", id], queryFn: async () => { if (!account) { throw new Error("Account is required"); } const res = await commands.getAllEventsByRequest(account, id); if (res.status === "error") { throw new Error(res.error); } return toLumeEvents(res.data); }, refetchOnWindowFocus: false, }); const ref = useRef(null); const renderItem = useCallback( (event: LumeEvent) => { if (!event) { return; } switch (event.kind) { case Kind.Repost: { const repostId = event.repostId; return ( ); } default: return ( ); } }, [data], ); return ( }> {isLoading ? (
Requesting events...
) : isError ? (
{error?.message}
) : !data?.length ? (
🎉 Yo. You're catching up on all latest notes.
) : ( data.map((item) => renderItem(item)) )}
); }