perf(feeds): use hasMore instead of length check for conditional virtualization

This commit is contained in:
plebeius
2026-01-13 17:01:51 +01:00
parent 80100fa54d
commit c0c6e9ee31
5 changed files with 54 additions and 34 deletions
+4 -4
View File
@@ -498,8 +498,8 @@ const PostDesktop = ({ post, roles, showAllReplies, showReplies = true }: PostPr
)}
</span>
)}
{/* Virtuoso infinite scroll for post page view with more than 25 replies */}
{!isHidden && showAllReplies && !isInPendingPostView && showReplies && replyCount > 25 && (
{/* Virtuoso infinite scroll for post page view when there's more content to paginate */}
{!isHidden && showAllReplies && !isInPendingPostView && showReplies && hasMore && (
<Virtuoso
increaseViewportBy={{ bottom: 1200, top: 1200 }}
totalCount={filteredReplies.length}
@@ -517,12 +517,12 @@ const PostDesktop = ({ post, roles, showAllReplies, showReplies = true }: PostPr
initialScrollTop={lastVirtuosoState?.scrollTop}
/>
)}
{/* Non-virtualized rendering for post page view with 25 or fewer replies */}
{/* Non-virtualized rendering for post page view when all replies fit on one page */}
{!isHidden &&
showAllReplies &&
!isInPendingPostView &&
showReplies &&
replyCount <= 25 &&
!hasMore &&
filteredReplies.map((reply, index) => (
<div key={index} className={styles.replyContainer}>
<Reply reply={reply} roles={roles} postReplyCount={replyCount} threadNumber={post?.number} />
+4 -4
View File
@@ -374,8 +374,8 @@ const PostMobile = ({ post, roles, showAllReplies, showReplies = true }: PostPro
</div>
)}
</div>
{/* Virtuoso infinite scroll for post page view with more than 25 replies */}
{!(pinned && !isInPostView) && showAllReplies && !isInPendingPostView && showReplies && replyCount > 25 && (
{/* Virtuoso infinite scroll for post page view when there's more content to paginate */}
{!(pinned && !isInPostView) && showAllReplies && !isInPendingPostView && showReplies && hasMore && (
<Virtuoso
increaseViewportBy={{ bottom: 1200, top: 1200 }}
totalCount={filteredReplies.length}
@@ -393,12 +393,12 @@ const PostMobile = ({ post, roles, showAllReplies, showReplies = true }: PostPro
initialScrollTop={lastVirtuosoState?.scrollTop}
/>
)}
{/* Non-virtualized rendering for post page view with 25 or fewer replies */}
{/* Non-virtualized rendering for post page view when all replies fit on one page */}
{!(pinned && !isInPostView) &&
showAllReplies &&
!isInPendingPostView &&
showReplies &&
replyCount <= 25 &&
!hasMore &&
filteredReplies.map((reply, index) => (
<div key={index} className={styles.replyContainer}>
<Reply postReplyCount={replyCount} reply={reply} roles={roles} threadNumber={post?.number} />
+22 -12
View File
@@ -381,18 +381,28 @@ const Board = ({ feedCacheKey, viewType, boardIdentifier: boardIdentifierProp, t
<ErrorDisplay error={subplebbitError} />
</div>
)}
<Virtuoso
increaseViewportBy={{ bottom: 1200, top: 1200 }}
totalCount={combinedFeed.length}
data={combinedFeed}
itemContent={(index, post) => <Post index={index} post={post} />}
useWindowScroll={true}
components={{ Footer }}
endReached={loadMore}
ref={virtuosoRef}
restoreStateFrom={lastVirtuosoState}
initialScrollTop={lastVirtuosoState?.scrollTop}
/>
{/* Use Virtuoso for infinite scroll only when there's more content to paginate */}
{hasMore ? (
<Virtuoso
increaseViewportBy={{ bottom: 1200, top: 1200 }}
totalCount={combinedFeed.length}
data={combinedFeed}
itemContent={(index, post) => <Post index={index} post={post} />}
useWindowScroll={true}
components={{ Footer }}
endReached={loadMore}
ref={virtuosoRef}
restoreStateFrom={lastVirtuosoState}
initialScrollTop={lastVirtuosoState?.scrollTop}
/>
) : (
<>
{combinedFeed.map((post, index) => (
<Post key={post.cid} index={index} post={post} />
))}
<Footer />
</>
)}
</div>
</>
);
+22 -12
View File
@@ -540,18 +540,28 @@ const Catalog = ({ feedCacheKey, viewType, boardIdentifier: boardIdentifierProp,
<div className={styles.catalog}>
{processedFeed?.length !== 0 ? (
<>
<Virtuoso
increaseViewportBy={{ bottom: 1200, top: 1200 }}
totalCount={rows?.length || 0}
data={rows}
itemContent={(index, row) => <CatalogRow index={index} row={row} />}
useWindowScroll={true}
components={{ Footer }}
endReached={loadMore}
ref={virtuosoRef}
restoreStateFrom={lastVirtuosoState}
initialScrollTop={lastVirtuosoState?.scrollTop}
/>
{/* Use Virtuoso for infinite scroll only when there's more content to paginate */}
{hasMore ? (
<Virtuoso
increaseViewportBy={{ bottom: 1200, top: 1200 }}
totalCount={rows?.length || 0}
data={rows}
itemContent={(index, row) => <CatalogRow index={index} row={row} />}
useWindowScroll={true}
components={{ Footer }}
endReached={loadMore}
ref={virtuosoRef}
restoreStateFrom={lastVirtuosoState}
initialScrollTop={lastVirtuosoState?.scrollTop}
/>
) : (
<>
{rows.map((row, index) => (
<CatalogRow key={index} index={index} row={row} />
))}
<Footer />
</>
)}
</>
) : (
<div className={styles.footer}>
+2 -2
View File
@@ -632,8 +632,8 @@ export const ModQueueView = ({ boardIdentifier: propBoardIdentifier }: ModQueueV
<div className={styles.actionsHeader}>{t('actions')}</div>
</div>
{/* Use Virtuoso for infinite scroll only when feed is large enough to warrant it */}
{feed.length > 25 ? (
{/* Use Virtuoso for infinite scroll only when there's more content to paginate */}
{hasMore ? (
<Virtuoso
useWindowScroll
data={feed}