"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 (