@@ -11,6 +11,8 @@ import {
1111 GitMerge ,
1212 ChevronDown ,
1313 Eye ,
14+ EyeOff ,
15+ AtSign ,
1416 User ,
1517 Users ,
1618 RefreshCw ,
@@ -78,6 +80,7 @@ interface RepoFilter {
7880 name : string ;
7981 mode : FilterMode ;
8082 authoredBy ?: string ; // Username for "authored-by" filter mode
83+ enabled ?: boolean ; // Whether the filter is active (defaults to true)
8184}
8285
8386// Filter configuration stored in localStorage
@@ -160,7 +163,10 @@ function getModeFilter(mode: FilterMode, authoredBy?: string): string {
160163// Build queries grouped by mode (GitHub doesn't support per-repo qualifiers with OR)
161164// Multiple repo: qualifiers act as OR, but user filters apply to all repos
162165function buildSearchQueries ( config : FilterConfig ) : string [ ] {
163- if ( config . repos . length === 0 ) {
166+ // Filter out disabled repos (enabled defaults to true if not specified)
167+ const enabledRepos = config . repos . filter ( ( r ) => r . enabled !== false ) ;
168+
169+ if ( enabledRepos . length === 0 ) {
164170 return [ ] ;
165171 }
166172
@@ -174,8 +180,8 @@ function buildSearchQueries(config: FilterConfig): string[] {
174180 const queries : string [ ] = [ ] ;
175181
176182 // Separate "All Repos" filters from specific repo filters
177- const allReposFilters = config . repos . filter ( isAllReposFilter ) ;
178- const specificRepos = config . repos . filter ( ( r ) => ! isAllReposFilter ( r ) ) ;
183+ const allReposFilters = enabledRepos . filter ( isAllReposFilter ) ;
184+ const specificRepos = enabledRepos . filter ( ( r ) => ! isAllReposFilter ( r ) ) ;
179185
180186 // Handle "All Repos" global filters (one query per mode)
181187 for ( const filter of allReposFilters ) {
@@ -271,7 +277,7 @@ const MODE_OPTIONS = [
271277 {
272278 value : "review-requested" ,
273279 label : "Review Requests" ,
274- icon : Eye ,
280+ icon : AtSign ,
275281 description : "PRs where you're requested as reviewer" ,
276282 } ,
277283 {
@@ -434,6 +440,15 @@ export function Home() {
434440 [ ]
435441 ) ;
436442
443+ const handleToggleRepo = useCallback ( ( repoName : string ) => {
444+ setConfig ( ( prev ) => ( {
445+ ...prev ,
446+ repos : prev . repos . map ( ( r ) =>
447+ r . name === repoName ? { ...r , enabled : r . enabled === false } : r
448+ ) ,
449+ } ) ) ;
450+ } , [ ] ) ;
451+
437452 const handleStateChange = useCallback ( ( state : FilterConfig [ "state" ] ) => {
438453 setConfig ( ( prev ) => ( { ...prev , state } ) ) ;
439454 } , [ ] ) ;
@@ -523,6 +538,7 @@ export function Home() {
523538 ( m ) => m . value === repo . mode
524539 ) ! ;
525540 const isOpen = openRepoDropdown === repo . name ;
541+ const isEnabled = repo . enabled !== false ;
526542 // For "All Repos", exclude the "All PRs" mode since it would be too broad
527543 const availableModes = isAllRepos
528544 ? MODE_OPTIONS . filter ( ( m ) => m . value !== "all" )
@@ -561,21 +577,58 @@ export function Home() {
561577 isOpen
562578 ? "bg-muted border-border"
563579 : isAllRepos
564- ? "bg-primary/10 border-primary/30 hover:bg-primary/20 hover:border-primary/50"
565- : "bg-muted/50 border-transparent hover:bg-muted hover:border-border"
580+ ? isEnabled
581+ ? "bg-primary/10 border-primary/30 hover:bg-primary/20 hover:border-primary/50"
582+ : "bg-muted/30 border-border/50 opacity-50"
583+ : isEnabled
584+ ? "bg-muted/50 border-transparent hover:bg-muted hover:border-border"
585+ : "bg-muted/30 border-border/50 opacity-50"
566586 ) }
567587 >
588+ < button
589+ onClick = { ( e ) => {
590+ e . stopPropagation ( ) ;
591+ handleToggleRepo ( repo . name ) ;
592+ } }
593+ className = { cn (
594+ "p-0.5 rounded transition-colors" ,
595+ isEnabled
596+ ? "hover:bg-muted-foreground/20 text-muted-foreground hover:text-foreground"
597+ : "hover:bg-muted-foreground/20 text-muted-foreground/50 hover:text-foreground"
598+ ) }
599+ title = { isEnabled ? "Disable filter" : "Enable filter" }
600+ >
601+ { isEnabled ? (
602+ < Eye className = "w-3 h-3" />
603+ ) : (
604+ < EyeOff className = "w-3 h-3" />
605+ ) }
606+ </ button >
568607 < modeOption . icon
569608 className = { cn (
570609 "w-3 h-3" ,
571- isAllRepos ? "text-primary" : "text-muted-foreground"
610+ isAllRepos
611+ ? isEnabled
612+ ? "text-primary"
613+ : "text-muted-foreground/50"
614+ : "text-muted-foreground"
572615 ) }
573616 />
574- < span className = { isAllRepos ? "font-medium" : "font-mono" } >
617+ < span
618+ className = { cn (
619+ isAllRepos ? "font-medium" : "font-mono" ,
620+ ! isEnabled && "line-through"
621+ ) }
622+ >
575623 { isAllRepos ? modeOption . label : repo . name }
576624 </ span >
577625 { repo . mode === "authored-by" && repo . authoredBy && (
578- < span className = "text-muted-foreground" >
626+ < span
627+ className = { cn (
628+ "text-muted-foreground" ,
629+ ! isEnabled && "line-through"
630+ ) }
631+ >
579632 @{ repo . authoredBy }
580633 </ span >
581634 ) }
0 commit comments