"use client"; import { useMemo } from "react"; import { IconRefresh } from "@tabler/icons-react"; import { Button } from "@kandev/ui/button"; import { Input } from "@kandev/ui/input"; import { Combobox, type ComboboxOption } from "@/components/combobox"; import { cn } from "@/lib/utils"; import { formatRelativeTime } from "@/lib/utils"; const ALL_REPOS = "__all__"; type ListToolbarProps = { title: string; count: number; loading: boolean; lastFetchedAt: Date | null; customQuery: string; committedQuery: string; onCustomQueryChange: (value: string) => void; onCommitCustomQuery: () => void; repoFilter: string; onRepoFilterChange: (value: string) => void; repoOptions: string[]; onRefresh: () => void; }; function RefreshControls({ loading, lastFetchedAt, onRefresh, showUpdatedPrefix, }: { loading: boolean; lastFetchedAt: Date | null; onRefresh: () => void; showUpdatedPrefix: boolean; }) { return ( <> {lastFetchedAt && !loading && ( {showUpdatedPrefix ? "Updated " : ""} {formatRelativeTime(lastFetchedAt.toISOString())} )} ); } function buildRepoFilterOptions(repoOptions: string[]): ComboboxOption[] { return [ { value: ALL_REPOS, label: "All repos", keywords: ["all", "repositories", "repos"] }, ...repoOptions.map((key) => ({ value: key, label: key, keywords: [key] })), ]; } export function ListToolbar({ title, count, loading, lastFetchedAt, customQuery, committedQuery, onCustomQueryChange, onCommitCustomQuery, repoFilter, onRepoFilterChange, repoOptions, onRefresh, }: ListToolbarProps) { const selectValue = repoFilter || ALL_REPOS; const dirty = customQuery !== committedQuery; const repoFilterOptions = useMemo(() => buildRepoFilterOptions(repoOptions), [repoOptions]); return (

{title}

{loading ? "…" : count}
{ // Combobox signals "toggle off" with ""; All repos is the explicit clear path. if (!v) return; onRepoFilterChange(v === ALL_REPOS ? "" : v); }} options={repoFilterOptions} placeholder="All repos" searchPlaceholder="Filter repositories..." emptyMessage="No repositories found." triggerClassName="w-full md:w-[220px] h-8 border border-input bg-background hover:bg-secondary/50 px-2 py-1.5 text-xs/relaxed" className="md:min-w-[360px]" testId="github-repo-filter-trigger" dropdownTestId="github-repo-filter-dropdown" />
onCustomQueryChange(e.target.value)} onKeyDown={(e) => { if (e.key === "Enter") { e.preventDefault(); onCommitCustomQuery(); } }} onBlur={() => { if (dirty) onCommitCustomQuery(); }} placeholder='Custom query — press Enter. e.g. "is:open review-requested:@me"' className="h-8 pr-20" /> {dirty && ( Press Enter )}
); }