import { RefreshCw } from "lucide-react"; import { useState } from "react"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; import { Input } from "@/components/ui/input"; 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; manualInputPlaceholder?: string; refreshLabel?: string; isRefreshing?: boolean; isAddingManual?: boolean; isUpdatingModel?: boolean; isBulkUpdating?: boolean; onRefresh?: () => void; onAddManual?: (modelId: string) => 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.", manualInputPlaceholder = "Add a model ID manually", refreshLabel = "Refresh models", isRefreshing = false, isAddingManual = false, isUpdatingModel = false, isBulkUpdating = false, onRefresh, onAddManual, onToggleModel, onBulkToggle, }: ModelsSelectionPanelProps) { const [manualModelId, setManualModelId] = useState(""); 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 addModel() { const modelId = manualModelId.trim(); if (!modelId || !onAddManual) return; onAddManual(modelId); setManualModelId(""); } 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}
{onAddManual ? (
setManualModelId(event.target.value)} onKeyDown={(event) => { if (event.key === "Enter") { event.preventDefault(); addModel(); } }} placeholder={manualInputPlaceholder} />
) : 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}
) : 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} />
{modelLabel(model)} {model.source === "MANUAL" ? ( manual ) : null}
{capabilityLabels(model) || "No discovered capabilities"}
))}
); }