import type { ReactNode } from "react"; import { memo } from "react"; import { WindowVirtualizer } from "virtua"; import PostsShimmer from "@/components/Shared/Shimmer/PostsShimmer"; import { Card, EmptyState, ErrorMessage } from "@/components/Shared/UI"; import useLoadMoreOnIntersect from "@/hooks/useLoadMoreOnIntersect"; interface PostFeedProps { items: T[]; loading?: boolean; error?: { message?: string }; hasMore?: boolean; handleEndReached: () => Promise; emptyIcon: ReactNode; emptyMessage: ReactNode; errorTitle: string; renderItem: (item: T) => ReactNode; } const PostFeed = ({ items, loading = false, error, hasMore, handleEndReached, emptyIcon, emptyMessage, errorTitle, renderItem }: PostFeedProps) => { const loadMoreRef = useLoadMoreOnIntersect(handleEndReached); if (loading) { return ; } if (!items?.length) { return ; } if (error) { return ; } return ( {items.map((item) => renderItem(item))} {hasMore && } ); }; export default memo(PostFeed) as typeof PostFeed;