import { RefreshCw } from "lucide-react"; import { useState } from "react"; import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; import { Spinner } from "@/components/ui/spinner"; import { capability, capabilityLabels, MODEL_CAPABILITY_FILTERS, type ModelCapabilityFilter, modelLabel, type SelectableModel, } from "./model-utils"; interface ModelsSelectionPanelProps { models: SelectableModel[]; description?: string; emptyMessage?: string; refreshLabel?: string; isRefreshing?: boolean; isRefreshDisabled?: boolean; isUpdatingModel?: boolean; isBulkUpdating?: boolean; onRefresh?: () => void; onToggleModel?: (model: SelectableModel, enabled: boolean) => void; onBulkToggle?: (models: SelectableModel[], enabled: boolean) => void; } export function ModelsSelectionPanel({ models, description = "Select models to make available for this provider.", emptyMessage = "No models available.", refreshLabel = "Refresh models", isRefreshing = false, isRefreshDisabled = false, isUpdatingModel = false, isBulkUpdating = false, onRefresh, onToggleModel, onBulkToggle, }: ModelsSelectionPanelProps) { const [modelFilter, setModelFilter] = useState(null); const filteredModels = modelFilter ? models.filter((model) => capability(model, modelFilter)) : models; const allFilteredModelsEnabled = filteredModels.length > 0 && filteredModels.every((model) => model.enabled); function toggleFilteredModels() { const nextEnabled = !allFilteredModelsEnabled; const changedModels = filteredModels.filter((model) => model.enabled !== nextEnabled); if (changedModels.length === 0) return; onBulkToggle?.(changedModels, nextEnabled); } return (
Models

{description}

{onRefresh ? ( ) : null}
{models.length > 0 ? (
Filter models {MODEL_CAPABILITY_FILTERS.map((filter) => { const count = models.filter((model) => capability(model, filter.key)).length; const isActive = modelFilter === filter.key; return ( ); })}
) : null}
{models.length === 0 ? (
{emptyMessage} {onRefresh ? ( ) : null}
) : null} {filteredModels.length === 0 && modelFilter ? (
No{" "} {MODEL_CAPABILITY_FILTERS.find( (filter) => filter.key === modelFilter )?.label.toLowerCase()}{" "} models found on this connection.
) : null}
{filteredModels.map((model) => (
onToggleModel?.(model, checked === true)} disabled={!onToggleModel || isUpdatingModel} className="border-muted-foreground/20" />
{modelLabel(model)}
{capabilityLabels(model) || "No discovered capabilities"}
))}
); }