import { NDKEvent } from '@nostr-dev-kit/ndk'; import { useInfiniteQuery } from '@tanstack/react-query'; import { FetchFilter } from 'nostr-fetch'; import { useMemo } from 'react'; import { VList } from 'virtua'; import { useNDK } from '@libs/ndk/provider'; import { useStorage } from '@libs/storage/provider'; import { ArrowRightCircleIcon, LoaderIcon } from '@shared/icons'; import { MemoizedFileNote } from '@shared/notes'; import { TitleBar } from '@shared/titleBar'; import { WidgetWrapper } from '@shared/widgets'; import { FETCH_LIMIT } from '@utils/constants'; import { Widget } from '@utils/types'; export function FileWidget({ widget }: { widget: Widget }) { const { db } = useStorage(); const { ndk, relayUrls, fetcher } = useNDK(); const { status, data, hasNextPage, isFetchingNextPage, fetchNextPage } = useInfiniteQuery({ queryKey: ['media', widget.id], initialPageParam: 0, queryFn: async ({ signal, pageParam, }: { signal: AbortSignal; pageParam: number; }) => { let filter: FetchFilter; const content = JSON.parse(widget.content); if (content.global) { filter = { kinds: [1063], }; } else { filter = { kinds: [1063], authors: db.account.contacts, }; } const events = await fetcher.fetchLatestEvents(relayUrls, filter, FETCH_LIMIT, { asOf: pageParam === 0 ? undefined : pageParam, abortSignal: signal, }); const ndkEvents = events.map((event) => { return new NDKEvent(ndk, event); }); return ndkEvents.sort((a, b) => b.created_at - a.created_at); }, getNextPageParam: (lastPage) => { const lastEvent = lastPage.at(-1); if (!lastEvent) return; return lastEvent.created_at - 1; }, refetchOnWindowFocus: false, refetchOnReconnect: false, }); const allEvents = useMemo( () => (data ? data.pages.flatMap((page) => page) : []), [data] ); return ( {status === 'pending' ? (
) : allEvents.length === 0 ? (
empty feeds

Oops, it looks like there are no files.

You can close this widget

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