From aef71b65e9109e2efb4824c5a79c61ae602bfda3 Mon Sep 17 00:00:00 2001 From: "blink-so[bot]" <211532188+blink-so[bot]@users.noreply.github.com> Date: Fri, 5 Dec 2025 15:11:03 +0000 Subject: [PATCH] feat: add multi-select when adding repos to filters Allows selecting multiple repositories from search results before adding them all at once. Changes: - Added checkboxes to repo search results - Repos can be toggled on/off before adding - "Add N Repos" button appears when repos are selected - Already-added repos are shown as disabled with checkmark - Selection is cleared when dropdown closes --- src/browser/components/home.tsx | 135 ++++++++++++++++++++++++++------ 1 file changed, 109 insertions(+), 26 deletions(-) diff --git a/src/browser/components/home.tsx b/src/browser/components/home.tsx index 190cf88..ccc6128 100644 --- a/src/browser/components/home.tsx +++ b/src/browser/components/home.tsx @@ -409,6 +409,11 @@ export function Home() { return () => clearTimeout(timeout); }, [github, searchQuery]); + // Multi-select state for adding repos + const [selectedReposToAdd, setSelectedReposToAdd] = useState>( + new Set() + ); + const handleAddRepo = useCallback((fullName: string) => { setConfig((prev) => { if (prev.repos.some((r) => r.name === fullName)) return prev; @@ -421,6 +426,36 @@ export function Home() { setSearchResults([]); }, []); + const handleAddSelectedRepos = useCallback(() => { + if (selectedReposToAdd.size === 0) return; + setConfig((prev) => { + const newRepos = Array.from(selectedReposToAdd) + .filter((name) => !prev.repos.some((r) => r.name === name)) + .map((name) => ({ name, mode: "review-requested" as FilterMode })); + if (newRepos.length === 0) return prev; + return { + ...prev, + repos: [...prev.repos, ...newRepos], + }; + }); + setSelectedReposToAdd(new Set()); + setSearchQuery(""); + setSearchResults([]); + setShowAddRepo(false); + }, [selectedReposToAdd]); + + const toggleRepoSelection = useCallback((fullName: string) => { + setSelectedReposToAdd((prev) => { + const next = new Set(prev); + if (next.has(fullName)) { + next.delete(fullName); + } else { + next.add(fullName); + } + return next; + }); + }, []); + const handleRemoveRepo = useCallback((repoName: string) => { setConfig((prev) => ({ ...prev, @@ -814,6 +849,7 @@ export function Home() { onClick={() => { setShowAddRepo(false); setSearchQuery(""); + setSelectedReposToAdd(new Set()); }} />
)} {searchResults.length > 0 ? ( - searchResults.map((repo) => ( - - )) + searchResults.map((repo) => { + const isSelected = selectedReposToAdd.has( + repo.full_name + ); + const isAlreadyAdded = config.repos.some( + (r) => r.name === repo.full_name + ); + return ( + + ); + }) ) : searchQuery ? (
{searching ? "Searching..." : "No repositories found"} @@ -900,6 +966,23 @@ export function Home() {
)}
+ + {/* Add Selected Button */} + {selectedReposToAdd.size > 0 && ( +
+ +
+ )} )}