From 74e37d129c6878163f3cb05bf6536d0c876c4935 Mon Sep 17 00:00:00 2001 From: bkellam Date: Fri, 25 Jul 2025 09:32:33 -0700 Subject: [PATCH] fix: put selected repos at the top of the repo selector list. Aslo retain scroll position --- .../chat/components/chatBox/repoSelector.tsx | 56 ++++++++++++++----- 1 file changed, 41 insertions(+), 15 deletions(-) diff --git a/packages/web/src/features/chat/components/chatBox/repoSelector.tsx b/packages/web/src/features/chat/components/chatBox/repoSelector.tsx index dbb885a0..8b2d7b13 100644 --- a/packages/web/src/features/chat/components/chatBox/repoSelector.tsx +++ b/packages/web/src/features/chat/components/chatBox/repoSelector.tsx @@ -49,6 +49,9 @@ export const RepoSelector = React.forwardRef< }, ref ) => { + const scrollContainerRef = React.useRef(null); + const scrollPosition = React.useRef(0); + const handleInputKeyDown = ( event: React.KeyboardEvent ) => { @@ -62,6 +65,11 @@ export const RepoSelector = React.forwardRef< }; const toggleRepo = (repo: string) => { + // Store current scroll position before state update + if (scrollContainerRef.current) { + scrollPosition.current = scrollContainerRef.current.scrollTop; + } + const newSelectedValues = selectedRepos.includes(repo) ? selectedRepos.filter((value) => value !== repo) : [...selectedRepos, repo]; @@ -76,6 +84,26 @@ export const RepoSelector = React.forwardRef< onOpenChanged(!isOpen); }; + const sortedRepos = React.useMemo(() => { + return repos + .map((repo) => ({ + repo, + isSelected: selectedRepos.includes(repo) + })) + .sort((a, b) => { + if (a.isSelected && !b.isSelected) return -1; + if (!a.isSelected && b.isSelected) return 1; + return 0; + }) + }, [repos, selectedRepos]); + + // Restore scroll position after re-render + React.useEffect(() => { + if (scrollContainerRef.current && scrollPosition.current > 0) { + scrollContainerRef.current.scrollTop = scrollPosition.current; + } + }, [sortedRepos]); + return ( - + No results found. - - {repos.map((repo) => { - const isSelected = selectedRepos.includes(repo); + {sortedRepos.map(({ repo, isSelected }) => { return ( - {selectedRepos.length > 0 && ( - <> - - - Clear - - - )} + {selectedRepos.length > 0 && ( + <> + + + Clear + + + )}