// Adapted from: web/src/components/ui/multi-select.tsx import * as React from "react"; import { CheckIcon, ChevronDown, BookMarkedIcon, } from "lucide-react"; import { cn } from "@/lib/utils"; import { Button } from "@/components/ui/button"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, } from "@/components/ui/command"; interface RepoSelectorProps extends React.ButtonHTMLAttributes { repos: string[]; selectedRepos: string[]; onSelectedReposChange: (repos: string[]) => void; className?: string; isOpen: boolean; onOpenChanged: (isOpen: boolean) => void; } export const RepoSelector = React.forwardRef< HTMLButtonElement, RepoSelectorProps >( ( { repos, onSelectedReposChange, className, selectedRepos, isOpen, onOpenChanged, ...props }, ref ) => { const handleInputKeyDown = ( event: React.KeyboardEvent ) => { if (event.key === "Enter") { onOpenChanged(true); } else if (event.key === "Backspace" && !event.currentTarget.value) { const newSelectedRepos = [...selectedRepos]; newSelectedRepos.pop(); onSelectedReposChange(newSelectedRepos); } }; const toggleRepo = (repo: string) => { const newSelectedValues = selectedRepos.includes(repo) ? selectedRepos.filter((value) => value !== repo) : [...selectedRepos, repo]; onSelectedReposChange(newSelectedValues); }; const handleClear = () => { onSelectedReposChange([]); }; const handleTogglePopover = () => { onOpenChanged(!isOpen); }; return ( onOpenChanged(false)} > No results found. {repos.map((repo) => { const isSelected = selectedRepos.includes(repo); return ( toggleRepo(repo)} className="cursor-pointer" >
{repo}
); })}
{selectedRepos.length > 0 && ( <> Clear )}
); } ); RepoSelector.displayName = "RepoSelector";