From f734f0b5f701fa1c6a0837dd36c5ceb90dd91260 Mon Sep 17 00:00:00 2001 From: Enrico Ros Date: Mon, 4 Aug 2025 21:31:17 -0700 Subject: [PATCH] ChatDrawer: limit items (ListItems are on the heavy side) --- .../components/layout-drawer/ChatDrawer.tsx | 49 ++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/src/apps/chat/components/layout-drawer/ChatDrawer.tsx b/src/apps/chat/components/layout-drawer/ChatDrawer.tsx index add335930..ba02ca9fa 100644 --- a/src/apps/chat/components/layout-drawer/ChatDrawer.tsx +++ b/src/apps/chat/components/layout-drawer/ChatDrawer.tsx @@ -82,6 +82,7 @@ function ChatDrawer(props: { const [searchDepth, setSearchDepth] = React.useState('attachments'); // default: full search const [debouncedSearchQuery, setDebouncedSearchQuery] = React.useState(''); const [folderChangeRequest, setFolderChangeRequest] = React.useState(null); + const [renderLimit, setRenderLimit] = React.useState(200); // progressive loading limit // external state const { @@ -153,6 +154,30 @@ function ChatDrawer(props: { }, []); + // Render limit - load more items + + const handleRenderLimitIncrease = React.useCallback(() => { + setRenderLimit(prevValue => { + // Thresholds: 200 --(+200)--> 400 --(+500)--> 900 --(+1000)--> 1900 --> Infinity --> 200 (cycle) + if (prevValue === 200) + return 400; + else if (prevValue === 400) + return 900; + else if (prevValue === 900) + return 1900; + else if (prevValue === 1900) + return Infinity; // no limit + else + return 200; // go back to optimized view + }); + }, []); + + // Reset render limit when search query changes + React.useEffect(() => { + setRenderLimit(200); + }, [debouncedSearchQuery]); + + // memoize the group dropdown const { isSearching } = isDrawerSearching(debouncedSearchQuery); const groupingComponent = React.useMemo(() => ( @@ -342,7 +367,7 @@ function ChatDrawer(props: { {/* Chat Titles List (shrink as half the rate as the Folders List) */} - {renderNavItems.map((item, idx) => item.type === 'nav-item-chat-data' ? ( + {renderNavItems.slice(0, renderLimit).map((item, idx) => item.type === 'nav-item-chat-data' ? ( ) : null, )} + + {/* Load More Button */} + {renderNavItems.length > 200 && ( + + + {renderLimit === Infinity + ? 'Show less' + : renderLimit === 200 + ? 'Show 200 more' + : renderLimit === 400 + ? 'Show 500 more' + : renderLimit === 900 + ? 'Show 1000 more' + : 'Show all' + } {renderLimit !== Infinity && `(${renderNavItems.length - renderLimit} hidden)`} + + + )}