import { NDKEvent, NDKKind } from '@nostr-dev-kit/ndk'; import { useInfiniteQuery } from '@tanstack/react-query'; import { useCallback, useMemo } from 'react'; import { VList } from 'virtua'; import { useStorage } from '@libs/storage/provider'; import { ArrowRightCircleIcon, LoaderIcon } from '@shared/icons'; import { MemoizedArticleNote, MemoizedFileNote, MemoizedRepost, MemoizedTextNote, NoteWrapper, UnknownNote, } from '@shared/notes'; import { TitleBar } from '@shared/titleBar'; import { WidgetWrapper } from '@shared/widgets'; import { DBEvent, Widget } from '@utils/types'; export function LocalFollowsWidget({ params }: { params: Widget }) { const { db } = useStorage(); const { status, data, hasNextPage, isFetchingNextPage, fetchNextPage } = useInfiniteQuery({ queryKey: ['follows-' + params.title], queryFn: async ({ pageParam = 0 }) => { return await db.getAllEventsByAuthors(db.account.follows, 20, pageParam); }, getNextPageParam: (lastPage) => lastPage.nextCursor, }); const dbEvents = useMemo( () => (data ? data.pages.flatMap((d: { data: DBEvent[] }) => d.data) : []), [data] ); // render event match event kind const renderItem = useCallback( (dbEvent: DBEvent) => { const event: NDKEvent = JSON.parse(dbEvent.event as string); switch (event.kind) { case NDKKind.Text: return ( ); case NDKKind.Repost: return ; case 1063: return ( ); case NDKKind.Article: return ( ); default: return ( ); } }, [dbEvents] ); return ( {status === 'loading' ? ( Loading post... ) : dbEvents.length === 0 ? ( Oops, it looks like there are no posts. You can close this widget ) : ( {dbEvents.map((item) => renderItem(item))} {dbEvents.length > 0 ? ( fetchNextPage()} disabled={!hasNextPage || isFetchingNextPage} className="inline-flex h-10 w-max items-center justify-center gap-2 rounded-full bg-blue-500 px-6 font-medium text-white hover:bg-blue-600 focus:outline-none" > {isFetchingNextPage ? ( <> Loading... > ) : hasNextPage ? ( <> Load more > ) : ( <> Nothing more to load > )} ) : null} )} ); }
Loading post...
You can close this widget