import { NDKEvent } from '@nostr-dev-kit/ndk'; import { useInfiniteQuery } from '@tanstack/react-query'; import { useVirtualizer } from '@tanstack/react-virtual'; import { useCallback, useMemo, useRef } from 'react'; import { useStorage } from '@libs/storage/provider'; import { ArrowRightCircleIcon, LoaderIcon } from '@shared/icons'; import { NoteKind_1, NoteKind_1063, NoteThread, Repost } from '@shared/notes'; import { NoteKindUnsupport } from '@shared/notes/kinds/unsupport'; import { NoteSkeleton } from '@shared/notes/skeleton'; import { TitleBar } from '@shared/titleBar'; import { DBEvent, Widget } from '@utils/types'; export function FeedWidget({ params }: { params: Widget }) { const { db } = useStorage(); const { status, data, hasNextPage, isFetchingNextPage, fetchNextPage } = useInfiniteQuery({ queryKey: ['newsfeed', params.content], queryFn: async ({ pageParam = 0 }) => { const authors = JSON.parse(params.content); return await db.getAllEventsByAuthors(authors, 20, pageParam); }, getNextPageParam: (lastPage) => lastPage.nextCursor, }); const dbEvents = useMemo( () => (data ? data.pages.flatMap((d: { data: DBEvent[] }) => d.data) : []), [data] ); const parentRef = useRef(); const virtualizer = useVirtualizer({ count: hasNextPage ? dbEvents.length : dbEvents.length, getScrollElement: () => parentRef.current, estimateSize: () => 650, overscan: 4, }); const items = virtualizer.getVirtualItems(); // render event match event kind const renderItem = useCallback( (index: string | number) => { const dbEvent: DBEvent = dbEvents[index]; if (!dbEvent) return; const event: NDKEvent = JSON.parse(dbEvent.event as string); switch (event.kind) { case 1: { if (dbEvent.root_id || dbEvent.reply_id) { return (
); } else { return (
); } } case 6: return (
); case 1063: return (
); default: return (
); } }, [dbEvents] ); return (
{status === 'loading' ? (
) : items.length === 0 ? (

Not found any postrs from last 48 hours

) : (
{items.map((item) => renderItem(item.index))}
)} {isFetchingNextPage && (
)}
); }