import { useArk } from "@lume/ark"; import { ArrowRightCircleIcon, LoaderIcon } from "@lume/icons"; import { FETCH_LIMIT } from "@lume/utils"; import { NDKEvent, NDKKind } from "@nostr-dev-kit/ndk"; import { useInfiniteQuery, useQueryClient } from "@tanstack/react-query"; import { useCallback, useMemo } from "react"; import { ActivityRepost } from "./activityRepost"; import { ActivityText } from "./activityText"; import { ActivityZap } from "./activityZap"; export function ActivityList() { const ark = useArk(); const queryClient = useQueryClient(); const { data, hasNextPage, isLoading, isFetchingNextPage, fetchNextPage } = useInfiniteQuery({ queryKey: ["activity"], initialPageParam: 0, queryFn: async ({ signal, pageParam, }: { signal: AbortSignal; pageParam: number; }) => { const events = await ark.getInfiniteEvents({ filter: { kinds: [NDKKind.Text, NDKKind.Repost, NDKKind.Zap], "#p": [ark.account.pubkey], }, limit: FETCH_LIMIT, pageParam, signal, }); return events; }, getNextPageParam: (lastPage) => { const lastEvent = lastPage.at(-1); if (!lastEvent) return; return lastEvent.created_at - 1; }, initialData: () => { const queryCacheData = queryClient.getQueryState(["activity"]) ?.data as NDKEvent[]; if (queryCacheData) { return { pageParams: [undefined, 1], pages: [queryCacheData], }; } }, staleTime: 360 * 1000, refetchOnWindowFocus: false, refetchOnMount: false, }); const allEvents = useMemo( () => (data ? data.pages.flatMap((page) => page) : []), [data], ); const renderEvenKind = useCallback( (event: NDKEvent) => { if (event.pubkey === ark.account.pubkey) return null; switch (event.kind) { case NDKKind.Text: return ; case NDKKind.Repost: return ; case NDKKind.Zap: return ; default: return ; } }, [data], ); return (
{isLoading ? (
) : !allEvents.length ? (

🎉

Yo! Nothing new yet.

) : ( allEvents.map((event) => renderEvenKind(event)) )}
{hasNextPage ? ( ) : null}
); }